From 8e2114a5caa45875dde73e9248425f88b484acb4 Mon Sep 17 00:00:00 2001 From: iUngi Date: Thu, 29 Nov 2012 11:41:37 +0100 Subject: [PATCH 01/19] Adding Brushless DC motro example --- demos/ARM11-BCM2835-G++-MPC/.cproject | 63 +++ demos/ARM11-BCM2835-G++-MPC/.project | 90 ++++ demos/ARM11-BCM2835-G++-MPC/Makefile | 193 +++++++ demos/ARM11-BCM2835-G++-MPC/chconf.h | 535 ++++++++++++++++++++ demos/ARM11-BCM2835-G++-MPC/halconf.h | 342 +++++++++++++ demos/ARM11-BCM2835-G++-MPC/main.cpp | 188 +++++++ demos/ARM11-BCM2835-G++-MPC/mcuconf.h | 57 +++ demos/ARM11-BCM2835-G++-MPC/readme.txt | 21 + demos/ARM11-BCM2835-G++/.cproject | 63 +++ demos/ARM11-BCM2835-G++/.project | 90 ++++ demos/ARM11-BCM2835-G++/Makefile | 30 +- demos/ARM11-BCM2835-G++/Makefile.u1conflict | 194 +++++++ demos/ARM11-BCM2835-G++/main.cpp | 354 ++----------- demos/ARM11-BCM2835-G++/main.cpp.u1conflict | 60 +++ 14 files changed, 1960 insertions(+), 320 deletions(-) create mode 100644 demos/ARM11-BCM2835-G++-MPC/.cproject create mode 100644 demos/ARM11-BCM2835-G++-MPC/.project create mode 100644 demos/ARM11-BCM2835-G++-MPC/Makefile create mode 100644 demos/ARM11-BCM2835-G++-MPC/chconf.h create mode 100644 demos/ARM11-BCM2835-G++-MPC/halconf.h create mode 100644 demos/ARM11-BCM2835-G++-MPC/main.cpp create mode 100644 demos/ARM11-BCM2835-G++-MPC/mcuconf.h create mode 100644 demos/ARM11-BCM2835-G++-MPC/readme.txt create mode 100644 demos/ARM11-BCM2835-G++/.cproject create mode 100644 demos/ARM11-BCM2835-G++/.project create mode 100644 demos/ARM11-BCM2835-G++/Makefile.u1conflict create mode 100644 demos/ARM11-BCM2835-G++/main.cpp.u1conflict diff --git a/demos/ARM11-BCM2835-G++-MPC/.cproject b/demos/ARM11-BCM2835-G++-MPC/.cproject new file mode 100644 index 0000000000..eec214bbe8 --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/.cproject @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/ARM11-BCM2835-G++-MPC/.project b/demos/ARM11-BCM2835-G++-MPC/.project new file mode 100644 index 0000000000..211aa8ef4d --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/.project @@ -0,0 +1,90 @@ + + + ROS + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + board + 2 + /home/robu/UbuntuOne/ChibiOS-RPi/boards/RASPBERRYPI_MODB + + + os + 2 + /home/robu/UbuntuOne/ChibiOS-RPi/os + + + diff --git a/demos/ARM11-BCM2835-G++-MPC/Makefile b/demos/ARM11-BCM2835-G++-MPC/Makefile new file mode 100644 index 0000000000..d0c7d58084 --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/Makefile @@ -0,0 +1,193 @@ +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# + +# Compiler options here. +ifeq ($(USE_OPT),) + USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 +endif + +# C specific options here (added to USE_OPT). +ifeq ($(USE_COPT),) + USE_COPT = +endif + +# C++ specific options here (added to USE_OPT). +ifeq ($(USE_CPPOPT),) + USE_CPPOPT = -fno-rtti -fno-exceptions +endif + +# Enable this if you want the linker to remove unused code and data +ifeq ($(USE_LINK_GC),) + USE_LINK_GC = yes +endif + +# If enabled, this option allows to compile the application in THUMB mode. +ifeq ($(USE_THUMB),) + USE_THUMB = no +endif + +# Enable this if you want to see the full log while compiling. +ifeq ($(USE_VERBOSE_COMPILE),) + USE_VERBOSE_COMPILE = no +endif + +# +# Build global options +############################################################################## + +############################################################################## +# Project, sources and paths +# + +# Define project name here +PROJECT = ch + +# Imported source files and paths +CHIBIOS = ../.. +include $(CHIBIOS)/boards/RASPBERRYPI_MODB/board.mk +include $(CHIBIOS)/os/hal/platforms/BCM2835/platform.mk +include $(CHIBIOS)/os/hal/hal.mk +include $(CHIBIOS)/os/ports/GCC/ARM/BCM2835/port.mk +include $(CHIBIOS)/os/kernel/kernel.mk + +# Define linker script file here +LDSCRIPT= $(PORTLD)/BCM2835.ld + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CSRC = $(PORTSRC) \ + $(KERNSRC) \ + $(TESTSRC) \ + $(HALSRC) \ + $(PLATFORMSRC) \ + $(BOARDSRC) \ + $(CHIBIOS)/os/various/evtimer.c \ + $(CHIBIOS)/os/various/chprintf.c \ + $(CHIBIOS)/os/various/syscalls.c + + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CPPSRC = $(CHIBIOS)/os/various/ch.cpp \ + main.cpp \ + $(CHIBIOS)/os/contrib/Print.cpp \ + + +# C sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +ACSRC = + +# C++ sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +ACPPSRC = + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +TCSRC = + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +TCPPSRC = + +# List ASM source files here +ASMSRC = $(PORTASM) + +INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ + $(HALINC) $(PLATFORMINC) $(BOARDINC) \ + $(CHIBIOS)/os/various \ + $(CHIBIOS)/os/contrib \ + /home/robu/UbuntuOne/PMPCToolbox +# +# Project, sources and paths +############################################################################## + +############################################################################## +# Compiler settings +# + +MCU = arm1176jzf-s + +#TRGT = arm-elf- +TRGT = arm-none-eabi- +CC = $(TRGT)gcc +CPPC = $(TRGT)g++ +# Enable loading with g++ only if you need C++ runtime support. +# NOTE: You can use C++ even without C++ support if you are careful. C++ +# runtime support makes code size explode. +LD = $(TRGT)gcc +LD = $(TRGT)g++ +CP = $(TRGT)objcopy +AS = $(TRGT)gcc -x assembler-with-cpp +OD = $(TRGT)objdump +HEX = $(CP) -O ihex +BIN = $(CP) -O binary + +# ARM-specific options here +AOPT = + +# THUMB-specific options here +TOPT = -mthumb -DTHUMB + +# Define C warning options here +CWARN = -Wall -Wextra -Wstrict-prototypes + +# Define C++ warning options here +CPPWARN = -Wall -Wextra + +# +# Compiler settings +############################################################################## + +############################################################################## +# Start of default section +# + +# List all default C defines here, like -D_DEBUG=1 +DDEFS = -DCHIBIOS_DEBUG -DCHIBIOS + +# List all default ASM defines here, like -D_DEBUG=1 +DADEFS = + +# List all default directories to look for include files here +DINCDIR = + +# List the default directory to look for the libraries here +DLIBDIR = + +# List all default libraries here +DLIBS = #-lstdc++ + +# +# End of default section +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +UDEFS = + +# Define ASM defines here +UADEFS = + +# List all user directories here +UINCDIR = + +# List the user directory to look for the libraries here +ULIBDIR = + +# List all user libraries here +ULIBS = + +# +# End of user defines +############################################################################## + +include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM11-BCM2835-G++-MPC/chconf.h b/demos/ARM11-BCM2835-G++-MPC/chconf.h new file mode 100644 index 0000000000..b1f2cd62c6 --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/chconf.h @@ -0,0 +1,535 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef _CHCONF_H_ +#define _CHCONF_H_ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) +#define CH_FREQUENCY 1000 +#endif + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + */ +#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) +#define CH_TIME_QUANTUM 20 +#endif + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_USE_MEMCORE. + */ +#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) +#define CH_MEMCORE_SIZE 0 +#endif + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread automatically. The application has + * then the responsibility to do one of the following: + * - Spawn a custom idle thread at priority @p IDLEPRIO. + * - Change the main() thread priority to @p IDLEPRIO then enter + * an endless loop. In this scenario the @p main() thread acts as + * the idle thread. + * . + * @note Unless an idle thread is spawned the @p main() thread must not + * enter a sleep state. + */ +#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) +#define CH_NO_IDLE_THREAD FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) +#define CH_OPTIMIZE_SPEED TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) +#define CH_USE_REGISTRY TRUE +#endif + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) +#define CH_USE_WAITEXIT TRUE +#endif + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) +#define CH_USE_SEMAPHORES TRUE +#endif + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special requirements. + * @note Requires @p CH_USE_SEMAPHORES. + */ +#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) +#define CH_USE_SEMAPHORES_PRIORITY FALSE +#endif + +/** + * @brief Atomic semaphore API. + * @details If enabled then the semaphores the @p chSemSignalWait() API + * is included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_SEMAPHORES. + */ +#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) +#define CH_USE_SEMSW TRUE +#endif + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) +#define CH_USE_MUTEXES TRUE +#endif + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_MUTEXES. + */ +#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) +#define CH_USE_CONDVARS TRUE +#endif + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_CONDVARS. + */ +#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) +#define CH_USE_CONDVARS_TIMEOUT TRUE +#endif + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) +#define CH_USE_EVENTS TRUE +#endif + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_EVENTS. + */ +#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) +#define CH_USE_EVENTS_TIMEOUT TRUE +#endif + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) +#define CH_USE_MESSAGES TRUE +#endif + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special requirements. + * @note Requires @p CH_USE_MESSAGES. + */ +#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) +#define CH_USE_MESSAGES_PRIORITY FALSE +#endif + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_SEMAPHORES. + */ +#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) +#define CH_USE_MAILBOXES TRUE +#endif + +/** + * @brief I/O Queues APIs. + * @details If enabled then the I/O queues APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) +#define CH_USE_QUEUES TRUE +#endif + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) +#define CH_USE_MEMCORE TRUE +#endif + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or + * @p CH_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) +#define CH_USE_HEAP TRUE +#endif + +/** + * @brief C-runtime allocator. + * @details If enabled the the heap allocator APIs just wrap the C-runtime + * @p malloc() and @p free() functions. + * + * @note The default is @p FALSE. + * @note Requires @p CH_USE_HEAP. + * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the + * appropriate documentation. + */ +#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) +#define CH_USE_MALLOC_HEAP FALSE +#endif + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) +#define CH_USE_MEMPOOLS TRUE +#endif + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_WAITEXIT. + * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. + */ +#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) +#define CH_USE_DYNAMIC TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) +#define CH_DBG_SYSTEM_STATE_CHECK FALSE +#endif + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_CHECKS FALSE +#endif + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_ASSERTS FALSE +#endif + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the context switch circular trace buffer is + * activated. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_TRACE FALSE +#endif + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_STACK_CHECK FALSE +#endif + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) +#define CH_DBG_FILL_THREADS FALSE +#endif + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p Thread structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p TRUE. + * @note This debug option is defaulted to TRUE because it is required by + * some test cases into the test suite. + */ +#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) +#define CH_DBG_THREADS_PROFILING TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p Thread structure. + */ +#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) +#define THREAD_EXT_FIELDS \ + /* Add threads custom fields here.*/ +#endif + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) +#define THREAD_EXT_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} +#endif + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + * + * @note It is inserted into lock zone. + * @note It is also invoked when the threads simply return in order to + * terminate. + */ +#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) +#define THREAD_EXT_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} +#endif + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) +#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* System halt code here.*/ \ +} +#endif + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) +#define IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} +#endif + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) +#define SYSTEM_TICK_EVENT_HOOK() { \ + /* System tick event code here.*/ \ +} +#endif + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) +#define SYSTEM_HALT_HOOK() { \ + /* System halt code here.*/ \ +} +#endif + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* _CHCONF_H_ */ + +/** @} */ diff --git a/demos/ARM11-BCM2835-G++-MPC/halconf.h b/demos/ARM11-BCM2835-G++-MPC/halconf.h new file mode 100644 index 0000000000..d3766e0fd1 --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/halconf.h @@ -0,0 +1,342 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the TM subsystem. + */ +#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) +#define HAL_USE_TM FALSE +#endif + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL TRUE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI TRUE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Block size for MMC transfers. + */ +#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) +#define MMC_SECTOR_SIZE 512 +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/** + * @brief Number of positive insertion queries before generating the + * insertion event. + */ +#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) +#define MMC_POLLING_INTERVAL 10 +#endif + +/** + * @brief Interval, in milliseconds, between insertion queries. + */ +#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) +#define MMC_POLLING_DELAY 10 +#endif + +/** + * @brief Uses the SPI polled API for small data transfers. + * @details Polled transfers usually improve performance because it + * saves two context switches and interrupt servicing. Note + * that this option has no effect on large transfers which + * are always performed using DMAs/IRQs. + */ +#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) +#define MMC_USE_SPI_POLLING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/demos/ARM11-BCM2835-G++-MPC/main.cpp b/demos/ARM11-BCM2835-G++-MPC/main.cpp new file mode 100644 index 0000000000..1329ae9e4c --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/main.cpp @@ -0,0 +1,188 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "ch.hpp" +#include "hal.h" +#include "chprintf.h" +#include "Matrix" +#include "ERRORH" +#include "MPC" +#include "KF" + +using namespace chibios_rt; +using namespace PMPC; + +extern BaseSequentialStream * MSD1; + +template int sgn(T val) { + return (T(0) < val) - (val < T(0)); +} +/* + * Brushed DC motor MPC controller + */ +static WORKING_AREA(waThread1, 128); +static msg_t Thread1(void *p) { + (void) p; + /* + * Defining the variables + */ + //Control horizon + int nc = 4; + // Prediction horizon + int np = 4; + //Control signal + Matrix u(1, 1); + // Sampling time + double Ts = 5e-5; + + /* + * Initializing the MPC + */ + MPC mySysMat(2, 1, 1); + + Matrix DeltaU(np, 1); + + Matrix R = 1e-5 + * Matrix::Identity(mySysMat.C.rows() * nc, mySysMat.C.rows() * nc); + Matrix Q = 1e4 * Matrix::Identity(np, np); + + Matrix x0(2, 1); + Matrix x00(2, 1); + //Reference signal + Matrix y_ref(100000, 1); + y_ref.rblock(0, 0, 50000, 1) = 100 * Matrix::Ones(50000, 1); + y_ref.rblock(50000, 0, 100000, 1) = -100 * Matrix::Ones(50000, 1); + + //double start = now(); + + //DC motor parameters + double Rm = 0.35; + double Km = 0.0296; + double Ke = 0.0296; + double b = 6.7 * 10e-5; + double J = 2.9 * 10e-6; + //double Fc = 0.02; + double L = 25 * 10e-6; + + //Initializing the system matrices + mySysMat.Fi << 1 - Ts * (Rm / L), -Ts * (Ke / L), Ts * (Km / J), 1 - Ts * (b / J); + + mySysMat.Ga << Ts * 1 / L, 0; + + mySysMat.C << 0, 1; + + mySysMat.calcMPCFi(np); + mySysMat.calcMPCGa(np); + mySysMat.calcMPCGy(np, nc); + + /* + * Initializing the Kalman filter + */ + + Matrix kQ = 1e-5 * Matrix::Identity(mySysMat.Ga.rows(), mySysMat.Ga.rows()); + Matrix kR = 1e4 * Matrix::Identity(mySysMat.C.rows(), mySysMat.C.rows()); + Matrix kP = 1e-10 * Matrix::Identity(mySysMat.Ga.rows(), mySysMat.Ga.rows()); + KF myKalman(x0, mySysMat.C, kQ, kR, kP); + +#ifdef CHIBIOS_DEBUG + ERRORH::print("Calculation Fi,Ga,Gy took : "); + //ERRORH::print((double) (now() - start)); +#endif + + Matrix calcT(1, y_ref.rows()); + Matrix u_hist(1, y_ref.rows()); + Matrix w_hist(1, y_ref.rows()); + Matrix w_est_hist(1, y_ref.rows()); + + for (unsigned i = 0; i < y_ref.rows() - np; i++) { + + //start = now(); + //Calculating the error + + DeltaU = mySysMat.calcContSig(mySysMat.calcError(y_ref.block(i, 0, i + np, 1), x00, u), Q, + R); + + u(0, 0) += DeltaU(0, 0); + + //We are not including this in the time measurement + if (abs(u(0, 0)) > 5) + u(0, 0) = sgn(u(0, 0)) * 5; + + u_hist(0, i) = u(0, 0); + + myKalman.updateState(mySysMat.Fi, mySysMat.Ga, u); + + x00 = myKalman.estimate(mySysMat.Fi, x0.block(0, 0, 1, 1)); + + //Simulating the system + x0 = mySysMat.Fi * x0 + mySysMat.Ga * u; + + w_hist(0, i) = x0(1, 0); + w_est_hist(0, i) = x00(1, 0); + //Storing the calculation time + //calcT(0, i) = (double) (now() - start); + + } +#ifdef CHIBIOS_DEBUG + ERRORH::print("Minimum : "); + //ERRORH::print((double) calcT.min()); + ERRORH::print("Maximum : "); + //ERRORH::print((double) calcT.max()); +#endif + return 0; +} + +/* + * Application entry point. + */ +int main(void) { + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + System::Init(); + + /* + * Activates the serial driver using the driver default configuration. + */ + sdStart(&SD1, NULL); + chprintf((BaseSequentialStream *) &SD1, "MPC test"); + + /* + * Redirect the output to the serial port + */ + MSD1 = (BaseSequentialStream *) &SD1; + + /* + * Creates the blinker thread. + */ + chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + + /* + * Events servicing loop. + */ + chThdWait(chThdSelf()); + + return 0; +} diff --git a/demos/ARM11-BCM2835-G++-MPC/mcuconf.h b/demos/ARM11-BCM2835-G++-MPC/mcuconf.h new file mode 100644 index 0000000000..87621be7a4 --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/mcuconf.h @@ -0,0 +1,57 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* + * LPC214x drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the driver + * is enabled in halconf.h. + */ + +/* + * ADC driver system settings. + */ + +/* + * CAN driver system settings. + */ + +/* + * MAC driver system settings. + */ + +/* + * PWM driver system settings. + */ + +/* + * SERIAL driver system settings. + */ +#define USE_LPC214x_UART0 TRUE +#define USE_LPC214x_UART1 TRUE +#define LPC214x_UART_FIFO_PRELOAD 16 +#define LPC214x_UART0_PRIORITY 1 +#define LPC214x_UART1_PRIORITY 2 + +/* + * SPI driver system settings. + */ +#define USE_LPC214x_SPI1 TRUE diff --git a/demos/ARM11-BCM2835-G++-MPC/readme.txt b/demos/ARM11-BCM2835-G++-MPC/readme.txt new file mode 100644 index 0000000000..8408ba32a5 --- /dev/null +++ b/demos/ARM11-BCM2835-G++-MPC/readme.txt @@ -0,0 +1,21 @@ +***************************************************************************** +** ChibiOS/RT port for BCM2835 using G++. ** +***************************************************************************** + +** TARGET ** + +The demo runs some graphics tests using the Adafruit 2.2" 18-bit color +TFT LCD display. http://www.adafruit.com/products/797 + +** The Demo ** + +The demonstration uses modified versions of the Adafruit_GFX and +Adafruit_HX8340B classes. These were originally written for the Arduino. +The Print and Printable support classes are also modified versions of +the Arduino classes. The graphics test is based on the test provided +with the Adafruit libraries, modified to run on the Pi. + +** Build Procedure ** + +The demo was built using the YAGARTO toolchain but any toolchain based on GCC +and GNU userspace programs will work. diff --git a/demos/ARM11-BCM2835-G++/.cproject b/demos/ARM11-BCM2835-G++/.cproject new file mode 100644 index 0000000000..ea94e982de --- /dev/null +++ b/demos/ARM11-BCM2835-G++/.cproject @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/ARM11-BCM2835-G++/.project b/demos/ARM11-BCM2835-G++/.project new file mode 100644 index 0000000000..211aa8ef4d --- /dev/null +++ b/demos/ARM11-BCM2835-G++/.project @@ -0,0 +1,90 @@ + + + ROS + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + board + 2 + /home/robu/UbuntuOne/ChibiOS-RPi/boards/RASPBERRYPI_MODB + + + os + 2 + /home/robu/UbuntuOne/ChibiOS-RPi/os + + + diff --git a/demos/ARM11-BCM2835-G++/Makefile b/demos/ARM11-BCM2835-G++/Makefile index 0610e6b309..6d310bbb58 100644 --- a/demos/ARM11-BCM2835-G++/Makefile +++ b/demos/ARM11-BCM2835-G++/Makefile @@ -5,7 +5,7 @@ # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 + USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 endif # C specific options here (added to USE_OPT). @@ -15,7 +15,7 @@ endif # C++ specific options here (added to USE_OPT). ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions + USE_CPPOPT = -fno-rtti -fno-exceptions endif # Enable this if you want the linker to remove unused code and data @@ -64,16 +64,16 @@ CSRC = $(PORTSRC) \ $(PLATFORMSRC) \ $(BOARDSRC) \ $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/chprintf.c + $(CHIBIOS)/os/various/chprintf.c \ + $(CHIBIOS)/os/various/syscalls.c # C++ sources that can be compiled in ARM or THUMB mode depending on the global # setting. CPPSRC = $(CHIBIOS)/os/various/ch.cpp \ main.cpp \ - $(CHIBIOS)/os/contrib/Adafruit_GFX.cpp \ - $(CHIBIOS)/os/contrib/Adafruit_HX8340B.cpp \ - $(CHIBIOS)/os/contrib/Print.cpp + $(CHIBIOS)/os/contrib/Print.cpp \ + # C sources to be compiled in ARM mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler @@ -101,8 +101,8 @@ ASMSRC = $(PORTASM) INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ $(HALINC) $(PLATFORMINC) $(BOARDINC) \ $(CHIBIOS)/os/various \ - $(CHIBIOS)/os/contrib - + $(CHIBIOS)/os/contrib \ + /home/robu/UbuntuOne/PMPCToolbox # # Project, sources and paths ############################################################################## @@ -111,7 +111,7 @@ INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ # Compiler settings # -MCU = arm7tdmi +MCU = arm1176jzf-s #TRGT = arm-elf- TRGT = arm-none-eabi- @@ -129,16 +129,16 @@ HEX = $(CP) -O ihex BIN = $(CP) -O binary # ARM-specific options here -AOPT = +AOPT = # THUMB-specific options here -TOPT = -mthumb -DTHUMB +TOPT = -mthumb -DTHUMB # Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes +CWARN = -Wall -Wextra -Wstrict-prototypes # Define C++ warning options here -CPPWARN = -Wall -Wextra +CPPWARN = -Wall -Wextra # # Compiler settings @@ -149,7 +149,7 @@ CPPWARN = -Wall -Wextra # # List all default C defines here, like -D_DEBUG=1 -DDEFS = +DDEFS = -DCHIBIOS_DEBUG -DCHIBIOS # List all default ASM defines here, like -D_DEBUG=1 DADEFS = @@ -161,7 +161,7 @@ DINCDIR = DLIBDIR = # List all default libraries here -DLIBS = +DLIBS = #-lstdc++ # # End of default section diff --git a/demos/ARM11-BCM2835-G++/Makefile.u1conflict b/demos/ARM11-BCM2835-G++/Makefile.u1conflict new file mode 100644 index 0000000000..ea84c0ab6b --- /dev/null +++ b/demos/ARM11-BCM2835-G++/Makefile.u1conflict @@ -0,0 +1,194 @@ +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# + +# Compiler options here. +ifeq ($(USE_OPT),) + USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 +endif + +# C specific options here (added to USE_OPT). +ifeq ($(USE_COPT),) + USE_COPT = +endif + +# C++ specific options here (added to USE_OPT). +ifeq ($(USE_CPPOPT),) + USE_CPPOPT = -fno-rtti -fno-exceptions +endif + +# Enable this if you want the linker to remove unused code and data +ifeq ($(USE_LINK_GC),) + USE_LINK_GC = yes +endif + +# If enabled, this option allows to compile the application in THUMB mode. +ifeq ($(USE_THUMB),) + USE_THUMB = no +endif + +# Enable this if you want to see the full log while compiling. +ifeq ($(USE_VERBOSE_COMPILE),) + USE_VERBOSE_COMPILE = no +endif + +# +# Build global options +############################################################################## + +############################################################################## +# Project, sources and paths +# + +# Define project name here +PROJECT = ch + +# Imported source files and paths +CHIBIOS = ../.. +include $(CHIBIOS)/boards/RASPBERRYPI_MODB/board.mk +include $(CHIBIOS)/os/hal/platforms/BCM2835/platform.mk +include $(CHIBIOS)/os/hal/hal.mk +include $(CHIBIOS)/os/ports/GCC/ARM/BCM2835/port.mk +include $(CHIBIOS)/os/kernel/kernel.mk +include /home/robu/UbuntuOne/lmatrixtest/lcomatrix/lcomatrix.mk + +# Define linker script file here +LDSCRIPT= $(PORTLD)/BCM2835.ld + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CSRC = $(PORTSRC) \ + $(KERNSRC) \ + $(TESTSRC) \ + $(HALSRC) \ + $(PLATFORMSRC) \ + $(BOARDSRC) \ + $(CHIBIOS)/os/various/evtimer.c \ + $(CHIBIOS)/os/various/chprintf.c + + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CPPSRC = $(CHIBIOS)/os/various/ch.cpp \ + main.cpp \ + $(CHIBIOS)/os/contrib/Print.cpp \ + $(LCOMSRC) + +# C sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +ACSRC = + +# C++ sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +ACPPSRC = + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +TCSRC = + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +TCPPSRC = + +# List ASM source files here +ASMSRC = $(PORTASM) + +INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ + $(HALINC) $(PLATFORMINC) $(BOARDINC) \ + $(CHIBIOS)/os/various \ + $(CHIBIOS)/os/contrib \ + $(MATRIXINC) + +# +# Project, sources and paths +############################################################################## + +############################################################################## +# Compiler settings +# + +MCU = arm1176jzf-s + +#TRGT = arm-elf- +TRGT = arm-none-eabi- +CC = $(TRGT)gcc +CPPC = $(TRGT)g++ +# Enable loading with g++ only if you need C++ runtime support. +# NOTE: You can use C++ even without C++ support if you are careful. C++ +# runtime support makes code size explode. +LD = $(TRGT)gcc +#LD = $(TRGT)g++ +CP = $(TRGT)objcopy +AS = $(TRGT)gcc -x assembler-with-cpp +OD = $(TRGT)objdump +HEX = $(CP) -O ihex +BIN = $(CP) -O binary + +# ARM-specific options here +AOPT = -lstdc++ + +# THUMB-specific options here +TOPT = -mthumb -DTHUMB + +# Define C warning options here +CWARN = -Wall -Wextra -Wstrict-prototypes + +# Define C++ warning options here +CPPWARN = -Wall -Wextra + +# +# Compiler settings +############################################################################## + +############################################################################## +# Start of default section +# + +# List all default C defines here, like -D_DEBUG=1 +DDEFS = + +# List all default ASM defines here, like -D_DEBUG=1 +DADEFS = + +# List all default directories to look for include files here +DINCDIR = + +# List the default directory to look for the libraries here +DLIBDIR = + +# List all default libraries here +DLIBS = + +# +# End of default section +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +UDEFS = + +# Define ASM defines here +UADEFS = + +# List all user directories here +UINCDIR = + +# List the user directory to look for the libraries here +ULIBDIR = + +# List all user libraries here +ULIBS = + +# +# End of user defines +############################################################################## + +include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM11-BCM2835-G++/main.cpp b/demos/ARM11-BCM2835-G++/main.cpp index 8091868d34..35a1aca53c 100644 --- a/demos/ARM11-BCM2835-G++/main.cpp +++ b/demos/ARM11-BCM2835-G++/main.cpp @@ -1,322 +1,66 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. - This file is part of ChibiOS/RT. + This file is part of ChibiOS/RT. - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ #include "ch.hpp" #include "hal.h" #include "chprintf.h" -#include "Adafruit_HX8340B.h" - -// Color definitions -#define BLACK 0x0000 -#define BLUE 0x001F -#define RED 0xF800 -#define GREEN 0x07E0 -#define CYAN 0x07FF -#define MAGENTA 0xF81F -#define YELLOW 0xFFE0 -#define WHITE 0xFFFF - -static const float p = 3.1415926; +#include "Matrix" +#include "ERRORH" +//#include "lcomatrix.h" using namespace chibios_rt; +using namespace PMPC; -static void tftPrintTest(Adafruit_HX8340B& display); -static void testlines(Adafruit_HX8340B& display, uint16_t color); -//static void testdrawtext(Adafruit_HX8340B& display, char *text, uint16_t color); -static void testfastlines(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2); -static void testdrawrects(Adafruit_HX8340B& display, uint16_t color); -static void testfillrects(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2); -static void testfillcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color); -static void testdrawcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color); -static void testtriangles(Adafruit_HX8340B& display); -static void testroundrects(Adafruit_HX8340B& display); -static void tftPrintTest(Adafruit_HX8340B& display); - -#define delay(millis) chThdSleepMilliseconds(millis) - -static WORKING_AREA(waThread1, 128); - -static msg_t Thread1(void *p) { - (void)p; - chRegSetThreadName("backlightControl"); - while (TRUE) { - uint32_t buttonState = palReadPad(GPIO4_PORT, GPIO4_PAD); - if (buttonState == 0) { - palClearPad(GPIO25_PORT, GPIO25_PAD); - } - else { - palSetPad(GPIO25_PORT, GPIO25_PAD); - } - } - return 0; -} - +extern BaseSequentialStream * MSD1; /* * Application entry point. */ int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - System::Init(); - - /* - * Activates the serial driver using the driver default configuration. - */ - sdStart(&SD1, NULL); - chprintf((BaseSequentialStream *)&SD1, "Adafruit HX8340B Demonstration (C++)\r\n"); - - // Use button on pin 4 to control backlight with pin 25 - palSetPadMode(GPIO4_PORT, GPIO4_PAD, PAL_MODE_INPUT_PULLUP); - palSetPadMode(GPIO25_PORT, GPIO25_PAD, PAL_MODE_OUTPUT); - palSetPad(GPIO25_PORT, GPIO25_PAD); - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - palSetPadMode(GPIO17_PORT, GPIO17_PAD, PAL_MODE_OUTPUT); - - palSetPad(GPIO17_PORT, GPIO17_PAD); - chThdSleepMilliseconds(100); - palClearPad(GPIO17_PORT, GPIO17_PAD); - chThdSleepMilliseconds(100); - palSetPad(GPIO17_PORT, GPIO17_PAD); - chThdSleepMilliseconds(50); - - /* LCD Config.*/ - SPIConfig spiConfig; - spiConfig.chip_select = 1; - spiConfig.lossiEnabled = TRUE; - spiConfig.clock_divider = 8; // ~30 MHz - - Adafruit_HX8340B display(&SPI0, &spiConfig); - - display.begin(); - - display.fillScreen(BLACK); - - display.setRotation(3); - display.setCursor(0,0); - display.print("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa"); - delay(1000); - - tftPrintTest(display); - delay(1000); - - //a single pixel - display.drawPixel(display.width()/2, display.height()/2, GREEN); - delay(500); - - // line draw test - testlines(display, YELLOW); - delay(500); - - // optimized lines - testfastlines(display, RED, BLUE); - delay(500); - - testdrawrects(display, GREEN); - delay(1000); - - testfillrects(display, YELLOW, MAGENTA); - delay(1000); - - display.fillScreen(BLACK); - testfillcircles(display, 10, BLUE); - testdrawcircles(display, 10, WHITE); - delay(1000); - - testroundrects(display); - delay(500); - - testtriangles(display); - delay(500); - - /* - * Events servicing loop. - */ - chprintf((BaseSequentialStream *)&SD1, "Demonstration idle\r\n"); - chThdWait(chThdSelf()); - - chprintf((BaseSequentialStream *)&SD1, "Demonstration exiting\r\n"); - - return 0; -} - -static void testlines(Adafruit_HX8340B& display, uint16_t color) { - display.fillScreen(BLACK); - for (int16_t x=0; x < display.width()-1; x+=6) { - display.drawLine(0, 0, x, display.height()-1, color); - } - for (int16_t y=0; y < display.height()-1; y+=6) { - display.drawLine(0, 0, display.width()-1, y, color); - } - - display.fillScreen(BLACK); - for (int16_t x=0; x < display.width()-1; x+=6) { - display.drawLine(display.width()-1, 0, x, display.height()-1, color); - } - for (int16_t y=0; y < display.height()-1; y+=6) { - display.drawLine(display.width()-1, 0, 0, y, color); - } - - display.fillScreen(BLACK); - for (int16_t x=0; x < display.width()-1; x+=6) { - display.drawLine(0, display.height()-1, x, 0, color); - } - for (int16_t y=0; y < display.height()-1; y+=6) { - display.drawLine(0, display.height()-1, display.width()-1, y, color); - } - - display.fillScreen(BLACK); - for (int16_t x=0; x < display.width()-1; x+=6) { - display.drawLine(display.width()-1, display.height()-1, x, 0, color); - } - for (int16_t y=0; y < display.height()-1; y+=6) { - display.drawLine(display.width()-1, display.height()-1, 0, y, color); - } - -} - -#if 0 -static void testdrawtext(Adafruit_HX8340B& display, char *text, uint16_t color) { - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(0,0); - - for (uint8_t i=0; i < 168; i++) { - if (i == '\n') continue; - display.write(i); - if ((i > 0) && (i % 21 == 0)) - display.println(); - } -} -#endif - -static void testfastlines(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2) { - display.fillScreen(BLACK); - for (int16_t y=0; y < display.height()-1; y+=5) { - display.drawFastHLine(0, y, display.width()-1, color1); - } - for (int16_t x=0; x < display.width()-1; x+=5) { - display.drawFastVLine(x, 0, display.height()-1, color2); - } -} - -static void testdrawrects(Adafruit_HX8340B& display, uint16_t color) { - display.fillScreen(BLACK); - for (int16_t x=0; x < display.height()-1; x+=6) { - display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color); - } -} - -static void testfillrects(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2) { - display.fillScreen(BLACK); - for (int16_t x=display.width()-1; x > 6; x-=6) { - display.fillRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color1); - display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color2); - } -} - -static void testfillcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color) { - for (uint8_t x=radius; x < display.width()-1; x+=radius*2) { - for (uint8_t y=radius; y < display.height()-1; y+=radius*2) { - display.fillCircle(x, y, radius, color); - } - } -} - -static void testdrawcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color) { - for (int16_t x=0; x < display.width()-1+radius; x+=radius*2) { - for (int16_t y=0; y < display.height()-1+radius; y+=radius*2) { - display.drawCircle(x, y, radius, color); - } - } -} - -static void testtriangles(Adafruit_HX8340B& display) { - display.fillScreen(BLACK); - int color = 0xF800; - int t; - int w = display.width()/2; - int x = display.height(); - int y = 0; - int z = display.width(); - for(t = 0 ; t <= 15; t+=1) { - display.drawTriangle(w, y, y, x, z, x, color); - x-=4; - y+=4; - z-=4; - color+=100; - } -} - -static void testroundrects(Adafruit_HX8340B& display) { - display.fillScreen(BLACK); - int color = 100; - int i; - int t; - for(t = 0 ; t <= 4; t+=1) { - int x = 0; - int y = 0; - int w = display.width(); - int h = display.height(); - for(i = 0 ; i <= 24; i+=1) { - display.drawRoundRect(x, y, w, h, 5, color); - x+=2; - y+=3; - w-=4; - h-=6; - color+=1100; - } - color+=100; - } + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + System::Init(); + + /* + * Activates the serial driver using the driver default configuration. + */ + sdStart(&SD1, NULL); + chprintf((BaseSequentialStream *) &SD1, "MPC test"); + + MSD1 = (BaseSequentialStream *) &SD1; + ERRORH::throwerror("asa"); + + + Matrix DeltaU(3, 1); + Matrix Delta(DeltaU); + //MSD1 = (BaseSequentialStream *) &SD1; + //DeltaU.print(); + /*Matrix R = 1e-5 + * Matrix::Identity(mySysMat.C.rows() * 3, + mySysMat.C.rows() * nc); + Matrix Q = 1e4 * Matrix::Identity(np, np);*/ + + return 0; } - -static void tftPrintTest(Adafruit_HX8340B& display) { - display.fillScreen(BLACK); - display.setCursor(0, 5); - display.setTextColor(RED); - display.setTextSize(1); - display.println("Hello World!"); - display.setTextColor(YELLOW, GREEN); - display.setTextSize(2); - display.println("Hello World!"); - display.setTextColor(BLUE); - display.setTextSize(3); - display.println(1234.567); - delay(1500); - display.setCursor(0, 5); - display.fillScreen(BLACK); - display.setTextColor(WHITE); - display.setTextSize(0); - display.println("Hello World!"); - display.setTextSize(1); - display.setTextColor(GREEN); - display.print(p, 5); - display.println(" Want pi?"); - display.print(8675309, HEX); // print 8,675,309 out in HEX! - display.println(" Print HEX"); - display.setTextColor(WHITE); -} - diff --git a/demos/ARM11-BCM2835-G++/main.cpp.u1conflict b/demos/ARM11-BCM2835-G++/main.cpp.u1conflict new file mode 100644 index 0000000000..da8779dd27 --- /dev/null +++ b/demos/ARM11-BCM2835-G++/main.cpp.u1conflict @@ -0,0 +1,60 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "ch.hpp" +#include "hal.h" +#include "chprintf.h" +#include "Matrix" + +//#include "lcomatrix.h" +using namespace chibios_rt; +using namespace PMPC; + +/* + * Application entry point. + */ +int main(void) { + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + System::Init(); + vector < int > vIntVector( 1, 7 ); + /* + * Activates the serial driver using the driver default configuration. + */ + sdStart(&SD1, NULL); + chprintf((BaseSequentialStream *) &SD1, "MPC test"); + + Matrix DeltaU(3, 1); + //Matrix Delta(DeltaU); + //MSD1 = (BaseSequentialStream *) &SD1; + DeltaU.print(); + /*Matrix R = 1e-5 + * Matrix::Identity(mySysMat.C.rows() * 3, + mySysMat.C.rows() * nc); + Matrix Q = 1e4 * Matrix::Identity(np, np);*/ + + return 0; +} From 6ac327277791c3b18472c3a58aefe91c5fd93842 Mon Sep 17 00:00:00 2001 From: iUngi Date: Thu, 29 Nov 2012 20:15:14 +0100 Subject: [PATCH 02/19] Fixed the C++ linking problem(.ARM.extab) --- .project | 89 +++++++-- demos/ARM11-BCM2835-G++-MPC/Makefile | 6 +- demos/ARM11-BCM2835-G++/Makefile | 4 +- demos/ARM11-BCM2835-G++/Makefile.u1conflict | 194 -------------------- demos/ARM11-BCM2835-G++/main.cpp | 2 +- demos/ARM11-BCM2835-G++/main.cpp.u1conflict | 60 ------ os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld | 2 +- os/various/syscalls.c | 24 +++ 8 files changed, 109 insertions(+), 272 deletions(-) delete mode 100644 demos/ARM11-BCM2835-G++/Makefile.u1conflict delete mode 100644 demos/ARM11-BCM2835-G++/main.cpp.u1conflict diff --git a/.project b/.project index 4c9adf2baf..078654c1e2 100644 --- a/.project +++ b/.project @@ -1,11 +1,78 @@ - - - ChibiOS-RT (whole tree) - - - - - - - - + + + ChibiOS-RT (whole tree) + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/demos/ARM11-BCM2835-G++-MPC/Makefile b/demos/ARM11-BCM2835-G++-MPC/Makefile index d0c7d58084..2b73a8da3a 100644 --- a/demos/ARM11-BCM2835-G++-MPC/Makefile +++ b/demos/ARM11-BCM2835-G++-MPC/Makefile @@ -121,7 +121,7 @@ CPPC = $(TRGT)g++ # NOTE: You can use C++ even without C++ support if you are careful. C++ # runtime support makes code size explode. LD = $(TRGT)gcc -LD = $(TRGT)g++ +#LD = $(TRGT)g++ CP = $(TRGT)objcopy AS = $(TRGT)gcc -x assembler-with-cpp OD = $(TRGT)objdump @@ -135,7 +135,7 @@ AOPT = TOPT = -mthumb -DTHUMB # Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes +CWARN = -Wall -Wextra -Wstrict-prototypes # Define C++ warning options here CPPWARN = -Wall -Wextra @@ -161,7 +161,7 @@ DINCDIR = DLIBDIR = # List all default libraries here -DLIBS = #-lstdc++ +DLIBS = -lstdc++ # # End of default section diff --git a/demos/ARM11-BCM2835-G++/Makefile b/demos/ARM11-BCM2835-G++/Makefile index 6d310bbb58..6d3405c280 100644 --- a/demos/ARM11-BCM2835-G++/Makefile +++ b/demos/ARM11-BCM2835-G++/Makefile @@ -15,7 +15,7 @@ endif # C++ specific options here (added to USE_OPT). ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions + USE_CPPOPT = -fno-rtti -fno-exceptions endif # Enable this if you want the linker to remove unused code and data @@ -161,7 +161,7 @@ DINCDIR = DLIBDIR = # List all default libraries here -DLIBS = #-lstdc++ +DLIBS = -lstdc++ # # End of default section diff --git a/demos/ARM11-BCM2835-G++/Makefile.u1conflict b/demos/ARM11-BCM2835-G++/Makefile.u1conflict deleted file mode 100644 index ea84c0ab6b..0000000000 --- a/demos/ARM11-BCM2835-G++/Makefile.u1conflict +++ /dev/null @@ -1,194 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/RASPBERRYPI_MODB/board.mk -include $(CHIBIOS)/os/hal/platforms/BCM2835/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/BCM2835/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include /home/robu/UbuntuOne/lmatrixtest/lcomatrix/lcomatrix.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/BCM2835.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/chprintf.c - - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(CHIBIOS)/os/various/ch.cpp \ - main.cpp \ - $(CHIBIOS)/os/contrib/Print.cpp \ - $(LCOMSRC) - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various \ - $(CHIBIOS)/os/contrib \ - $(MATRIXINC) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm1176jzf-s - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = -lstdc++ - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM11-BCM2835-G++/main.cpp b/demos/ARM11-BCM2835-G++/main.cpp index 35a1aca53c..406a0b1a80 100644 --- a/demos/ARM11-BCM2835-G++/main.cpp +++ b/demos/ARM11-BCM2835-G++/main.cpp @@ -48,7 +48,7 @@ int main(void) { */ sdStart(&SD1, NULL); chprintf((BaseSequentialStream *) &SD1, "MPC test"); - + MSD1 = (BaseSequentialStream *) &SD1; ERRORH::throwerror("asa"); diff --git a/demos/ARM11-BCM2835-G++/main.cpp.u1conflict b/demos/ARM11-BCM2835-G++/main.cpp.u1conflict deleted file mode 100644 index da8779dd27..0000000000 --- a/demos/ARM11-BCM2835-G++/main.cpp.u1conflict +++ /dev/null @@ -1,60 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -#include "ch.hpp" -#include "hal.h" -#include "chprintf.h" -#include "Matrix" - -//#include "lcomatrix.h" -using namespace chibios_rt; -using namespace PMPC; - -/* - * Application entry point. - */ -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - System::Init(); - vector < int > vIntVector( 1, 7 ); - /* - * Activates the serial driver using the driver default configuration. - */ - sdStart(&SD1, NULL); - chprintf((BaseSequentialStream *) &SD1, "MPC test"); - - Matrix DeltaU(3, 1); - //Matrix Delta(DeltaU); - //MSD1 = (BaseSequentialStream *) &SD1; - DeltaU.print(); - /*Matrix R = 1e-5 - * Matrix::Identity(mySysMat.C.rows() * 3, - mySysMat.C.rows() * nc); - Matrix Q = 1e4 * Matrix::Identity(np, np);*/ - - return 0; -} diff --git a/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld b/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld index 300adbc188..809def23a0 100644 --- a/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld +++ b/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld @@ -57,7 +57,7 @@ SECTIONS *(.dtors) } > ram - .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} + .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > ram __exidx_start = .; .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > ram diff --git a/os/various/syscalls.c b/os/various/syscalls.c index 252028c7f1..c945040a7f 100644 --- a/os/various/syscalls.c +++ b/os/various/syscalls.c @@ -71,6 +71,9 @@ /***************************************************************************/ +///* The ABI requires a 64-bit type. */ +__extension__ typedef int __guard __attribute__((mode (__DI__))); + int _read_r(struct _reent *r, int file, char * ptr, int len) { (void)r; @@ -173,4 +176,25 @@ int _isatty_r(struct _reent *r, int fd) return 1; } +// FIXME: Stubs - HATE THEM +void _exit(int status){ + (void) status; + chSysHalt(); + + while(TRUE){} +} + +pid_t _getpid(void){ + return 1; +} + +void _kill(pid_t id){ + (void) id; +} + +/* guard variables */ +int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);}; +void __cxa_guard_release (__guard *g) {*(char *)g = 1;}; +void __cxa_guard_abort (__guard * g __attribute__((unused))) {}; + /*** EOF ***/ From bc18502aa8957519c8342aec1ac87c6c534d579d Mon Sep 17 00:00:00 2001 From: iUngi Date: Fri, 30 Nov 2012 10:25:45 +0100 Subject: [PATCH 03/19] Ported to C++ --- demos/ARM11-BCM2835-G++-MPC/.project | 5 ++++ demos/ARM11-BCM2835-G++-MPC/main.cpp | 2 +- demos/ARM11-BCM2835-G++/Matrix/Matrix.tags | Bin 0 -> 20480 bytes .../ARM11-BCM2835-G++/Matrix/Matrix.workspace | 7 ++++++ .../Matrix/Matrix.workspace.session | 22 ++++++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 demos/ARM11-BCM2835-G++/Matrix/Matrix.tags create mode 100644 demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace create mode 100644 demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session diff --git a/demos/ARM11-BCM2835-G++-MPC/.project b/demos/ARM11-BCM2835-G++-MPC/.project index 211aa8ef4d..02a0beb5af 100644 --- a/demos/ARM11-BCM2835-G++-MPC/.project +++ b/demos/ARM11-BCM2835-G++-MPC/.project @@ -76,6 +76,11 @@ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + PMPCToolbox + 2 + /home/robu/UbuntuOne/PMPCToolbox + board 2 diff --git a/demos/ARM11-BCM2835-G++-MPC/main.cpp b/demos/ARM11-BCM2835-G++-MPC/main.cpp index 1329ae9e4c..8d90bbd026 100644 --- a/demos/ARM11-BCM2835-G++-MPC/main.cpp +++ b/demos/ARM11-BCM2835-G++-MPC/main.cpp @@ -177,7 +177,7 @@ int main(void) { /* * Creates the blinker thread. */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + chThdCreateStatic(waThread1, sizeof(waThread1), ABSPRIO, Thread1, NULL); /* * Events servicing loop. diff --git a/demos/ARM11-BCM2835-G++/Matrix/Matrix.tags b/demos/ARM11-BCM2835-G++/Matrix/Matrix.tags new file mode 100644 index 0000000000000000000000000000000000000000..17d33297f57710a451d71184a0613a38e65f417f GIT binary patch literal 20480 zcmeI4-A)@v6o7Yj%{q`ckS6Yyi>MP-NM6Nl)m9OeqDXPg0xn>PZPHMwT5Zi>uP|$~ zJC4FlC8EASZ~7kXlk}?BRd14a$W3Qvf4oDeYV~HM)mhnQe$LO#clOM&F{1ly*QW%Z zjKedJ;;*!lhLH9YV@=am*z+EHrq?oSptN(Pog0>#E83@jKUmMN)_(6q{KNm1p+`oF#*Vb#Q^~KKtLe@$bW_K!8H(2OaSsWzv>8pe;}Za0OY?q_TU)^s3yRF|5rjo4Gs05^goPE z)$1v$|JQd>*{W92&x_RiaYU#$i1<@)cAQ4f!M(;eyAI|fxYpXht#;4Zays~+)7oov zj_{6igd2yw{Z^aF?>X&W9S7bS!4VDpU{J>={%F=2`2oRxK*@lFb$sdv$C;eh?~^FX zx{*H!JUR_$x)YC55(b&X#0yD4v#uWuN$As=1tvetX6eO*gybaaNB!|+W;!IyQ{cYz zM$>fAKG03;;X`yJm_+9z_NQoWM9!xqVC$5-hD7ShWR26PGfkTsWy`YA<(4qH+1how z;-w_1i=lZ*%W%Djx@;@nU_g#j%J$`YscfyTqSr0qcCXRw?04hW1<7$d_WwLfVU@z~ zNAAfq=u>|jxFi2mM8A$hG8uV&a+VL^)ri|r|BHI!z`lUMe-o&nO|7DBY5K4FU&hzQ z)c9ThPOqXr(J$y*?Ki}y=DCJ<%GT#==yH)&8}f?RG4~}2BYq%F1OGffa4$I!58JJ0 zhYl-s8_o++`6LZI4y3_aV$S}4*|gTy&_z~8Q?75yND<8$6^H};&kc_&#>yxrV1 z-)P(wMa*tin3-x~rq|f&x(AI8tN7gCiew}=nbNAo_1b=N%d|eOqC>HkM6S2ZO)Ot$ zqPLwhK!^6zo2K=kijHRL-RAy*!}V{!uP^2@1ET2LPnNDOfTQ3BD(@TMQ<*+5Z1(m7 zTY!ZIVgaI93zVW|CI+PYXC}i9iC&G@ZTq=d<|Hl`W_#g^d?n@U3<+3VB3lrD169ZT zjZPhB<oTSXABC#tUxshP1zQMzUr-Ear5SNo61RXTlw1!>i;~)8^{2GViJJ-FJ@d}S3qDM0+9dnPy!hsP)q`l z|HX_e>RI1FEJjeE + + + + + + diff --git a/demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session b/demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session new file mode 100644 index 0000000000..6d57990658 --- /dev/null +++ b/demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + From adf2fa3f5ca9baf31816f79954e318405961e14b Mon Sep 17 00:00:00 2001 From: Robert Unguran Date: Sun, 2 Dec 2012 11:46:56 +0100 Subject: [PATCH 04/19] Update demos/ARM11-BCM2835-G++-MPC/readme.txt --- demos/ARM11-BCM2835-G++-MPC/readme.txt | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/demos/ARM11-BCM2835-G++-MPC/readme.txt b/demos/ARM11-BCM2835-G++-MPC/readme.txt index 8408ba32a5..598282bb02 100644 --- a/demos/ARM11-BCM2835-G++-MPC/readme.txt +++ b/demos/ARM11-BCM2835-G++-MPC/readme.txt @@ -4,18 +4,3 @@ ** TARGET ** -The demo runs some graphics tests using the Adafruit 2.2" 18-bit color -TFT LCD display. http://www.adafruit.com/products/797 - -** The Demo ** - -The demonstration uses modified versions of the Adafruit_GFX and -Adafruit_HX8340B classes. These were originally written for the Arduino. -The Print and Printable support classes are also modified versions of -the Arduino classes. The graphics test is based on the test provided -with the Adafruit libraries, modified to run on the Pi. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. From 3c873974a047b1350151200a3aed4d822d19b5a2 Mon Sep 17 00:00:00 2001 From: run Date: Tue, 12 Nov 2013 19:01:07 +0100 Subject: [PATCH 05/19] Deleting all the codes which are not related to the RPi --- boards/ARDUINO_MEGA/board.c | 106 - boards/ARDUINO_MEGA/board.h | 90 - boards/ARDUINO_MEGA/board.mk | 5 - boards/EA_LPCXPRESSO_BB_1114/board.c | 63 - boards/EA_LPCXPRESSO_BB_1114/board.h | 100 - boards/EA_LPCXPRESSO_BB_1114/board.mk | 5 - boards/EA_LPCXPRESSO_BB_11U14/board.c | 70 - boards/EA_LPCXPRESSO_BB_11U14/board.h | 92 - boards/EA_LPCXPRESSO_BB_11U14/board.mk | 5 - boards/EA_LPCXPRESSO_BB_1343/board.c | 63 - boards/EA_LPCXPRESSO_BB_1343/board.h | 95 - boards/EA_LPCXPRESSO_BB_1343/board.mk | 5 - boards/GENERIC_SPC560P/board.c | 73 - boards/GENERIC_SPC560P/board.h | 72 - boards/GENERIC_SPC560P/board.mk | 5 - boards/GENERIC_SPC563M/board.c | 52 - boards/GENERIC_SPC563M/board.h | 67 - boards/GENERIC_SPC563M/board.mk | 5 - boards/MAPLEMINI_STM32_F103/board.c | 54 - boards/MAPLEMINI_STM32_F103/board.h | 141 - boards/MAPLEMINI_STM32_F103/board.mk | 5 - boards/NONSTANDARD_STM32F4_BARTHESS1/board.c | 58 - boards/NONSTANDARD_STM32F4_BARTHESS1/board.h | 524 -- boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk | 5 - boards/OLIMEX_AVR_CAN/board.c | 94 - boards/OLIMEX_AVR_CAN/board.h | 103 - boards/OLIMEX_AVR_CAN/board.mk | 5 - boards/OLIMEX_AVR_MT_128/board.c | 97 - boards/OLIMEX_AVR_MT_128/board.h | 128 - boards/OLIMEX_AVR_MT_128/board.mk | 5 - boards/OLIMEX_LPC_P1343/board.c | 56 - boards/OLIMEX_LPC_P1343/board.h | 108 - boards/OLIMEX_LPC_P1343/board.mk | 5 - boards/OLIMEX_LPC_P2148/board.c | 99 - boards/OLIMEX_LPC_P2148/board.h | 96 - boards/OLIMEX_LPC_P2148/board.mk | 5 - boards/OLIMEX_LPC_P2148/buzzer.c | 115 - boards/OLIMEX_LPC_P2148/buzzer.h | 36 - boards/OLIMEX_MSP430_P1611/board.c | 84 - boards/OLIMEX_MSP430_P1611/board.h | 84 - boards/OLIMEX_MSP430_P1611/board.mk | 5 - boards/OLIMEX_SAM7_EX256/board.c | 140 - boards/OLIMEX_SAM7_EX256/board.h | 105 - boards/OLIMEX_SAM7_EX256/board.mk | 5 - boards/OLIMEX_SAM7_P256/board.c | 121 - boards/OLIMEX_SAM7_P256/board.h | 85 - boards/OLIMEX_SAM7_P256/board.mk | 5 - boards/OLIMEX_STM32_103STK/board.c | 54 - boards/OLIMEX_STM32_103STK/board.h | 172 - boards/OLIMEX_STM32_103STK/board.mk | 5 - boards/OLIMEX_STM32_E407/board.c | 112 - boards/OLIMEX_STM32_E407/board.h | 1305 --- boards/OLIMEX_STM32_E407/board.mk | 5 - boards/OLIMEX_STM32_E407/cfg/board.chcfg | 335 - boards/OLIMEX_STM32_H103/board.c | 54 - boards/OLIMEX_STM32_H103/board.h | 136 - boards/OLIMEX_STM32_H103/board.mk | 5 - boards/OLIMEX_STM32_P103/board.c | 69 - boards/OLIMEX_STM32_P103/board.h | 160 - boards/OLIMEX_STM32_P103/board.mk | 5 - boards/OLIMEX_STM32_P107/board.c | 88 - boards/OLIMEX_STM32_P107/board.h | 197 - boards/OLIMEX_STM32_P107/board.mk | 5 - boards/OLIMEX_STM32_P407/board.c | 58 - boards/OLIMEX_STM32_P407/board.h | 655 -- boards/OLIMEX_STM32_P407/board.mk | 5 - boards/RAISONANCE_REVA_STM8S/board.c | 82 - boards/RAISONANCE_REVA_STM8S/board.h | 188 - boards/ST_STM3210C_EVAL/board.c | 59 - boards/ST_STM3210C_EVAL/board.h | 132 - boards/ST_STM3210C_EVAL/board.mk | 5 - boards/ST_STM3210E_EVAL/board.c | 72 - boards/ST_STM3210E_EVAL/board.h | 255 - boards/ST_STM3210E_EVAL/board.mk | 5 - boards/ST_STM3220G_EVAL/board.c | 58 - boards/ST_STM3220G_EVAL/board.h | 230 - boards/ST_STM3220G_EVAL/board.mk | 5 - boards/ST_STM32F0_DISCOVERY/board.c | 82 - boards/ST_STM32F0_DISCOVERY/board.h | 760 -- boards/ST_STM32F0_DISCOVERY/board.mk | 5 - boards/ST_STM32F0_DISCOVERY/cfg/board.chcfg | 669 -- boards/ST_STM32F4_DISCOVERY/board.c | 112 - boards/ST_STM32F4_DISCOVERY/board.h | 1301 --- boards/ST_STM32F4_DISCOVERY/board.mk | 5 - boards/ST_STM32F4_DISCOVERY/cfg/board.chcfg | 1186 --- boards/ST_STM32L_DISCOVERY/board.c | 106 - boards/ST_STM32L_DISCOVERY/board.h | 894 -- boards/ST_STM32L_DISCOVERY/board.mk | 5 - boards/ST_STM32L_DISCOVERY/cfg/board.chcfg | 799 -- boards/ST_STM32VL_DISCOVERY/board.c | 54 - boards/ST_STM32VL_DISCOVERY/board.h | 147 - boards/ST_STM32VL_DISCOVERY/board.mk | 5 - boards/ST_STM8L_DISCOVERY/board.c | 66 - boards/ST_STM8L_DISCOVERY/board.h | 171 - boards/ST_STM8S_DISCOVERY/board.c | 82 - boards/ST_STM8S_DISCOVERY/board.h | 125 - boards/readme.txt | 6 - boards/simulator/board.c | 39 - boards/simulator/board.h | 34 - boards/simulator/board.mk | 5 - demos/ARM11-BCM2835-G++-MPC/.cproject | 63 - demos/ARM11-BCM2835-G++-MPC/.project | 95 - demos/ARM11-BCM2835-G++-MPC/Makefile | 193 - demos/ARM11-BCM2835-G++-MPC/chconf.h | 535 -- demos/ARM11-BCM2835-G++-MPC/halconf.h | 342 - demos/ARM11-BCM2835-G++-MPC/main.cpp | 188 - demos/ARM11-BCM2835-G++-MPC/mcuconf.h | 57 - demos/ARM11-BCM2835-G++-MPC/readme.txt | 6 - demos/ARM11-BCM2835-G++/.cproject | 63 - demos/ARM11-BCM2835-G++/.project | 90 - demos/ARM11-BCM2835-G++/Makefile | 30 +- demos/ARM11-BCM2835-G++/Matrix/Matrix.tags | Bin 20480 -> 0 bytes .../ARM11-BCM2835-G++/Matrix/Matrix.workspace | 7 - .../Matrix/Matrix.workspace.session | 22 - demos/ARM11-BCM2835-G++/main.cpp | 354 +- demos/ARM11-BCM2835-GCC/Makefile | 6 +- demos/ARM11-BCM2835-GCC/main.c | 8 +- demos/ARM7-AT91SAM7X-FATFS-GCC/Makefile | 192 - demos/ARM7-AT91SAM7X-FATFS-GCC/chconf.h | 535 -- demos/ARM7-AT91SAM7X-FATFS-GCC/ffconf.h | 193 - demos/ARM7-AT91SAM7X-FATFS-GCC/halconf.h | 342 - demos/ARM7-AT91SAM7X-FATFS-GCC/main.c | 403 - demos/ARM7-AT91SAM7X-FATFS-GCC/mcuconf.h | 64 - demos/ARM7-AT91SAM7X-FATFS-GCC/readme.txt | 24 - demos/ARM7-AT91SAM7X-GCC/Makefile | 187 - demos/ARM7-AT91SAM7X-GCC/chconf.h | 535 -- demos/ARM7-AT91SAM7X-GCC/halconf.h | 342 - demos/ARM7-AT91SAM7X-GCC/main.c | 76 - demos/ARM7-AT91SAM7X-GCC/mcuconf.h | 64 - demos/ARM7-AT91SAM7X-GCC/readme.txt | 28 - demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile | 190 - demos/ARM7-AT91SAM7X-LWIP-GCC/chconf.h | 535 -- demos/ARM7-AT91SAM7X-LWIP-GCC/halconf.h | 342 - demos/ARM7-AT91SAM7X-LWIP-GCC/lwipopts.h | 2030 ---- demos/ARM7-AT91SAM7X-LWIP-GCC/main.c | 91 - demos/ARM7-AT91SAM7X-LWIP-GCC/mcuconf.h | 64 - demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt | 34 - demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c | 125 - demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h | 55 - demos/ARM7-AT91SAM7X-UIP-GCC/Makefile | 203 - demos/ARM7-AT91SAM7X-UIP-GCC/chconf.h | 535 -- demos/ARM7-AT91SAM7X-UIP-GCC/halconf.h | 342 - demos/ARM7-AT91SAM7X-UIP-GCC/main.c | 81 - demos/ARM7-AT91SAM7X-UIP-GCC/mcuconf.h | 64 - demos/ARM7-AT91SAM7X-UIP-GCC/readme.txt | 34 - demos/ARM7-AT91SAM7X-UIP-GCC/web/cc-arch.h | 9 - demos/ARM7-AT91SAM7X-UIP-GCC/web/clock-arch.h | 42 - demos/ARM7-AT91SAM7X-UIP-GCC/web/uip-conf.h | 159 - demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c | 187 - demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.h | 32 - demos/ARM7-LPC214x-FATFS-GCC/Makefile | 193 - demos/ARM7-LPC214x-FATFS-GCC/chconf.h | 535 -- demos/ARM7-LPC214x-FATFS-GCC/ffconf.h | 193 - demos/ARM7-LPC214x-FATFS-GCC/halconf.h | 342 - demos/ARM7-LPC214x-FATFS-GCC/main.c | 368 - demos/ARM7-LPC214x-FATFS-GCC/mcuconf.h | 57 - demos/ARM7-LPC214x-FATFS-GCC/readme.txt | 19 - demos/ARM7-LPC214x-G++/Makefile | 187 - demos/ARM7-LPC214x-G++/chconf.h | 535 -- demos/ARM7-LPC214x-G++/halconf.h | 342 - demos/ARM7-LPC214x-G++/main.cpp | 189 - demos/ARM7-LPC214x-G++/mcuconf.h | 57 - demos/ARM7-LPC214x-G++/readme.txt | 25 - demos/ARM7-LPC214x-GCC/Makefile | 187 - demos/ARM7-LPC214x-GCC/chconf.h | 535 -- demos/ARM7-LPC214x-GCC/halconf.h | 342 - demos/ARM7-LPC214x-GCC/main.c | 106 - demos/ARM7-LPC214x-GCC/mcuconf.h | 57 - demos/ARM7-LPC214x-GCC/readme.txt | 22 - demos/ARMCM0-LPC1114-LPCXPRESSO/Makefile | 196 - demos/ARMCM0-LPC1114-LPCXPRESSO/chconf.h | 535 -- demos/ARMCM0-LPC1114-LPCXPRESSO/halconf.h | 342 - demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.ewp | 2219 ----- demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.eww | 10 - demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.icf | 39 - .../ARMCM0-LPC1114-LPCXPRESSO/keil/ch.uvproj | 1010 -- demos/ARMCM0-LPC1114-LPCXPRESSO/main.c | 141 - demos/ARMCM0-LPC1114-LPCXPRESSO/mcuconf.h | 83 - demos/ARMCM0-LPC11U14-LPCXPRESSO/Makefile | 196 - demos/ARMCM0-LPC11U14-LPCXPRESSO/chconf.h | 535 -- demos/ARMCM0-LPC11U14-LPCXPRESSO/halconf.h | 342 - demos/ARMCM0-LPC11U14-LPCXPRESSO/main.c | 141 - demos/ARMCM0-LPC11U14-LPCXPRESSO/mcuconf.h | 70 - demos/ARMCM0-STM32F051-DISCOVERY/.cproject | 51 - demos/ARMCM0-STM32F051-DISCOVERY/.project | 43 - demos/ARMCM0-STM32F051-DISCOVERY/Makefile | 207 - demos/ARMCM0-STM32F051-DISCOVERY/chconf.h | 535 -- demos/ARMCM0-STM32F051-DISCOVERY/halconf.h | 342 - demos/ARMCM0-STM32F051-DISCOVERY/main.c | 97 - demos/ARMCM0-STM32F051-DISCOVERY/mcuconf.h | 144 - demos/ARMCM0-STM32F051-DISCOVERY/readme.txt | 25 - demos/ARMCM3-GENERIC-KERNEL/Makefile | 197 - demos/ARMCM3-GENERIC-KERNEL/chconf.h | 535 -- demos/ARMCM3-GENERIC-KERNEL/main.c | 77 - demos/ARMCM3-GENERIC-KERNEL/readme.txt | 14 - demos/ARMCM3-LPC1343-LPCXPRESSO/Makefile | 197 - demos/ARMCM3-LPC1343-LPCXPRESSO/chconf.h | 535 -- demos/ARMCM3-LPC1343-LPCXPRESSO/halconf.h | 342 - demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.ewp | 2222 ----- demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.eww | 10 - demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.icf | 39 - .../ARMCM3-LPC1343-LPCXPRESSO/keil/ch.uvproj | 1005 -- demos/ARMCM3-LPC1343-LPCXPRESSO/main.c | 141 - demos/ARMCM3-LPC1343-LPCXPRESSO/mcuconf.h | 83 - demos/ARMCM3-LPC1343-OLIMEX/Makefile | 197 - demos/ARMCM3-LPC1343-OLIMEX/chconf.h | 535 -- demos/ARMCM3-LPC1343-OLIMEX/halconf.h | 342 - demos/ARMCM3-LPC1343-OLIMEX/main.c | 116 - demos/ARMCM3-LPC1343-OLIMEX/mcuconf.h | 80 - demos/ARMCM3-STM32F100-DISCOVERY/.cproject | 52 - demos/ARMCM3-STM32F100-DISCOVERY/.project | 43 - demos/ARMCM3-STM32F100-DISCOVERY/Makefile | 209 - demos/ARMCM3-STM32F100-DISCOVERY/chconf.h | 535 -- demos/ARMCM3-STM32F100-DISCOVERY/halconf.h | 342 - demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.ewp | 2305 ----- demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.eww | 10 - demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.icf | 39 - .../ARMCM3-STM32F100-DISCOVERY/keil/ch.uvproj | 1135 --- demos/ARMCM3-STM32F100-DISCOVERY/main.c | 239 - demos/ARMCM3-STM32F100-DISCOVERY/mcuconf.h | 180 - demos/ARMCM3-STM32F100-DISCOVERY/readme.txt | 31 - demos/ARMCM3-STM32F103-FATFS/.cproject | 51 - demos/ARMCM3-STM32F103-FATFS/.project | 48 - demos/ARMCM3-STM32F103-FATFS/Makefile | 213 - demos/ARMCM3-STM32F103-FATFS/chconf.h | 535 -- demos/ARMCM3-STM32F103-FATFS/ffconf.h | 193 - demos/ARMCM3-STM32F103-FATFS/halconf.h | 342 - demos/ARMCM3-STM32F103-FATFS/main.c | 392 - demos/ARMCM3-STM32F103-FATFS/mcuconf.h | 203 - demos/ARMCM3-STM32F103-FATFS/readme.txt | 33 - demos/ARMCM3-STM32F103-G++/.cproject | 51 - demos/ARMCM3-STM32F103-G++/.project | 44 - demos/ARMCM3-STM32F103-G++/Makefile | 208 - demos/ARMCM3-STM32F103-G++/chconf.h | 535 -- demos/ARMCM3-STM32F103-G++/halconf.h | 342 - demos/ARMCM3-STM32F103-G++/main.cpp | 176 - demos/ARMCM3-STM32F103-G++/mcuconf.h | 203 - demos/ARMCM3-STM32F103-G++/readme.txt | 28 - demos/ARMCM3-STM32F103/.cproject | 56 - demos/ARMCM3-STM32F103/.project | 43 - demos/ARMCM3-STM32F103/Makefile | 209 - demos/ARMCM3-STM32F103/chconf.h | 535 -- demos/ARMCM3-STM32F103/codeblocks/ch.cbp | 387 - .../ARMCM3-STM32F103/codeblocks/ch.workspace | 6 - demos/ARMCM3-STM32F103/halconf.h | 342 - demos/ARMCM3-STM32F103/iar/ch.ewp | 2287 ----- demos/ARMCM3-STM32F103/iar/ch.eww | 10 - demos/ARMCM3-STM32F103/iar/ch.icf | 39 - demos/ARMCM3-STM32F103/keil/ch.uvproj | 1075 --- demos/ARMCM3-STM32F103/main.c | 75 - demos/ARMCM3-STM32F103/mcuconf.h | 203 - demos/ARMCM3-STM32F103/readme.txt | 28 - demos/ARMCM3-STM32F103/ride7/ch.rapp | 172 - demos/ARMCM3-STM32F103/ride7/ch.rprj | 4 - demos/ARMCM3-STM32F103ZG-FATFS/.cproject | 51 - demos/ARMCM3-STM32F103ZG-FATFS/.project | 48 - demos/ARMCM3-STM32F103ZG-FATFS/Makefile | 214 - demos/ARMCM3-STM32F103ZG-FATFS/chconf.h | 535 -- demos/ARMCM3-STM32F103ZG-FATFS/ffconf.h | 193 - demos/ARMCM3-STM32F103ZG-FATFS/halconf.h | 342 - demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp | 2330 ----- demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.eww | 10 - demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.icf | 39 - demos/ARMCM3-STM32F103ZG-FATFS/main.c | 369 - demos/ARMCM3-STM32F103ZG-FATFS/mcuconf.h | 203 - demos/ARMCM3-STM32F103ZG-FATFS/readme.txt | 28 - demos/ARMCM3-STM32F107-FATFS/.cproject | 51 - demos/ARMCM3-STM32F107-FATFS/.project | 48 - demos/ARMCM3-STM32F107-FATFS/Makefile | 212 - demos/ARMCM3-STM32F107-FATFS/chconf.h | 535 -- demos/ARMCM3-STM32F107-FATFS/ffconf.h | 193 - demos/ARMCM3-STM32F107-FATFS/halconf.h | 342 - demos/ARMCM3-STM32F107-FATFS/main.c | 379 - demos/ARMCM3-STM32F107-FATFS/mcuconf.h | 211 - demos/ARMCM3-STM32F107-FATFS/readme.txt | 33 - demos/ARMCM3-STM32F107-LWIP/.cproject | 51 - demos/ARMCM3-STM32F107-LWIP/.project | 48 - demos/ARMCM3-STM32F107-LWIP/Makefile | 210 - demos/ARMCM3-STM32F107-LWIP/chconf.h | 535 -- demos/ARMCM3-STM32F107-LWIP/halconf.h | 342 - demos/ARMCM3-STM32F107-LWIP/lwipopts.h | 2030 ---- demos/ARMCM3-STM32F107-LWIP/main.c | 91 - demos/ARMCM3-STM32F107-LWIP/mcuconf.h | 211 - demos/ARMCM3-STM32F107-LWIP/readme.txt | 28 - demos/ARMCM3-STM32F107-LWIP/web/web.c | 125 - demos/ARMCM3-STM32F107-LWIP/web/web.h | 55 - demos/ARMCM3-STM32F107/.cproject | 51 - demos/ARMCM3-STM32F107/.project | 43 - demos/ARMCM3-STM32F107/Makefile | 209 - demos/ARMCM3-STM32F107/chconf.h | 535 -- demos/ARMCM3-STM32F107/halconf.h | 342 - demos/ARMCM3-STM32F107/iar/ch.ewp | 2305 ----- demos/ARMCM3-STM32F107/iar/ch.eww | 10 - demos/ARMCM3-STM32F107/iar/ch.icf | 39 - demos/ARMCM3-STM32F107/keil/ch.uvproj | 1090 --- demos/ARMCM3-STM32F107/main.c | 75 - demos/ARMCM3-STM32F107/mcuconf.h | 211 - demos/ARMCM3-STM32F107/readme.txt | 28 - demos/ARMCM3-STM32L152-DISCOVERY/.cproject | 52 - demos/ARMCM3-STM32L152-DISCOVERY/.project | 43 - demos/ARMCM3-STM32L152-DISCOVERY/Makefile | 209 - demos/ARMCM3-STM32L152-DISCOVERY/chconf.h | 535 -- demos/ARMCM3-STM32L152-DISCOVERY/halconf.h | 342 - demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.ewp | 2293 ----- demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.eww | 10 - demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.icf | 39 - .../ARMCM3-STM32L152-DISCOVERY/keil/ch.uvproj | 975 -- demos/ARMCM3-STM32L152-DISCOVERY/main.c | 250 - demos/ARMCM3-STM32L152-DISCOVERY/mcuconf.h | 171 - demos/ARMCM3-STM32L152-DISCOVERY/readme.txt | 31 - demos/ARMCM4-STM32F303-DISCOVERY/Makefile | 221 - demos/ARMCM4-STM32F303-DISCOVERY/chconf.h | 535 -- demos/ARMCM4-STM32F303-DISCOVERY/halconf.h | 342 - demos/ARMCM4-STM32F303-DISCOVERY/main.c | 73 - demos/ARMCM4-STM32F303-DISCOVERY/mcuconf.h | 40 - demos/ARMCM4-STM32F303-DISCOVERY/readme.txt | 25 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/.cproject | 52 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/.project | 95 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile | 225 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/chconf.h | 535 -- .../ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h | 342 - demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c | 331 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h | 257 - .../readme.txt | 30 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c | 308 - .../ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h | 29 - demos/ARMCM4-STM32F407-DISCOVERY/.cproject | 57 - demos/ARMCM4-STM32F407-DISCOVERY/.project | 95 - demos/ARMCM4-STM32F407-DISCOVERY/Makefile | 224 - demos/ARMCM4-STM32F407-DISCOVERY/chconf.h | 535 -- demos/ARMCM4-STM32F407-DISCOVERY/halconf.h | 342 - demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.ewp | 2314 ----- demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.eww | 10 - demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.icf | 39 - .../ARMCM4-STM32F407-DISCOVERY/keil/ch.uvproj | 980 -- demos/ARMCM4-STM32F407-DISCOVERY/main.c | 248 - demos/ARMCM4-STM32F407-DISCOVERY/mcuconf.h | 257 - demos/ARMCM4-STM32F407-DISCOVERY/readme.txt | 31 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/.cproject | 51 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/.project | 105 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/Makefile | 229 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/chconf.h | 535 -- .../ARMCM4-STM32F407-LWIP-FATFS-USB/ffconf.h | 193 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/halconf.h | 342 - .../lwipopts.h | 2030 ---- demos/ARMCM4-STM32F407-LWIP-FATFS-USB/main.c | 687 -- .../ARMCM4-STM32F407-LWIP-FATFS-USB/mcuconf.h | 257 - .../readme.txt | 30 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.c | 126 - .../ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.h | 55 - demos/ARMCM4-STM32F407-LWIP/.cproject | 51 - demos/ARMCM4-STM32F407-LWIP/.project | 53 - demos/ARMCM4-STM32F407-LWIP/Makefile | 224 - demos/ARMCM4-STM32F407-LWIP/chconf.h | 535 -- demos/ARMCM4-STM32F407-LWIP/halconf.h | 342 - demos/ARMCM4-STM32F407-LWIP/lwipopts.h | 2030 ---- demos/ARMCM4-STM32F407-LWIP/main.c | 91 - demos/ARMCM4-STM32F407-LWIP/mcuconf.h | 257 - demos/ARMCM4-STM32F407-LWIP/readme.txt | 28 - demos/ARMCM4-STM32F407-LWIP/web/web.c | 125 - demos/ARMCM4-STM32F407-LWIP/web/web.h | 55 - demos/AVR-AT90CANx-GCC/Makefile | 652 -- demos/AVR-AT90CANx-GCC/chconf.h | 535 -- demos/AVR-AT90CANx-GCC/halconf.h | 342 - demos/AVR-AT90CANx-GCC/main.c | 67 - demos/AVR-AT90CANx-GCC/mcuconf.h | 53 - demos/AVR-AT90CANx-GCC/readme.txt | 25 - demos/AVR-ATmega128-GCC/Makefile | 652 -- demos/AVR-ATmega128-GCC/chconf.h | 535 -- demos/AVR-ATmega128-GCC/halconf.h | 342 - demos/AVR-ATmega128-GCC/lcd.c | 101 - demos/AVR-ATmega128-GCC/lcd.h | 53 - demos/AVR-ATmega128-GCC/main.c | 77 - demos/AVR-ATmega128-GCC/mcuconf.h | 53 - demos/AVR-ATmega128-GCC/readme.txt | 24 - demos/AVR-ArduinoMega-GCC/Makefile | 630 -- demos/AVR-ArduinoMega-GCC/chconf.h | 535 -- demos/AVR-ArduinoMega-GCC/halconf.h | 342 - demos/AVR-ArduinoMega-GCC/main.c | 65 - demos/AVR-ArduinoMega-GCC/mcuconf.h | 53 - demos/AVR-ArduinoMega-GCC/readme.txt | 22 - demos/MSP430-MSP430x1611-GCC/Makefile | 155 - demos/MSP430-MSP430x1611-GCC/chconf.h | 535 -- demos/MSP430-MSP430x1611-GCC/halconf.h | 342 - demos/MSP430-MSP430x1611-GCC/main.c | 83 - demos/MSP430-MSP430x1611-GCC/mcuconf.h | 58 - demos/MSP430-MSP430x1611-GCC/memory.x | 25 - demos/MSP430-MSP430x1611-GCC/msp430.x | 184 - demos/MSP430-MSP430x1611-GCC/periph.x | 165 - demos/MSP430-MSP430x1611-GCC/readme.txt | 29 - demos/PPC-SPC560P-GCC/.cproject | 61 - demos/PPC-SPC560P-GCC/.project | 43 - demos/PPC-SPC560P-GCC/Makefile | 163 - demos/PPC-SPC560P-GCC/chconf.h | 535 -- demos/PPC-SPC560P-GCC/halconf.h | 342 - demos/PPC-SPC560P-GCC/main.c | 203 - demos/PPC-SPC560P-GCC/mcuconf.h | 159 - demos/PPC-SPC563M-GCC/.cproject | 52 - demos/PPC-SPC563M-GCC/.project | 43 - demos/PPC-SPC563M-GCC/Makefile | 163 - demos/PPC-SPC563M-GCC/chconf.h | 535 -- demos/PPC-SPC563M-GCC/halconf.h | 342 - demos/PPC-SPC563M-GCC/main.c | 188 - demos/Posix-GCC/Makefile | 164 - demos/Posix-GCC/chconf.h | 536 -- demos/Posix-GCC/halconf.h | 342 - demos/Posix-GCC/main.c | 257 - demos/Posix-GCC/readme.txt | 27 - .../ChibiOS-RT.stw | 16 - .../cosmic/cosmic.stp | 2302 ----- .../cosmic/vectors.c | 280 - .../demo/chconf.h | 535 -- .../demo/halconf.h | 342 - .../STM8L-STM8L152-DISCOVERY-STVD/demo/main.c | 81 - .../demo/mcuconf.h | 47 - .../raisonance/raisonance.stp | 2215 ----- demos/STM8S-STM8S105-DISCOVERY-IAR/ch.ewp | 1770 ---- demos/STM8S-STM8S105-DISCOVERY-IAR/ch.eww | 10 - demos/STM8S-STM8S105-DISCOVERY-IAR/chconf.h | 535 -- demos/STM8S-STM8S105-DISCOVERY-IAR/halconf.h | 342 - demos/STM8S-STM8S105-DISCOVERY-IAR/main.c | 75 - demos/STM8S-STM8S105-DISCOVERY-IAR/mcuconf.h | 51 - .../ChibiOS-RT.stw | 16 - .../cosmic/cosmic.stp | 2072 ---- .../cosmic/vectors.c | 107 - .../demo/chconf.h | 535 -- .../demo/halconf.h | 342 - .../STM8S-STM8S105-DISCOVERY-STVD/demo/main.c | 77 - .../demo/mcuconf.h | 51 - .../raisonance/raisonance.stp | 2161 ----- demos/STM8S-STM8S208-RC/ch.rapp | 160 - demos/STM8S-STM8S208-RC/ch.rprj | 4 - demos/STM8S-STM8S208-RC/chconf.h | 535 -- demos/STM8S-STM8S208-RC/halconf.h | 342 - demos/STM8S-STM8S208-RC/main.c | 77 - demos/STM8S-STM8S208-RC/mcuconf.h | 51 - demos/STM8S-STM8S208-RC/readme.txt | 16 - demos/Win32-MinGW/Makefile | 149 - demos/Win32-MinGW/chconf.h | 536 -- demos/Win32-MinGW/halconf.h | 342 - demos/Win32-MinGW/main.c | 257 - demos/Win32-MinGW/readme.txt | 33 - docs/Doxyfile_chm | 1831 ---- docs/Doxyfile_html | 1831 ---- docs/html/logo_small.png | Bin 7697 -> 0 bytes docs/index.html | 8 - docs/readme.txt | 11 - docs/reports/AT91SAM7X-48-ARM.txt | 164 - docs/reports/AT91SAM7X-48-THUMB.txt | 164 - docs/reports/ATmega128-16.txt | 149 - docs/reports/LPC1114-48-GCC.txt | 164 - docs/reports/LPC1114-48-RVCT.txt | 165 - docs/reports/LPC1343-72-GCC.txt | 164 - docs/reports/LPC1343-72-IAR.txt | 165 - docs/reports/LPC1343-72-RVCT.txt | 165 - docs/reports/LPC2148-48-ARM.txt | 164 - docs/reports/LPC2148-48-THUMB.txt | 164 - docs/reports/MSP430F1611-0.75.txt | 164 - docs/reports/MSP430F1611-8.txt | 164 - docs/reports/SPC563M64-80.txt | 164 - docs/reports/STM32F051-48-GCC.txt | 164 - docs/reports/STM32F100-24-GCC.txt | 164 - docs/reports/STM32F100-24-IAR.txt | 165 - docs/reports/STM32F100-24-RVCT.txt | 165 - docs/reports/STM32F103-48-GCC.txt | 164 - docs/reports/STM32F103-72-GCC-compact.txt | 164 - docs/reports/STM32F103-72-GCC.txt | 164 - docs/reports/STM32F103-72-IAR-compact.txt | 165 - docs/reports/STM32F103-72-IAR.txt | 165 - docs/reports/STM32F103-72-RVCT-compact.txt | 165 - docs/reports/STM32F103-72-RVCT.txt | 165 - docs/reports/STM32F107-72-GCC.txt | 164 - docs/reports/STM32F407-168-GCC-FPU.txt | 164 - docs/reports/STM32F407-168-GCC.txt | 164 - docs/reports/STM32F407-168-IAR.txt | 165 - docs/reports/STM32F407-168-RVCT.txt | 165 - docs/reports/STM32L152-32-GCC.txt | 164 - docs/reports/STM32L152-32-IAR.txt | 165 - docs/reports/STM32L152-32-RVCT.txt | 165 - docs/reports/STM8L152-16-Cosmic.txt | 7 - docs/reports/STM8L152-16-Raisonance.txt | 164 - docs/reports/STM8S105-16-Cosmic.txt | 7 - docs/reports/STM8S105-16-Raisonance.txt | 164 - docs/reports/STM8S208-16-Raisonance.txt | 164 - docs/reports/build.txt | 45 - docs/reports/coverage.txt | 75 - docs/reports/kernel.txt | 216 - docs/rsc/custom.css | 800 -- docs/rsc/footer_chm.html | 4 - docs/rsc/footer_html.html | 24 - docs/rsc/header_chm.html | 21 - docs/rsc/header_html.html | 41 - docs/rsc/layout.xml | 184 - docs/rsc/logo.png | Bin 16818 -> 0 bytes docs/rsc/workspace.png | Bin 20994 -> 0 bytes docs/rsc/workspace.svg | 280 - docs/src/concepts.dox | 410 - docs/src/main.dox | 65 - ext/ext.dox | 39 - ext/fatfs-0.9-patched.zip | Bin 681290 -> 0 bytes ext/lwip-1.4.0.zip | Bin 606096 -> 0 bytes ext/readme.txt | 30 - ext/uip-1.0.patches.zip | Bin 21462 -> 0 bytes ext/uip-1.0.tar.gz | Bin 1348599 -> 0 bytes os/hal/dox/adc.dox | 146 - os/hal/dox/can.dox | 92 - os/hal/dox/ext.dox | 84 - os/hal/dox/gpt.dox | 78 - os/hal/dox/hal.dox | 36 - os/hal/dox/i2c.dox | 102 - os/hal/dox/i2s.dox | 31 - os/hal/dox/icu.dox | 115 - os/hal/dox/mac.dox | 30 - os/hal/dox/mmc_spi.dox | 119 - os/hal/dox/pal.dox | 74 - os/hal/dox/pwm.dox | 69 - os/hal/dox/rtc.dox | 30 - os/hal/dox/sdc.dox | 109 - os/hal/dox/serial.dox | 61 - os/hal/dox/serial_usb.dox | 56 - os/hal/dox/spi.dox | 94 - os/hal/dox/tm.dox | 31 - os/hal/dox/uart.dox | 125 - os/hal/dox/usb.dox | 180 - os/hal/hal.dox | 100 - .../platforms/AT91SAM7/at91lib/AT91SAM7S128.h | 2229 ----- .../platforms/AT91SAM7/at91lib/AT91SAM7S256.h | 2229 ----- .../platforms/AT91SAM7/at91lib/AT91SAM7S512.h | 2303 ----- .../platforms/AT91SAM7/at91lib/AT91SAM7S64.h | 2229 ----- .../platforms/AT91SAM7/at91lib/AT91SAM7X128.h | 2914 ------ .../platforms/AT91SAM7/at91lib/AT91SAM7X256.h | 2918 ------ .../platforms/AT91SAM7/at91lib/AT91SAM7X512.h | 2984 ------ os/hal/platforms/AT91SAM7/at91lib/aic.c | 84 - os/hal/platforms/AT91SAM7/at91lib/aic.h | 78 - os/hal/platforms/AT91SAM7/at91sam7.h | 57 - os/hal/platforms/AT91SAM7/at91sam7_mii.c | 148 - os/hal/platforms/AT91SAM7/at91sam7_mii.h | 115 - os/hal/platforms/AT91SAM7/ext_lld.c | 236 - os/hal/platforms/AT91SAM7/ext_lld.h | 247 - os/hal/platforms/AT91SAM7/hal_lld.c | 133 - os/hal/platforms/AT91SAM7/hal_lld.h | 94 - os/hal/platforms/AT91SAM7/mac_lld.c | 555 -- os/hal/platforms/AT91SAM7/mac_lld.h | 251 - os/hal/platforms/AT91SAM7/pal_lld.c | 154 - os/hal/platforms/AT91SAM7/pal_lld.h | 258 - os/hal/platforms/AT91SAM7/platform.dox | 140 - os/hal/platforms/AT91SAM7/platform.mk | 12 - os/hal/platforms/AT91SAM7/serial_lld.c | 381 - os/hal/platforms/AT91SAM7/serial_lld.h | 170 - os/hal/platforms/AT91SAM7/spi_lld.c | 401 - os/hal/platforms/AT91SAM7/spi_lld.h | 223 - os/hal/platforms/AVR/hal_lld.c | 61 - os/hal/platforms/AVR/hal_lld.h | 76 - os/hal/platforms/AVR/i2c_lld.c | 293 - os/hal/platforms/AVR/i2c_lld.h | 228 - os/hal/platforms/AVR/pal_lld.c | 161 - os/hal/platforms/AVR/pal_lld.h | 333 - os/hal/platforms/AVR/platform.dox | 114 - os/hal/platforms/AVR/platform.mk | 8 - os/hal/platforms/AVR/serial_lld.c | 364 - os/hal/platforms/AVR/serial_lld.h | 162 - os/hal/platforms/BCM2835/serial_lld.c | 21 +- os/hal/platforms/LPC11Uxx/LPC11Uxx.h | 668 -- os/hal/platforms/LPC11Uxx/gpt_lld.c | 342 - os/hal/platforms/LPC11Uxx/gpt_lld.h | 208 - os/hal/platforms/LPC11Uxx/hal_lld.c | 120 - os/hal/platforms/LPC11Uxx/hal_lld.h | 222 - os/hal/platforms/LPC11Uxx/pal_lld.c | 103 - os/hal/platforms/LPC11Uxx/pal_lld.h | 315 - os/hal/platforms/LPC11Uxx/platform.mk | 9 - os/hal/platforms/LPC11Uxx/serial_lld.c | 300 - os/hal/platforms/LPC11Uxx/serial_lld.h | 210 - os/hal/platforms/LPC11Uxx/spi_lld.c | 395 - os/hal/platforms/LPC11Uxx/spi_lld.h | 315 - os/hal/platforms/LPC11Uxx/system_LPC11Uxx.h | 64 - os/hal/platforms/LPC11xx/LPC11xx.h | 561 -- os/hal/platforms/LPC11xx/gpt_lld.c | 342 - os/hal/platforms/LPC11xx/gpt_lld.h | 208 - os/hal/platforms/LPC11xx/hal_lld.c | 124 - os/hal/platforms/LPC11xx/hal_lld.h | 223 - os/hal/platforms/LPC11xx/pal_lld.c | 107 - os/hal/platforms/LPC11xx/pal_lld.h | 320 - os/hal/platforms/LPC11xx/platform.dox | 140 - os/hal/platforms/LPC11xx/platform.mk | 9 - os/hal/platforms/LPC11xx/serial_lld.c | 302 - os/hal/platforms/LPC11xx/serial_lld.h | 210 - os/hal/platforms/LPC11xx/spi_lld.c | 408 - os/hal/platforms/LPC11xx/spi_lld.h | 343 - os/hal/platforms/LPC11xx/system_LPC11xx.h | 45 - os/hal/platforms/LPC13xx/LPC13xx.h | 570 -- os/hal/platforms/LPC13xx/gpt_lld.c | 342 - os/hal/platforms/LPC13xx/gpt_lld.h | 212 - os/hal/platforms/LPC13xx/hal_lld.c | 124 - os/hal/platforms/LPC13xx/hal_lld.h | 223 - os/hal/platforms/LPC13xx/pal_lld.c | 107 - os/hal/platforms/LPC13xx/pal_lld.h | 320 - os/hal/platforms/LPC13xx/platform.dox | 140 - os/hal/platforms/LPC13xx/platform.mk | 9 - os/hal/platforms/LPC13xx/serial_lld.c | 302 - os/hal/platforms/LPC13xx/serial_lld.h | 210 - os/hal/platforms/LPC13xx/spi_lld.c | 408 - os/hal/platforms/LPC13xx/spi_lld.h | 343 - os/hal/platforms/LPC13xx/system_LPC13xx.h | 64 - os/hal/platforms/LPC214x/hal_lld.c | 121 - os/hal/platforms/LPC214x/hal_lld.h | 87 - os/hal/platforms/LPC214x/lpc214x.h | 527 -- os/hal/platforms/LPC214x/pal_lld.c | 116 - os/hal/platforms/LPC214x/pal_lld.h | 265 - os/hal/platforms/LPC214x/platform.dox | 122 - os/hal/platforms/LPC214x/platform.mk | 9 - os/hal/platforms/LPC214x/serial_lld.c | 351 - os/hal/platforms/LPC214x/serial_lld.h | 167 - os/hal/platforms/LPC214x/spi_lld.c | 343 - os/hal/platforms/LPC214x/spi_lld.h | 211 - os/hal/platforms/LPC214x/vic.c | 69 - os/hal/platforms/LPC214x/vic.h | 43 - os/hal/platforms/MSP430/hal_lld.c | 76 - os/hal/platforms/MSP430/hal_lld.h | 119 - os/hal/platforms/MSP430/pal_lld.c | 141 - os/hal/platforms/MSP430/pal_lld.h | 327 - os/hal/platforms/MSP430/platform.dox | 97 - os/hal/platforms/MSP430/platform.mk | 7 - os/hal/platforms/MSP430/serial_lld.c | 332 - os/hal/platforms/MSP430/serial_lld.h | 140 - os/hal/platforms/Posix/console.c | 127 - os/hal/platforms/Posix/console.h | 66 - os/hal/platforms/Posix/hal_lld.c | 108 - os/hal/platforms/Posix/hal_lld.h | 84 - os/hal/platforms/Posix/pal_lld.c | 99 - os/hal/platforms/Posix/pal_lld.h | 210 - os/hal/platforms/Posix/platform.mk | 7 - os/hal/platforms/Posix/serial_lld.c | 285 - os/hal/platforms/Posix/serial_lld.h | 155 - os/hal/platforms/SPC560Pxx/hal_lld.c | 253 - os/hal/platforms/SPC560Pxx/hal_lld.h | 735 -- os/hal/platforms/SPC560Pxx/platform.mk | 9 - os/hal/platforms/SPC560Pxx/spc560p_registry.h | 73 - os/hal/platforms/SPC560Pxx/typedefs.h | 31 - os/hal/platforms/SPC560Pxx/xpc560p.h | 7802 --------------- os/hal/platforms/SPC56x/hal_lld.c | 131 - os/hal/platforms/SPC56x/hal_lld.h | 230 - os/hal/platforms/SPC56x/mpc563m.h | 4123 -------- os/hal/platforms/SPC56x/platform.dox | 70 - os/hal/platforms/SPC56x/platform.mk | 6 - os/hal/platforms/SPC56x/serial_lld.c | 294 - os/hal/platforms/SPC56x/serial_lld.h | 157 - os/hal/platforms/SPC56x/typedefs.h | 31 - .../platforms/SPC5xx/LINFlex_v1/serial_lld.c | 411 - .../platforms/SPC5xx/LINFlex_v1/serial_lld.h | 282 - os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c | 153 - os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h | 397 - os/hal/platforms/STM32/GPIOv1/pal_lld.c | 184 - os/hal/platforms/STM32/GPIOv1/pal_lld.h | 338 - os/hal/platforms/STM32/GPIOv2/pal_lld.c | 232 - os/hal/platforms/STM32/GPIOv2/pal_lld.h | 453 - os/hal/platforms/STM32/I2Cv1/i2c_lld.c | 894 -- os/hal/platforms/STM32/I2Cv1/i2c_lld.h | 463 - os/hal/platforms/STM32/OTGv1/stm32_otg.h | 920 -- os/hal/platforms/STM32/OTGv1/usb_lld.c | 1300 --- os/hal/platforms/STM32/OTGv1/usb_lld.h | 529 -- os/hal/platforms/STM32/RTCv1/rtc_lld.c | 329 - os/hal/platforms/STM32/RTCv1/rtc_lld.h | 190 - os/hal/platforms/STM32/RTCv2/rtc_lld.c | 322 - os/hal/platforms/STM32/RTCv2/rtc_lld.h | 210 - os/hal/platforms/STM32/USARTv1/uart_lld.c | 666 -- os/hal/platforms/STM32/USARTv1/uart_lld.h | 525 -- os/hal/platforms/STM32/USARTv2/uart_lld.c | 597 -- os/hal/platforms/STM32/USARTv2/uart_lld.h | 438 - os/hal/platforms/STM32/USBv1/stm32_usb.h | 247 - os/hal/platforms/STM32/USBv1/usb_lld.c | 829 -- os/hal/platforms/STM32/USBv1/usb_lld.h | 432 - os/hal/platforms/STM32/can_lld.c | 408 - os/hal/platforms/STM32/can_lld.h | 322 - os/hal/platforms/STM32/ext_lld.c | 182 - os/hal/platforms/STM32/ext_lld.h | 162 - os/hal/platforms/STM32/gpt_lld.c | 468 - os/hal/platforms/STM32/gpt_lld.h | 315 - os/hal/platforms/STM32/i2s_lld.c | 165 - os/hal/platforms/STM32/i2s_lld.h | 321 - os/hal/platforms/STM32/icu_lld.c | 588 -- os/hal/platforms/STM32/icu_lld.h | 378 - os/hal/platforms/STM32/mac_lld.c | 674 -- os/hal/platforms/STM32/mac_lld.h | 354 - os/hal/platforms/STM32/pwm_lld.c | 660 -- os/hal/platforms/STM32/pwm_lld.h | 432 - os/hal/platforms/STM32/sdc_lld.c | 803 -- os/hal/platforms/STM32/sdc_lld.h | 340 - os/hal/platforms/STM32/serial_lld.c | 652 -- os/hal/platforms/STM32/serial_lld.h | 306 - os/hal/platforms/STM32/spi_lld.c | 491 - os/hal/platforms/STM32/spi_lld.h | 424 - os/hal/platforms/STM32/stm32.h | 162 - os/hal/platforms/STM32F0xx/adc_lld.c | 298 - os/hal/platforms/STM32F0xx/adc_lld.h | 337 - os/hal/platforms/STM32F0xx/ext_lld_isr.c | 207 - os/hal/platforms/STM32F0xx/ext_lld_isr.h | 111 - os/hal/platforms/STM32F0xx/hal_lld.c | 194 - os/hal/platforms/STM32F0xx/hal_lld.h | 977 -- os/hal/platforms/STM32F0xx/platform.dox | 296 - os/hal/platforms/STM32F0xx/platform.mk | 19 - os/hal/platforms/STM32F0xx/stm32_dma.c | 296 - os/hal/platforms/STM32F0xx/stm32_dma.h | 395 - os/hal/platforms/STM32F0xx/stm32_isr.h | 85 - os/hal/platforms/STM32F0xx/stm32_rcc.h | 546 -- os/hal/platforms/STM32F0xx/stm32f0xx.h | 3221 ------- os/hal/platforms/STM32F1xx/adc_lld.c | 235 - os/hal/platforms/STM32F1xx/adc_lld.h | 397 - os/hal/platforms/STM32F1xx/ext_lld_isr.c | 342 - os/hal/platforms/STM32F1xx/ext_lld_isr.h | 153 - os/hal/platforms/STM32F1xx/hal_lld.c | 285 - os/hal/platforms/STM32F1xx/hal_lld.h | 259 - os/hal/platforms/STM32F1xx/hal_lld_f100.h | 952 -- os/hal/platforms/STM32F1xx/hal_lld_f103.h | 1299 --- .../platforms/STM32F1xx/hal_lld_f105_f107.h | 1048 --- os/hal/platforms/STM32F1xx/platform.dox | 402 - os/hal/platforms/STM32F1xx/platform.mk | 29 - .../platforms/STM32F1xx/platform_f105_f107.mk | 29 - os/hal/platforms/STM32F1xx/stm32_dma.c | 496 - os/hal/platforms/STM32F1xx/stm32_dma.h | 407 - os/hal/platforms/STM32F1xx/stm32_isr.h | 170 - os/hal/platforms/STM32F1xx/stm32_rcc.h | 965 -- os/hal/platforms/STM32F1xx/stm32f10x.h | 8357 ----------------- os/hal/platforms/STM32F3xx/hal_lld.h | 997 -- os/hal/platforms/STM32F3xx/platform.mk | 9 - os/hal/platforms/STM32F3xx/stm32f30x.h | 6206 ------------ os/hal/platforms/STM32F4xx/adc_lld.c | 420 - os/hal/platforms/STM32F4xx/adc_lld.h | 571 -- os/hal/platforms/STM32F4xx/ext_lld_isr.c | 357 - os/hal/platforms/STM32F4xx/ext_lld_isr.h | 174 - os/hal/platforms/STM32F4xx/hal_lld.c | 223 - os/hal/platforms/STM32F4xx/hal_lld.h | 1564 --- os/hal/platforms/STM32F4xx/platform.dox | 368 - os/hal/platforms/STM32F4xx/platform.mk | 28 - os/hal/platforms/STM32F4xx/stm32_dma.c | 532 -- os/hal/platforms/STM32F4xx/stm32_dma.h | 461 - os/hal/platforms/STM32F4xx/stm32_isr.h | 142 - os/hal/platforms/STM32F4xx/stm32_rcc.h | 1096 --- os/hal/platforms/STM32F4xx/stm32f2xx.h | 6881 -------------- os/hal/platforms/STM32F4xx/stm32f4xx.h | 7004 -------------- os/hal/platforms/STM32L1xx/adc_lld.c | 282 - os/hal/platforms/STM32L1xx/adc_lld.h | 488 - os/hal/platforms/STM32L1xx/ext_lld_isr.c | 343 - os/hal/platforms/STM32L1xx/ext_lld_isr.h | 167 - os/hal/platforms/STM32L1xx/hal_lld.c | 234 - os/hal/platforms/STM32L1xx/hal_lld.h | 1070 --- os/hal/platforms/STM32L1xx/platform.dox | 319 - os/hal/platforms/STM32L1xx/platform.mk | 23 - os/hal/platforms/STM32L1xx/stm32_dma.c | 348 - os/hal/platforms/STM32L1xx/stm32_dma.h | 397 - os/hal/platforms/STM32L1xx/stm32_isr.h | 94 - os/hal/platforms/STM32L1xx/stm32_rcc.h | 584 -- os/hal/platforms/STM32L1xx/stm32l1xx.h | 5141 ---------- os/hal/platforms/STM8L/hal_lld.c | 127 - os/hal/platforms/STM8L/hal_lld.h | 286 - os/hal/platforms/STM8L/hal_lld_stm8l_hd.h | 82 - os/hal/platforms/STM8L/hal_lld_stm8l_md.h | 82 - os/hal/platforms/STM8L/hal_lld_stm8l_mdp.h | 82 - os/hal/platforms/STM8L/pal_lld.c | 109 - os/hal/platforms/STM8L/pal_lld.h | 248 - os/hal/platforms/STM8L/platform.dox | 103 - os/hal/platforms/STM8L/serial_lld.c | 213 - os/hal/platforms/STM8L/serial_lld.h | 274 - os/hal/platforms/STM8L/shared_isr.c | 192 - os/hal/platforms/STM8L/stm8l15x.h | 3000 ------ os/hal/platforms/STM8S/hal_lld.c | 110 - os/hal/platforms/STM8S/hal_lld.h | 226 - os/hal/platforms/STM8S/pal_lld.c | 109 - os/hal/platforms/STM8S/pal_lld.h | 233 - os/hal/platforms/STM8S/platform.dox | 123 - os/hal/platforms/STM8S/serial_lld.c | 450 - os/hal/platforms/STM8S/serial_lld.h | 165 - os/hal/platforms/STM8S/spi_lld.c | 293 - os/hal/platforms/STM8S/spi_lld.h | 191 - os/hal/platforms/STM8S/stm8s.h | 2725 ------ os/hal/platforms/STM8S/stm8s_type.h | 103 - os/hal/platforms/Win32/console.c | 127 - os/hal/platforms/Win32/console.h | 66 - os/hal/platforms/Win32/hal_lld.c | 114 - os/hal/platforms/Win32/hal_lld.h | 76 - os/hal/platforms/Win32/pal_lld.c | 99 - os/hal/platforms/Win32/pal_lld.h | 210 - os/hal/platforms/Win32/platform.mk | 7 - os/hal/platforms/Win32/serial_lld.c | 282 - os/hal/platforms/Win32/serial_lld.h | 147 - os/hal/platforms/platforms.dox | 28 - os/ports/GCC/ARM/AT91SAM7/armparams.h | 56 - os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7S256.ld | 105 - os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7X256.ld | 105 - os/ports/GCC/ARM/AT91SAM7/port.mk | 11 - os/ports/GCC/ARM/AT91SAM7/vectors.s | 104 - os/ports/GCC/ARM/AT91SAM7/wfi.h | 36 - os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld | 2 +- os/ports/GCC/ARM/LPC214x/armparams.h | 56 - os/ports/GCC/ARM/LPC214x/ld/LPC2148.ld | 108 - os/ports/GCC/ARM/LPC214x/port.mk | 11 - os/ports/GCC/ARM/LPC214x/vectors.s | 101 - os/ports/GCC/ARM/LPC214x/wfi.h | 36 - os/ports/GCC/ARM/rules.mk | 4 +- os/ports/GCC/ARMCMx/LPC11xx/cmparams.h | 62 - os/ports/GCC/ARMCMx/LPC11xx/ld/LPC1114.ld | 150 - os/ports/GCC/ARMCMx/LPC11xx/ld/LPC11U14.ld | 151 - os/ports/GCC/ARMCMx/LPC11xx/port.mk | 15 - os/ports/GCC/ARMCMx/LPC11xx/vectors.c | 168 - os/ports/GCC/ARMCMx/LPC13xx/cmparams.h | 62 - os/ports/GCC/ARMCMx/LPC13xx/ld/LPC1343.ld | 150 - os/ports/GCC/ARMCMx/LPC13xx/port.mk | 15 - os/ports/GCC/ARMCMx/LPC13xx/vectors.c | 227 - os/ports/GCC/ARMCMx/STM32F0xx/cmparams.h | 62 - .../GCC/ARMCMx/STM32F0xx/ld/STM32F051x8.ld | 150 - os/ports/GCC/ARMCMx/STM32F0xx/port.mk | 15 - os/ports/GCC/ARMCMx/STM32F0xx/vectors.c | 168 - os/ports/GCC/ARMCMx/STM32F1xx/cmparams.h | 62 - .../GCC/ARMCMx/STM32F1xx/ld/STM32F100xB.ld | 150 - .../GCC/ARMCMx/STM32F1xx/ld/STM32F103xB.ld | 150 - .../GCC/ARMCMx/STM32F1xx/ld/STM32F103xD.ld | 150 - .../GCC/ARMCMx/STM32F1xx/ld/STM32F103xE.ld | 150 - .../GCC/ARMCMx/STM32F1xx/ld/STM32F103xG.ld | 150 - .../GCC/ARMCMx/STM32F1xx/ld/STM32F107xC.ld | 150 - os/ports/GCC/ARMCMx/STM32F1xx/port.mk | 15 - os/ports/GCC/ARMCMx/STM32F1xx/vectors.c | 290 - os/ports/GCC/ARMCMx/STM32F2xx/cmparams.h | 62 - .../GCC/ARMCMx/STM32F2xx/ld/STM32F205xB.ld | 150 - .../GCC/ARMCMx/STM32F2xx/ld/STM32F207xG.ld | 151 - os/ports/GCC/ARMCMx/STM32F2xx/port.mk | 15 - os/ports/GCC/ARMCMx/STM32F2xx/vectors.c | 279 - os/ports/GCC/ARMCMx/STM32F3xx/cmparams.h | 62 - .../GCC/ARMCMx/STM32F3xx/ld/STM32F303xC.ld | 151 - os/ports/GCC/ARMCMx/STM32F3xx/port.mk | 15 - os/ports/GCC/ARMCMx/STM32F3xx/vectors.c | 281 - os/ports/GCC/ARMCMx/STM32F4xx/cmparams.h | 62 - .../GCC/ARMCMx/STM32F4xx/ld/STM32F405xG.ld | 152 - .../GCC/ARMCMx/STM32F4xx/ld/STM32F407xG.ld | 152 - .../ARMCMx/STM32F4xx/ld/STM32F407xG_CCM.ld | 173 - os/ports/GCC/ARMCMx/STM32F4xx/port.mk | 15 - os/ports/GCC/ARMCMx/STM32F4xx/vectors.c | 281 - os/ports/GCC/ARMCMx/STM32L1xx/cmparams.h | 62 - .../GCC/ARMCMx/STM32L1xx/ld/STM32L152xB.ld | 150 - os/ports/GCC/ARMCMx/STM32L1xx/port.mk | 15 - os/ports/GCC/ARMCMx/STM32L1xx/vectors.c | 198 - os/ports/GCC/ARMCMx/chcore.c | 46 - os/ports/GCC/ARMCMx/chcore.h | 188 - os/ports/GCC/ARMCMx/chcore_v6m.c | 199 - os/ports/GCC/ARMCMx/chcore_v6m.h | 376 - os/ports/GCC/ARMCMx/chcore_v7m.c | 260 - os/ports/GCC/ARMCMx/chcore_v7m.h | 525 -- os/ports/GCC/ARMCMx/chtypes.h | 83 - os/ports/GCC/ARMCMx/crt0.c | 340 - os/ports/GCC/ARMCMx/port.dox | 258 - os/ports/GCC/ARMCMx/rules.mk | 220 - os/ports/GCC/AVR/chcore.c | 133 - os/ports/GCC/AVR/chcore.h | 325 - os/ports/GCC/AVR/chtypes.h | 85 - os/ports/GCC/AVR/port.dox | 87 - os/ports/GCC/AVR/port.mk | 6 - os/ports/GCC/MSP430/chcore.c | 102 - os/ports/GCC/MSP430/chcore.h | 305 - os/ports/GCC/MSP430/chtypes.h | 85 - os/ports/GCC/MSP430/port.dox | 95 - os/ports/GCC/MSP430/port.mk | 6 - os/ports/GCC/MSP430/rules.mk | 87 - os/ports/GCC/PPC/SPC560Pxx/bam.s | 38 - os/ports/GCC/PPC/SPC560Pxx/ivor.s | 234 - os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld | 178 - os/ports/GCC/PPC/SPC560Pxx/port.mk | 12 - os/ports/GCC/PPC/SPC560Pxx/ppcparams.h | 62 - os/ports/GCC/PPC/SPC560Pxx/vectors.s | 1093 --- os/ports/GCC/PPC/SPC563Mxx/ivor.s | 258 - os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld | 172 - os/ports/GCC/PPC/SPC563Mxx/port.mk | 11 - os/ports/GCC/PPC/SPC563Mxx/ppcparams.h | 62 - os/ports/GCC/PPC/SPC563Mxx/vectors.s | 1505 --- os/ports/GCC/PPC/chcore.c | 107 - os/ports/GCC/PPC/chcore.h | 376 - os/ports/GCC/PPC/chtypes.h | 97 - os/ports/GCC/PPC/crt0.s | 132 - os/ports/GCC/PPC/port.dox | 132 - os/ports/GCC/PPC/rules.mk | 176 - os/ports/GCC/SIMIA32/chcore.c | 86 - os/ports/GCC/SIMIA32/chcore.h | 243 - os/ports/GCC/SIMIA32/chtypes.h | 75 - os/ports/GCC/SIMIA32/port.mk | 6 - os/ports/IAR/ARMCMx/LPC11xx/cmparams.h | 62 - os/ports/IAR/ARMCMx/LPC11xx/vectors.s | 187 - os/ports/IAR/ARMCMx/LPC13xx/cmparams.h | 62 - os/ports/IAR/ARMCMx/LPC13xx/vectors.s | 265 - os/ports/IAR/ARMCMx/STM32F1xx/cmparams.h | 62 - os/ports/IAR/ARMCMx/STM32F1xx/vectors.s | 310 - os/ports/IAR/ARMCMx/STM32F4xx/cmparams.h | 62 - os/ports/IAR/ARMCMx/STM32F4xx/vectors.s | 337 - os/ports/IAR/ARMCMx/STM32L1xx/cmparams.h | 62 - os/ports/IAR/ARMCMx/STM32L1xx/vectors.s | 231 - os/ports/IAR/ARMCMx/chcore.c | 46 - os/ports/IAR/ARMCMx/chcore.h | 189 - os/ports/IAR/ARMCMx/chcore_v6m.c | 125 - os/ports/IAR/ARMCMx/chcore_v6m.h | 379 - os/ports/IAR/ARMCMx/chcore_v7m.c | 198 - os/ports/IAR/ARMCMx/chcore_v7m.h | 504 - os/ports/IAR/ARMCMx/chcoreasm_v6m.s | 111 - os/ports/IAR/ARMCMx/chcoreasm_v7m.s | 109 - os/ports/IAR/ARMCMx/chtypes.h | 82 - os/ports/IAR/ARMCMx/cstartup.s | 68 - os/ports/IAR/ARMCMx/port.dox | 228 - os/ports/IAR/STM8/chcore.c | 55 - os/ports/IAR/STM8/chcore.h | 339 - os/ports/IAR/STM8/chcore_stm8.s | 57 - os/ports/IAR/STM8/chtypes.h | 84 - os/ports/IAR/STM8/port.dox | 95 - os/ports/RC/STM8/chcore.c | 77 - os/ports/RC/STM8/chcore.h | 334 - os/ports/RC/STM8/chtypes.h | 94 - os/ports/RC/STM8/port.dox | 95 - os/ports/RVCT/ARMCMx/LPC11xx/cmparams.h | 62 - os/ports/RVCT/ARMCMx/LPC11xx/vectors.s | 183 - os/ports/RVCT/ARMCMx/LPC13xx/cmparams.h | 62 - os/ports/RVCT/ARMCMx/LPC13xx/vectors.s | 261 - os/ports/RVCT/ARMCMx/STM32F1xx/cmparams.h | 62 - os/ports/RVCT/ARMCMx/STM32F1xx/vectors.s | 306 - os/ports/RVCT/ARMCMx/STM32F4xx/cmparams.h | 62 - os/ports/RVCT/ARMCMx/STM32F4xx/vectors.s | 338 - os/ports/RVCT/ARMCMx/STM32L1xx/cmparams.h | 62 - os/ports/RVCT/ARMCMx/STM32L1xx/vectors.s | 227 - os/ports/RVCT/ARMCMx/chcore.c | 46 - os/ports/RVCT/ARMCMx/chcore.h | 188 - os/ports/RVCT/ARMCMx/chcore_v6m.c | 128 - os/ports/RVCT/ARMCMx/chcore_v6m.h | 380 - os/ports/RVCT/ARMCMx/chcore_v7m.c | 205 - os/ports/RVCT/ARMCMx/chcore_v7m.h | 512 - os/ports/RVCT/ARMCMx/chcoreasm_v6m.s | 108 - os/ports/RVCT/ARMCMx/chcoreasm_v7m.s | 107 - os/ports/RVCT/ARMCMx/chtypes.h | 82 - os/ports/RVCT/ARMCMx/cstartup.s | 121 - os/ports/RVCT/ARMCMx/port.dox | 233 - os/ports/common/.empty | 1 + .../ARMCMx/CMSIS/include/arm_common_tables.h | 38 - .../common/ARMCMx/CMSIS/include/arm_math.h | 7578 --------------- .../common/ARMCMx/CMSIS/include/core_cm0.h | 667 -- .../ARMCMx/CMSIS/include/core_cm0plus.h | 778 -- .../common/ARMCMx/CMSIS/include/core_cm3.h | 1612 ---- .../common/ARMCMx/CMSIS/include/core_cm4.h | 1757 ---- .../ARMCMx/CMSIS/include/core_cm4_simd.h | 649 -- .../common/ARMCMx/CMSIS/include/core_cmFunc.h | 620 -- .../ARMCMx/CMSIS/include/core_cmInstr.h | 618 -- os/ports/common/ARMCMx/CMSIS/readme.txt | 6 - os/ports/common/ARMCMx/nvic.c | 74 - os/ports/common/ARMCMx/nvic.h | 293 - os/ports/common/ARMCMx/port.dox | 34 - os/ports/cosmic/.empty | 1 + os/ports/cosmic/STM8/chcore.c | 71 - os/ports/cosmic/STM8/chcore.h | 332 - os/ports/cosmic/STM8/chtypes.h | 94 - os/ports/cosmic/STM8/port.dox | 95 - os/various/shell.c | 2 +- os/various/syscalls.c | 24 - test/coverage/Makefile | 156 - test/coverage/chconf.h | 536 -- test/coverage/halconf.h | 342 - test/coverage/main.c | 55 - test/coverage/readme.txt | 6 - test/test.c | 394 - test/test.dox | 86 - test/test.h | 177 - test/test.mk | 16 - test/testbmk.c | 714 -- test/testbmk.h | 26 - test/testdyn.c | 268 - test/testdyn.h | 26 - test/testevt.c | 298 - test/testevt.h | 26 - test/testheap.c | 163 - test/testheap.h | 26 - test/testmbox.c | 243 - test/testmbox.h | 26 - test/testmsg.c | 112 - test/testmsg.h | 26 - test/testmtx.c | 639 -- test/testmtx.h | 26 - test/testpools.c | 121 - test/testpools.h | 26 - test/testqueues.c | 248 - test/testqueues.h | 26 - test/testsem.c | 306 - test/testsem.h | 26 - test/testthd.c | 235 - test/testthd.h | 26 - testhal/LPC11xx/IRQ_STORM/Makefile | 196 - testhal/LPC11xx/IRQ_STORM/chconf.h | 535 -- testhal/LPC11xx/IRQ_STORM/halconf.h | 342 - testhal/LPC11xx/IRQ_STORM/main.c | 328 - testhal/LPC11xx/IRQ_STORM/mcuconf.h | 83 - testhal/LPC11xx/IRQ_STORM/readme.txt | 25 - testhal/LPC13xx/IRQ_STORM/Makefile | 197 - testhal/LPC13xx/IRQ_STORM/chconf.h | 535 -- testhal/LPC13xx/IRQ_STORM/halconf.h | 342 - testhal/LPC13xx/IRQ_STORM/main.c | 328 - testhal/LPC13xx/IRQ_STORM/mcuconf.h | 80 - testhal/LPC13xx/IRQ_STORM/readme.txt | 25 - testhal/STM32F0xx/ADC/Makefile | 207 - testhal/STM32F0xx/ADC/chconf.h | 535 -- testhal/STM32F0xx/ADC/halconf.h | 342 - testhal/STM32F0xx/ADC/main.c | 156 - testhal/STM32F0xx/ADC/mcuconf.h | 144 - testhal/STM32F0xx/ADC/readme.txt | 31 - testhal/STM32F0xx/EXT/Makefile | 207 - testhal/STM32F0xx/EXT/chconf.h | 535 -- testhal/STM32F0xx/EXT/halconf.h | 342 - testhal/STM32F0xx/EXT/main.c | 103 - testhal/STM32F0xx/EXT/mcuconf.h | 144 - testhal/STM32F0xx/EXT/readme.txt | 30 - testhal/STM32F0xx/IRQ_STORM/Makefile | 207 - testhal/STM32F0xx/IRQ_STORM/chconf.h | 535 -- testhal/STM32F0xx/IRQ_STORM/halconf.h | 342 - testhal/STM32F0xx/IRQ_STORM/main.c | 332 - testhal/STM32F0xx/IRQ_STORM/mcuconf.h | 144 - testhal/STM32F0xx/IRQ_STORM/readme.txt | 31 - testhal/STM32F0xx/PWM-ICU/Makefile | 207 - testhal/STM32F0xx/PWM-ICU/chconf.h | 535 -- testhal/STM32F0xx/PWM-ICU/halconf.h | 342 - testhal/STM32F0xx/PWM-ICU/main.c | 147 - testhal/STM32F0xx/PWM-ICU/mcuconf.h | 144 - testhal/STM32F0xx/PWM-ICU/readme.txt | 30 - testhal/STM32F0xx/UART/Makefile | 207 - testhal/STM32F0xx/UART/chconf.h | 535 -- testhal/STM32F0xx/UART/halconf.h | 342 - testhal/STM32F0xx/UART/main.c | 148 - testhal/STM32F0xx/UART/mcuconf.h | 144 - testhal/STM32F0xx/UART/readme.txt | 31 - testhal/STM32F1xx/ADC/Makefile | 209 - testhal/STM32F1xx/ADC/chconf.h | 535 -- testhal/STM32F1xx/ADC/halconf.h | 342 - testhal/STM32F1xx/ADC/main.c | 161 - testhal/STM32F1xx/ADC/mcuconf.h | 203 - testhal/STM32F1xx/ADC/readme.txt | 26 - testhal/STM32F1xx/CAN/Makefile | 209 - testhal/STM32F1xx/CAN/chconf.h | 535 -- testhal/STM32F1xx/CAN/halconf.h | 342 - testhal/STM32F1xx/CAN/main.c | 117 - testhal/STM32F1xx/CAN/mcuconf.h | 203 - testhal/STM32F1xx/CAN/readme.txt | 26 - testhal/STM32F1xx/EXT/Makefile | 208 - testhal/STM32F1xx/EXT/chconf.h | 535 -- testhal/STM32F1xx/EXT/halconf.h | 342 - testhal/STM32F1xx/EXT/main.c | 103 - testhal/STM32F1xx/EXT/mcuconf.h | 203 - testhal/STM32F1xx/EXT/readme.txt | 26 - testhal/STM32F1xx/GPT/Makefile | 209 - testhal/STM32F1xx/GPT/chconf.h | 535 -- testhal/STM32F1xx/GPT/halconf.h | 342 - testhal/STM32F1xx/GPT/main.c | 97 - testhal/STM32F1xx/GPT/mcuconf.h | 203 - testhal/STM32F1xx/GPT/readme.txt | 26 - testhal/STM32F1xx/I2C/Makefile | 220 - testhal/STM32F1xx/I2C/chconf.h | 509 - testhal/STM32F1xx/I2C/fake.c | 65 - testhal/STM32F1xx/I2C/fake.h | 26 - testhal/STM32F1xx/I2C/halconf.h | 342 - testhal/STM32F1xx/I2C/i2c_pns.c | 51 - testhal/STM32F1xx/I2C/i2c_pns.h | 28 - testhal/STM32F1xx/I2C/lis3.c | 95 - testhal/STM32F1xx/I2C/lis3.h | 48 - testhal/STM32F1xx/I2C/main.c | 139 - testhal/STM32F1xx/I2C/mcuconf.h | 203 - testhal/STM32F1xx/I2C/tmp75.c | 64 - testhal/STM32F1xx/I2C/tmp75.h | 33 - testhal/STM32F1xx/IRQ_STORM/Makefile | 209 - testhal/STM32F1xx/IRQ_STORM/chconf.h | 535 -- testhal/STM32F1xx/IRQ_STORM/halconf.h | 342 - testhal/STM32F1xx/IRQ_STORM/main.c | 330 - testhal/STM32F1xx/IRQ_STORM/mcuconf.h | 203 - testhal/STM32F1xx/IRQ_STORM/readme.txt | 31 - testhal/STM32F1xx/PWM-ICU/Makefile | 209 - testhal/STM32F1xx/PWM-ICU/chconf.h | 535 -- testhal/STM32F1xx/PWM-ICU/halconf.h | 342 - testhal/STM32F1xx/PWM-ICU/main.c | 143 - testhal/STM32F1xx/PWM-ICU/mcuconf.h | 203 - testhal/STM32F1xx/PWM-ICU/readme.txt | 28 - testhal/STM32F1xx/RTC/Makefile | 211 - testhal/STM32F1xx/RTC/chconf.h | 509 - testhal/STM32F1xx/RTC/halconf.h | 342 - testhal/STM32F1xx/RTC/main.c | 122 - testhal/STM32F1xx/RTC/mcuconf.h | 203 - testhal/STM32F1xx/RTC_FATTIME/Makefile | 213 - testhal/STM32F1xx/RTC_FATTIME/chconf.h | 535 -- testhal/STM32F1xx/RTC_FATTIME/ffconf.h | 193 - testhal/STM32F1xx/RTC_FATTIME/halconf.h | 342 - testhal/STM32F1xx/RTC_FATTIME/main.c | 564 -- testhal/STM32F1xx/RTC_FATTIME/mcuconf.h | 203 - testhal/STM32F1xx/RTC_FATTIME/readme.txt | 26 - testhal/STM32F1xx/SDC/Makefile | 212 - testhal/STM32F1xx/SDC/chconf.h | 535 -- testhal/STM32F1xx/SDC/halconf.h | 342 - testhal/STM32F1xx/SDC/main.c | 113 - testhal/STM32F1xx/SDC/mcuconf.h | 203 - testhal/STM32F1xx/SDC/readme.txt | 26 - testhal/STM32F1xx/SPI/Makefile | 209 - testhal/STM32F1xx/SPI/chconf.h | 535 -- testhal/STM32F1xx/SPI/halconf.h | 342 - testhal/STM32F1xx/SPI/main.c | 138 - testhal/STM32F1xx/SPI/mcuconf.h | 203 - testhal/STM32F1xx/SPI/readme.txt | 26 - testhal/STM32F1xx/UART/Makefile | 209 - testhal/STM32F1xx/UART/chconf.h | 535 -- testhal/STM32F1xx/UART/halconf.h | 342 - testhal/STM32F1xx/UART/main.c | 147 - testhal/STM32F1xx/UART/mcuconf.h | 203 - testhal/STM32F1xx/UART/readme.txt | 26 - testhal/STM32F1xx/USB_CDC/Makefile | 209 - testhal/STM32F1xx/USB_CDC/chconf.h | 535 -- testhal/STM32F1xx/USB_CDC/halconf.h | 342 - testhal/STM32F1xx/USB_CDC/main.c | 504 - testhal/STM32F1xx/USB_CDC/mcuconf.h | 203 - testhal/STM32F1xx/USB_CDC/readme.txt | 26 - testhal/STM32F1xx/USB_CDC_F107/.cproject | 50 - testhal/STM32F1xx/USB_CDC_F107/.project | 95 - testhal/STM32F1xx/USB_CDC_F107/Makefile | 209 - testhal/STM32F1xx/USB_CDC_F107/chconf.h | 535 -- testhal/STM32F1xx/USB_CDC_F107/halconf.h | 342 - testhal/STM32F1xx/USB_CDC_F107/main.c | 504 - testhal/STM32F1xx/USB_CDC_F107/mcuconf.h | 211 - testhal/STM32F1xx/USB_CDC_F107/readme.txt | 26 - testhal/STM32F1xx/USB_MSC/Makefile | 210 - testhal/STM32F1xx/USB_MSC/chconf.h | 535 -- testhal/STM32F1xx/USB_MSC/halconf.h | 342 - testhal/STM32F1xx/USB_MSC/main.c | 317 - testhal/STM32F1xx/USB_MSC/mcuconf.h | 203 - testhal/STM32F4xx/ADC/Makefile | 222 - testhal/STM32F4xx/ADC/chconf.h | 535 -- testhal/STM32F4xx/ADC/halconf.h | 342 - testhal/STM32F4xx/ADC/main.c | 164 - testhal/STM32F4xx/ADC/mcuconf.h | 257 - testhal/STM32F4xx/ADC/readme.txt | 30 - testhal/STM32F4xx/CAN/Makefile | 221 - testhal/STM32F4xx/CAN/chconf.h | 535 -- testhal/STM32F4xx/CAN/halconf.h | 342 - testhal/STM32F4xx/CAN/main.c | 116 - testhal/STM32F4xx/CAN/mcuconf.h | 257 - testhal/STM32F4xx/CAN/readme.txt | 26 - testhal/STM32F4xx/DMA_STORM/Makefile | 222 - testhal/STM32F4xx/DMA_STORM/chconf.h | 535 -- testhal/STM32F4xx/DMA_STORM/halconf.h | 342 - testhal/STM32F4xx/DMA_STORM/main.c | 233 - testhal/STM32F4xx/DMA_STORM/mcuconf.h | 257 - testhal/STM32F4xx/EXT/Makefile | 222 - testhal/STM32F4xx/EXT/chconf.h | 535 -- testhal/STM32F4xx/EXT/halconf.h | 342 - testhal/STM32F4xx/EXT/main.c | 105 - testhal/STM32F4xx/EXT/mcuconf.h | 257 - testhal/STM32F4xx/EXT/readme.txt | 30 - testhal/STM32F4xx/GPT/Makefile | 222 - testhal/STM32F4xx/GPT/chconf.h | 535 -- testhal/STM32F4xx/GPT/halconf.h | 342 - testhal/STM32F4xx/GPT/main.c | 98 - testhal/STM32F4xx/GPT/mcuconf.h | 257 - testhal/STM32F4xx/GPT/readme.txt | 30 - testhal/STM32F4xx/I2C/Makefile | 222 - testhal/STM32F4xx/I2C/chconf.h | 512 - testhal/STM32F4xx/I2C/halconf.h | 342 - testhal/STM32F4xx/I2C/main.c | 185 - testhal/STM32F4xx/I2C/mcuconf.h | 257 - testhal/STM32F4xx/IRQ_STORM/Makefile | 222 - testhal/STM32F4xx/IRQ_STORM/chconf.h | 537 -- testhal/STM32F4xx/IRQ_STORM/halconf.h | 342 - testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp | 2284 ----- testhal/STM32F4xx/IRQ_STORM/iar/ch.eww | 10 - testhal/STM32F4xx/IRQ_STORM/iar/ch.icf | 39 - testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj | 945 -- testhal/STM32F4xx/IRQ_STORM/main.c | 331 - testhal/STM32F4xx/IRQ_STORM/mcuconf.h | 257 - testhal/STM32F4xx/IRQ_STORM/readme.txt | 31 - testhal/STM32F4xx/IRQ_STORM_FPU/Makefile | 222 - testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h | 535 -- testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c | 27 - testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h | 342 - testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp | 2288 ----- testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww | 10 - testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf | 39 - .../STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj | 945 -- testhal/STM32F4xx/IRQ_STORM_FPU/main.c | 304 - testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h | 257 - testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt | 30 - testhal/STM32F4xx/PWM-ICU/Makefile | 222 - testhal/STM32F4xx/PWM-ICU/chconf.h | 535 -- testhal/STM32F4xx/PWM-ICU/halconf.h | 342 - testhal/STM32F4xx/PWM-ICU/main.c | 142 - testhal/STM32F4xx/PWM-ICU/mcuconf.h | 257 - testhal/STM32F4xx/PWM-ICU/readme.txt | 30 - testhal/STM32F4xx/RTC/Makefile | 226 - testhal/STM32F4xx/RTC/chconf.h | 512 - testhal/STM32F4xx/RTC/halconf.h | 342 - testhal/STM32F4xx/RTC/main.c | 243 - testhal/STM32F4xx/RTC/mcuconf.h | 257 - testhal/STM32F4xx/RTC_FATTIME/Makefile | 217 - testhal/STM32F4xx/RTC_FATTIME/chconf.h | 538 -- testhal/STM32F4xx/RTC_FATTIME/ffconf.h | 193 - testhal/STM32F4xx/RTC_FATTIME/halconf.h | 349 - testhal/STM32F4xx/RTC_FATTIME/main.c | 222 - testhal/STM32F4xx/RTC_FATTIME/mcuconf.h | 257 - testhal/STM32F4xx/RTC_FATTIME/readme.txt | 27 - testhal/STM32F4xx/SDC/Makefile | 217 - testhal/STM32F4xx/SDC/chconf.h | 538 -- testhal/STM32F4xx/SDC/csd.txt | 7 - testhal/STM32F4xx/SDC/ffconf.h | 193 - testhal/STM32F4xx/SDC/halconf.h | 349 - testhal/STM32F4xx/SDC/main.c | 402 - testhal/STM32F4xx/SDC/mcuconf.h | 257 - testhal/STM32F4xx/SDC/readme.txt | 26 - testhal/STM32F4xx/SPI/Makefile | 222 - testhal/STM32F4xx/SPI/chconf.h | 535 -- testhal/STM32F4xx/SPI/halconf.h | 342 - testhal/STM32F4xx/SPI/main.c | 142 - testhal/STM32F4xx/SPI/mcuconf.h | 257 - testhal/STM32F4xx/SPI/readme.txt | 30 - testhal/STM32F4xx/UART/Makefile | 222 - testhal/STM32F4xx/UART/chconf.h | 535 -- testhal/STM32F4xx/UART/halconf.h | 342 - testhal/STM32F4xx/UART/main.c | 148 - testhal/STM32F4xx/UART/mcuconf.h | 257 - testhal/STM32F4xx/UART/readme.txt | 31 - testhal/STM32F4xx/USB_CDC/.cproject | 50 - testhal/STM32F4xx/USB_CDC/.project | 95 - testhal/STM32F4xx/USB_CDC/Makefile | 223 - testhal/STM32F4xx/USB_CDC/chconf.h | 535 -- testhal/STM32F4xx/USB_CDC/halconf.h | 342 - testhal/STM32F4xx/USB_CDC/main.c | 506 - testhal/STM32F4xx/USB_CDC/mcuconf.h | 257 - testhal/STM32F4xx/USB_CDC/readme.txt | 26 - testhal/STM32L1xx/ADC/Makefile | 207 - testhal/STM32L1xx/ADC/chconf.h | 535 -- testhal/STM32L1xx/ADC/halconf.h | 342 - testhal/STM32L1xx/ADC/main.c | 167 - testhal/STM32L1xx/ADC/mcuconf.h | 171 - testhal/STM32L1xx/ADC/readme.txt | 31 - testhal/STM32L1xx/EXT/Makefile | 207 - testhal/STM32L1xx/EXT/chconf.h | 535 -- testhal/STM32L1xx/EXT/halconf.h | 342 - testhal/STM32L1xx/EXT/main.c | 103 - testhal/STM32L1xx/EXT/mcuconf.h | 171 - testhal/STM32L1xx/EXT/readme.txt | 30 - testhal/STM32L1xx/GPT/Makefile | 207 - testhal/STM32L1xx/GPT/chconf.h | 535 -- testhal/STM32L1xx/GPT/halconf.h | 342 - testhal/STM32L1xx/GPT/main.c | 98 - testhal/STM32L1xx/GPT/mcuconf.h | 171 - testhal/STM32L1xx/GPT/readme.txt | 30 - testhal/STM32L1xx/IRQ_STORM/Makefile | 207 - testhal/STM32L1xx/IRQ_STORM/chconf.h | 535 -- testhal/STM32L1xx/IRQ_STORM/halconf.h | 342 - testhal/STM32L1xx/IRQ_STORM/main.c | 332 - testhal/STM32L1xx/IRQ_STORM/mcuconf.h | 171 - testhal/STM32L1xx/IRQ_STORM/readme.txt | 31 - testhal/STM32L1xx/PWM-ICU/Makefile | 207 - testhal/STM32L1xx/PWM-ICU/chconf.h | 535 -- testhal/STM32L1xx/PWM-ICU/halconf.h | 342 - testhal/STM32L1xx/PWM-ICU/main.c | 142 - testhal/STM32L1xx/PWM-ICU/mcuconf.h | 171 - testhal/STM32L1xx/PWM-ICU/readme.txt | 31 - testhal/STM32L1xx/SPI/Makefile | 207 - testhal/STM32L1xx/SPI/chconf.h | 535 -- testhal/STM32L1xx/SPI/halconf.h | 342 - testhal/STM32L1xx/SPI/main.c | 141 - testhal/STM32L1xx/SPI/mcuconf.h | 171 - testhal/STM32L1xx/SPI/readme.txt | 31 - testhal/STM32L1xx/UART/Makefile | 207 - testhal/STM32L1xx/UART/chconf.h | 535 -- testhal/STM32L1xx/UART/halconf.h | 342 - testhal/STM32L1xx/UART/main.c | 148 - testhal/STM32L1xx/UART/mcuconf.h | 171 - testhal/STM32L1xx/UART/readme.txt | 32 - testhal/STM8S/SPI/ChibiOS-RT.stw | 16 - testhal/STM8S/SPI/cosmic/cosmic.stp | 1947 ---- testhal/STM8S/SPI/cosmic/vectors.c | 107 - testhal/STM8S/SPI/demo/chconf.h | 535 -- testhal/STM8S/SPI/demo/halconf.h | 342 - testhal/STM8S/SPI/demo/main.c | 91 - testhal/STM8S/SPI/demo/mcuconf.h | 51 - testhal/STM8S/SPI/raisonance/raisonance.stp | 1963 ---- tools/eclipse/config_wizard/.classpath | 13 - tools/eclipse/config_wizard/.project | 28 - .../.settings/org.eclipse.jdt.core.prefs | 8 - .../config_wizard/META-INF/MANIFEST.MF | 24 - tools/eclipse/config_wizard/build.properties | 36 - tools/eclipse/config_wizard/icons/check.gif | Bin 591 -> 0 bytes tools/eclipse/config_wizard/icons/chibios.gif | Bin 581 -> 0 bytes .../eclipse/config_wizard/icons/generate.gif | Bin 378 -> 0 bytes tools/eclipse/config_wizard/icons/sample.gif | Bin 983 -> 0 bytes tools/eclipse/config_wizard/lib/bsh.jar | Bin 281694 -> 0 bytes tools/eclipse/config_wizard/lib/fmpp.jar | Bin 314020 -> 0 bytes .../eclipse/config_wizard/lib/freemarker.jar | Bin 931168 -> 0 bytes .../eclipse/config_wizard/lib/jdom-2.0.2.jar | Bin 295355 -> 0 bytes tools/eclipse/config_wizard/lib/oro.jar | Bin 65261 -> 0 bytes tools/eclipse/config_wizard/lib/resolver.jar | Bin 60047 -> 0 bytes tools/eclipse/config_wizard/plugin.xml | 216 - .../resources/app_templates/c/template.xml | 82 - .../resources/gencfg/lib/code_snippets.xml | 50 - .../resources/gencfg/lib/libcode.ftl | 316 - .../resources/gencfg/lib/liblicense.ftl | 58 - .../resources/gencfg/lib/libsnippets.ftl | 33 - .../resources/gencfg/lib/libstm32f4xx.ftl | 144 - .../resources/gencfg/lib/libutils.ftl | 109 - .../boards/stm32f0xx/templates/board.c.ftl | 101 - .../boards/stm32f0xx/templates/board.h.ftl | 320 - .../boards/stm32f0xx/templates/board.mk.ftl | 28 - .../boards/stm32f4xx/templates/board.c.ftl | 139 - .../boards/stm32f4xx/templates/board.h.ftl | 327 - .../boards/stm32f4xx/templates/board.mk.ftl | 28 - .../boards/stm32l1xx/templates/board.c.ftl | 133 - .../boards/stm32l1xx/templates/board.h.ftl | 321 - .../boards/stm32l1xx/templates/board.mk.ftl | 28 - .../gencfg/processors/processors.xml | 38 - .../gencfg/schema/boards/abstract_board.xsd | 81 - .../gencfg/schema/boards/stm32f0xx_board.xsd | 70 - .../gencfg/schema/boards/stm32f4xx_board.xsd | 87 - .../gencfg/schema/boards/stm32l1xx_board.xsd | 71 - .../gencfg/schema/common/code_snippets.xsd | 59 - .../gencfg/schema/common/config_settings.xsd | 36 - .../resources/gencfg/schema/common/doc.xsd | 108 - .../schema/common/stm32/stm32_gpiov2_port.xsd | 214 - .../resources/gencfg/xml/stm32f0board.xml | 669 -- .../resources/gencfg/xml/stm32f4board.xml | 1194 --- .../resources/gencfg/xml/stm32l1board.xml | 799 -- .../src/config_wizard/Activator.java | 88 - .../config/handlers/CheckDescription.java | 55 - .../config/handlers/GenerateFiles.java | 131 - .../ApplicationGeneratorProcessRunner.java | 37 - .../eclipse/config/utils/TemplateEngine.java | 260 - .../config/utils/TemplateException.java | 30 - .../wizards/ConfigurationNewWizard.java | 185 - .../wizards/ConfigurationNewWizardPage.java | 264 - .../wizards/NewApplicationProjectWizard.java | 158 - .../NewApplicationProjectWizardPage.java | 312 - tools/eclipse/debug_support/.classpath | 7 - tools/eclipse/debug_support/.project | 28 - .../.settings/org.eclipse.jdt.core.prefs | 8 - .../debug_support/META-INF/MANIFEST.MF | 14 - tools/eclipse/debug_support/build.properties | 7 - tools/eclipse/debug_support/contexts.xml | 12 - tools/eclipse/debug_support/icons/sample.gif | Bin 983 -> 0 bytes tools/eclipse/debug_support/plugin.xml | 38 - .../eclipse/debug/activator/Activator.java | 88 - .../tools/eclipse/debug/utils/DebugProxy.java | 582 -- .../debug/utils/DebugProxyException.java | 34 - .../tools/eclipse/debug/utils/HexUtils.java | 114 - .../tools/eclipse/debug/views/ChibiView.java | 585 -- .../org/eclipse/wb/swt/ResourceManager.java | 415 - .../eclipse/wb/swt/SWTResourceManager.java | 447 - ...org.chibios.tools.eclipse.config_1.1.0.jar | Bin 1851193 -> 0 bytes .../org.chibios.tools.eclipse.debug_1.0.8.jar | Bin 34953 -> 0 bytes tools/eclipse/readme.txt | 16 - tools/edit_aid/rebalance_prio.sh | 13 - .../FMPP Builder (Linux).launch | 10 - .../FMPP Builder (Windows).launch | 10 - tools/gencfg/.project | 39 - tools/gencfg/config.fmpp | 10 - tools/gencfg/fmpp.sh | 7 - tools/gencfg/lib/libcode.ftl | 316 - tools/gencfg/lib/liblicense.ftl | 58 - tools/gencfg/lib/libstm32f4xx.ftl | 144 - tools/gencfg/lib/libutils.ftl | 109 - .../processors/boards/stm32f4xx/config.fmpp | 5 - .../boards/stm32f4xx/templates/board.c.ftl | 139 - .../boards/stm32f4xx/templates/board.h.ftl | 327 - .../boards/stm32f4xx/templates/board.mk.ftl | 28 - .../processors/hal/stm32f4xx/config.fmpp | 5 - .../hal/stm32f4xx/templates/hal_cfg.c.ftl | 66 - .../hal/stm32f4xx/templates/hal_cfg.h.ftl | 72 - tools/gencfg/processors/processors.xml | 14 - tools/gencfg/readme.txt | 14 - tools/gencfg/run.bat | 1 - tools/gencfg/schema/boards/abstract_board.xsd | 68 - .../gencfg/schema/boards/stm32f4xx_board.xsd | 89 - tools/gencfg/schema/common/doc.xsd | 108 - .../schema/common/stm32/stm32_gpiov2_port.xsd | 214 - tools/gencfg/schema/hal/abstract_adc_cfg.xsd | 51 - tools/gencfg/schema/hal/abstract_cfg.xsd | 344 - .../gencfg/schema/hal/abstract_driver_cfg.xsd | 12 - .../hal/stm32f4xx/stm32f4xx_adc_cfg.xsd | 432 - .../schema/hal/stm32f4xx/stm32f4xx_cfg.xsd | 29 - tools/gencfg/xml/stm32f0board.xml | 665 -- tools/gencfg/xml/stm32f4board.xml | 1190 --- tools/gencfg/xml/stm32f4xx_cfg.xml | 52 - 1379 files changed, 344 insertions(+), 415636 deletions(-) delete mode 100644 boards/ARDUINO_MEGA/board.c delete mode 100644 boards/ARDUINO_MEGA/board.h delete mode 100644 boards/ARDUINO_MEGA/board.mk delete mode 100644 boards/EA_LPCXPRESSO_BB_1114/board.c delete mode 100644 boards/EA_LPCXPRESSO_BB_1114/board.h delete mode 100644 boards/EA_LPCXPRESSO_BB_1114/board.mk delete mode 100644 boards/EA_LPCXPRESSO_BB_11U14/board.c delete mode 100644 boards/EA_LPCXPRESSO_BB_11U14/board.h delete mode 100644 boards/EA_LPCXPRESSO_BB_11U14/board.mk delete mode 100644 boards/EA_LPCXPRESSO_BB_1343/board.c delete mode 100644 boards/EA_LPCXPRESSO_BB_1343/board.h delete mode 100644 boards/EA_LPCXPRESSO_BB_1343/board.mk delete mode 100644 boards/GENERIC_SPC560P/board.c delete mode 100644 boards/GENERIC_SPC560P/board.h delete mode 100644 boards/GENERIC_SPC560P/board.mk delete mode 100644 boards/GENERIC_SPC563M/board.c delete mode 100644 boards/GENERIC_SPC563M/board.h delete mode 100644 boards/GENERIC_SPC563M/board.mk delete mode 100644 boards/MAPLEMINI_STM32_F103/board.c delete mode 100644 boards/MAPLEMINI_STM32_F103/board.h delete mode 100644 boards/MAPLEMINI_STM32_F103/board.mk delete mode 100644 boards/NONSTANDARD_STM32F4_BARTHESS1/board.c delete mode 100644 boards/NONSTANDARD_STM32F4_BARTHESS1/board.h delete mode 100644 boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk delete mode 100644 boards/OLIMEX_AVR_CAN/board.c delete mode 100644 boards/OLIMEX_AVR_CAN/board.h delete mode 100644 boards/OLIMEX_AVR_CAN/board.mk delete mode 100644 boards/OLIMEX_AVR_MT_128/board.c delete mode 100644 boards/OLIMEX_AVR_MT_128/board.h delete mode 100644 boards/OLIMEX_AVR_MT_128/board.mk delete mode 100644 boards/OLIMEX_LPC_P1343/board.c delete mode 100644 boards/OLIMEX_LPC_P1343/board.h delete mode 100644 boards/OLIMEX_LPC_P1343/board.mk delete mode 100644 boards/OLIMEX_LPC_P2148/board.c delete mode 100644 boards/OLIMEX_LPC_P2148/board.h delete mode 100644 boards/OLIMEX_LPC_P2148/board.mk delete mode 100644 boards/OLIMEX_LPC_P2148/buzzer.c delete mode 100644 boards/OLIMEX_LPC_P2148/buzzer.h delete mode 100644 boards/OLIMEX_MSP430_P1611/board.c delete mode 100644 boards/OLIMEX_MSP430_P1611/board.h delete mode 100644 boards/OLIMEX_MSP430_P1611/board.mk delete mode 100644 boards/OLIMEX_SAM7_EX256/board.c delete mode 100644 boards/OLIMEX_SAM7_EX256/board.h delete mode 100644 boards/OLIMEX_SAM7_EX256/board.mk delete mode 100644 boards/OLIMEX_SAM7_P256/board.c delete mode 100644 boards/OLIMEX_SAM7_P256/board.h delete mode 100644 boards/OLIMEX_SAM7_P256/board.mk delete mode 100644 boards/OLIMEX_STM32_103STK/board.c delete mode 100644 boards/OLIMEX_STM32_103STK/board.h delete mode 100644 boards/OLIMEX_STM32_103STK/board.mk delete mode 100644 boards/OLIMEX_STM32_E407/board.c delete mode 100644 boards/OLIMEX_STM32_E407/board.h delete mode 100644 boards/OLIMEX_STM32_E407/board.mk delete mode 100644 boards/OLIMEX_STM32_E407/cfg/board.chcfg delete mode 100644 boards/OLIMEX_STM32_H103/board.c delete mode 100644 boards/OLIMEX_STM32_H103/board.h delete mode 100644 boards/OLIMEX_STM32_H103/board.mk delete mode 100644 boards/OLIMEX_STM32_P103/board.c delete mode 100644 boards/OLIMEX_STM32_P103/board.h delete mode 100644 boards/OLIMEX_STM32_P103/board.mk delete mode 100644 boards/OLIMEX_STM32_P107/board.c delete mode 100644 boards/OLIMEX_STM32_P107/board.h delete mode 100644 boards/OLIMEX_STM32_P107/board.mk delete mode 100644 boards/OLIMEX_STM32_P407/board.c delete mode 100644 boards/OLIMEX_STM32_P407/board.h delete mode 100644 boards/OLIMEX_STM32_P407/board.mk delete mode 100644 boards/RAISONANCE_REVA_STM8S/board.c delete mode 100644 boards/RAISONANCE_REVA_STM8S/board.h delete mode 100644 boards/ST_STM3210C_EVAL/board.c delete mode 100644 boards/ST_STM3210C_EVAL/board.h delete mode 100644 boards/ST_STM3210C_EVAL/board.mk delete mode 100644 boards/ST_STM3210E_EVAL/board.c delete mode 100644 boards/ST_STM3210E_EVAL/board.h delete mode 100644 boards/ST_STM3210E_EVAL/board.mk delete mode 100644 boards/ST_STM3220G_EVAL/board.c delete mode 100644 boards/ST_STM3220G_EVAL/board.h delete mode 100644 boards/ST_STM3220G_EVAL/board.mk delete mode 100644 boards/ST_STM32F0_DISCOVERY/board.c delete mode 100644 boards/ST_STM32F0_DISCOVERY/board.h delete mode 100644 boards/ST_STM32F0_DISCOVERY/board.mk delete mode 100644 boards/ST_STM32F0_DISCOVERY/cfg/board.chcfg delete mode 100644 boards/ST_STM32F4_DISCOVERY/board.c delete mode 100644 boards/ST_STM32F4_DISCOVERY/board.h delete mode 100644 boards/ST_STM32F4_DISCOVERY/board.mk delete mode 100644 boards/ST_STM32F4_DISCOVERY/cfg/board.chcfg delete mode 100644 boards/ST_STM32L_DISCOVERY/board.c delete mode 100644 boards/ST_STM32L_DISCOVERY/board.h delete mode 100644 boards/ST_STM32L_DISCOVERY/board.mk delete mode 100644 boards/ST_STM32L_DISCOVERY/cfg/board.chcfg delete mode 100644 boards/ST_STM32VL_DISCOVERY/board.c delete mode 100644 boards/ST_STM32VL_DISCOVERY/board.h delete mode 100644 boards/ST_STM32VL_DISCOVERY/board.mk delete mode 100644 boards/ST_STM8L_DISCOVERY/board.c delete mode 100644 boards/ST_STM8L_DISCOVERY/board.h delete mode 100644 boards/ST_STM8S_DISCOVERY/board.c delete mode 100644 boards/ST_STM8S_DISCOVERY/board.h delete mode 100644 boards/readme.txt delete mode 100644 boards/simulator/board.c delete mode 100644 boards/simulator/board.h delete mode 100644 boards/simulator/board.mk delete mode 100644 demos/ARM11-BCM2835-G++-MPC/.cproject delete mode 100644 demos/ARM11-BCM2835-G++-MPC/.project delete mode 100644 demos/ARM11-BCM2835-G++-MPC/Makefile delete mode 100644 demos/ARM11-BCM2835-G++-MPC/chconf.h delete mode 100644 demos/ARM11-BCM2835-G++-MPC/halconf.h delete mode 100644 demos/ARM11-BCM2835-G++-MPC/main.cpp delete mode 100644 demos/ARM11-BCM2835-G++-MPC/mcuconf.h delete mode 100644 demos/ARM11-BCM2835-G++-MPC/readme.txt delete mode 100644 demos/ARM11-BCM2835-G++/.cproject delete mode 100644 demos/ARM11-BCM2835-G++/.project delete mode 100644 demos/ARM11-BCM2835-G++/Matrix/Matrix.tags delete mode 100644 demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace delete mode 100644 demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/Makefile delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/chconf.h delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/ffconf.h delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/halconf.h delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/main.c delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/mcuconf.h delete mode 100644 demos/ARM7-AT91SAM7X-FATFS-GCC/readme.txt delete mode 100644 demos/ARM7-AT91SAM7X-GCC/Makefile delete mode 100644 demos/ARM7-AT91SAM7X-GCC/chconf.h delete mode 100644 demos/ARM7-AT91SAM7X-GCC/halconf.h delete mode 100644 demos/ARM7-AT91SAM7X-GCC/main.c delete mode 100644 demos/ARM7-AT91SAM7X-GCC/mcuconf.h delete mode 100644 demos/ARM7-AT91SAM7X-GCC/readme.txt delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/chconf.h delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/halconf.h delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/lwipopts.h delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/main.c delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/mcuconf.h delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c delete mode 100644 demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/Makefile delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/chconf.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/halconf.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/main.c delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/mcuconf.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/readme.txt delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/web/cc-arch.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/web/clock-arch.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/web/uip-conf.h delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c delete mode 100644 demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.h delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/Makefile delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/chconf.h delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/ffconf.h delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/halconf.h delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/main.c delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/mcuconf.h delete mode 100644 demos/ARM7-LPC214x-FATFS-GCC/readme.txt delete mode 100644 demos/ARM7-LPC214x-G++/Makefile delete mode 100644 demos/ARM7-LPC214x-G++/chconf.h delete mode 100644 demos/ARM7-LPC214x-G++/halconf.h delete mode 100644 demos/ARM7-LPC214x-G++/main.cpp delete mode 100644 demos/ARM7-LPC214x-G++/mcuconf.h delete mode 100644 demos/ARM7-LPC214x-G++/readme.txt delete mode 100644 demos/ARM7-LPC214x-GCC/Makefile delete mode 100644 demos/ARM7-LPC214x-GCC/chconf.h delete mode 100644 demos/ARM7-LPC214x-GCC/halconf.h delete mode 100644 demos/ARM7-LPC214x-GCC/main.c delete mode 100644 demos/ARM7-LPC214x-GCC/mcuconf.h delete mode 100644 demos/ARM7-LPC214x-GCC/readme.txt delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/Makefile delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/chconf.h delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/halconf.h delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.ewp delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.eww delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.icf delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/keil/ch.uvproj delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/main.c delete mode 100644 demos/ARMCM0-LPC1114-LPCXPRESSO/mcuconf.h delete mode 100644 demos/ARMCM0-LPC11U14-LPCXPRESSO/Makefile delete mode 100644 demos/ARMCM0-LPC11U14-LPCXPRESSO/chconf.h delete mode 100644 demos/ARMCM0-LPC11U14-LPCXPRESSO/halconf.h delete mode 100644 demos/ARMCM0-LPC11U14-LPCXPRESSO/main.c delete mode 100644 demos/ARMCM0-LPC11U14-LPCXPRESSO/mcuconf.h delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/.cproject delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/.project delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/Makefile delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/chconf.h delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/halconf.h delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/main.c delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/mcuconf.h delete mode 100644 demos/ARMCM0-STM32F051-DISCOVERY/readme.txt delete mode 100644 demos/ARMCM3-GENERIC-KERNEL/Makefile delete mode 100644 demos/ARMCM3-GENERIC-KERNEL/chconf.h delete mode 100644 demos/ARMCM3-GENERIC-KERNEL/main.c delete mode 100644 demos/ARMCM3-GENERIC-KERNEL/readme.txt delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/Makefile delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/chconf.h delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/halconf.h delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.ewp delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.eww delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.icf delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/keil/ch.uvproj delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/main.c delete mode 100644 demos/ARMCM3-LPC1343-LPCXPRESSO/mcuconf.h delete mode 100644 demos/ARMCM3-LPC1343-OLIMEX/Makefile delete mode 100644 demos/ARMCM3-LPC1343-OLIMEX/chconf.h delete mode 100644 demos/ARMCM3-LPC1343-OLIMEX/halconf.h delete mode 100644 demos/ARMCM3-LPC1343-OLIMEX/main.c delete mode 100644 demos/ARMCM3-LPC1343-OLIMEX/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/.cproject delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/.project delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/Makefile delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/chconf.h delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/halconf.h delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.ewp delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.eww delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.icf delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/keil/ch.uvproj delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/main.c delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F100-DISCOVERY/readme.txt delete mode 100644 demos/ARMCM3-STM32F103-FATFS/.cproject delete mode 100644 demos/ARMCM3-STM32F103-FATFS/.project delete mode 100644 demos/ARMCM3-STM32F103-FATFS/Makefile delete mode 100644 demos/ARMCM3-STM32F103-FATFS/chconf.h delete mode 100644 demos/ARMCM3-STM32F103-FATFS/ffconf.h delete mode 100644 demos/ARMCM3-STM32F103-FATFS/halconf.h delete mode 100644 demos/ARMCM3-STM32F103-FATFS/main.c delete mode 100644 demos/ARMCM3-STM32F103-FATFS/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F103-FATFS/readme.txt delete mode 100644 demos/ARMCM3-STM32F103-G++/.cproject delete mode 100644 demos/ARMCM3-STM32F103-G++/.project delete mode 100644 demos/ARMCM3-STM32F103-G++/Makefile delete mode 100644 demos/ARMCM3-STM32F103-G++/chconf.h delete mode 100644 demos/ARMCM3-STM32F103-G++/halconf.h delete mode 100644 demos/ARMCM3-STM32F103-G++/main.cpp delete mode 100644 demos/ARMCM3-STM32F103-G++/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F103-G++/readme.txt delete mode 100644 demos/ARMCM3-STM32F103/.cproject delete mode 100644 demos/ARMCM3-STM32F103/.project delete mode 100644 demos/ARMCM3-STM32F103/Makefile delete mode 100644 demos/ARMCM3-STM32F103/chconf.h delete mode 100644 demos/ARMCM3-STM32F103/codeblocks/ch.cbp delete mode 100644 demos/ARMCM3-STM32F103/codeblocks/ch.workspace delete mode 100644 demos/ARMCM3-STM32F103/halconf.h delete mode 100644 demos/ARMCM3-STM32F103/iar/ch.ewp delete mode 100644 demos/ARMCM3-STM32F103/iar/ch.eww delete mode 100644 demos/ARMCM3-STM32F103/iar/ch.icf delete mode 100644 demos/ARMCM3-STM32F103/keil/ch.uvproj delete mode 100644 demos/ARMCM3-STM32F103/main.c delete mode 100644 demos/ARMCM3-STM32F103/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F103/readme.txt delete mode 100644 demos/ARMCM3-STM32F103/ride7/ch.rapp delete mode 100644 demos/ARMCM3-STM32F103/ride7/ch.rprj delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/.cproject delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/.project delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/Makefile delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/chconf.h delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/ffconf.h delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/halconf.h delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.eww delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.icf delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/main.c delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F103ZG-FATFS/readme.txt delete mode 100644 demos/ARMCM3-STM32F107-FATFS/.cproject delete mode 100644 demos/ARMCM3-STM32F107-FATFS/.project delete mode 100644 demos/ARMCM3-STM32F107-FATFS/Makefile delete mode 100644 demos/ARMCM3-STM32F107-FATFS/chconf.h delete mode 100644 demos/ARMCM3-STM32F107-FATFS/ffconf.h delete mode 100644 demos/ARMCM3-STM32F107-FATFS/halconf.h delete mode 100644 demos/ARMCM3-STM32F107-FATFS/main.c delete mode 100644 demos/ARMCM3-STM32F107-FATFS/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F107-FATFS/readme.txt delete mode 100644 demos/ARMCM3-STM32F107-LWIP/.cproject delete mode 100644 demos/ARMCM3-STM32F107-LWIP/.project delete mode 100644 demos/ARMCM3-STM32F107-LWIP/Makefile delete mode 100644 demos/ARMCM3-STM32F107-LWIP/chconf.h delete mode 100644 demos/ARMCM3-STM32F107-LWIP/halconf.h delete mode 100644 demos/ARMCM3-STM32F107-LWIP/lwipopts.h delete mode 100644 demos/ARMCM3-STM32F107-LWIP/main.c delete mode 100644 demos/ARMCM3-STM32F107-LWIP/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F107-LWIP/readme.txt delete mode 100644 demos/ARMCM3-STM32F107-LWIP/web/web.c delete mode 100644 demos/ARMCM3-STM32F107-LWIP/web/web.h delete mode 100644 demos/ARMCM3-STM32F107/.cproject delete mode 100644 demos/ARMCM3-STM32F107/.project delete mode 100644 demos/ARMCM3-STM32F107/Makefile delete mode 100644 demos/ARMCM3-STM32F107/chconf.h delete mode 100644 demos/ARMCM3-STM32F107/halconf.h delete mode 100644 demos/ARMCM3-STM32F107/iar/ch.ewp delete mode 100644 demos/ARMCM3-STM32F107/iar/ch.eww delete mode 100644 demos/ARMCM3-STM32F107/iar/ch.icf delete mode 100644 demos/ARMCM3-STM32F107/keil/ch.uvproj delete mode 100644 demos/ARMCM3-STM32F107/main.c delete mode 100644 demos/ARMCM3-STM32F107/mcuconf.h delete mode 100644 demos/ARMCM3-STM32F107/readme.txt delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/.cproject delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/.project delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/Makefile delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/chconf.h delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/halconf.h delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.ewp delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.eww delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.icf delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/keil/ch.uvproj delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/main.c delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/mcuconf.h delete mode 100644 demos/ARMCM3-STM32L152-DISCOVERY/readme.txt delete mode 100644 demos/ARMCM4-STM32F303-DISCOVERY/Makefile delete mode 100644 demos/ARMCM4-STM32F303-DISCOVERY/chconf.h delete mode 100644 demos/ARMCM4-STM32F303-DISCOVERY/halconf.h delete mode 100644 demos/ARMCM4-STM32F303-DISCOVERY/main.c delete mode 100644 demos/ARMCM4-STM32F303-DISCOVERY/mcuconf.h delete mode 100644 demos/ARMCM4-STM32F303-DISCOVERY/readme.txt delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.cproject delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/chconf.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/readme.txt delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/.cproject delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/.project delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/Makefile delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/chconf.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/halconf.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.ewp delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.eww delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.icf delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/keil/ch.uvproj delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/main.c delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/mcuconf.h delete mode 100644 demos/ARMCM4-STM32F407-DISCOVERY/readme.txt delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.cproject delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.project delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/Makefile delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/chconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/ffconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/halconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/lwipopts.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/main.c delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/mcuconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/readme.txt delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.c delete mode 100644 demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP/.cproject delete mode 100644 demos/ARMCM4-STM32F407-LWIP/.project delete mode 100644 demos/ARMCM4-STM32F407-LWIP/Makefile delete mode 100644 demos/ARMCM4-STM32F407-LWIP/chconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP/halconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP/lwipopts.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP/main.c delete mode 100644 demos/ARMCM4-STM32F407-LWIP/mcuconf.h delete mode 100644 demos/ARMCM4-STM32F407-LWIP/readme.txt delete mode 100644 demos/ARMCM4-STM32F407-LWIP/web/web.c delete mode 100644 demos/ARMCM4-STM32F407-LWIP/web/web.h delete mode 100644 demos/AVR-AT90CANx-GCC/Makefile delete mode 100644 demos/AVR-AT90CANx-GCC/chconf.h delete mode 100644 demos/AVR-AT90CANx-GCC/halconf.h delete mode 100644 demos/AVR-AT90CANx-GCC/main.c delete mode 100644 demos/AVR-AT90CANx-GCC/mcuconf.h delete mode 100644 demos/AVR-AT90CANx-GCC/readme.txt delete mode 100644 demos/AVR-ATmega128-GCC/Makefile delete mode 100644 demos/AVR-ATmega128-GCC/chconf.h delete mode 100644 demos/AVR-ATmega128-GCC/halconf.h delete mode 100644 demos/AVR-ATmega128-GCC/lcd.c delete mode 100644 demos/AVR-ATmega128-GCC/lcd.h delete mode 100644 demos/AVR-ATmega128-GCC/main.c delete mode 100644 demos/AVR-ATmega128-GCC/mcuconf.h delete mode 100644 demos/AVR-ATmega128-GCC/readme.txt delete mode 100644 demos/AVR-ArduinoMega-GCC/Makefile delete mode 100644 demos/AVR-ArduinoMega-GCC/chconf.h delete mode 100644 demos/AVR-ArduinoMega-GCC/halconf.h delete mode 100644 demos/AVR-ArduinoMega-GCC/main.c delete mode 100644 demos/AVR-ArduinoMega-GCC/mcuconf.h delete mode 100644 demos/AVR-ArduinoMega-GCC/readme.txt delete mode 100644 demos/MSP430-MSP430x1611-GCC/Makefile delete mode 100644 demos/MSP430-MSP430x1611-GCC/chconf.h delete mode 100644 demos/MSP430-MSP430x1611-GCC/halconf.h delete mode 100644 demos/MSP430-MSP430x1611-GCC/main.c delete mode 100644 demos/MSP430-MSP430x1611-GCC/mcuconf.h delete mode 100644 demos/MSP430-MSP430x1611-GCC/memory.x delete mode 100644 demos/MSP430-MSP430x1611-GCC/msp430.x delete mode 100644 demos/MSP430-MSP430x1611-GCC/periph.x delete mode 100644 demos/MSP430-MSP430x1611-GCC/readme.txt delete mode 100644 demos/PPC-SPC560P-GCC/.cproject delete mode 100644 demos/PPC-SPC560P-GCC/.project delete mode 100644 demos/PPC-SPC560P-GCC/Makefile delete mode 100644 demos/PPC-SPC560P-GCC/chconf.h delete mode 100644 demos/PPC-SPC560P-GCC/halconf.h delete mode 100644 demos/PPC-SPC560P-GCC/main.c delete mode 100644 demos/PPC-SPC560P-GCC/mcuconf.h delete mode 100644 demos/PPC-SPC563M-GCC/.cproject delete mode 100644 demos/PPC-SPC563M-GCC/.project delete mode 100644 demos/PPC-SPC563M-GCC/Makefile delete mode 100644 demos/PPC-SPC563M-GCC/chconf.h delete mode 100644 demos/PPC-SPC563M-GCC/halconf.h delete mode 100644 demos/PPC-SPC563M-GCC/main.c delete mode 100644 demos/Posix-GCC/Makefile delete mode 100644 demos/Posix-GCC/chconf.h delete mode 100644 demos/Posix-GCC/halconf.h delete mode 100644 demos/Posix-GCC/main.c delete mode 100644 demos/Posix-GCC/readme.txt delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/ChibiOS-RT.stw delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/cosmic.stp delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/vectors.c delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/demo/chconf.h delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/demo/halconf.h delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/demo/main.c delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/demo/mcuconf.h delete mode 100644 demos/STM8L-STM8L152-DISCOVERY-STVD/raisonance/raisonance.stp delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-IAR/ch.ewp delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-IAR/ch.eww delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-IAR/chconf.h delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-IAR/halconf.h delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-IAR/main.c delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-IAR/mcuconf.h delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/ChibiOS-RT.stw delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/cosmic.stp delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/vectors.c delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/demo/chconf.h delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/demo/halconf.h delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/demo/main.c delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/demo/mcuconf.h delete mode 100644 demos/STM8S-STM8S105-DISCOVERY-STVD/raisonance/raisonance.stp delete mode 100644 demos/STM8S-STM8S208-RC/ch.rapp delete mode 100644 demos/STM8S-STM8S208-RC/ch.rprj delete mode 100644 demos/STM8S-STM8S208-RC/chconf.h delete mode 100644 demos/STM8S-STM8S208-RC/halconf.h delete mode 100644 demos/STM8S-STM8S208-RC/main.c delete mode 100644 demos/STM8S-STM8S208-RC/mcuconf.h delete mode 100644 demos/STM8S-STM8S208-RC/readme.txt delete mode 100644 demos/Win32-MinGW/Makefile delete mode 100644 demos/Win32-MinGW/chconf.h delete mode 100644 demos/Win32-MinGW/halconf.h delete mode 100644 demos/Win32-MinGW/main.c delete mode 100644 demos/Win32-MinGW/readme.txt delete mode 100644 docs/Doxyfile_chm delete mode 100644 docs/Doxyfile_html delete mode 100644 docs/html/logo_small.png delete mode 100644 docs/index.html delete mode 100644 docs/readme.txt delete mode 100644 docs/reports/AT91SAM7X-48-ARM.txt delete mode 100644 docs/reports/AT91SAM7X-48-THUMB.txt delete mode 100644 docs/reports/ATmega128-16.txt delete mode 100644 docs/reports/LPC1114-48-GCC.txt delete mode 100644 docs/reports/LPC1114-48-RVCT.txt delete mode 100644 docs/reports/LPC1343-72-GCC.txt delete mode 100644 docs/reports/LPC1343-72-IAR.txt delete mode 100644 docs/reports/LPC1343-72-RVCT.txt delete mode 100644 docs/reports/LPC2148-48-ARM.txt delete mode 100644 docs/reports/LPC2148-48-THUMB.txt delete mode 100644 docs/reports/MSP430F1611-0.75.txt delete mode 100644 docs/reports/MSP430F1611-8.txt delete mode 100644 docs/reports/SPC563M64-80.txt delete mode 100644 docs/reports/STM32F051-48-GCC.txt delete mode 100644 docs/reports/STM32F100-24-GCC.txt delete mode 100644 docs/reports/STM32F100-24-IAR.txt delete mode 100644 docs/reports/STM32F100-24-RVCT.txt delete mode 100644 docs/reports/STM32F103-48-GCC.txt delete mode 100644 docs/reports/STM32F103-72-GCC-compact.txt delete mode 100644 docs/reports/STM32F103-72-GCC.txt delete mode 100644 docs/reports/STM32F103-72-IAR-compact.txt delete mode 100644 docs/reports/STM32F103-72-IAR.txt delete mode 100644 docs/reports/STM32F103-72-RVCT-compact.txt delete mode 100644 docs/reports/STM32F103-72-RVCT.txt delete mode 100644 docs/reports/STM32F107-72-GCC.txt delete mode 100644 docs/reports/STM32F407-168-GCC-FPU.txt delete mode 100644 docs/reports/STM32F407-168-GCC.txt delete mode 100644 docs/reports/STM32F407-168-IAR.txt delete mode 100644 docs/reports/STM32F407-168-RVCT.txt delete mode 100644 docs/reports/STM32L152-32-GCC.txt delete mode 100644 docs/reports/STM32L152-32-IAR.txt delete mode 100644 docs/reports/STM32L152-32-RVCT.txt delete mode 100644 docs/reports/STM8L152-16-Cosmic.txt delete mode 100644 docs/reports/STM8L152-16-Raisonance.txt delete mode 100644 docs/reports/STM8S105-16-Cosmic.txt delete mode 100644 docs/reports/STM8S105-16-Raisonance.txt delete mode 100644 docs/reports/STM8S208-16-Raisonance.txt delete mode 100644 docs/reports/build.txt delete mode 100644 docs/reports/coverage.txt delete mode 100644 docs/reports/kernel.txt delete mode 100644 docs/rsc/custom.css delete mode 100644 docs/rsc/footer_chm.html delete mode 100644 docs/rsc/footer_html.html delete mode 100644 docs/rsc/header_chm.html delete mode 100644 docs/rsc/header_html.html delete mode 100644 docs/rsc/layout.xml delete mode 100644 docs/rsc/logo.png delete mode 100644 docs/rsc/workspace.png delete mode 100644 docs/rsc/workspace.svg delete mode 100644 docs/src/concepts.dox delete mode 100644 docs/src/main.dox delete mode 100644 ext/ext.dox delete mode 100644 ext/fatfs-0.9-patched.zip delete mode 100644 ext/lwip-1.4.0.zip delete mode 100644 ext/readme.txt delete mode 100644 ext/uip-1.0.patches.zip delete mode 100644 ext/uip-1.0.tar.gz delete mode 100644 os/hal/dox/adc.dox delete mode 100644 os/hal/dox/can.dox delete mode 100644 os/hal/dox/ext.dox delete mode 100644 os/hal/dox/gpt.dox delete mode 100644 os/hal/dox/hal.dox delete mode 100644 os/hal/dox/i2c.dox delete mode 100644 os/hal/dox/i2s.dox delete mode 100644 os/hal/dox/icu.dox delete mode 100644 os/hal/dox/mac.dox delete mode 100644 os/hal/dox/mmc_spi.dox delete mode 100644 os/hal/dox/pal.dox delete mode 100644 os/hal/dox/pwm.dox delete mode 100644 os/hal/dox/rtc.dox delete mode 100644 os/hal/dox/sdc.dox delete mode 100644 os/hal/dox/serial.dox delete mode 100644 os/hal/dox/serial_usb.dox delete mode 100644 os/hal/dox/spi.dox delete mode 100644 os/hal/dox/tm.dox delete mode 100644 os/hal/dox/uart.dox delete mode 100644 os/hal/dox/usb.dox delete mode 100644 os/hal/hal.dox delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S128.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S256.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S512.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S64.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X128.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X256.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X512.h delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/aic.c delete mode 100644 os/hal/platforms/AT91SAM7/at91lib/aic.h delete mode 100644 os/hal/platforms/AT91SAM7/at91sam7.h delete mode 100644 os/hal/platforms/AT91SAM7/at91sam7_mii.c delete mode 100644 os/hal/platforms/AT91SAM7/at91sam7_mii.h delete mode 100644 os/hal/platforms/AT91SAM7/ext_lld.c delete mode 100644 os/hal/platforms/AT91SAM7/ext_lld.h delete mode 100644 os/hal/platforms/AT91SAM7/hal_lld.c delete mode 100644 os/hal/platforms/AT91SAM7/hal_lld.h delete mode 100644 os/hal/platforms/AT91SAM7/mac_lld.c delete mode 100644 os/hal/platforms/AT91SAM7/mac_lld.h delete mode 100644 os/hal/platforms/AT91SAM7/pal_lld.c delete mode 100644 os/hal/platforms/AT91SAM7/pal_lld.h delete mode 100644 os/hal/platforms/AT91SAM7/platform.dox delete mode 100644 os/hal/platforms/AT91SAM7/platform.mk delete mode 100644 os/hal/platforms/AT91SAM7/serial_lld.c delete mode 100644 os/hal/platforms/AT91SAM7/serial_lld.h delete mode 100644 os/hal/platforms/AT91SAM7/spi_lld.c delete mode 100644 os/hal/platforms/AT91SAM7/spi_lld.h delete mode 100644 os/hal/platforms/AVR/hal_lld.c delete mode 100644 os/hal/platforms/AVR/hal_lld.h delete mode 100644 os/hal/platforms/AVR/i2c_lld.c delete mode 100644 os/hal/platforms/AVR/i2c_lld.h delete mode 100644 os/hal/platforms/AVR/pal_lld.c delete mode 100644 os/hal/platforms/AVR/pal_lld.h delete mode 100644 os/hal/platforms/AVR/platform.dox delete mode 100644 os/hal/platforms/AVR/platform.mk delete mode 100644 os/hal/platforms/AVR/serial_lld.c delete mode 100644 os/hal/platforms/AVR/serial_lld.h delete mode 100644 os/hal/platforms/LPC11Uxx/LPC11Uxx.h delete mode 100644 os/hal/platforms/LPC11Uxx/gpt_lld.c delete mode 100644 os/hal/platforms/LPC11Uxx/gpt_lld.h delete mode 100644 os/hal/platforms/LPC11Uxx/hal_lld.c delete mode 100644 os/hal/platforms/LPC11Uxx/hal_lld.h delete mode 100644 os/hal/platforms/LPC11Uxx/pal_lld.c delete mode 100644 os/hal/platforms/LPC11Uxx/pal_lld.h delete mode 100644 os/hal/platforms/LPC11Uxx/platform.mk delete mode 100644 os/hal/platforms/LPC11Uxx/serial_lld.c delete mode 100644 os/hal/platforms/LPC11Uxx/serial_lld.h delete mode 100644 os/hal/platforms/LPC11Uxx/spi_lld.c delete mode 100644 os/hal/platforms/LPC11Uxx/spi_lld.h delete mode 100644 os/hal/platforms/LPC11Uxx/system_LPC11Uxx.h delete mode 100644 os/hal/platforms/LPC11xx/LPC11xx.h delete mode 100644 os/hal/platforms/LPC11xx/gpt_lld.c delete mode 100644 os/hal/platforms/LPC11xx/gpt_lld.h delete mode 100644 os/hal/platforms/LPC11xx/hal_lld.c delete mode 100644 os/hal/platforms/LPC11xx/hal_lld.h delete mode 100644 os/hal/platforms/LPC11xx/pal_lld.c delete mode 100644 os/hal/platforms/LPC11xx/pal_lld.h delete mode 100644 os/hal/platforms/LPC11xx/platform.dox delete mode 100644 os/hal/platforms/LPC11xx/platform.mk delete mode 100644 os/hal/platforms/LPC11xx/serial_lld.c delete mode 100644 os/hal/platforms/LPC11xx/serial_lld.h delete mode 100644 os/hal/platforms/LPC11xx/spi_lld.c delete mode 100644 os/hal/platforms/LPC11xx/spi_lld.h delete mode 100644 os/hal/platforms/LPC11xx/system_LPC11xx.h delete mode 100644 os/hal/platforms/LPC13xx/LPC13xx.h delete mode 100644 os/hal/platforms/LPC13xx/gpt_lld.c delete mode 100644 os/hal/platforms/LPC13xx/gpt_lld.h delete mode 100644 os/hal/platforms/LPC13xx/hal_lld.c delete mode 100644 os/hal/platforms/LPC13xx/hal_lld.h delete mode 100644 os/hal/platforms/LPC13xx/pal_lld.c delete mode 100644 os/hal/platforms/LPC13xx/pal_lld.h delete mode 100644 os/hal/platforms/LPC13xx/platform.dox delete mode 100644 os/hal/platforms/LPC13xx/platform.mk delete mode 100644 os/hal/platforms/LPC13xx/serial_lld.c delete mode 100644 os/hal/platforms/LPC13xx/serial_lld.h delete mode 100644 os/hal/platforms/LPC13xx/spi_lld.c delete mode 100644 os/hal/platforms/LPC13xx/spi_lld.h delete mode 100644 os/hal/platforms/LPC13xx/system_LPC13xx.h delete mode 100644 os/hal/platforms/LPC214x/hal_lld.c delete mode 100644 os/hal/platforms/LPC214x/hal_lld.h delete mode 100644 os/hal/platforms/LPC214x/lpc214x.h delete mode 100644 os/hal/platforms/LPC214x/pal_lld.c delete mode 100644 os/hal/platforms/LPC214x/pal_lld.h delete mode 100644 os/hal/platforms/LPC214x/platform.dox delete mode 100644 os/hal/platforms/LPC214x/platform.mk delete mode 100644 os/hal/platforms/LPC214x/serial_lld.c delete mode 100644 os/hal/platforms/LPC214x/serial_lld.h delete mode 100644 os/hal/platforms/LPC214x/spi_lld.c delete mode 100644 os/hal/platforms/LPC214x/spi_lld.h delete mode 100644 os/hal/platforms/LPC214x/vic.c delete mode 100644 os/hal/platforms/LPC214x/vic.h delete mode 100644 os/hal/platforms/MSP430/hal_lld.c delete mode 100644 os/hal/platforms/MSP430/hal_lld.h delete mode 100644 os/hal/platforms/MSP430/pal_lld.c delete mode 100644 os/hal/platforms/MSP430/pal_lld.h delete mode 100644 os/hal/platforms/MSP430/platform.dox delete mode 100644 os/hal/platforms/MSP430/platform.mk delete mode 100644 os/hal/platforms/MSP430/serial_lld.c delete mode 100644 os/hal/platforms/MSP430/serial_lld.h delete mode 100644 os/hal/platforms/Posix/console.c delete mode 100644 os/hal/platforms/Posix/console.h delete mode 100644 os/hal/platforms/Posix/hal_lld.c delete mode 100644 os/hal/platforms/Posix/hal_lld.h delete mode 100644 os/hal/platforms/Posix/pal_lld.c delete mode 100644 os/hal/platforms/Posix/pal_lld.h delete mode 100644 os/hal/platforms/Posix/platform.mk delete mode 100644 os/hal/platforms/Posix/serial_lld.c delete mode 100644 os/hal/platforms/Posix/serial_lld.h delete mode 100644 os/hal/platforms/SPC560Pxx/hal_lld.c delete mode 100644 os/hal/platforms/SPC560Pxx/hal_lld.h delete mode 100644 os/hal/platforms/SPC560Pxx/platform.mk delete mode 100644 os/hal/platforms/SPC560Pxx/spc560p_registry.h delete mode 100644 os/hal/platforms/SPC560Pxx/typedefs.h delete mode 100644 os/hal/platforms/SPC560Pxx/xpc560p.h delete mode 100644 os/hal/platforms/SPC56x/hal_lld.c delete mode 100644 os/hal/platforms/SPC56x/hal_lld.h delete mode 100644 os/hal/platforms/SPC56x/mpc563m.h delete mode 100644 os/hal/platforms/SPC56x/platform.dox delete mode 100644 os/hal/platforms/SPC56x/platform.mk delete mode 100644 os/hal/platforms/SPC56x/serial_lld.c delete mode 100644 os/hal/platforms/SPC56x/serial_lld.h delete mode 100644 os/hal/platforms/SPC56x/typedefs.h delete mode 100644 os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c delete mode 100644 os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h delete mode 100644 os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c delete mode 100644 os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h delete mode 100644 os/hal/platforms/STM32/GPIOv1/pal_lld.c delete mode 100644 os/hal/platforms/STM32/GPIOv1/pal_lld.h delete mode 100644 os/hal/platforms/STM32/GPIOv2/pal_lld.c delete mode 100644 os/hal/platforms/STM32/GPIOv2/pal_lld.h delete mode 100644 os/hal/platforms/STM32/I2Cv1/i2c_lld.c delete mode 100644 os/hal/platforms/STM32/I2Cv1/i2c_lld.h delete mode 100644 os/hal/platforms/STM32/OTGv1/stm32_otg.h delete mode 100644 os/hal/platforms/STM32/OTGv1/usb_lld.c delete mode 100644 os/hal/platforms/STM32/OTGv1/usb_lld.h delete mode 100644 os/hal/platforms/STM32/RTCv1/rtc_lld.c delete mode 100644 os/hal/platforms/STM32/RTCv1/rtc_lld.h delete mode 100644 os/hal/platforms/STM32/RTCv2/rtc_lld.c delete mode 100644 os/hal/platforms/STM32/RTCv2/rtc_lld.h delete mode 100644 os/hal/platforms/STM32/USARTv1/uart_lld.c delete mode 100644 os/hal/platforms/STM32/USARTv1/uart_lld.h delete mode 100644 os/hal/platforms/STM32/USARTv2/uart_lld.c delete mode 100644 os/hal/platforms/STM32/USARTv2/uart_lld.h delete mode 100644 os/hal/platforms/STM32/USBv1/stm32_usb.h delete mode 100644 os/hal/platforms/STM32/USBv1/usb_lld.c delete mode 100644 os/hal/platforms/STM32/USBv1/usb_lld.h delete mode 100644 os/hal/platforms/STM32/can_lld.c delete mode 100644 os/hal/platforms/STM32/can_lld.h delete mode 100644 os/hal/platforms/STM32/ext_lld.c delete mode 100644 os/hal/platforms/STM32/ext_lld.h delete mode 100644 os/hal/platforms/STM32/gpt_lld.c delete mode 100644 os/hal/platforms/STM32/gpt_lld.h delete mode 100644 os/hal/platforms/STM32/i2s_lld.c delete mode 100644 os/hal/platforms/STM32/i2s_lld.h delete mode 100644 os/hal/platforms/STM32/icu_lld.c delete mode 100644 os/hal/platforms/STM32/icu_lld.h delete mode 100644 os/hal/platforms/STM32/mac_lld.c delete mode 100644 os/hal/platforms/STM32/mac_lld.h delete mode 100644 os/hal/platforms/STM32/pwm_lld.c delete mode 100644 os/hal/platforms/STM32/pwm_lld.h delete mode 100644 os/hal/platforms/STM32/sdc_lld.c delete mode 100644 os/hal/platforms/STM32/sdc_lld.h delete mode 100644 os/hal/platforms/STM32/serial_lld.c delete mode 100644 os/hal/platforms/STM32/serial_lld.h delete mode 100644 os/hal/platforms/STM32/spi_lld.c delete mode 100644 os/hal/platforms/STM32/spi_lld.h delete mode 100644 os/hal/platforms/STM32/stm32.h delete mode 100644 os/hal/platforms/STM32F0xx/adc_lld.c delete mode 100644 os/hal/platforms/STM32F0xx/adc_lld.h delete mode 100644 os/hal/platforms/STM32F0xx/ext_lld_isr.c delete mode 100644 os/hal/platforms/STM32F0xx/ext_lld_isr.h delete mode 100644 os/hal/platforms/STM32F0xx/hal_lld.c delete mode 100644 os/hal/platforms/STM32F0xx/hal_lld.h delete mode 100644 os/hal/platforms/STM32F0xx/platform.dox delete mode 100644 os/hal/platforms/STM32F0xx/platform.mk delete mode 100644 os/hal/platforms/STM32F0xx/stm32_dma.c delete mode 100644 os/hal/platforms/STM32F0xx/stm32_dma.h delete mode 100644 os/hal/platforms/STM32F0xx/stm32_isr.h delete mode 100644 os/hal/platforms/STM32F0xx/stm32_rcc.h delete mode 100644 os/hal/platforms/STM32F0xx/stm32f0xx.h delete mode 100644 os/hal/platforms/STM32F1xx/adc_lld.c delete mode 100644 os/hal/platforms/STM32F1xx/adc_lld.h delete mode 100644 os/hal/platforms/STM32F1xx/ext_lld_isr.c delete mode 100644 os/hal/platforms/STM32F1xx/ext_lld_isr.h delete mode 100644 os/hal/platforms/STM32F1xx/hal_lld.c delete mode 100644 os/hal/platforms/STM32F1xx/hal_lld.h delete mode 100644 os/hal/platforms/STM32F1xx/hal_lld_f100.h delete mode 100644 os/hal/platforms/STM32F1xx/hal_lld_f103.h delete mode 100644 os/hal/platforms/STM32F1xx/hal_lld_f105_f107.h delete mode 100644 os/hal/platforms/STM32F1xx/platform.dox delete mode 100644 os/hal/platforms/STM32F1xx/platform.mk delete mode 100644 os/hal/platforms/STM32F1xx/platform_f105_f107.mk delete mode 100644 os/hal/platforms/STM32F1xx/stm32_dma.c delete mode 100644 os/hal/platforms/STM32F1xx/stm32_dma.h delete mode 100644 os/hal/platforms/STM32F1xx/stm32_isr.h delete mode 100644 os/hal/platforms/STM32F1xx/stm32_rcc.h delete mode 100644 os/hal/platforms/STM32F1xx/stm32f10x.h delete mode 100644 os/hal/platforms/STM32F3xx/hal_lld.h delete mode 100644 os/hal/platforms/STM32F3xx/platform.mk delete mode 100644 os/hal/platforms/STM32F3xx/stm32f30x.h delete mode 100644 os/hal/platforms/STM32F4xx/adc_lld.c delete mode 100644 os/hal/platforms/STM32F4xx/adc_lld.h delete mode 100644 os/hal/platforms/STM32F4xx/ext_lld_isr.c delete mode 100644 os/hal/platforms/STM32F4xx/ext_lld_isr.h delete mode 100644 os/hal/platforms/STM32F4xx/hal_lld.c delete mode 100644 os/hal/platforms/STM32F4xx/hal_lld.h delete mode 100644 os/hal/platforms/STM32F4xx/platform.dox delete mode 100644 os/hal/platforms/STM32F4xx/platform.mk delete mode 100644 os/hal/platforms/STM32F4xx/stm32_dma.c delete mode 100644 os/hal/platforms/STM32F4xx/stm32_dma.h delete mode 100644 os/hal/platforms/STM32F4xx/stm32_isr.h delete mode 100644 os/hal/platforms/STM32F4xx/stm32_rcc.h delete mode 100644 os/hal/platforms/STM32F4xx/stm32f2xx.h delete mode 100644 os/hal/platforms/STM32F4xx/stm32f4xx.h delete mode 100644 os/hal/platforms/STM32L1xx/adc_lld.c delete mode 100644 os/hal/platforms/STM32L1xx/adc_lld.h delete mode 100644 os/hal/platforms/STM32L1xx/ext_lld_isr.c delete mode 100644 os/hal/platforms/STM32L1xx/ext_lld_isr.h delete mode 100644 os/hal/platforms/STM32L1xx/hal_lld.c delete mode 100644 os/hal/platforms/STM32L1xx/hal_lld.h delete mode 100644 os/hal/platforms/STM32L1xx/platform.dox delete mode 100644 os/hal/platforms/STM32L1xx/platform.mk delete mode 100644 os/hal/platforms/STM32L1xx/stm32_dma.c delete mode 100644 os/hal/platforms/STM32L1xx/stm32_dma.h delete mode 100644 os/hal/platforms/STM32L1xx/stm32_isr.h delete mode 100644 os/hal/platforms/STM32L1xx/stm32_rcc.h delete mode 100644 os/hal/platforms/STM32L1xx/stm32l1xx.h delete mode 100644 os/hal/platforms/STM8L/hal_lld.c delete mode 100644 os/hal/platforms/STM8L/hal_lld.h delete mode 100644 os/hal/platforms/STM8L/hal_lld_stm8l_hd.h delete mode 100644 os/hal/platforms/STM8L/hal_lld_stm8l_md.h delete mode 100644 os/hal/platforms/STM8L/hal_lld_stm8l_mdp.h delete mode 100644 os/hal/platforms/STM8L/pal_lld.c delete mode 100644 os/hal/platforms/STM8L/pal_lld.h delete mode 100644 os/hal/platforms/STM8L/platform.dox delete mode 100644 os/hal/platforms/STM8L/serial_lld.c delete mode 100644 os/hal/platforms/STM8L/serial_lld.h delete mode 100644 os/hal/platforms/STM8L/shared_isr.c delete mode 100644 os/hal/platforms/STM8L/stm8l15x.h delete mode 100644 os/hal/platforms/STM8S/hal_lld.c delete mode 100644 os/hal/platforms/STM8S/hal_lld.h delete mode 100644 os/hal/platforms/STM8S/pal_lld.c delete mode 100644 os/hal/platforms/STM8S/pal_lld.h delete mode 100644 os/hal/platforms/STM8S/platform.dox delete mode 100644 os/hal/platforms/STM8S/serial_lld.c delete mode 100644 os/hal/platforms/STM8S/serial_lld.h delete mode 100644 os/hal/platforms/STM8S/spi_lld.c delete mode 100644 os/hal/platforms/STM8S/spi_lld.h delete mode 100644 os/hal/platforms/STM8S/stm8s.h delete mode 100644 os/hal/platforms/STM8S/stm8s_type.h delete mode 100644 os/hal/platforms/Win32/console.c delete mode 100644 os/hal/platforms/Win32/console.h delete mode 100644 os/hal/platforms/Win32/hal_lld.c delete mode 100644 os/hal/platforms/Win32/hal_lld.h delete mode 100644 os/hal/platforms/Win32/pal_lld.c delete mode 100644 os/hal/platforms/Win32/pal_lld.h delete mode 100644 os/hal/platforms/Win32/platform.mk delete mode 100644 os/hal/platforms/Win32/serial_lld.c delete mode 100644 os/hal/platforms/Win32/serial_lld.h delete mode 100644 os/hal/platforms/platforms.dox delete mode 100644 os/ports/GCC/ARM/AT91SAM7/armparams.h delete mode 100644 os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7S256.ld delete mode 100644 os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7X256.ld delete mode 100644 os/ports/GCC/ARM/AT91SAM7/port.mk delete mode 100644 os/ports/GCC/ARM/AT91SAM7/vectors.s delete mode 100644 os/ports/GCC/ARM/AT91SAM7/wfi.h delete mode 100644 os/ports/GCC/ARM/LPC214x/armparams.h delete mode 100644 os/ports/GCC/ARM/LPC214x/ld/LPC2148.ld delete mode 100644 os/ports/GCC/ARM/LPC214x/port.mk delete mode 100644 os/ports/GCC/ARM/LPC214x/vectors.s delete mode 100644 os/ports/GCC/ARM/LPC214x/wfi.h delete mode 100644 os/ports/GCC/ARMCMx/LPC11xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/LPC11xx/ld/LPC1114.ld delete mode 100644 os/ports/GCC/ARMCMx/LPC11xx/ld/LPC11U14.ld delete mode 100644 os/ports/GCC/ARMCMx/LPC11xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/LPC11xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/LPC13xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/LPC13xx/ld/LPC1343.ld delete mode 100644 os/ports/GCC/ARMCMx/LPC13xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/LPC13xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/STM32F0xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/STM32F0xx/ld/STM32F051x8.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F0xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/STM32F0xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F100xB.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xB.ld delete mode 100755 os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xD.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xE.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xG.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F107xC.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/STM32F1xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/STM32F2xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F205xB.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F207xG.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F2xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/STM32F2xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/STM32F3xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/STM32F3xx/ld/STM32F303xC.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F3xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/STM32F3xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/STM32F4xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F405xG.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG_CCM.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32F4xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/STM32F4xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/STM32L1xx/cmparams.h delete mode 100644 os/ports/GCC/ARMCMx/STM32L1xx/ld/STM32L152xB.ld delete mode 100644 os/ports/GCC/ARMCMx/STM32L1xx/port.mk delete mode 100644 os/ports/GCC/ARMCMx/STM32L1xx/vectors.c delete mode 100644 os/ports/GCC/ARMCMx/chcore.c delete mode 100644 os/ports/GCC/ARMCMx/chcore.h delete mode 100644 os/ports/GCC/ARMCMx/chcore_v6m.c delete mode 100644 os/ports/GCC/ARMCMx/chcore_v6m.h delete mode 100644 os/ports/GCC/ARMCMx/chcore_v7m.c delete mode 100644 os/ports/GCC/ARMCMx/chcore_v7m.h delete mode 100644 os/ports/GCC/ARMCMx/chtypes.h delete mode 100644 os/ports/GCC/ARMCMx/crt0.c delete mode 100644 os/ports/GCC/ARMCMx/port.dox delete mode 100644 os/ports/GCC/ARMCMx/rules.mk delete mode 100644 os/ports/GCC/AVR/chcore.c delete mode 100644 os/ports/GCC/AVR/chcore.h delete mode 100644 os/ports/GCC/AVR/chtypes.h delete mode 100644 os/ports/GCC/AVR/port.dox delete mode 100644 os/ports/GCC/AVR/port.mk delete mode 100644 os/ports/GCC/MSP430/chcore.c delete mode 100644 os/ports/GCC/MSP430/chcore.h delete mode 100644 os/ports/GCC/MSP430/chtypes.h delete mode 100644 os/ports/GCC/MSP430/port.dox delete mode 100644 os/ports/GCC/MSP430/port.mk delete mode 100644 os/ports/GCC/MSP430/rules.mk delete mode 100644 os/ports/GCC/PPC/SPC560Pxx/bam.s delete mode 100644 os/ports/GCC/PPC/SPC560Pxx/ivor.s delete mode 100644 os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld delete mode 100644 os/ports/GCC/PPC/SPC560Pxx/port.mk delete mode 100644 os/ports/GCC/PPC/SPC560Pxx/ppcparams.h delete mode 100644 os/ports/GCC/PPC/SPC560Pxx/vectors.s delete mode 100644 os/ports/GCC/PPC/SPC563Mxx/ivor.s delete mode 100644 os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld delete mode 100644 os/ports/GCC/PPC/SPC563Mxx/port.mk delete mode 100644 os/ports/GCC/PPC/SPC563Mxx/ppcparams.h delete mode 100644 os/ports/GCC/PPC/SPC563Mxx/vectors.s delete mode 100644 os/ports/GCC/PPC/chcore.c delete mode 100644 os/ports/GCC/PPC/chcore.h delete mode 100644 os/ports/GCC/PPC/chtypes.h delete mode 100644 os/ports/GCC/PPC/crt0.s delete mode 100644 os/ports/GCC/PPC/port.dox delete mode 100644 os/ports/GCC/PPC/rules.mk delete mode 100644 os/ports/GCC/SIMIA32/chcore.c delete mode 100644 os/ports/GCC/SIMIA32/chcore.h delete mode 100644 os/ports/GCC/SIMIA32/chtypes.h delete mode 100644 os/ports/GCC/SIMIA32/port.mk delete mode 100644 os/ports/IAR/ARMCMx/LPC11xx/cmparams.h delete mode 100644 os/ports/IAR/ARMCMx/LPC11xx/vectors.s delete mode 100644 os/ports/IAR/ARMCMx/LPC13xx/cmparams.h delete mode 100644 os/ports/IAR/ARMCMx/LPC13xx/vectors.s delete mode 100644 os/ports/IAR/ARMCMx/STM32F1xx/cmparams.h delete mode 100644 os/ports/IAR/ARMCMx/STM32F1xx/vectors.s delete mode 100644 os/ports/IAR/ARMCMx/STM32F4xx/cmparams.h delete mode 100644 os/ports/IAR/ARMCMx/STM32F4xx/vectors.s delete mode 100644 os/ports/IAR/ARMCMx/STM32L1xx/cmparams.h delete mode 100644 os/ports/IAR/ARMCMx/STM32L1xx/vectors.s delete mode 100644 os/ports/IAR/ARMCMx/chcore.c delete mode 100644 os/ports/IAR/ARMCMx/chcore.h delete mode 100644 os/ports/IAR/ARMCMx/chcore_v6m.c delete mode 100644 os/ports/IAR/ARMCMx/chcore_v6m.h delete mode 100644 os/ports/IAR/ARMCMx/chcore_v7m.c delete mode 100644 os/ports/IAR/ARMCMx/chcore_v7m.h delete mode 100644 os/ports/IAR/ARMCMx/chcoreasm_v6m.s delete mode 100644 os/ports/IAR/ARMCMx/chcoreasm_v7m.s delete mode 100644 os/ports/IAR/ARMCMx/chtypes.h delete mode 100644 os/ports/IAR/ARMCMx/cstartup.s delete mode 100644 os/ports/IAR/ARMCMx/port.dox delete mode 100644 os/ports/IAR/STM8/chcore.c delete mode 100644 os/ports/IAR/STM8/chcore.h delete mode 100644 os/ports/IAR/STM8/chcore_stm8.s delete mode 100644 os/ports/IAR/STM8/chtypes.h delete mode 100644 os/ports/IAR/STM8/port.dox delete mode 100644 os/ports/RC/STM8/chcore.c delete mode 100644 os/ports/RC/STM8/chcore.h delete mode 100644 os/ports/RC/STM8/chtypes.h delete mode 100644 os/ports/RC/STM8/port.dox delete mode 100644 os/ports/RVCT/ARMCMx/LPC11xx/cmparams.h delete mode 100644 os/ports/RVCT/ARMCMx/LPC11xx/vectors.s delete mode 100644 os/ports/RVCT/ARMCMx/LPC13xx/cmparams.h delete mode 100644 os/ports/RVCT/ARMCMx/LPC13xx/vectors.s delete mode 100644 os/ports/RVCT/ARMCMx/STM32F1xx/cmparams.h delete mode 100644 os/ports/RVCT/ARMCMx/STM32F1xx/vectors.s delete mode 100644 os/ports/RVCT/ARMCMx/STM32F4xx/cmparams.h delete mode 100644 os/ports/RVCT/ARMCMx/STM32F4xx/vectors.s delete mode 100644 os/ports/RVCT/ARMCMx/STM32L1xx/cmparams.h delete mode 100644 os/ports/RVCT/ARMCMx/STM32L1xx/vectors.s delete mode 100644 os/ports/RVCT/ARMCMx/chcore.c delete mode 100644 os/ports/RVCT/ARMCMx/chcore.h delete mode 100644 os/ports/RVCT/ARMCMx/chcore_v6m.c delete mode 100644 os/ports/RVCT/ARMCMx/chcore_v6m.h delete mode 100644 os/ports/RVCT/ARMCMx/chcore_v7m.c delete mode 100644 os/ports/RVCT/ARMCMx/chcore_v7m.h delete mode 100644 os/ports/RVCT/ARMCMx/chcoreasm_v6m.s delete mode 100644 os/ports/RVCT/ARMCMx/chcoreasm_v7m.s delete mode 100644 os/ports/RVCT/ARMCMx/chtypes.h delete mode 100644 os/ports/RVCT/ARMCMx/cstartup.s delete mode 100644 os/ports/RVCT/ARMCMx/port.dox create mode 100644 os/ports/common/.empty delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/arm_common_tables.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/arm_math.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/core_cm0.h delete mode 100755 os/ports/common/ARMCMx/CMSIS/include/core_cm0plus.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/core_cm3.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/core_cm4.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/core_cm4_simd.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/core_cmFunc.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/include/core_cmInstr.h delete mode 100644 os/ports/common/ARMCMx/CMSIS/readme.txt delete mode 100644 os/ports/common/ARMCMx/nvic.c delete mode 100644 os/ports/common/ARMCMx/nvic.h delete mode 100644 os/ports/common/ARMCMx/port.dox create mode 100644 os/ports/cosmic/.empty delete mode 100644 os/ports/cosmic/STM8/chcore.c delete mode 100644 os/ports/cosmic/STM8/chcore.h delete mode 100644 os/ports/cosmic/STM8/chtypes.h delete mode 100644 os/ports/cosmic/STM8/port.dox delete mode 100644 test/coverage/Makefile delete mode 100644 test/coverage/chconf.h delete mode 100644 test/coverage/halconf.h delete mode 100644 test/coverage/main.c delete mode 100644 test/coverage/readme.txt delete mode 100644 test/test.c delete mode 100644 test/test.dox delete mode 100644 test/test.h delete mode 100644 test/test.mk delete mode 100644 test/testbmk.c delete mode 100644 test/testbmk.h delete mode 100644 test/testdyn.c delete mode 100644 test/testdyn.h delete mode 100644 test/testevt.c delete mode 100644 test/testevt.h delete mode 100644 test/testheap.c delete mode 100644 test/testheap.h delete mode 100644 test/testmbox.c delete mode 100644 test/testmbox.h delete mode 100644 test/testmsg.c delete mode 100644 test/testmsg.h delete mode 100644 test/testmtx.c delete mode 100644 test/testmtx.h delete mode 100644 test/testpools.c delete mode 100644 test/testpools.h delete mode 100644 test/testqueues.c delete mode 100644 test/testqueues.h delete mode 100644 test/testsem.c delete mode 100644 test/testsem.h delete mode 100644 test/testthd.c delete mode 100644 test/testthd.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/Makefile delete mode 100644 testhal/LPC11xx/IRQ_STORM/chconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/halconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/main.c delete mode 100644 testhal/LPC11xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/readme.txt delete mode 100644 testhal/LPC13xx/IRQ_STORM/Makefile delete mode 100644 testhal/LPC13xx/IRQ_STORM/chconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/halconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/main.c delete mode 100644 testhal/LPC13xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F0xx/ADC/Makefile delete mode 100644 testhal/STM32F0xx/ADC/chconf.h delete mode 100644 testhal/STM32F0xx/ADC/halconf.h delete mode 100644 testhal/STM32F0xx/ADC/main.c delete mode 100644 testhal/STM32F0xx/ADC/mcuconf.h delete mode 100644 testhal/STM32F0xx/ADC/readme.txt delete mode 100644 testhal/STM32F0xx/EXT/Makefile delete mode 100644 testhal/STM32F0xx/EXT/chconf.h delete mode 100644 testhal/STM32F0xx/EXT/halconf.h delete mode 100644 testhal/STM32F0xx/EXT/main.c delete mode 100644 testhal/STM32F0xx/EXT/mcuconf.h delete mode 100644 testhal/STM32F0xx/EXT/readme.txt delete mode 100644 testhal/STM32F0xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F0xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F0xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F0xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32F0xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F0xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F0xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32F0xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F0xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F0xx/PWM-ICU/main.c delete mode 100644 testhal/STM32F0xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F0xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F0xx/UART/Makefile delete mode 100644 testhal/STM32F0xx/UART/chconf.h delete mode 100644 testhal/STM32F0xx/UART/halconf.h delete mode 100644 testhal/STM32F0xx/UART/main.c delete mode 100644 testhal/STM32F0xx/UART/mcuconf.h delete mode 100644 testhal/STM32F0xx/UART/readme.txt delete mode 100644 testhal/STM32F1xx/ADC/Makefile delete mode 100644 testhal/STM32F1xx/ADC/chconf.h delete mode 100644 testhal/STM32F1xx/ADC/halconf.h delete mode 100644 testhal/STM32F1xx/ADC/main.c delete mode 100644 testhal/STM32F1xx/ADC/mcuconf.h delete mode 100644 testhal/STM32F1xx/ADC/readme.txt delete mode 100644 testhal/STM32F1xx/CAN/Makefile delete mode 100644 testhal/STM32F1xx/CAN/chconf.h delete mode 100644 testhal/STM32F1xx/CAN/halconf.h delete mode 100644 testhal/STM32F1xx/CAN/main.c delete mode 100644 testhal/STM32F1xx/CAN/mcuconf.h delete mode 100644 testhal/STM32F1xx/CAN/readme.txt delete mode 100644 testhal/STM32F1xx/EXT/Makefile delete mode 100644 testhal/STM32F1xx/EXT/chconf.h delete mode 100644 testhal/STM32F1xx/EXT/halconf.h delete mode 100644 testhal/STM32F1xx/EXT/main.c delete mode 100644 testhal/STM32F1xx/EXT/mcuconf.h delete mode 100644 testhal/STM32F1xx/EXT/readme.txt delete mode 100644 testhal/STM32F1xx/GPT/Makefile delete mode 100644 testhal/STM32F1xx/GPT/chconf.h delete mode 100644 testhal/STM32F1xx/GPT/halconf.h delete mode 100644 testhal/STM32F1xx/GPT/main.c delete mode 100644 testhal/STM32F1xx/GPT/mcuconf.h delete mode 100644 testhal/STM32F1xx/GPT/readme.txt delete mode 100644 testhal/STM32F1xx/I2C/Makefile delete mode 100644 testhal/STM32F1xx/I2C/chconf.h delete mode 100644 testhal/STM32F1xx/I2C/fake.c delete mode 100644 testhal/STM32F1xx/I2C/fake.h delete mode 100644 testhal/STM32F1xx/I2C/halconf.h delete mode 100644 testhal/STM32F1xx/I2C/i2c_pns.c delete mode 100644 testhal/STM32F1xx/I2C/i2c_pns.h delete mode 100644 testhal/STM32F1xx/I2C/lis3.c delete mode 100644 testhal/STM32F1xx/I2C/lis3.h delete mode 100644 testhal/STM32F1xx/I2C/main.c delete mode 100644 testhal/STM32F1xx/I2C/mcuconf.h delete mode 100644 testhal/STM32F1xx/I2C/tmp75.c delete mode 100644 testhal/STM32F1xx/I2C/tmp75.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F1xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32F1xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F1xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32F1xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F1xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F1xx/PWM-ICU/main.c delete mode 100644 testhal/STM32F1xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F1xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F1xx/RTC/Makefile delete mode 100644 testhal/STM32F1xx/RTC/chconf.h delete mode 100644 testhal/STM32F1xx/RTC/halconf.h delete mode 100644 testhal/STM32F1xx/RTC/main.c delete mode 100644 testhal/STM32F1xx/RTC/mcuconf.h delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/Makefile delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/chconf.h delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/ffconf.h delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/halconf.h delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/main.c delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/mcuconf.h delete mode 100755 testhal/STM32F1xx/RTC_FATTIME/readme.txt delete mode 100644 testhal/STM32F1xx/SDC/Makefile delete mode 100644 testhal/STM32F1xx/SDC/chconf.h delete mode 100644 testhal/STM32F1xx/SDC/halconf.h delete mode 100644 testhal/STM32F1xx/SDC/main.c delete mode 100644 testhal/STM32F1xx/SDC/mcuconf.h delete mode 100644 testhal/STM32F1xx/SDC/readme.txt delete mode 100644 testhal/STM32F1xx/SPI/Makefile delete mode 100644 testhal/STM32F1xx/SPI/chconf.h delete mode 100644 testhal/STM32F1xx/SPI/halconf.h delete mode 100644 testhal/STM32F1xx/SPI/main.c delete mode 100644 testhal/STM32F1xx/SPI/mcuconf.h delete mode 100644 testhal/STM32F1xx/SPI/readme.txt delete mode 100644 testhal/STM32F1xx/UART/Makefile delete mode 100644 testhal/STM32F1xx/UART/chconf.h delete mode 100644 testhal/STM32F1xx/UART/halconf.h delete mode 100644 testhal/STM32F1xx/UART/main.c delete mode 100644 testhal/STM32F1xx/UART/mcuconf.h delete mode 100644 testhal/STM32F1xx/UART/readme.txt delete mode 100644 testhal/STM32F1xx/USB_CDC/Makefile delete mode 100644 testhal/STM32F1xx/USB_CDC/chconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC/halconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC/main.c delete mode 100644 testhal/STM32F1xx/USB_CDC/mcuconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC/readme.txt delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/.cproject delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/.project delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/Makefile delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/chconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/halconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/main.c delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/mcuconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/readme.txt delete mode 100644 testhal/STM32F1xx/USB_MSC/Makefile delete mode 100644 testhal/STM32F1xx/USB_MSC/chconf.h delete mode 100644 testhal/STM32F1xx/USB_MSC/halconf.h delete mode 100644 testhal/STM32F1xx/USB_MSC/main.c delete mode 100644 testhal/STM32F1xx/USB_MSC/mcuconf.h delete mode 100644 testhal/STM32F4xx/ADC/Makefile delete mode 100644 testhal/STM32F4xx/ADC/chconf.h delete mode 100644 testhal/STM32F4xx/ADC/halconf.h delete mode 100644 testhal/STM32F4xx/ADC/main.c delete mode 100644 testhal/STM32F4xx/ADC/mcuconf.h delete mode 100644 testhal/STM32F4xx/ADC/readme.txt delete mode 100644 testhal/STM32F4xx/CAN/Makefile delete mode 100644 testhal/STM32F4xx/CAN/chconf.h delete mode 100644 testhal/STM32F4xx/CAN/halconf.h delete mode 100644 testhal/STM32F4xx/CAN/main.c delete mode 100644 testhal/STM32F4xx/CAN/mcuconf.h delete mode 100644 testhal/STM32F4xx/CAN/readme.txt delete mode 100644 testhal/STM32F4xx/DMA_STORM/Makefile delete mode 100644 testhal/STM32F4xx/DMA_STORM/chconf.h delete mode 100644 testhal/STM32F4xx/DMA_STORM/halconf.h delete mode 100644 testhal/STM32F4xx/DMA_STORM/main.c delete mode 100644 testhal/STM32F4xx/DMA_STORM/mcuconf.h delete mode 100644 testhal/STM32F4xx/EXT/Makefile delete mode 100644 testhal/STM32F4xx/EXT/chconf.h delete mode 100644 testhal/STM32F4xx/EXT/halconf.h delete mode 100644 testhal/STM32F4xx/EXT/main.c delete mode 100644 testhal/STM32F4xx/EXT/mcuconf.h delete mode 100644 testhal/STM32F4xx/EXT/readme.txt delete mode 100644 testhal/STM32F4xx/GPT/Makefile delete mode 100644 testhal/STM32F4xx/GPT/chconf.h delete mode 100644 testhal/STM32F4xx/GPT/halconf.h delete mode 100644 testhal/STM32F4xx/GPT/main.c delete mode 100644 testhal/STM32F4xx/GPT/mcuconf.h delete mode 100644 testhal/STM32F4xx/GPT/readme.txt delete mode 100644 testhal/STM32F4xx/I2C/Makefile delete mode 100644 testhal/STM32F4xx/I2C/chconf.h delete mode 100644 testhal/STM32F4xx/I2C/halconf.h delete mode 100644 testhal/STM32F4xx/I2C/main.c delete mode 100644 testhal/STM32F4xx/I2C/mcuconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F4xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp delete mode 100644 testhal/STM32F4xx/IRQ_STORM/iar/ch.eww delete mode 100644 testhal/STM32F4xx/IRQ_STORM/iar/ch.icf delete mode 100644 testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj delete mode 100644 testhal/STM32F4xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32F4xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/Makefile delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/main.c delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt delete mode 100644 testhal/STM32F4xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32F4xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F4xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F4xx/PWM-ICU/main.c delete mode 100644 testhal/STM32F4xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F4xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F4xx/RTC/Makefile delete mode 100644 testhal/STM32F4xx/RTC/chconf.h delete mode 100644 testhal/STM32F4xx/RTC/halconf.h delete mode 100644 testhal/STM32F4xx/RTC/main.c delete mode 100644 testhal/STM32F4xx/RTC/mcuconf.h delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/Makefile delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/chconf.h delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/ffconf.h delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/halconf.h delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/main.c delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/mcuconf.h delete mode 100755 testhal/STM32F4xx/RTC_FATTIME/readme.txt delete mode 100755 testhal/STM32F4xx/SDC/Makefile delete mode 100755 testhal/STM32F4xx/SDC/chconf.h delete mode 100755 testhal/STM32F4xx/SDC/csd.txt delete mode 100755 testhal/STM32F4xx/SDC/ffconf.h delete mode 100755 testhal/STM32F4xx/SDC/halconf.h delete mode 100755 testhal/STM32F4xx/SDC/main.c delete mode 100755 testhal/STM32F4xx/SDC/mcuconf.h delete mode 100755 testhal/STM32F4xx/SDC/readme.txt delete mode 100644 testhal/STM32F4xx/SPI/Makefile delete mode 100644 testhal/STM32F4xx/SPI/chconf.h delete mode 100644 testhal/STM32F4xx/SPI/halconf.h delete mode 100644 testhal/STM32F4xx/SPI/main.c delete mode 100644 testhal/STM32F4xx/SPI/mcuconf.h delete mode 100644 testhal/STM32F4xx/SPI/readme.txt delete mode 100644 testhal/STM32F4xx/UART/Makefile delete mode 100644 testhal/STM32F4xx/UART/chconf.h delete mode 100644 testhal/STM32F4xx/UART/halconf.h delete mode 100644 testhal/STM32F4xx/UART/main.c delete mode 100644 testhal/STM32F4xx/UART/mcuconf.h delete mode 100644 testhal/STM32F4xx/UART/readme.txt delete mode 100644 testhal/STM32F4xx/USB_CDC/.cproject delete mode 100644 testhal/STM32F4xx/USB_CDC/.project delete mode 100644 testhal/STM32F4xx/USB_CDC/Makefile delete mode 100644 testhal/STM32F4xx/USB_CDC/chconf.h delete mode 100644 testhal/STM32F4xx/USB_CDC/halconf.h delete mode 100644 testhal/STM32F4xx/USB_CDC/main.c delete mode 100644 testhal/STM32F4xx/USB_CDC/mcuconf.h delete mode 100644 testhal/STM32F4xx/USB_CDC/readme.txt delete mode 100644 testhal/STM32L1xx/ADC/Makefile delete mode 100644 testhal/STM32L1xx/ADC/chconf.h delete mode 100644 testhal/STM32L1xx/ADC/halconf.h delete mode 100644 testhal/STM32L1xx/ADC/main.c delete mode 100644 testhal/STM32L1xx/ADC/mcuconf.h delete mode 100644 testhal/STM32L1xx/ADC/readme.txt delete mode 100644 testhal/STM32L1xx/EXT/Makefile delete mode 100644 testhal/STM32L1xx/EXT/chconf.h delete mode 100644 testhal/STM32L1xx/EXT/halconf.h delete mode 100644 testhal/STM32L1xx/EXT/main.c delete mode 100644 testhal/STM32L1xx/EXT/mcuconf.h delete mode 100644 testhal/STM32L1xx/EXT/readme.txt delete mode 100644 testhal/STM32L1xx/GPT/Makefile delete mode 100644 testhal/STM32L1xx/GPT/chconf.h delete mode 100644 testhal/STM32L1xx/GPT/halconf.h delete mode 100644 testhal/STM32L1xx/GPT/main.c delete mode 100644 testhal/STM32L1xx/GPT/mcuconf.h delete mode 100644 testhal/STM32L1xx/GPT/readme.txt delete mode 100644 testhal/STM32L1xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32L1xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32L1xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32L1xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32L1xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32L1xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32L1xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32L1xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32L1xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32L1xx/PWM-ICU/main.c delete mode 100644 testhal/STM32L1xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32L1xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32L1xx/SPI/Makefile delete mode 100644 testhal/STM32L1xx/SPI/chconf.h delete mode 100644 testhal/STM32L1xx/SPI/halconf.h delete mode 100644 testhal/STM32L1xx/SPI/main.c delete mode 100644 testhal/STM32L1xx/SPI/mcuconf.h delete mode 100644 testhal/STM32L1xx/SPI/readme.txt delete mode 100644 testhal/STM32L1xx/UART/Makefile delete mode 100644 testhal/STM32L1xx/UART/chconf.h delete mode 100644 testhal/STM32L1xx/UART/halconf.h delete mode 100644 testhal/STM32L1xx/UART/main.c delete mode 100644 testhal/STM32L1xx/UART/mcuconf.h delete mode 100644 testhal/STM32L1xx/UART/readme.txt delete mode 100644 testhal/STM8S/SPI/ChibiOS-RT.stw delete mode 100644 testhal/STM8S/SPI/cosmic/cosmic.stp delete mode 100644 testhal/STM8S/SPI/cosmic/vectors.c delete mode 100644 testhal/STM8S/SPI/demo/chconf.h delete mode 100644 testhal/STM8S/SPI/demo/halconf.h delete mode 100644 testhal/STM8S/SPI/demo/main.c delete mode 100644 testhal/STM8S/SPI/demo/mcuconf.h delete mode 100644 testhal/STM8S/SPI/raisonance/raisonance.stp delete mode 100644 tools/eclipse/config_wizard/.classpath delete mode 100644 tools/eclipse/config_wizard/.project delete mode 100644 tools/eclipse/config_wizard/.settings/org.eclipse.jdt.core.prefs delete mode 100644 tools/eclipse/config_wizard/META-INF/MANIFEST.MF delete mode 100644 tools/eclipse/config_wizard/build.properties delete mode 100644 tools/eclipse/config_wizard/icons/check.gif delete mode 100644 tools/eclipse/config_wizard/icons/chibios.gif delete mode 100644 tools/eclipse/config_wizard/icons/generate.gif delete mode 100644 tools/eclipse/config_wizard/icons/sample.gif delete mode 100644 tools/eclipse/config_wizard/lib/bsh.jar delete mode 100644 tools/eclipse/config_wizard/lib/fmpp.jar delete mode 100644 tools/eclipse/config_wizard/lib/freemarker.jar delete mode 100644 tools/eclipse/config_wizard/lib/jdom-2.0.2.jar delete mode 100644 tools/eclipse/config_wizard/lib/oro.jar delete mode 100644 tools/eclipse/config_wizard/lib/resolver.jar delete mode 100644 tools/eclipse/config_wizard/plugin.xml delete mode 100644 tools/eclipse/config_wizard/resources/app_templates/c/template.xml delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/lib/code_snippets.xml delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/lib/libcode.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/lib/liblicense.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/lib/libsnippets.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/lib/libstm32f4xx.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/lib/libutils.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.c.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.h.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.mk.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.c.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.h.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.mk.ftl delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/processors/processors.xml delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/boards/abstract_board.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f0xx_board.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f4xx_board.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32l1xx_board.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/common/code_snippets.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/common/config_settings.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/common/doc.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/xml/stm32f0board.xml delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/xml/stm32f4board.xml delete mode 100644 tools/eclipse/config_wizard/resources/gencfg/xml/stm32l1board.xml delete mode 100644 tools/eclipse/config_wizard/src/config_wizard/Activator.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/process/ApplicationGeneratorProcessRunner.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizard.java delete mode 100644 tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizardPage.java delete mode 100644 tools/eclipse/debug_support/.classpath delete mode 100644 tools/eclipse/debug_support/.project delete mode 100644 tools/eclipse/debug_support/.settings/org.eclipse.jdt.core.prefs delete mode 100644 tools/eclipse/debug_support/META-INF/MANIFEST.MF delete mode 100644 tools/eclipse/debug_support/build.properties delete mode 100644 tools/eclipse/debug_support/contexts.xml delete mode 100644 tools/eclipse/debug_support/icons/sample.gif delete mode 100644 tools/eclipse/debug_support/plugin.xml delete mode 100644 tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/activator/Activator.java delete mode 100644 tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxy.java delete mode 100644 tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxyException.java delete mode 100644 tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/HexUtils.java delete mode 100644 tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/views/ChibiView.java delete mode 100644 tools/eclipse/debug_support/src/org/eclipse/wb/swt/ResourceManager.java delete mode 100644 tools/eclipse/debug_support/src/org/eclipse/wb/swt/SWTResourceManager.java delete mode 100644 tools/eclipse/plugins/org.chibios.tools.eclipse.config_1.1.0.jar delete mode 100644 tools/eclipse/plugins/org.chibios.tools.eclipse.debug_1.0.8.jar delete mode 100644 tools/eclipse/readme.txt delete mode 100755 tools/edit_aid/rebalance_prio.sh delete mode 100644 tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch delete mode 100644 tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch delete mode 100644 tools/gencfg/.project delete mode 100644 tools/gencfg/config.fmpp delete mode 100644 tools/gencfg/fmpp.sh delete mode 100644 tools/gencfg/lib/libcode.ftl delete mode 100644 tools/gencfg/lib/liblicense.ftl delete mode 100644 tools/gencfg/lib/libstm32f4xx.ftl delete mode 100644 tools/gencfg/lib/libutils.ftl delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/config.fmpp delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl delete mode 100644 tools/gencfg/processors/hal/stm32f4xx/config.fmpp delete mode 100644 tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl delete mode 100644 tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl delete mode 100644 tools/gencfg/processors/processors.xml delete mode 100644 tools/gencfg/readme.txt delete mode 100644 tools/gencfg/run.bat delete mode 100644 tools/gencfg/schema/boards/abstract_board.xsd delete mode 100644 tools/gencfg/schema/boards/stm32f4xx_board.xsd delete mode 100644 tools/gencfg/schema/common/doc.xsd delete mode 100644 tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd delete mode 100644 tools/gencfg/schema/hal/abstract_adc_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/abstract_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/abstract_driver_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd delete mode 100644 tools/gencfg/xml/stm32f0board.xml delete mode 100644 tools/gencfg/xml/stm32f4board.xml delete mode 100644 tools/gencfg/xml/stm32f4xx_cfg.xml diff --git a/boards/ARDUINO_MEGA/board.c b/boards/ARDUINO_MEGA/board.c deleted file mode 100644 index d339613e99..0000000000 --- a/boards/ARDUINO_MEGA/board.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ -#if defined(PORTA) - {VAL_PORTA, VAL_DDRA}, -#endif -#if defined(PORTB) - {VAL_PORTB, VAL_DDRB}, -#endif -#if defined(PORTC) - {VAL_PORTC, VAL_DDRC}, -#endif -#if defined(PORTD) - {VAL_PORTD, VAL_DDRD}, -#endif -#if defined(PORTE) - {VAL_PORTE, VAL_DDRE}, -#endif -#if defined(PORTF) - {VAL_PORTF, VAL_DDRF}, -#endif -#if defined(PORTG) - {VAL_PORTG, VAL_DDRG}, -#endif -#if defined(PORTH) - {VAL_PORTH, VAL_DDRH}, -#endif -#if defined(PORTJ) - {VAL_PORTJ, VAL_DDRJ}, -#endif -#if defined(PORTK) - {VAL_PORTK, VAL_DDRK}, -#endif -#if defined(PORTL) - {VAL_PORTL, VAL_DDRL}, -#endif -}; -#endif /* HAL_USE_PAL */ - -/** - * @brief Timer0 interrupt handler. - */ -CH_IRQ_HANDLER(TIMER0_COMPA_vect) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/** - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * External interrupts setup, all disabled initially. - */ - EICRA = 0x00; - EICRB = 0x00; - EIMSK = 0x00; - - /* - * Timer 0 setup. - */ - TCCR0A = (1 << WGM01) | (0 << WGM00) | /* CTC mode. */ - (0 << COM0A1) | (0 << COM0A0) | /* OC0A disabled. */ - (0 << COM0B1) | (0 << COM0B0); /* OC0B disabled. */ - TCCR0B = (0 << WGM02) | /* CTC mode. */ - (0 << CS02) | (1 << CS01) | (1 << CS00); /* CLK/64 clock. */ - OCR0A = F_CPU / 64 / CH_FREQUENCY - 1; - TCNT0 = 0; /* Reset counter. */ - TIFR0 = (1 << OCF0A); /* Reset pending. */ - TIMSK0 = (1 << OCIE0A); /* IRQ on compare. */ -} diff --git a/boards/ARDUINO_MEGA/board.h b/boards/ARDUINO_MEGA/board.h deleted file mode 100644 index 544fbb9b45..0000000000 --- a/boards/ARDUINO_MEGA/board.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Arduino Mega board. - */ - -/* - * Board identifier. - */ -#define BOARD_ARDUINO_MEGA -#define BOARD_NAME "Arduino Mega" - -/* All inputs with pull-ups */ -#define VAL_DDRA 0x00 -#define VAL_PORTA 0xFF - -/* All inputs except PB7 which has a LED connected */ -#define VAL_DDRB 0x80 -#define VAL_PORTB 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRC 0x00 -#define VAL_PORTC 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRD 0x00 -#define VAL_PORTD 0xFF - -/* All inputs except PE1 (Serial TX0) */ -#define VAL_DDRE 0x02 -#define VAL_PORTE 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRF 0x00 -#define VAL_PORTF 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRG 0x00 -#define VAL_PORTG 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRH 0x00 -#define VAL_PORTH 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRJ 0x00 -#define VAL_PORTJ 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRK 0x00 -#define VAL_PORTK 0xFF - -/* All inputs with pull-ups */ -#define VAL_DDRL 0x00 -#define VAL_PORTL 0xFF - -#define PORTB_LED1 7 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ARDUINO_MEGA/board.mk b/boards/ARDUINO_MEGA/board.mk deleted file mode 100644 index 8e7f1117ea..0000000000 --- a/boards/ARDUINO_MEGA/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ARDUINO_MEGA/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ARDUINO_MEGA diff --git a/boards/EA_LPCXPRESSO_BB_1114/board.c b/boards/EA_LPCXPRESSO_BB_1114/board.c deleted file mode 100644 index 38a81e4fcd..0000000000 --- a/boards/EA_LPCXPRESSO_BB_1114/board.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = { - {VAL_GPIO0DATA, VAL_GPIO0DIR}, - {VAL_GPIO1DATA, VAL_GPIO1DIR}, - {VAL_GPIO2DATA, VAL_GPIO2DIR}, - {VAL_GPIO3DATA, VAL_GPIO3DIR}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - lpc111x_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Extra, board-specific, initializations. - * NOTE: PIO1_2 is associated also to the JTAG, if you need to use JTAG - * you must comment that line first. - */ - LPC_IOCON->PIO0_7 = 0xC0; /* Disables pull-up on LED2 output. */ - LPC_IOCON->R_PIO1_2 = 0xC1; /* Disables pull-up on LED3B output - and makes it GPIO1_2. */ - LPC_IOCON->PIO1_9 = 0xC0; /* Disables pull-up on LED3R output.*/ - LPC_IOCON->PIO1_10 = 0xC0; /* Disables pull-up on LED3G output.*/ -} diff --git a/boards/EA_LPCXPRESSO_BB_1114/board.h b/boards/EA_LPCXPRESSO_BB_1114/board.h deleted file mode 100644 index 484b7fd813..0000000000 --- a/boards/EA_LPCXPRESSO_BB_1114/board.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for Embedded Artists LPCXpresso Base Board with LPC1114 daughter - * board. - */ - -/* - * Board identifiers. - */ -#define BOARD_EA_BB_LPC1114 -#define BOARD_NAME "Embedded Artists LPCXpresso Base Board + LPC1114" - -/* - * Board frequencies. - */ -#define SYSOSCCLK 12000000 - -/* - * SCK0 connection on this board. - */ -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 - -/* - * GPIO 0 initial setup. - */ -#define VAL_GPIO0DIR PAL_PORT_BIT(GPIO0_OLEDSEL) | \ - PAL_PORT_BIT(GPIO0_LED2) -#define VAL_GPIO0DATA PAL_PORT_BIT(GPIO0_OLEDSEL) | \ - PAL_PORT_BIT(GPIO0_LED2) - -/* - * GPIO 1 initial setup. - */ -#define VAL_GPIO1DIR PAL_PORT_BIT(GPIO1_LED3B) | \ - PAL_PORT_BIT(GPIO1_LED3R) | \ - PAL_PORT_BIT(GPIO1_LED3G) | \ - PAL_PORT_BIT(GPIO1_SPI0SEL) -#define VAL_GPIO1DATA PAL_PORT_BIT(GPIO1_LED3B) | \ - PAL_PORT_BIT(GPIO1_LED3R) | \ - PAL_PORT_BIT(GPIO1_LED3G) | \ - PAL_PORT_BIT(GPIO1_SPI0SEL) - -/* - * GPIO 2 initial setup. - */ -#define VAL_GPIO2DIR 0x00000000 -#define VAL_GPIO2DATA 0x00000000 - -/* - * GPIO 3 initial setup. - */ -#define VAL_GPIO3DIR 0x00000000 -#define VAL_GPIO3DATA 0x00000000 - -/* - * Pin definitions. - */ -#define GPIO0_SW3 1 -#define GPIO0_OLEDSEL 2 -#define GPIO0_LED2 7 - -#define GPIO1_LED3B 2 -#define GPIO1_SW4 4 -#define GPIO1_LED3R 9 -#define GPIO1_LED3G 10 -#define GPIO1_SPI0SEL 11 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/EA_LPCXPRESSO_BB_1114/board.mk b/boards/EA_LPCXPRESSO_BB_1114/board.mk deleted file mode 100644 index affca2d052..0000000000 --- a/boards/EA_LPCXPRESSO_BB_1114/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/EA_LPCXPRESSO_BB_1114/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/EA_LPCXPRESSO_BB_1114 diff --git a/boards/EA_LPCXPRESSO_BB_11U14/board.c b/boards/EA_LPCXPRESSO_BB_11U14/board.c deleted file mode 100644 index 3960cac573..0000000000 --- a/boards/EA_LPCXPRESSO_BB_11U14/board.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = { - {VAL_GPIO0DATA, VAL_GPIO0DIR}, - {VAL_GPIO1DATA, VAL_GPIO1DIR} -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - lpc_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Extra, board-specific, initializations. - * NOTE: PIO1_2 is associated also to the JTAG, if you need to use JTAG - * you must comment that line first. - */ - LPC_IOCON->PIO0_7 = 0x80; /* Disables pull-up on LED2 output. */ - LPC_IOCON->TRST_PIO0_14 = 0x81; /* Disables pull-up on LED3B output - and makes it GPIO1_2. */ - LPC_IOCON->PIO0_21 = 0x80; /* Disables pull-up on LED3R output.*/ - LPC_IOCON->PIO0_22 = 0x80; /* Disables pull-up on LED3G output.*/ - - /* SSP0 mapping.*/ - LPC_IOCON->PIO1_29 = 0x81; /* SCK0 without resistors. */ - LPC_IOCON->PIO0_8 = 0x81; /* MISO0 without resistors. */ - LPC_IOCON->PIO0_9 = 0x81; /* MOSI0 without resistors. */ - - /* USART mapping.*/ - LPC_IOCON->PIO0_18 = 0x81; /* RDX without resistors. */ - LPC_IOCON->PIO0_19 = 0x81; /* TDX without resistors. */ -} diff --git a/boards/EA_LPCXPRESSO_BB_11U14/board.h b/boards/EA_LPCXPRESSO_BB_11U14/board.h deleted file mode 100644 index 6529ebc829..0000000000 --- a/boards/EA_LPCXPRESSO_BB_11U14/board.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for Embedded Artists LPCXpresso Base Board with LPC1114 daughter - * board. - */ - -/* - * Board identifiers. - */ -#define BOARD_EA_BB_LPC11U14 -#define BOARD_NAME "Embedded Artists LPCXpresso Base Board + LPC11U14" - -/* - * Board frequencies. - */ -#define SYSOSCCLK 12000000 - -/* - * SCK0 connection on this board. - */ -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 - -/* - * GPIO 0 initial setup. - */ -#define VAL_GPIO0DIR PAL_PORT_BIT(GPIO0_OLEDSEL) | \ - PAL_PORT_BIT(GPIO0_USB_DPCTL) | \ - PAL_PORT_BIT(GPIO0_LED2) | \ - PAL_PORT_BIT(GPIO0_LED3B) | \ - PAL_PORT_BIT(GPIO0_LED3R) | \ - PAL_PORT_BIT(GPIO0_LED3G) | \ - PAL_PORT_BIT(GPIO0_SPI0SEL) -#define VAL_GPIO0DATA PAL_PORT_BIT(GPIO0_OLEDSEL) | \ - PAL_PORT_BIT(GPIO0_LED2) | \ - PAL_PORT_BIT(GPIO0_LED3B) | \ - PAL_PORT_BIT(GPIO0_LED3R) | \ - PAL_PORT_BIT(GPIO0_LED3G) | \ - PAL_PORT_BIT(GPIO0_SPI0SEL) - -/* - * GPIO 1 initial setup. - */ -#define VAL_GPIO1DIR 0x00000000 -#define VAL_GPIO1DATA 0x00000000 - -/* - * Pin definitions. - */ -#define GPIO0_SW3 1 -#define GPIO0_OLEDSEL 2 -#define GPIO0_USB_VBUS 3 -#define GPIO0_USB_DPCTL 6 -#define GPIO0_LED2 7 -#define GPIO0_SW4 16 -#define GPIO0_LED3B 14 -#define GPIO0_LED3R 21 -#define GPIO0_LED3G 22 -#define GPIO0_SPI0SEL 23 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/EA_LPCXPRESSO_BB_11U14/board.mk b/boards/EA_LPCXPRESSO_BB_11U14/board.mk deleted file mode 100644 index 1c5d132d28..0000000000 --- a/boards/EA_LPCXPRESSO_BB_11U14/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/EA_LPCXPRESSO_BB_11U14/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/EA_LPCXPRESSO_BB_11U14 diff --git a/boards/EA_LPCXPRESSO_BB_1343/board.c b/boards/EA_LPCXPRESSO_BB_1343/board.c deleted file mode 100644 index 0c32dd9c78..0000000000 --- a/boards/EA_LPCXPRESSO_BB_1343/board.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = { - {VAL_GPIO0DATA, VAL_GPIO0DIR}, - {VAL_GPIO1DATA, VAL_GPIO1DIR}, - {VAL_GPIO2DATA, VAL_GPIO2DIR}, - {VAL_GPIO3DATA, VAL_GPIO3DIR}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - LPC13xx_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Extra, board-specific, initializations. - * NOTE: PIO1_2 is associated also to the JTAG, if you need to use JTAG - * you must comment that line first. - */ - LPC_IOCON->PIO0_7 = 0xC0; /* Disables pull-up on LED2 output. */ - LPC_IOCON->R_PIO1_2 = 0xC1; /* Disables pull-up on LED3B output - and makes it GPIO1_2. */ - LPC_IOCON->PIO1_9 = 0xC0; /* Disables pull-up on LED3R output.*/ - LPC_IOCON->PIO1_10 = 0xC0; /* Disables pull-up on LED3G output.*/ -} diff --git a/boards/EA_LPCXPRESSO_BB_1343/board.h b/boards/EA_LPCXPRESSO_BB_1343/board.h deleted file mode 100644 index 0fdd369d2a..0000000000 --- a/boards/EA_LPCXPRESSO_BB_1343/board.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for Embedded Artists LPCXpresso Base Board with LPC1343 daughter - * board. - */ - -/* - * Board identifiers. - */ -#define BOARD_EA_BB_LPC1343 -#define BOARD_NAME "Embedded Artists LPCXpresso Base Board + LPC1343" - -/* - * Board frequencies. - */ -#define SYSOSCCLK 12000000 - -/* - * GPIO 0 initial setup. - */ -#define VAL_GPIO0DIR PAL_PORT_BIT(GPIO0_OLEDSEL) | \ - PAL_PORT_BIT(GPIO0_LED2) -#define VAL_GPIO0DATA PAL_PORT_BIT(GPIO0_OLEDSEL) | \ - PAL_PORT_BIT(GPIO0_LED2) - -/* - * GPIO 1 initial setup. - */ -#define VAL_GPIO1DIR PAL_PORT_BIT(GPIO1_LED3B) | \ - PAL_PORT_BIT(GPIO1_LED3R) | \ - PAL_PORT_BIT(GPIO1_LED3G) | \ - PAL_PORT_BIT(GPIO1_SPI0SEL) -#define VAL_GPIO1DATA PAL_PORT_BIT(GPIO1_LED3B) | \ - PAL_PORT_BIT(GPIO1_LED3R) | \ - PAL_PORT_BIT(GPIO1_LED3G) | \ - PAL_PORT_BIT(GPIO1_SPI0SEL) - -/* - * GPIO 2 initial setup. - */ -#define VAL_GPIO2DIR 0x00000000 -#define VAL_GPIO2DATA 0x00000000 - -/* - * GPIO 3 initial setup. - */ -#define VAL_GPIO3DIR 0x00000000 -#define VAL_GPIO3DATA 0x00000000 - -/* - * Pin definitions. - */ -#define GPIO0_SW3 1 -#define GPIO0_OLEDSEL 2 -#define GPIO0_LED2 7 - -#define GPIO1_LED3B 2 -#define GPIO1_SW4 4 -#define GPIO1_LED3R 9 -#define GPIO1_LED3G 10 -#define GPIO1_SPI0SEL 11 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/EA_LPCXPRESSO_BB_1343/board.mk b/boards/EA_LPCXPRESSO_BB_1343/board.mk deleted file mode 100644 index da59e98c4b..0000000000 --- a/boards/EA_LPCXPRESSO_BB_1343/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/EA_LPCXPRESSO_BB_1343/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/EA_LPCXPRESSO_BB_1343 diff --git a/boards/GENERIC_SPC560P/board.c b/boards/GENERIC_SPC560P/board.c deleted file mode 100644 index 23154bf8dc..0000000000 --- a/boards/GENERIC_SPC560P/board.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/* Initial setup of all defined pads, the list is terminated by a {0, 0}.*/ -static const spc560p_siu_init_t spc560p_siu_init[] = { - {PCR(PB, PB_LIN0_TDX), PAL_HIGH, PAL_MODE_OUTPUT_ALTERNATE(1)}, - {PCR(PB, PB_LIN0_RDX), PAL_HIGH, PAL_MODE_INPUT}, - {PCR(PD, PD_BUTTON1), PAL_LOW, PAL_MODE_INPUT}, - {PCR(PD, PD_BUTTON2), PAL_LOW, PAL_MODE_INPUT}, - {PCR(PD, PD_BUTTON3), PAL_LOW, PAL_MODE_INPUT}, - {PCR(PD, PD_BUTTON4), PAL_LOW, PAL_MODE_INPUT}, - {PCR(PD, PD_LED1), PAL_HIGH, PAL_MODE_OUTPUT_PUSHPULL}, - {PCR(PD, PD_LED2), PAL_HIGH, PAL_MODE_OUTPUT_PUSHPULL}, - {PCR(PD, PD_LED3), PAL_HIGH, PAL_MODE_OUTPUT_PUSHPULL}, - {PCR(PD, PD_LED4), PAL_HIGH, PAL_MODE_OUTPUT_PUSHPULL}, - {0, 0, 0} -}; - -/* Initialization array for the PSMI registers.*/ -static const uint8_t spc560p_padsels_init[SPC5_SIU_NUM_PADSELS] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; - -/** - * @brief PAL setup. - */ -const PALConfig pal_default_config = -{ - PAL_MODE_UNCONNECTED, /* Default mode for all undefined pads. */ - spc560p_siu_init, - spc560p_padsels_init -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - spc560p_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - -} diff --git a/boards/GENERIC_SPC560P/board.h b/boards/GENERIC_SPC560P/board.h deleted file mode 100644 index 60edcddec6..0000000000 --- a/boards/GENERIC_SPC560P/board.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for a generic SPC560Pxx proto board. - */ - -/* - * Board identifiers. - */ -#define BOARD_GENERIC_SPC560P -#define BOARD_NAME "Generic SPC560P" - -/* - * Board frequencies. - */ -#if !defined(SPC560P_XOSC_CLK) -#define SPC5_XOSC_CLK 40000000 -#endif - -/* - * I/O definitions. - */ -#define PB_LIN0_TDX 2 -#define PB_LIN0_RDX 3 - -#define PD_BUTTON1 0 -#define PD_BUTTON2 1 -#define PD_BUTTON3 2 -#define PD_BUTTON4 3 - -#define PD_LED1 4 -#define PD_LED2 5 -#define PD_LED3 6 -#define PD_LED4 7 - -/* - * Support macros. - */ -#define PCR(port, pin) (((port) * 16) + (pin)) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/GENERIC_SPC560P/board.mk b/boards/GENERIC_SPC560P/board.mk deleted file mode 100644 index 3eba54437b..0000000000 --- a/boards/GENERIC_SPC560P/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/GENERIC_SPC560P/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/GENERIC_SPC560P diff --git a/boards/GENERIC_SPC563M/board.c b/boards/GENERIC_SPC563M/board.c deleted file mode 100644 index 327b83eef5..0000000000 --- a/boards/GENERIC_SPC563M/board.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - spc563_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Various initialization (temporary code). - */ - SIU.PCR[GPIO_LED1].R = 0x0300; /* OBE | IBE. */ - SIU.PCR[GPIO_LED2].R = 0x0300; /* OBE | IBE. */ - SIU.PCR[GPIO_LED3].R = 0x0300; /* OBE | IBE. */ - SIU.PCR[GPIO_LED4].R = 0x0300; /* OBE | IBE. */ - SIU.PCR[GPIO_BUTTON1].R = 0x0100; /* IBE. */ - SIU.PCR[GPIO_BUTTON2].R = 0x0100; /* IBE. */ - SIU.PCR[GPIO_BUTTON3].R = 0x0100; /* IBE. */ - SIU.PCR[GPIO_BUTTON4].R = 0x0100; /* IBE. */ - SIU.PCR[GPIO_SCI_A_TX].R = 0x0500; /* Primary | IBE. */ - SIU.PCR[GPIO_SCI_A_RX].R = 0x0500; /* Primary | IBE. */ -} diff --git a/boards/GENERIC_SPC563M/board.h b/boards/GENERIC_SPC563M/board.h deleted file mode 100644 index 6b63c3abf6..0000000000 --- a/boards/GENERIC_SPC563M/board.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for a generic SPC563M proto board. - */ - -/* - * Board identifiers. - */ -#define BOARD_GENERIC_SPC563M -#define BOARD_NAME "Generic SPC563M" - -/* - * Board frequencies. - */ -#if !defined(EXTCLK) -#define EXTCLK 8000000 -#endif - -/* - * I/O definitions. - */ -#define GPIO_SCI_A_TX 89 -#define GPIO_SCI_A_RX 90 - -#define GPIO_BUTTON1 179 -#define GPIO_BUTTON2 181 -#define GPIO_BUTTON3 183 -#define GPIO_BUTTON4 187 - -#define GPIO_LED1 188 -#define GPIO_LED2 189 -#define GPIO_LED3 190 -#define GPIO_LED4 191 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/GENERIC_SPC563M/board.mk b/boards/GENERIC_SPC563M/board.mk deleted file mode 100644 index f48dbe7af1..0000000000 --- a/boards/GENERIC_SPC563M/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/GENERIC_SPC563M/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/GENERIC_SPC563M diff --git a/boards/MAPLEMINI_STM32_F103/board.c b/boards/MAPLEMINI_STM32_F103/board.c deleted file mode 100644 index 7cfa18fd69..0000000000 --- a/boards/MAPLEMINI_STM32_F103/board.c +++ /dev/null @@ -1,54 +0,0 @@ -+/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/MAPLEMINI_STM32_F103/board.h b/boards/MAPLEMINI_STM32_F103/board.h deleted file mode 100644 index 9adcc15396..0000000000 --- a/boards/MAPLEMINI_STM32_F103/board.h +++ /dev/null @@ -1,141 +0,0 @@ -+/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the LeafLabs Maple Mini. - */ - -/* - * Board identifier. - */ -#define BOARD_MAPLEMINI_STM32_F103 -#define BOARD_NAME "LeafLabs Maple Mini" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_MD - -/* - * IO pins assignments. - */ -/* Missing.*/ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input with pull-up except: - * PA2 - Alternate output (USART2 TX). - * PA3 - Normal input (USART2 RX). - * PA9 - Alternate output (USART1 TX). - * PA10 - Normal input (USART1 RX). - */ -#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - * Everything input with pull-up except: - * PB1 - Push Pull output (LED). - */ -#define VAL_GPIOBCRL 0x88888838 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0x88888888 /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x88888888 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFFFF - -/* - * Port D setup. - * Everything input with pull-up except: - * PD0 - Normal input (XTAL). - * PD1 - Normal input (XTAL). - */ -#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -/* - * USB bus activation macro, required by the USB driver. - */ -#define usb_lld_connect_bus(usbp) palClearPad(GPIOC, GPIOC_USB_DISC) - -/* - * USB bus de-activation macro, required by the USB driver. - */ -#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOC, GPIOC_USB_DISC) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/MAPLEMINI_STM32_F103/board.mk b/boards/MAPLEMINI_STM32_F103/board.mk deleted file mode 100644 index ab4b30cacc..0000000000 --- a/boards/MAPLEMINI_STM32_F103/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/MAPLEMINI_STM32_F103/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/MAPLEMINI_STM32_F103 diff --git a/boards/NONSTANDARD_STM32F4_BARTHESS1/board.c b/boards/NONSTANDARD_STM32F4_BARTHESS1/board.c deleted file mode 100644 index 59b6e9de6c..0000000000 --- a/boards/NONSTANDARD_STM32F4_BARTHESS1/board.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/NONSTANDARD_STM32F4_BARTHESS1/board.h b/boards/NONSTANDARD_STM32F4_BARTHESS1/board.h deleted file mode 100644 index df5a070e13..0000000000 --- a/boards/NONSTANDARD_STM32F4_BARTHESS1/board.h +++ /dev/null @@ -1,524 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for STMicroelectronics STM32F4-Discovery board. - */ - -/* - * Board identifier. - */ -#define BOARD_NONSTANDARD_STM32F4_BARTHESS1 -#define BOARD_NAME "Hand made STM32F4x board" - -/* - * Board frequencies. - * NOTE: The LSE crystal is not fitted by default on the board. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300 - -/* - * MCU type as defined in the ST header file stm32f4xx.h. - */ -#define STM32F4XX - -/* - * IO pins assignments. - */ -#define GPIOA_USART2_CTS 0 /* xbee */ -#define GPIOA_USART2_RTS 1 /* xbee */ -#define GPIOA_USART2_TX 2 /* xbee */ -#define GPIOA_USART2_RX 3 /* xbee */ -#define GPIOA_SPI1_NSS 4 -#define GPIOA_SPI1_SCK 5 -#define GPIOA_SPI1_MISO 6 -#define GPIOA_SPI1_MOSI 7 -#define GPIOA_5V_DOMAIN_EN 8 -#define GPIOA_USART1_TX 9 /* gps */ -#define GPIOA_USART1_RX 10/* gps */ -#define GPIOA_OTG_FS_DM 11 -#define GPIOA_OTG_FS_DP 12 -#define GPIOA_JTMS 13 -#define GPIOA_JTCK 14 -#define GPIOA_JTDI 15 - -#define GPIOB_RECEIVER_PPM 0 -#define GPIOB_TACHOMETER 1 -#define GPIOB_BOOT1 2 -#define GPIOB_JTDO 3 -#define GPIOB_NJTRST 4 -#define GPIOB_LED_R 6 -#define GPIOB_LED_G 7 -#define GPIOB_LED_B 8 -#define GPIOB_I2C2_SCL 10 -#define GPIOB_I2C2_SDA 11 - - -#define GPIOC_AN_CURRENT_SENS 0 -#define GPIOC_AN_SUPPLY_SENS 1 -#define GPIOC_AN_6V_SENS 2 -#define GPIOC_AN33_0 3 -#define GPIOC_AN33_1 4 -#define GPIOC_AN33_2 5 -#define GPIOC_SDIO_D0 8 -#define GPIOC_SDIO_D1 9 -#define GPIOC_SDIO_D2 10 -#define GPIOC_SDIO_D3 11 -#define GPIOC_SDIO_CK 12 -#define GPIOC_TAMPER_RTC 13 -#define GPIOC_OSC32_IN 14 -#define GPIOC_OSC32_OUT 15 - -#define GPIOD_SDIO_CMD 2 -#define GPIOD_PWM1 12 -#define GPIOD_PWM2 13 -#define GPIOD_PWM3 14 -#define GPIOD_PWM4 15 - -#define GPIOE_GPS_PPS 0 -#define GPIOE_XBEE_SLEEP 1 -#define GPIOE_XBEE_RESET 2 -#define GPIOE_SDIO_DETECT 3 -#define GPIOE_USB_DISCOVERY 4 -#define GPIOE_GPS_PWR_EN 5 -#define GPIOE_BMP085_EOC 6 -#define GPIOE_MAG_INT 7 -#define GPIOE_MMA8451_INT1 8 -#define GPIOE_PWM5 9 -#define GPIOE_ITG3200_INT 10 -#define GPIOE_PWM6 11 -#define GPIOE_PWM7 13 -#define GPIOE_PWM8 14 -#define GPIOE_MMA8451_INT2 15 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - * - * 1 for open drain outputs denotes hi-Z state - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3U << ((n) * 2)) -#define PIN_PUDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * Port A setup. - * All input with pull-up except: -#define GPIOA_USART2_CTS 0 //xbee -#define GPIOA_USART2_RTS 1 //xbee -#define GPIOA_USART2_TX 2 //xbee -#define GPIOA_USART2_Rx 3 //xbee -#define GPIOA_SPI1_NSS 4 -#define GPIOA_SPI1_SCK 5 -#define GPIOA_SPI1_MISO 6 -#define GPIOA_SPI1_MOSI 7 -#define GPIOA_5V_DOMAIN_EN 8 -#define GPIOA_USART1_TX 9 -#define GPIOA_USART1_RX 10 -#define GPIOA_OTG_FS_DM 11 -#define GPIOA_OTG_FS_DP 12 -#define GPIOA_JTMS 13 -#define GPIOA_JTCK 14 -#define GPIOA_JTDI 15 - */ - -/* default after reset 0xA8000000 */ -#define VAL_GPIOA_MODER (PIN_MODE_ALTERNATE(GPIOA_USART2_CTS) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RTS) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART2_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_NSS) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_SCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MISO) | \ - PIN_MODE_ALTERNATE(GPIOA_SPI1_MOSI) | \ - PIN_MODE_OUTPUT(GPIOA_5V_DOMAIN_EN) | \ - PIN_MODE_ALTERNATE(GPIOA_USART1_TX) | \ - PIN_MODE_ALTERNATE(GPIOA_USART1_RX) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ - PIN_MODE_ALTERNATE(GPIOA_JTMS) | \ - PIN_MODE_ALTERNATE(GPIOA_JTCK) | \ - PIN_MODE_ALTERNATE(GPIOA_JTDI)) -/* default 0x00000000 */ -#define VAL_GPIOA_OTYPER 0x00000000 -/* default 0x00000000 */ -#define VAL_GPIOA_OSPEEDR 0x00000000 -/* 0x64000000 */ -#define VAL_GPIOA_PUPDR (PIN_PUDR_FLOATING(GPIOA_USART2_CTS) | \ - PIN_PUDR_FLOATING(GPIOA_USART2_RTS) | \ - PIN_PUDR_FLOATING(GPIOA_USART2_TX) | \ - PIN_PUDR_FLOATING(GPIOA_USART2_RX) | \ - PIN_PUDR_PULLUP(GPIOA_SPI1_NSS) | \ - PIN_PUDR_PULLUP(GPIOA_SPI1_SCK) | \ - PIN_PUDR_PULLUP(GPIOA_SPI1_MISO) | \ - PIN_PUDR_PULLUP(GPIOA_SPI1_MOSI) | \ - PIN_PUDR_FLOATING(GPIOA_5V_DOMAIN_EN) | \ - PIN_PUDR_FLOATING(GPIOA_USART1_TX) | \ - PIN_PUDR_FLOATING(GPIOA_USART1_RX) | \ - PIN_PUDR_FLOATING(GPIOA_OTG_FS_DM) | \ - PIN_PUDR_FLOATING(GPIOA_OTG_FS_DP) | \ - PIN_PUDR_PULLUP(GPIOA_JTMS) | \ - PIN_PUDR_PULLDOWN(GPIOA_JTCK) | \ - PIN_PUDR_PULLUP(GPIOA_JTDI)) -/* 0x00000000 */ -#define VAL_GPIOA_ODR 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_USART2_CTS, 7) | \ - PIN_AFIO_AF(GPIOA_USART2_RTS, 7) | \ - PIN_AFIO_AF(GPIOA_USART2_TX, 7) | \ - PIN_AFIO_AF(GPIOA_USART2_RX, 7)| \ - PIN_AFIO_AF(GPIOA_SPI1_NSS, 5) | \ - PIN_AFIO_AF(GPIOA_SPI1_SCK, 5) | \ - PIN_AFIO_AF(GPIOA_SPI1_MISO, 5) | \ - PIN_AFIO_AF(GPIOA_SPI1_MOSI, 5)) -/* 0x00000000 */ -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_USART1_TX, 7) | \ - PIN_AFIO_AF(GPIOA_USART1_RX, 7) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DM, 10) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DP, 10) | \ - PIN_AFIO_AF(GPIOA_JTMS, 0) | \ - PIN_AFIO_AF(GPIOA_JTCK, 0) | \ - PIN_AFIO_AF(GPIOA_JTDI, 0)) - -/* - * Port B setup. -#define GPIOB_RECEIVER_PPM 0 -#define GPIOB_TACHOMETER 1 -#define GPIOB_BOOT1 2 -#define GPIOB_JTDO 3 -#define GPIOB_NJTRST 4 -#define GPIOB_LED_R 6 -#define GPIOB_LED_G 7 -#define GPIOB_LED_B 8 -#define GPIOB_I2C2_SCL 10 -#define GPIOB_I2C2_SDA 11 - */ -/* 0x00000280 */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_RECEIVER_PPM) | \ - PIN_MODE_INPUT(GPIOB_TACHOMETER) | \ - PIN_MODE_INPUT(GPIOB_BOOT1) | \ - PIN_MODE_ALTERNATE(GPIOB_JTDO) | \ - PIN_MODE_ALTERNATE(GPIOB_NJTRST) | \ - PIN_MODE_INPUT(5) | \ - PIN_MODE_OUTPUT(GPIOB_LED_R) | \ - PIN_MODE_OUTPUT(GPIOB_LED_G) | \ - PIN_MODE_OUTPUT(GPIOB_LED_B) | \ - PIN_MODE_INPUT(9) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C2_SDA) | \ - PIN_MODE_INPUT(12) | \ - PIN_MODE_INPUT(13) | \ - PIN_MODE_INPUT(14) | \ - PIN_MODE_INPUT(15)) -/* 0x00000000 */ -#define VAL_GPIOB_OTYPER (PIN_OTYPE_OPENDRAIN(GPIOB_LED_R) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_LED_G) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_LED_B) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C2_SDA)) -/* 0x000000C0 */ -#define VAL_GPIOB_OSPEEDR 0x000000C0//0xAAAAAAEA -/* 0x00000100 */ -#define VAL_GPIOB_PUPDR (PIN_PUDR_PULLDOWN(GPIOB_RECEIVER_PPM) | \ - PIN_PUDR_PULLDOWN(GPIOB_TACHOMETER) | \ - PIN_PUDR_FLOATING(GPIOB_BOOT1) | \ - PIN_PUDR_FLOATING(GPIOB_JTDO) | \ - PIN_PUDR_PULLUP(GPIOB_NJTRST) | \ - PIN_PUDR_FLOATING(5) | \ - PIN_PUDR_FLOATING(GPIOB_LED_R) | \ - PIN_PUDR_FLOATING(GPIOB_LED_G) | \ - PIN_PUDR_FLOATING(GPIOB_LED_B) | \ - PIN_PUDR_FLOATING(9) | \ - PIN_PUDR_FLOATING(GPIOB_I2C2_SCL) | \ - PIN_PUDR_FLOATING(GPIOB_I2C2_SDA) | \ - PIN_PUDR_PULLUP(12) | \ - PIN_PUDR_PULLUP(13) | \ - PIN_PUDR_PULLUP(14) | \ - PIN_PUDR_PULLUP(15)) -/* 0x00000000 */ -#define VAL_GPIOB_ODR 0x000001C0 -/* 0x00000000 */ -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_RECEIVER_PPM, 0) | \ - PIN_AFIO_AF(GPIOB_JTDO, 0)) -/* 0x00000000 */ -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C2_SCL, 4) | \ - PIN_AFIO_AF(GPIOB_I2C2_SDA, 4)) - - -/* - * Port C setup. -#define GPIOC_AN_CURRENT_SENS 0 -#define GPIOC_AN_SUPPLY_SENS 1 -#define GPIOC_AN_6V_SENS 2 -#define GPIOC_AN33_0 3 -#define GPIOC_AN33_1 4 -#define GPIOC_AN33_2 5 - -#define GPIOC_SDIO_D0 8 -#define GPIOC_SDIO_D1 9 -#define GPIOC_SDIO_D2 10 -#define GPIOC_SDIO_D3 11 -#define GPIOC_SDIO_CK 12 - -#define GPIOC_TAMPER_RTC 13 -#define GPIOC_OSC32_IN 14 -#define GPIOC_OSC32_OUT 15 - */ -/* 0x00000000 */ -#define VAL_GPIOC_MODER (PIN_MODE_ANALOG(GPIOC_AN_CURRENT_SENS) | \ - PIN_MODE_ANALOG(GPIOC_AN_SUPPLY_SENS) | \ - PIN_MODE_ANALOG(GPIOC_AN_6V_SENS) | \ - PIN_MODE_ANALOG(GPIOC_AN33_0) | \ - PIN_MODE_ANALOG(GPIOC_AN33_1) | \ - PIN_MODE_ANALOG(GPIOC_AN33_2) | \ - PIN_MODE_INPUT(6) | \ - PIN_MODE_INPUT(7) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D0) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D1) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D2) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIO_CK) | \ - PIN_MODE_INPUT(GPIOC_TAMPER_RTC) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) - -/* 0x00000000 */ -#define VAL_GPIOC_OTYPER 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_25M(GPIOC_SDIO_D0) | \ - PIN_OSPEED_25M(GPIOC_SDIO_D1) | \ - PIN_OSPEED_25M(GPIOC_SDIO_D2) | \ - PIN_OSPEED_25M(GPIOC_SDIO_D3) | \ - PIN_OSPEED_25M(GPIOC_SDIO_CK) | \ - PIN_OSPEED_2M(GPIOC_TAMPER_RTC)) -/* 0x00000000 */ -#define VAL_GPIOC_PUPDR (PIN_PUDR_FLOATING(GPIOC_AN_CURRENT_SENS) | \ - PIN_PUDR_FLOATING(GPIOC_AN_SUPPLY_SENS) | \ - PIN_PUDR_FLOATING(GPIOC_AN_6V_SENS) | \ - PIN_PUDR_FLOATING(GPIOC_AN33_0) | \ - PIN_PUDR_FLOATING(GPIOC_AN33_1) | \ - PIN_PUDR_FLOATING(GPIOC_AN33_2) | \ - PIN_PUDR_PULLUP(6) | \ - PIN_PUDR_PULLUP(7) | \ - PIN_PUDR_PULLUP(GPIOC_SDIO_D0) | \ - PIN_PUDR_PULLUP(GPIOC_SDIO_D1) | \ - PIN_PUDR_PULLUP(GPIOC_SDIO_D2) | \ - PIN_PUDR_PULLUP(GPIOC_SDIO_D3) | \ - PIN_PUDR_PULLUP(GPIOC_SDIO_CK) | \ - PIN_PUDR_FLOATING(GPIOC_TAMPER_RTC) | \ - PIN_PUDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUDR_FLOATING(GPIOC_OSC32_OUT)) -/* 0x00000000 */ -#define VAL_GPIOC_ODR 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOC_AFRL 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SDIO_D0, 12) | \ - PIN_AFIO_AF(GPIOC_SDIO_D1, 12) | \ - PIN_AFIO_AF(GPIOC_SDIO_D2, 12) | \ - PIN_AFIO_AF(GPIOC_SDIO_D3, 12) | \ - PIN_AFIO_AF(GPIOC_SDIO_CK, 12)) - -/* - * Port D setup. -#define GPIOD_SDIO_CMD 2 -#define GPIOD_PWM1 12 -#define GPIOD_PWM2 13 -#define GPIOD_PWM3 14 -#define GPIOD_PWM4 15 - */ -/* 0x00000000 */ -#define VAL_GPIOD_MODER (PIN_MODE_ALTERNATE(GPIOD_SDIO_CMD) | \ - PIN_MODE_ALTERNATE(GPIOD_PWM1) | \ - PIN_MODE_ALTERNATE(GPIOD_PWM2) | \ - PIN_MODE_ALTERNATE(GPIOD_PWM3) | \ - PIN_MODE_ALTERNATE(GPIOD_PWM4)) -/* 0x00000000 */ -#define VAL_GPIOD_OTYPER 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_25M(GPIOD_SDIO_CMD)) -/* 0x00000000 */ -#define VAL_GPIOD_PUPDR (PIN_PUDR_PULLUP(GPIOD_SDIO_CMD) | \ - PIN_PUDR_PULLDOWN(GPIOD_PWM1) | \ - PIN_PUDR_PULLDOWN(GPIOD_PWM2) | \ - PIN_PUDR_PULLDOWN(GPIOD_PWM3) | \ - PIN_PUDR_PULLDOWN(GPIOD_PWM4)) -/* 0x00000000 */ -#define VAL_GPIOD_ODR 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_SDIO_CMD, 12)) -/* 0x00000000 */ -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PWM1, 2) | \ - PIN_AFIO_AF(GPIOD_PWM2, 2) | \ - PIN_AFIO_AF(GPIOD_PWM3, 2) | \ - PIN_AFIO_AF(GPIOD_PWM4, 2)) - - -/* - * Port E setup. -#define GPIOE_GPS_PPS 0 -#define GPIOE_XBEE_SLEEP 1 -#define GPIOE_XBEE_RESET 2 -#define GPIOE_SDIO_DETECT 3 -#define GPIOE_USB_DISCOVERY 4 -#define GPIOE_GPS_EN 5 -#define GPIOE_BMP085_EOC 6 -#define GPIOE_MAG_INT 7 -#define GPIOE_MMA8451_INT1 8 -#define GPIOE_PWM5 9 -#define GPIOE_ITG3200_INT 10 -#define GPIOE_PWM6 11 -#define GPIOE_TACHOMETER 12 -#define GPIOE_PWM7 13 -#define GPIOE_PWM8 14 -#define GPIOE_MMA8451_INT2 15 - */ -/* 0x00000000 */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_GPS_PPS) | \ - PIN_MODE_OUTPUT(GPIOE_XBEE_SLEEP) | \ - PIN_MODE_OUTPUT(GPIOE_XBEE_RESET) | \ - PIN_MODE_INPUT(GPIOE_SDIO_DETECT) | \ - PIN_MODE_OUTPUT(GPIOE_USB_DISCOVERY) | \ - PIN_MODE_OUTPUT(GPIOE_GPS_PWR_EN) | \ - PIN_MODE_INPUT(GPIOE_BMP085_EOC) | \ - PIN_MODE_INPUT(GPIOE_MAG_INT) | \ - PIN_MODE_INPUT(GPIOE_MMA8451_INT1) | \ - PIN_MODE_ALTERNATE(GPIOE_PWM5) | \ - PIN_MODE_INPUT(GPIOE_ITG3200_INT) | \ - PIN_MODE_ALTERNATE(GPIOE_PWM6) | \ - PIN_MODE_INPUT(12) | \ - PIN_MODE_ALTERNATE(GPIOE_PWM7) | \ - PIN_MODE_ALTERNATE(GPIOE_PWM8) | \ - PIN_MODE_INPUT(GPIOE_MMA8451_INT2)) -/* 0x00000000 */ -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_XBEE_SLEEP) | \ - PIN_OTYPE_PUSHPULL(GPIOE_XBEE_RESET) | \ - PIN_OTYPE_PUSHPULL(GPIOE_USB_DISCOVERY) | \ - PIN_OTYPE_OPENDRAIN(GPIOE_GPS_PWR_EN) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PWM5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PWM6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PWM7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PWM8)) -/* 0x00000000 */ -#define VAL_GPIOE_OSPEEDR 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOE_PUPDR (PIN_PUDR_PULLDOWN(GPIOE_GPS_PPS) | \ - PIN_PUDR_PULLUP(GPIOE_XBEE_SLEEP) | \ - PIN_PUDR_FLOATING(GPIOE_XBEE_RESET) | \ - PIN_PUDR_PULLUP(GPIOE_SDIO_DETECT) | \ - PIN_PUDR_FLOATING(GPIOE_USB_DISCOVERY) | \ - PIN_PUDR_FLOATING(GPIOE_GPS_PWR_EN) | \ - PIN_PUDR_PULLDOWN(GPIOE_BMP085_EOC) | \ - PIN_PUDR_PULLDOWN(GPIOE_MAG_INT) | \ - PIN_PUDR_PULLDOWN(GPIOE_MMA8451_INT1) | \ - PIN_PUDR_PULLDOWN(GPIOE_PWM5) | \ - PIN_PUDR_PULLDOWN(GPIOE_ITG3200_INT) | \ - PIN_PUDR_PULLDOWN(GPIOE_PWM6) | \ - PIN_PUDR_PULLUP(12) | \ - PIN_PUDR_PULLDOWN(GPIOE_PWM7) | \ - PIN_PUDR_PULLDOWN(GPIOE_PWM8) | \ - PIN_PUDR_PULLDOWN(GPIOE_MMA8451_INT2)) -/* 0x00000000 */ -#define VAL_GPIOE_ODR 0x30 -/* 0x00000000 */ -#define VAL_GPIOE_AFRL 0x00000000 -/* 0x00000000 */ -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PWM5, 1) | \ - PIN_AFIO_AF(GPIOE_PWM6, 1) | \ - PIN_AFIO_AF(GPIOE_PWM7, 1) | \ - PIN_AFIO_AF(GPIOE_PWM8, 1)) - -/* - * Port F setup. - */ -#define VAL_GPIOF_MODER 0x00000000 -#define VAL_GPIOF_OTYPER 0x00000000 -#define VAL_GPIOF_OSPEEDR 0x00000000 -#define VAL_GPIOF_PUPDR 0x00000000 -#define VAL_GPIOF_ODR 0x00000000 -#define VAL_GPIOF_AFRL 0x00000000 -#define VAL_GPIOF_AFRH 0x00000000 - -/* - * Port G setup. - */ -#define VAL_GPIOG_MODER 0x00000000 -#define VAL_GPIOG_OTYPER 0x00000000 -#define VAL_GPIOG_OSPEEDR 0x00000000 -#define VAL_GPIOG_PUPDR 0x00000000 -#define VAL_GPIOG_ODR 0x00000000 -#define VAL_GPIOG_AFRL 0x00000000 -#define VAL_GPIOG_AFRH 0x00000000 - -/* - * Port H setup. - */ -#define VAL_GPIOH_MODER 0x00000000 -#define VAL_GPIOH_OTYPER 0x00000000 -#define VAL_GPIOH_OSPEEDR 0x00000000 -#define VAL_GPIOH_PUPDR 0x00000000 -#define VAL_GPIOH_ODR 0x00000000 -#define VAL_GPIOH_AFRL 0x00000000 -#define VAL_GPIOH_AFRH 0x00000000 - -/* - * Port I setup. - */ -#define VAL_GPIOI_MODER 0x00000000 -#define VAL_GPIOI_OTYPER 0x00000000 -#define VAL_GPIOI_OSPEEDR 0x00000000 -#define VAL_GPIOI_PUPDR 0x00000000 -#define VAL_GPIOI_ODR 0x00000000 -#define VAL_GPIOI_AFRL 0x00000000 -#define VAL_GPIOI_AFRH 0x00000000 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk b/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk deleted file mode 100644 index 8f50edf14d..0000000000 --- a/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.c - -# Required include directories -BOARDINC = $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1 diff --git a/boards/OLIMEX_AVR_CAN/board.c b/boards/OLIMEX_AVR_CAN/board.c deleted file mode 100644 index 13d9250586..0000000000 --- a/boards/OLIMEX_AVR_CAN/board.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ -#if defined(PORTA) - {VAL_PORTA, VAL_DDRA}, -#endif -#if defined(PORTB) - {VAL_PORTB, VAL_DDRB}, -#endif -#if defined(PORTC) - {VAL_PORTC, VAL_DDRC}, -#endif -#if defined(PORTD) - {VAL_PORTD, VAL_DDRD}, -#endif -#if defined(PORTE) - {VAL_PORTE, VAL_DDRE}, -#endif -#if defined(PORTF) - {VAL_PORTF, VAL_DDRF}, -#endif -#if defined(PORTG) - {VAL_PORTG, VAL_DDRG}, -#endif -}; -#endif /* HAL_USE_PAL */ - -CH_IRQ_HANDLER(TIMER0_COMP_vect) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * External interrupts setup, all disabled initially. - */ - EICRA = 0x00; - EICRB = 0x00; - EIMSK = 0x00; - - /* - * Enables Idle mode for SLEEP instruction. - */ - SMCR = (1 << SE); - - /* - * Timer 0 setup. - */ - TCCR0A = (1 << WGM01) | (0 << WGM00) | /* CTC mode. */ - (0 << COM0A1) | (0 << COM0A0) | /* OC0A disabled. */ - (0 << CS02) | (1 << CS01) | (1 << CS00); /* CLK/64 clock. */ - OCR0A = F_CPU / 64 / CH_FREQUENCY - 1; - TCNT0 = 0; /* Reset counter. */ - TIFR0 = (1 << OCF0A); /* Reset pending. */ - TIMSK0 = (1 << OCIE0A); /* IRQ on compare. */ -} diff --git a/boards/OLIMEX_AVR_CAN/board.h b/boards/OLIMEX_AVR_CAN/board.h deleted file mode 100644 index 1e1f74d02f..0000000000 --- a/boards/OLIMEX_AVR_CAN/board.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex AVR-CAN proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_AVR_CAN -#define BOARD_NAME "Olimex AVR-CAN" - -/* - * All inputs with pullups. - */ -#define VAL_DDRA 0x00 -#define VAL_PORTA 0xFF - -/* - * All inputs with pullups. - */ -#define VAL_DDRB 0x00 -#define VAL_PORTB 0xFF - -/* - * All inputs with pullups. - */ -#define VAL_DDRC 0x00 -#define VAL_PORTC 0xFF - -/* PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 - * IN IN OUT IN OUT IN IN IN - * DDRD 0 0 1 0 1 0 0 0 - * PU HiZ VAL PU VAL HiZ HiZ HiZ - * PORTD 1 0 ?1 1 1 0 0 0 - */ -#define VAL_DDRD 0x28 -#define VAL_PORTD 0xB8 - -/* PE7 PE6 BUT LED PE3 PE2 PE1 PE0 - * IN IN IN OUT IN IN OUT IN - * DDRE 0 0 0 1 0 0 1 0 - * PU PU HiZ VAL PU PU VAL HiZ - * PORTE 1 1 0 1 1 1 1 0 - */ -#define VAL_DDRE 0x12 -#define VAL_PORTE 0xDE - -/* TDI TDO TMS TCK PF3 PF2 PF1 PF0 - * x x x x IN IN IN IN - * DDRF 0 0 0 0 0 0 0 0 - * x x x x PU PU PU PU - * PORTF 0 0 0 0 1 1 1 1 - * - */ -#define VAL_DDRF 0x00 -#define VAL_PORTF 0x0F - -/* x x x x x PG2 PG1 PG0 - * x x x x x IN IN IN - * DDRG 0 0 0 0 0 0 0 0 - * x x x x x PU PU PU - * PORTG 0 0 0 0 0 1 1 1 - * - */ -#define VAL_DDRG 0x00 -#define VAL_PORTG 0x07 - -#define PORTE_LED 4 -#define PORTE_BUTTON 5 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_AVR_CAN/board.mk b/boards/OLIMEX_AVR_CAN/board.mk deleted file mode 100644 index 4d2d406add..0000000000 --- a/boards/OLIMEX_AVR_CAN/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_AVR_CAN/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_AVR_CAN diff --git a/boards/OLIMEX_AVR_MT_128/board.c b/boards/OLIMEX_AVR_MT_128/board.c deleted file mode 100644 index 6a39aeff5a..0000000000 --- a/boards/OLIMEX_AVR_MT_128/board.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ -#if defined(PORTA) - {VAL_PORTA, VAL_DDRA}, -#endif -#if defined(PORTB) - {VAL_PORTB, VAL_DDRB}, -#endif -#if defined(PORTC) - {VAL_PORTC, VAL_DDRC}, -#endif -#if defined(PORTD) - {VAL_PORTD, VAL_DDRD}, -#endif -#if defined(PORTE) - {VAL_PORTE, VAL_DDRE}, -#endif -#if defined(PORTF) - {VAL_PORTF, VAL_DDRF}, -#endif -#if defined(PORTG) - {VAL_PORTG, VAL_DDRG}, -#endif -}; -#endif /* HAL_USE_PAL */ - -/** - * @brief Timer0 interrupt handler. - */ -CH_IRQ_HANDLER(TIMER0_COMP_vect) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/** - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * External interrupts setup, all disabled initially. - */ - EICRA = 0x00; - EICRB = 0x00; - EIMSK = 0x00; - - /* - * Enables Idle mode for SLEEP instruction. - */ - MCUCR = (1 << SE); - - /* - * Timer 0 setup. - */ - TCCR0 = (1 << WGM01) | (0 << WGM00) | /* CTC mode. */ - (0 << COM01) | (0 << COM00) | /* OC0A disabled. */ - (1 << CS02) | (0 << CS01) | (0 << CS00); /* CLK/64 clock. */ - OCR0 = F_CPU / 64 / CH_FREQUENCY - 1; - TCNT0 = 0; /* Reset counter. */ - TIFR = (1 << OCF0); /* Reset pending. */ - TIMSK = (1 << OCIE0); /* IRQ on compare. */ -} diff --git a/boards/OLIMEX_AVR_MT_128/board.h b/boards/OLIMEX_AVR_MT_128/board.h deleted file mode 100644 index b7deb35116..0000000000 --- a/boards/OLIMEX_AVR_MT_128/board.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex AVR-MT-128 proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_AVR_MT_128 -#define BOARD_NAME "Olimex AVR-MT-128" - -/* PA7 RLY DS B5 B4 B3 B2 B1 - * IN OUT IN IN IN IN IN IN - * DDRA 0 1 0 0 0 0 0 0 - * PU VAL HiZ HiZ HiZ HiZ HiZ HiZ - * PORTA 1 0 0 0 0 0 0 0 - */ -#define VAL_DDRA 0x40 -#define VAL_PORTA 0x80 - -/* - * All inputs with pullups. - */ -#define VAL_DDRB 0x00 -#define VAL_PORTB 0xFF - -/* D7 D6 D5 D4 PC3 E R/W RS - * OUT OUT OUT OUT IN OUT OUT OUT - * DDRC 1 1 1 1 0 1 1 1 - * PU PU PU PU PU VAL VAL VAL - * PORTC 0 0 0 0 1 0 0 0 - */ -#define VAL_DDRC 0xF7 -#define VAL_PORTC 0x08 - -/* PD7 PD6 PD5 PD4 TXD RXD PD1 PD0 - * IN IN IN IN OUT IN IN IN - * DDRD 0 0 0 0 1 0 0 0 - * PU PU PU PU VAL HiZ PU PU - * PORTD 1 1 1 1 1 0 1 1 - */ -#define VAL_DDRD 0x08 -#define VAL_PORTD 0xFB - -/* PE7 PE6 BZ2 BZ2 PE3 PE2 PE1 PE0 - * IN IN OUT OUT IN IN OUT IN - * DDRE 0 0 1 1 0 0 1 0 - * PU PU VAL VAL PU PU VAL PU - * PORTE 1 1 1 1 1 1 1 1 - */ -#define VAL_DDRE 0x32 -#define VAL_PORTE 0xFF - -/* TDI TDO TMS TCK PF3 PF2 PF1 PF0 - * x x x x IN IN IN IN - * DDRF 0 0 0 0 0 0 0 0 - * x x x x PU PU PU PU - * PORTF 0 0 0 0 1 1 1 1 - * - */ -#define VAL_DDRF 0x00 -#define VAL_PORTF 0x0F - -/* x x x x x PG2 PG1 PG0 - * x x x x x IN IN IN - * DDRG 0 0 0 0 0 0 0 0 - * x x x x x PU PU PU - * PORTG 0 0 0 0 0 1 1 1 - * - */ -#define VAL_DDRG 0x00 -#define VAL_PORTG 0x07 - - -#define PORTA_BUTTON1 0 -#define PORTA_BUTTON2 1 -#define PORTA_BUTTON3 2 -#define PORTA_BUTTON4 3 -#define PORTA_BUTTON5 4 -#define PORTA_DALLAS 5 -#define PORTA_RELAY 6 - -#define PORTC_44780_RS_MASK (1 << 0) -#define PORTC_44780_RW_MASK (1 << 1) -#define PORTC_44780_E_MASK (1 << 2) -#define PORTC_44780_D4_MASK (1 << 4) -#define PORTC_44780_D5_MASK (1 << 5) -#define PORTC_44780_D6_MASK (1 << 6) -#define PORTC_44780_D7_MASK (1 << 7) -#define PORTC_44780_DATA_MASK (PORTC_44780_D4_MASK | PORTC_44780_D5_MASK | \ - PORTC_44780_D6_MASK | PORTC_44780_D7_MASK) - -#define PORTE_BUZZ1 (1 << 4) -#define PORTE_BUZZ2 (1 << 5) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_AVR_MT_128/board.mk b/boards/OLIMEX_AVR_MT_128/board.mk deleted file mode 100644 index 7b903ffecc..0000000000 --- a/boards/OLIMEX_AVR_MT_128/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_AVR_MT_128/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_AVR_MT_128 diff --git a/boards/OLIMEX_LPC_P1343/board.c b/boards/OLIMEX_LPC_P1343/board.c deleted file mode 100644 index 5eda62f82e..0000000000 --- a/boards/OLIMEX_LPC_P1343/board.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = { - {VAL_GPIO0DATA, VAL_GPIO0DIR}, - {VAL_GPIO1DATA, VAL_GPIO1DIR}, - {VAL_GPIO2DATA, VAL_GPIO2DIR}, - {VAL_GPIO3DATA, VAL_GPIO3DIR}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - LPC13xx_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Extra, board-specific, initializations. - */ -} diff --git a/boards/OLIMEX_LPC_P1343/board.h b/boards/OLIMEX_LPC_P1343/board.h deleted file mode 100644 index 05d73fe035..0000000000 --- a/boards/OLIMEX_LPC_P1343/board.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex LPC-P1343 proto board. - */ - -/* - * Board identifiers. - */ -#define BOARD_OLIMEX_LPC_P1343 -#define BOARD_NAME "Olimex LPC-P1343" - -/* - * Board frequencies. - */ -#define SYSOSCCLK 12000000 - -/* - * GPIO 0 initial setup. - */ -#define VAL_GPIO0DIR 0x00000000 -#define VAL_GPIO0DATA 0x00000000 - -/* - * GPIO 1 initial setup. - */ -#define VAL_GPIO1DIR PAL_PORT_BIT(GPIO1_SW2) - -#define VAL_GPIO1DATA PAL_PORT_BIT(GPIO1_SW2) - -/* - * GPIO 2 initial setup. - */ - -#define VAL_GPIO2DIR PAL_PORT_BIT(GPIO2_SW1) | \ - PAL_PORT_BIT(GPIO2_LED5) | \ - PAL_PORT_BIT(GPIO2_LED6) | \ - PAL_PORT_BIT(GPIO2_LED7) | \ - PAL_PORT_BIT(GPIO2_LED8) - -#define VAL_GPIO2DATA PAL_PORT_BIT(GPIO2_LED5) | \ - PAL_PORT_BIT(GPIO2_LED6) | \ - PAL_PORT_BIT(GPIO2_LED7) | \ - PAL_PORT_BIT(GPIO2_LED8) - -/* - * GPIO 3 initial setup. - */ - -#define VAL_GPIO3DIR PAL_PORT_BIT(GPIO3_LED1) | \ - PAL_PORT_BIT(GPIO3_LED2) | \ - PAL_PORT_BIT(GPIO3_LED3) | \ - PAL_PORT_BIT(GPIO3_LED4) - -#define VAL_GPIO3DATA PAL_PORT_BIT(GPIO3_LED1) | \ - PAL_PORT_BIT(GPIO3_LED2) | \ - PAL_PORT_BIT(GPIO3_LED3) | \ - PAL_PORT_BIT(GPIO3_LED4) - -/* - * Pin definitions. - */ -#define GPIO1_SW2 4 -#define GPIO1_SPI0SEL 11 - -#define GPIO2_SW1 9 - -#define GPIO3_LED1 0 -#define GPIO3_LED2 1 -#define GPIO3_LED3 2 -#define GPIO3_LED4 3 -#define GPIO2_LED5 4 -#define GPIO2_LED6 5 -#define GPIO2_LED7 6 -#define GPIO2_LED8 7 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_LPC_P1343/board.mk b/boards/OLIMEX_LPC_P1343/board.mk deleted file mode 100644 index 718cc6e29d..0000000000 --- a/boards/OLIMEX_LPC_P1343/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_LPC_P1343/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_LPC_P1343 diff --git a/boards/OLIMEX_LPC_P2148/board.c b/boards/OLIMEX_LPC_P2148/board.c deleted file mode 100644 index b7e72f7c3a..0000000000 --- a/boards/OLIMEX_LPC_P2148/board.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#define VAL_TC0_PRESCALER 0 - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - VAL_PINSEL0, - VAL_PINSEL1, - VAL_PINSEL2, - {VAL_FIO0PIN, VAL_FIO0DIR}, - {VAL_FIO1PIN, VAL_FIO1DIR} -}; -#endif - -/* - * Timer 0 IRQ handling here. - */ -static CH_IRQ_HANDLER(T0IrqHandler) { - - CH_IRQ_PROLOGUE(); - T0IR = 1; /* Clear interrupt on match MR0. */ - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - VICVectAddr = 0; - CH_IRQ_EPILOGUE(); -} - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - lpc214x_clock_init(); -} - -#if HAL_USE_MMC_SPI -/* Board-related functions related to the MMC_SPI driver.*/ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - return !palReadPad(IOPORT2, PB_CP1); -} - -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - return palReadPad(IOPORT2, PB_WP1); -} -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * System Timer initialization, 1ms intervals. - */ - SetVICVector(T0IrqHandler, 0, SOURCE_Timer0); - VICIntEnable = INTMASK(SOURCE_Timer0); - TC *timer = T0Base; - timer->TC_PR = VAL_TC0_PRESCALER; - timer->TC_MR0 = (PCLK / CH_FREQUENCY) / (VAL_TC0_PRESCALER + 1); - timer->TC_MCR = 3; /* Interrupt and clear TC on match MR0. */ - timer->TC_TCR = 2; /* Reset counter and prescaler. */ - timer->TC_TCR = 1; /* Timer enabled. */ -} diff --git a/boards/OLIMEX_LPC_P2148/board.h b/boards/OLIMEX_LPC_P2148/board.h deleted file mode 100644 index 14a8daf5bf..0000000000 --- a/boards/OLIMEX_LPC_P2148/board.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex LPC-P2148 proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_LPC_P2148 -#define BOARD_NAME "Olimex LPC-P2148" - -/* - * The following values are implementation dependent. You may change them in - * order to match your HW. - */ -#define FOSC 12000000 -#define CCLK 48000000 -#define PCLK 12000000 - -/* - * Pins configuration for Olimex LPC-P2148. - * - * PINSEL0 - * P0 P0 P0 P0 P0 P0 RXD TXD SSE MOS MIS SCK SDA SCL RXD TXD - * 15 14 13 12 11 10 1 1 L0 I0 O0 0 0 0 0 0 - * 00 00 00 00 00 00 01 01 01 01 01 01 01 01 01 01 - * FIO0DIR (15...0) - * IN IN OUT OUT OUT OUT -- -- -- -- -- -- -- -- -- -- - * 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 - * - * PINSEL1 - * P0 AD P0 P0 -- -- AO -- VB P0 P0 P0 MOS MIS SCK P0 - * 31 03 29 28 -- -- UT -- US 22 21 20 I1 O1 1 16 - * 00 01 00 00 00 00 10 00 01 00 00 00 10 10 10 00 - * FIO0DIR (31...16) - * OUT -- OUT OUT -- -- -- -- -- OUT OUT OUT -- -- -- IN - * 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 - * - * FIO1DIR (31...16) - * -- -- -- -- -- IN IN OUT OUT OUT OUT OUT OUT OUT OUT OUT - * 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 - */ -#define VAL_PINSEL0 0x00055555 -#define VAL_PINSEL1 0x100840A8 -#define VAL_PINSEL2 0x00000004 /* Do not modify */ -#define VAL_FIO0DIR 0xB0703C00 -#define VAL_FIO1DIR 0x01FF0000 -#define VAL_FIO0PIN 0xFFFFFFFF -#define VAL_FIO1PIN 0xFFFFFFFF - -#define PA_LED1 10 -#define PA_LED2 11 -#define PA_BUZZ1 12 -#define PA_BUZZ2 13 -#define PA_BSL 14 -#define PA_BUTTON1 15 -#define PA_BUTTON2 16 -#define PA_SSEL1 20 -#define PA_LEDUSB 31 - -#define PB_WP1 24 -#define PB_CP1 25 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_LPC_P2148/board.mk b/boards/OLIMEX_LPC_P2148/board.mk deleted file mode 100644 index 5d0937e6d2..0000000000 --- a/boards/OLIMEX_LPC_P2148/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the mandatory board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_LPC_P2148/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_LPC_P2148 diff --git a/boards/OLIMEX_LPC_P2148/buzzer.c b/boards/OLIMEX_LPC_P2148/buzzer.c deleted file mode 100644 index 8f11374465..0000000000 --- a/boards/OLIMEX_LPC_P2148/buzzer.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * Buzzer driver for Olimex LPC-P2148. - * Uses the timer 1 for wave generation and a Virtual Timer for the sound - * duration. - * The driver also generates an event when the sound is done and the buzzer - * goes silent. - */ - -#include "ch.h" -#include "hal.h" - -#include "buzzer.h" - -EventSource BuzzerSilentEventSource; - -#define StartCounter(t) ((t)->TC_EMR = 0xF1, (t)->TC_TCR = 1) -#define StopCounter(t) ((t)->TC_EMR = 0, (t)->TC_TCR = 2) - -/** - * @brief Buzzer driver initialization. - */ -void buzzInit(void) { - - chEvtInit(&BuzzerSilentEventSource); - - /* - * Switches P0.12 and P0.13 to MAT1.0 and MAT1.1 functions. - * Enables Timer1 clock. - */ - PINSEL0 &= 0xF0FFFFFF; - PINSEL0 |= 0x0A000000; - PCONP = (PCONP & PCALL) | PCTIM1; - - /* - * Timer setup. - */ - TC *tc = T1Base; - StopCounter(tc); - tc->TC_CTCR = 0; /* Clock source is PCLK. */ - tc->TC_PR = 0; /* Prescaler disabled. */ - tc->TC_MCR = 2; /* Clear TC on match MR0. */ -} - -/** - * @brief Stops the sound. - * - * @param[in] p pointer to the timer - */ -static void stop(void *p) { - - StopCounter((TC *)p); - chSysLockFromIsr(); - chEvtBroadcastI(&BuzzerSilentEventSource); - chSysUnlockFromIsr(); -} - -/** - * @brief Plays a tone asynchronously. - * - * @param[in] freq approximated tone frequency - * @param[in] duration tone duration in systicks - */ -void buzzPlay(uint32_t freq, systime_t duration) { - static VirtualTimer bvt; - TC *tc = T1Base; - - chSysLock(); - - if (chVTIsArmedI(&bvt)) { /* If a sound is already being */ - chVTResetI(&bvt); /* played then aborts it. */ - StopCounter(tc); - } - - tc->TC_MR0 = tc->TC_MR1 = (PCLK / (freq * 2)); - StartCounter(tc); - chVTSetI(&bvt, duration, stop, tc); - - chSysUnlock(); -} - -/** - * @brief Plays a tone. - * - * @param[in] freq approximated tone frequency - * @param[in] duration tone duration in systicks - */ -void buzzPlayWait(uint32_t freq, systime_t duration) { - TC *tc = T1Base; - - StopCounter(tc); - tc->TC_MR0 = tc->TC_MR1 = (PCLK / (freq * 2)); - StartCounter(tc); - chThdSleep(duration); - StopCounter(tc); -} diff --git a/boards/OLIMEX_LPC_P2148/buzzer.h b/boards/OLIMEX_LPC_P2148/buzzer.h deleted file mode 100644 index 3c22359fcc..0000000000 --- a/boards/OLIMEX_LPC_P2148/buzzer.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BUZZER_H_ -#define _BUZZER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - void buzzInit(void); - void buzzPlay(uint32_t freq, systime_t duration); - void buzzPlayWait(uint32_t freq, systime_t duration); -#ifdef __cplusplus -} -#endif - -extern EventSource BuzzerSilentEventSource; - -#endif /* _BUZZER_H_ */ diff --git a/boards/OLIMEX_MSP430_P1611/board.c b/boards/OLIMEX_MSP430_P1611/board.c deleted file mode 100644 index 70534158e7..0000000000 --- a/boards/OLIMEX_MSP430_P1611/board.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ -#if defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) - {VAL_P1OUT, VAL_P1DIR}, -#endif -#if defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) - {VAL_P2OUT, VAL_P2DIR}, -#endif -#if defined(__MSP430_HAS_PORT3__) || defined(__MSP430_HAS_PORT3_R__) - {VAL_P3OUT, VAL_P3DIR}, -#endif -#if defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__) - {VAL_P4OUT, VAL_P4DIR}, -#endif -#if defined(__MSP430_HAS_PORT5__) || defined(__MSP430_HAS_PORT5_R__) - {VAL_P5OUT, VAL_P5DIR}, -#endif -#if defined(__MSP430_HAS_PORT6__) || defined(__MSP430_HAS_PORT6_R__) - {VAL_P6OUT, VAL_P6DIR}, -#endif -}; -#endif - -CH_IRQ_HANDLER(TIMERA0) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - -#if USE_MSP430_USART0 - P3SEL |= (1 << 4) | (1 << 5); -#endif - -#if USE_MSP430_USART1 - P3SEL |= (1 << 6) | (1 << 7); -#endif - - /* - * Timer 0 setup, uses SMCLK as source. - */ - TACCR0 = SMCLK / 4 / CH_FREQUENCY - 1;/* Counter limit. */ - TACTL = TACLR; /* Clean start. */ - TACTL = TASSEL_2 | ID_2 | MC_1; /* Src=SMCLK, ID=4, cmp=TACCR0. */ - TACCTL0 = CCIE; /* Interrupt on compare. */ -} diff --git a/boards/OLIMEX_MSP430_P1611/board.h b/boards/OLIMEX_MSP430_P1611/board.h deleted file mode 100644 index fef6daa7c5..0000000000 --- a/boards/OLIMEX_MSP430_P1611/board.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex MSP430-P1611 proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_MSP430_P1611 -#define BOARD_NAME "Olimex MSP430-P1611" - -/* - * Clock constants. - */ -#define LFXT1CLK 32768 -#define XT2CLK 8000000 -#define DCOCLK 750000 - -/* - * Pin definitions for the Olimex MSP430-P1611 board. - */ -#define P3_O_TXD0 4 -#define P3_O_TXD0_MASK (1 << P3_O_TXD0) -#define P3_I_RXD0 5 -#define P3_I_RXD0_MASK (1 << P3_I_RXD0) -#define P6_O_LED 0 -#define P6_O_LED_MASK (1 << P6_O_LED) -#define P6_I_BUTTON 1 -#define P6_I_BUTTON_MASK (1 << P6_I_BUTTON) - -/* - * Initial I/O ports settings. - */ -#define VAL_P1OUT 0x00 -#define VAL_P1DIR 0xFF - -#define VAL_P2OUT 0x00 -#define VAL_P2DIR 0xFF - -#define VAL_P3OUT P3_O_TXD0_MASK -#define VAL_P3DIR ~P3_I_RXD0_MASK - -#define VAL_P4OUT 0x00 -#define VAL_P4DIR 0xFF - -#define VAL_P5OUT 0x00 -#define VAL_P5DIR 0xFF - -#define VAL_P6OUT P6_O_LED_MASK -#define VAL_P6DIR ~P6_I_BUTTON_MASK - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_MSP430_P1611/board.mk b/boards/OLIMEX_MSP430_P1611/board.mk deleted file mode 100644 index 84acad8ed9..0000000000 --- a/boards/OLIMEX_MSP430_P1611/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_MSP430_P1611/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_MSP430_P1611 diff --git a/boards/OLIMEX_SAM7_EX256/board.c b/boards/OLIMEX_SAM7_EX256/board.c deleted file mode 100644 index 7b4f016f5f..0000000000 --- a/boards/OLIMEX_SAM7_EX256/board.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_PIOA_ODSR, VAL_PIOA_OSR, VAL_PIOA_PUSR}, -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - {VAL_PIOB_ODSR, VAL_PIOB_OSR, VAL_PIOB_PUSR} -#endif -}; -#endif - -/* - * SYS IRQ handling here. - */ -static CH_IRQ_HANDLER(SYSIrqHandler) { - - CH_IRQ_PROLOGUE(); - - if (AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS) { - (void) AT91C_BASE_PITC->PITC_PIVR; - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - } - -#if USE_SAM7_DBGU_UART - if (AT91C_BASE_DBGU->DBGU_CSR & - (AT91C_US_RXRDY | AT91C_US_TXRDY | AT91C_US_PARE | AT91C_US_FRAME | AT91C_US_OVRE | AT91C_US_RXBRK)) { - sd_lld_serve_interrupt(&SD3); - } -#endif - AT91C_BASE_AIC->AIC_EOICR = 0; - CH_IRQ_EPILOGUE(); -} - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - /* Watchdog disabled.*/ - AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; - - at91sam7_clock_init(); -} - -#if HAL_USE_MMC_SPI -/* Board-related functions related to the MMC_SPI driver.*/ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - return !palReadPad(IOPORT2, PIOB_MMC_CP); -} - -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - return palReadPad(IOPORT2, PIOB_MMC_WP); -} -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * LCD pins setup. - */ - palClearPad(IOPORT2, PIOB_LCD_BL); - palSetPadMode(IOPORT2, PIOB_LCD_BL, PAL_MODE_OUTPUT_PUSHPULL); - - palSetPad(IOPORT1, PIOA_LCD_RESET); - palSetPadMode(IOPORT1, PIOA_LCD_RESET, PAL_MODE_OUTPUT_PUSHPULL); - - /* - * Joystick and buttons setup. - */ - palSetGroupMode(IOPORT1, - PIOA_B1_MASK | PIOA_B2_MASK | PIOA_B3_MASK | - PIOA_B4_MASK | PIOA_B5_MASK, - 0, - PAL_MODE_INPUT); - palSetGroupMode(IOPORT2, PIOB_SW1_MASK | PIOB_SW2_MASK, 0, PAL_MODE_INPUT); - - /* - * MMC/SD slot setup. - */ - palSetGroupMode(IOPORT2, - PIOB_MMC_WP_MASK | PIOB_MMC_CP_MASK, - 0, - PAL_MODE_INPUT); - - /* - * PIT Initialization. - */ - AIC_ConfigureIT(AT91C_ID_SYS, - AT91C_AIC_SRCTYPE_HIGH_LEVEL | (AT91C_AIC_PRIOR_HIGHEST - 1), - SYSIrqHandler); - AIC_EnableIT(AT91C_ID_SYS); - AT91C_BASE_PITC->PITC_PIMR = (MCK / 16 / CH_FREQUENCY) - 1; - AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | AT91C_PITC_PITIEN; - - /* - * RTS/CTS pins enabled for USART0 only. - */ - AT91C_BASE_PIOA->PIO_PDR = AT91C_PA3_RTS0 | AT91C_PA4_CTS0; - AT91C_BASE_PIOA->PIO_ASR = AT91C_PIO_PA3 | AT91C_PIO_PA4; - AT91C_BASE_PIOA->PIO_PPUDR = AT91C_PIO_PA3 | AT91C_PIO_PA4; -} diff --git a/boards/OLIMEX_SAM7_EX256/board.h b/boards/OLIMEX_SAM7_EX256/board.h deleted file mode 100644 index d1a658b790..0000000000 --- a/boards/OLIMEX_SAM7_EX256/board.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex SAM7-EX256 development board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_SAM7_EX256 -#define BOARD_NAME "Olimex SAM7-EX256" - -/* - * Select your platform by modifying the following line. - */ -#if !defined(SAM7_PLATFORM) -#define SAM7_PLATFORM SAM7X256 -#endif - -#include "at91sam7.h" - -#define CLK 18432000 -#define MCK 48054857 - -/* - * Initial I/O setup. - */ -#define VAL_PIOA_ODSR 0x00000000 /* Output data. */ -#define VAL_PIOA_OSR 0x00000000 /* Direction. */ -#define VAL_PIOA_PUSR 0xFFFFFFFF /* Pull-up. */ - -#define VAL_PIOB_ODSR 0x00000000 /* Output data. */ -#define VAL_PIOB_OSR 0x00000000 /* Direction. */ -#define VAL_PIOB_PUSR 0xFFFFFFFF /* Pull-up. */ - -/* - * I/O definitions. - */ -#define PIOA_LCD_RESET 2 -#define PIOA_LCD_RESET_MASK (1 << PIOA_LCD_RESET) -#define PIOA_B1 7 -#define PIOA_B1_MASK (1 << PIOA_B1) -#define PIOA_B2 8 -#define PIOA_B2_MASK (1 << PIOA_B2) -#define PIOA_B3 9 -#define PIOA_B3_MASK (1 << PIOA_B3) -#define PIOA_B4 14 -#define PIOA_B4_MASK (1 << PIOA_B4) -#define PIOA_B5 15 -#define PIOA_B5_MASK (1 << PIOA_B5) -#define PIOA_USB_PUP 25 -#define PIOA_USB_PUP_MASK (1 << PIOA_USB_PUP) -#define PIOA_USB_PR 26 -#define PIOA_USB_PR_MASK (1 << PIOA_USB_PR) -#define PIOA_CS_MMC 13 - -#define PIOB_PHY_PD 18 -#define PIOB_PHY_PD_MASK (1 << PIOB_PHY_PD) -#define PIOB_AUDIO_OUT 19 -#define PIOB_AUDIO_OUT_MASK (1 << PIOB_AUDIO_OUT) -#define PIOB_LCD_BL 20 -#define PIOB_LCD_BL_MASK (1 << PIOB_LCD_BL) -#define PIOB_MMC_WP 22 -#define PIOB_MMC_WP_MASK (1 << PIOB_MMC_WP) -#define PIOB_MMC_CP 23 -#define PIOB_MMC_CP_MASK (1 << PIOB_MMC_CP) -#define PIOB_SW1 24 -#define PIOB_SW1_MASK (1 << PIOB_SW1) -#define PIOB_SW2 25 -#define PIOB_SW2_MASK (1 << PIOB_SW2) -#define PIOB_PHY_IRQ 26 -#define PIOB_PHY_IRQ_MASK (1 << PIOB_PHY_IRQ) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_SAM7_EX256/board.mk b/boards/OLIMEX_SAM7_EX256/board.mk deleted file mode 100644 index d0a4816f17..0000000000 --- a/boards/OLIMEX_SAM7_EX256/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_SAM7_EX256/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_SAM7_EX256 diff --git a/boards/OLIMEX_SAM7_P256/board.c b/boards/OLIMEX_SAM7_P256/board.c deleted file mode 100644 index 60c6b27618..0000000000 --- a/boards/OLIMEX_SAM7_P256/board.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_PIOA_ODSR, VAL_PIOA_OSR, VAL_PIOA_PUSR}, -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - {VAL_PIOB_ODSR, VAL_PIOB_OSR, VAL_PIOB_PUSR} -#endif -}; -#endif - -/* - * SYS IRQ handling here. - */ -static CH_IRQ_HANDLER(SYSIrqHandler) { - - CH_IRQ_PROLOGUE(); - - if (AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS) { - (void) AT91C_BASE_PITC->PITC_PIVR; - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - } - AT91C_BASE_AIC->AIC_EOICR = 0; - - CH_IRQ_EPILOGUE(); -} - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - /* Watchdog disabled.*/ - AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; - - at91sam7_clock_init(); -} - -#if HAL_USE_MMC_SPI -/* Board-related functions related to the MMC_SPI driver.*/ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - return !palReadPad(IOPORT1, PIOA_MMC_CP); -} - -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - return palReadPad(IOPORT1, PIOA_MMC_WP); -} -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * LED pins setup. - */ - palClearPad(IOPORT1, PIOA_LED1); - palSetPadMode(IOPORT1, PIOA_LED1, PAL_MODE_OUTPUT_PUSHPULL); - palClearPad(IOPORT1, PIOA_LED2); - palSetPadMode(IOPORT1, PIOA_LED2, PAL_MODE_OUTPUT_PUSHPULL); - - /* - * buttons setup. - */ - palSetGroupMode(IOPORT1, PIOA_B1_MASK | PIOA_B2_MASK, 0, PAL_MODE_INPUT); - - /* - * MMC/SD slot setup. - */ - palSetGroupMode(IOPORT1, - PIOA_MMC_WP_MASK | PIOA_MMC_CP_MASK, - 0, - PAL_MODE_INPUT); - - /* - * PIT Initialization. - */ - AIC_ConfigureIT(AT91C_ID_SYS, - AT91C_AIC_SRCTYPE_HIGH_LEVEL | (AT91C_AIC_PRIOR_HIGHEST - 1), - SYSIrqHandler); - AIC_EnableIT(AT91C_ID_SYS); - AT91C_BASE_PITC->PITC_PIMR = (MCK / 16 / CH_FREQUENCY) - 1; - AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | AT91C_PITC_PITIEN; -} diff --git a/boards/OLIMEX_SAM7_P256/board.h b/boards/OLIMEX_SAM7_P256/board.h deleted file mode 100644 index 3a00e7715f..0000000000 --- a/boards/OLIMEX_SAM7_P256/board.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex SAM7-P256 development board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_SAM7_P256 - -/* - * Select your platform by modifying the following line. - */ -#if !defined(SAM7_PLATFORM) -#define SAM7_PLATFORM SAM7S256 -#endif - -#include "at91sam7.h" - -#define CLK 18432000 -#define MCK 48054857 - -/* - * Initial I/O setup. - */ -#define VAL_PIOA_ODSR 0x00000000 /* Output data. */ -#define VAL_PIOA_OSR 0x00000000 /* Direction. */ -#define VAL_PIOA_PUSR 0xFFFFFFFF /* Pull-up. */ - -/* - * I/O definitions. - */ -#define PIOA_LED1 18 -#define PIOA_LED1_MASK (1 << PIOA_LED1_MASK) -#define PIOA_LED2 17 -#define PIOA_LED2_MASK (1 << PIOA_LED2_MASK) -#define PIOA_B1 19 -#define PIOA_B1_MASK (1 << PIOA_B1) -#define PIOA_B2 20 -#define PIOA_B2_MASK (1 << PIOA_B2) -#define PIOA_DP_PUP 25 -#define PIOA_DD_PUP_MASK (1 << PIOA_DP_PUP) -#define PIOA_USB_D 26 -#define PIOA_USB_D_MASK (1 << PIOA_USB_D) - -#define PIOA_MMC_WP 25 -#define PIOA_MMC_WP_MASK (1 << PIOA_MMC_WP) -#define PIOA_MMC_CP 15 -#define PIOA_MMC_CP_MASK (1 << PIOA_MMC_CP) -#define PIOA_MMC_NPCS0 11 -#define PIOA_MMC_NPCS0_MASK (1 << PIOA_MMC_NPCS0_MASK) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_SAM7_P256/board.mk b/boards/OLIMEX_SAM7_P256/board.mk deleted file mode 100644 index e9fb6691a9..0000000000 --- a/boards/OLIMEX_SAM7_P256/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_SAM7_P256/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_SAM7_P256 diff --git a/boards/OLIMEX_STM32_103STK/board.c b/boards/OLIMEX_STM32_103STK/board.c deleted file mode 100644 index 92f1fe3645..0000000000 --- a/boards/OLIMEX_STM32_103STK/board.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/OLIMEX_STM32_103STK/board.h b/boards/OLIMEX_STM32_103STK/board.h deleted file mode 100644 index ab6023ed69..0000000000 --- a/boards/OLIMEX_STM32_103STK/board.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex STM32-103STK proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_STM32_103STK -#define BOARD_NAME "Olimex STM32-103STK" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_MD - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON_WAKEUP 0 -#define GPIOC_BUTTON_TAMPER 13 -#define GPIOC_JOY 5 -#define GPIOC_JOY_CENTER_BUT 6 - -#define GPIOA_SPI1NSS 4 -#define GPIOB_SPI2NSS 12 - -#define GPIOC_MMCWP 2 -#define GPIOC_MMCCP 1 - -#define GPIOC_USB_P 4 -#define GPIOC_LCD_RES 7 -#define GPIOC_NRF_CE 8 -#define GPIOC_NRF_IRQ 9 -#define GPIOC_LCD_E 10 - -#define GPIOC_USB_DISC 11 -#define GPIOC_LED 12 - -#define GPIOB_ACCEL_IRQ 5 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input with pull-up except: - * PA0 - Normal input (BUTTON). - * PA2 - Alternate output (USART2 TX). - * PA3 - Normal input (USART2 RX). - */ -#define VAL_GPIOACRL 0x88884B84 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x88888888 /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - * Everything input with pull-up except: - * PB6,7 - Alternate open drain (I2C1). - * PB10,11 - Alternate open drain (I2C2). - * PB12 - Push Pull output (MMC SPI2 NSS). - * PB13 - Alternate output (MMC SPI2 SCK). - * PB14 - Normal input (MMC SPI2 MISO). - * PB15 - Alternate output (MMC SPI2 MOSI). - */ -#define VAL_GPIOBCRL 0xEE888888 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0xB4B3EE88 /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - * Everything input with pull-up except: - * PC4 - Normal input because there is an external resistor. - * PC5 - Analog input (joystick). - * PC6 - Normal input because there is an external resistor. - * PC7 - Normal input because there is an external resistor. - * PC10 - Push Pull output (CAN CNTRL). - * PC11 - Push Pull output (USB DISC). - * PC12 - Open Drain output (LED). - */ -#define VAL_GPIOCCRL 0x44048888 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x88863388 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFFFF - -/* - * Port D setup. - * Everything input with pull-up except: - * PD0 - Normal input (XTAL). - * PD1 - Normal input (XTAL). - */ -#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -/* - * USB bus activation macro, required by the USB driver. - */ -#define usb_lld_connect_bus(usbp) palClearPad(GPIOC, GPIOC_USB_DISC) - -/* - * USB bus de-activation macro, required by the USB driver. - */ -#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOC, GPIOC_USB_DISC) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_STM32_103STK/board.mk b/boards/OLIMEX_STM32_103STK/board.mk deleted file mode 100644 index 383e1c4908..0000000000 --- a/boards/OLIMEX_STM32_103STK/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_STM32_103STK/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_STM32_103STK diff --git a/boards/OLIMEX_STM32_E407/board.c b/boards/OLIMEX_STM32_E407/board.c deleted file mode 100644 index 743811fd00..0000000000 --- a/boards/OLIMEX_STM32_E407/board.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - static bool_t last_status = FALSE; - - if (blkIsTransferring(sdcp)) - return last_status; - return last_status = (bool_t)palReadPad(GPIOC, GPIOC_SD_D3); -} - -/** - * @brief SDC card write protection detection. - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - return FALSE; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/boards/OLIMEX_STM32_E407/board.h b/boards/OLIMEX_STM32_E407/board.h deleted file mode 100644 index 16bfccdca8..0000000000 --- a/boards/OLIMEX_STM32_E407/board.h +++ /dev/null @@ -1,1305 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for Olimex STM32-E407 board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_STM32_E407 -#define BOARD_NAME "Olimex STM32-E407" - -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID MII_KS8721_ID -#define BOARD_PHY_RMII - -/* - * Board oscillators-related settings. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768 -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 12000000 -#endif - - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 330 - -/* - * MCU type as defined in the ST header file stm32f4xx.h. - */ -#define STM32F4XX - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON_WKUP 0 -#define GPIOA_ETH_RMII_REF_CLK 1 -#define GPIOA_ETH_RMII_MDIO 2 -#define GPIOA_ETH_RMII_MDINT 3 -#define GPIOA_PIN4 4 -#define GPIOA_PIN5 5 -#define GPIOA_PIN6 6 -#define GPIOA_ETH_RMII_CRS_DV 7 -#define GPIOA_USB_HS_BUSON 8 -#define GPIOA_OTG_FS_VBUS 9 -#define GPIOA_OTG_FS_ID 10 -#define GPIOA_OTG_FS_DM 11 -#define GPIOA_OTG_FS_DP 12 -#define GPIOA_JTAG_TMS 13 -#define GPIOA_JTAG_TCK 14 -#define GPIOA_JTAG_TDI 15 - -#define GPIOB_USB_FS_BUSON 0 -#define GPIOB_USB_HS_FAULT 1 -#define GPIOB_BOOT1 2 -#define GPIOB_JTAG_TDO 3 -#define GPIOB_JTAG_TRST 4 -#define GPIOB_PIN5 5 -#define GPIOB_PIN6 6 -#define GPIOB_PIN7 7 -#define GPIOB_I2C1_SCL 8 -#define GPIOB_I2C1_SDA 9 -#define GPIOB_SPI2_SCK 10 -#define GPIOB_PIN11 11 -#define GPIOB_OTG_HS_ID 12 -#define GPIOB_OTG_HS_VBUS 13 -#define GPIOB_OTG_HS_DM 14 -#define GPIOB_OTG_HS_DP 15 - -#define GPIOC_PIN0 0 -#define GPIOC_ETH_RMII_MDC 1 -#define GPIOC_SPI2_MISO 2 -#define GPIOC_SPI2_MOSI 3 -#define GPIOC_ETH_RMII_RXD0 4 -#define GPIOC_ETH_RMII_RXD1 5 -#define GPIOC_USART6_TX 6 -#define GPIOC_USART6_RX 7 -#define GPIOC_SD_D0 8 -#define GPIOC_SD_D1 9 -#define GPIOC_SD_D2 10 -#define GPIOC_SD_D3 11 -#define GPIOC_SD_CLK 12 -#define GPIOC_LED 13 -#define GPIOC_OSC32_IN 14 -#define GPIOC_OSC32_OUT 15 - -#define GPIOD_PIN0 0 -#define GPIOD_PIN1 1 -#define GPIOD_SD_CMD 2 -#define GPIOD_PIN3 3 -#define GPIOD_PIN4 4 -#define GPIOD_PIN5 5 -#define GPIOD_PIN6 6 -#define GPIOD_PIN7 7 -#define GPIOD_PIN8 8 -#define GPIOD_PIN9 9 -#define GPIOD_PIN10 10 -#define GPIOD_PIN11 11 -#define GPIOD_PIN12 12 -#define GPIOD_PIN13 13 -#define GPIOD_PIN14 14 -#define GPIOD_PIN15 15 - -#define GPIOE_PIN0 0 -#define GPIOE_PIN1 1 -#define GPIOE_PIN2 2 -#define GPIOE_PIN3 3 -#define GPIOE_PIN4 4 -#define GPIOE_PIN5 5 -#define GPIOE_PIN6 6 -#define GPIOE_PIN7 7 -#define GPIOE_PIN8 8 -#define GPIOE_PIN9 9 -#define GPIOE_PIN10 10 -#define GPIOE_PIN11 11 -#define GPIOE_PIN12 12 -#define GPIOE_PIN13 13 -#define GPIOE_PIN14 14 -#define GPIOE_PIN15 15 - -#define GPIOF_PIN0 0 -#define GPIOF_PIN1 1 -#define GPIOF_PIN2 2 -#define GPIOF_PIN3 3 -#define GPIOF_PIN4 4 -#define GPIOF_PIN5 5 -#define GPIOF_PIN6 6 -#define GPIOF_PIN7 7 -#define GPIOF_PIN8 8 -#define GPIOF_PIN9 9 -#define GPIOF_PIN10 10 -#define GPIOF_USB_FS_FAULT 11 -#define GPIOF_PIN12 12 -#define GPIOF_PIN13 13 -#define GPIOF_PIN14 14 -#define GPIOF_PIN15 15 - -#define GPIOG_PIN0 0 -#define GPIOG_PIN1 1 -#define GPIOG_PIN2 2 -#define GPIOG_PIN3 3 -#define GPIOG_PIN4 4 -#define GPIOG_PIN5 5 -#define GPIOG_PIN6 6 -#define GPIOG_PIN7 7 -#define GPIOG_PIN8 8 -#define GPIOG_PIN9 9 -#define GPIOG_SPI2_CS 10 -#define GPIOG_ETH_RMII_TXEN 11 -#define GPIOG_PIN12 12 -#define GPIOG_ETH_RMII_TXD0 13 -#define GPIOG_ETH_RMII_TXD1 14 -#define GPIOG_PIN15 15 - -#define GPIOH_OSC_IN 0 -#define GPIOH_OSC_OUT 1 -#define GPIOH_PIN2 2 -#define GPIOH_PIN3 3 -#define GPIOH_PIN4 4 -#define GPIOH_PIN5 5 -#define GPIOH_PIN6 6 -#define GPIOH_PIN7 7 -#define GPIOH_PIN8 8 -#define GPIOH_PIN9 9 -#define GPIOH_PIN10 10 -#define GPIOH_PIN11 11 -#define GPIOH_PIN12 12 -#define GPIOH_PIN13 13 -#define GPIOH_PIN14 14 -#define GPIOH_PIN15 15 - -#define GPIOI_PIN0 0 -#define GPIOI_PIN1 1 -#define GPIOI_PIN2 2 -#define GPIOI_PIN3 3 -#define GPIOI_PIN4 4 -#define GPIOI_PIN5 5 -#define GPIOI_PIN6 6 -#define GPIOI_PIN7 7 -#define GPIOI_PIN8 8 -#define GPIOI_PIN9 9 -#define GPIOI_PIN10 10 -#define GPIOI_PIN11 11 -#define GPIOI_PIN12 12 -#define GPIOI_PIN13 13 -#define GPIOI_PIN14 14 -#define GPIOI_PIN15 15 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * GPIOA setup: - * - * PA0 - BUTTON_WKUP (input floating). - * PA1 - ETH_RMII_REF_CLK (alternate 11). - * PA2 - ETH_RMII_MDIO (alternate 11). - * PA3 - ETH_RMII_MDINT (input floating). - * PA4 - PIN4 (input pullup). - * PA5 - PIN5 (input pullup). - * PA6 - PIN6 (input pullup). - * PA7 - ETH_RMII_CRS_DV (alternate 11). - * PA8 - USB_HS_BUSON (output pushpull maximum). - * PA9 - OTG_FS_VBUS (input pulldown). - * PA10 - OTG_FS_ID (alternate 10). - * PA11 - OTG_FS_DM (alternate 10). - * PA12 - OTG_FS_DP (alternate 10). - * PA13 - JTAG_TMS (alternate 0). - * PA14 - JTAG_TCK (alternate 0). - * PA15 - JTAG_TDI (alternate 0). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON_WKUP) | \ - PIN_MODE_ALTERNATE(GPIOA_ETH_RMII_REF_CLK) |\ - PIN_MODE_ALTERNATE(GPIOA_ETH_RMII_MDIO) |\ - PIN_MODE_INPUT(GPIOA_ETH_RMII_MDINT) | \ - PIN_MODE_INPUT(GPIOA_PIN4) | \ - PIN_MODE_INPUT(GPIOA_PIN5) | \ - PIN_MODE_INPUT(GPIOA_PIN6) | \ - PIN_MODE_ALTERNATE(GPIOA_ETH_RMII_CRS_DV) |\ - PIN_MODE_OUTPUT(GPIOA_USB_HS_BUSON) | \ - PIN_MODE_INPUT(GPIOA_OTG_FS_VBUS) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ - PIN_MODE_ALTERNATE(GPIOA_JTAG_TMS) | \ - PIN_MODE_ALTERNATE(GPIOA_JTAG_TCK) | \ - PIN_MODE_ALTERNATE(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON_WKUP) |\ - PIN_OTYPE_PUSHPULL(GPIOA_ETH_RMII_REF_CLK) |\ - PIN_OTYPE_PUSHPULL(GPIOA_ETH_RMII_MDIO) |\ - PIN_OTYPE_PUSHPULL(GPIOA_ETH_RMII_MDINT) |\ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_ETH_RMII_CRS_DV) |\ - PIN_OTYPE_PUSHPULL(GPIOA_USB_HS_BUSON) |\ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_VBUS) |\ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_ID) | \ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_DM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_DP) | \ - PIN_OTYPE_PUSHPULL(GPIOA_JTAG_TMS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_JTAG_TCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_100M(GPIOA_BUTTON_WKUP) | \ - PIN_OSPEED_100M(GPIOA_ETH_RMII_REF_CLK) |\ - PIN_OSPEED_100M(GPIOA_ETH_RMII_MDIO) | \ - PIN_OSPEED_100M(GPIOA_ETH_RMII_MDINT) |\ - PIN_OSPEED_100M(GPIOA_PIN4) | \ - PIN_OSPEED_100M(GPIOA_PIN5) | \ - PIN_OSPEED_100M(GPIOA_PIN6) | \ - PIN_OSPEED_100M(GPIOA_ETH_RMII_CRS_DV) |\ - PIN_OSPEED_100M(GPIOA_USB_HS_BUSON) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_VBUS) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_ID) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_DM) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_DP) | \ - PIN_OSPEED_100M(GPIOA_JTAG_TMS) | \ - PIN_OSPEED_100M(GPIOA_JTAG_TCK) | \ - PIN_OSPEED_100M(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON_WKUP) |\ - PIN_PUPDR_FLOATING(GPIOA_ETH_RMII_REF_CLK) |\ - PIN_PUPDR_FLOATING(GPIOA_ETH_RMII_MDIO) |\ - PIN_PUPDR_FLOATING(GPIOA_ETH_RMII_MDINT) |\ - PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOA_ETH_RMII_CRS_DV) |\ - PIN_PUPDR_FLOATING(GPIOA_USB_HS_BUSON) |\ - PIN_PUPDR_PULLDOWN(GPIOA_OTG_FS_VBUS) |\ - PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ - PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ - PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ - PIN_PUPDR_FLOATING(GPIOA_JTAG_TMS) | \ - PIN_PUPDR_PULLDOWN(GPIOA_JTAG_TCK) | \ - PIN_PUPDR_FLOATING(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON_WKUP) | \ - PIN_ODR_HIGH(GPIOA_ETH_RMII_REF_CLK) | \ - PIN_ODR_HIGH(GPIOA_ETH_RMII_MDIO) | \ - PIN_ODR_HIGH(GPIOA_ETH_RMII_MDINT) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_ETH_RMII_CRS_DV) | \ - PIN_ODR_HIGH(GPIOA_USB_HS_BUSON) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_VBUS) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_ID) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_DM) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_DP) | \ - PIN_ODR_HIGH(GPIOA_JTAG_TMS) | \ - PIN_ODR_HIGH(GPIOA_JTAG_TCK) | \ - PIN_ODR_HIGH(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON_WKUP, 0) | \ - PIN_AFIO_AF(GPIOA_ETH_RMII_REF_CLK, 11) |\ - PIN_AFIO_AF(GPIOA_ETH_RMII_MDIO, 11) | \ - PIN_AFIO_AF(GPIOA_ETH_RMII_MDINT, 0) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0) | \ - PIN_AFIO_AF(GPIOA_ETH_RMII_CRS_DV, 11)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_USB_HS_BUSON, 0) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_VBUS, 0) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_ID, 10) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DM, 10) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DP, 10) | \ - PIN_AFIO_AF(GPIOA_JTAG_TMS, 0) | \ - PIN_AFIO_AF(GPIOA_JTAG_TCK, 0) | \ - PIN_AFIO_AF(GPIOA_JTAG_TDI, 0)) - -/* - * GPIOB setup: - * - * PB0 - USB_FS_BUSON (output pushpull maximum). - * PB1 - USB_HS_FAULT (input floating). - * PB2 - BOOT1 (input floating). - * PB3 - JTAG_TDO (alternate 0). - * PB4 - JTAG_TRST (alternate 0). - * PB5 - PIN5 (input pullup). - * PB6 - PIN6 (input pullup). - * PB7 - PIN7 (input pullup). - * PB8 - I2C1_SCL (alternate 4). - * PB9 - I2C1_SDA (alternate 0). - * PB10 - SPI2_SCK (alternate 5). - * PB11 - PIN11 (input pullup). - * PB12 - OTG_HS_ID (alternate 12). - * PB13 - OTG_HS_VBUS (input pulldown). - * PB14 - OTG_HS_DM (alternate 12). - * PB15 - OTG_HS_DP (alternate 12). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_USB_FS_BUSON) | \ - PIN_MODE_INPUT(GPIOB_USB_HS_FAULT) | \ - PIN_MODE_INPUT(GPIOB_BOOT1) | \ - PIN_MODE_ALTERNATE(GPIOB_JTAG_TDO) | \ - PIN_MODE_ALTERNATE(GPIOB_JTAG_TRST) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_INPUT(GPIOB_PIN6) | \ - PIN_MODE_INPUT(GPIOB_PIN7) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SCL) | \ - PIN_MODE_ALTERNATE(GPIOB_I2C1_SDA) | \ - PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_ALTERNATE(GPIOB_OTG_HS_ID) | \ - PIN_MODE_INPUT(GPIOB_OTG_HS_VBUS) | \ - PIN_MODE_ALTERNATE(GPIOB_OTG_HS_DM) | \ - PIN_MODE_ALTERNATE(GPIOB_OTG_HS_DP)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_USB_FS_BUSON) |\ - PIN_OTYPE_PUSHPULL(GPIOB_USB_HS_FAULT) |\ - PIN_OTYPE_PUSHPULL(GPIOB_BOOT1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_JTAG_TDO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_JTAG_TRST) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SCL) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_I2C1_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_OTG_HS_ID) | \ - PIN_OTYPE_PUSHPULL(GPIOB_OTG_HS_VBUS) |\ - PIN_OTYPE_PUSHPULL(GPIOB_OTG_HS_DM) | \ - PIN_OTYPE_PUSHPULL(GPIOB_OTG_HS_DP)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_100M(GPIOB_USB_FS_BUSON) | \ - PIN_OSPEED_100M(GPIOB_USB_HS_FAULT) | \ - PIN_OSPEED_100M(GPIOB_BOOT1) | \ - PIN_OSPEED_100M(GPIOB_JTAG_TDO) | \ - PIN_OSPEED_100M(GPIOB_JTAG_TRST) | \ - PIN_OSPEED_100M(GPIOB_PIN5) | \ - PIN_OSPEED_100M(GPIOB_PIN6) | \ - PIN_OSPEED_100M(GPIOB_PIN7) | \ - PIN_OSPEED_100M(GPIOB_I2C1_SCL) | \ - PIN_OSPEED_100M(GPIOB_I2C1_SDA) | \ - PIN_OSPEED_100M(GPIOB_SPI2_SCK) | \ - PIN_OSPEED_100M(GPIOB_PIN11) | \ - PIN_OSPEED_100M(GPIOB_OTG_HS_ID) | \ - PIN_OSPEED_100M(GPIOB_OTG_HS_VBUS) | \ - PIN_OSPEED_100M(GPIOB_OTG_HS_DM) | \ - PIN_OSPEED_100M(GPIOB_OTG_HS_DP)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_FLOATING(GPIOB_USB_FS_BUSON) |\ - PIN_PUPDR_FLOATING(GPIOB_USB_HS_FAULT) |\ - PIN_PUPDR_FLOATING(GPIOB_BOOT1) | \ - PIN_PUPDR_FLOATING(GPIOB_JTAG_TDO) | \ - PIN_PUPDR_FLOATING(GPIOB_JTAG_TRST) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SCL) | \ - PIN_PUPDR_FLOATING(GPIOB_I2C1_SDA) | \ - PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOB_OTG_HS_ID) | \ - PIN_PUPDR_PULLDOWN(GPIOB_OTG_HS_VBUS) |\ - PIN_PUPDR_FLOATING(GPIOB_OTG_HS_DM) | \ - PIN_PUPDR_FLOATING(GPIOB_OTG_HS_DP)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_USB_FS_BUSON) | \ - PIN_ODR_HIGH(GPIOB_USB_HS_FAULT) | \ - PIN_ODR_HIGH(GPIOB_BOOT1) | \ - PIN_ODR_HIGH(GPIOB_JTAG_TDO) | \ - PIN_ODR_HIGH(GPIOB_JTAG_TRST) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SCL) | \ - PIN_ODR_HIGH(GPIOB_I2C1_SDA) | \ - PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_OTG_HS_ID) | \ - PIN_ODR_HIGH(GPIOB_OTG_HS_VBUS) | \ - PIN_ODR_HIGH(GPIOB_OTG_HS_DM) | \ - PIN_ODR_HIGH(GPIOB_OTG_HS_DP)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_USB_FS_BUSON, 0) | \ - PIN_AFIO_AF(GPIOB_USB_HS_FAULT, 0) | \ - PIN_AFIO_AF(GPIOB_BOOT1, 0) | \ - PIN_AFIO_AF(GPIOB_JTAG_TDO, 0) | \ - PIN_AFIO_AF(GPIOB_JTAG_TRST, 0) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_I2C1_SCL, 4) | \ - PIN_AFIO_AF(GPIOB_I2C1_SDA, 0) | \ - PIN_AFIO_AF(GPIOB_SPI2_SCK, 5) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_ID, 12) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_VBUS, 0) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_DM, 12) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_DP, 12)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - ETH_RMII_MDC (alternate 11). - * PC2 - SPI2_MISO (alternate 5). - * PC3 - SPI2_MOSI (alternate 5). - * PC4 - ETH_RMII_RXD0 (alternate 11). - * PC5 - ETH_RMII_RXD1 (alternate 11). - * PC6 - USART6_TX (alternate 8). - * PC7 - USART6_RX (alternate 8). - * PC8 - SD_D0 (alternate 12). - * PC9 - SD_D1 (alternate 12). - * PC10 - SD_D2 (alternate 12). - * PC11 - SD_D3 (alternate 12). - * PC12 - SD_CLK (alternate 12). - * PC13 - LED (output pushpull maximum). - * PC14 - OSC32_IN (input floating). - * PC15 - OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_ALTERNATE(GPIOC_ETH_RMII_MDC) |\ - PIN_MODE_ALTERNATE(GPIOC_SPI2_MISO) | \ - PIN_MODE_ALTERNATE(GPIOC_SPI2_MOSI) | \ - PIN_MODE_ALTERNATE(GPIOC_ETH_RMII_RXD0) |\ - PIN_MODE_ALTERNATE(GPIOC_ETH_RMII_RXD1) |\ - PIN_MODE_ALTERNATE(GPIOC_USART6_TX) | \ - PIN_MODE_ALTERNATE(GPIOC_USART6_RX) | \ - PIN_MODE_ALTERNATE(GPIOC_SD_D0) | \ - PIN_MODE_ALTERNATE(GPIOC_SD_D1) | \ - PIN_MODE_ALTERNATE(GPIOC_SD_D2) | \ - PIN_MODE_ALTERNATE(GPIOC_SD_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SD_CLK) | \ - PIN_MODE_OUTPUT(GPIOC_LED) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_ETH_RMII_MDC) |\ - PIN_OTYPE_PUSHPULL(GPIOC_SPI2_MISO) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SPI2_MOSI) | \ - PIN_OTYPE_PUSHPULL(GPIOC_ETH_RMII_RXD0) |\ - PIN_OTYPE_PUSHPULL(GPIOC_ETH_RMII_RXD1) |\ - PIN_OTYPE_PUSHPULL(GPIOC_USART6_TX) | \ - PIN_OTYPE_PUSHPULL(GPIOC_USART6_RX) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SD_D0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SD_D1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SD_D2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SD_D3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SD_CLK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_LED) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_100M(GPIOC_PIN0) | \ - PIN_OSPEED_100M(GPIOC_ETH_RMII_MDC) | \ - PIN_OSPEED_100M(GPIOC_SPI2_MISO) | \ - PIN_OSPEED_100M(GPIOC_SPI2_MOSI) | \ - PIN_OSPEED_100M(GPIOC_ETH_RMII_RXD0) | \ - PIN_OSPEED_100M(GPIOC_ETH_RMII_RXD1) | \ - PIN_OSPEED_100M(GPIOC_USART6_TX) | \ - PIN_OSPEED_100M(GPIOC_USART6_RX) | \ - PIN_OSPEED_100M(GPIOC_SD_D0) | \ - PIN_OSPEED_100M(GPIOC_SD_D1) | \ - PIN_OSPEED_100M(GPIOC_SD_D2) | \ - PIN_OSPEED_100M(GPIOC_SD_D3) | \ - PIN_OSPEED_100M(GPIOC_SD_CLK) | \ - PIN_OSPEED_100M(GPIOC_LED) | \ - PIN_OSPEED_100M(GPIOC_OSC32_IN) | \ - PIN_OSPEED_100M(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOC_ETH_RMII_MDC) |\ - PIN_PUPDR_FLOATING(GPIOC_SPI2_MISO) | \ - PIN_PUPDR_FLOATING(GPIOC_SPI2_MOSI) | \ - PIN_PUPDR_FLOATING(GPIOC_ETH_RMII_RXD0) |\ - PIN_PUPDR_FLOATING(GPIOC_ETH_RMII_RXD1) |\ - PIN_PUPDR_FLOATING(GPIOC_USART6_TX) | \ - PIN_PUPDR_FLOATING(GPIOC_USART6_RX) | \ - PIN_PUPDR_FLOATING(GPIOC_SD_D0) | \ - PIN_PUPDR_FLOATING(GPIOC_SD_D1) | \ - PIN_PUPDR_FLOATING(GPIOC_SD_D2) | \ - PIN_PUPDR_FLOATING(GPIOC_SD_D3) | \ - PIN_PUPDR_FLOATING(GPIOC_SD_CLK) | \ - PIN_PUPDR_FLOATING(GPIOC_LED) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_ETH_RMII_MDC) | \ - PIN_ODR_HIGH(GPIOC_SPI2_MISO) | \ - PIN_ODR_HIGH(GPIOC_SPI2_MOSI) | \ - PIN_ODR_HIGH(GPIOC_ETH_RMII_RXD0) | \ - PIN_ODR_HIGH(GPIOC_ETH_RMII_RXD1) | \ - PIN_ODR_HIGH(GPIOC_USART6_TX) | \ - PIN_ODR_HIGH(GPIOC_USART6_RX) | \ - PIN_ODR_HIGH(GPIOC_SD_D0) | \ - PIN_ODR_HIGH(GPIOC_SD_D1) | \ - PIN_ODR_HIGH(GPIOC_SD_D2) | \ - PIN_ODR_HIGH(GPIOC_SD_D3) | \ - PIN_ODR_HIGH(GPIOC_SD_CLK) | \ - PIN_ODR_HIGH(GPIOC_LED) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ - PIN_AFIO_AF(GPIOC_ETH_RMII_MDC, 11) | \ - PIN_AFIO_AF(GPIOC_SPI2_MISO, 5) | \ - PIN_AFIO_AF(GPIOC_SPI2_MOSI, 5) | \ - PIN_AFIO_AF(GPIOC_ETH_RMII_RXD0, 11) | \ - PIN_AFIO_AF(GPIOC_ETH_RMII_RXD1, 11) | \ - PIN_AFIO_AF(GPIOC_USART6_TX, 8) | \ - PIN_AFIO_AF(GPIOC_USART6_RX, 8)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SD_D0, 12) | \ - PIN_AFIO_AF(GPIOC_SD_D1, 12) | \ - PIN_AFIO_AF(GPIOC_SD_D2, 12) | \ - PIN_AFIO_AF(GPIOC_SD_D3, 12) | \ - PIN_AFIO_AF(GPIOC_SD_CLK, 12) | \ - PIN_AFIO_AF(GPIOC_LED, 0) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - SD_CMD (alternate 12). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_ALTERNATE(GPIOD_SD_CMD) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_SD_CMD) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_100M(GPIOD_PIN0) | \ - PIN_OSPEED_100M(GPIOD_PIN1) | \ - PIN_OSPEED_100M(GPIOD_SD_CMD) | \ - PIN_OSPEED_100M(GPIOD_PIN3) | \ - PIN_OSPEED_100M(GPIOD_PIN4) | \ - PIN_OSPEED_100M(GPIOD_PIN5) | \ - PIN_OSPEED_100M(GPIOD_PIN6) | \ - PIN_OSPEED_100M(GPIOD_PIN7) | \ - PIN_OSPEED_100M(GPIOD_PIN8) | \ - PIN_OSPEED_100M(GPIOD_PIN9) | \ - PIN_OSPEED_100M(GPIOD_PIN10) | \ - PIN_OSPEED_100M(GPIOD_PIN11) | \ - PIN_OSPEED_100M(GPIOD_PIN12) | \ - PIN_OSPEED_100M(GPIOD_PIN13) | \ - PIN_OSPEED_100M(GPIOD_PIN14) | \ - PIN_OSPEED_100M(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOD_SD_CMD) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_SD_CMD) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0) | \ - PIN_AFIO_AF(GPIOD_SD_CMD, 12) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_100M(GPIOE_PIN0) | \ - PIN_OSPEED_100M(GPIOE_PIN1) | \ - PIN_OSPEED_100M(GPIOE_PIN2) | \ - PIN_OSPEED_100M(GPIOE_PIN3) | \ - PIN_OSPEED_100M(GPIOE_PIN4) | \ - PIN_OSPEED_100M(GPIOE_PIN5) | \ - PIN_OSPEED_100M(GPIOE_PIN6) | \ - PIN_OSPEED_100M(GPIOE_PIN7) | \ - PIN_OSPEED_100M(GPIOE_PIN8) | \ - PIN_OSPEED_100M(GPIOE_PIN9) | \ - PIN_OSPEED_100M(GPIOE_PIN10) | \ - PIN_OSPEED_100M(GPIOE_PIN11) | \ - PIN_OSPEED_100M(GPIOE_PIN12) | \ - PIN_OSPEED_100M(GPIOE_PIN13) | \ - PIN_OSPEED_100M(GPIOE_PIN14) | \ - PIN_OSPEED_100M(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (input pullup). - * PF1 - PIN1 (input pullup). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - USB_FS_FAULT (input floating). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_PIN0) | \ - PIN_MODE_INPUT(GPIOF_PIN1) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_USB_FS_FAULT) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_USB_FS_FAULT) |\ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_100M(GPIOF_PIN0) | \ - PIN_OSPEED_100M(GPIOF_PIN1) | \ - PIN_OSPEED_100M(GPIOF_PIN2) | \ - PIN_OSPEED_100M(GPIOF_PIN3) | \ - PIN_OSPEED_100M(GPIOF_PIN4) | \ - PIN_OSPEED_100M(GPIOF_PIN5) | \ - PIN_OSPEED_100M(GPIOF_PIN6) | \ - PIN_OSPEED_100M(GPIOF_PIN7) | \ - PIN_OSPEED_100M(GPIOF_PIN8) | \ - PIN_OSPEED_100M(GPIOF_PIN9) | \ - PIN_OSPEED_100M(GPIOF_PIN10) | \ - PIN_OSPEED_100M(GPIOF_USB_FS_FAULT) | \ - PIN_OSPEED_100M(GPIOF_PIN12) | \ - PIN_OSPEED_100M(GPIOF_PIN13) | \ - PIN_OSPEED_100M(GPIOF_PIN14) | \ - PIN_OSPEED_100M(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_USB_FS_FAULT) |\ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_USB_FS_FAULT) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0) | \ - PIN_AFIO_AF(GPIOF_USB_FS_FAULT, 0) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (input pullup). - * PG1 - PIN1 (input pullup). - * PG2 - PIN2 (input pullup). - * PG3 - PIN3 (input pullup). - * PG4 - PIN4 (input pullup). - * PG5 - PIN5 (input pullup). - * PG6 - PIN6 (input pullup). - * PG7 - PIN7 (input pullup). - * PG8 - PIN8 (input pullup). - * PG9 - PIN9 (input pullup). - * PG10 - SPI2_CS (output pushpull maximum). - * PG11 - ETH_RMII_TXEN (alternate 11). - * PG12 - PIN12 (input pullup). - * PG13 - ETH_RMII_TXD0 (alternate 11). - * PG14 - ETH_RMII_TXD1 (alternate 11). - * PG15 - PIN15 (input pullup). - */ -#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ - PIN_MODE_INPUT(GPIOG_PIN1) | \ - PIN_MODE_INPUT(GPIOG_PIN2) | \ - PIN_MODE_INPUT(GPIOG_PIN3) | \ - PIN_MODE_INPUT(GPIOG_PIN4) | \ - PIN_MODE_INPUT(GPIOG_PIN5) | \ - PIN_MODE_INPUT(GPIOG_PIN6) | \ - PIN_MODE_INPUT(GPIOG_PIN7) | \ - PIN_MODE_INPUT(GPIOG_PIN8) | \ - PIN_MODE_INPUT(GPIOG_PIN9) | \ - PIN_MODE_OUTPUT(GPIOG_SPI2_CS) | \ - PIN_MODE_ALTERNATE(GPIOG_ETH_RMII_TXEN) |\ - PIN_MODE_INPUT(GPIOG_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOG_ETH_RMII_TXD0) |\ - PIN_MODE_ALTERNATE(GPIOG_ETH_RMII_TXD1) |\ - PIN_MODE_INPUT(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_SPI2_CS) | \ - PIN_OTYPE_PUSHPULL(GPIOG_ETH_RMII_TXEN) |\ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_ETH_RMII_TXD0) |\ - PIN_OTYPE_PUSHPULL(GPIOG_ETH_RMII_TXD1) |\ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_100M(GPIOG_PIN0) | \ - PIN_OSPEED_100M(GPIOG_PIN1) | \ - PIN_OSPEED_100M(GPIOG_PIN2) | \ - PIN_OSPEED_100M(GPIOG_PIN3) | \ - PIN_OSPEED_100M(GPIOG_PIN4) | \ - PIN_OSPEED_100M(GPIOG_PIN5) | \ - PIN_OSPEED_100M(GPIOG_PIN6) | \ - PIN_OSPEED_100M(GPIOG_PIN7) | \ - PIN_OSPEED_100M(GPIOG_PIN8) | \ - PIN_OSPEED_100M(GPIOG_PIN9) | \ - PIN_OSPEED_100M(GPIOG_SPI2_CS) | \ - PIN_OSPEED_100M(GPIOG_ETH_RMII_TXEN) | \ - PIN_OSPEED_100M(GPIOG_PIN12) | \ - PIN_OSPEED_100M(GPIOG_ETH_RMII_TXD0) | \ - PIN_OSPEED_100M(GPIOG_ETH_RMII_TXD1) | \ - PIN_OSPEED_100M(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_SPI2_CS) | \ - PIN_PUPDR_FLOATING(GPIOG_ETH_RMII_TXEN) |\ - PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_ETH_RMII_TXD0) |\ - PIN_PUPDR_FLOATING(GPIOG_ETH_RMII_TXD1) |\ - PIN_PUPDR_PULLUP(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_SPI2_CS) | \ - PIN_ODR_HIGH(GPIOG_ETH_RMII_TXEN) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_ETH_RMII_TXD0) | \ - PIN_ODR_HIGH(GPIOG_ETH_RMII_TXD1) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0) | \ - PIN_AFIO_AF(GPIOG_SPI2_CS, 0) | \ - PIN_AFIO_AF(GPIOG_ETH_RMII_TXEN, 11) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0) | \ - PIN_AFIO_AF(GPIOG_ETH_RMII_TXD0, 11) | \ - PIN_AFIO_AF(GPIOG_ETH_RMII_TXD1, 11) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (input floating). - * PH1 - OSC_OUT (input floating). - * PH2 - PIN2 (input pullup). - * PH3 - PIN3 (input pullup). - * PH4 - PIN4 (input pullup). - * PH5 - PIN5 (input pullup). - * PH6 - PIN6 (input pullup). - * PH7 - PIN7 (input pullup). - * PH8 - PIN8 (input pullup). - * PH9 - PIN9 (input pullup). - * PH10 - PIN10 (input pullup). - * PH11 - PIN11 (input pullup). - * PH12 - PIN12 (input pullup). - * PH13 - PIN13 (input pullup). - * PH14 - PIN14 (input pullup). - * PH15 - PIN15 (input pullup). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOH_PIN2) | \ - PIN_MODE_INPUT(GPIOH_PIN3) | \ - PIN_MODE_INPUT(GPIOH_PIN4) | \ - PIN_MODE_INPUT(GPIOH_PIN5) | \ - PIN_MODE_INPUT(GPIOH_PIN6) | \ - PIN_MODE_INPUT(GPIOH_PIN7) | \ - PIN_MODE_INPUT(GPIOH_PIN8) | \ - PIN_MODE_INPUT(GPIOH_PIN9) | \ - PIN_MODE_INPUT(GPIOH_PIN10) | \ - PIN_MODE_INPUT(GPIOH_PIN11) | \ - PIN_MODE_INPUT(GPIOH_PIN12) | \ - PIN_MODE_INPUT(GPIOH_PIN13) | \ - PIN_MODE_INPUT(GPIOH_PIN14) | \ - PIN_MODE_INPUT(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_100M(GPIOH_OSC_IN) | \ - PIN_OSPEED_100M(GPIOH_OSC_OUT) | \ - PIN_OSPEED_100M(GPIOH_PIN2) | \ - PIN_OSPEED_100M(GPIOH_PIN3) | \ - PIN_OSPEED_100M(GPIOH_PIN4) | \ - PIN_OSPEED_100M(GPIOH_PIN5) | \ - PIN_OSPEED_100M(GPIOH_PIN6) | \ - PIN_OSPEED_100M(GPIOH_PIN7) | \ - PIN_OSPEED_100M(GPIOH_PIN8) | \ - PIN_OSPEED_100M(GPIOH_PIN9) | \ - PIN_OSPEED_100M(GPIOH_PIN10) | \ - PIN_OSPEED_100M(GPIOH_PIN11) | \ - PIN_OSPEED_100M(GPIOH_PIN12) | \ - PIN_OSPEED_100M(GPIOH_PIN13) | \ - PIN_OSPEED_100M(GPIOH_PIN14) | \ - PIN_OSPEED_100M(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0)) - -/* - * GPIOI setup: - * - * PI0 - PIN0 (input pullup). - * PI1 - PIN1 (input pullup). - * PI2 - PIN2 (input pullup). - * PI3 - PIN3 (input pullup). - * PI4 - PIN4 (input pullup). - * PI5 - PIN5 (input pullup). - * PI6 - PIN6 (input pullup). - * PI7 - PIN7 (input pullup). - * PI8 - PIN8 (input pullup). - * PI9 - PIN9 (input pullup). - * PI10 - PIN10 (input pullup). - * PI11 - PIN11 (input pullup). - * PI12 - PIN12 (input pullup). - * PI13 - PIN13 (input pullup). - * PI14 - PIN14 (input pullup). - * PI15 - PIN15 (input pullup). - */ -#define VAL_GPIOI_MODER (PIN_MODE_INPUT(GPIOI_PIN0) | \ - PIN_MODE_INPUT(GPIOI_PIN1) | \ - PIN_MODE_INPUT(GPIOI_PIN2) | \ - PIN_MODE_INPUT(GPIOI_PIN3) | \ - PIN_MODE_INPUT(GPIOI_PIN4) | \ - PIN_MODE_INPUT(GPIOI_PIN5) | \ - PIN_MODE_INPUT(GPIOI_PIN6) | \ - PIN_MODE_INPUT(GPIOI_PIN7) | \ - PIN_MODE_INPUT(GPIOI_PIN8) | \ - PIN_MODE_INPUT(GPIOI_PIN9) | \ - PIN_MODE_INPUT(GPIOI_PIN10) | \ - PIN_MODE_INPUT(GPIOI_PIN11) | \ - PIN_MODE_INPUT(GPIOI_PIN12) | \ - PIN_MODE_INPUT(GPIOI_PIN13) | \ - PIN_MODE_INPUT(GPIOI_PIN14) | \ - PIN_MODE_INPUT(GPIOI_PIN15)) -#define VAL_GPIOI_OTYPER (PIN_OTYPE_PUSHPULL(GPIOI_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN15)) -#define VAL_GPIOI_OSPEEDR (PIN_OSPEED_100M(GPIOI_PIN0) | \ - PIN_OSPEED_100M(GPIOI_PIN1) | \ - PIN_OSPEED_100M(GPIOI_PIN2) | \ - PIN_OSPEED_100M(GPIOI_PIN3) | \ - PIN_OSPEED_100M(GPIOI_PIN4) | \ - PIN_OSPEED_100M(GPIOI_PIN5) | \ - PIN_OSPEED_100M(GPIOI_PIN6) | \ - PIN_OSPEED_100M(GPIOI_PIN7) | \ - PIN_OSPEED_100M(GPIOI_PIN8) | \ - PIN_OSPEED_100M(GPIOI_PIN9) | \ - PIN_OSPEED_100M(GPIOI_PIN10) | \ - PIN_OSPEED_100M(GPIOI_PIN11) | \ - PIN_OSPEED_100M(GPIOI_PIN12) | \ - PIN_OSPEED_100M(GPIOI_PIN13) | \ - PIN_OSPEED_100M(GPIOI_PIN14) | \ - PIN_OSPEED_100M(GPIOI_PIN15)) -#define VAL_GPIOI_PUPDR (PIN_PUPDR_PULLUP(GPIOI_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOI_PIN15)) -#define VAL_GPIOI_ODR (PIN_ODR_HIGH(GPIOI_PIN0) | \ - PIN_ODR_HIGH(GPIOI_PIN1) | \ - PIN_ODR_HIGH(GPIOI_PIN2) | \ - PIN_ODR_HIGH(GPIOI_PIN3) | \ - PIN_ODR_HIGH(GPIOI_PIN4) | \ - PIN_ODR_HIGH(GPIOI_PIN5) | \ - PIN_ODR_HIGH(GPIOI_PIN6) | \ - PIN_ODR_HIGH(GPIOI_PIN7) | \ - PIN_ODR_HIGH(GPIOI_PIN8) | \ - PIN_ODR_HIGH(GPIOI_PIN9) | \ - PIN_ODR_HIGH(GPIOI_PIN10) | \ - PIN_ODR_HIGH(GPIOI_PIN11) | \ - PIN_ODR_HIGH(GPIOI_PIN12) | \ - PIN_ODR_HIGH(GPIOI_PIN13) | \ - PIN_ODR_HIGH(GPIOI_PIN14) | \ - PIN_ODR_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_AFRL (PIN_AFIO_AF(GPIOI_PIN0, 0) | \ - PIN_AFIO_AF(GPIOI_PIN1, 0) | \ - PIN_AFIO_AF(GPIOI_PIN2, 0) | \ - PIN_AFIO_AF(GPIOI_PIN3, 0) | \ - PIN_AFIO_AF(GPIOI_PIN4, 0) | \ - PIN_AFIO_AF(GPIOI_PIN5, 0) | \ - PIN_AFIO_AF(GPIOI_PIN6, 0) | \ - PIN_AFIO_AF(GPIOI_PIN7, 0)) -#define VAL_GPIOI_AFRH (PIN_AFIO_AF(GPIOI_PIN8, 0) | \ - PIN_AFIO_AF(GPIOI_PIN9, 0) | \ - PIN_AFIO_AF(GPIOI_PIN10, 0) | \ - PIN_AFIO_AF(GPIOI_PIN11, 0) | \ - PIN_AFIO_AF(GPIOI_PIN12, 0) | \ - PIN_AFIO_AF(GPIOI_PIN13, 0) | \ - PIN_AFIO_AF(GPIOI_PIN14, 0) | \ - PIN_AFIO_AF(GPIOI_PIN15, 0)) - - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_STM32_E407/board.mk b/boards/OLIMEX_STM32_E407/board.mk deleted file mode 100644 index 0f9c9e4a7a..0000000000 --- a/boards/OLIMEX_STM32_E407/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_STM32_E407/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_STM32_E407 diff --git a/boards/OLIMEX_STM32_E407/cfg/board.chcfg b/boards/OLIMEX_STM32_E407/cfg/board.chcfg deleted file mode 100644 index 9f6805ba45..0000000000 --- a/boards/OLIMEX_STM32_E407/cfg/board.chcfg +++ /dev/null @@ -1,335 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32f4xx/templates - .. - - Olimex STM32-E407 - OLIMEX_STM32_E407 - - - - - - - MII_KS8721_ID - RMII - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/boards/OLIMEX_STM32_H103/board.c b/boards/OLIMEX_STM32_H103/board.c deleted file mode 100644 index 92f1fe3645..0000000000 --- a/boards/OLIMEX_STM32_H103/board.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/OLIMEX_STM32_H103/board.h b/boards/OLIMEX_STM32_H103/board.h deleted file mode 100644 index 6af7a9a196..0000000000 --- a/boards/OLIMEX_STM32_H103/board.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex STM33-H103 proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_STM32_H103 -#define BOARD_NAME "Olimex STM32-H103" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_MD - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON 0 - -#define GPIOC_USB_DISC 11 -#define GPIOC_LED 12 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input with pull-up except: - * PA0 - Normal input (BUTTON). - * PA2 - Alternate output (USART2 TX). - * PA3 - Normal input (USART2 RX). - */ -#define VAL_GPIOACRL 0x88884B84 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x88888888 /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0x88888888 /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - * Everything input with pull-up except: - * PC6 - Normal input because there is an external resistor. - * PC7 - Normal input because there is an external resistor. - * PC11 - Open Drain output (USB disconnect). - * PC12 - Push Pull output (LED). - */ -#define VAL_GPIOCCRL 0x44888888 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x88837888 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFFFF - -/* - * Port D setup. - * Everything input with pull-up except: - * PD0 - Normal input (XTAL). - * PD1 - Normal input (XTAL). - */ -#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_STM32_H103/board.mk b/boards/OLIMEX_STM32_H103/board.mk deleted file mode 100644 index 040374ffc5..0000000000 --- a/boards/OLIMEX_STM32_H103/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_STM32_H103/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_STM32_H103 diff --git a/boards/OLIMEX_STM32_P103/board.c b/boards/OLIMEX_STM32_P103/board.c deleted file mode 100644 index cdd45553c1..0000000000 --- a/boards/OLIMEX_STM32_P103/board.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_MMC_SPI -/* Board-related functions related to the MMC_SPI driver.*/ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - return palReadPad(GPIOC, GPIOC_MMCCP); -} - -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - return !palReadPad(GPIOC, GPIOC_MMCWP); -} -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/OLIMEX_STM32_P103/board.h b/boards/OLIMEX_STM32_P103/board.h deleted file mode 100644 index 81f5410bf5..0000000000 --- a/boards/OLIMEX_STM32_P103/board.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex STM32-P103 proto board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_STM32_P103 -#define BOARD_NAME "Olimex STM32-P103" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_MD - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON 0 -#define GPIOA_SPI1NSS 4 - -#define GPIOB_SPI2NSS 12 - -#define GPIOC_USB_P 4 -#define GPIOC_MMCWP 6 -#define GPIOC_MMCCP 7 -#define GPIOC_CAN_CNTL 10 -#define GPIOC_USB_DISC 11 -#define GPIOC_LED 12 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input with pull-up except: - * PA0 - Normal input (BUTTON). - * PA2 - Alternate output (USART2 TX). - * PA3 - Normal input (USART2 RX). - * PA11 - Normal input (USB DM). - * PA12 - Normal input (USB DP). - */ -#define VAL_GPIOACRL 0x88884B84 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x88844888 /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - * Everything input with pull-up except: - * PB13 - Alternate output (MMC SPI2 SCK). - * PB14 - Normal input (MMC SPI2 MISO). - * PB15 - Alternate output (MMC SPI2 MOSI). - */ -#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0xB4B88888 /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - * Everything input with pull-up except: - * PC4 - Normal input because there is an external resistor. - * PC6 - Normal input because there is an external resistor. - * PC7 - Normal input because there is an external resistor. - * PC10 - Push Pull output (CAN CNTRL). - * PC11 - Push Pull output (USB DISC). - * PC12 - Push Pull output (LED). - */ -#define VAL_GPIOCCRL 0x44848888 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x88833388 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFFFF - -/* - * Port D setup. - * Everything input with pull-up except: - * PD0 - Normal input (XTAL). - * PD1 - Normal input (XTAL). - */ -#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -/* - * USB bus activation macro, required by the USB driver. - */ -#define usb_lld_connect_bus(usbp) palClearPad(GPIOC, GPIOC_USB_DISC) - -/* - * USB bus de-activation macro, required by the USB driver. - */ -#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOC, GPIOC_USB_DISC) - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_STM32_P103/board.mk b/boards/OLIMEX_STM32_P103/board.mk deleted file mode 100644 index 701970e84c..0000000000 --- a/boards/OLIMEX_STM32_P103/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_STM32_P103/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_STM32_P103 diff --git a/boards/OLIMEX_STM32_P107/board.c b/boards/OLIMEX_STM32_P107/board.c deleted file mode 100644 index 3d4aaafbef..0000000000 --- a/boards/OLIMEX_STM32_P107/board.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_MMC_SPI -/* - * Card detection through the card internal pull-up on D3. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - static bool_t last_status = FALSE; - - (void)mmcp; - if ((palReadLatch(GPIOA) & PAL_PORT_BIT(GPIOA_SPI3_CS_MMC)) == 0) - return last_status; - return last_status = (bool_t)palReadPad(GPIOA, GPIOA_SPI3_CS_MMC); -} - -/* - * Card write protection detection is not possible, the card is always - * reported as not protected. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - return FALSE; -} -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Several I/O pins are re-mapped: - * USART3 to the PD8/PD9 pins. - * I2C1 to the PB8/PB9 pins. - * SPI3 to the PC10/PC11/PC12 pins. - */ - AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_FULLREMAP | - AFIO_MAPR_I2C1_REMAP | - AFIO_MAPR_SPI3_REMAP; -} diff --git a/boards/OLIMEX_STM32_P107/board.h b/boards/OLIMEX_STM32_P107/board.h deleted file mode 100644 index 5016159f8d..0000000000 --- a/boards/OLIMEX_STM32_P107/board.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the Olimex STM32-P107 Rev.A evaluation board. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_STM32_P107_REV_A -#define BOARD_NAME "Olimex STM32-P107 Rev.A" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 25000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_CL - -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID MII_STE101P_ID -#define BOARD_PHY_RMII - -/* - * IO pins assignments. - */ -#define GPIOA_SWITCH_WKUP 0 -#define GPIOA_SPI3_CS_MMC 4 -#define GPIOC_LED_STATUS1 6 -#define GPIOC_LED_STATUS2 7 -#define GPIOC_SWITCH_TAMPER 13 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input with pull-up except: - * PA0 - Normal input (WKUP BUTTON). - * PA1 - Normal input (ETH_RMII_REF_CLK). - * PA2 - Alternate output (ETH_RMII_MDIO). - * PA3 - Input with PU (unconnected). - * PA4 - Open Drain output (CS_MMC). - * PA5 - Input with PU (unconnected). - * PA6 - Input with PU (unconnected). - * PA7 - Normal input (ETH_RMII_CRS_DV). - * PA8 - Alternate output (MCO). - * PA9 - Normal input (OTG_VBUS). - * PA10 - Normal input (OTG_ID). - * PA11 - Normal input (OTG_DM). - * PA12 - Normal input (OTG_DP). - * PA13 - Normal input (TMS). - * PA14 - Normal input (TCK). - * PA15 - Normal input (TDI). - */ -#define VAL_GPIOACRL 0x48878B44 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x4444444B /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup: - * PB0 - Input with PU (unconnected). - * PB1 - Input with PU (unconnected). - * PB2 - Normal input (BOOT1). - * PB3 - Normal input (TDO). - * PB4 - Normal input (TRST). - * PB5 - Input with PU (unconnected). - * PB6 - Input with PU (unconnected). - * PB7 - Input with PU (unconnected). - * PB8 - Alternate O.D. (I2C1 SCL, remapped). - * PB9 - Alternate O.D. (I2C1 SDA, remapped). - * PB10 - Input with PU (unconnected). - * PB11 - Alternate output (ETH_RMII_TX_EN). - * PB12 - Alternate output (ETH_RMII_TXD0). - * PB13 - Alternate output (ETH_RMII_TXD1). - * PB14 - Input with PU (unconnected). - * PB15 - Push Pull output (CS_UEXT). - */ -#define VAL_GPIOBCRL 0x88844488 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0x38BBB8FF /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup: - * PC0 - Input with PU (unconnected). - * PC1 - Alternate output (ETH_MDC). - * PC2 - Input with PU (unconnected). - * PC3 - Input with PU (unconnected). - * PC4 - Normal input (ETH_RMII_RXD0). - * PC5 - Normal input (ETH_RMII_RXD1). - * PC6 - Push Pull output (STAT1 green LED). - * PC7 - Push Pull output (STAT2 yellow LED). - * PC8 - Input with PU (unconnected). - * PC9 - Input with PU (unconnected). - * PC10 - Alternate output (SPI3 SCK). - * PC11 - Input with PU (SPI3 MISO). - * PC12 - Alternate output (SPI3 MOSI). - * PC13 - Normal input (TAMPER). - * PC14 - Normal input (OSC32 IN). - * PC15 - Normal input (OSC32 OUT). - */ -#define VAL_GPIOCCRL 0x334488B8 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x444B8B88 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFF3F - -/* - * Port D setup: - * PD0 - Input with PU (unconnected). - * PD1 - Input with PU (unconnected). - * PD2 - Input with PU (unconnected). - * PD3 - Input with PU (unconnected). - * PD4 - Input with PU (unconnected). - * PD5 - Alternate output (USART2 TX, UEXT). - * PD6 - Input with PU (USART2 RX, UEXT). - * PD7 - Push Pull output (USB_VBUSON). - * PD8 - Alternate output (USART2 TX, remapped). - * PD9 - Normal input (USART2 RX, remapped). - * PD10 - Input with PU (unconnected). - * PD11 - Normal input (USART2 CTS, remapped). - * PD12 - Alternate output (USART2 RTS, remapped). - * PD13 - Input with PU (unconnected). - * PD14 - Input with PU (unconnected). - * PD15 - Input with PU (unconnected). - */ -#define VAL_GPIODCRL 0x38B88888 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x888B484B /* PD15...PD8 */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - * Everything input with pull-up except: - * PE14 - Normal input (ETH_RMII_MDINT). - * PE15 - Normal input (USB_FAULT). - */ -#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x44888888 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_STM32_P107/board.mk b/boards/OLIMEX_STM32_P107/board.mk deleted file mode 100644 index 63f70119a2..0000000000 --- a/boards/OLIMEX_STM32_P107/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_STM32_P107/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_STM32_P107 diff --git a/boards/OLIMEX_STM32_P407/board.c b/boards/OLIMEX_STM32_P407/board.c deleted file mode 100644 index 59b6e9de6c..0000000000 --- a/boards/OLIMEX_STM32_P407/board.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/OLIMEX_STM32_P407/board.h b/boards/OLIMEX_STM32_P407/board.h deleted file mode 100644 index 1fd941809d..0000000000 --- a/boards/OLIMEX_STM32_P407/board.h +++ /dev/null @@ -1,655 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for Olimex STM32-P407 board. - * NOTE: Part of JTAG signals are used for other functions, this board can be - * used using SWD only. - */ - -/* - * Board identifier. - */ -#define BOARD_OLIMEX_STM32_P407 -#define BOARD_NAME "Olimex STM32-P407" - -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID MII_KS8721_ID -#define BOARD_PHY_RMII - -/* - * Board frequencies. - * NOTE: The LSE crystal is not fitted by default on the board. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 25000000 - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 330 - -/* - * MCU type as defined in the ST header file stm32f4xx.h. - */ -#define STM32F4XX - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON_WKUP 0 -#define GPIOA_ETH_RMII_REF_CLK 1 -#define GPIOA_ETH_RMII_MDIO 2 -#define GPIOA_ETH_RMII_MDINT 3 -#define GPIOA_DCMI_HSYNC 4 -#define GPIOA_LCD_SCK 5 -#define GPIOA_DCMI_PIXCLK 6 -#define GPIOA_ETH_RMII_CRS_DV 7 -#define GPIOA_MCO1 8 -#define GPIOA_OTG_FS_VBUS 9 -#define GPIOA_DCMI_D1 10 -#define GPIOA_OTG_FS_DM 11 -#define GPIOA_OTG_FS_DP 12 -#define GPIOA_SWDIO 13 -#define GPIOA_SWCLK 14 -#define GPIOA_I2S3_WS 15 - -#define GPIOB_LCD_BL 0 -#define GPIOB_BUZ 1 -#define GPIOB_CAM_ENB 2 -#define GPIOB_I2S3_CK 3 -#define GPIOB_LCD_MISO 4 -#define GPIOB_I2S3_SD 5 -#define GPIOB_DCMI_D5 6 -#define GPIOB_DCMI_VSYNC 7 -#define GPIOB_CAN1_RX 8 -#define GPIOB_CAN1_TX 9 -#define GPIOB_USB_FS_FAULT 10 -#define GPIOB_ETH_RMII_TX_EN 11 -#define GPIOB_OTG_HS_ID 12 -#define GPIOB_OTG_HS_VBUS 13 -#define GPIOB_OTG_HS_DM 14 -#define GPIOB_OTG_HS_DP 15 - -#define GPIOC_TRIM 0 -#define GPIOC_ETH_RMII_MDC 1 -#define GPIOC_USB_FS_VBUSON 2 -#define GPIOC_LCD_MOSI 3 -#define GPIOC_ETH_RMII_RXD0 4 -#define GPIOC_ETH_RMII_RXD1 5 -#define GPIOC_DCMI_D0_US6_TX 6 -#define GPIOC_I2S3_MCK 7 -#define GPIOC_DCMI_D2 8 -#define GPIOC_DCMI_D3 9 -#define GPIOC_SPI3_SCK 10 -#define GPIOC_SPI3_MISO 11 -#define GPIOC_SPI3_MOSI 12 -#define GPIOC_SWITCH_TAMPER 13 -#define GPIOC_OSC32_IN 14 -#define GPIOC_OSC32_OUT 15 - -#define GPIOD_USELESS0 0 -#define GPIOD_USELESS1 1 -#define GPIOD_SPI3_CS 2 -#define GPIOD_LCD_RST 3 -#define GPIOD_USELESS4 4 -#define GPIOD_USELESS5 5 -#define GPIOD_LCD_CS 6 -#define GPIOD_USELESS7 7 -#define GPIOD_USART3_TX 8 -#define GPIOD_USART3_RX 9 -#define GPIOD_USELESS10 10 -#define GPIOD_USART3_CTS 11 -#define GPIOD_USART3_RTS 12 -#define GPIOD_USB_HS_FAULT 13 -#define GPIOD_USELESS14 14 -#define GPIOD_USELESS15 15 - -#define GPIOE_0 0 -#define GPIOE_1 1 -#define GPIOE_TEMP_ALERT 2 -#define GPIOE_USB_HS_VBUSON 3 -#define GPIOE_4 4 -#define GPIOE_5 5 -#define GPIOE_6 6 -#define GPIOE_7 7 -#define GPIOE_8 8 -#define GPIOE_9 9 -#define GPIOE_10 10 -#define GPIOE_11 11 -#define GPIOE_12 12 -#define GPIOE_13 13 -#define GPIOE_14 14 -#define GPIOE_15 15 - -#define GPIOF_0 0 -#define GPIOF_1 1 -#define GPIOF_2 2 -#define GPIOF_3 3 -#define GPIOF_4 4 -#define GPIOF_5 5 -#define GPIOF_STAT1 6 -#define GPIOF_STAT2 7 -#define GPIOF_STAT3 8 -#define GPIOF_CAM_PWR 9 -#define GPIOF_10 10 -#define GPIOF_CAM_RS 11 -#define GPIOF_12 12 -#define GPIOF_13 13 -#define GPIOF_14 14 -#define GPIOF_15 15 - -#define GPIOG_0 0 -#define GPIOG_1 1 -#define GPIOG_2 2 -#define GPIOG_3 3 -#define GPIOG_4 4 -#define GPIOG_5 5 -#define GPIOG_RIGHT 6 -#define GPIOG_UP 7 -#define GPIOG_DOWN 8 -#define GPIOG_USART6_RX 9 -#define GPIOG_10 10 -#define GPIOG_LEFT 11 -#define GPIOG_12 12 -#define GPIOG_ETH_RMII_TXD0 13 -#define GPIOG_ETH_RMII_TXD1 14 -#define GPIOG_CENT 15 - -#define GPIOH_OSC_IN 0 -#define GPIOH_OSC_OUT 1 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3U << ((n) * 2)) -#define PIN_PUDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * Port A setup. - * - * PA0 - GPIOA_BUTTON_WKUP (input floating). - * PA1 - GPIOA_ETH_RMII_REF_CLK(alternate 11). - * PA2 - GPIOA_ETH_RMII_MDIO (alternate 11). - * PA3 - GPIOA_ETH_RMII_MDINT (input floating). - * PA4 - GPIOA_DCMI_HSYNC (input pull-up). - * PA5 - GPIOA_LCD_SCK (output push-pull). - * PA6 - GPIOA_DCMI_PIXCLK (input pull-up). - * PA7 - GPIOA_ETH_RMII_CRS_DV (alternate 11). - * PA8 - GPIOA_MCO1 (alternate 0). - * PA9 - GPIOA_OTG_FS_VBUS (input pull-up). - * PA10 - GPIOA_DCMI_D1 (input pull-up). - * PA11 - GPIOA_OTG_FS_DM (alternate 10). - * PA12 - GPIOA_OTG_FS_DP (alternate 10). - * PA13 - GPIOA_SWDIO (alternate 0). - * PA14 - GPIOA_SWCLK (alternate 0, pull-down). - * PA15 - GPIOA_I2S3_WS (alternate 6). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON_WKUP) | \ - PIN_MODE_ALTERNATE(GPIOA_ETH_RMII_REF_CLK) | \ - PIN_MODE_ALTERNATE(GPIOA_ETH_RMII_MDIO) | \ - PIN_MODE_INPUT(GPIOA_ETH_RMII_MDINT) | \ - PIN_MODE_INPUT(GPIOA_DCMI_HSYNC) | \ - PIN_MODE_OUTPUT(GPIOA_LCD_SCK) | \ - PIN_MODE_INPUT(GPIOA_DCMI_PIXCLK) | \ - PIN_MODE_ALTERNATE(GPIOA_ETH_RMII_CRS_DV) | \ - PIN_MODE_ALTERNATE(GPIOA_MCO1) | \ - PIN_MODE_INPUT(GPIOA_OTG_FS_VBUS) | \ - PIN_MODE_INPUT(GPIOA_DCMI_D1) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_ALTERNATE(GPIOA_I2S3_WS)) -#define VAL_GPIOA_OTYPER 0x00000000 -#define VAL_GPIOA_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOA_PUPDR (PIN_PUDR_PULLUP(GPIOA_DCMI_HSYNC) | \ - PIN_PUDR_PULLUP(GPIOA_DCMI_PIXCLK) | \ - PIN_PUDR_PULLDOWN(GPIOA_OTG_FS_VBUS) | \ - PIN_PUDR_PULLUP(GPIOA_DCMI_D1) | \ - PIN_PUDR_PULLDOWN(GPIOA_SWCLK)) -#define VAL_GPIOA_ODR 0xFFFFFFDF -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_ETH_RMII_REF_CLK, 11) | \ - PIN_AFIO_AF(GPIOA_ETH_RMII_MDIO, 11) | \ - PIN_AFIO_AF(GPIOA_ETH_RMII_CRS_DV, 11)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_MCO1, 0) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DM, 10) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DP, 10) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ - PIN_AFIO_AF(GPIOA_I2S3_WS, 6)) - -/* - * Port B setup. - * - * PB0 - GPIOB_LCD_BL (output push-pull). - * PB1 - GPIOB_BUZ (output push-pull). - * PB2 - GPIOB_CAM_ENB (input floating). - * PB3 - GPIOB_I2S3_CK (alternate 6). - * PB4 - GPIOB_LCD_MISO (input floating). - * PB5 - GPIOB_I2S3_SD (alternate 6). - * PB6 - GPIOB_DCMI_D5 (input pull-up). - * PB7 - GPIOB_DCMI_VSYNC (input pull-up). - * PB8 - GPIOB_CAN1_RX (alternate 9). - * PB9 - GPIOB_CAN1_TX (alternate 9). - * PB10 - GPIOB_USB_FS_FAULT (input floating). - * PB11 - GPIOB_ETH_RMII_TX_EN (alternate 11). - * PB12 - GPIOB_OTG_HS_ID (alternate 12). - * PB13 - GPIOB_OTG_HS_VBUS (input pull-up). - * PB14 - GPIOB_OTG_HS_DM (alternate 12). - * PB15 - GPIOB_OTG_HS_DP (alternate 12). - */ -#define VAL_GPIOB_MODER (PIN_MODE_OUTPUT(GPIOB_LCD_BL) | \ - PIN_MODE_OUTPUT(GPIOB_BUZ) | \ - PIN_MODE_INPUT(GPIOB_CAM_ENB) | \ - PIN_MODE_ALTERNATE(GPIOB_I2S3_CK) | \ - PIN_MODE_INPUT(GPIOB_LCD_MISO) | \ - PIN_MODE_ALTERNATE(GPIOB_I2S3_SD) | \ - PIN_MODE_INPUT(GPIOB_DCMI_D5) | \ - PIN_MODE_INPUT(GPIOB_DCMI_VSYNC) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN1_RX) | \ - PIN_MODE_ALTERNATE(GPIOB_CAN1_TX) | \ - PIN_MODE_INPUT(GPIOB_USB_FS_FAULT) | \ - PIN_MODE_ALTERNATE(GPIOB_ETH_RMII_TX_EN) | \ - PIN_MODE_ALTERNATE(GPIOB_OTG_HS_ID) | \ - PIN_MODE_INPUT(GPIOB_OTG_HS_VBUS) | \ - PIN_MODE_ALTERNATE(GPIOB_OTG_HS_DM) | \ - PIN_MODE_ALTERNATE(GPIOB_OTG_HS_DP)) -#define VAL_GPIOB_OTYPER 0x00000000 -#define VAL_GPIOB_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOB_PUPDR (PIN_PUDR_PULLUP(GPIOB_DCMI_D5) | \ - PIN_PUDR_PULLUP(GPIOB_DCMI_VSYNC) | \ - PIN_PUDR_PULLDOWN(GPIOB_OTG_HS_VBUS)) -#define VAL_GPIOB_ODR 0xFFFFFFFC -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_I2S3_CK, 6) | \ - PIN_AFIO_AF(GPIOB_I2S3_SD, 6)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_CAN1_RX, 9) | \ - PIN_AFIO_AF(GPIOB_CAN1_TX, 9) | \ - PIN_AFIO_AF(GPIOB_ETH_RMII_TX_EN, 11) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_ID, 12) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_DM, 12) | \ - PIN_AFIO_AF(GPIOB_OTG_HS_DP, 12)) - -/* - * Port C setup. - * - * PC0 - GPIOC_TRIM (input floating). - * PC1 - GPIOC_ETH_RMII_MDC (alternate 11). - * PC2 - GPIOC_USB_FS_VBUSON (output push-pull). - * PC3 - GPIOC_LCD_MOSI (output push-pull). - * PC4 - GPIOC_ETH_RMII_RXD0 (alternate 11). - * PC5 - GPIOC_ETH_RMII_RXD1 (alternate 11). - * PC6 - GPIOC_DCMI_D0_US6_TX (alternate 8). - * PC7 - GPIOC_I2S3_MCK (alternate 6). - * PC8 - GPIOC_DCMI_D2 (input pull-up). - * PC9 - GPIOC_DCMI_D3 (input pull-up). - * PC10 - GPIOC_SPI3_SCK (alternate 6). - * PC11 - GPIOC_SPI3_MISO (alternate 6). - * PC12 - GPIOC_SPI3_MOSI (alternate 6). - * PC13 - GPIOC_SWITCH_TAMPER (input floating). - * PC14 - GPIOC_OSC32_IN (input floating). - * PC15 - GPIOC_OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_TRIM) | \ - PIN_MODE_ALTERNATE(GPIOC_ETH_RMII_MDC) | \ - PIN_MODE_OUTPUT(GPIOC_USB_FS_VBUSON) | \ - PIN_MODE_OUTPUT(GPIOC_LCD_MOSI) | \ - PIN_MODE_ALTERNATE(GPIOC_ETH_RMII_RXD0) | \ - PIN_MODE_ALTERNATE(GPIOC_ETH_RMII_RXD1) | \ - PIN_MODE_ALTERNATE(GPIOC_DCMI_D0_US6_TX) | \ - PIN_MODE_ALTERNATE(GPIOC_I2S3_MCK) | \ - PIN_MODE_INPUT(GPIOC_DCMI_D2) | \ - PIN_MODE_INPUT(GPIOC_DCMI_D3) | \ - PIN_MODE_ALTERNATE(GPIOC_SPI3_SCK) | \ - PIN_MODE_ALTERNATE(GPIOC_SPI3_MISO) | \ - PIN_MODE_ALTERNATE(GPIOC_SPI3_MOSI) | \ - PIN_MODE_INPUT(GPIOC_SWITCH_TAMPER) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER 0x00000000 -#define VAL_GPIOC_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOC_PUPDR (PIN_PUDR_PULLUP(GPIOC_DCMI_D2) | \ - PIN_PUDR_PULLUP(GPIOC_DCMI_D3)) -#define VAL_GPIOC_ODR 0xFFFFFFF3 -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_ETH_RMII_MDC, 11) | \ - PIN_AFIO_AF(GPIOC_ETH_RMII_RXD0, 11) | \ - PIN_AFIO_AF(GPIOC_ETH_RMII_RXD1, 11) | \ - PIN_AFIO_AF(GPIOC_DCMI_D0_US6_TX, 8) | \ - PIN_AFIO_AF(GPIOC_I2S3_MCK, 6)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_SPI3_SCK, 6) | \ - PIN_AFIO_AF(GPIOC_SPI3_MISO, 6) | \ - PIN_AFIO_AF(GPIOC_SPI3_MOSI, 6)) - -/* - * Port D setup. - * - * PD0 - GPIOD_USELESS0 (input pull-up). - * PD1 - GPIOD_USELESS1 (input pull-up). - * PD2 - GPIOD_SPI3_CS (output push-pull). - * PD3 - GPIOD_LCD_RST (output push-pull). - * PD4 - GPIOD_USELESS4 (input pull-up). - * PD5 - GPIOD_USELESS5 (input pull-up). - * PD6 - GPIOD_LCD_CS (output push-pull). - * PD7 - GPIOD_USELESS7 (input pull-up). - * PD8 - GPIOD_USART3_TX (alternate 8). - * PD9 - GPIOD_USART3_RX (alternate 8). - * PD10 - GPIOD_USELESS10 (input pull-up). - * PD11 - GPIOD_USART3_CTS (alternate 8). - * PD12 - GPIOD_USART3_RTS (alternate 8). - * PD13 - GPIOD_USB_HS_FAULT (input floating). - * PD14 - GPIOD_USELESS14 (input pull-up). - * PD15 - GPIOD_USELESS15 (input pull-up). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_USELESS0) | \ - PIN_MODE_INPUT(GPIOD_USELESS1) | \ - PIN_MODE_OUTPUT(GPIOD_SPI3_CS) | \ - PIN_MODE_OUTPUT(GPIOD_LCD_RST) | \ - PIN_MODE_INPUT(GPIOD_USELESS4) | \ - PIN_MODE_INPUT(GPIOD_USELESS5) | \ - PIN_MODE_OUTPUT(GPIOD_LCD_CS) | \ - PIN_MODE_INPUT(GPIOD_USELESS7) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_TX) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_RX) | \ - PIN_MODE_INPUT(GPIOD_USELESS10) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_CTS) | \ - PIN_MODE_ALTERNATE(GPIOD_USART3_RTS) | \ - PIN_MODE_INPUT(GPIOD_USB_HS_FAULT) | \ - PIN_MODE_INPUT(GPIOD_USELESS14) | \ - PIN_MODE_INPUT(GPIOD_USELESS15)) -#define VAL_GPIOD_OTYPER 0x00000000 -#define VAL_GPIOD_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOD_PUPDR (PIN_PUDR_PULLUP(GPIOD_USELESS0) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS1) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS4) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS5) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS7) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS10) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS14) | \ - PIN_PUDR_PULLUP(GPIOD_USELESS15)) -#define VAL_GPIOD_ODR 0xFFFFFFFF -#define VAL_GPIOD_AFRL 0x00000000 -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_USART3_TX, 7) | \ - PIN_AFIO_AF(GPIOD_USART3_RX, 7) | \ - PIN_AFIO_AF(GPIOD_USART3_CTS, 7) | \ - PIN_AFIO_AF(GPIOD_USART3_RTS, 7)) - -/* - * Port E setup. - * - * PE0 - GPIOE_0 (input pull-up). - * PE1 - GPIOE_1 (input pull-up). - * PE2 - GPIOE_TEMP_ALERT (input floating). - * PE3 - GPIOE_USB_HS_VBUSON (output push-pull). - * PE4 - GPIOE_4 (input pull-up). - * PE5 - GPIOE_5 (input pull-up). - * PE6 - GPIOE_6 (input pull-up). - * PE7 - GPIOE_7 (input pull-up). - * PE8 - GPIOE_8 (input pull-up). - * PE9 - GPIOE_9 (input pull-up). - * PE10 - GPIOE_10 (input pull-up). - * PE11 - GPIOE_11 (input pull-up). - * PE12 - GPIOE_12 (input pull-up). - * PE13 - GPIOE_13 (input pull-up). - * PE14 - GPIOE_14 (input pull-up). - * PE15 - GPIOE_15 (input pull-up). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_0) | \ - PIN_MODE_INPUT(GPIOE_1) | \ - PIN_MODE_INPUT(GPIOE_TEMP_ALERT) | \ - PIN_MODE_OUTPUT(GPIOE_USB_HS_VBUSON) | \ - PIN_MODE_INPUT(GPIOE_4) | \ - PIN_MODE_INPUT(GPIOE_5) | \ - PIN_MODE_INPUT(GPIOE_6) | \ - PIN_MODE_INPUT(GPIOE_7) | \ - PIN_MODE_INPUT(GPIOE_8) | \ - PIN_MODE_INPUT(GPIOE_9) | \ - PIN_MODE_INPUT(GPIOE_10) | \ - PIN_MODE_INPUT(GPIOE_11) | \ - PIN_MODE_INPUT(GPIOE_12) | \ - PIN_MODE_INPUT(GPIOE_13) | \ - PIN_MODE_INPUT(GPIOE_14) | \ - PIN_MODE_INPUT(GPIOE_15)) -#define VAL_GPIOE_OTYPER 0x00000000 -#define VAL_GPIOE_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOE_PUPDR (PIN_PUDR_PULLUP(GPIOE_0) | \ - PIN_PUDR_PULLUP(GPIOE_1) | \ - PIN_PUDR_PULLUP(GPIOE_4) | \ - PIN_PUDR_PULLUP(GPIOE_5) | \ - PIN_PUDR_PULLUP(GPIOE_6) | \ - PIN_PUDR_PULLUP(GPIOE_7) | \ - PIN_PUDR_PULLUP(GPIOE_8) | \ - PIN_PUDR_PULLUP(GPIOE_9) | \ - PIN_PUDR_PULLUP(GPIOE_10) | \ - PIN_PUDR_PULLUP(GPIOE_11) | \ - PIN_PUDR_PULLUP(GPIOE_12) | \ - PIN_PUDR_PULLUP(GPIOE_13) | \ - PIN_PUDR_PULLUP(GPIOE_14) | \ - PIN_PUDR_PULLUP(GPIOE_15)) -#define VAL_GPIOE_ODR 0xFFFFFFF7 -#define VAL_GPIOE_AFRL 0x00000000 -#define VAL_GPIOE_AFRH 0x00000000 - -/* - * Port F setup. - * - * PF0 - GPIOF_0 (input pull-up). - * PF1 - GPIOF_1 (input pull-up). - * PF2 - GPIOF_2 (input pull-up). - * PF3 - GPIOF_3 (input pull-up). - * PF4 - GPIOF_4 (input pull-up). - * PF5 - GPIOF_5 (input pull-up). - * PF6 - GPIOF_STAT1 (output push-pull). - * PF7 - GPIOF_STAT2 (output push-pull). - * PF8 - GPIOF_STAT3 (output push-pull). - * PF9 - GPIOF_CAM_PWR (output push-pull). - * PF10 - GPIOF_10 (input pull-up). - * PF11 - GPIOF_CAM_RS (output push-pull). - * PF12 - GPIOF_12 (input pull-up). - * PF13 - GPIOF_13 (input pull-up). - * PF14 - GPIOF_14 (input pull-up). - * PF15 - GPIOF_15 (input pull-up). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_0) | \ - PIN_MODE_INPUT(GPIOF_1) | \ - PIN_MODE_INPUT(GPIOF_2) | \ - PIN_MODE_INPUT(GPIOF_3) | \ - PIN_MODE_INPUT(GPIOF_4) | \ - PIN_MODE_INPUT(GPIOF_5) | \ - PIN_MODE_OUTPUT(GPIOF_STAT1) | \ - PIN_MODE_OUTPUT(GPIOF_STAT2) | \ - PIN_MODE_OUTPUT(GPIOF_STAT3) | \ - PIN_MODE_OUTPUT(GPIOF_CAM_PWR) | \ - PIN_MODE_INPUT(GPIOF_10) | \ - PIN_MODE_OUTPUT(GPIOF_CAM_RS) | \ - PIN_MODE_INPUT(GPIOF_12) | \ - PIN_MODE_INPUT(GPIOF_13) | \ - PIN_MODE_INPUT(GPIOF_14) | \ - PIN_MODE_INPUT(GPIOF_15)) -#define VAL_GPIOF_OTYPER 0x00000000 -#define VAL_GPIOF_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOF_PUPDR (PIN_PUDR_PULLUP(GPIOF_0) | \ - PIN_PUDR_PULLUP(GPIOF_1) | \ - PIN_PUDR_PULLUP(GPIOF_2) | \ - PIN_PUDR_PULLUP(GPIOF_3) | \ - PIN_PUDR_PULLUP(GPIOF_4) | \ - PIN_PUDR_PULLUP(GPIOF_5) | \ - PIN_PUDR_PULLUP(GPIOF_10) | \ - PIN_PUDR_PULLUP(GPIOF_12) | \ - PIN_PUDR_PULLUP(GPIOF_13) | \ - PIN_PUDR_PULLUP(GPIOF_14) | \ - PIN_PUDR_PULLUP(GPIOF_15)) -#define VAL_GPIOF_ODR 0xFFFFFC3F -#define VAL_GPIOF_AFRL 0x00000000 -#define VAL_GPIOF_AFRH 0x00000000 - -/* - * Port G setup. - * - * PG0 - GPIOG_0 (input pull-up). - * PG1 - GPIOG_1 (input pull-up). - * PG2 - GPIOG_2 (input pull-up). - * PG3 - GPIOG_3 (input pull-up). - * PG4 - GPIOG_4 (input pull-up). - * PG5 - GPIOG_5 (input pull-up). - * PG6 - GPIOG_RIGHT (input floating). - * PG7 - GPIOG_UP (input floating). - * PG8 - GPIOG_DOWN (input floating). - * PG9 - GPIOG_USART6_RX (alternate 8). - * PG10 - GPIOG_10 (input pull-up). - * PG11 - GPIOG_LEFT (input floating). - * PG12 - GPIOG_12 (input pull-up). - * PG13 - GPIOG_ETH_RMII_TXD0 (alternate 11). - * PG14 - GPIOG_ETH_RMII_TXD1 (alternate 11). - * PG15 - GPIOG_CENT (input pull-up). - */ -#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_0) | \ - PIN_MODE_INPUT(GPIOG_1) | \ - PIN_MODE_INPUT(GPIOG_2) | \ - PIN_MODE_INPUT(GPIOG_3) | \ - PIN_MODE_INPUT(GPIOG_4) | \ - PIN_MODE_INPUT(GPIOG_5) | \ - PIN_MODE_INPUT(GPIOG_RIGHT) | \ - PIN_MODE_INPUT(GPIOG_UP) | \ - PIN_MODE_INPUT(GPIOG_DOWN) | \ - PIN_MODE_ALTERNATE(GPIOG_USART6_RX) | \ - PIN_MODE_INPUT(GPIOG_10) | \ - PIN_MODE_INPUT(GPIOG_LEFT) | \ - PIN_MODE_INPUT(GPIOG_12) | \ - PIN_MODE_ALTERNATE(GPIOG_ETH_RMII_TXD0) | \ - PIN_MODE_ALTERNATE(GPIOG_ETH_RMII_TXD1) | \ - PIN_MODE_INPUT(GPIOG_CENT)) -#define VAL_GPIOG_OTYPER 0x00000000 -#define VAL_GPIOG_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOG_PUPDR (PIN_PUDR_PULLUP(GPIOG_0) | \ - PIN_PUDR_PULLUP(GPIOG_1) | \ - PIN_PUDR_PULLUP(GPIOG_2) | \ - PIN_PUDR_PULLUP(GPIOG_3) | \ - PIN_PUDR_PULLUP(GPIOG_4) | \ - PIN_PUDR_PULLUP(GPIOG_5) | \ - PIN_PUDR_PULLUP(GPIOG_10) | \ - PIN_PUDR_PULLUP(GPIOG_12)) -#define VAL_GPIOG_ODR 0xFFFFFFFF -#define VAL_GPIOG_AFRL 0x00000000 -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_USART6_RX, 8) | \ - PIN_AFIO_AF(GPIOG_ETH_RMII_TXD0, 11) | \ - PIN_AFIO_AF(GPIOG_ETH_RMII_TXD1, 11)) - -/* - * Port H setup. - * All input with pull-up except: - * PH0 - GPIOH_OSC_IN (input floating). - * PH1 - GPIOH_OSC_OUT (input floating). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_INPUT(2) | \ - PIN_MODE_INPUT(3) | \ - PIN_MODE_INPUT(4) | \ - PIN_MODE_INPUT(5) | \ - PIN_MODE_INPUT(6) | \ - PIN_MODE_INPUT(7) | \ - PIN_MODE_INPUT(8) | \ - PIN_MODE_INPUT(9) | \ - PIN_MODE_INPUT(10) | \ - PIN_MODE_INPUT(11) | \ - PIN_MODE_INPUT(12) | \ - PIN_MODE_INPUT(13) | \ - PIN_MODE_INPUT(14) | \ - PIN_MODE_INPUT(15)) -#define VAL_GPIOH_OTYPER 0x00000000 -#define VAL_GPIOH_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOH_PUPDR (PIN_PUDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUDR_PULLUP(2) | \ - PIN_PUDR_PULLUP(3) | \ - PIN_PUDR_PULLUP(4) | \ - PIN_PUDR_PULLUP(5) | \ - PIN_PUDR_PULLUP(6) | \ - PIN_PUDR_PULLUP(7) | \ - PIN_PUDR_PULLUP(8) | \ - PIN_PUDR_PULLUP(9) | \ - PIN_PUDR_PULLUP(10) | \ - PIN_PUDR_PULLUP(11) | \ - PIN_PUDR_PULLUP(12) | \ - PIN_PUDR_PULLUP(13) | \ - PIN_PUDR_PULLUP(14) | \ - PIN_PUDR_PULLUP(15)) -#define VAL_GPIOH_ODR 0xFFFFFFFF -#define VAL_GPIOH_AFRL 0x00000000 -#define VAL_GPIOH_AFRH 0x00000000 - -/* - * Port I setup. - * All input with pull-up. - */ -#define VAL_GPIOI_MODER 0x00000000 -#define VAL_GPIOI_OTYPER 0x00000000 -#define VAL_GPIOI_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOI_PUPDR (PIN_PUDR_PULLUP(0) | \ - PIN_PUDR_PULLUP(1) | \ - PIN_PUDR_PULLUP(2) | \ - PIN_PUDR_PULLUP(3) | \ - PIN_PUDR_PULLUP(4) | \ - PIN_PUDR_PULLUP(5) | \ - PIN_PUDR_PULLUP(6) | \ - PIN_PUDR_PULLUP(7) | \ - PIN_PUDR_PULLUP(8) | \ - PIN_PUDR_PULLUP(9) | \ - PIN_PUDR_PULLUP(10) | \ - PIN_PUDR_PULLUP(11) | \ - PIN_PUDR_PULLUP(12) | \ - PIN_PUDR_PULLUP(13) | \ - PIN_PUDR_PULLUP(14) | \ - PIN_PUDR_PULLUP(15)) -#define VAL_GPIOI_ODR 0xFFFFFFFF -#define VAL_GPIOI_AFRL 0x00000000 -#define VAL_GPIOI_AFRH 0x00000000 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/OLIMEX_STM32_P407/board.mk b/boards/OLIMEX_STM32_P407/board.mk deleted file mode 100644 index b1e5aafe28..0000000000 --- a/boards/OLIMEX_STM32_P407/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/OLIMEX_STM32_P407/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/OLIMEX_STM32_P407 diff --git a/boards/RAISONANCE_REVA_STM8S/board.c b/boards/RAISONANCE_REVA_STM8S/board.c deleted file mode 100644 index 8c432913cf..0000000000 --- a/boards/RAISONANCE_REVA_STM8S/board.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -ROMCONST PALConfig pal_default_config = -{ - { - {VAL_GPIOAODR, 0, VAL_GPIOADDR, VAL_GPIOACR1, VAL_GPIOACR2}, - {VAL_GPIOBODR, 0, VAL_GPIOBDDR, VAL_GPIOBCR1, VAL_GPIOBCR2}, - {VAL_GPIOCODR, 0, VAL_GPIOCDDR, VAL_GPIOCCR1, VAL_GPIOCCR2}, - {VAL_GPIODODR, 0, VAL_GPIODDDR, VAL_GPIODCR1, VAL_GPIODCR2}, - {VAL_GPIOEODR, 0, VAL_GPIOEDDR, VAL_GPIOECR1, VAL_GPIOECR2}, - {VAL_GPIOFODR, 0, VAL_GPIOFDDR, VAL_GPIOFCR1, VAL_GPIOFCR2}, - {VAL_GPIOGODR, 0, VAL_GPIOGDDR, VAL_GPIOGCR1, VAL_GPIOGCR2}, - } -}; -#endif - -/* - * TIM 2 clock after the prescaler. - */ -#define TIM2_CLOCK (SYSCLK / 16) -#define TIM2_ARR ((TIM2_CLOCK / CH_FREQUENCY) - 1) - -/* - * TIM2 interrupt handler. - */ -CH_IRQ_HANDLER(13) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - TIM2->SR1 = 0; - - CH_IRQ_EPILOGUE(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * TIM2 initialization as system tick. - */ - CLK->PCKENR1 |= CLK_PCKENR1_TIM2; - TIM2->PSCR = 4; /* Prescaler divide by 2^4=16.*/ - TIM2->ARRH = (uint8_t)(TIM2_ARR >> 8); - TIM2->ARRL = (uint8_t)(TIM2_ARR); - TIM2->CNTRH = 0; - TIM2->CNTRL = 0; - TIM2->SR1 = 0; - TIM2->IER = TIM2_IER_UIE; - TIM2->CR1 = TIM2_CR1_CEN; -} diff --git a/boards/RAISONANCE_REVA_STM8S/board.h b/boards/RAISONANCE_REVA_STM8S/board.h deleted file mode 100644 index 8c4323efaa..0000000000 --- a/boards/RAISONANCE_REVA_STM8S/board.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for Raisonance REva V3 + STM8S208RB daughter board. - */ - -/* - * Board identifiers. - */ -#define BOARD_REVA_V3_STM8S208RB -#define BOARD_NAME "Raisonance REva V3 + STM8S208RB" - -/* - * Board frequencies. - */ -#define HSECLK 0 - -/* - * MCU model used on the board. - */ -#define STM8S208 - -/* - * Pin definitions. - */ -#define PA_OSCIN 1 -#define PA_J2_25 2 /* It is also OSCOUT. */ -#define PA_J2_27 3 -#define PA_RX 4 -#define PA_TX 5 - -#define PB_LED(n) (n) -#define PB_LCD_D0 0 -#define PB_LCD_D1 1 -#define PB_LCD_CSB 2 -#define PB_LCD_RESB 3 - -#define PC_ADC_ETR 0 -#define PC_J2_51 1 -#define PC_J2_53 2 -#define PC_J2_55 3 -#define PC_J2_57 4 -#define PC_SCK 5 -#define PC_MOSI 6 -#define PC_MISO 7 - -#define PD_J2_69 0 -#define PD_J2_21 1 -#define PD_J2_67 2 -#define PD_J2_65 3 -#define PD_PWM 4 -#define PD_J2_63 5 -#define PD_J2_61 6 -#define PD_J2_59 7 - -#define PE_P2_49 0 -#define PE_SCL 1 -#define PE_SDA 2 -#define PE_P2_47 3 -#define PE_P2_45 4 -#define PE_P2_43 5 -#define PE_P2_41 6 -#define PE_P2_39 7 - -#define PF_J2_37 0 -#define PF_J2_35 1 -#define PF_J2_33 2 -#define PF_J2_31 3 -#define PF_ANA_IN1 4 -#define PF_ANA_IN2 5 -#define PF_ANA_TEMP 6 -#define PF_ANA_POT 7 - -#define PG_CAN_TX 0 -#define PG_CAN_RX 1 -#define PG_BT5 2 -#define PG_BT6 3 -#define PG_SW4 4 -#define PG_SW3 5 -#define PG_SW2 6 -#define PG_SW1 7 - -#define PI_J2_71 0 - -/* - * Port A initial setup. - */ -#define VAL_GPIOAODR (1 << PA_TX) /* PA_TX initially to 1. */ -#define VAL_GPIOADDR (1 << PA_TX) /* PA_TX output, others inputs. */ -#define VAL_GPIOACR1 0xFF /* All pull-up or push-pull. */ -#define VAL_GPIOACR2 0 - -/* - * Port B initial setup. - */ -#define VAL_GPIOBODR 0xFF /* Initially all set to high. */ -#define VAL_GPIOBDDR 0xFF /* All outputs. */ -#define VAL_GPIOBCR1 0xFF /* All push-pull. */ -#define VAL_GPIOBCR2 0 - -/* - * Port C initial setup. - */ -#define VAL_GPIOCODR 0 -#define VAL_GPIOCDDR 0 /* All inputs. */ -#define VAL_GPIOCCR1 0xFF /* All pull-up. */ -#define VAL_GPIOCCR2 0 - -/* - * Port D initial setup. - */ -#define VAL_GPIODODR 0 -#define VAL_GPIODDDR 0 /* All inputs. */ -#define VAL_GPIODCR1 0xFF /* All pull-up. */ -#define VAL_GPIODCR2 0 - -/* - * Port E initial setup. - */ -#define VAL_GPIOEODR 0 -#define VAL_GPIOEDDR 0 /* All inputs. */ -#define VAL_GPIOECR1 0xFF /* All pull-up. */ -#define VAL_GPIOECR2 0 - -/* - * Port F initial setup. - */ -#define VAL_GPIOFODR 0 -#define VAL_GPIOFDDR 0 /* All inputs. */ -#define VAL_GPIOFCR1 0xFF /* All pull-up. */ -#define VAL_GPIOFCR2 0 - -/* - * Port G initial setup. - */ -#define VAL_GPIOGODR (1 << PG_CAN_TX)/* CAN_TX initially to 1. */ -#define VAL_GPIOGDDR (1 << PG_CAN_TX)/* CAN_TX output, others inputs. */ -#define VAL_GPIOGCR1 0xFF /* All pull-up or push-pull. */ -#define VAL_GPIOGCR2 0 - -/* - * Port H initial setup (dummy, not present). - */ -#define VAL_GPIOHODR 0 -#define VAL_GPIOHDDR 0 /* All inputs. */ -#define VAL_GPIOHCR1 0xFF /* All pull-up. */ -#define VAL_GPIOHCR2 0 - -/* - * Port I initial setup. - */ -#define VAL_GPIOIODR 0 -#define VAL_GPIOIDDR 0 /* All inputs. */ -#define VAL_GPIOICR1 0xFF /* All pull-up. */ -#define VAL_GPIOICR2 0 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM3210C_EVAL/board.c b/boards/ST_STM3210C_EVAL/board.c deleted file mode 100644 index f851a09ba0..0000000000 --- a/boards/ST_STM3210C_EVAL/board.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * Remap USART2 to the PD5/PD6 pins. - */ - AFIO->MAPR |= AFIO_MAPR_USART2_REMAP; -} diff --git a/boards/ST_STM3210C_EVAL/board.h b/boards/ST_STM3210C_EVAL/board.h deleted file mode 100644 index 8aad92543e..0000000000 --- a/boards/ST_STM3210C_EVAL/board.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the STMicroelectronics STM3210C-EVAL evaluation board. - */ - -#define GPIOD_LED1 7 -#define GPIOD_LED2 13 -#define GPIOD_LED3 3 -#define GPIOD_LED4 4 - -/* - * Board identifier. - */ -#define BOARD_ST_STM3210C_EVAL -#define BOARD_NAME "ST STM3210C-EVAL" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 25000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_CL - -/* - * IO pins assignments. - * *********************TO BE COMPLETED********************* - */ - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input except: - */ -#define VAL_GPIOACRL 0x44444444 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x44444444 /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - * Everything input except: - */ -#define VAL_GPIOBCRL 0x44444444 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0x44444444 /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - * Everything input except: - */ -#define VAL_GPIOCCRL 0x44444444 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x44444444 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFFFF - -/* - * Port D setup. - * Everything input except: - * PD5 - USART2TX (remapped) AF PP Output - * PD6 - USART2RX (remapped) Digital Input - * PD7 - LED (LD1) PP Output - */ -#define VAL_GPIODCRL 0x34B33444 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x44344444 /* PD15...PD8 */ -#define VAL_GPIODODR 0x0000DF67 - -/* - * Port E setup. - * Everything input except: - */ -#define VAL_GPIOECRL 0x44444444 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x44344444 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM3210C_EVAL/board.mk b/boards/ST_STM3210C_EVAL/board.mk deleted file mode 100644 index eaa17162b0..0000000000 --- a/boards/ST_STM3210C_EVAL/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM3210C_EVAL/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM3210C_EVAL diff --git a/boards/ST_STM3210E_EVAL/board.c b/boards/ST_STM3210E_EVAL/board.c deleted file mode 100644 index a819aaf0fa..0000000000 --- a/boards/ST_STM3210E_EVAL/board.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, - {VAL_GPIOFODR, VAL_GPIOFCRL, VAL_GPIOFCRH}, - {VAL_GPIOGODR, VAL_GPIOGCRL, VAL_GPIOGCRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_SDC -/* Board-related functions related to the SDC driver.*/ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - return !palReadPad(GPIOF, GPIOF_SD_DETECT); -} - -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - return FALSE; -} -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - -} diff --git a/boards/ST_STM3210E_EVAL/board.h b/boards/ST_STM3210E_EVAL/board.h deleted file mode 100644 index 756b8664f0..0000000000 --- a/boards/ST_STM3210E_EVAL/board.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for the STMicroelectronics STM3210E-EVAL evaluation board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_STM3210E_EVAL -#define BOARD_NAME "ST STM3210E-EVAL" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - * Note: Older board revisions should define STM32F10X_HD instead, please - * verify the STM32 model mounted on your board. The change also - * affects your linker script. - */ -#define STM32F10X_XL - -/* - * IO pins assignments. - */ -#define GPIOA_WAKEUP_BUTTON 0 - -#define GPIOB_SC_3V_5V 0 -#define GPIOB_SPI1_CS 2 -#define GPIOB_TEMP_INT 5 -#define GPIOB_USB_DISC 14 - -#define GPIOC_SC_CMDVCC 6 -#define GPIOC_SC_OFF 7 -#define GPIOC_TAMPER_BUTTON 13 - -#define GPIOD_JOY_DOWN 3 - -#define GPIOF_LED1 6 -#define GPIOF_LED2 7 -#define GPIOF_LED3 8 -#define GPIOF_LED4 9 -#define GPIOF_SD_DETECT 11 - -#define GPIOG_JOY_SEL 7 -#define GPIOG_USER_BUTTON 8 -#define GPIOG_JOY_RIGHT 13 -#define GPIOG_JOY_LEFT 14 -#define GPIOG_JOY_UP 15 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_ANALOG(n) (0 << (((n) & 7) * 4)) -#define PIN_OUTPUT_PP_10(n) (1 << (((n) & 7) * 4)) -#define PIN_OUTPUT_PP_2(n) (2 << (((n) & 7) * 4)) -#define PIN_OUTPUT_PP_50(n) (3 << (((n) & 7) * 4)) -#define PIN_INPUT(n) (4 << (((n) & 7) * 4)) -#define PIN_OUTPUT_OD_10(n) (5 << (((n) & 7) * 4)) -#define PIN_OUTPUT_OD_2(n) (6 << (((n) & 7) * 4)) -#define PIN_OUTPUT_OD_50(n) (7 << (((n) & 7) * 4)) -#define PIN_INPUT_PUD(n) (8 << (((n) & 7) * 4)) -#define PIN_ALTERNATE_PP_10(n) (9 << (((n) & 7) * 4)) -#define PIN_ALTERNATE_PP_2(n) (10 << (((n) & 7) * 4)) -#define PIN_ALTERNATE_PP_50(n) (11 << (((n) & 7) * 4)) -#define PIN_ALTERNATE_OD_10(n) (13 << (((n) & 7) * 4)) -#define PIN_ALTERNATE_OD_2(n) (14 << (((n) & 7) * 4)) -#define PIN_ALTERNATE_OD_50(n) (15 << (((n) & 7) * 4)) -#define PIN_UNDEFINED(n) PIN_INPUT_PUD(n) - -/* - * Port A setup. - */ -#define VAL_GPIOACRL (PIN_INPUT(0) | /* Wakeup Button. */ \ - PIN_OUTPUT_PP_50(1) | /* USART2_RTS. */ \ - PIN_ALTERNATE_PP_50(2) | /* USART2_TX. */ \ - PIN_INPUT(3) | /* USART2_RX. */ \ - PIN_UNDEFINED(4) | \ - PIN_ALTERNATE_PP_50(5) | /* SPI1_SCK. */ \ - PIN_INPUT(6) | /* SPI1_MISO. */ \ - PIN_ALTERNATE_PP_50(7)) /* SPI1_MOSI. */ -#define VAL_GPIOACRH (PIN_ALTERNATE_PP_50(8) | /* MCO. */ \ - PIN_ALTERNATE_PP_50(9) | /* USART1_TX. */ \ - PIN_INPUT(10) | /* USART1_RX. */ \ - PIN_INPUT_PUD(11) | /* USB_DM. */ \ - PIN_INPUT_PUD(12) | /* USB_DP. */ \ - PIN_INPUT(13) | /* TMS. */ \ - PIN_INPUT(14) | /* TCK. */ \ - PIN_INPUT(15)) /* TDI. */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - */ -#define VAL_GPIOBCRL (PIN_OUTPUT_PP_50(0) | /* SmartCard_3/5V. */ \ - PIN_INPUT_PUD(1) | /* Unconnected. */ \ - PIN_OUTPUT_PP_50(2) | /* SPI1_CS. */ \ - PIN_INPUT(3) | /* TDO. */ \ - PIN_INPUT(4) | /* TRST. */ \ - PIN_INPUT_PUD(5) | /* Temp.Sensor INT. */ \ - PIN_ALTERNATE_OD_50(6) | /* I2C1_SCK. */ \ - PIN_ALTERNATE_OD_50(7)) /* I2C1_SDA. */ -#define VAL_GPIOBCRH (PIN_INPUT(8) | /* CAN_RX. */ \ - PIN_ALTERNATE_PP_50(9) | /* CAN_TX. */ \ - PIN_ALTERNATE_OD_50(10)| /* SmartCard IO. */ \ - PIN_OUTPUT_PP_50(11) | /* SmartCard RST. */ \ - PIN_ALTERNATE_PP_50(12)| /* SmartCard CLK. */ \ - PIN_UNDEFINED(13) | \ - PIN_OUTPUT_PP_50(14) | /* USB disconnect. */ \ - PIN_UNDEFINED(15)) -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - */ -#define VAL_GPIOCCRL (PIN_UNDEFINED(0) | \ - PIN_UNDEFINED(1) | \ - PIN_UNDEFINED(2) | \ - PIN_UNDEFINED(3) | \ - PIN_ANALOG(4) | /* Potentiometer. */ \ - PIN_UNDEFINED(5) | \ - PIN_OUTPUT_PP_50(6) | /* SmartCard CMDVCC. */ \ - PIN_INPUT(7)) /* SmartCard OFF. */ -#define VAL_GPIOCCRH (PIN_ALTERNATE_PP_50(8) | /* SDIO D0. */ \ - PIN_ALTERNATE_PP_50(9) | /* SDIO D1. */ \ - PIN_ALTERNATE_PP_50(10)| /* SDIO D2. */ \ - PIN_ALTERNATE_PP_50(11)| /* SDIO D3. */ \ - PIN_ALTERNATE_PP_50(12)| /* SDIO CLK. */ \ - PIN_INPUT(13) | /* Tamper Button. */ \ - PIN_INPUT(14) | /* OSC IN. */ \ - PIN_INPUT(15)) /* OSC OUT. */ -#define VAL_GPIOCODR 0xFFFFFFFF - -/* - * Port D setup - */ -#define VAL_GPIODCRL (PIN_ALTERNATE_PP_50(0) | /* FSMC_D2. */ \ - PIN_ALTERNATE_PP_50(1) | /* FSMC_D3. */ \ - PIN_ALTERNATE_PP_50(2) | /* SDIO CMD. */ \ - PIN_INPUT(3) | /* Joy Down. */ \ - PIN_ALTERNATE_PP_50(4) | /* FSMC_NOE. */ \ - PIN_ALTERNATE_PP_50(5) | /* FSMC_NWE. */ \ - PIN_INPUT(6) | /* FSMC_NWAIT. */ \ - PIN_ALTERNATE_PP_50(7)) /* FSMC_NCE2. */ -#define VAL_GPIODCRH (PIN_ALTERNATE_PP_50(8) | /* FSMC_D13. */ \ - PIN_ALTERNATE_PP_50(9) | /* FSMC_D14. */ \ - PIN_ALTERNATE_PP_50(10)| /* FSMC_D15. */ \ - PIN_ALTERNATE_PP_50(11)| /* FSMC_A16. */ \ - PIN_ALTERNATE_PP_50(12)| /* FSMC_A17. */ \ - PIN_ALTERNATE_PP_50(13)| /* FSMC_A18. */ \ - PIN_ALTERNATE_PP_50(14)| /* FSMC_D0. */ \ - PIN_ALTERNATE_PP_50(15)) /* FSMC_D1. */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - */ -#define VAL_GPIOECRL (PIN_ALTERNATE_PP_50(0) | /* FSMC_NBL0. */ \ - PIN_ALTERNATE_PP_50(1) | /* FSMC_NBL1. */ \ - PIN_ALTERNATE_PP_50(2) | /* FSMC_A23. */ \ - PIN_ALTERNATE_PP_50(3) | /* FSMC_A19. */ \ - PIN_ALTERNATE_PP_50(4) | /* FSMC_A20. */ \ - PIN_ALTERNATE_PP_50(5) | /* FSMC_A21. */ \ - PIN_ALTERNATE_PP_50(6) | /* FSMC_A22. */ \ - PIN_ALTERNATE_PP_50(7)) /* FSMC_D4. */ -#define VAL_GPIOECRH (PIN_ALTERNATE_PP_50(8) | /* FSMC_D5. */ \ - PIN_ALTERNATE_PP_50(9) | /* FSMC_D6. */ \ - PIN_ALTERNATE_PP_50(10)| /* FSMC_D7. */ \ - PIN_ALTERNATE_PP_50(11)| /* FSMC_D8. */ \ - PIN_ALTERNATE_PP_50(12)| /* FSMC_D9. */ \ - PIN_ALTERNATE_PP_50(13)| /* FSMC_D10. */ \ - PIN_ALTERNATE_PP_50(14)| /* FSMC_D11. */ \ - PIN_ALTERNATE_PP_50(15)) /* FSMC_D12. */ -#define VAL_GPIOEODR 0xFFFFFFFF - -/* - * Port F setup. - */ -#define VAL_GPIOFCRL (PIN_ALTERNATE_PP_50(0) | /* FSMC_A0. */ \ - PIN_ALTERNATE_PP_50(1) | /* FSMC_A1. */ \ - PIN_ALTERNATE_PP_50(2) | /* FSMC_A2. */ \ - PIN_ALTERNATE_PP_50(3) | /* FSMC_A3. */ \ - PIN_ALTERNATE_PP_50(4) | /* FSMC_A4. */ \ - PIN_ALTERNATE_PP_50(5) | /* FSMC_A5. */ \ - PIN_OUTPUT_PP_50(6) | /* LED1. */ \ - PIN_OUTPUT_PP_50(7)) /* LED2. */ -#define VAL_GPIOFCRH (PIN_OUTPUT_PP_50(8) | /* LED3. */ \ - PIN_OUTPUT_PP_50(9) | /* LED4. */ \ - PIN_UNDEFINED(10) | \ - PIN_INPUT_PUD(11) | /* SDCard detect. */ \ - PIN_ALTERNATE_PP_50(12)| /* FSMC_A6. */ \ - PIN_ALTERNATE_PP_50(13)| /* FSMC_A7. */ \ - PIN_ALTERNATE_PP_50(14)| /* FSMC_A8. */ \ - PIN_ALTERNATE_PP_50(15)) /* FSMC_A9. */ -#define VAL_GPIOFODR 0xFFFFFC3F - -/* - * Port G setup. - */ -#define VAL_GPIOGCRL (PIN_ALTERNATE_PP_50(0) | /* FSMC_A10. */ \ - PIN_ALTERNATE_PP_50(1) | /* FSMC_A11. */ \ - PIN_ALTERNATE_PP_50(2) | /* FSMC_A12. */ \ - PIN_ALTERNATE_PP_50(3) | /* FSMC_A13. */ \ - PIN_ALTERNATE_PP_50(4) | /* FSMC_A14. */ \ - PIN_ALTERNATE_PP_50(5) | /* FSMC_A15. */ \ - PIN_INPUT(6) | /* FSMC_INT2. */ \ - PIN_INPUT(7)) /* Joy Select. */ -#define VAL_GPIOGCRH (PIN_INPUT(8) | /* User Button. */ \ - PIN_ALTERNATE_PP_50(9) | /* FSMC_NE2. */ \ - PIN_ALTERNATE_PP_50(10)| /* FSMC_NE3. */ \ - PIN_OUTPUT_PP_50(11) | /* Audio PDN. */ \ - PIN_ALTERNATE_PP_50(12)| /* FSMC_NE4. */ \ - PIN_INPUT(13) | /* Joy Right. */ \ - PIN_INPUT(14) | /* Joy Left. */ \ - PIN_INPUT(15)) /* Joy Up. */ -#define VAL_GPIOGODR 0xFFFFF7FF - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM3210E_EVAL/board.mk b/boards/ST_STM3210E_EVAL/board.mk deleted file mode 100644 index edd0baf21d..0000000000 --- a/boards/ST_STM3210E_EVAL/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM3210E_EVAL/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM3210E_EVAL diff --git a/boards/ST_STM3220G_EVAL/board.c b/boards/ST_STM3220G_EVAL/board.c deleted file mode 100644 index 59b6e9de6c..0000000000 --- a/boards/ST_STM3220G_EVAL/board.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/ST_STM3220G_EVAL/board.h b/boards/ST_STM3220G_EVAL/board.h deleted file mode 100644 index ce5fac1a82..0000000000 --- a/boards/ST_STM3220G_EVAL/board.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for STMicroelectronics STM3220G-EVAL board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_STM3220G_EVAL -#define BOARD_NAME "ST STM3220G-EVAL" - -/* - * Board frequencies. - * NOTE: The HSE crystal is not fitted by default on the board. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 25000000 - -/* - * MCU type as defined in the ST header file stm32f2xx.h. - */ -#define STM32F2XX - -/* - * IO pins assignments. - */ - -#define GPIOA_WAKEUP_BUTTON 0 - -#define GPIOB_ETHER_INT 14 -#define GPIOB_NAND_INT 15 - -#define GPIOC_TAMPER_BUTTON 0 -#define GPIOC_LED4 7 - -#define GPIOF_POT 9 - -#define GPIOG_LED1 6 -#define GPIOG_LED2 8 -#define GPIOG_USER_BUTTON 15 - -#define GPIOH_EXPANDER_INT 12 -#define GPIOH_SD_DETECT 13 - -#define GPIOI_LED3 9 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0 << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1 << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2 << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3 << ((n) * 2)) -#define PIN_OTYPE_PUSHPULL(n) (0 << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1 << (n)) -#define PIN_OSPEED_2M(n) (0 << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1 << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2 << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3 << ((n) * 2)) -#define PIN_PUDR_FLOATING(n) (0 << ((n) * 2)) -#define PIN_PUDR_PULLUP(n) (1 << ((n) * 2)) -#define PIN_PUDR_PULLDOWN(n) (2 << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * Port A setup. - * All input with pull-up except: - * PA8 - MCO 1 (alternate 0). - * PA13 - JTMS/SWDAT (alternate 0). - * PA14 - JTCK/SWCLK (alternate 0). - * PA15 - JTDI (alternate 0). - */ -#define VAL_GPIOA_MODER (PIN_MODE_ALTERNATE(8) | \ - PIN_MODE_ALTERNATE(13) | \ - PIN_MODE_ALTERNATE(14) | \ - PIN_MODE_ALTERNATE(15)) -#define VAL_GPIOA_OTYPER 0x00000000 -#define VAL_GPIOA_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOA_PUPDR (PIN_PUDR_FLOATING(13) | \ - PIN_PUDR_FLOATING(14) | \ - PIN_PUDR_FLOATING(15)) -#define VAL_GPIOA_ODR 0xFFFFFFFF -#define VAL_GPIOA_AFRL 0x00000000 -#define VAL_GPIOA_AFRH 0x00000000 - -/* - * Port B setup. - * All input with pull-up except: - * PB3 - JTDO (alternate 0). - * PB4 - JNTRST (alternate 0). - */ -#define VAL_GPIOB_MODER (PIN_MODE_ALTERNATE(3) | \ - PIN_MODE_ALTERNATE(4)) -#define VAL_GPIOB_OTYPER 0x00000000 -#define VAL_GPIOB_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOB_PUPDR (~(PIN_PUDR_FLOATING(3) | \ - PIN_PUDR_FLOATING(4))) -#define VAL_GPIOB_ODR 0xFFFFFFFF -#define VAL_GPIOB_AFRL 0x00000000 -#define VAL_GPIOB_AFRH 0x00000000 - -/* - * Port C setup. - * All input with pull-up except: - * PC9 - MCO2 (alternate 0). - * PC10 - USART3_TX (alternate 7). - * PC11 - USART3_RX (alternate 7). - * PC14 - OSC32_INT (input floating). - * PC15 - OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_ALTERNATE(9) | \ - PIN_MODE_ALTERNATE(10) | \ - PIN_MODE_ALTERNATE(11)) -#define VAL_GPIOC_OTYPER 0x00000000 -#define VAL_GPIOC_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOC_PUPDR (~(PIN_PUDR_PULLUP(11) | \ - PIN_PUDR_FLOATING(14) | \ - PIN_PUDR_FLOATING(15))) -#define VAL_GPIOC_ODR 0xFFFFFFFF -#define VAL_GPIOC_AFRL 0x00000000 -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(7, 10) | \ - PIN_AFIO_AF(7, 11)) - -/* - * Port D setup. - * All input with pull-up. - */ -#define VAL_GPIOD_MODER 0x00000000 -#define VAL_GPIOD_OTYPER 0x00000000 -#define VAL_GPIOD_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOD_PUPDR 0xFFFFFFFF -#define VAL_GPIOD_ODR 0xFFFFFFFF -#define VAL_GPIOD_AFRL 0x00000000 -#define VAL_GPIOD_AFRH 0x00000000 - -/* - * Port E setup. - * All input with pull-up. - */ -#define VAL_GPIOE_MODER 0x00000000 -#define VAL_GPIOE_OTYPER 0x00000000 -#define VAL_GPIOE_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOE_PUPDR 0xFFFFFFFF -#define VAL_GPIOE_ODR 0xFFFFFFFF -#define VAL_GPIOE_AFRL 0x00000000 -#define VAL_GPIOE_AFRH 0x00000000 - -/* - * Port F setup. - * All input with pull-up. - */ -#define VAL_GPIOF_MODER 0x00000000 -#define VAL_GPIOF_OTYPER 0x00000000 -#define VAL_GPIOF_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOF_PUPDR 0xFFFFFFFF -#define VAL_GPIOF_ODR 0xFFFFFFFF -#define VAL_GPIOF_AFRL 0x00000000 -#define VAL_GPIOF_AFRH 0x00000000 - -/* - * Port G setup. - * All input with pull-up. - */ -#define VAL_GPIOG_MODER (PIN_MODE_OUTPUT(GPIOG_LED1)) -#define VAL_GPIOG_OTYPER 0x00000000 -#define VAL_GPIOG_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOG_PUPDR (~(PIN_PUDR_FLOATING(GPIOG_LED1))) -#define VAL_GPIOG_ODR 0xFFFFFFBF -#define VAL_GPIOG_AFRL 0x00000000 -#define VAL_GPIOG_AFRH 0x00000000 - -/* - * Port H setup. - * All input with pull-up. - */ -#define VAL_GPIOH_MODER 0x00000000 -#define VAL_GPIOH_OTYPER 0x00000000 -#define VAL_GPIOH_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOH_PUPDR 0xFFFFFFFF -#define VAL_GPIOH_ODR 0xFFFFFFFF -#define VAL_GPIOH_AFRL 0x00000000 -#define VAL_GPIOH_AFRH 0x00000000 - -/* - * Port I setup. - * All input with pull-up. - */ -#define VAL_GPIOI_MODER 0x00000000 -#define VAL_GPIOI_OTYPER 0x00000000 -#define VAL_GPIOI_OSPEEDR 0xFFFFFFFF -#define VAL_GPIOI_PUPDR 0xFFFFFFFF -#define VAL_GPIOI_ODR 0xFFFFFFFF -#define VAL_GPIOI_AFRL 0x00000000 -#define VAL_GPIOI_AFRH 0x00000000 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM3220G_EVAL/board.mk b/boards/ST_STM3220G_EVAL/board.mk deleted file mode 100644 index 3121594a6d..0000000000 --- a/boards/ST_STM3220G_EVAL/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM3220G_EVAL/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM3220G_EVAL diff --git a/boards/ST_STM32F0_DISCOVERY/board.c b/boards/ST_STM32F0_DISCOVERY/board.c deleted file mode 100644 index e3b77d2b44..0000000000 --- a/boards/ST_STM32F0_DISCOVERY/board.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/boards/ST_STM32F0_DISCOVERY/board.h b/boards/ST_STM32F0_DISCOVERY/board.h deleted file mode 100644 index 65e5595aa0..0000000000 --- a/boards/ST_STM32F0_DISCOVERY/board.h +++ /dev/null @@ -1,760 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for ST STM32F0-Discovery board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_STM32F0_DISCOVERY -#define BOARD_NAME "ST STM32F0-Discovery" - - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - * NOTE: HSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0 -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0 -#endif - -#define STM32_HSE_BYPASS - -/* - * MCU type as defined in the ST header file stm32f0xx.h. - */ -#define STM32F0XX - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON 0 -#define GPIOA_PIN1 1 -#define GPIOA_PIN2 2 -#define GPIOA_PIN3 3 -#define GPIOA_PIN4 4 -#define GPIOA_PIN5 5 -#define GPIOA_PIN6 6 -#define GPIOA_PIN7 7 -#define GPIOA_PIN8 8 -#define GPIOA_PIN9 9 -#define GPIOA_PIN10 10 -#define GPIOA_PIN11 11 -#define GPIOA_PIN12 12 -#define GPIOA_SWDAT 13 -#define GPIOA_SWCLK 14 -#define GPIOA_PIN15 15 - -#define GPIOB_PIN0 0 -#define GPIOB_PIN1 1 -#define GPIOB_PIN2 2 -#define GPIOB_PIN3 3 -#define GPIOB_PIN4 4 -#define GPIOB_PIN5 5 -#define GPIOB_PIN6 6 -#define GPIOB_PIN7 7 -#define GPIOB_PIN8 8 -#define GPIOB_PIN9 9 -#define GPIOB_PIN10 10 -#define GPIOB_PIN11 11 -#define GPIOB_PIN12 12 -#define GPIOB_PIN13 13 -#define GPIOB_PIN14 14 -#define GPIOB_PIN15 15 - -#define GPIOC_PIN0 0 -#define GPIOC_PIN1 1 -#define GPIOC_PIN2 2 -#define GPIOC_PIN3 3 -#define GPIOC_PIN4 4 -#define GPIOC_PIN5 5 -#define GPIOC_PIN6 6 -#define GPIOC_PIN7 7 -#define GPIOC_LED4 8 -#define GPIOC_LED3 9 -#define GPIOC_PIN10 10 -#define GPIOC_PIN11 11 -#define GPIOC_PIN12 12 -#define GPIOC_PIN13 13 -#define GPIOC_OSC32_IN 14 -#define GPIOC_OSC32_OUT 15 - -#define GPIOD_PIN0 0 -#define GPIOD_PIN1 1 -#define GPIOD_PIN2 2 -#define GPIOD_PIN3 3 -#define GPIOD_PIN4 4 -#define GPIOD_PIN5 5 -#define GPIOD_PIN6 6 -#define GPIOD_PIN7 7 -#define GPIOD_PIN8 8 -#define GPIOD_PIN9 9 -#define GPIOD_PIN10 10 -#define GPIOD_PIN11 11 -#define GPIOD_PIN12 12 -#define GPIOD_PIN13 13 -#define GPIOD_PIN14 14 -#define GPIOD_PIN15 15 - -#define GPIOF_OSC_IN 0 -#define GPIOF_OSC_OUT 1 -#define GPIOF_PIN2 2 -#define GPIOF_PIN3 3 -#define GPIOF_PIN4 4 -#define GPIOF_PIN5 5 -#define GPIOF_PIN6 6 -#define GPIOF_PIN7 7 -#define GPIOF_PIN8 8 -#define GPIOF_PIN9 9 -#define GPIOF_PIN10 10 -#define GPIOF_PIN11 11 -#define GPIOF_PIN12 12 -#define GPIOF_PIN13 13 -#define GPIOF_PIN14 14 -#define GPIOF_PIN15 15 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_10M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_40M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * GPIOA setup: - * - * PA0 - BUTTON (input floating). - * PA1 - PIN1 (input pullup). - * PA2 - PIN2 (input pullup). - * PA3 - PIN3 (input pullup). - * PA4 - PIN4 (input pullup). - * PA5 - PIN5 (input pullup). - * PA6 - PIN6 (input pullup). - * PA7 - PIN7 (input pullup). - * PA8 - PIN8 (input pullup). - * PA9 - PIN9 (input pullup). - * PA10 - PIN10 (input pullup). - * PA11 - PIN11 (input pullup). - * PA12 - PIN12 (input pullup). - * PA13 - SWDAT (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (input pullup). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ - PIN_MODE_INPUT(GPIOA_PIN1) | \ - PIN_MODE_INPUT(GPIOA_PIN2) | \ - PIN_MODE_INPUT(GPIOA_PIN3) | \ - PIN_MODE_INPUT(GPIOA_PIN4) | \ - PIN_MODE_INPUT(GPIOA_PIN5) | \ - PIN_MODE_INPUT(GPIOA_PIN6) | \ - PIN_MODE_INPUT(GPIOA_PIN7) | \ - PIN_MODE_INPUT(GPIOA_PIN8) | \ - PIN_MODE_INPUT(GPIOA_PIN9) | \ - PIN_MODE_INPUT(GPIOA_PIN10) | \ - PIN_MODE_INPUT(GPIOA_PIN11) | \ - PIN_MODE_INPUT(GPIOA_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDAT) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_INPUT(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDAT) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_2M(GPIOA_BUTTON) | \ - PIN_OSPEED_2M(GPIOA_PIN1) | \ - PIN_OSPEED_2M(GPIOA_PIN2) | \ - PIN_OSPEED_2M(GPIOA_PIN3) | \ - PIN_OSPEED_2M(GPIOA_PIN4) | \ - PIN_OSPEED_2M(GPIOA_PIN5) | \ - PIN_OSPEED_2M(GPIOA_PIN6) | \ - PIN_OSPEED_2M(GPIOA_PIN7) | \ - PIN_OSPEED_2M(GPIOA_PIN8) | \ - PIN_OSPEED_2M(GPIOA_PIN9) | \ - PIN_OSPEED_2M(GPIOA_PIN10) | \ - PIN_OSPEED_2M(GPIOA_PIN11) | \ - PIN_OSPEED_2M(GPIOA_PIN12) | \ - PIN_OSPEED_40M(GPIOA_SWDAT) | \ - PIN_OSPEED_40M(GPIOA_SWCLK) | \ - PIN_OSPEED_40M(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOA_SWDAT) | \ - PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_PIN9) | \ - PIN_ODR_HIGH(GPIOA_PIN10) | \ - PIN_ODR_HIGH(GPIOA_PIN11) | \ - PIN_ODR_HIGH(GPIOA_PIN12) | \ - PIN_ODR_HIGH(GPIOA_SWDAT) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ - PIN_AFIO_AF(GPIOA_PIN9, 0) | \ - PIN_AFIO_AF(GPIOA_PIN10, 0) | \ - PIN_AFIO_AF(GPIOA_PIN11, 0) | \ - PIN_AFIO_AF(GPIOA_PIN12, 0) | \ - PIN_AFIO_AF(GPIOA_SWDAT, 0) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (input pullup). - * PB1 - PIN1 (input pullup). - * PB2 - PIN2 (input pullup). - * PB3 - PIN3 (input pullup). - * PB4 - PIN4 (input pullup). - * PB5 - PIN5 (input pullup). - * PB6 - PIN6 (input pullup). - * PB7 - PIN7 (input pullup). - * PB8 - PIN8 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ - PIN_MODE_INPUT(GPIOB_PIN1) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_INPUT(GPIOB_PIN3) | \ - PIN_MODE_INPUT(GPIOB_PIN4) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_INPUT(GPIOB_PIN6) | \ - PIN_MODE_INPUT(GPIOB_PIN7) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_2M(GPIOB_PIN0) | \ - PIN_OSPEED_2M(GPIOB_PIN1) | \ - PIN_OSPEED_40M(GPIOB_PIN2) | \ - PIN_OSPEED_40M(GPIOB_PIN3) | \ - PIN_OSPEED_40M(GPIOB_PIN4) | \ - PIN_OSPEED_2M(GPIOB_PIN5) | \ - PIN_OSPEED_2M(GPIOB_PIN6) | \ - PIN_OSPEED_2M(GPIOB_PIN7) | \ - PIN_OSPEED_2M(GPIOB_PIN8) | \ - PIN_OSPEED_2M(GPIOB_PIN9) | \ - PIN_OSPEED_2M(GPIOB_PIN10) | \ - PIN_OSPEED_2M(GPIOB_PIN11) | \ - PIN_OSPEED_2M(GPIOB_PIN12) | \ - PIN_OSPEED_2M(GPIOB_PIN13) | \ - PIN_OSPEED_2M(GPIOB_PIN14) | \ - PIN_OSPEED_2M(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_PIN3) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_PIN6) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0) | \ - PIN_AFIO_AF(GPIOB_PIN3, 0) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0) | \ - PIN_AFIO_AF(GPIOB_PIN6, 0) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - LED4 (output pushpull maximum). - * PC9 - LED3 (output pushpull maximum). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - OSC32_IN (input floating). - * PC15 - OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_OUTPUT(GPIOC_LED4) | \ - PIN_MODE_OUTPUT(GPIOC_LED3) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_LED4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_LED3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_2M(GPIOC_PIN0) | \ - PIN_OSPEED_2M(GPIOC_PIN1) | \ - PIN_OSPEED_2M(GPIOC_PIN2) | \ - PIN_OSPEED_2M(GPIOC_PIN3) | \ - PIN_OSPEED_2M(GPIOC_PIN4) | \ - PIN_OSPEED_2M(GPIOC_PIN5) | \ - PIN_OSPEED_2M(GPIOC_PIN6) | \ - PIN_OSPEED_2M(GPIOC_PIN7) | \ - PIN_OSPEED_40M(GPIOC_LED4) | \ - PIN_OSPEED_40M(GPIOC_LED3) | \ - PIN_OSPEED_2M(GPIOC_PIN10) | \ - PIN_OSPEED_2M(GPIOC_PIN11) | \ - PIN_OSPEED_2M(GPIOC_PIN12) | \ - PIN_OSPEED_2M(GPIOC_PIN13) | \ - PIN_OSPEED_40M(GPIOC_OSC32_IN) | \ - PIN_OSPEED_40M(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOC_LED4) | \ - PIN_PUPDR_FLOATING(GPIOC_LED3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_LOW(GPIOC_LED4) | \ - PIN_ODR_LOW(GPIOC_LED3) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED4, 0) | \ - PIN_AFIO_AF(GPIOC_LED3, 0) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_2M(GPIOD_PIN0) | \ - PIN_OSPEED_2M(GPIOD_PIN1) | \ - PIN_OSPEED_2M(GPIOD_PIN2) | \ - PIN_OSPEED_2M(GPIOD_PIN3) | \ - PIN_OSPEED_2M(GPIOD_PIN4) | \ - PIN_OSPEED_2M(GPIOD_PIN5) | \ - PIN_OSPEED_2M(GPIOD_PIN6) | \ - PIN_OSPEED_2M(GPIOD_PIN7) | \ - PIN_OSPEED_2M(GPIOD_PIN8) | \ - PIN_OSPEED_2M(GPIOD_PIN9) | \ - PIN_OSPEED_2M(GPIOD_PIN10) | \ - PIN_OSPEED_2M(GPIOD_PIN11) | \ - PIN_OSPEED_2M(GPIOD_PIN12) | \ - PIN_OSPEED_2M(GPIOD_PIN13) | \ - PIN_OSPEED_2M(GPIOD_PIN14) | \ - PIN_OSPEED_2M(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0)) - -/* - * GPIOF setup: - * - * PF0 - OSC_IN (input floating). - * PF1 - OSC_OUT (input floating). - * PF2 - PIN2 (input pullup). - * PF3 - PIN3 (input pullup). - * PF4 - PIN4 (input pullup). - * PF5 - PIN5 (input pullup). - * PF6 - PIN6 (input pullup). - * PF7 - PIN7 (input pullup). - * PF8 - PIN8 (input pullup). - * PF9 - PIN9 (input pullup). - * PF10 - PIN10 (input pullup). - * PF11 - PIN11 (input pullup). - * PF12 - PIN12 (input pullup). - * PF13 - PIN13 (input pullup). - * PF14 - PIN14 (input pullup). - * PF15 - PIN15 (input pullup). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \ - PIN_MODE_INPUT(GPIOF_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_2M(GPIOF_OSC_IN) | \ - PIN_OSPEED_2M(GPIOF_OSC_OUT) | \ - PIN_OSPEED_2M(GPIOF_PIN2) | \ - PIN_OSPEED_2M(GPIOF_PIN3) | \ - PIN_OSPEED_2M(GPIOF_PIN4) | \ - PIN_OSPEED_2M(GPIOF_PIN5) | \ - PIN_OSPEED_2M(GPIOF_PIN6) | \ - PIN_OSPEED_2M(GPIOF_PIN7) | \ - PIN_OSPEED_2M(GPIOF_PIN8) | \ - PIN_OSPEED_2M(GPIOF_PIN9) | \ - PIN_OSPEED_2M(GPIOF_PIN10) | \ - PIN_OSPEED_2M(GPIOF_PIN11) | \ - PIN_OSPEED_2M(GPIOF_PIN12) | \ - PIN_OSPEED_2M(GPIOF_PIN13) | \ - PIN_OSPEED_2M(GPIOF_PIN14) | \ - PIN_OSPEED_2M(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \ - PIN_ODR_HIGH(GPIOF_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0) | \ - PIN_AFIO_AF(GPIOF_OSC_OUT, 0) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0)) - - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM32F0_DISCOVERY/board.mk b/boards/ST_STM32F0_DISCOVERY/board.mk deleted file mode 100644 index 144ae49630..0000000000 --- a/boards/ST_STM32F0_DISCOVERY/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM32F0_DISCOVERY/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM32F0_DISCOVERY diff --git a/boards/ST_STM32F0_DISCOVERY/cfg/board.chcfg b/boards/ST_STM32F0_DISCOVERY/cfg/board.chcfg deleted file mode 100644 index f69d6ca66e..0000000000 --- a/boards/ST_STM32F0_DISCOVERY/cfg/board.chcfg +++ /dev/null @@ -1,669 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32f0xx/templates - .. - - ST STM32F0-Discovery - ST_STM32F0_DISCOVERY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/boards/ST_STM32F4_DISCOVERY/board.c b/boards/ST_STM32F4_DISCOVERY/board.c deleted file mode 100644 index b8f1272f98..0000000000 --- a/boards/ST_STM32F4_DISCOVERY/board.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return TRUE; -} - -/** - * @brief SDC card write protection detection. - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return FALSE; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/boards/ST_STM32F4_DISCOVERY/board.h b/boards/ST_STM32F4_DISCOVERY/board.h deleted file mode 100644 index fa3fa4a086..0000000000 --- a/boards/ST_STM32F4_DISCOVERY/board.h +++ /dev/null @@ -1,1301 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for STMicroelectronics STM32F4-Discovery board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_STM32F4_DISCOVERY -#define BOARD_NAME "STMicroelectronics STM32F4-Discovery" - - -/* - * Board oscillators-related settings. - * NOTE: LSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 0 -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 8000000 -#endif - - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD 300 - -/* - * MCU type as defined in the ST header file stm32f4xx.h. - */ -#define STM32F4XX - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON 0 -#define GPIOA_PIN1 1 -#define GPIOA_PIN2 2 -#define GPIOA_PIN3 3 -#define GPIOA_LRCK 4 -#define GPIOA_SPC 5 -#define GPIOA_SDO 6 -#define GPIOA_SDI 7 -#define GPIOA_PIN8 8 -#define GPIOA_VBUS_FS 9 -#define GPIOA_OTG_FS_ID 10 -#define GPIOA_OTG_FS_DM 11 -#define GPIOA_OTG_FS_DP 12 -#define GPIOA_SWDIO 13 -#define GPIOA_SWCLK 14 -#define GPIOA_PIN15 15 - -#define GPIOB_PIN0 0 -#define GPIOB_PIN1 1 -#define GPIOB_PIN2 2 -#define GPIOB_SWO 3 -#define GPIOB_PIN4 4 -#define GPIOB_PIN5 5 -#define GPIOB_SCL 6 -#define GPIOB_PIN7 7 -#define GPIOB_PIN8 8 -#define GPIOB_SDA 9 -#define GPIOB_CLK_IN 10 -#define GPIOB_PIN11 11 -#define GPIOB_PIN12 12 -#define GPIOB_PIN13 13 -#define GPIOB_PIN14 14 -#define GPIOB_PIN15 15 - -#define GPIOC_OTG_FS_POWER_ON 0 -#define GPIOC_PIN1 1 -#define GPIOC_PIN2 2 -#define GPIOC_PDM_OUT 3 -#define GPIOC_PIN4 4 -#define GPIOC_PIN5 5 -#define GPIOC_PIN6 6 -#define GPIOC_MCLK 7 -#define GPIOC_PIN8 8 -#define GPIOC_PIN9 9 -#define GPIOC_SCLK 10 -#define GPIOC_PIN11 11 -#define GPIOC_SDIN 12 -#define GPIOC_PIN13 13 -#define GPIOC_PIN14 14 -#define GPIOC_PIN15 15 - -#define GPIOD_PIN0 0 -#define GPIOD_PIN1 1 -#define GPIOD_PIN2 2 -#define GPIOD_PIN3 3 -#define GPIOD_RESET 4 -#define GPIOD_OVER_CURRENT 5 -#define GPIOD_PIN6 6 -#define GPIOD_PIN7 7 -#define GPIOD_PIN8 8 -#define GPIOD_PIN9 9 -#define GPIOD_PIN10 10 -#define GPIOD_PIN11 11 -#define GPIOD_LED4 12 -#define GPIOD_LED3 13 -#define GPIOD_LED5 14 -#define GPIOD_LED6 15 - -#define GPIOE_INT1 0 -#define GPIOE_INT2 1 -#define GPIOE_PIN2 2 -#define GPIOE_CS_SPI 3 -#define GPIOE_PIN4 4 -#define GPIOE_PIN5 5 -#define GPIOE_PIN6 6 -#define GPIOE_PIN7 7 -#define GPIOE_PIN8 8 -#define GPIOE_PIN9 9 -#define GPIOE_PIN10 10 -#define GPIOE_PIN11 11 -#define GPIOE_PIN12 12 -#define GPIOE_PIN13 13 -#define GPIOE_PIN14 14 -#define GPIOE_PIN15 15 - -#define GPIOF_PIN0 0 -#define GPIOF_PIN1 1 -#define GPIOF_PIN2 2 -#define GPIOF_PIN3 3 -#define GPIOF_PIN4 4 -#define GPIOF_PIN5 5 -#define GPIOF_PIN6 6 -#define GPIOF_PIN7 7 -#define GPIOF_PIN8 8 -#define GPIOF_PIN9 9 -#define GPIOF_PIN10 10 -#define GPIOF_PIN11 11 -#define GPIOF_PIN12 12 -#define GPIOF_PIN13 13 -#define GPIOF_PIN14 14 -#define GPIOF_PIN15 15 - -#define GPIOG_PIN0 0 -#define GPIOG_PIN1 1 -#define GPIOG_PIN2 2 -#define GPIOG_PIN3 3 -#define GPIOG_PIN4 4 -#define GPIOG_PIN5 5 -#define GPIOG_PIN6 6 -#define GPIOG_PIN7 7 -#define GPIOG_PIN8 8 -#define GPIOG_PIN9 9 -#define GPIOG_PIN10 10 -#define GPIOG_PIN11 11 -#define GPIOG_PIN12 12 -#define GPIOG_PIN13 13 -#define GPIOG_PIN14 14 -#define GPIOG_PIN15 15 - -#define GPIOH_OSC_IN 0 -#define GPIOH_OSC_OUT 1 -#define GPIOH_PIN2 2 -#define GPIOH_PIN3 3 -#define GPIOH_PIN4 4 -#define GPIOH_PIN5 5 -#define GPIOH_PIN6 6 -#define GPIOH_PIN7 7 -#define GPIOH_PIN8 8 -#define GPIOH_PIN9 9 -#define GPIOH_PIN10 10 -#define GPIOH_PIN11 11 -#define GPIOH_PIN12 12 -#define GPIOH_PIN13 13 -#define GPIOH_PIN14 14 -#define GPIOH_PIN15 15 - -#define GPIOI_PIN0 0 -#define GPIOI_PIN1 1 -#define GPIOI_PIN2 2 -#define GPIOI_PIN3 3 -#define GPIOI_PIN4 4 -#define GPIOI_PIN5 5 -#define GPIOI_PIN6 6 -#define GPIOI_PIN7 7 -#define GPIOI_PIN8 8 -#define GPIOI_PIN9 9 -#define GPIOI_PIN10 10 -#define GPIOI_PIN11 11 -#define GPIOI_PIN12 12 -#define GPIOI_PIN13 13 -#define GPIOI_PIN14 14 -#define GPIOI_PIN15 15 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * GPIOA setup: - * - * PA0 - BUTTON (input floating). - * PA1 - PIN1 (input pullup). - * PA2 - PIN2 (input pullup). - * PA3 - PIN3 (input pullup). - * PA4 - LRCK (alternate 6). - * PA5 - SPC (alternate 5). - * PA6 - SDO (alternate 5). - * PA7 - SDI (alternate 5). - * PA8 - PIN8 (input pullup). - * PA9 - VBUS_FS (input floating). - * PA10 - OTG_FS_ID (alternate 10). - * PA11 - OTG_FS_DM (alternate 10). - * PA12 - OTG_FS_DP (alternate 10). - * PA13 - SWDIO (alternate 0). - * PA14 - SWCLK (alternate 0). - * PA15 - PIN15 (input pullup). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ - PIN_MODE_INPUT(GPIOA_PIN1) | \ - PIN_MODE_INPUT(GPIOA_PIN2) | \ - PIN_MODE_INPUT(GPIOA_PIN3) | \ - PIN_MODE_ALTERNATE(GPIOA_LRCK) | \ - PIN_MODE_ALTERNATE(GPIOA_SPC) | \ - PIN_MODE_ALTERNATE(GPIOA_SDO) | \ - PIN_MODE_ALTERNATE(GPIOA_SDI) | \ - PIN_MODE_INPUT(GPIOA_PIN8) | \ - PIN_MODE_INPUT(GPIOA_VBUS_FS) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_ID) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DM) | \ - PIN_MODE_ALTERNATE(GPIOA_OTG_FS_DP) | \ - PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ - PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ - PIN_MODE_INPUT(GPIOA_PIN15)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_LRCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SPC) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SDO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SDI) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_VBUS_FS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_ID) | \ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_DM) | \ - PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_DP) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ - PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_100M(GPIOA_BUTTON) | \ - PIN_OSPEED_100M(GPIOA_PIN1) | \ - PIN_OSPEED_100M(GPIOA_PIN2) | \ - PIN_OSPEED_100M(GPIOA_PIN3) | \ - PIN_OSPEED_100M(GPIOA_LRCK) | \ - PIN_OSPEED_50M(GPIOA_SPC) | \ - PIN_OSPEED_50M(GPIOA_SDO) | \ - PIN_OSPEED_50M(GPIOA_SDI) | \ - PIN_OSPEED_100M(GPIOA_PIN8) | \ - PIN_OSPEED_100M(GPIOA_VBUS_FS) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_ID) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_DM) | \ - PIN_OSPEED_100M(GPIOA_OTG_FS_DP) | \ - PIN_OSPEED_100M(GPIOA_SWDIO) | \ - PIN_OSPEED_100M(GPIOA_SWCLK) | \ - PIN_OSPEED_100M(GPIOA_PIN15)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOA_LRCK) | \ - PIN_PUPDR_FLOATING(GPIOA_SPC) | \ - PIN_PUPDR_FLOATING(GPIOA_SDO) | \ - PIN_PUPDR_FLOATING(GPIOA_SDI) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) | \ - PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) | \ - PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) | \ - PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) | \ - PIN_PUPDR_FLOATING(GPIOA_SWDIO) | \ - PIN_PUPDR_FLOATING(GPIOA_SWCLK) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN15)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_LRCK) | \ - PIN_ODR_HIGH(GPIOA_SPC) | \ - PIN_ODR_HIGH(GPIOA_SDO) | \ - PIN_ODR_HIGH(GPIOA_SDI) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_VBUS_FS) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_ID) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_DM) | \ - PIN_ODR_HIGH(GPIOA_OTG_FS_DP) | \ - PIN_ODR_HIGH(GPIOA_SWDIO) | \ - PIN_ODR_HIGH(GPIOA_SWCLK) | \ - PIN_ODR_HIGH(GPIOA_PIN15)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0) | \ - PIN_AFIO_AF(GPIOA_LRCK, 6) | \ - PIN_AFIO_AF(GPIOA_SPC, 5) | \ - PIN_AFIO_AF(GPIOA_SDO, 5) | \ - PIN_AFIO_AF(GPIOA_SDI, 5)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ - PIN_AFIO_AF(GPIOA_VBUS_FS, 0) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_ID, 10) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DM, 10) | \ - PIN_AFIO_AF(GPIOA_OTG_FS_DP, 10) | \ - PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ - PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ - PIN_AFIO_AF(GPIOA_PIN15, 0)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (input pullup). - * PB1 - PIN1 (input pullup). - * PB2 - PIN2 (input pullup). - * PB3 - SWO (alternate 0). - * PB4 - PIN4 (input pullup). - * PB5 - PIN5 (input pullup). - * PB6 - SCL (alternate 4). - * PB7 - PIN7 (input pullup). - * PB8 - PIN8 (input pullup). - * PB9 - SDA (alternate 4). - * PB10 - CLK_IN (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ - PIN_MODE_INPUT(GPIOB_PIN1) | \ - PIN_MODE_INPUT(GPIOB_PIN2) | \ - PIN_MODE_ALTERNATE(GPIOB_SWO) | \ - PIN_MODE_INPUT(GPIOB_PIN4) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_ALTERNATE(GPIOB_SCL) | \ - PIN_MODE_INPUT(GPIOB_PIN7) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_ALTERNATE(GPIOB_SDA) | \ - PIN_MODE_INPUT(GPIOB_CLK_IN) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOB_SWO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_SCL) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_OPENDRAIN(GPIOB_SDA) | \ - PIN_OTYPE_PUSHPULL(GPIOB_CLK_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_100M(GPIOB_PIN0) | \ - PIN_OSPEED_100M(GPIOB_PIN1) | \ - PIN_OSPEED_100M(GPIOB_PIN2) | \ - PIN_OSPEED_100M(GPIOB_SWO) | \ - PIN_OSPEED_100M(GPIOB_PIN4) | \ - PIN_OSPEED_100M(GPIOB_PIN5) | \ - PIN_OSPEED_100M(GPIOB_SCL) | \ - PIN_OSPEED_100M(GPIOB_PIN7) | \ - PIN_OSPEED_100M(GPIOB_PIN8) | \ - PIN_OSPEED_100M(GPIOB_SDA) | \ - PIN_OSPEED_100M(GPIOB_CLK_IN) | \ - PIN_OSPEED_100M(GPIOB_PIN11) | \ - PIN_OSPEED_100M(GPIOB_PIN12) | \ - PIN_OSPEED_100M(GPIOB_PIN13) | \ - PIN_OSPEED_100M(GPIOB_PIN14) | \ - PIN_OSPEED_100M(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOB_SWO) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_SCL) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOB_SDA) | \ - PIN_PUPDR_PULLUP(GPIOB_CLK_IN) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_PIN2) | \ - PIN_ODR_HIGH(GPIOB_SWO) | \ - PIN_ODR_HIGH(GPIOB_PIN4) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_HIGH(GPIOB_SCL) | \ - PIN_ODR_HIGH(GPIOB_PIN7) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_SDA) | \ - PIN_ODR_HIGH(GPIOB_CLK_IN) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0) | \ - PIN_AFIO_AF(GPIOB_PIN2, 0) | \ - PIN_AFIO_AF(GPIOB_SWO, 0) | \ - PIN_AFIO_AF(GPIOB_PIN4, 0) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0) | \ - PIN_AFIO_AF(GPIOB_SCL, 4) | \ - PIN_AFIO_AF(GPIOB_PIN7, 0)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ - PIN_AFIO_AF(GPIOB_SDA, 4) | \ - PIN_AFIO_AF(GPIOB_CLK_IN, 0) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0)) - -/* - * GPIOC setup: - * - * PC0 - OTG_FS_POWER_ON (output pushpull maximum). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PDM_OUT (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - MCLK (alternate 6). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - SCLK (alternate 6). - * PC11 - PIN11 (input pullup). - * PC12 - SDIN (alternate 6). - * PC13 - PIN13 (input pullup). - * PC14 - PIN14 (input pullup). - * PC15 - PIN15 (input pullup). - */ -#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_OTG_FS_POWER_ON) |\ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PDM_OUT) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_ALTERNATE(GPIOC_MCLK) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_ALTERNATE(GPIOC_SCLK) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_ALTERNATE(GPIOC_SDIN) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_PIN14) | \ - PIN_MODE_INPUT(GPIOC_PIN15)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_OTG_FS_POWER_ON) |\ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PDM_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_MCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SCLK) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_SDIN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_100M(GPIOC_OTG_FS_POWER_ON) |\ - PIN_OSPEED_100M(GPIOC_PIN1) | \ - PIN_OSPEED_100M(GPIOC_PIN2) | \ - PIN_OSPEED_100M(GPIOC_PDM_OUT) | \ - PIN_OSPEED_100M(GPIOC_PIN4) | \ - PIN_OSPEED_100M(GPIOC_PIN5) | \ - PIN_OSPEED_100M(GPIOC_PIN6) | \ - PIN_OSPEED_100M(GPIOC_MCLK) | \ - PIN_OSPEED_100M(GPIOC_PIN8) | \ - PIN_OSPEED_100M(GPIOC_PIN9) | \ - PIN_OSPEED_100M(GPIOC_SCLK) | \ - PIN_OSPEED_100M(GPIOC_PIN11) | \ - PIN_OSPEED_100M(GPIOC_SDIN) | \ - PIN_OSPEED_100M(GPIOC_PIN13) | \ - PIN_OSPEED_100M(GPIOC_PIN14) | \ - PIN_OSPEED_100M(GPIOC_PIN15)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_OTG_FS_POWER_ON) |\ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PDM_OUT) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOC_MCLK) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOC_SCLK) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOC_SDIN) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN15)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_OTG_FS_POWER_ON) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PDM_OUT) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_MCLK) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_SCLK) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_SDIN) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_PIN14) | \ - PIN_ODR_HIGH(GPIOC_PIN15)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_OTG_FS_POWER_ON, 0) |\ - PIN_AFIO_AF(GPIOC_PIN1, 0) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0) | \ - PIN_AFIO_AF(GPIOC_PDM_OUT, 0) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0) | \ - PIN_AFIO_AF(GPIOC_MCLK, 6)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0) | \ - PIN_AFIO_AF(GPIOC_SCLK, 6) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0) | \ - PIN_AFIO_AF(GPIOC_SDIN, 6) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0) | \ - PIN_AFIO_AF(GPIOC_PIN14, 0) | \ - PIN_AFIO_AF(GPIOC_PIN15, 0)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - RESET (output pushpull maximum). - * PD5 - OVER_CURRENT (input floating). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input floating). - * PD12 - LED4 (output pushpull maximum). - * PD13 - LED3 (output pushpull maximum). - * PD14 - LED5 (output pushpull maximum). - * PD15 - LED6 (output pushpull maximum). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_OUTPUT(GPIOD_RESET) | \ - PIN_MODE_INPUT(GPIOD_OVER_CURRENT) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_OUTPUT(GPIOD_LED4) | \ - PIN_MODE_OUTPUT(GPIOD_LED3) | \ - PIN_MODE_OUTPUT(GPIOD_LED5) | \ - PIN_MODE_OUTPUT(GPIOD_LED6)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_RESET) | \ - PIN_OTYPE_PUSHPULL(GPIOD_OVER_CURRENT) |\ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LED4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LED3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LED5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_LED6)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_100M(GPIOD_PIN0) | \ - PIN_OSPEED_100M(GPIOD_PIN1) | \ - PIN_OSPEED_100M(GPIOD_PIN2) | \ - PIN_OSPEED_100M(GPIOD_PIN3) | \ - PIN_OSPEED_100M(GPIOD_RESET) | \ - PIN_OSPEED_100M(GPIOD_OVER_CURRENT) | \ - PIN_OSPEED_100M(GPIOD_PIN6) | \ - PIN_OSPEED_100M(GPIOD_PIN7) | \ - PIN_OSPEED_100M(GPIOD_PIN8) | \ - PIN_OSPEED_100M(GPIOD_PIN9) | \ - PIN_OSPEED_100M(GPIOD_PIN10) | \ - PIN_OSPEED_100M(GPIOD_PIN11) | \ - PIN_OSPEED_100M(GPIOD_LED4) | \ - PIN_OSPEED_100M(GPIOD_LED3) | \ - PIN_OSPEED_100M(GPIOD_LED5) | \ - PIN_OSPEED_100M(GPIOD_LED6)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOD_RESET) | \ - PIN_PUPDR_FLOATING(GPIOD_OVER_CURRENT) |\ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOD_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOD_LED4) | \ - PIN_PUPDR_FLOATING(GPIOD_LED3) | \ - PIN_PUPDR_FLOATING(GPIOD_LED5) | \ - PIN_PUPDR_FLOATING(GPIOD_LED6)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_RESET) | \ - PIN_ODR_HIGH(GPIOD_OVER_CURRENT) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_LOW(GPIOD_LED4) | \ - PIN_ODR_LOW(GPIOD_LED3) | \ - PIN_ODR_LOW(GPIOD_LED5) | \ - PIN_ODR_LOW(GPIOD_LED6)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0) | \ - PIN_AFIO_AF(GPIOD_RESET, 0) | \ - PIN_AFIO_AF(GPIOD_OVER_CURRENT, 0) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0) | \ - PIN_AFIO_AF(GPIOD_LED4, 0) | \ - PIN_AFIO_AF(GPIOD_LED3, 0) | \ - PIN_AFIO_AF(GPIOD_LED5, 0) | \ - PIN_AFIO_AF(GPIOD_LED6, 0)) - -/* - * GPIOE setup: - * - * PE0 - INT1 (input floating). - * PE1 - INT2 (input floating). - * PE2 - PIN2 (input floating). - * PE3 - CS_SPI (output pushpull maximum). - * PE4 - PIN4 (input floating). - * PE5 - PIN5 (input floating). - * PE6 - PIN6 (input floating). - * PE7 - PIN7 (input floating). - * PE8 - PIN8 (input floating). - * PE9 - PIN9 (input floating). - * PE10 - PIN10 (input floating). - * PE11 - PIN11 (input floating). - * PE12 - PIN12 (input floating). - * PE13 - PIN13 (input floating). - * PE14 - PIN14 (input floating). - * PE15 - PIN15 (input floating). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_INT1) | \ - PIN_MODE_INPUT(GPIOE_INT2) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_OUTPUT(GPIOE_CS_SPI) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_INT1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_INT2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_CS_SPI) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_100M(GPIOE_INT1) | \ - PIN_OSPEED_100M(GPIOE_INT2) | \ - PIN_OSPEED_100M(GPIOE_PIN2) | \ - PIN_OSPEED_100M(GPIOE_CS_SPI) | \ - PIN_OSPEED_100M(GPIOE_PIN4) | \ - PIN_OSPEED_100M(GPIOE_PIN5) | \ - PIN_OSPEED_100M(GPIOE_PIN6) | \ - PIN_OSPEED_100M(GPIOE_PIN7) | \ - PIN_OSPEED_100M(GPIOE_PIN8) | \ - PIN_OSPEED_100M(GPIOE_PIN9) | \ - PIN_OSPEED_100M(GPIOE_PIN10) | \ - PIN_OSPEED_100M(GPIOE_PIN11) | \ - PIN_OSPEED_100M(GPIOE_PIN12) | \ - PIN_OSPEED_100M(GPIOE_PIN13) | \ - PIN_OSPEED_100M(GPIOE_PIN14) | \ - PIN_OSPEED_100M(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_FLOATING(GPIOE_INT1) | \ - PIN_PUPDR_FLOATING(GPIOE_INT2) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOE_CS_SPI) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_INT1) | \ - PIN_ODR_HIGH(GPIOE_INT2) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_CS_SPI) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_INT1, 0) | \ - PIN_AFIO_AF(GPIOE_INT2, 0) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0) | \ - PIN_AFIO_AF(GPIOE_CS_SPI, 0) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0)) - -/* - * GPIOF setup: - * - * PF0 - PIN0 (input floating). - * PF1 - PIN1 (input floating). - * PF2 - PIN2 (input floating). - * PF3 - PIN3 (input floating). - * PF4 - PIN4 (input floating). - * PF5 - PIN5 (input floating). - * PF6 - PIN6 (input floating). - * PF7 - PIN7 (input floating). - * PF8 - PIN8 (input floating). - * PF9 - PIN9 (input floating). - * PF10 - PIN10 (input floating). - * PF11 - PIN11 (input floating). - * PF12 - PIN12 (input floating). - * PF13 - PIN13 (input floating). - * PF14 - PIN14 (input floating). - * PF15 - PIN15 (input floating). - */ -#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_PIN0) | \ - PIN_MODE_INPUT(GPIOF_PIN1) | \ - PIN_MODE_INPUT(GPIOF_PIN2) | \ - PIN_MODE_INPUT(GPIOF_PIN3) | \ - PIN_MODE_INPUT(GPIOF_PIN4) | \ - PIN_MODE_INPUT(GPIOF_PIN5) | \ - PIN_MODE_INPUT(GPIOF_PIN6) | \ - PIN_MODE_INPUT(GPIOF_PIN7) | \ - PIN_MODE_INPUT(GPIOF_PIN8) | \ - PIN_MODE_INPUT(GPIOF_PIN9) | \ - PIN_MODE_INPUT(GPIOF_PIN10) | \ - PIN_MODE_INPUT(GPIOF_PIN11) | \ - PIN_MODE_INPUT(GPIOF_PIN12) | \ - PIN_MODE_INPUT(GPIOF_PIN13) | \ - PIN_MODE_INPUT(GPIOF_PIN14) | \ - PIN_MODE_INPUT(GPIOF_PIN15)) -#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) -#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_100M(GPIOF_PIN0) | \ - PIN_OSPEED_100M(GPIOF_PIN1) | \ - PIN_OSPEED_100M(GPIOF_PIN2) | \ - PIN_OSPEED_100M(GPIOF_PIN3) | \ - PIN_OSPEED_100M(GPIOF_PIN4) | \ - PIN_OSPEED_100M(GPIOF_PIN5) | \ - PIN_OSPEED_100M(GPIOF_PIN6) | \ - PIN_OSPEED_100M(GPIOF_PIN7) | \ - PIN_OSPEED_100M(GPIOF_PIN8) | \ - PIN_OSPEED_100M(GPIOF_PIN9) | \ - PIN_OSPEED_100M(GPIOF_PIN10) | \ - PIN_OSPEED_100M(GPIOF_PIN11) | \ - PIN_OSPEED_100M(GPIOF_PIN12) | \ - PIN_OSPEED_100M(GPIOF_PIN13) | \ - PIN_OSPEED_100M(GPIOF_PIN14) | \ - PIN_OSPEED_100M(GPIOF_PIN15)) -#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOF_PIN15)) -#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ - PIN_ODR_HIGH(GPIOF_PIN1) | \ - PIN_ODR_HIGH(GPIOF_PIN2) | \ - PIN_ODR_HIGH(GPIOF_PIN3) | \ - PIN_ODR_HIGH(GPIOF_PIN4) | \ - PIN_ODR_HIGH(GPIOF_PIN5) | \ - PIN_ODR_HIGH(GPIOF_PIN6) | \ - PIN_ODR_HIGH(GPIOF_PIN7) | \ - PIN_ODR_HIGH(GPIOF_PIN8) | \ - PIN_ODR_HIGH(GPIOF_PIN9) | \ - PIN_ODR_HIGH(GPIOF_PIN10) | \ - PIN_ODR_HIGH(GPIOF_PIN11) | \ - PIN_ODR_HIGH(GPIOF_PIN12) | \ - PIN_ODR_HIGH(GPIOF_PIN13) | \ - PIN_ODR_HIGH(GPIOF_PIN14) | \ - PIN_ODR_HIGH(GPIOF_PIN15)) -#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0) | \ - PIN_AFIO_AF(GPIOF_PIN1, 0) | \ - PIN_AFIO_AF(GPIOF_PIN2, 0) | \ - PIN_AFIO_AF(GPIOF_PIN3, 0) | \ - PIN_AFIO_AF(GPIOF_PIN4, 0) | \ - PIN_AFIO_AF(GPIOF_PIN5, 0) | \ - PIN_AFIO_AF(GPIOF_PIN6, 0) | \ - PIN_AFIO_AF(GPIOF_PIN7, 0)) -#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ - PIN_AFIO_AF(GPIOF_PIN9, 0) | \ - PIN_AFIO_AF(GPIOF_PIN10, 0) | \ - PIN_AFIO_AF(GPIOF_PIN11, 0) | \ - PIN_AFIO_AF(GPIOF_PIN12, 0) | \ - PIN_AFIO_AF(GPIOF_PIN13, 0) | \ - PIN_AFIO_AF(GPIOF_PIN14, 0) | \ - PIN_AFIO_AF(GPIOF_PIN15, 0)) - -/* - * GPIOG setup: - * - * PG0 - PIN0 (input floating). - * PG1 - PIN1 (input floating). - * PG2 - PIN2 (input floating). - * PG3 - PIN3 (input floating). - * PG4 - PIN4 (input floating). - * PG5 - PIN5 (input floating). - * PG6 - PIN6 (input floating). - * PG7 - PIN7 (input floating). - * PG8 - PIN8 (input floating). - * PG9 - PIN9 (input floating). - * PG10 - PIN10 (input floating). - * PG11 - PIN11 (input floating). - * PG12 - PIN12 (input floating). - * PG13 - PIN13 (input floating). - * PG14 - PIN14 (input floating). - * PG15 - PIN15 (input floating). - */ -#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ - PIN_MODE_INPUT(GPIOG_PIN1) | \ - PIN_MODE_INPUT(GPIOG_PIN2) | \ - PIN_MODE_INPUT(GPIOG_PIN3) | \ - PIN_MODE_INPUT(GPIOG_PIN4) | \ - PIN_MODE_INPUT(GPIOG_PIN5) | \ - PIN_MODE_INPUT(GPIOG_PIN6) | \ - PIN_MODE_INPUT(GPIOG_PIN7) | \ - PIN_MODE_INPUT(GPIOG_PIN8) | \ - PIN_MODE_INPUT(GPIOG_PIN9) | \ - PIN_MODE_INPUT(GPIOG_PIN10) | \ - PIN_MODE_INPUT(GPIOG_PIN11) | \ - PIN_MODE_INPUT(GPIOG_PIN12) | \ - PIN_MODE_INPUT(GPIOG_PIN13) | \ - PIN_MODE_INPUT(GPIOG_PIN14) | \ - PIN_MODE_INPUT(GPIOG_PIN15)) -#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) -#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_100M(GPIOG_PIN0) | \ - PIN_OSPEED_100M(GPIOG_PIN1) | \ - PIN_OSPEED_100M(GPIOG_PIN2) | \ - PIN_OSPEED_100M(GPIOG_PIN3) | \ - PIN_OSPEED_100M(GPIOG_PIN4) | \ - PIN_OSPEED_100M(GPIOG_PIN5) | \ - PIN_OSPEED_100M(GPIOG_PIN6) | \ - PIN_OSPEED_100M(GPIOG_PIN7) | \ - PIN_OSPEED_100M(GPIOG_PIN8) | \ - PIN_OSPEED_100M(GPIOG_PIN9) | \ - PIN_OSPEED_100M(GPIOG_PIN10) | \ - PIN_OSPEED_100M(GPIOG_PIN11) | \ - PIN_OSPEED_100M(GPIOG_PIN12) | \ - PIN_OSPEED_100M(GPIOG_PIN13) | \ - PIN_OSPEED_100M(GPIOG_PIN14) | \ - PIN_OSPEED_100M(GPIOG_PIN15)) -#define VAL_GPIOG_PUPDR (PIN_PUPDR_FLOATING(GPIOG_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOG_PIN15)) -#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ - PIN_ODR_HIGH(GPIOG_PIN1) | \ - PIN_ODR_HIGH(GPIOG_PIN2) | \ - PIN_ODR_HIGH(GPIOG_PIN3) | \ - PIN_ODR_HIGH(GPIOG_PIN4) | \ - PIN_ODR_HIGH(GPIOG_PIN5) | \ - PIN_ODR_HIGH(GPIOG_PIN6) | \ - PIN_ODR_HIGH(GPIOG_PIN7) | \ - PIN_ODR_HIGH(GPIOG_PIN8) | \ - PIN_ODR_HIGH(GPIOG_PIN9) | \ - PIN_ODR_HIGH(GPIOG_PIN10) | \ - PIN_ODR_HIGH(GPIOG_PIN11) | \ - PIN_ODR_HIGH(GPIOG_PIN12) | \ - PIN_ODR_HIGH(GPIOG_PIN13) | \ - PIN_ODR_HIGH(GPIOG_PIN14) | \ - PIN_ODR_HIGH(GPIOG_PIN15)) -#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ - PIN_AFIO_AF(GPIOG_PIN1, 0) | \ - PIN_AFIO_AF(GPIOG_PIN2, 0) | \ - PIN_AFIO_AF(GPIOG_PIN3, 0) | \ - PIN_AFIO_AF(GPIOG_PIN4, 0) | \ - PIN_AFIO_AF(GPIOG_PIN5, 0) | \ - PIN_AFIO_AF(GPIOG_PIN6, 0) | \ - PIN_AFIO_AF(GPIOG_PIN7, 0)) -#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ - PIN_AFIO_AF(GPIOG_PIN9, 0) | \ - PIN_AFIO_AF(GPIOG_PIN10, 0) | \ - PIN_AFIO_AF(GPIOG_PIN11, 0) | \ - PIN_AFIO_AF(GPIOG_PIN12, 0) | \ - PIN_AFIO_AF(GPIOG_PIN13, 0) | \ - PIN_AFIO_AF(GPIOG_PIN14, 0) | \ - PIN_AFIO_AF(GPIOG_PIN15, 0)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (input floating). - * PH1 - OSC_OUT (input floating). - * PH2 - PIN2 (input floating). - * PH3 - PIN3 (input floating). - * PH4 - PIN4 (input floating). - * PH5 - PIN5 (input floating). - * PH6 - PIN6 (input floating). - * PH7 - PIN7 (input floating). - * PH8 - PIN8 (input floating). - * PH9 - PIN9 (input floating). - * PH10 - PIN10 (input floating). - * PH11 - PIN11 (input floating). - * PH12 - PIN12 (input floating). - * PH13 - PIN13 (input floating). - * PH14 - PIN14 (input floating). - * PH15 - PIN15 (input floating). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOH_PIN2) | \ - PIN_MODE_INPUT(GPIOH_PIN3) | \ - PIN_MODE_INPUT(GPIOH_PIN4) | \ - PIN_MODE_INPUT(GPIOH_PIN5) | \ - PIN_MODE_INPUT(GPIOH_PIN6) | \ - PIN_MODE_INPUT(GPIOH_PIN7) | \ - PIN_MODE_INPUT(GPIOH_PIN8) | \ - PIN_MODE_INPUT(GPIOH_PIN9) | \ - PIN_MODE_INPUT(GPIOH_PIN10) | \ - PIN_MODE_INPUT(GPIOH_PIN11) | \ - PIN_MODE_INPUT(GPIOH_PIN12) | \ - PIN_MODE_INPUT(GPIOH_PIN13) | \ - PIN_MODE_INPUT(GPIOH_PIN14) | \ - PIN_MODE_INPUT(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_100M(GPIOH_OSC_IN) | \ - PIN_OSPEED_100M(GPIOH_OSC_OUT) | \ - PIN_OSPEED_100M(GPIOH_PIN2) | \ - PIN_OSPEED_100M(GPIOH_PIN3) | \ - PIN_OSPEED_100M(GPIOH_PIN4) | \ - PIN_OSPEED_100M(GPIOH_PIN5) | \ - PIN_OSPEED_100M(GPIOH_PIN6) | \ - PIN_OSPEED_100M(GPIOH_PIN7) | \ - PIN_OSPEED_100M(GPIOH_PIN8) | \ - PIN_OSPEED_100M(GPIOH_PIN9) | \ - PIN_OSPEED_100M(GPIOH_PIN10) | \ - PIN_OSPEED_100M(GPIOH_PIN11) | \ - PIN_OSPEED_100M(GPIOH_PIN12) | \ - PIN_OSPEED_100M(GPIOH_PIN13) | \ - PIN_OSPEED_100M(GPIOH_PIN14) | \ - PIN_OSPEED_100M(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0)) - -/* - * GPIOI setup: - * - * PI0 - PIN0 (input floating). - * PI1 - PIN1 (input floating). - * PI2 - PIN2 (input floating). - * PI3 - PIN3 (input floating). - * PI4 - PIN4 (input floating). - * PI5 - PIN5 (input floating). - * PI6 - PIN6 (input floating). - * PI7 - PIN7 (input floating). - * PI8 - PIN8 (input floating). - * PI9 - PIN9 (input floating). - * PI10 - PIN10 (input floating). - * PI11 - PIN11 (input floating). - * PI12 - PIN12 (input floating). - * PI13 - PIN13 (input floating). - * PI14 - PIN14 (input floating). - * PI15 - PIN15 (input floating). - */ -#define VAL_GPIOI_MODER (PIN_MODE_INPUT(GPIOI_PIN0) | \ - PIN_MODE_INPUT(GPIOI_PIN1) | \ - PIN_MODE_INPUT(GPIOI_PIN2) | \ - PIN_MODE_INPUT(GPIOI_PIN3) | \ - PIN_MODE_INPUT(GPIOI_PIN4) | \ - PIN_MODE_INPUT(GPIOI_PIN5) | \ - PIN_MODE_INPUT(GPIOI_PIN6) | \ - PIN_MODE_INPUT(GPIOI_PIN7) | \ - PIN_MODE_INPUT(GPIOI_PIN8) | \ - PIN_MODE_INPUT(GPIOI_PIN9) | \ - PIN_MODE_INPUT(GPIOI_PIN10) | \ - PIN_MODE_INPUT(GPIOI_PIN11) | \ - PIN_MODE_INPUT(GPIOI_PIN12) | \ - PIN_MODE_INPUT(GPIOI_PIN13) | \ - PIN_MODE_INPUT(GPIOI_PIN14) | \ - PIN_MODE_INPUT(GPIOI_PIN15)) -#define VAL_GPIOI_OTYPER (PIN_OTYPE_PUSHPULL(GPIOI_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOI_PIN15)) -#define VAL_GPIOI_OSPEEDR (PIN_OSPEED_100M(GPIOI_PIN0) | \ - PIN_OSPEED_100M(GPIOI_PIN1) | \ - PIN_OSPEED_100M(GPIOI_PIN2) | \ - PIN_OSPEED_100M(GPIOI_PIN3) | \ - PIN_OSPEED_100M(GPIOI_PIN4) | \ - PIN_OSPEED_100M(GPIOI_PIN5) | \ - PIN_OSPEED_100M(GPIOI_PIN6) | \ - PIN_OSPEED_100M(GPIOI_PIN7) | \ - PIN_OSPEED_100M(GPIOI_PIN8) | \ - PIN_OSPEED_100M(GPIOI_PIN9) | \ - PIN_OSPEED_100M(GPIOI_PIN10) | \ - PIN_OSPEED_100M(GPIOI_PIN11) | \ - PIN_OSPEED_100M(GPIOI_PIN12) | \ - PIN_OSPEED_100M(GPIOI_PIN13) | \ - PIN_OSPEED_100M(GPIOI_PIN14) | \ - PIN_OSPEED_100M(GPIOI_PIN15)) -#define VAL_GPIOI_PUPDR (PIN_PUPDR_FLOATING(GPIOI_PIN0) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN2) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN3) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN4) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN6) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN7) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN8) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN9) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN10) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN11) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN12) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN14) | \ - PIN_PUPDR_FLOATING(GPIOI_PIN15)) -#define VAL_GPIOI_ODR (PIN_ODR_HIGH(GPIOI_PIN0) | \ - PIN_ODR_HIGH(GPIOI_PIN1) | \ - PIN_ODR_HIGH(GPIOI_PIN2) | \ - PIN_ODR_HIGH(GPIOI_PIN3) | \ - PIN_ODR_HIGH(GPIOI_PIN4) | \ - PIN_ODR_HIGH(GPIOI_PIN5) | \ - PIN_ODR_HIGH(GPIOI_PIN6) | \ - PIN_ODR_HIGH(GPIOI_PIN7) | \ - PIN_ODR_HIGH(GPIOI_PIN8) | \ - PIN_ODR_HIGH(GPIOI_PIN9) | \ - PIN_ODR_HIGH(GPIOI_PIN10) | \ - PIN_ODR_HIGH(GPIOI_PIN11) | \ - PIN_ODR_HIGH(GPIOI_PIN12) | \ - PIN_ODR_HIGH(GPIOI_PIN13) | \ - PIN_ODR_HIGH(GPIOI_PIN14) | \ - PIN_ODR_HIGH(GPIOI_PIN15)) -#define VAL_GPIOI_AFRL (PIN_AFIO_AF(GPIOI_PIN0, 0) | \ - PIN_AFIO_AF(GPIOI_PIN1, 0) | \ - PIN_AFIO_AF(GPIOI_PIN2, 0) | \ - PIN_AFIO_AF(GPIOI_PIN3, 0) | \ - PIN_AFIO_AF(GPIOI_PIN4, 0) | \ - PIN_AFIO_AF(GPIOI_PIN5, 0) | \ - PIN_AFIO_AF(GPIOI_PIN6, 0) | \ - PIN_AFIO_AF(GPIOI_PIN7, 0)) -#define VAL_GPIOI_AFRH (PIN_AFIO_AF(GPIOI_PIN8, 0) | \ - PIN_AFIO_AF(GPIOI_PIN9, 0) | \ - PIN_AFIO_AF(GPIOI_PIN10, 0) | \ - PIN_AFIO_AF(GPIOI_PIN11, 0) | \ - PIN_AFIO_AF(GPIOI_PIN12, 0) | \ - PIN_AFIO_AF(GPIOI_PIN13, 0) | \ - PIN_AFIO_AF(GPIOI_PIN14, 0) | \ - PIN_AFIO_AF(GPIOI_PIN15, 0)) - - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM32F4_DISCOVERY/board.mk b/boards/ST_STM32F4_DISCOVERY/board.mk deleted file mode 100644 index eb47aa2afd..0000000000 --- a/boards/ST_STM32F4_DISCOVERY/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM32F4_DISCOVERY/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM32F4_DISCOVERY diff --git a/boards/ST_STM32F4_DISCOVERY/cfg/board.chcfg b/boards/ST_STM32F4_DISCOVERY/cfg/board.chcfg deleted file mode 100644 index 68d30e27d2..0000000000 --- a/boards/ST_STM32F4_DISCOVERY/cfg/board.chcfg +++ /dev/null @@ -1,1186 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32f4xx/templates - .. - - STMicroelectronics STM32F4-Discovery - ST_STM32F4_DISCOVERY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/boards/ST_STM32L_DISCOVERY/board.c b/boards/ST_STM32L_DISCOVERY/board.c deleted file mode 100644 index 2148fa7547..0000000000 --- a/boards/ST_STM32L_DISCOVERY/board.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return TRUE; -} - -/** - * @brief SDC card write protection detection. - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return FALSE; -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/boards/ST_STM32L_DISCOVERY/board.h b/boards/ST_STM32L_DISCOVERY/board.h deleted file mode 100644 index 7ff3022dda..0000000000 --- a/boards/ST_STM32L_DISCOVERY/board.h +++ /dev/null @@ -1,894 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for ST STM32L-Discovery board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_STM32L_DISCOVERY -#define BOARD_NAME "ST STM32L-Discovery" - - -/* - * Board oscillators-related settings. - * NOTE: HSE not fitted. - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK 32768 -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK 0 -#endif - -#define STM32_HSE_BYPASS - -/* - * MCU type as defined in the ST header file stm32l1xx.h. - */ -#define STM32L1XX_MD - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON 0 -#define GPIOA_PIN1 1 -#define GPIOA_PIN2 2 -#define GPIOA_PIN3 3 -#define GPIOA_PIN4 4 -#define GPIOA_PIN5 5 -#define GPIOA_PIN6 6 -#define GPIOA_PIN7 7 -#define GPIOA_PIN8 8 -#define GPIOA_PIN9 9 -#define GPIOA_PIN10 10 -#define GPIOA_PIN11 11 -#define GPIOA_PIN12 12 -#define GPIOA_JTAG_TMS 13 -#define GPIOA_JTAG_TCK 14 -#define GPIOA_JTAG_TDI 15 - -#define GPIOB_PIN0 0 -#define GPIOB_PIN1 1 -#define GPIOB_BOOT1 2 -#define GPIOB_JTAG_TDO 3 -#define GPIOB_JTAG_TRST 4 -#define GPIOB_PIN5 5 -#define GPIOB_LED4 6 -#define GPIOB_LED3 7 -#define GPIOB_PIN8 8 -#define GPIOB_PIN9 9 -#define GPIOB_PIN10 10 -#define GPIOB_PIN11 11 -#define GPIOB_PIN12 12 -#define GPIOB_PIN13 13 -#define GPIOB_PIN14 14 -#define GPIOB_PIN15 15 - -#define GPIOC_PIN0 0 -#define GPIOC_PIN1 1 -#define GPIOC_PIN2 2 -#define GPIOC_PIN3 3 -#define GPIOC_PIN4 4 -#define GPIOC_PIN5 5 -#define GPIOC_PIN6 6 -#define GPIOC_PIN7 7 -#define GPIOC_PIN8 8 -#define GPIOC_PIN9 9 -#define GPIOC_PIN10 10 -#define GPIOC_PIN11 11 -#define GPIOC_PIN12 12 -#define GPIOC_PIN13 13 -#define GPIOC_OSC32_IN 14 -#define GPIOC_OSC32_OUT 15 - -#define GPIOD_PIN0 0 -#define GPIOD_PIN1 1 -#define GPIOD_PIN2 2 -#define GPIOD_PIN3 3 -#define GPIOD_PIN4 4 -#define GPIOD_PIN5 5 -#define GPIOD_PIN6 6 -#define GPIOD_PIN7 7 -#define GPIOD_PIN8 8 -#define GPIOD_PIN9 9 -#define GPIOD_PIN10 10 -#define GPIOD_PIN11 11 -#define GPIOD_PIN12 12 -#define GPIOD_PIN13 13 -#define GPIOD_PIN14 14 -#define GPIOD_PIN15 15 - -#define GPIOE_PIN0 0 -#define GPIOE_PIN1 1 -#define GPIOE_PIN2 2 -#define GPIOE_PIN3 3 -#define GPIOE_PIN4 4 -#define GPIOE_PIN5 5 -#define GPIOE_PIN6 6 -#define GPIOE_PIN7 7 -#define GPIOE_PIN8 8 -#define GPIOE_PIN9 9 -#define GPIOE_PIN10 10 -#define GPIOE_PIN11 11 -#define GPIOE_PIN12 12 -#define GPIOE_PIN13 13 -#define GPIOE_PIN14 14 -#define GPIOE_PIN15 15 - -#define GPIOH_OSC_IN 0 -#define GPIOH_OSC_OUT 1 -#define GPIOH_PIN2 2 -#define GPIOH_PIN3 3 -#define GPIOH_PIN4 4 -#define GPIOH_PIN5 5 -#define GPIOH_PIN6 6 -#define GPIOH_PIN7 7 -#define GPIOH_PIN8 8 -#define GPIOH_PIN9 9 -#define GPIOH_PIN10 10 -#define GPIOH_PIN11 11 -#define GPIOH_PIN12 12 -#define GPIOH_PIN13 13 -#define GPIOH_PIN14 14 -#define GPIOH_PIN15 15 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_400K(n) (0U << ((n) * 2)) -#define PIN_OSPEED_2M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_10M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_40M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -/* - * GPIOA setup: - * - * PA0 - BUTTON (input floating). - * PA1 - PIN1 (input pullup). - * PA2 - PIN2 (input pullup). - * PA3 - PIN3 (input pullup). - * PA4 - PIN4 (input pullup). - * PA5 - PIN5 (input pullup). - * PA6 - PIN6 (input pullup). - * PA7 - PIN7 (input pullup). - * PA8 - PIN8 (input pullup). - * PA9 - PIN9 (input pullup). - * PA10 - PIN10 (input pullup). - * PA11 - PIN11 (input pullup). - * PA12 - PIN12 (input pullup). - * PA13 - JTAG_TMS (alternate 0). - * PA14 - JTAG_TCK (alternate 0). - * PA15 - JTAG_TDI (alternate 0). - */ -#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \ - PIN_MODE_INPUT(GPIOA_PIN1) | \ - PIN_MODE_INPUT(GPIOA_PIN2) | \ - PIN_MODE_INPUT(GPIOA_PIN3) | \ - PIN_MODE_INPUT(GPIOA_PIN4) | \ - PIN_MODE_INPUT(GPIOA_PIN5) | \ - PIN_MODE_INPUT(GPIOA_PIN6) | \ - PIN_MODE_INPUT(GPIOA_PIN7) | \ - PIN_MODE_INPUT(GPIOA_PIN8) | \ - PIN_MODE_INPUT(GPIOA_PIN9) | \ - PIN_MODE_INPUT(GPIOA_PIN10) | \ - PIN_MODE_INPUT(GPIOA_PIN11) | \ - PIN_MODE_INPUT(GPIOA_PIN12) | \ - PIN_MODE_ALTERNATE(GPIOA_JTAG_TMS) | \ - PIN_MODE_ALTERNATE(GPIOA_JTAG_TCK) | \ - PIN_MODE_ALTERNATE(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOA_JTAG_TMS) | \ - PIN_OTYPE_PUSHPULL(GPIOA_JTAG_TCK) | \ - PIN_OTYPE_PUSHPULL(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_400K(GPIOA_BUTTON) | \ - PIN_OSPEED_400K(GPIOA_PIN1) | \ - PIN_OSPEED_400K(GPIOA_PIN2) | \ - PIN_OSPEED_400K(GPIOA_PIN3) | \ - PIN_OSPEED_400K(GPIOA_PIN4) | \ - PIN_OSPEED_400K(GPIOA_PIN5) | \ - PIN_OSPEED_400K(GPIOA_PIN6) | \ - PIN_OSPEED_400K(GPIOA_PIN7) | \ - PIN_OSPEED_400K(GPIOA_PIN8) | \ - PIN_OSPEED_400K(GPIOA_PIN9) | \ - PIN_OSPEED_400K(GPIOA_PIN10) | \ - PIN_OSPEED_400K(GPIOA_PIN11) | \ - PIN_OSPEED_400K(GPIOA_PIN12) | \ - PIN_OSPEED_40M(GPIOA_JTAG_TMS) | \ - PIN_OSPEED_40M(GPIOA_JTAG_TCK) | \ - PIN_OSPEED_40M(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOA_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOA_JTAG_TMS) | \ - PIN_PUPDR_PULLDOWN(GPIOA_JTAG_TCK) | \ - PIN_PUPDR_PULLUP(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \ - PIN_ODR_HIGH(GPIOA_PIN1) | \ - PIN_ODR_HIGH(GPIOA_PIN2) | \ - PIN_ODR_HIGH(GPIOA_PIN3) | \ - PIN_ODR_HIGH(GPIOA_PIN4) | \ - PIN_ODR_HIGH(GPIOA_PIN5) | \ - PIN_ODR_HIGH(GPIOA_PIN6) | \ - PIN_ODR_HIGH(GPIOA_PIN7) | \ - PIN_ODR_HIGH(GPIOA_PIN8) | \ - PIN_ODR_HIGH(GPIOA_PIN9) | \ - PIN_ODR_HIGH(GPIOA_PIN10) | \ - PIN_ODR_HIGH(GPIOA_PIN11) | \ - PIN_ODR_HIGH(GPIOA_PIN12) | \ - PIN_ODR_HIGH(GPIOA_JTAG_TMS) | \ - PIN_ODR_HIGH(GPIOA_JTAG_TCK) | \ - PIN_ODR_HIGH(GPIOA_JTAG_TDI)) -#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0) | \ - PIN_AFIO_AF(GPIOA_PIN1, 0) | \ - PIN_AFIO_AF(GPIOA_PIN2, 0) | \ - PIN_AFIO_AF(GPIOA_PIN3, 0) | \ - PIN_AFIO_AF(GPIOA_PIN4, 0) | \ - PIN_AFIO_AF(GPIOA_PIN5, 0) | \ - PIN_AFIO_AF(GPIOA_PIN6, 0) | \ - PIN_AFIO_AF(GPIOA_PIN7, 0)) -#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ - PIN_AFIO_AF(GPIOA_PIN9, 0) | \ - PIN_AFIO_AF(GPIOA_PIN10, 0) | \ - PIN_AFIO_AF(GPIOA_PIN11, 0) | \ - PIN_AFIO_AF(GPIOA_PIN12, 0) | \ - PIN_AFIO_AF(GPIOA_JTAG_TMS, 0) | \ - PIN_AFIO_AF(GPIOA_JTAG_TCK, 0) | \ - PIN_AFIO_AF(GPIOA_JTAG_TDI, 0)) - -/* - * GPIOB setup: - * - * PB0 - PIN0 (input pullup). - * PB1 - PIN1 (input pullup). - * PB2 - BOOT1 (input floating). - * PB3 - JTAG_TDO (alternate 0). - * PB4 - JTAG_TRST (alternate 0). - * PB5 - PIN5 (input pullup). - * PB6 - LED4 (output pushpull maximum). - * PB7 - LED3 (output pushpull maximum). - * PB8 - PIN8 (input pullup). - * PB9 - PIN9 (input pullup). - * PB10 - PIN10 (input pullup). - * PB11 - PIN11 (input pullup). - * PB12 - PIN12 (input pullup). - * PB13 - PIN13 (input pullup). - * PB14 - PIN14 (input pullup). - * PB15 - PIN15 (input pullup). - */ -#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ - PIN_MODE_INPUT(GPIOB_PIN1) | \ - PIN_MODE_INPUT(GPIOB_BOOT1) | \ - PIN_MODE_ALTERNATE(GPIOB_JTAG_TDO) | \ - PIN_MODE_ALTERNATE(GPIOB_JTAG_TRST) | \ - PIN_MODE_INPUT(GPIOB_PIN5) | \ - PIN_MODE_OUTPUT(GPIOB_LED4) | \ - PIN_MODE_OUTPUT(GPIOB_LED3) | \ - PIN_MODE_INPUT(GPIOB_PIN8) | \ - PIN_MODE_INPUT(GPIOB_PIN9) | \ - PIN_MODE_INPUT(GPIOB_PIN10) | \ - PIN_MODE_INPUT(GPIOB_PIN11) | \ - PIN_MODE_INPUT(GPIOB_PIN12) | \ - PIN_MODE_INPUT(GPIOB_PIN13) | \ - PIN_MODE_INPUT(GPIOB_PIN14) | \ - PIN_MODE_INPUT(GPIOB_PIN15)) -#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_BOOT1) | \ - PIN_OTYPE_PUSHPULL(GPIOB_JTAG_TDO) | \ - PIN_OTYPE_PUSHPULL(GPIOB_JTAG_TRST) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LED4) | \ - PIN_OTYPE_PUSHPULL(GPIOB_LED3) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) -#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_400K(GPIOB_PIN0) | \ - PIN_OSPEED_400K(GPIOB_PIN1) | \ - PIN_OSPEED_40M(GPIOB_BOOT1) | \ - PIN_OSPEED_40M(GPIOB_JTAG_TDO) | \ - PIN_OSPEED_40M(GPIOB_JTAG_TRST) | \ - PIN_OSPEED_400K(GPIOB_PIN5) | \ - PIN_OSPEED_40M(GPIOB_LED4) | \ - PIN_OSPEED_40M(GPIOB_LED3) | \ - PIN_OSPEED_400K(GPIOB_PIN8) | \ - PIN_OSPEED_400K(GPIOB_PIN9) | \ - PIN_OSPEED_400K(GPIOB_PIN10) | \ - PIN_OSPEED_400K(GPIOB_PIN11) | \ - PIN_OSPEED_400K(GPIOB_PIN12) | \ - PIN_OSPEED_400K(GPIOB_PIN13) | \ - PIN_OSPEED_400K(GPIOB_PIN14) | \ - PIN_OSPEED_400K(GPIOB_PIN15)) -#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ - PIN_PUPDR_FLOATING(GPIOB_BOOT1) | \ - PIN_PUPDR_FLOATING(GPIOB_JTAG_TDO) | \ - PIN_PUPDR_PULLUP(GPIOB_JTAG_TRST) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ - PIN_PUPDR_FLOATING(GPIOB_LED4) | \ - PIN_PUPDR_FLOATING(GPIOB_LED3) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOB_PIN15)) -#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ - PIN_ODR_HIGH(GPIOB_PIN1) | \ - PIN_ODR_HIGH(GPIOB_BOOT1) | \ - PIN_ODR_HIGH(GPIOB_JTAG_TDO) | \ - PIN_ODR_HIGH(GPIOB_JTAG_TRST) | \ - PIN_ODR_HIGH(GPIOB_PIN5) | \ - PIN_ODR_LOW(GPIOB_LED4) | \ - PIN_ODR_LOW(GPIOB_LED3) | \ - PIN_ODR_HIGH(GPIOB_PIN8) | \ - PIN_ODR_HIGH(GPIOB_PIN9) | \ - PIN_ODR_HIGH(GPIOB_PIN10) | \ - PIN_ODR_HIGH(GPIOB_PIN11) | \ - PIN_ODR_HIGH(GPIOB_PIN12) | \ - PIN_ODR_HIGH(GPIOB_PIN13) | \ - PIN_ODR_HIGH(GPIOB_PIN14) | \ - PIN_ODR_HIGH(GPIOB_PIN15)) -#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ - PIN_AFIO_AF(GPIOB_PIN1, 0) | \ - PIN_AFIO_AF(GPIOB_BOOT1, 0) | \ - PIN_AFIO_AF(GPIOB_JTAG_TDO, 0) | \ - PIN_AFIO_AF(GPIOB_JTAG_TRST, 0) | \ - PIN_AFIO_AF(GPIOB_PIN5, 0) | \ - PIN_AFIO_AF(GPIOB_LED4, 0) | \ - PIN_AFIO_AF(GPIOB_LED3, 0)) -#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ - PIN_AFIO_AF(GPIOB_PIN9, 0) | \ - PIN_AFIO_AF(GPIOB_PIN10, 0) | \ - PIN_AFIO_AF(GPIOB_PIN11, 0) | \ - PIN_AFIO_AF(GPIOB_PIN12, 0) | \ - PIN_AFIO_AF(GPIOB_PIN13, 0) | \ - PIN_AFIO_AF(GPIOB_PIN14, 0) | \ - PIN_AFIO_AF(GPIOB_PIN15, 0)) - -/* - * GPIOC setup: - * - * PC0 - PIN0 (input pullup). - * PC1 - PIN1 (input pullup). - * PC2 - PIN2 (input pullup). - * PC3 - PIN3 (input pullup). - * PC4 - PIN4 (input pullup). - * PC5 - PIN5 (input pullup). - * PC6 - PIN6 (input pullup). - * PC7 - PIN7 (input pullup). - * PC8 - PIN8 (input pullup). - * PC9 - PIN9 (input pullup). - * PC10 - PIN10 (input pullup). - * PC11 - PIN11 (input pullup). - * PC12 - PIN12 (input pullup). - * PC13 - PIN13 (input pullup). - * PC14 - OSC32_IN (input floating). - * PC15 - OSC32_OUT (input floating). - */ -#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ - PIN_MODE_INPUT(GPIOC_PIN1) | \ - PIN_MODE_INPUT(GPIOC_PIN2) | \ - PIN_MODE_INPUT(GPIOC_PIN3) | \ - PIN_MODE_INPUT(GPIOC_PIN4) | \ - PIN_MODE_INPUT(GPIOC_PIN5) | \ - PIN_MODE_INPUT(GPIOC_PIN6) | \ - PIN_MODE_INPUT(GPIOC_PIN7) | \ - PIN_MODE_INPUT(GPIOC_PIN8) | \ - PIN_MODE_INPUT(GPIOC_PIN9) | \ - PIN_MODE_INPUT(GPIOC_PIN10) | \ - PIN_MODE_INPUT(GPIOC_PIN11) | \ - PIN_MODE_INPUT(GPIOC_PIN12) | \ - PIN_MODE_INPUT(GPIOC_PIN13) | \ - PIN_MODE_INPUT(GPIOC_OSC32_IN) | \ - PIN_MODE_INPUT(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_400K(GPIOC_PIN0) | \ - PIN_OSPEED_400K(GPIOC_PIN1) | \ - PIN_OSPEED_400K(GPIOC_PIN2) | \ - PIN_OSPEED_400K(GPIOC_PIN3) | \ - PIN_OSPEED_400K(GPIOC_PIN4) | \ - PIN_OSPEED_400K(GPIOC_PIN5) | \ - PIN_OSPEED_400K(GPIOC_PIN6) | \ - PIN_OSPEED_400K(GPIOC_PIN7) | \ - PIN_OSPEED_400K(GPIOC_PIN8) | \ - PIN_OSPEED_400K(GPIOC_PIN9) | \ - PIN_OSPEED_400K(GPIOC_PIN10) | \ - PIN_OSPEED_400K(GPIOC_PIN11) | \ - PIN_OSPEED_400K(GPIOC_PIN12) | \ - PIN_OSPEED_400K(GPIOC_PIN13) | \ - PIN_OSPEED_40M(GPIOC_OSC32_IN) | \ - PIN_OSPEED_40M(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \ - PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ - PIN_ODR_HIGH(GPIOC_PIN1) | \ - PIN_ODR_HIGH(GPIOC_PIN2) | \ - PIN_ODR_HIGH(GPIOC_PIN3) | \ - PIN_ODR_HIGH(GPIOC_PIN4) | \ - PIN_ODR_HIGH(GPIOC_PIN5) | \ - PIN_ODR_HIGH(GPIOC_PIN6) | \ - PIN_ODR_HIGH(GPIOC_PIN7) | \ - PIN_ODR_HIGH(GPIOC_PIN8) | \ - PIN_ODR_HIGH(GPIOC_PIN9) | \ - PIN_ODR_HIGH(GPIOC_PIN10) | \ - PIN_ODR_HIGH(GPIOC_PIN11) | \ - PIN_ODR_HIGH(GPIOC_PIN12) | \ - PIN_ODR_HIGH(GPIOC_PIN13) | \ - PIN_ODR_HIGH(GPIOC_OSC32_IN) | \ - PIN_ODR_HIGH(GPIOC_OSC32_OUT)) -#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ - PIN_AFIO_AF(GPIOC_PIN1, 0) | \ - PIN_AFIO_AF(GPIOC_PIN2, 0) | \ - PIN_AFIO_AF(GPIOC_PIN3, 0) | \ - PIN_AFIO_AF(GPIOC_PIN4, 0) | \ - PIN_AFIO_AF(GPIOC_PIN5, 0) | \ - PIN_AFIO_AF(GPIOC_PIN6, 0) | \ - PIN_AFIO_AF(GPIOC_PIN7, 0)) -#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ - PIN_AFIO_AF(GPIOC_PIN9, 0) | \ - PIN_AFIO_AF(GPIOC_PIN10, 0) | \ - PIN_AFIO_AF(GPIOC_PIN11, 0) | \ - PIN_AFIO_AF(GPIOC_PIN12, 0) | \ - PIN_AFIO_AF(GPIOC_PIN13, 0) | \ - PIN_AFIO_AF(GPIOC_OSC32_IN, 0) | \ - PIN_AFIO_AF(GPIOC_OSC32_OUT, 0)) - -/* - * GPIOD setup: - * - * PD0 - PIN0 (input pullup). - * PD1 - PIN1 (input pullup). - * PD2 - PIN2 (input pullup). - * PD3 - PIN3 (input pullup). - * PD4 - PIN4 (input pullup). - * PD5 - PIN5 (input pullup). - * PD6 - PIN6 (input pullup). - * PD7 - PIN7 (input pullup). - * PD8 - PIN8 (input pullup). - * PD9 - PIN9 (input pullup). - * PD10 - PIN10 (input pullup). - * PD11 - PIN11 (input pullup). - * PD12 - PIN12 (input pullup). - * PD13 - PIN13 (input pullup). - * PD14 - PIN14 (input pullup). - * PD15 - PIN15 (input pullup). - */ -#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ - PIN_MODE_INPUT(GPIOD_PIN1) | \ - PIN_MODE_INPUT(GPIOD_PIN2) | \ - PIN_MODE_INPUT(GPIOD_PIN3) | \ - PIN_MODE_INPUT(GPIOD_PIN4) | \ - PIN_MODE_INPUT(GPIOD_PIN5) | \ - PIN_MODE_INPUT(GPIOD_PIN6) | \ - PIN_MODE_INPUT(GPIOD_PIN7) | \ - PIN_MODE_INPUT(GPIOD_PIN8) | \ - PIN_MODE_INPUT(GPIOD_PIN9) | \ - PIN_MODE_INPUT(GPIOD_PIN10) | \ - PIN_MODE_INPUT(GPIOD_PIN11) | \ - PIN_MODE_INPUT(GPIOD_PIN12) | \ - PIN_MODE_INPUT(GPIOD_PIN13) | \ - PIN_MODE_INPUT(GPIOD_PIN14) | \ - PIN_MODE_INPUT(GPIOD_PIN15)) -#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) -#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_400K(GPIOD_PIN0) | \ - PIN_OSPEED_400K(GPIOD_PIN1) | \ - PIN_OSPEED_400K(GPIOD_PIN2) | \ - PIN_OSPEED_400K(GPIOD_PIN3) | \ - PIN_OSPEED_400K(GPIOD_PIN4) | \ - PIN_OSPEED_400K(GPIOD_PIN5) | \ - PIN_OSPEED_400K(GPIOD_PIN6) | \ - PIN_OSPEED_400K(GPIOD_PIN7) | \ - PIN_OSPEED_400K(GPIOD_PIN8) | \ - PIN_OSPEED_400K(GPIOD_PIN9) | \ - PIN_OSPEED_400K(GPIOD_PIN10) | \ - PIN_OSPEED_400K(GPIOD_PIN11) | \ - PIN_OSPEED_400K(GPIOD_PIN12) | \ - PIN_OSPEED_400K(GPIOD_PIN13) | \ - PIN_OSPEED_400K(GPIOD_PIN14) | \ - PIN_OSPEED_400K(GPIOD_PIN15)) -#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOD_PIN15)) -#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ - PIN_ODR_HIGH(GPIOD_PIN1) | \ - PIN_ODR_HIGH(GPIOD_PIN2) | \ - PIN_ODR_HIGH(GPIOD_PIN3) | \ - PIN_ODR_HIGH(GPIOD_PIN4) | \ - PIN_ODR_HIGH(GPIOD_PIN5) | \ - PIN_ODR_HIGH(GPIOD_PIN6) | \ - PIN_ODR_HIGH(GPIOD_PIN7) | \ - PIN_ODR_HIGH(GPIOD_PIN8) | \ - PIN_ODR_HIGH(GPIOD_PIN9) | \ - PIN_ODR_HIGH(GPIOD_PIN10) | \ - PIN_ODR_HIGH(GPIOD_PIN11) | \ - PIN_ODR_HIGH(GPIOD_PIN12) | \ - PIN_ODR_HIGH(GPIOD_PIN13) | \ - PIN_ODR_HIGH(GPIOD_PIN14) | \ - PIN_ODR_HIGH(GPIOD_PIN15)) -#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ - PIN_AFIO_AF(GPIOD_PIN1, 0) | \ - PIN_AFIO_AF(GPIOD_PIN2, 0) | \ - PIN_AFIO_AF(GPIOD_PIN3, 0) | \ - PIN_AFIO_AF(GPIOD_PIN4, 0) | \ - PIN_AFIO_AF(GPIOD_PIN5, 0) | \ - PIN_AFIO_AF(GPIOD_PIN6, 0) | \ - PIN_AFIO_AF(GPIOD_PIN7, 0)) -#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ - PIN_AFIO_AF(GPIOD_PIN9, 0) | \ - PIN_AFIO_AF(GPIOD_PIN10, 0) | \ - PIN_AFIO_AF(GPIOD_PIN11, 0) | \ - PIN_AFIO_AF(GPIOD_PIN12, 0) | \ - PIN_AFIO_AF(GPIOD_PIN13, 0) | \ - PIN_AFIO_AF(GPIOD_PIN14, 0) | \ - PIN_AFIO_AF(GPIOD_PIN15, 0)) - -/* - * GPIOE setup: - * - * PE0 - PIN0 (input pullup). - * PE1 - PIN1 (input pullup). - * PE2 - PIN2 (input pullup). - * PE3 - PIN3 (input pullup). - * PE4 - PIN4 (input pullup). - * PE5 - PIN5 (input pullup). - * PE6 - PIN6 (input pullup). - * PE7 - PIN7 (input pullup). - * PE8 - PIN8 (input pullup). - * PE9 - PIN9 (input pullup). - * PE10 - PIN10 (input pullup). - * PE11 - PIN11 (input pullup). - * PE12 - PIN12 (input pullup). - * PE13 - PIN13 (input pullup). - * PE14 - PIN14 (input pullup). - * PE15 - PIN15 (input pullup). - */ -#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ - PIN_MODE_INPUT(GPIOE_PIN1) | \ - PIN_MODE_INPUT(GPIOE_PIN2) | \ - PIN_MODE_INPUT(GPIOE_PIN3) | \ - PIN_MODE_INPUT(GPIOE_PIN4) | \ - PIN_MODE_INPUT(GPIOE_PIN5) | \ - PIN_MODE_INPUT(GPIOE_PIN6) | \ - PIN_MODE_INPUT(GPIOE_PIN7) | \ - PIN_MODE_INPUT(GPIOE_PIN8) | \ - PIN_MODE_INPUT(GPIOE_PIN9) | \ - PIN_MODE_INPUT(GPIOE_PIN10) | \ - PIN_MODE_INPUT(GPIOE_PIN11) | \ - PIN_MODE_INPUT(GPIOE_PIN12) | \ - PIN_MODE_INPUT(GPIOE_PIN13) | \ - PIN_MODE_INPUT(GPIOE_PIN14) | \ - PIN_MODE_INPUT(GPIOE_PIN15)) -#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) -#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_400K(GPIOE_PIN0) | \ - PIN_OSPEED_400K(GPIOE_PIN1) | \ - PIN_OSPEED_400K(GPIOE_PIN2) | \ - PIN_OSPEED_400K(GPIOE_PIN3) | \ - PIN_OSPEED_400K(GPIOE_PIN4) | \ - PIN_OSPEED_400K(GPIOE_PIN5) | \ - PIN_OSPEED_400K(GPIOE_PIN6) | \ - PIN_OSPEED_400K(GPIOE_PIN7) | \ - PIN_OSPEED_400K(GPIOE_PIN8) | \ - PIN_OSPEED_400K(GPIOE_PIN9) | \ - PIN_OSPEED_400K(GPIOE_PIN10) | \ - PIN_OSPEED_400K(GPIOE_PIN11) | \ - PIN_OSPEED_400K(GPIOE_PIN12) | \ - PIN_OSPEED_400K(GPIOE_PIN13) | \ - PIN_OSPEED_400K(GPIOE_PIN14) | \ - PIN_OSPEED_400K(GPIOE_PIN15)) -#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOE_PIN15)) -#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ - PIN_ODR_HIGH(GPIOE_PIN1) | \ - PIN_ODR_HIGH(GPIOE_PIN2) | \ - PIN_ODR_HIGH(GPIOE_PIN3) | \ - PIN_ODR_HIGH(GPIOE_PIN4) | \ - PIN_ODR_HIGH(GPIOE_PIN5) | \ - PIN_ODR_HIGH(GPIOE_PIN6) | \ - PIN_ODR_HIGH(GPIOE_PIN7) | \ - PIN_ODR_HIGH(GPIOE_PIN8) | \ - PIN_ODR_HIGH(GPIOE_PIN9) | \ - PIN_ODR_HIGH(GPIOE_PIN10) | \ - PIN_ODR_HIGH(GPIOE_PIN11) | \ - PIN_ODR_HIGH(GPIOE_PIN12) | \ - PIN_ODR_HIGH(GPIOE_PIN13) | \ - PIN_ODR_HIGH(GPIOE_PIN14) | \ - PIN_ODR_HIGH(GPIOE_PIN15)) -#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ - PIN_AFIO_AF(GPIOE_PIN1, 0) | \ - PIN_AFIO_AF(GPIOE_PIN2, 0) | \ - PIN_AFIO_AF(GPIOE_PIN3, 0) | \ - PIN_AFIO_AF(GPIOE_PIN4, 0) | \ - PIN_AFIO_AF(GPIOE_PIN5, 0) | \ - PIN_AFIO_AF(GPIOE_PIN6, 0) | \ - PIN_AFIO_AF(GPIOE_PIN7, 0)) -#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ - PIN_AFIO_AF(GPIOE_PIN9, 0) | \ - PIN_AFIO_AF(GPIOE_PIN10, 0) | \ - PIN_AFIO_AF(GPIOE_PIN11, 0) | \ - PIN_AFIO_AF(GPIOE_PIN12, 0) | \ - PIN_AFIO_AF(GPIOE_PIN13, 0) | \ - PIN_AFIO_AF(GPIOE_PIN14, 0) | \ - PIN_AFIO_AF(GPIOE_PIN15, 0)) - -/* - * GPIOH setup: - * - * PH0 - OSC_IN (input floating). - * PH1 - OSC_OUT (input floating). - * PH2 - PIN2 (input pullup). - * PH3 - PIN3 (input pullup). - * PH4 - PIN4 (input pullup). - * PH5 - PIN5 (input pullup). - * PH6 - PIN6 (input pullup). - * PH7 - PIN7 (input pullup). - * PH8 - PIN8 (input pullup). - * PH9 - PIN9 (input pullup). - * PH10 - PIN10 (input pullup). - * PH11 - PIN11 (input pullup). - * PH12 - PIN12 (input pullup). - * PH13 - PIN13 (input pullup). - * PH14 - PIN14 (input pullup). - * PH15 - PIN15 (input pullup). - */ -#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_OSC_IN) | \ - PIN_MODE_INPUT(GPIOH_OSC_OUT) | \ - PIN_MODE_INPUT(GPIOH_PIN2) | \ - PIN_MODE_INPUT(GPIOH_PIN3) | \ - PIN_MODE_INPUT(GPIOH_PIN4) | \ - PIN_MODE_INPUT(GPIOH_PIN5) | \ - PIN_MODE_INPUT(GPIOH_PIN6) | \ - PIN_MODE_INPUT(GPIOH_PIN7) | \ - PIN_MODE_INPUT(GPIOH_PIN8) | \ - PIN_MODE_INPUT(GPIOH_PIN9) | \ - PIN_MODE_INPUT(GPIOH_PIN10) | \ - PIN_MODE_INPUT(GPIOH_PIN11) | \ - PIN_MODE_INPUT(GPIOH_PIN12) | \ - PIN_MODE_INPUT(GPIOH_PIN13) | \ - PIN_MODE_INPUT(GPIOH_PIN14) | \ - PIN_MODE_INPUT(GPIOH_PIN15)) -#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) | \ - PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ - PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) -#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_40M(GPIOH_OSC_IN) | \ - PIN_OSPEED_40M(GPIOH_OSC_OUT) | \ - PIN_OSPEED_400K(GPIOH_PIN2) | \ - PIN_OSPEED_400K(GPIOH_PIN3) | \ - PIN_OSPEED_400K(GPIOH_PIN4) | \ - PIN_OSPEED_400K(GPIOH_PIN5) | \ - PIN_OSPEED_400K(GPIOH_PIN6) | \ - PIN_OSPEED_400K(GPIOH_PIN7) | \ - PIN_OSPEED_400K(GPIOH_PIN8) | \ - PIN_OSPEED_400K(GPIOH_PIN9) | \ - PIN_OSPEED_400K(GPIOH_PIN10) | \ - PIN_OSPEED_400K(GPIOH_PIN11) | \ - PIN_OSPEED_400K(GPIOH_PIN12) | \ - PIN_OSPEED_400K(GPIOH_PIN13) | \ - PIN_OSPEED_400K(GPIOH_PIN14) | \ - PIN_OSPEED_400K(GPIOH_PIN15)) -#define VAL_GPIOH_PUPDR (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) | \ - PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ - PIN_PUPDR_PULLUP(GPIOH_PIN15)) -#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_OSC_IN) | \ - PIN_ODR_HIGH(GPIOH_OSC_OUT) | \ - PIN_ODR_HIGH(GPIOH_PIN2) | \ - PIN_ODR_HIGH(GPIOH_PIN3) | \ - PIN_ODR_HIGH(GPIOH_PIN4) | \ - PIN_ODR_HIGH(GPIOH_PIN5) | \ - PIN_ODR_HIGH(GPIOH_PIN6) | \ - PIN_ODR_HIGH(GPIOH_PIN7) | \ - PIN_ODR_HIGH(GPIOH_PIN8) | \ - PIN_ODR_HIGH(GPIOH_PIN9) | \ - PIN_ODR_HIGH(GPIOH_PIN10) | \ - PIN_ODR_HIGH(GPIOH_PIN11) | \ - PIN_ODR_HIGH(GPIOH_PIN12) | \ - PIN_ODR_HIGH(GPIOH_PIN13) | \ - PIN_ODR_HIGH(GPIOH_PIN14) | \ - PIN_ODR_HIGH(GPIOH_PIN15)) -#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_OSC_IN, 0) | \ - PIN_AFIO_AF(GPIOH_OSC_OUT, 0) | \ - PIN_AFIO_AF(GPIOH_PIN2, 0) | \ - PIN_AFIO_AF(GPIOH_PIN3, 0) | \ - PIN_AFIO_AF(GPIOH_PIN4, 0) | \ - PIN_AFIO_AF(GPIOH_PIN5, 0) | \ - PIN_AFIO_AF(GPIOH_PIN6, 0) | \ - PIN_AFIO_AF(GPIOH_PIN7, 0)) -#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ - PIN_AFIO_AF(GPIOH_PIN9, 0) | \ - PIN_AFIO_AF(GPIOH_PIN10, 0) | \ - PIN_AFIO_AF(GPIOH_PIN11, 0) | \ - PIN_AFIO_AF(GPIOH_PIN12, 0) | \ - PIN_AFIO_AF(GPIOH_PIN13, 0) | \ - PIN_AFIO_AF(GPIOH_PIN14, 0) | \ - PIN_AFIO_AF(GPIOH_PIN15, 0)) - - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM32L_DISCOVERY/board.mk b/boards/ST_STM32L_DISCOVERY/board.mk deleted file mode 100644 index 7e3fdd8e36..0000000000 --- a/boards/ST_STM32L_DISCOVERY/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM32L_DISCOVERY/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM32L_DISCOVERY diff --git a/boards/ST_STM32L_DISCOVERY/cfg/board.chcfg b/boards/ST_STM32L_DISCOVERY/cfg/board.chcfg deleted file mode 100644 index b42e09289a..0000000000 --- a/boards/ST_STM32L_DISCOVERY/cfg/board.chcfg +++ /dev/null @@ -1,799 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32l1xx/templates - .. - - ST STM32L-Discovery - ST_STM32L_DISCOVERY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/boards/ST_STM32VL_DISCOVERY/board.c b/boards/ST_STM32VL_DISCOVERY/board.c deleted file mode 100644 index 92f1fe3645..0000000000 --- a/boards/ST_STM32VL_DISCOVERY/board.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = -{ - {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, - {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, - {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, - {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, - {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, -}; -#endif - -/* - * Early initialization code. - * This initialization must be performed just after stack setup and before - * any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/ST_STM32VL_DISCOVERY/board.h b/boards/ST_STM32VL_DISCOVERY/board.h deleted file mode 100644 index 85f6268cc0..0000000000 --- a/boards/ST_STM32VL_DISCOVERY/board.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for STMicroelectronics STM32VL-Discovery board. - */ - -/* - * Board identifier. - */ -#define BOARD_ST_STM32VL_DISCOVERY -#define BOARD_NAME "ST STM32VL-Discovery" - -/* - * Board frequencies. - */ -#define STM32_LSECLK 32768 -#define STM32_HSECLK 8000000 - -/* - * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. - */ -#define STM32F10X_MD_VL - -/* - * IO pins assignments. - */ -#define GPIOA_BUTTON 0 -#define GPIOA_SPI1NSS 4 - -#define GPIOB_SPI2NSS 12 - -#define GPIOC_LED4 8 -#define GPIOC_LED3 9 - -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * - * The digits have the following meaning: - * 0 - Analog input. - * 1 - Push Pull output 10MHz. - * 2 - Push Pull output 2MHz. - * 3 - Push Pull output 50MHz. - * 4 - Digital input. - * 5 - Open Drain output 10MHz. - * 6 - Open Drain output 2MHz. - * 7 - Open Drain output 50MHz. - * 8 - Digital input with PullUp or PullDown resistor depending on ODR. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. - * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. - * Please refer to the STM32 Reference Manual for details. - */ - -/* - * Port A setup. - * Everything input with pull-up except: - * PA0 - Normal input (BUTTON). - * PA2 - Alternate output (USART2 TX). - * PA3 - Normal input (USART2 RX). - * PA4 - Push pull output (SPI1 NSS), initially high state. - * PA5 - Alternate output (SPI1 SCK). - * PA6 - Normal input (SPI1 MISO). - * PA7 - Alternate output (SPI1 MOSI). - * PA9 - Alternate output (USART1 TX). - * PA10 - Normal input (USART1 RX). - */ -#define VAL_GPIOACRL 0xB4B34B84 /* PA7...PA0 */ -#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ -#define VAL_GPIOAODR 0xFFFFFFFF - -/* - * Port B setup. - * Everything input with pull-up except: - * PB12 - Push pull output (SPI2 NSS), initially high state. - * PB13 - Alternate output (SPI2 SCK). - * PB14 - Normal input (SPI2 MISO). - * PB15 - Alternate output (SPI2 MOSI). - */ -#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ -#define VAL_GPIOBCRH 0xB4B38888 /* PB15...PB8 */ -#define VAL_GPIOBODR 0xFFFFFFFF - -/* - * Port C setup. - * Everything input with pull-up except: - * PC8 - Push-pull output (LED4), initially low state. - * PC9 - Push-pull output (LED3), initially low state. - */ -#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ -#define VAL_GPIOCCRH 0x88888833 /* PC15...PC8 */ -#define VAL_GPIOCODR 0xFFFFFCFF - -/* - * Port D setup. - * Everything input with pull-up except: - * PD0 - Normal input (XTAL). - * PD1 - Normal input (XTAL). - */ -#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ -#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ -#define VAL_GPIODODR 0xFFFFFFFF - -/* - * Port E setup. - * Everything input with pull-up except: - */ -#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ -#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ -#define VAL_GPIOEODR 0xFFFFFFFF - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM32VL_DISCOVERY/board.mk b/boards/ST_STM32VL_DISCOVERY/board.mk deleted file mode 100644 index 36467943ce..0000000000 --- a/boards/ST_STM32VL_DISCOVERY/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the board related files. -BOARDSRC = ${CHIBIOS}/boards/ST_STM32VL_DISCOVERY/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/ST_STM32VL_DISCOVERY diff --git a/boards/ST_STM8L_DISCOVERY/board.c b/boards/ST_STM8L_DISCOVERY/board.c deleted file mode 100644 index 5e4b0a6cbd..0000000000 --- a/boards/ST_STM8L_DISCOVERY/board.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -ROMCONST PALConfig pal_default_config = -{ - { - {VAL_GPIOAODR, 0, VAL_GPIOADDR, VAL_GPIOACR1, VAL_GPIOACR2}, - {VAL_GPIOBODR, 0, VAL_GPIOBDDR, VAL_GPIOBCR1, VAL_GPIOBCR2}, - {VAL_GPIOCODR, 0, VAL_GPIOCDDR, VAL_GPIOCCR1, VAL_GPIOCCR2}, - {VAL_GPIODODR, 0, VAL_GPIODDDR, VAL_GPIODCR1, VAL_GPIODCR2}, - {VAL_GPIOEODR, 0, VAL_GPIOEDDR, VAL_GPIOECR1, VAL_GPIOECR2}, - {VAL_GPIOFODR, 0, VAL_GPIOFDDR, VAL_GPIOFCR1, VAL_GPIOFCR2}, - } -}; -#endif - -/* - * TIM 2 clock after the prescaler. - */ -#define TIM2_CLOCK (SYSCLK / 16) -#define TIM2_ARR ((TIM2_CLOCK / CH_FREQUENCY) - 1) - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * TIM2 initialization as system tick. - */ - CLK->PCKENR1 |= CLK_PCKENR1_TIM2; - TIM2->PSCR = 4; /* Prescaler divide by 2^4=16.*/ - TIM2->ARRH = (uint8_t)(TIM2_ARR >> 8); - TIM2->ARRL = (uint8_t)(TIM2_ARR); - TIM2->CNTRH = 0; - TIM2->CNTRL = 0; - TIM2->SR1 = 0; - TIM2->IER = TIM_IER_UIE; - TIM2->CR1 = TIM_CR1_CEN; -} diff --git a/boards/ST_STM8L_DISCOVERY/board.h b/boards/ST_STM8L_DISCOVERY/board.h deleted file mode 100644 index b292cdfbe7..0000000000 --- a/boards/ST_STM8L_DISCOVERY/board.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for STMicroelectronics STM8L-Discovery board. - */ - -/* - * Board identifiers. - */ -#define BOARD_ST_STM8L_DISCOVERY -#define BOARD_NAME "ST STM8L-Discovery" - -/* - * Board frequencies and bypass modes. - * - * The bypass must be set to TRUE if the chip is driven by an external - * oscillator rather than a crystal. Frequency must be set to zero if - * the clock source is not used at all. - * The following constants are used by the HAL low level driver for - * correct clock initialization. - */ -#define HSECLK 0 -#define HSEBYPASS FALSE -#define LSECLK 32768 -#define LSEBYPASS FALSE - -/* - * MCU model used on the board. - */ -#define STM8L152C6 -#define STM8L15X_MD - -/* - * Pin definitions. - */ -#define PA_OSC_IN 2 -#define PA_OSC_OUT 3 -#define PA_LCD_COM0 4 -#define PA_LCD_COM1 5 -#define PA_LCD_COM2 6 -#define PA_LCD_SEG0 7 - -#define PB_LCD_SEG10 0 -#define PB_LCD_SEG11 1 -#define PB_LCD_SEG12 2 -#define PB_LCD_SEG13 3 -#define PB_LCD_SEG14 4 -#define PB_LCD_SEG15 5 -#define PB_LCD_SEG16 6 -#define PB_LCD_SEG17 7 - -#define PC_UNUSED 0 -#define PC_BUTTON 1 -#define PC_LCD_SEG22 2 -#define PC_LCD_SEG23 3 -#define PC_IDD_CNT_EN 4 -#define PC_LED4 7 - -#define PD_LCD_SEG7 0 -#define PD_LCD_COM3 1 -#define PD_LCD_SEG8 2 -#define PD_LCD_SEG9 3 -#define PD_LCD_SEG18 4 -#define PD_LCD_SEG19 5 -#define PD_LCD_SEG20 6 -#define PD_LCD_SEG21 7 - -#define PE_LCD_SEG1 0 -#define PE_LCD_SEG2 1 -#define PE_LCD_SEG3 2 -#define PE_LCD_SEG4 3 -#define PE_LCD_SEG5 4 -#define PE_LCD_SEG6 5 -#define PE_IDD_WAKEUP 6 -#define PE_LED3 7 - -#define PF0_IDD_MEASUREMENT 0 - -/* - * Port A initial setup. - */ -#define VAL_GPIOAODR 0 -#define VAL_GPIOADDR 0 /* All inputs. */ -#define VAL_GPIOACR1 0xFF /* All pull-up/push-pull. */ -#define VAL_GPIOACR2 0 - -/* - * Port B initial setup. - */ -#define VAL_GPIOBODR 0 -#define VAL_GPIOBDDR 0 /* All inputs. */ -#define VAL_GPIOBCR1 0xFF /* All pull-up/push-pull. */ -#define VAL_GPIOBCR2 0 - -/* - * Port C initial setup. - */ -#define VAL_GPIOCODR 0 -#define VAL_GPIOCDDR (1 << PC_LED4) -#define VAL_GPIOCCR1 0xFF /* All pull-up/push-pull. */ -#define VAL_GPIOCCR2 0 - -/* - * Port D initial setup. - */ -#define VAL_GPIODODR 0 -#define VAL_GPIODDDR 0 /* All inputs. */ -#define VAL_GPIODCR1 0xFF /* All pull-up/push-pull. */ -#define VAL_GPIODCR2 0 - -/* - * Port E initial setup. - */ -#define VAL_GPIOEODR 0 -#define VAL_GPIOEDDR (1 << PE_LED3) -#define VAL_GPIOECR1 0xFF /* All pull-up/push-pull. */ -#define VAL_GPIOECR2 0 - -/* - * Port F initial setup. - */ -#define VAL_GPIOFODR 0 -#define VAL_GPIOFDDR 0 /* All inputs. */ -#define VAL_GPIOFCR1 0xFF /* All pull-up/push-pull. */ -#define VAL_GPIOFCR2 0 - -/* - * TIM2-update ISR segment code. This code is injected into the appropriate - * ISR by the HAL. - */ -#define _TIM2_UPDATE_ISR() { \ - if (TIM2->SR1 & TIM_SR1_UIF) { \ - chSysLockFromIsr(); \ - chSysTimerHandlerI(); \ - chSysUnlockFromIsr(); \ - TIM2->SR1 = 0; \ - } \ -} - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/ST_STM8S_DISCOVERY/board.c b/boards/ST_STM8S_DISCOVERY/board.c deleted file mode 100644 index 8c432913cf..0000000000 --- a/boards/ST_STM8S_DISCOVERY/board.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -ROMCONST PALConfig pal_default_config = -{ - { - {VAL_GPIOAODR, 0, VAL_GPIOADDR, VAL_GPIOACR1, VAL_GPIOACR2}, - {VAL_GPIOBODR, 0, VAL_GPIOBDDR, VAL_GPIOBCR1, VAL_GPIOBCR2}, - {VAL_GPIOCODR, 0, VAL_GPIOCDDR, VAL_GPIOCCR1, VAL_GPIOCCR2}, - {VAL_GPIODODR, 0, VAL_GPIODDDR, VAL_GPIODCR1, VAL_GPIODCR2}, - {VAL_GPIOEODR, 0, VAL_GPIOEDDR, VAL_GPIOECR1, VAL_GPIOECR2}, - {VAL_GPIOFODR, 0, VAL_GPIOFDDR, VAL_GPIOFCR1, VAL_GPIOFCR2}, - {VAL_GPIOGODR, 0, VAL_GPIOGDDR, VAL_GPIOGCR1, VAL_GPIOGCR2}, - } -}; -#endif - -/* - * TIM 2 clock after the prescaler. - */ -#define TIM2_CLOCK (SYSCLK / 16) -#define TIM2_ARR ((TIM2_CLOCK / CH_FREQUENCY) - 1) - -/* - * TIM2 interrupt handler. - */ -CH_IRQ_HANDLER(13) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - TIM2->SR1 = 0; - - CH_IRQ_EPILOGUE(); -} - -/* - * Board-specific initialization code. - */ -void boardInit(void) { - - /* - * TIM2 initialization as system tick. - */ - CLK->PCKENR1 |= CLK_PCKENR1_TIM2; - TIM2->PSCR = 4; /* Prescaler divide by 2^4=16.*/ - TIM2->ARRH = (uint8_t)(TIM2_ARR >> 8); - TIM2->ARRL = (uint8_t)(TIM2_ARR); - TIM2->CNTRH = 0; - TIM2->CNTRL = 0; - TIM2->SR1 = 0; - TIM2->IER = TIM2_IER_UIE; - TIM2->CR1 = TIM2_CR1_CEN; -} diff --git a/boards/ST_STM8S_DISCOVERY/board.h b/boards/ST_STM8S_DISCOVERY/board.h deleted file mode 100644 index 6f055a36b9..0000000000 --- a/boards/ST_STM8S_DISCOVERY/board.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for STMicroelectronics STM8S-Discovery board. - */ - -/* - * Board identifiers. - */ -#define BOARD_ST_STM8S_DISCOVERY -#define BOARD_NAME "ST STM8S-Discovery" - -/* - * Board frequencies. - */ -#define HSECLK 16000000 - -/* - * MCU model used on the board. - */ -#define STM8S105 - -/* - * Pin definitions. - */ -#define PA_OSCIN 1 -#define PA_OSCOUT 2 - -#define PC_TS_KEY 1 -#define PC_TS_LOADREF 2 -#define PC_TS_SHIELD 3 - -#define PD_LD10 0 -#define PD_SWIM 1 -#define PD_TX 5 -#define PD_RX 6 - -/* - * Port A initial setup. - */ -#define VAL_GPIOAODR 0 -#define VAL_GPIOADDR 0 /* All inputs. */ -#define VAL_GPIOACR1 0xFF /* All pull-up or push-pull. */ -#define VAL_GPIOACR2 0 - -/* - * Port B initial setup. - */ -#define VAL_GPIOBODR 0 -#define VAL_GPIOBDDR 0 /* All inputs. */ -#define VAL_GPIOBCR1 0xFF /* All push-pull. */ -#define VAL_GPIOBCR2 0 - -/* - * Port C initial setup. - */ -#define VAL_GPIOCODR 0 -#define VAL_GPIOCDDR 0 /* All inputs. */ -#define VAL_GPIOCCR1 0xFF /* All pull-up. */ -#define VAL_GPIOCCR2 0 - -/* - * Port D initial setup. - */ -#define VAL_GPIODODR (1 << PD_LD10) | (1 << PD_TX) -#define VAL_GPIODDDR (1 << PD_LD10) | (1 << PD_TX) -#define VAL_GPIODCR1 0xFF /* All pull-up. */ -#define VAL_GPIODCR2 0 - -/* - * Port E initial setup. - */ -#define VAL_GPIOEODR 0 -#define VAL_GPIOEDDR 0 /* All inputs. */ -#define VAL_GPIOECR1 0xFF /* All pull-up. */ -#define VAL_GPIOECR2 0 - -/* - * Port F initial setup. - */ -#define VAL_GPIOFODR 0 -#define VAL_GPIOFDDR 0 /* All inputs. */ -#define VAL_GPIOFCR1 0xFF /* All pull-up. */ -#define VAL_GPIOFCR2 0 - -/* - * Port G initial setup. - */ -#define VAL_GPIOGODR 0 -#define VAL_GPIOGDDR 0 /* All inputs. */ -#define VAL_GPIOGCR1 0xFF /* All pull-up or push-pull. */ -#define VAL_GPIOGCR2 0 - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/readme.txt b/boards/readme.txt deleted file mode 100644 index 4a28e12e17..0000000000 --- a/boards/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -This directory contains the support files for various board models. If you -want to support a new board: -- Create a new directory under ./boards, give it the name of your board. -- Copy inside the new directory the files from a similar board. -- Customize board.c, board.h and board.mk in order to correctly initialize - your board. \ No newline at end of file diff --git a/boards/simulator/board.c b/boards/simulator/board.c deleted file mode 100644 index 305140863f..0000000000 --- a/boards/simulator/board.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - */ -#if HAL_USE_PAL || defined(__DOXYGEN__) -const PALConfig pal_default_config = { - {0, 0, 0}, - {0, 0, 0} -}; -#endif - -/* - * Board-specific initialization code. - */ -void boardInit(void) { -} diff --git a/boards/simulator/board.h b/boards/simulator/board.h deleted file mode 100644 index b8150fcb4a..0000000000 --- a/boards/simulator/board.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/boards/simulator/board.mk b/boards/simulator/board.mk deleted file mode 100644 index a48747c662..0000000000 --- a/boards/simulator/board.mk +++ /dev/null @@ -1,5 +0,0 @@ -# List of all the simulator board related files. -BOARDSRC = ${CHIBIOS}/boards/simulator/board.c - -# Required include directories -BOARDINC = ${CHIBIOS}/boards/simulator diff --git a/demos/ARM11-BCM2835-G++-MPC/.cproject b/demos/ARM11-BCM2835-G++-MPC/.cproject deleted file mode 100644 index eec214bbe8..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/.cproject +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARM11-BCM2835-G++-MPC/.project b/demos/ARM11-BCM2835-G++-MPC/.project deleted file mode 100644 index 02a0beb5af..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - ROS - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - PMPCToolbox - 2 - /home/robu/UbuntuOne/PMPCToolbox - - - board - 2 - /home/robu/UbuntuOne/ChibiOS-RPi/boards/RASPBERRYPI_MODB - - - os - 2 - /home/robu/UbuntuOne/ChibiOS-RPi/os - - - diff --git a/demos/ARM11-BCM2835-G++-MPC/Makefile b/demos/ARM11-BCM2835-G++-MPC/Makefile deleted file mode 100644 index 2b73a8da3a..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/Makefile +++ /dev/null @@ -1,193 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/RASPBERRYPI_MODB/board.mk -include $(CHIBIOS)/os/hal/platforms/BCM2835/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/BCM2835/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/BCM2835.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/syscalls.c - - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(CHIBIOS)/os/various/ch.cpp \ - main.cpp \ - $(CHIBIOS)/os/contrib/Print.cpp \ - - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various \ - $(CHIBIOS)/os/contrib \ - /home/robu/UbuntuOne/PMPCToolbox -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm1176jzf-s - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DCHIBIOS_DEBUG -DCHIBIOS - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = -lstdc++ - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM11-BCM2835-G++-MPC/chconf.h b/demos/ARM11-BCM2835-G++-MPC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM11-BCM2835-G++-MPC/halconf.h b/demos/ARM11-BCM2835-G++-MPC/halconf.h deleted file mode 100644 index d3766e0fd1..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM11-BCM2835-G++-MPC/main.cpp b/demos/ARM11-BCM2835-G++-MPC/main.cpp deleted file mode 100644 index 8d90bbd026..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/main.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -#include "ch.hpp" -#include "hal.h" -#include "chprintf.h" -#include "Matrix" -#include "ERRORH" -#include "MPC" -#include "KF" - -using namespace chibios_rt; -using namespace PMPC; - -extern BaseSequentialStream * MSD1; - -template int sgn(T val) { - return (T(0) < val) - (val < T(0)); -} -/* - * Brushed DC motor MPC controller - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *p) { - (void) p; - /* - * Defining the variables - */ - //Control horizon - int nc = 4; - // Prediction horizon - int np = 4; - //Control signal - Matrix u(1, 1); - // Sampling time - double Ts = 5e-5; - - /* - * Initializing the MPC - */ - MPC mySysMat(2, 1, 1); - - Matrix DeltaU(np, 1); - - Matrix R = 1e-5 - * Matrix::Identity(mySysMat.C.rows() * nc, mySysMat.C.rows() * nc); - Matrix Q = 1e4 * Matrix::Identity(np, np); - - Matrix x0(2, 1); - Matrix x00(2, 1); - //Reference signal - Matrix y_ref(100000, 1); - y_ref.rblock(0, 0, 50000, 1) = 100 * Matrix::Ones(50000, 1); - y_ref.rblock(50000, 0, 100000, 1) = -100 * Matrix::Ones(50000, 1); - - //double start = now(); - - //DC motor parameters - double Rm = 0.35; - double Km = 0.0296; - double Ke = 0.0296; - double b = 6.7 * 10e-5; - double J = 2.9 * 10e-6; - //double Fc = 0.02; - double L = 25 * 10e-6; - - //Initializing the system matrices - mySysMat.Fi << 1 - Ts * (Rm / L), -Ts * (Ke / L), Ts * (Km / J), 1 - Ts * (b / J); - - mySysMat.Ga << Ts * 1 / L, 0; - - mySysMat.C << 0, 1; - - mySysMat.calcMPCFi(np); - mySysMat.calcMPCGa(np); - mySysMat.calcMPCGy(np, nc); - - /* - * Initializing the Kalman filter - */ - - Matrix kQ = 1e-5 * Matrix::Identity(mySysMat.Ga.rows(), mySysMat.Ga.rows()); - Matrix kR = 1e4 * Matrix::Identity(mySysMat.C.rows(), mySysMat.C.rows()); - Matrix kP = 1e-10 * Matrix::Identity(mySysMat.Ga.rows(), mySysMat.Ga.rows()); - KF myKalman(x0, mySysMat.C, kQ, kR, kP); - -#ifdef CHIBIOS_DEBUG - ERRORH::print("Calculation Fi,Ga,Gy took : "); - //ERRORH::print((double) (now() - start)); -#endif - - Matrix calcT(1, y_ref.rows()); - Matrix u_hist(1, y_ref.rows()); - Matrix w_hist(1, y_ref.rows()); - Matrix w_est_hist(1, y_ref.rows()); - - for (unsigned i = 0; i < y_ref.rows() - np; i++) { - - //start = now(); - //Calculating the error - - DeltaU = mySysMat.calcContSig(mySysMat.calcError(y_ref.block(i, 0, i + np, 1), x00, u), Q, - R); - - u(0, 0) += DeltaU(0, 0); - - //We are not including this in the time measurement - if (abs(u(0, 0)) > 5) - u(0, 0) = sgn(u(0, 0)) * 5; - - u_hist(0, i) = u(0, 0); - - myKalman.updateState(mySysMat.Fi, mySysMat.Ga, u); - - x00 = myKalman.estimate(mySysMat.Fi, x0.block(0, 0, 1, 1)); - - //Simulating the system - x0 = mySysMat.Fi * x0 + mySysMat.Ga * u; - - w_hist(0, i) = x0(1, 0); - w_est_hist(0, i) = x00(1, 0); - //Storing the calculation time - //calcT(0, i) = (double) (now() - start); - - } -#ifdef CHIBIOS_DEBUG - ERRORH::print("Minimum : "); - //ERRORH::print((double) calcT.min()); - ERRORH::print("Maximum : "); - //ERRORH::print((double) calcT.max()); -#endif - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - System::Init(); - - /* - * Activates the serial driver using the driver default configuration. - */ - sdStart(&SD1, NULL); - chprintf((BaseSequentialStream *) &SD1, "MPC test"); - - /* - * Redirect the output to the serial port - */ - MSD1 = (BaseSequentialStream *) &SD1; - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), ABSPRIO, Thread1, NULL); - - /* - * Events servicing loop. - */ - chThdWait(chThdSelf()); - - return 0; -} diff --git a/demos/ARM11-BCM2835-G++-MPC/mcuconf.h b/demos/ARM11-BCM2835-G++-MPC/mcuconf.h deleted file mode 100644 index 87621be7a4..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/mcuconf.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC214x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_LPC214x_UART0 TRUE -#define USE_LPC214x_UART1 TRUE -#define LPC214x_UART_FIFO_PRELOAD 16 -#define LPC214x_UART0_PRIORITY 1 -#define LPC214x_UART1_PRIORITY 2 - -/* - * SPI driver system settings. - */ -#define USE_LPC214x_SPI1 TRUE diff --git a/demos/ARM11-BCM2835-G++-MPC/readme.txt b/demos/ARM11-BCM2835-G++-MPC/readme.txt deleted file mode 100644 index 598282bb02..0000000000 --- a/demos/ARM11-BCM2835-G++-MPC/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for BCM2835 using G++. ** -***************************************************************************** - -** TARGET ** - diff --git a/demos/ARM11-BCM2835-G++/.cproject b/demos/ARM11-BCM2835-G++/.cproject deleted file mode 100644 index ea94e982de..0000000000 --- a/demos/ARM11-BCM2835-G++/.cproject +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARM11-BCM2835-G++/.project b/demos/ARM11-BCM2835-G++/.project deleted file mode 100644 index 211aa8ef4d..0000000000 --- a/demos/ARM11-BCM2835-G++/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - ROS - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - /home/robu/UbuntuOne/ChibiOS-RPi/boards/RASPBERRYPI_MODB - - - os - 2 - /home/robu/UbuntuOne/ChibiOS-RPi/os - - - diff --git a/demos/ARM11-BCM2835-G++/Makefile b/demos/ARM11-BCM2835-G++/Makefile index 6d3405c280..0610e6b309 100644 --- a/demos/ARM11-BCM2835-G++/Makefile +++ b/demos/ARM11-BCM2835-G++/Makefile @@ -5,7 +5,7 @@ # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 + USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 endif # C specific options here (added to USE_OPT). @@ -15,7 +15,7 @@ endif # C++ specific options here (added to USE_OPT). ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions + USE_CPPOPT = -fno-rtti -fno-exceptions endif # Enable this if you want the linker to remove unused code and data @@ -64,16 +64,16 @@ CSRC = $(PORTSRC) \ $(PLATFORMSRC) \ $(BOARDSRC) \ $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/syscalls.c + $(CHIBIOS)/os/various/chprintf.c # C++ sources that can be compiled in ARM or THUMB mode depending on the global # setting. CPPSRC = $(CHIBIOS)/os/various/ch.cpp \ main.cpp \ - $(CHIBIOS)/os/contrib/Print.cpp \ - + $(CHIBIOS)/os/contrib/Adafruit_GFX.cpp \ + $(CHIBIOS)/os/contrib/Adafruit_HX8340B.cpp \ + $(CHIBIOS)/os/contrib/Print.cpp # C sources to be compiled in ARM mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler @@ -101,8 +101,8 @@ ASMSRC = $(PORTASM) INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ $(HALINC) $(PLATFORMINC) $(BOARDINC) \ $(CHIBIOS)/os/various \ - $(CHIBIOS)/os/contrib \ - /home/robu/UbuntuOne/PMPCToolbox + $(CHIBIOS)/os/contrib + # # Project, sources and paths ############################################################################## @@ -111,7 +111,7 @@ INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ # Compiler settings # -MCU = arm1176jzf-s +MCU = arm7tdmi #TRGT = arm-elf- TRGT = arm-none-eabi- @@ -129,16 +129,16 @@ HEX = $(CP) -O ihex BIN = $(CP) -O binary # ARM-specific options here -AOPT = +AOPT = # THUMB-specific options here -TOPT = -mthumb -DTHUMB +TOPT = -mthumb -DTHUMB # Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes +CWARN = -Wall -Wextra -Wstrict-prototypes # Define C++ warning options here -CPPWARN = -Wall -Wextra +CPPWARN = -Wall -Wextra # # Compiler settings @@ -149,7 +149,7 @@ CPPWARN = -Wall -Wextra # # List all default C defines here, like -D_DEBUG=1 -DDEFS = -DCHIBIOS_DEBUG -DCHIBIOS +DDEFS = # List all default ASM defines here, like -D_DEBUG=1 DADEFS = @@ -161,7 +161,7 @@ DINCDIR = DLIBDIR = # List all default libraries here -DLIBS = -lstdc++ +DLIBS = # # End of default section diff --git a/demos/ARM11-BCM2835-G++/Matrix/Matrix.tags b/demos/ARM11-BCM2835-G++/Matrix/Matrix.tags deleted file mode 100644 index 17d33297f57710a451d71184a0613a38e65f417f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI4-A)@v6o7Yj%{q`ckS6Yyi>MP-NM6Nl)m9OeqDXPg0xn>PZPHMwT5Zi>uP|$~ zJC4FlC8EASZ~7kXlk}?BRd14a$W3Qvf4oDeYV~HM)mhnQe$LO#clOM&F{1ly*QW%Z zjKedJ;;*!lhLH9YV@=am*z+EHrq?oSptN(Pog0>#E83@jKUmMN)_(6q{KNm1p+`oF#*Vb#Q^~KKtLe@$bW_K!8H(2OaSsWzv>8pe;}Za0OY?q_TU)^s3yRF|5rjo4Gs05^goPE z)$1v$|JQd>*{W92&x_RiaYU#$i1<@)cAQ4f!M(;eyAI|fxYpXht#;4Zays~+)7oov zj_{6igd2yw{Z^aF?>X&W9S7bS!4VDpU{J>={%F=2`2oRxK*@lFb$sdv$C;eh?~^FX zx{*H!JUR_$x)YC55(b&X#0yD4v#uWuN$As=1tvetX6eO*gybaaNB!|+W;!IyQ{cYz zM$>fAKG03;;X`yJm_+9z_NQoWM9!xqVC$5-hD7ShWR26PGfkTsWy`YA<(4qH+1how z;-w_1i=lZ*%W%Djx@;@nU_g#j%J$`YscfyTqSr0qcCXRw?04hW1<7$d_WwLfVU@z~ zNAAfq=u>|jxFi2mM8A$hG8uV&a+VL^)ri|r|BHI!z`lUMe-o&nO|7DBY5K4FU&hzQ z)c9ThPOqXr(J$y*?Ki}y=DCJ<%GT#==yH)&8}f?RG4~}2BYq%F1OGffa4$I!58JJ0 zhYl-s8_o++`6LZI4y3_aV$S}4*|gTy&_z~8Q?75yND<8$6^H};&kc_&#>yxrV1 z-)P(wMa*tin3-x~rq|f&x(AI8tN7gCiew}=nbNAo_1b=N%d|eOqC>HkM6S2ZO)Ot$ zqPLwhK!^6zo2K=kijHRL-RAy*!}V{!uP^2@1ET2LPnNDOfTQ3BD(@TMQ<*+5Z1(m7 zTY!ZIVgaI93zVW|CI+PYXC}i9iC&G@ZTq=d<|Hl`W_#g^d?n@U3<+3VB3lrD169ZT zjZPhB<oTSXABC#tUxshP1zQMzUr-Ear5SNo61RXTlw1!>i;~)8^{2GViJJ-FJ@d}S3qDM0+9dnPy!hsP)q`l z|HX_e>RI1FEJjeE - - - - - - diff --git a/demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session b/demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session deleted file mode 100644 index 6d57990658..0000000000 --- a/demos/ARM11-BCM2835-G++/Matrix/Matrix.workspace.session +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARM11-BCM2835-G++/main.cpp b/demos/ARM11-BCM2835-G++/main.cpp index 406a0b1a80..8091868d34 100644 --- a/demos/ARM11-BCM2835-G++/main.cpp +++ b/demos/ARM11-BCM2835-G++/main.cpp @@ -1,66 +1,322 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. - This file is part of ChibiOS/RT. + This file is part of ChibiOS/RT. - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ #include "ch.hpp" #include "hal.h" #include "chprintf.h" -#include "Matrix" -#include "ERRORH" +#include "Adafruit_HX8340B.h" + +// Color definitions +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +static const float p = 3.1415926; -//#include "lcomatrix.h" using namespace chibios_rt; -using namespace PMPC; -extern BaseSequentialStream * MSD1; +static void tftPrintTest(Adafruit_HX8340B& display); +static void testlines(Adafruit_HX8340B& display, uint16_t color); +//static void testdrawtext(Adafruit_HX8340B& display, char *text, uint16_t color); +static void testfastlines(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2); +static void testdrawrects(Adafruit_HX8340B& display, uint16_t color); +static void testfillrects(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2); +static void testfillcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color); +static void testdrawcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color); +static void testtriangles(Adafruit_HX8340B& display); +static void testroundrects(Adafruit_HX8340B& display); +static void tftPrintTest(Adafruit_HX8340B& display); + +#define delay(millis) chThdSleepMilliseconds(millis) + +static WORKING_AREA(waThread1, 128); + +static msg_t Thread1(void *p) { + (void)p; + chRegSetThreadName("backlightControl"); + while (TRUE) { + uint32_t buttonState = palReadPad(GPIO4_PORT, GPIO4_PAD); + if (buttonState == 0) { + palClearPad(GPIO25_PORT, GPIO25_PAD); + } + else { + palSetPad(GPIO25_PORT, GPIO25_PAD); + } + } + return 0; +} + /* * Application entry point. */ int main(void) { - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - System::Init(); - - /* - * Activates the serial driver using the driver default configuration. - */ - sdStart(&SD1, NULL); - chprintf((BaseSequentialStream *) &SD1, "MPC test"); - - MSD1 = (BaseSequentialStream *) &SD1; - ERRORH::throwerror("asa"); - - - Matrix DeltaU(3, 1); - Matrix Delta(DeltaU); - //MSD1 = (BaseSequentialStream *) &SD1; - //DeltaU.print(); - /*Matrix R = 1e-5 - * Matrix::Identity(mySysMat.C.rows() * 3, - mySysMat.C.rows() * nc); - Matrix Q = 1e4 * Matrix::Identity(np, np);*/ - - return 0; + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + System::Init(); + + /* + * Activates the serial driver using the driver default configuration. + */ + sdStart(&SD1, NULL); + chprintf((BaseSequentialStream *)&SD1, "Adafruit HX8340B Demonstration (C++)\r\n"); + + // Use button on pin 4 to control backlight with pin 25 + palSetPadMode(GPIO4_PORT, GPIO4_PAD, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIO25_PORT, GPIO25_PAD, PAL_MODE_OUTPUT); + palSetPad(GPIO25_PORT, GPIO25_PAD); + chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + + palSetPadMode(GPIO17_PORT, GPIO17_PAD, PAL_MODE_OUTPUT); + + palSetPad(GPIO17_PORT, GPIO17_PAD); + chThdSleepMilliseconds(100); + palClearPad(GPIO17_PORT, GPIO17_PAD); + chThdSleepMilliseconds(100); + palSetPad(GPIO17_PORT, GPIO17_PAD); + chThdSleepMilliseconds(50); + + /* LCD Config.*/ + SPIConfig spiConfig; + spiConfig.chip_select = 1; + spiConfig.lossiEnabled = TRUE; + spiConfig.clock_divider = 8; // ~30 MHz + + Adafruit_HX8340B display(&SPI0, &spiConfig); + + display.begin(); + + display.fillScreen(BLACK); + + display.setRotation(3); + display.setCursor(0,0); + display.print("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa"); + delay(1000); + + tftPrintTest(display); + delay(1000); + + //a single pixel + display.drawPixel(display.width()/2, display.height()/2, GREEN); + delay(500); + + // line draw test + testlines(display, YELLOW); + delay(500); + + // optimized lines + testfastlines(display, RED, BLUE); + delay(500); + + testdrawrects(display, GREEN); + delay(1000); + + testfillrects(display, YELLOW, MAGENTA); + delay(1000); + + display.fillScreen(BLACK); + testfillcircles(display, 10, BLUE); + testdrawcircles(display, 10, WHITE); + delay(1000); + + testroundrects(display); + delay(500); + + testtriangles(display); + delay(500); + + /* + * Events servicing loop. + */ + chprintf((BaseSequentialStream *)&SD1, "Demonstration idle\r\n"); + chThdWait(chThdSelf()); + + chprintf((BaseSequentialStream *)&SD1, "Demonstration exiting\r\n"); + + return 0; +} + +static void testlines(Adafruit_HX8340B& display, uint16_t color) { + display.fillScreen(BLACK); + for (int16_t x=0; x < display.width()-1; x+=6) { + display.drawLine(0, 0, x, display.height()-1, color); + } + for (int16_t y=0; y < display.height()-1; y+=6) { + display.drawLine(0, 0, display.width()-1, y, color); + } + + display.fillScreen(BLACK); + for (int16_t x=0; x < display.width()-1; x+=6) { + display.drawLine(display.width()-1, 0, x, display.height()-1, color); + } + for (int16_t y=0; y < display.height()-1; y+=6) { + display.drawLine(display.width()-1, 0, 0, y, color); + } + + display.fillScreen(BLACK); + for (int16_t x=0; x < display.width()-1; x+=6) { + display.drawLine(0, display.height()-1, x, 0, color); + } + for (int16_t y=0; y < display.height()-1; y+=6) { + display.drawLine(0, display.height()-1, display.width()-1, y, color); + } + + display.fillScreen(BLACK); + for (int16_t x=0; x < display.width()-1; x+=6) { + display.drawLine(display.width()-1, display.height()-1, x, 0, color); + } + for (int16_t y=0; y < display.height()-1; y+=6) { + display.drawLine(display.width()-1, display.height()-1, 0, y, color); + } + +} + +#if 0 +static void testdrawtext(Adafruit_HX8340B& display, char *text, uint16_t color) { + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + + for (uint8_t i=0; i < 168; i++) { + if (i == '\n') continue; + display.write(i); + if ((i > 0) && (i % 21 == 0)) + display.println(); + } +} +#endif + +static void testfastlines(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2) { + display.fillScreen(BLACK); + for (int16_t y=0; y < display.height()-1; y+=5) { + display.drawFastHLine(0, y, display.width()-1, color1); + } + for (int16_t x=0; x < display.width()-1; x+=5) { + display.drawFastVLine(x, 0, display.height()-1, color2); + } +} + +static void testdrawrects(Adafruit_HX8340B& display, uint16_t color) { + display.fillScreen(BLACK); + for (int16_t x=0; x < display.height()-1; x+=6) { + display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color); + } +} + +static void testfillrects(Adafruit_HX8340B& display, uint16_t color1, uint16_t color2) { + display.fillScreen(BLACK); + for (int16_t x=display.width()-1; x > 6; x-=6) { + display.fillRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color1); + display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color2); + } +} + +static void testfillcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color) { + for (uint8_t x=radius; x < display.width()-1; x+=radius*2) { + for (uint8_t y=radius; y < display.height()-1; y+=radius*2) { + display.fillCircle(x, y, radius, color); + } + } +} + +static void testdrawcircles(Adafruit_HX8340B& display, uint8_t radius, uint16_t color) { + for (int16_t x=0; x < display.width()-1+radius; x+=radius*2) { + for (int16_t y=0; y < display.height()-1+radius; y+=radius*2) { + display.drawCircle(x, y, radius, color); + } + } +} + +static void testtriangles(Adafruit_HX8340B& display) { + display.fillScreen(BLACK); + int color = 0xF800; + int t; + int w = display.width()/2; + int x = display.height(); + int y = 0; + int z = display.width(); + for(t = 0 ; t <= 15; t+=1) { + display.drawTriangle(w, y, y, x, z, x, color); + x-=4; + y+=4; + z-=4; + color+=100; + } +} + +static void testroundrects(Adafruit_HX8340B& display) { + display.fillScreen(BLACK); + int color = 100; + int i; + int t; + for(t = 0 ; t <= 4; t+=1) { + int x = 0; + int y = 0; + int w = display.width(); + int h = display.height(); + for(i = 0 ; i <= 24; i+=1) { + display.drawRoundRect(x, y, w, h, 5, color); + x+=2; + y+=3; + w-=4; + h-=6; + color+=1100; + } + color+=100; + } } + +static void tftPrintTest(Adafruit_HX8340B& display) { + display.fillScreen(BLACK); + display.setCursor(0, 5); + display.setTextColor(RED); + display.setTextSize(1); + display.println("Hello World!"); + display.setTextColor(YELLOW, GREEN); + display.setTextSize(2); + display.println("Hello World!"); + display.setTextColor(BLUE); + display.setTextSize(3); + display.println(1234.567); + delay(1500); + display.setCursor(0, 5); + display.fillScreen(BLACK); + display.setTextColor(WHITE); + display.setTextSize(0); + display.println("Hello World!"); + display.setTextSize(1); + display.setTextColor(GREEN); + display.print(p, 5); + display.println(" Want pi?"); + display.print(8675309, HEX); // print 8,675,309 out in HEX! + display.println(" Print HEX"); + display.setTextColor(WHITE); +} + diff --git a/demos/ARM11-BCM2835-GCC/Makefile b/demos/ARM11-BCM2835-GCC/Makefile index b8b12ca71a..72dbd1b810 100644 --- a/demos/ARM11-BCM2835-GCC/Makefile +++ b/demos/ARM11-BCM2835-GCC/Makefile @@ -32,7 +32,7 @@ endif ifeq ($(USE_VERBOSE_COMPILE),) USE_VERBOSE_COMPILE = no endif - +EXTENDED_SHELL=yes # # Build global options ############################################################################## @@ -42,7 +42,7 @@ endif # # Define project name here -PROJECT = ch +PROJECT = kernel # Imported source files and paths CHIBIOS = ../.. @@ -51,7 +51,7 @@ include $(CHIBIOS)/os/hal/platforms/BCM2835/platform.mk include $(CHIBIOS)/os/hal/hal.mk include $(CHIBIOS)/os/ports/GCC/ARM/BCM2835/port.mk include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk +#include $(CHIBIOS)/test/test.mk # Define linker script file here LDSCRIPT= $(PORTLD)/BCM2835.ld diff --git a/demos/ARM11-BCM2835-GCC/main.c b/demos/ARM11-BCM2835-GCC/main.c index f25df4b2b7..4d2f55235f 100644 --- a/demos/ARM11-BCM2835-GCC/main.c +++ b/demos/ARM11-BCM2835-GCC/main.c @@ -20,7 +20,7 @@ #include "ch.h" #include "hal.h" -#include "test.h" +//#include "test.h" #include "shell.h" #include "chprintf.h" @@ -65,20 +65,20 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { } static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; + //Thread *tp; UNUSED(argv); if (argc > 0) { chprintf(chp, "Usage: test\r\n"); return; } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), + /*tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), TestThread, chp); if (tp == NULL) { chprintf(chp, "out of memory\r\n"); return; } - chThdWait(tp); + chThdWait(tp);*/ } #endif // EXTENDED_SHELL diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/Makefile b/demos/ARM7-AT91SAM7X-FATFS-GCC/Makefile deleted file mode 100644 index 0389049bf5..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/Makefile +++ /dev/null @@ -1,192 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_SAM7_EX256/board.mk -include $(CHIBIOS)/os/hal/platforms/AT91SAM7/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/AT91SAM7/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/AT91SAM7X256.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(TESTSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSTDOUT_SD=SD1 -DSTDIN_SD=SD1 - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/chconf.h b/demos/ARM7-AT91SAM7X-FATFS-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/ffconf.h b/demos/ARM7-AT91SAM7X-FATFS-GCC/ffconf.h deleted file mode 100644 index e6a13cea3a..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 1 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/halconf.h b/demos/ARM7-AT91SAM7X-FATFS-GCC/halconf.h deleted file mode 100644 index fe761053d3..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/main.c b/demos/ARM7-AT91SAM7X-FATFS-GCC/main.c deleted file mode 100644 index 01588c3c1e..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/main.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "chprintf.h" -#include "evtimer.h" -#include "ff.h" - -/*===========================================================================*/ -/* Card insertion monitor. */ -/*===========================================================================*/ - -#define POLLING_INTERVAL 10 -#define POLLING_DELAY 10 - -/** - * @brief Card monitor timer. - */ -static VirtualTimer tmr; - -/** - * @brief Debounce counter. - */ -static unsigned cnt; - -/** - * @brief Card event sources. - */ -static EventSource inserted_event, removed_event; - -/** - * @brief Insertion monitor timer callback function. - * - * @param[in] p pointer to the @p BaseBlockDevice object - * - * @notapi - */ -static void tmrfunc(void *p) { - BaseBlockDevice *bbdp = p; - - /* The presence check is performed only while the driver is not in a - transfer state because it is often performed by changing the mode of - the pin connected to the CS/D3 contact of the card, this could disturb - the transfer.*/ - blkstate_t state = blkGetDriverState(bbdp); - chSysLockFromIsr(); - if ((state != BLK_READING) && (state != BLK_WRITING)) { - /* Safe to perform the check.*/ - if (cnt > 0) { - if (blkIsInserted(bbdp)) { - if (--cnt == 0) { - chEvtBroadcastI(&inserted_event); - } - } - else - cnt = POLLING_INTERVAL; - } - else { - if (!blkIsInserted(bbdp)) { - cnt = POLLING_INTERVAL; - chEvtBroadcastI(&removed_event); - } - } - } - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, bbdp); - chSysUnlockFromIsr(); -} - -/** - * @brief Polling monitor start. - * - * @param[in] p pointer to an object implementing @p BaseBlockDevice - * - * @notapi - */ -static void tmr_init(void *p) { - - chEvtInit(&inserted_event); - chEvtInit(&removed_event); - chSysLock(); - cnt = POLLING_INTERVAL; - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, p); - chSysUnlock(); -} - -/*===========================================================================*/ -/* FatFs related. */ -/*===========================================================================*/ - -#define MAX_SPI_BITRATE 100 -#define MIN_SPI_BITRATE 250 - -/** - * @brief FS object. - */ -FATFS MMC_FS; - -/** - * MMC driver instance. - */ -MMCDriver MMCD1; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Maximum speed SPI configuration (__MHz, NCPHA=1, CPOL=0).*/ -static SPIConfig hs_spicfg = { - NULL, - IOPORT1, - PIOA_CS_MMC, - (MAX_SPI_BITRATE << 8) | AT91C_SPI_NCPHA | AT91C_SPI_BITS_8 -}; - -/* Low speed SPI configuration (192kHz, NCPHA=1, CPOL=0).*/ -static SPIConfig ls_spicfg = { - NULL, - IOPORT1, - PIOA_CS_MMC, - (MIN_SPI_BITRATE << 8) | AT91C_SPI_NCPHA | AT91C_SPI_BITS_8 -}; - -/* MMC/SD over SPI driver configuration.*/ -static MMCConfig mmccfg = {&SPID1, &ls_spicfg, &hs_spicfg}; - -/* Generic large buffer.*/ -uint8_t fbuff[1024]; - -static FRESULT scan_files(BaseSequentialStream *chp, char *path) { - FRESULT res; - FILINFO fno; - DIR dir; - int i; - char *fn; - -#if _USE_LFN - fno.lfname = 0; - fno.lfsize = 0; -#endif - res = f_opendir(&dir, path); - if (res == FR_OK) { - i = strlen(path); - for (;;) { - res = f_readdir(&dir, &fno); - if (res != FR_OK || fno.fname[0] == 0) - break; - if (fno.fname[0] == '.') - continue; - fn = fno.fname; - if (fno.fattrib & AM_DIR) { - path[i++] = '/'; - strcpy(&path[i], fn); - res = scan_files(chp, path); - if (res != FR_OK) - break; - path[--i] = 0; - } - else { - chprintf(chp, "%s/%s\r\n", path, fn); - } - } - } - return res; -} - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(1024) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_tree(BaseSequentialStream *chp, int argc, char *argv[]) { - FRESULT err; - uint32_t clusters; - FATFS *fsp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: tree\r\n"); - return; - } - if (!fs_ready) { - chprintf(chp, "File System not mounted\r\n"); - return; - } - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chprintf(chp, "FS: f_getfree() failed\r\n"); - return; - } - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)MMC_FS.csize, - clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMC_SECTOR_SIZE); - fbuff[0] = 0; - scan_files(chp, (char *)fbuff); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"tree", cmd_tree}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -/*===========================================================================*/ -/* Main and generic code. */ -/*===========================================================================*/ - -/* - * LCD blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *p) { - - (void)p; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(100); - palClearPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(900); - } - return 0; -} - -/* - * MMC card insertion event. - */ -static void InsertHandler(eventid_t id) { - FRESULT err; - - (void)id; - /* - * On insertion MMC initialization and FS mount. - */ - if (mmcConnect(&MMCD1)) { - return; - } - err = f_mount(0, &MMC_FS); - if (err != FR_OK) { - mmcDisconnect(&MMCD1); - return; - } - fs_ready = TRUE; -} - -/* - * MMC card removal event. - */ -static void RemoveHandler(eventid_t id) { - - (void)id; - mmcDisconnect(&MMCD1); - fs_ready = FALSE; -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - InsertHandler, - RemoveHandler - }; - Thread *shelltp = NULL; - struct EventListener el0, el1; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Initializes the MMC driver to work with SPI. - */ - palSetPadMode(IOPORT1, PIOA_CS_MMC, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(IOPORT1, PIOA_CS_MMC); - mmcObjectInit(&MMCD1); - mmcStart(&MMCD1, &mmccfg); - - /* - * Activates the card insertion monitor. - */ - tmr_init(&MMCD1); - - /* - * Creates the blinker threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and listen for events. - */ - chEvtRegister(&inserted_event, &el0, 0); - chEvtRegister(&removed_event, &el1, 1); - while (TRUE) { - if (!shelltp) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chEvtDispatch(evhndl, chEvtWaitOneTimeout(ALL_EVENTS, MS2ST(500))); - } - return 0; -} diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/mcuconf.h b/demos/ARM7-AT91SAM7X-FATFS-GCC/mcuconf.h deleted file mode 100644 index 7cda994534..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/mcuconf.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AT91SAM7 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ -#define MAC_TRANSMIT_BUFFERS 2 -#define MAC_RECEIVE_BUFFERS 2 -#define MAC_BUFFERS_SIZE 1518 -#define EMAC_INTERRUPT_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 3) - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_SAM7_USART0 TRUE -#define USE_SAM7_USART1 TRUE -#define SAM7_USART0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#define SAM7_USART1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) - -/* - * SPI driver system settings. - */ -#define USE_AT91SAM7_SPI TRUE -#define AT91SAM7_SPI_USE_SPI0 TRUE -#define AT91SAM7_SPI_USE_SPI1 TRUE -#define AT91SAM7_SPI0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) -#define AT91SAM7_SPI1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) diff --git a/demos/ARM7-AT91SAM7X-FATFS-GCC/readme.txt b/demos/ARM7-AT91SAM7X-FATFS-GCC/readme.txt deleted file mode 100644 index 4430e8b41a..0000000000 --- a/demos/ARM7-AT91SAM7X-FATFS-GCC/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ -***************************************************************************** -** ChibiOS/RT + FatFS demo for SAM7. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex SAM-EX256 board. The port on other boards or other -members of the SAM7 family should be an easy task. - -** The Demo ** - -This demo shows how to integrate the FatFs file system and use the SPI and MMC -drivers. -The demo flashes the board LCD background using a thread and monitors the MMC -slot for a card insertion. When a card is inserted then the file system is -mounted and the LCD background flashes faster. -A command line shell is spawned on SD1, all the interaction with the demo is -performed using the command shell, type "help" for a list of the available -commands. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. diff --git a/demos/ARM7-AT91SAM7X-GCC/Makefile b/demos/ARM7-AT91SAM7X-GCC/Makefile deleted file mode 100644 index 02da69ba25..0000000000 --- a/demos/ARM7-AT91SAM7X-GCC/Makefile +++ /dev/null @@ -1,187 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_SAM7_EX256/board.mk -include $(CHIBIOS)/os/hal/platforms/AT91SAM7/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/AT91SAM7/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/AT91SAM7X256.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-AT91SAM7X-GCC/chconf.h b/demos/ARM7-AT91SAM7X-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-AT91SAM7X-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-GCC/halconf.h b/demos/ARM7-AT91SAM7X-GCC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/ARM7-AT91SAM7X-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-GCC/main.c b/demos/ARM7-AT91SAM7X-GCC/main.c deleted file mode 100644 index b5d110a650..0000000000 --- a/demos/ARM7-AT91SAM7X-GCC/main.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *p) { - - (void)p; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(100); - palClearPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(900); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - if (!palReadPad(IOPORT2, PIOB_SW1)) - sdWrite(&SD1, (uint8_t *)"Hello World!\r\n", 14); - if (!palReadPad(IOPORT2, PIOB_SW2)) - TestThread(&SD1); - } - - return 0; -} diff --git a/demos/ARM7-AT91SAM7X-GCC/mcuconf.h b/demos/ARM7-AT91SAM7X-GCC/mcuconf.h deleted file mode 100644 index 73aa7b7771..0000000000 --- a/demos/ARM7-AT91SAM7X-GCC/mcuconf.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AT91SAM7 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ -#define MAC_TRANSMIT_BUFFERS 2 -#define MAC_RECEIVE_BUFFERS 2 -#define MAC_BUFFERS_SIZE 1518 -#define EMAC_INTERRUPT_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 3) - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_SAM7_USART0 TRUE -#define USE_SAM7_USART1 TRUE -#define SAM7_USART0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#define SAM7_USART1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) - -/* - * SPI driver system settings. - */ -#define USE_AT91SAM7_SPI FALSE -#define AT91SAM7_SPI_USE_SPI0 TRUE -#define AT91SAM7_SPI_USE_SPI1 FALSE -#define AT91SAM7_SPI0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) -#define AT91SAM7_SPI1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) diff --git a/demos/ARM7-AT91SAM7X-GCC/readme.txt b/demos/ARM7-AT91SAM7X-GCC/readme.txt deleted file mode 100644 index 1b5240c978..0000000000 --- a/demos/ARM7-AT91SAM7X-GCC/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM7TDMI AT91SAM7X256. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex SAM7-EX256 board. - -** The Demo ** - -The demo currently just flashes the LCD background using a thread. -The button SW1 prints an "Hello World!" string on COM1, the button SW2 -activates che ChibiOS/RT test suite, output on COM1. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are Atmel copyright -and are licensed under a different license, see the header present in all the -source files under ./demos/os/hal/platform/AT91SAM7/at91lib for details. -Also note that not all the files present in the Atmel library are distribuited -with ChibiOS/RT, you can find the whole library on the Atmel web site: - - http://www.atmel.com diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile b/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile deleted file mode 100644 index e9ac171160..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/Makefile +++ /dev/null @@ -1,190 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_SAM7_EX256/board.mk -include $(CHIBIOS)/os/hal/platforms/AT91SAM7/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/AT91SAM7/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/lwip_bindings/lwip.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/AT91SAM7X256.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(LWSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - ./web/web.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) $(LWINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/chconf.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/halconf.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/halconf.h deleted file mode 100644 index 29957bd6d9..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC TRUE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/lwipopts.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/lwipopts.h deleted file mode 100644 index 1bfbd1de6f..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/lwipopts.h +++ /dev/null @@ -1,2030 +0,0 @@ -/** - * @file - * - * lwIP Options Configuration - */ - -/* - * Copyright (c) 2001-2004 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIPOPT_H__ -#define __LWIPOPT_H__ - - -/* - ----------------------------------------------- - ---------- Platform specific locking ---------- - ----------------------------------------------- -*/ - -/** - * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain - * critical regions during buffer allocation, deallocation and memory - * allocation and deallocation. - */ -#ifndef SYS_LIGHTWEIGHT_PROT -#define SYS_LIGHTWEIGHT_PROT 0 -#endif - -/** - * NO_SYS==1: Provides VERY minimal functionality. Otherwise, - * use lwIP facilities. - */ -#ifndef NO_SYS -#define NO_SYS 0 -#endif - -/** - * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 - * Mainly for compatibility to old versions. - */ -#ifndef NO_SYS_NO_TIMERS -#define NO_SYS_NO_TIMERS 0 -#endif - -/** - * MEMCPY: override this if you have a faster implementation at hand than the - * one included in your C library - */ -#ifndef MEMCPY -#define MEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/** - * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a - * call to memcpy() if the length is known at compile time and is small. - */ -#ifndef SMEMCPY -#define SMEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/* - ------------------------------------ - ---------- Memory options ---------- - ------------------------------------ -*/ -/** - * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library - * instead of the lwip internal allocator. Can save code size if you - * already use it. - */ -#ifndef MEM_LIBC_MALLOC -#define MEM_LIBC_MALLOC 0 -#endif - -/** -* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. -* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution -* speed and usage from interrupts! -*/ -#ifndef MEMP_MEM_MALLOC -#define MEMP_MEM_MALLOC 0 -#endif - -/** - * MEM_ALIGNMENT: should be set to the alignment of the CPU - * 4 byte alignment -> #define MEM_ALIGNMENT 4 - * 2 byte alignment -> #define MEM_ALIGNMENT 2 - */ -#ifndef MEM_ALIGNMENT -#define MEM_ALIGNMENT 4 -#endif - -/** - * MEM_SIZE: the size of the heap memory. If the application will send - * a lot of data that needs to be copied, this should be set high. - */ -#ifndef MEM_SIZE -#define MEM_SIZE 1600 -#endif - -/** - * MEMP_SEPARATE_POOLS: if defined to 1, each pool is placed in its own array. - * This can be used to individually change the location of each pool. - * Default is one big array for all pools - */ -#ifndef MEMP_SEPARATE_POOLS -#define MEMP_SEPARATE_POOLS 0 -#endif - -/** - * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable - * amount of bytes before and after each memp element in every pool and fills - * it with a prominent default value. - * MEMP_OVERFLOW_CHECK == 0 no checking - * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed - * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time - * memp_malloc() or memp_free() is called (useful but slow!) - */ -#ifndef MEMP_OVERFLOW_CHECK -#define MEMP_OVERFLOW_CHECK 0 -#endif - -/** - * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make - * sure that there are no cycles in the linked lists. - */ -#ifndef MEMP_SANITY_CHECK -#define MEMP_SANITY_CHECK 0 -#endif - -/** - * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set - * of memory pools of various sizes. When mem_malloc is called, an element of - * the smallest pool that can provide the length needed is returned. - * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. - */ -#ifndef MEM_USE_POOLS -#define MEM_USE_POOLS 0 -#endif - -/** - * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next - * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more - * reliable. */ -#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL -#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 -#endif - -/** - * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h - * that defines additional pools beyond the "standard" ones required - * by lwIP. If you set this to 1, you must have lwippools.h in your - * inlude path somewhere. - */ -#ifndef MEMP_USE_CUSTOM_POOLS -#define MEMP_USE_CUSTOM_POOLS 0 -#endif - -/** - * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from - * interrupt context (or another context that doesn't allow waiting for a - * semaphore). - * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, - * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs - * with each loop so that mem_free can run. - * - * ATTENTION: As you can see from the above description, this leads to dis-/ - * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc - * can need longer. - * - * If you don't want that, at least for NO_SYS=0, you can still use the following - * functions to enqueue a deallocation call which then runs in the tcpip_thread - * context: - * - pbuf_free_callback(p); - * - mem_free_callback(m); - */ -#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT -#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 -#endif - -/* - ------------------------------------------------ - ---------- Internal Memory Pool Sizes ---------- - ------------------------------------------------ -*/ -/** - * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). - * If the application sends a lot of data out of ROM (or other static memory), - * this should be set high. - */ -#ifndef MEMP_NUM_PBUF -#define MEMP_NUM_PBUF 16 -#endif - -/** - * MEMP_NUM_RAW_PCB: Number of raw connection PCBs - * (requires the LWIP_RAW option) - */ -#ifndef MEMP_NUM_RAW_PCB -#define MEMP_NUM_RAW_PCB 4 -#endif - -/** - * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One - * per active UDP "connection". - * (requires the LWIP_UDP option) - */ -#ifndef MEMP_NUM_UDP_PCB -#define MEMP_NUM_UDP_PCB 4 -#endif - -/** - * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB -#define MEMP_NUM_TCP_PCB 5 -#endif - -/** - * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB_LISTEN -#define MEMP_NUM_TCP_PCB_LISTEN 8 -#endif - -/** - * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_SEG -#define MEMP_NUM_TCP_SEG 16 -#endif - -/** - * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for - * reassembly (whole packets, not fragments!) - */ -#ifndef MEMP_NUM_REASSDATA -#define MEMP_NUM_REASSDATA 5 -#endif - -/** - * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent - * (fragments, not whole packets!). - * This is only used with IP_FRAG_USES_STATIC_BUF==0 and - * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs - * where the packet is not yet sent when netif->output returns. - */ -#ifndef MEMP_NUM_FRAG_PBUF -#define MEMP_NUM_FRAG_PBUF 15 -#endif - -/** - * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing - * packets (pbufs) that are waiting for an ARP request (to resolve - * their destination address) to finish. - * (requires the ARP_QUEUEING option) - */ -#ifndef MEMP_NUM_ARP_QUEUE -#define MEMP_NUM_ARP_QUEUE 30 -#endif - -/** - * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces - * can be members et the same time (one per netif - allsystems group -, plus one - * per netif membership). - * (requires the LWIP_IGMP option) - */ -#ifndef MEMP_NUM_IGMP_GROUP -#define MEMP_NUM_IGMP_GROUP 8 -#endif - -/** - * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. - * (requires NO_SYS==0) - */ -#ifndef MEMP_NUM_SYS_TIMEOUT -#define MEMP_NUM_SYS_TIMEOUT 3 -#endif - -/** - * MEMP_NUM_NETBUF: the number of struct netbufs. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETBUF -#define MEMP_NUM_NETBUF 2 -#endif - -/** - * MEMP_NUM_NETCONN: the number of struct netconns. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETCONN -#define MEMP_NUM_NETCONN 4 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used - * for callback/timeout API communication. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_API -#define MEMP_NUM_TCPIP_MSG_API 8 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used - * for incoming packets. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_INPKT -#define MEMP_NUM_TCPIP_MSG_INPKT 8 -#endif - -/** - * MEMP_NUM_SNMP_NODE: the number of leafs in the SNMP tree. - */ -#ifndef MEMP_NUM_SNMP_NODE -#define MEMP_NUM_SNMP_NODE 50 -#endif - -/** - * MEMP_NUM_SNMP_ROOTNODE: the number of branches in the SNMP tree. - * Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least! - */ -#ifndef MEMP_NUM_SNMP_ROOTNODE -#define MEMP_NUM_SNMP_ROOTNODE 30 -#endif - -/** - * MEMP_NUM_SNMP_VARBIND: the number of concurrent requests (does not have to - * be changed normally) - 2 of these are used per request (1 for input, - * 1 for output) - */ -#ifndef MEMP_NUM_SNMP_VARBIND -#define MEMP_NUM_SNMP_VARBIND 2 -#endif - -/** - * MEMP_NUM_SNMP_VALUE: the number of OID or values concurrently used - * (does not have to be changed normally) - 3 of these are used per request - * (1 for the value read and 2 for OIDs - input and output) - */ -#ifndef MEMP_NUM_SNMP_VALUE -#define MEMP_NUM_SNMP_VALUE 3 -#endif - -/** - * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls - * (before freeing the corresponding memory using lwip_freeaddrinfo()). - */ -#ifndef MEMP_NUM_NETDB -#define MEMP_NUM_NETDB 1 -#endif - -/** - * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list - * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. - */ -#ifndef MEMP_NUM_LOCALHOSTLIST -#define MEMP_NUM_LOCALHOSTLIST 1 -#endif - -/** - * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE - * interfaces (only used with PPPOE_SUPPORT==1) - */ -#ifndef MEMP_NUM_PPPOE_INTERFACES -#define MEMP_NUM_PPPOE_INTERFACES 1 -#endif - -/** - * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. - */ -#ifndef PBUF_POOL_SIZE -#define PBUF_POOL_SIZE 16 -#endif - -/* - --------------------------------- - ---------- ARP options ---------- - --------------------------------- -*/ -/** - * LWIP_ARP==1: Enable ARP functionality. - */ -#ifndef LWIP_ARP -#define LWIP_ARP 1 -#endif - -/** - * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. - */ -#ifndef ARP_TABLE_SIZE -#define ARP_TABLE_SIZE 10 -#endif - -/** - * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address - * resolution. By default, only the most recent packet is queued per IP address. - * This is sufficient for most protocols and mainly reduces TCP connection - * startup time. Set this to 1 if you know your application sends more than one - * packet in a row to an IP address that is not in the ARP cache. - */ -#ifndef ARP_QUEUEING -#define ARP_QUEUEING 0 -#endif - -/** - * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be - * updated with the source MAC and IP addresses supplied in the packet. - * You may want to disable this if you do not trust LAN peers to have the - * correct addresses, or as a limited approach to attempt to handle - * spoofing. If disabled, lwIP will need to make a new ARP request if - * the peer is not already in the ARP table, adding a little latency. - * The peer *is* in the ARP table if it requested our address before. - * Also notice that this slows down input processing of every IP packet! - */ -#ifndef ETHARP_TRUST_IP_MAC -#define ETHARP_TRUST_IP_MAC 0 -#endif - -/** - * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. - * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. - * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. - * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. - */ -#ifndef ETHARP_SUPPORT_VLAN -#define ETHARP_SUPPORT_VLAN 0 -#endif - -/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP - * might be disabled - */ -#ifndef LWIP_ETHERNET -#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) -#endif - -/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure - * alignment of payload after that header. Since the header is 14 bytes long, - * without this padding e.g. addresses in the IP header will not be aligned - * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. - */ -#ifndef ETH_PAD_SIZE -#define ETH_PAD_SIZE 0 -#endif - -/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table - * entries (using etharp_add_static_entry/etharp_remove_static_entry). - */ -#ifndef ETHARP_SUPPORT_STATIC_ENTRIES -#define ETHARP_SUPPORT_STATIC_ENTRIES 0 -#endif - - -/* - -------------------------------- - ---------- IP options ---------- - -------------------------------- -*/ -/** - * IP_FORWARD==1: Enables the ability to forward IP packets across network - * interfaces. If you are going to run lwIP on a device with only one network - * interface, define this to 0. - */ -#ifndef IP_FORWARD -#define IP_FORWARD 0 -#endif - -/** - * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. - * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. - * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). - */ -#ifndef IP_OPTIONS_ALLOWED -#define IP_OPTIONS_ALLOWED 1 -#endif - -/** - * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that - * this option does not affect outgoing packet sizes, which can be controlled - * via IP_FRAG. - */ -#ifndef IP_REASSEMBLY -#define IP_REASSEMBLY 1 -#endif - -/** - * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note - * that this option does not affect incoming packet sizes, which can be - * controlled via IP_REASSEMBLY. - */ -#ifndef IP_FRAG -#define IP_FRAG 1 -#endif - -/** - * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) - * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived - * in this time, the whole packet is discarded. - */ -#ifndef IP_REASS_MAXAGE -#define IP_REASS_MAXAGE 3 -#endif - -/** - * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. - * Since the received pbufs are enqueued, be sure to configure - * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive - * packets even if the maximum amount of fragments is enqueued for reassembly! - */ -#ifndef IP_REASS_MAX_PBUFS -#define IP_REASS_MAX_PBUFS 10 -#endif - -/** - * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP - * fragmentation. Otherwise pbufs are allocated and reference the original - * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1, - * new PBUF_RAM pbufs are used for fragments). - * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs! - */ -#ifndef IP_FRAG_USES_STATIC_BUF -#define IP_FRAG_USES_STATIC_BUF 0 -#endif - -/** - * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer - * (requires IP_FRAG_USES_STATIC_BUF==1) - */ -#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) -#define IP_FRAG_MAX_MTU 1500 -#endif - -/** - * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. - */ -#ifndef IP_DEFAULT_TTL -#define IP_DEFAULT_TTL 255 -#endif - -/** - * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast - * filter per pcb on udp and raw send operations. To enable broadcast filter - * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. - */ -#ifndef IP_SOF_BROADCAST -#define IP_SOF_BROADCAST 0 -#endif - -/** - * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast - * filter on recv operations. - */ -#ifndef IP_SOF_BROADCAST_RECV -#define IP_SOF_BROADCAST_RECV 0 -#endif - -/* - ---------------------------------- - ---------- ICMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_ICMP==1: Enable ICMP module inside the IP stack. - * Be careful, disable that make your product non-compliant to RFC1122 - */ -#ifndef LWIP_ICMP -#define LWIP_ICMP 1 -#endif - -/** - * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. - */ -#ifndef ICMP_TTL -#define ICMP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) - */ -#ifndef LWIP_BROADCAST_PING -#define LWIP_BROADCAST_PING 0 -#endif - -/** - * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) - */ -#ifndef LWIP_MULTICAST_PING -#define LWIP_MULTICAST_PING 0 -#endif - -/* - --------------------------------- - ---------- RAW options ---------- - --------------------------------- -*/ -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef LWIP_RAW -#define LWIP_RAW 1 -#endif - -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef RAW_TTL -#define RAW_TTL (IP_DEFAULT_TTL) -#endif - -/* - ---------------------------------- - ---------- DHCP options ---------- - ---------------------------------- -*/ -/** - * LWIP_DHCP==1: Enable DHCP module. - */ -#ifndef LWIP_DHCP -#define LWIP_DHCP 0 -#endif - -/** - * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. - */ -#ifndef DHCP_DOES_ARP_CHECK -#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) -#endif - -/* - ------------------------------------ - ---------- AUTOIP options ---------- - ------------------------------------ -*/ -/** - * LWIP_AUTOIP==1: Enable AUTOIP module. - */ -#ifndef LWIP_AUTOIP -#define LWIP_AUTOIP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on - * the same interface at the same time. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP -#define LWIP_DHCP_AUTOIP_COOP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes - * that should be sent before falling back on AUTOIP. This can be set - * as low as 1 to get an AutoIP address very quickly, but you should - * be prepared to handle a changing IP address when DHCP overrides - * AutoIP. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES -#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 -#endif - -/* - ---------------------------------- - ---------- SNMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP - * transport. - */ -#ifndef LWIP_SNMP -#define LWIP_SNMP 0 -#endif - -/** - * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will - * allow. At least one request buffer is required. - * Does not have to be changed unless external MIBs answer request asynchronously - */ -#ifndef SNMP_CONCURRENT_REQUESTS -#define SNMP_CONCURRENT_REQUESTS 1 -#endif - -/** - * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap - * destination is required - */ -#ifndef SNMP_TRAP_DESTINATIONS -#define SNMP_TRAP_DESTINATIONS 1 -#endif - -/** - * SNMP_PRIVATE_MIB: - * When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. - */ -#ifndef SNMP_PRIVATE_MIB -#define SNMP_PRIVATE_MIB 0 -#endif - -/** - * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not - * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). - * Unsafe requests are disabled by default! - */ -#ifndef SNMP_SAFE_REQUESTS -#define SNMP_SAFE_REQUESTS 1 -#endif - -/** - * The maximum length of strings used. This affects the size of - * MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_OCTET_STRING_LEN -#define SNMP_MAX_OCTET_STRING_LEN 127 -#endif - -/** - * The maximum depth of the SNMP tree. - * With private MIBs enabled, this depends on your MIB! - * This affects the size of MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_TREE_DEPTH -#define SNMP_MAX_TREE_DEPTH 15 -#endif - -/** - * The size of the MEMP_SNMP_VALUE elements, normally calculated from - * SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH. - */ -#ifndef SNMP_MAX_VALUE_SIZE -#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH)) -#endif - -/* - ---------------------------------- - ---------- IGMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_IGMP==1: Turn on IGMP module. - */ -#ifndef LWIP_IGMP -#define LWIP_IGMP 0 -#endif - -/* - ---------------------------------- - ---------- DNS options ----------- - ---------------------------------- -*/ -/** - * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS - * transport. - */ -#ifndef LWIP_DNS -#define LWIP_DNS 0 -#endif - -/** DNS maximum number of entries to maintain locally. */ -#ifndef DNS_TABLE_SIZE -#define DNS_TABLE_SIZE 4 -#endif - -/** DNS maximum host name length supported in the name table. */ -#ifndef DNS_MAX_NAME_LENGTH -#define DNS_MAX_NAME_LENGTH 256 -#endif - -/** The maximum of DNS servers */ -#ifndef DNS_MAX_SERVERS -#define DNS_MAX_SERVERS 2 -#endif - -/** DNS do a name checking between the query and the response. */ -#ifndef DNS_DOES_NAME_CHECK -#define DNS_DOES_NAME_CHECK 1 -#endif - -/** DNS message max. size. Default value is RFC compliant. */ -#ifndef DNS_MSG_SIZE -#define DNS_MSG_SIZE 512 -#endif - -/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, - * you have to define - * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} - * (an array of structs name/address, where address is an u32_t in network - * byte order). - * - * Instead, you can also use an external function: - * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) - * that returns the IP address or INADDR_NONE if not found. - */ -#ifndef DNS_LOCAL_HOSTLIST -#define DNS_LOCAL_HOSTLIST 0 -#endif /* DNS_LOCAL_HOSTLIST */ - -/** If this is turned on, the local host-list can be dynamically changed - * at runtime. */ -#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC -#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 -#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ - -/* - --------------------------------- - ---------- UDP options ---------- - --------------------------------- -*/ -/** - * LWIP_UDP==1: Turn on UDP. - */ -#ifndef LWIP_UDP -#define LWIP_UDP 1 -#endif - -/** - * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) - */ -#ifndef LWIP_UDPLITE -#define LWIP_UDPLITE 0 -#endif - -/** - * UDP_TTL: Default Time-To-Live value. - */ -#ifndef UDP_TTL -#define UDP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. - */ -#ifndef LWIP_NETBUF_RECVINFO -#define LWIP_NETBUF_RECVINFO 0 -#endif - -/* - --------------------------------- - ---------- TCP options ---------- - --------------------------------- -*/ -/** - * LWIP_TCP==1: Turn on TCP. - */ -#ifndef LWIP_TCP -#define LWIP_TCP 1 -#endif - -/** - * TCP_TTL: Default Time-To-Live value. - */ -#ifndef TCP_TTL -#define TCP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * TCP_WND: The size of a TCP window. This must be at least - * (2 * TCP_MSS) for things to work well - */ -#ifndef TCP_WND -#define TCP_WND (4 * TCP_MSS) -#endif - -/** - * TCP_MAXRTX: Maximum number of retransmissions of data segments. - */ -#ifndef TCP_MAXRTX -#define TCP_MAXRTX 12 -#endif - -/** - * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. - */ -#ifndef TCP_SYNMAXRTX -#define TCP_SYNMAXRTX 6 -#endif - -/** - * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. - * Define to 0 if your device is low on memory. - */ -#ifndef TCP_QUEUE_OOSEQ -#define TCP_QUEUE_OOSEQ (LWIP_TCP) -#endif - -/** - * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, - * you might want to increase this.) - * For the receive side, this MSS is advertised to the remote side - * when opening a connection. For the transmit size, this MSS sets - * an upper limit on the MSS advertised by the remote host. - */ -#ifndef TCP_MSS -#define TCP_MSS 536 -#endif - -/** - * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really - * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which - * reflects the available reassembly buffer size at the remote host) and the - * largest size permitted by the IP layer" (RFC 1122) - * Setting this to 1 enables code that checks TCP_MSS against the MTU of the - * netif used for a connection and limits the MSS if it would be too big otherwise. - */ -#ifndef TCP_CALCULATE_EFF_SEND_MSS -#define TCP_CALCULATE_EFF_SEND_MSS 1 -#endif - - -/** - * TCP_SND_BUF: TCP sender buffer space (bytes). - */ -#ifndef TCP_SND_BUF -#define TCP_SND_BUF 256 -#endif - -/** - * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least - * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. - */ -#ifndef TCP_SND_QUEUELEN -#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) -#endif - -/** - * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than - * TCP_SND_BUF. It is the amount of space which must be available in the - * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). - */ -#ifndef TCP_SNDLOWAT -#define TCP_SNDLOWAT ((TCP_SND_BUF)/2) -#endif - -/** - * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be grater - * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below - * this number, select returns writable (combined with TCP_SNDLOWAT). - */ -#ifndef TCP_SNDQUEUELOWAT -#define TCP_SNDQUEUELOWAT ((TCP_SND_QUEUELEN)/2) -#endif - -/** - * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. - */ -#ifndef TCP_LISTEN_BACKLOG -#define TCP_LISTEN_BACKLOG 0 -#endif - -/** - * The maximum allowed backlog for TCP listen netconns. - * This backlog is used unless another is explicitly specified. - * 0xff is the maximum (u8_t). - */ -#ifndef TCP_DEFAULT_LISTEN_BACKLOG -#define TCP_DEFAULT_LISTEN_BACKLOG 0xff -#endif - -/** - * TCP_OVERSIZE: The maximum number of bytes that tcp_write may - * allocate ahead of time in an attempt to create shorter pbuf chains - * for transmission. The meaningful range is 0 to TCP_MSS. Some - * suggested values are: - * - * 0: Disable oversized allocation. Each tcp_write() allocates a new - pbuf (old behaviour). - * 1: Allocate size-aligned pbufs with minimal excess. Use this if your - * scatter-gather DMA requires aligned fragments. - * 128: Limit the pbuf/memory overhead to 20%. - * TCP_MSS: Try to create unfragmented TCP packets. - * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. - */ -#ifndef TCP_OVERSIZE -#define TCP_OVERSIZE TCP_MSS -#endif - -/** - * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. - */ -#ifndef LWIP_TCP_TIMESTAMPS -#define LWIP_TCP_TIMESTAMPS 0 -#endif - -/** - * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an - * explicit window update - */ -#ifndef TCP_WND_UPDATE_THRESHOLD -#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) -#endif - -/** - * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. - * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all - * events (accept, sent, etc) that happen in the system. - * LWIP_CALLBACK_API==1: The PCB callback function is called directly - * for the event. - */ -//#define LWIP_EVENT_API - -/* - ---------------------------------- - ---------- Pbuf options ---------- - ---------------------------------- -*/ -/** - * PBUF_LINK_HLEN: the number of bytes that should be allocated for a - * link level header. The default is 14, the standard value for - * Ethernet. - */ -#ifndef PBUF_LINK_HLEN -#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) -#endif - -/** - * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is - * designed to accomodate single full size TCP frame in one pbuf, including - * TCP_MSS, IP header, and link header. - */ -#ifndef PBUF_POOL_BUFSIZE -#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) -#endif - -/* - ------------------------------------------------ - ---------- Network Interfaces options ---------- - ------------------------------------------------ -*/ -/** - * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname - * field. - */ -#ifndef LWIP_NETIF_HOSTNAME -#define LWIP_NETIF_HOSTNAME 0 -#endif - -/** - * LWIP_NETIF_API==1: Support netif api (in netifapi.c) - */ -#ifndef LWIP_NETIF_API -#define LWIP_NETIF_API 0 -#endif - -/** - * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface - * changes its up/down status (i.e., due to DHCP IP acquistion) - */ -#ifndef LWIP_NETIF_STATUS_CALLBACK -#define LWIP_NETIF_STATUS_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface - * whenever the link changes (i.e., link down) - */ -#ifndef LWIP_NETIF_LINK_CALLBACK -#define LWIP_NETIF_LINK_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table - * indices) in struct netif. TCP and UDP can make use of this to prevent - * scanning the ARP table for every sent packet. While this is faster for big - * ARP tables or many concurrent connections, it might be counterproductive - * if you have a tiny ARP table or if there never are concurrent connections. - */ -#ifndef LWIP_NETIF_HWADDRHINT -#define LWIP_NETIF_HWADDRHINT 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP - * address equal to the netif IP address, looping them back up the stack. - */ -#ifndef LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 0 -#endif - -/** - * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback - * sending for each netif (0 = disabled) - */ -#ifndef LWIP_LOOPBACK_MAX_PBUFS -#define LWIP_LOOPBACK_MAX_PBUFS 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in - * the system, as netifs must change how they behave depending on this setting - * for the LWIP_NETIF_LOOPBACK option to work. - * Setting this is needed to avoid reentering non-reentrant functions like - * tcp_input(). - * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a - * multithreaded environment like tcpip.c. In this case, netif->input() - * is called directly. - * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. - * The packets are put on a list and netif_poll() must be called in - * the main application loop. - */ -#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING -#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) -#endif - -/** - * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data - * to be sent into one single pbuf. This is for compatibility with DMA-enabled - * MACs that do not support scatter-gather. - * Beware that this might involve CPU-memcpy before transmitting that would not - * be needed without this flag! Use this only if you need to! - * - * @todo: TCP and IP-frag do not work with this, yet: - */ -#ifndef LWIP_NETIF_TX_SINGLE_PBUF -#define LWIP_NETIF_TX_SINGLE_PBUF 0 -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - -/* - ------------------------------------ - ---------- LOOPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c - */ -#ifndef LWIP_HAVE_LOOPIF -#define LWIP_HAVE_LOOPIF 0 -#endif - -/* - ------------------------------------ - ---------- SLIPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c - */ -#ifndef LWIP_HAVE_SLIPIF -#define LWIP_HAVE_SLIPIF 0 -#endif - -/* - ------------------------------------ - ---------- Thread options ---------- - ------------------------------------ -*/ -/** - * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. - */ -#ifndef TCPIP_THREAD_NAME -#define TCPIP_THREAD_NAME "tcpip_thread" -#endif - -/** - * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_STACKSIZE -#define TCPIP_THREAD_STACKSIZE 1024 -#endif - -/** - * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_PRIO -#define TCPIP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when tcpip_init is called. - */ -#ifndef TCPIP_MBOX_SIZE -#define TCPIP_MBOX_SIZE 4 -#endif - -/** - * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. - */ -#ifndef SLIPIF_THREAD_NAME -#define SLIPIF_THREAD_NAME "slipif_loop" -#endif - -/** - * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_STACKSIZE -#define SLIPIF_THREAD_STACKSIZE 1024 -#endif - -/** - * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_PRIO -#define SLIPIF_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * PPP_THREAD_NAME: The name assigned to the pppInputThread. - */ -#ifndef PPP_THREAD_NAME -#define PPP_THREAD_NAME "pppInputThread" -#endif - -/** - * PPP_THREAD_STACKSIZE: The stack size used by the pppInputThread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_STACKSIZE -#define PPP_THREAD_STACKSIZE 1024 -#endif - -/** - * PPP_THREAD_PRIO: The priority assigned to the pppInputThread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_PRIO -#define PPP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. - */ -#ifndef DEFAULT_THREAD_NAME -#define DEFAULT_THREAD_NAME "lwIP" -#endif - -/** - * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_STACKSIZE -#define DEFAULT_THREAD_STACKSIZE 1024 -#endif - -/** - * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_PRIO -#define DEFAULT_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_RAW_RECVMBOX_SIZE -#define DEFAULT_RAW_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_UDP_RECVMBOX_SIZE -#define DEFAULT_UDP_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_TCP_RECVMBOX_SIZE -#define DEFAULT_TCP_RECVMBOX_SIZE 40 -#endif - -/** - * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when the acceptmbox is created. - */ -#ifndef DEFAULT_ACCEPTMBOX_SIZE -#define DEFAULT_ACCEPTMBOX_SIZE 4 -#endif - -/* - ---------------------------------------------- - ---------- Sequential layer options ---------- - ---------------------------------------------- -*/ -/** - * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING -#define LWIP_TCPIP_CORE_LOCKING 0 -#endif - -/** - * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT -#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 -#endif - -/** - * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) - */ -#ifndef LWIP_NETCONN -#define LWIP_NETCONN 1 -#endif - -/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout tod create - * timers running in tcpip_thread from another thread. - */ -#ifndef LWIP_TCPIP_TIMEOUT -#define LWIP_TCPIP_TIMEOUT 1 -#endif - -/* - ------------------------------------ - ---------- Socket options ---------- - ------------------------------------ -*/ -/** - * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) - */ -#ifndef LWIP_SOCKET -#define LWIP_SOCKET 1 -#endif - -/** - * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. - * (only used if you use sockets.c) - */ -#ifndef LWIP_COMPAT_SOCKETS -#define LWIP_COMPAT_SOCKETS 1 -#endif - -/** - * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. - * Disable this option if you use a POSIX operating system that uses the same - * names (read, write & close). (only used if you use sockets.c) - */ -#ifndef LWIP_POSIX_SOCKETS_IO_NAMES -#define LWIP_POSIX_SOCKETS_IO_NAMES 1 -#endif - -/** - * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT - * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set - * in seconds. (does not require sockets.c, and will affect tcp.c) - */ -#ifndef LWIP_TCP_KEEPALIVE -#define LWIP_TCP_KEEPALIVE 0 -#endif - -/** - * LWIP_SO_RCVTIMEO==1: Enable SO_RCVTIMEO processing. - */ -#ifndef LWIP_SO_RCVTIMEO -#define LWIP_SO_RCVTIMEO 0 -#endif - -/** - * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. - */ -#ifndef LWIP_SO_RCVBUF -#define LWIP_SO_RCVBUF 0 -#endif - -/** - * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. - */ -#ifndef RECV_BUFSIZE_DEFAULT -#define RECV_BUFSIZE_DEFAULT INT_MAX -#endif - -/** - * SO_REUSE==1: Enable SO_REUSEADDR option. - */ -#ifndef SO_REUSE -#define SO_REUSE 0 -#endif - -/** - * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets - * to all local matches if SO_REUSEADDR is turned on. - * WARNING: Adds a memcpy for every packet if passing to more than one pcb! - */ -#ifndef SO_REUSE_RXTOALL -#define SO_REUSE_RXTOALL 0 -#endif - -/* - ---------------------------------------- - ---------- Statistics options ---------- - ---------------------------------------- -*/ -/** - * LWIP_STATS==1: Enable statistics collection in lwip_stats. - */ -#ifndef LWIP_STATS -#define LWIP_STATS 1 -#endif - -#if LWIP_STATS - -/** - * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. - */ -#ifndef LWIP_STATS_DISPLAY -#define LWIP_STATS_DISPLAY 0 -#endif - -/** - * LINK_STATS==1: Enable link stats. - */ -#ifndef LINK_STATS -#define LINK_STATS 1 -#endif - -/** - * ETHARP_STATS==1: Enable etharp stats. - */ -#ifndef ETHARP_STATS -#define ETHARP_STATS (LWIP_ARP) -#endif - -/** - * IP_STATS==1: Enable IP stats. - */ -#ifndef IP_STATS -#define IP_STATS 1 -#endif - -/** - * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is - * on if using either frag or reass. - */ -#ifndef IPFRAG_STATS -#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) -#endif - -/** - * ICMP_STATS==1: Enable ICMP stats. - */ -#ifndef ICMP_STATS -#define ICMP_STATS 1 -#endif - -/** - * IGMP_STATS==1: Enable IGMP stats. - */ -#ifndef IGMP_STATS -#define IGMP_STATS (LWIP_IGMP) -#endif - -/** - * UDP_STATS==1: Enable UDP stats. Default is on if - * UDP enabled, otherwise off. - */ -#ifndef UDP_STATS -#define UDP_STATS (LWIP_UDP) -#endif - -/** - * TCP_STATS==1: Enable TCP stats. Default is on if TCP - * enabled, otherwise off. - */ -#ifndef TCP_STATS -#define TCP_STATS (LWIP_TCP) -#endif - -/** - * MEM_STATS==1: Enable mem.c stats. - */ -#ifndef MEM_STATS -#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) -#endif - -/** - * MEMP_STATS==1: Enable memp.c pool stats. - */ -#ifndef MEMP_STATS -#define MEMP_STATS (MEMP_MEM_MALLOC == 0) -#endif - -/** - * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). - */ -#ifndef SYS_STATS -#define SYS_STATS (NO_SYS == 0) -#endif - -#else - -#define LINK_STATS 0 -#define IP_STATS 0 -#define IPFRAG_STATS 0 -#define ICMP_STATS 0 -#define IGMP_STATS 0 -#define UDP_STATS 0 -#define TCP_STATS 0 -#define MEM_STATS 0 -#define MEMP_STATS 0 -#define SYS_STATS 0 -#define LWIP_STATS_DISPLAY 0 - -#endif /* LWIP_STATS */ - -/* - --------------------------------- - ---------- PPP options ---------- - --------------------------------- -*/ -/** - * PPP_SUPPORT==1: Enable PPP. - */ -#ifndef PPP_SUPPORT -#define PPP_SUPPORT 0 -#endif - -/** - * PPPOE_SUPPORT==1: Enable PPP Over Ethernet - */ -#ifndef PPPOE_SUPPORT -#define PPPOE_SUPPORT 0 -#endif - -/** - * PPPOS_SUPPORT==1: Enable PPP Over Serial - */ -#ifndef PPPOS_SUPPORT -#define PPPOS_SUPPORT PPP_SUPPORT -#endif - -#if PPP_SUPPORT - -/** - * NUM_PPP: Max PPP sessions. - */ -#ifndef NUM_PPP -#define NUM_PPP 1 -#endif - -/** - * PAP_SUPPORT==1: Support PAP. - */ -#ifndef PAP_SUPPORT -#define PAP_SUPPORT 0 -#endif - -/** - * CHAP_SUPPORT==1: Support CHAP. - */ -#ifndef CHAP_SUPPORT -#define CHAP_SUPPORT 0 -#endif - -/** - * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef MSCHAP_SUPPORT -#define MSCHAP_SUPPORT 0 -#endif - -/** - * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CBCP_SUPPORT -#define CBCP_SUPPORT 0 -#endif - -/** - * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CCP_SUPPORT -#define CCP_SUPPORT 0 -#endif - -/** - * VJ_SUPPORT==1: Support VJ header compression. - */ -#ifndef VJ_SUPPORT -#define VJ_SUPPORT 0 -#endif - -/** - * MD5_SUPPORT==1: Support MD5 (see also CHAP). - */ -#ifndef MD5_SUPPORT -#define MD5_SUPPORT 0 -#endif - -/* - * Timeouts - */ -#ifndef FSM_DEFTIMEOUT -#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef FSM_DEFMAXTERMREQS -#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXCONFREQS -#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXNAKLOOPS -#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ -#endif - -#ifndef UPAP_DEFTIMEOUT -#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ -#endif - -#ifndef UPAP_DEFREQTIME -#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ -#endif - -#ifndef CHAP_DEFTIMEOUT -#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef CHAP_DEFTRANSMITS -#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ -#endif - -/* Interval in seconds between keepalive echo requests, 0 to disable. */ -#ifndef LCP_ECHOINTERVAL -#define LCP_ECHOINTERVAL 0 -#endif - -/* Number of unanswered echo requests before failure. */ -#ifndef LCP_MAXECHOFAILS -#define LCP_MAXECHOFAILS 3 -#endif - -/* Max Xmit idle time (in jiffies) before resend flag char. */ -#ifndef PPP_MAXIDLEFLAG -#define PPP_MAXIDLEFLAG 100 -#endif - -/* - * Packet sizes - * - * Note - lcp shouldn't be allowed to negotiate stuff outside these - * limits. See lcp.h in the pppd directory. - * (XXX - these constants should simply be shared by lcp.c instead - * of living in lcp.h) - */ -#define PPP_MTU 1500 /* Default MTU (size of Info field) */ -#ifndef PPP_MAXMTU -/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ -#define PPP_MAXMTU 1500 /* Largest MTU we allow */ -#endif -#define PPP_MINMTU 64 -#define PPP_MRU 1500 /* default MRU = max length of info field */ -#define PPP_MAXMRU 1500 /* Largest MRU we allow */ -#ifndef PPP_DEFMRU -#define PPP_DEFMRU 296 /* Try for this */ -#endif -#define PPP_MINMRU 128 /* No MRUs below this */ - -#ifndef MAXNAMELEN -#define MAXNAMELEN 256 /* max length of hostname or name for auth */ -#endif -#ifndef MAXSECRETLEN -#define MAXSECRETLEN 256 /* max length of password or secret */ -#endif - -#endif /* PPP_SUPPORT */ - -/* - -------------------------------------- - ---------- Checksum options ---------- - -------------------------------------- -*/ -/** - * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. - */ -#ifndef CHECKSUM_GEN_IP -#define CHECKSUM_GEN_IP 1 -#endif - -/** - * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. - */ -#ifndef CHECKSUM_GEN_UDP -#define CHECKSUM_GEN_UDP 1 -#endif - -/** - * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. - */ -#ifndef CHECKSUM_GEN_TCP -#define CHECKSUM_GEN_TCP 1 -#endif - -/** - * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. - */ -#ifndef CHECKSUM_CHECK_IP -#define CHECKSUM_CHECK_IP 1 -#endif - -/** - * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. - */ -#ifndef CHECKSUM_CHECK_UDP -#define CHECKSUM_CHECK_UDP 1 -#endif - -/** - * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. - */ -#ifndef CHECKSUM_CHECK_TCP -#define CHECKSUM_CHECK_TCP 1 -#endif - -/** - * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from - * application buffers to pbufs. - */ -#ifndef LWIP_CHECKSUM_ON_COPY -#define LWIP_CHECKSUM_ON_COPY 0 -#endif - -/* - --------------------------------------- - ---------- Debugging options ---------- - --------------------------------------- -*/ -/** - * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is - * compared against this value. If it is smaller, then debugging - * messages are written. - */ -#ifndef LWIP_DBG_MIN_LEVEL -#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF -#endif - -/** - * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable - * debug messages of certain types. - */ -#ifndef LWIP_DBG_TYPES_ON -#define LWIP_DBG_TYPES_ON LWIP_DBG_ON -#endif - -/** - * ETHARP_DEBUG: Enable debugging in etharp.c. - */ -#ifndef ETHARP_DEBUG -#define ETHARP_DEBUG LWIP_DBG_OFF -#endif - -/** - * NETIF_DEBUG: Enable debugging in netif.c. - */ -#ifndef NETIF_DEBUG -#define NETIF_DEBUG LWIP_DBG_OFF -#endif - -/** - * PBUF_DEBUG: Enable debugging in pbuf.c. - */ -#ifndef PBUF_DEBUG -#define PBUF_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_LIB_DEBUG: Enable debugging in api_lib.c. - */ -#ifndef API_LIB_DEBUG -#define API_LIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_MSG_DEBUG: Enable debugging in api_msg.c. - */ -#ifndef API_MSG_DEBUG -#define API_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SOCKETS_DEBUG: Enable debugging in sockets.c. - */ -#ifndef SOCKETS_DEBUG -#define SOCKETS_DEBUG LWIP_DBG_OFF -#endif - -/** - * ICMP_DEBUG: Enable debugging in icmp.c. - */ -#ifndef ICMP_DEBUG -#define ICMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IGMP_DEBUG: Enable debugging in igmp.c. - */ -#ifndef IGMP_DEBUG -#define IGMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * INET_DEBUG: Enable debugging in inet.c. - */ -#ifndef INET_DEBUG -#define INET_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_DEBUG: Enable debugging for IP. - */ -#ifndef IP_DEBUG -#define IP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. - */ -#ifndef IP_REASS_DEBUG -#define IP_REASS_DEBUG LWIP_DBG_OFF -#endif - -/** - * RAW_DEBUG: Enable debugging in raw.c. - */ -#ifndef RAW_DEBUG -#define RAW_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEM_DEBUG: Enable debugging in mem.c. - */ -#ifndef MEM_DEBUG -#define MEM_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEMP_DEBUG: Enable debugging in memp.c. - */ -#ifndef MEMP_DEBUG -#define MEMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SYS_DEBUG: Enable debugging in sys.c. - */ -#ifndef SYS_DEBUG -#define SYS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TIMERS_DEBUG: Enable debugging in timers.c. - */ -#ifndef TIMERS_DEBUG -#define TIMERS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_DEBUG: Enable debugging for TCP. - */ -#ifndef TCP_DEBUG -#define TCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. - */ -#ifndef TCP_INPUT_DEBUG -#define TCP_INPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. - */ -#ifndef TCP_FR_DEBUG -#define TCP_FR_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit - * timeout. - */ -#ifndef TCP_RTO_DEBUG -#define TCP_RTO_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. - */ -#ifndef TCP_CWND_DEBUG -#define TCP_CWND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. - */ -#ifndef TCP_WND_DEBUG -#define TCP_WND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. - */ -#ifndef TCP_OUTPUT_DEBUG -#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. - */ -#ifndef TCP_RST_DEBUG -#define TCP_RST_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. - */ -#ifndef TCP_QLEN_DEBUG -#define TCP_QLEN_DEBUG LWIP_DBG_OFF -#endif - -/** - * UDP_DEBUG: Enable debugging in UDP. - */ -#ifndef UDP_DEBUG -#define UDP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCPIP_DEBUG: Enable debugging in tcpip.c. - */ -#ifndef TCPIP_DEBUG -#define TCPIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * PPP_DEBUG: Enable debugging for PPP. - */ -#ifndef PPP_DEBUG -#define PPP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SLIP_DEBUG: Enable debugging in slipif.c. - */ -#ifndef SLIP_DEBUG -#define SLIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * DHCP_DEBUG: Enable debugging in dhcp.c. - */ -#ifndef DHCP_DEBUG -#define DHCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * AUTOIP_DEBUG: Enable debugging in autoip.c. - */ -#ifndef AUTOIP_DEBUG -#define AUTOIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. - */ -#ifndef SNMP_MSG_DEBUG -#define SNMP_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. - */ -#ifndef SNMP_MIB_DEBUG -#define SNMP_MIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * DNS_DEBUG: Enable debugging for DNS. - */ -#ifndef DNS_DEBUG -#define DNS_DEBUG LWIP_DBG_OFF -#endif - -#endif /* __LWIPOPT_H__ */ diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c b/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c deleted file mode 100644 index 882a3104b9..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/main.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "lwipthread.h" -#include "web/web.h" - -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *p) { - - (void)p; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(100); - palClearPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(900); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Creates the LWIP threads (it changes priority internally). - */ - chThdCreateStatic(wa_lwip_thread, LWIP_THREAD_STACK_SIZE, NORMALPRIO + 1, - lwip_thread, NULL); - - /* - * Creates the HTTP thread (it changes priority internally). - */ - chThdCreateStatic(wa_http_server, sizeof(wa_http_server), NORMALPRIO + 1, - http_server, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - if (!palReadPad(IOPORT2, PIOB_SW1)) - sdWrite(&SD1, (uint8_t *)"Hello World!\r\n", 14); - if (!palReadPad(IOPORT2, PIOB_SW2)) - TestThread(&SD1); - } - - return 0; -} diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/mcuconf.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/mcuconf.h deleted file mode 100644 index 73aa7b7771..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/mcuconf.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AT91SAM7 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ -#define MAC_TRANSMIT_BUFFERS 2 -#define MAC_RECEIVE_BUFFERS 2 -#define MAC_BUFFERS_SIZE 1518 -#define EMAC_INTERRUPT_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 3) - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_SAM7_USART0 TRUE -#define USE_SAM7_USART1 TRUE -#define SAM7_USART0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#define SAM7_USART1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) - -/* - * SPI driver system settings. - */ -#define USE_AT91SAM7_SPI FALSE -#define AT91SAM7_SPI_USE_SPI0 TRUE -#define AT91SAM7_SPI_USE_SPI1 FALSE -#define AT91SAM7_SPI0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) -#define AT91SAM7_SPI1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt b/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt deleted file mode 100644 index 14495cc0cf..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/readme.txt +++ /dev/null @@ -1,34 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM7TDMI AT91SAM7X256. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex SAM7-EX256 board. - -** The Demo ** - -The demo currently just flashes the LCD background using a thread and serves -HTTP requests at address 192.168.1.20 on port 80 (remember to change it IP -address into web.c in order to adapt it to your network settings). -The button SW1 prints an "Hello World!" string on COM1, the button SW2 -activates che ChibiOS/RT test suite, output on COM1. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. -The demo requires the lwIP 1.3.1 stack, included in ./ext - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are Atmel copyright -and are licensed under a different license, see the header present in all the -source files under ./demos/os/hal/platform/AT91SAM7/at91lib for details. -Also note that not all the files present in the Atmel library are distribuited -with ChibiOS/RT, you can find the whole library on the Atmel web site: - - http://www.atmel.com - -The lwIP stack also has its own license, please read the info into the included -lwIP distribution files. diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c b/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c deleted file mode 100644 index 3a4a9b4f37..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * This file is a modified version of the lwIP web server demo. The original - * author is unknown because the file didn't contain any license information. - */ - -/** - * @file web.c - * @brief HTTP server wrapper thread code. - * @addtogroup WEB_THREAD - * @{ - */ - -#include "ch.h" - -#include "lwip/opt.h" -#include "lwip/arch.h" -#include "lwip/api.h" - -#include "web.h" - -#if LWIP_NETCONN - -static const char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; -static const char http_index_html[] = "Congrats!

Welcome to our lwIP HTTP server!

This is a small test page."; - -static void http_server_serve(struct netconn *conn) { - struct netbuf *inbuf; - char *buf; - u16_t buflen; - err_t err; - - /* Read the data from the port, blocking if nothing yet there. - We assume the request (the part we care about) is in one netbuf */ - err = netconn_recv(conn, &inbuf); - - if (err == ERR_OK) { - netbuf_data(inbuf, (void **)&buf, &buflen); - - /* Is this an HTTP GET command? (only check the first 5 chars, since - there are other formats for GET, and we're keeping it very simple )*/ - if (buflen>=5 && - buf[0]=='G' && - buf[1]=='E' && - buf[2]=='T' && - buf[3]==' ' && - buf[4]=='/' ) { - - /* Send the HTML header - * subtract 1 from the size, since we dont send the \0 in the string - * NETCONN_NOCOPY: our data is const static, so no need to copy it - */ - netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY); - - /* Send our HTML page */ - netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY); - } - } - /* Close the connection (server closes in HTTP) */ - netconn_close(conn); - - /* Delete the buffer (netconn_recv gives us ownership, - so we have to make sure to deallocate the buffer) */ - netbuf_delete(inbuf); -} - -/** - * Stack area for the http thread. - */ -WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -/** - * HTTP server thread. - */ -msg_t http_server(void *p) { - struct netconn *conn, *newconn; - err_t err; - - (void)p; - - /* Create a new TCP connection handle */ - conn = netconn_new(NETCONN_TCP); - LWIP_ERROR("http_server: invalid conn", (conn != NULL), return RDY_RESET;); - - /* Bind to port 80 (HTTP) with default IP address */ - netconn_bind(conn, NULL, WEB_THREAD_PORT); - - /* Put the connection into LISTEN state */ - netconn_listen(conn); - - /* Goes to the final priority after initialization.*/ - chThdSetPriority(WEB_THREAD_PRIORITY); - - while(1) { - err = netconn_accept(conn, &newconn); - if (err != ERR_OK) - continue; - http_server_serve(newconn); - netconn_delete(newconn); - } - return RDY_OK; -} - -#endif /* LWIP_NETCONN */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h b/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h deleted file mode 100644 index 64c217afa3..0000000000 --- a/demos/ARM7-AT91SAM7X-LWIP-GCC/web/web.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file web.h - * @brief HTTP server wrapper thread macros and structures. - * @addtogroup WEB_THREAD - * @{ - */ - -#ifndef _WEB_H_ -#define _WEB_H_ - -#ifndef WEB_THREAD_STACK_SIZE -#define WEB_THREAD_STACK_SIZE 1024 -#endif - -#ifndef WEB_THREAD_PORT -#define WEB_THREAD_PORT 80 -#endif - -#ifndef WEB_THREAD_PRIORITY -#define WEB_THREAD_PRIORITY (LOWPRIO + 2) -#endif - -extern WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -#ifdef __cplusplus -extern "C" { -#endif - msg_t http_server(void *p); -#ifdef __cplusplus -} -#endif - -#endif /* _WEB_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/Makefile b/demos/ARM7-AT91SAM7X-UIP-GCC/Makefile deleted file mode 100644 index 09d89a9aad..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/Makefile +++ /dev/null @@ -1,203 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_SAM7_EX256/board.mk -include $(CHIBIOS)/os/hal/platforms/AT91SAM7/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/AT91SAM7/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/AT91SAM7X256.ld - -# List of the required uIP source files. -USRC = $(CHIBIOS)/ext/uip-1.0/uip/uip_arp.c \ - $(CHIBIOS)/ext/uip-1.0/uip/psock.c \ - $(CHIBIOS)/ext/uip-1.0/uip/uip.c \ - $(CHIBIOS)/ext/uip-1.0/apps/webserver/httpd.c \ - $(CHIBIOS)/ext/uip-1.0/apps/webserver/http-strings.c \ - $(CHIBIOS)/ext/uip-1.0/apps/webserver/httpd-fs.c \ - $(CHIBIOS)/ext/uip-1.0/apps/webserver/httpd-cgi.c - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(USRC) \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/evtimer.c \ - web/webthread.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various \ - $(CHIBIOS)/ext/uip-1.0/uip \ - $(CHIBIOS)/ext/uip-1.0/apps/webserver \ - ./web - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/chconf.h b/demos/ARM7-AT91SAM7X-UIP-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/halconf.h b/demos/ARM7-AT91SAM7X-UIP-GCC/halconf.h deleted file mode 100644 index 29957bd6d9..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC TRUE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/main.c b/demos/ARM7-AT91SAM7X-UIP-GCC/main.c deleted file mode 100644 index 2688d88113..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/main.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "web/webthread.h" - -static WORKING_AREA(waWebThread, 1024); - -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *p) { - - (void)p; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(100); - palClearPad(IOPORT2, PIOB_LCD_BL); - chThdSleepMilliseconds(900); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Creates the blinker and web server threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waWebThread, sizeof(waWebThread), LOWPRIO, WebThread, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - if (!palReadPad(IOPORT2, PIOB_SW1)) - sdWrite(&SD1, (uint8_t *)"Hello World!\r\n", 14); - if (!palReadPad(IOPORT2, PIOB_SW2)) - TestThread(&SD1); - } - - return 0; -} diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/mcuconf.h b/demos/ARM7-AT91SAM7X-UIP-GCC/mcuconf.h deleted file mode 100644 index 73aa7b7771..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/mcuconf.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AT91SAM7 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ -#define MAC_TRANSMIT_BUFFERS 2 -#define MAC_RECEIVE_BUFFERS 2 -#define MAC_BUFFERS_SIZE 1518 -#define EMAC_INTERRUPT_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 3) - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_SAM7_USART0 TRUE -#define USE_SAM7_USART1 TRUE -#define SAM7_USART0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#define SAM7_USART1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) - -/* - * SPI driver system settings. - */ -#define USE_AT91SAM7_SPI FALSE -#define AT91SAM7_SPI_USE_SPI0 TRUE -#define AT91SAM7_SPI_USE_SPI1 FALSE -#define AT91SAM7_SPI0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) -#define AT91SAM7_SPI1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/readme.txt b/demos/ARM7-AT91SAM7X-UIP-GCC/readme.txt deleted file mode 100644 index 9d3b84e973..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/readme.txt +++ /dev/null @@ -1,34 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM7TDMI AT91SAM7X256. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex SAM7-EX256 board. - -** The Demo ** - -The demo currently just flashes the LCD background using a thread and serves -HTTP requests at address 192.168.1.20 on port 80 (remember to change it IP -address into webthread.c in order to adapt it to your network settings). -The button SW1 prints an "Hello World!" string on COM1, the button SW2 -activates che ChibiOS/RT test suite, output on COM1. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. -The demo requires the patcher uIP 1.0 stack, see: ./ext/readme.txt - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are Atmel copyright -and are licensed under a different license, see the header present in all the -source files under ./demos/os/hal/platform/AT91SAM7/at91lib for details. -Also note that not all the files present in the Atmel library are distribuited -with ChibiOS/RT, you can find the whole library on the Atmel web site: - - http://www.atmel.com - -The uIP stack also has its own license, please read the info into the included -uIP distribution files. diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/web/cc-arch.h b/demos/ARM7-AT91SAM7X-UIP-GCC/web/cc-arch.h deleted file mode 100644 index 744cf56ef8..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/web/cc-arch.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __CC_ARCH_H__ -#define __CC_ARCH_H__ - -#define PACK_STRUCT_FIELD(x) x __attribute__((packed)) -#define PACK_STRUCT_STRUCT __attribute__((packed)) -#define PACK_STRUCT_BEGIN -#define PACK_STRUCT_END - -#endif /* __CC_ARCH_H__ */ diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/web/clock-arch.h b/demos/ARM7-AT91SAM7X-UIP-GCC/web/clock-arch.h deleted file mode 100644 index e205f9c8d8..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/web/clock-arch.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2006, 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 uIP TCP/IP stack - * - * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ - */ - -#ifndef __CLOCK_ARCH_H__ -#define __CLOCK_ARCH_H__ - -#include - -typedef systime_t clock_time_t; -#define CLOCK_CONF_SECOND CH_FREQUENCY - -#endif /* __CLOCK_ARCH_H__ */ diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/web/uip-conf.h b/demos/ARM7-AT91SAM7X-UIP-GCC/web/uip-conf.h deleted file mode 100644 index b6a17c9707..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/web/uip-conf.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * \addtogroup uipopt - * @{ - */ - -/** - * \name Project-specific configuration options - * @{ - * - * uIP has a number of configuration options that can be overridden - * for each project. These are kept in a project-specific uip-conf.h - * file and all configuration names have the prefix UIP_CONF. - */ - -/* - * Copyright (c) 2006, 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 uIP TCP/IP stack - * - * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ - */ - -/** - * \file - * An example uIP configuration file - * \author - * Adam Dunkels - */ - -#ifndef __UIP_CONF_H__ -#define __UIP_CONF_H__ - -#include - -#include /* patched */ - -/** - * 8 bit datatype - * - * This typedef defines the 8-bit type used throughout uIP. - * - * \hideinitializer - */ -typedef uint8_t u8_t; - -/** - * 16 bit datatype - * - * This typedef defines the 16-bit type used throughout uIP. - * - * \hideinitializer - */ -typedef uint16_t u16_t; - -/** - * Statistics datatype - * - * This typedef defines the dataype used for keeping statistics in - * uIP. - * - * \hideinitializer - */ -typedef unsigned short uip_stats_t; - -/** - * Maximum number of TCP connections. - * - * \hideinitializer - */ -#define UIP_CONF_MAX_CONNECTIONS 40 - -/** - * Maximum number of listening TCP ports. - * - * \hideinitializer - */ -#define UIP_CONF_MAX_LISTENPORTS 40 - -/** - * uIP buffer size. - * - * \hideinitializer - */ -#define UIP_CONF_BUFFER_SIZE 1518 - -/** - * CPU byte order. - * - * \hideinitializer - */ -#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN - -/** - * Logging on or off - * - * \hideinitializer - */ -#define UIP_CONF_LOGGING 0 - -/** - * UDP support on or off - * - * \hideinitializer - */ -#define UIP_CONF_UDP 0 - -/** - * UDP checksums on or off - * - * \hideinitializer - */ -#define UIP_CONF_UDP_CHECKSUMS 1 - -/** - * uIP statistics on or off - * - * \hideinitializer - */ -#define UIP_CONF_STATISTICS 1 - -/* Here we include the header file for the application(s) we use in - our project. */ -/*#include "smtp.h"*/ -/*#include "hello-world.h"*/ -/*#include "telnetd.h"*/ -#include "webserver.h" -/*#include "dhcpc.h"*/ -/*#include "resolv.h"*/ -/*#include "webclient.h"*/ - -#endif /* __UIP_CONF_H__ */ - -/** @} */ -/** @} */ diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c b/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c deleted file mode 100644 index 50e855eb9a..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" -#include "evtimer.h" - -#include "uip.h" -#include "uip_arp.h" -#include "httpd.h" -#include "clock-arch.h" - -#define IPADDR0 192 -#define IPADDR1 168 -#define IPADDR2 1 -#define IPADDR3 20 - -#define SEND_TIMEOUT 50 - -static const struct uip_eth_addr macaddr = { - {0xC2, 0xAF, 0x51, 0x03, 0xCF, 0x46} -}; - -static const MACConfig mac_config = {macaddr.addr}; - -#define BUF ((struct uip_eth_hdr *)&uip_buf[0]) - -/* - * uIP send function wrapping the EMAC functions. - */ -static void network_device_send(void) { - MACTransmitDescriptor td; - - if (macWaitTransmitDescriptor(ÐD1, &td, MS2ST(SEND_TIMEOUT)) == RDY_OK) { - if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) - macWriteTransmitDescriptor(&td, uip_buf, uip_len); - else { - macWriteTransmitDescriptor(&td, uip_buf, UIP_LLH_LEN + UIP_TCPIP_HLEN); - macWriteTransmitDescriptor(&td, uip_appdata, - uip_len - (UIP_LLH_LEN + UIP_TCPIP_HLEN)); - } - macReleaseTransmitDescriptor(&td); - } - /* Dropped... */ -} - -/* - * uIP receive function wrapping the EMAC function. - */ -static size_t network_device_read(void) { - MACReceiveDescriptor rd; - size_t size; - - if (macWaitReceiveDescriptor(ÐD1, &rd, TIME_IMMEDIATE) != RDY_OK) - return 0; - size = rd.size; - macReadReceiveDescriptor(&rd, uip_buf, size); - macReleaseReceiveDescriptor(&rd); - return size; -} - -void clock_init(void) {} - -clock_time_t clock_time( void ) -{ - return chTimeNow(); -} - -/* - * TCP/IP periodic timer. - */ -static void PeriodicTimerHandler(eventid_t id) { - int i; - - (void)id; - for (i = 0; i < UIP_CONNS; i++) { - uip_periodic(i); - if (uip_len > 0) { - uip_arp_out(); - network_device_send(); - } - } -} - -/* - * ARP periodic timer. - */ -static void ARPTimerHandler(eventid_t id) { - - (void)id; - (void)macPollLinkStatus(ÐD1); - uip_arp_timer(); -} - -/* - * Ethernet frame received. - */ -static void FrameReceivedHandler(eventid_t id) { - - (void)id; - while ((uip_len = network_device_read()) > 0) { - if (BUF->type == HTONS(UIP_ETHTYPE_IP)) { - uip_arp_ipin(); - uip_input(); - if (uip_len > 0) { - uip_arp_out(); - network_device_send(); - } - } - else if (BUF->type == HTONS(UIP_ETHTYPE_ARP)) { - uip_arp_arpin(); - if (uip_len > 0) - network_device_send(); - } - } -} - -#define FRAME_RECEIVED_ID 0 -#define PERIODIC_TIMER_ID 1 -#define ARP_TIMER_ID 2 - -static const evhandler_t evhndl[] = { - FrameReceivedHandler, - PeriodicTimerHandler, - ARPTimerHandler -}; - -msg_t WebThread(void *p) { - EvTimer evt1, evt2; - EventListener el0, el1, el2; - uip_ipaddr_t ipaddr; - - (void)p; - - /* - * Event sources setup. - */ - chEvtRegister(macGetReceiveEventSource(ÐD1), &el0, FRAME_RECEIVED_ID); - chEvtAddFlags(EVENT_MASK(FRAME_RECEIVED_ID)); /* In case some frames are already buffered */ - - evtInit(&evt1, MS2ST(500)); - evtStart(&evt1); - chEvtRegister(&evt1.et_es, &el1, PERIODIC_TIMER_ID); - - evtInit(&evt2, S2ST(10)); - evtStart(&evt2); - chEvtRegister(&evt2.et_es, &el2, ARP_TIMER_ID); - - /* - * EMAC driver start. - */ - macStart(ÐD1, &mac_config); - (void)macPollLinkStatus(ÐD1); - - /* - * uIP initialization. - */ - uip_init(); - uip_setethaddr(macaddr); - uip_ipaddr(ipaddr, IPADDR0, IPADDR1, IPADDR2, IPADDR3); - uip_sethostaddr(ipaddr); - httpd_init(); - - while (TRUE) { - chEvtDispatch(evhndl, chEvtWaitOne(ALL_EVENTS)); - } - return 0; -} diff --git a/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.h b/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.h deleted file mode 100644 index 302666b8d0..0000000000 --- a/demos/ARM7-AT91SAM7X-UIP-GCC/web/webthread.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _WEBTHREAD_H_ -#define _WEBTHREAD_H_ - -#ifdef __cplusplus -extern "C" { -#endif - msg_t WebThread(void *p); - #ifdef __cplusplus -} -#endif - -#endif /* _WEBTHREAD_H_ */ diff --git a/demos/ARM7-LPC214x-FATFS-GCC/Makefile b/demos/ARM7-LPC214x-FATFS-GCC/Makefile deleted file mode 100644 index a0eaaffb72..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/Makefile +++ /dev/null @@ -1,193 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_LPC_P2148/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC214x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/LPC214x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC2148.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(TESTSRC) \ - ${BOARDPATH}/buzzer.c \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-LPC214x-FATFS-GCC/chconf.h b/demos/ARM7-LPC214x-FATFS-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-LPC214x-FATFS-GCC/ffconf.h b/demos/ARM7-LPC214x-FATFS-GCC/ffconf.h deleted file mode 100644 index e6a13cea3a..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 1 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/demos/ARM7-LPC214x-FATFS-GCC/halconf.h b/demos/ARM7-LPC214x-FATFS-GCC/halconf.h deleted file mode 100644 index fe761053d3..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-LPC214x-FATFS-GCC/main.c b/demos/ARM7-LPC214x-FATFS-GCC/main.c deleted file mode 100644 index 49ea78e6cc..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/main.c +++ /dev/null @@ -1,368 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "chprintf.h" -#include "evtimer.h" -#include "buzzer.h" - -#include "ff.h" - -/*===========================================================================*/ -/* Card insertion monitor. */ -/*===========================================================================*/ - -#define POLLING_INTERVAL 10 -#define POLLING_DELAY 10 - -/** - * @brief Card monitor timer. - */ -static VirtualTimer tmr; - -/** - * @brief Debounce counter. - */ -static unsigned cnt; - -/** - * @brief Card event sources. - */ -static EventSource inserted_event, removed_event; - -/** - * @brief Insertion monitor timer callback function. - * - * @param[in] p pointer to the @p BaseBlockDevice object - * - * @notapi - */ -static void tmrfunc(void *p) { - BaseBlockDevice *bbdp = p; - - /* The presence check is performed only while the driver is not in a - transfer state because it is often performed by changing the mode of - the pin connected to the CS/D3 contact of the card, this could disturb - the transfer.*/ - blkstate_t state = blkGetDriverState(bbdp); - chSysLockFromIsr(); - if ((state != BLK_READING) && (state != BLK_WRITING)) { - /* Safe to perform the check.*/ - if (cnt > 0) { - if (blkIsInserted(bbdp)) { - if (--cnt == 0) { - chEvtBroadcastI(&inserted_event); - } - } - else - cnt = POLLING_INTERVAL; - } - else { - if (!blkIsInserted(bbdp)) { - cnt = POLLING_INTERVAL; - chEvtBroadcastI(&removed_event); - } - } - } - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, bbdp); - chSysUnlockFromIsr(); -} - -/** - * @brief Polling monitor start. - * - * @param[in] p pointer to an object implementing @p BaseBlockDevice - * - * @notapi - */ -static void tmr_init(void *p) { - - chEvtInit(&inserted_event); - chEvtInit(&removed_event); - chSysLock(); - cnt = POLLING_INTERVAL; - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, p); - chSysUnlock(); -} - -/*===========================================================================*/ -/* FatFs related. */ -/*===========================================================================*/ - -/** - * @brief FS object. - */ -FATFS MMC_FS; - -/** - * MMC driver instance. - */ -MMCDriver MMCD1; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0).*/ -static SPIConfig hs_spicfg = { - NULL, - IOPORT1, - PA_SSEL1, - CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), - 2 -}; - -/* Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0).*/ -static SPIConfig ls_spicfg = { - NULL, - IOPORT1, - PA_SSEL1, - CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), - 254 -}; - -/* MMC/SD over SPI driver configuration.*/ -static MMCConfig mmccfg = {&SPID1, &ls_spicfg, &hs_spicfg}; - -/* Generic large buffer.*/ -uint8_t fbuff[1024]; - -static FRESULT scan_files(BaseSequentialStream *chp, char *path) { - FRESULT res; - FILINFO fno; - DIR dir; - int i; - char *fn; - -#if _USE_LFN - fno.lfname = 0; - fno.lfsize = 0; -#endif - res = f_opendir(&dir, path); - if (res == FR_OK) { - i = strlen(path); - for (;;) { - res = f_readdir(&dir, &fno); - if (res != FR_OK || fno.fname[0] == 0) - break; - if (fno.fname[0] == '.') - continue; - fn = fno.fname; - if (fno.fattrib & AM_DIR) { - path[i++] = '/'; - strcpy(&path[i], fn); - res = scan_files(chp, path); - if (res != FR_OK) - break; - path[--i] = 0; - } - else { - chprintf(chp, "%s/%s\r\n", path, fn); - } - } - } - return res; -} - -/*===========================================================================*/ -/* Main and generic code. */ -/*===========================================================================*/ - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPort(IOPORT1, PAL_PORT_BIT(PA_LED2)); - chThdSleepMilliseconds(200); - palSetPort(IOPORT1, PAL_PORT_BIT(PA_LED1) | PAL_PORT_BIT(PA_LED2)); - chThdSleepMilliseconds(800); - palClearPort(IOPORT1, PAL_PORT_BIT(PA_LED1)); - chThdSleepMilliseconds(200); - palSetPort(IOPORT1, PAL_PORT_BIT(PA_LED1) | PAL_PORT_BIT(PA_LED2)); - chThdSleepMilliseconds(800); - } - return 0; -} - -/* - * Yellow LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPad(IOPORT1, PA_LEDUSB); - chThdSleepMilliseconds(200); - palSetPad(IOPORT1, PA_LEDUSB); - chThdSleepMilliseconds(300); - } - return 0; -} - -/* - * Executed as event handler at 500mS intervals. - */ -static void TimerHandler(eventid_t id) { - - (void)id; - if (!palReadPad(IOPORT1, PA_BUTTON1)) { - if (fs_ready) { - FRESULT err; - uint32_t clusters; - FATFS *fsp; - - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chprintf((BaseSequentialStream *)&SD1, "FS: f_getfree() failed\r\n"); - return; - } - chprintf((BaseSequentialStream *)&SD1, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)MMC_FS.csize, - clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMC_SECTOR_SIZE); - fbuff[0] = 0; - scan_files((BaseSequentialStream *)&SD1, (char *)fbuff); - } - } - else if (!palReadPad(IOPORT1, PA_BUTTON2)) { - static WORKING_AREA(waTestThread, 256); - Thread *tp = chThdCreateStatic(waTestThread, sizeof(waTestThread), - NORMALPRIO, TestThread, &SD1); - chThdWait(tp); - buzzPlay(500, MS2ST(100)); - } -} - -/* - * MMC card insertion event. - */ -static void InsertHandler(eventid_t id) { - FRESULT err; - - (void)id; - buzzPlayWait(1000, MS2ST(100)); - buzzPlayWait(2000, MS2ST(100)); - chprintf((BaseSequentialStream *)&SD1, "MMC: inserted\r\n"); - /* - * On insertion MMC initialization and FS mount. - */ - chprintf((BaseSequentialStream *)&SD1, "MMC: initialization "); - if (mmcConnect(&MMCD1)) { - chprintf((BaseSequentialStream *)&SD1, "failed\r\n"); - return; - } - chprintf((BaseSequentialStream *)&SD1, "ok\r\n"); - chprintf((BaseSequentialStream *)&SD1, "FS: mount "); - err = f_mount(0, &MMC_FS); - if (err != FR_OK) { - chprintf((BaseSequentialStream *)&SD1, "failed\r\n"); - mmcDisconnect(&MMCD1); - return; - } - fs_ready = TRUE; - chprintf((BaseSequentialStream *)&SD1, "ok\r\n"); - buzzPlay(440, MS2ST(200)); -} - -/* - * MMC card removal event. - */ -static void RemoveHandler(eventid_t id) { - - (void)id; - chprintf((BaseSequentialStream *)&SD1, "MMC: removed\r\n"); - mmcDisconnect(&MMCD1); - fs_ready = FALSE; - buzzPlayWait(2000, MS2ST(100)); - buzzPlayWait(1000, MS2ST(100)); -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - TimerHandler, - InsertHandler, - RemoveHandler - }; - static EvTimer evt; - struct EventListener el0, el1, el2; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Buzzer driver initialization. - */ - buzzInit(); - - /* - * Initializes the MMC driver to work with SPI2. - */ - mmcObjectInit(&MMCD1); - mmcStart(&MMCD1, &mmccfg); - - /* - * Activates the card insertion monitor. - */ - tmr_init(&MMCD1); - - /* - * Creates the blinker threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and listen for events. - */ - evtInit(&evt, MS2ST(500)); /* Initializes an event timer object. */ - evtStart(&evt); /* Starts the event timer. */ - chEvtRegister(&evt.et_es, &el0, 0); /* Registers on the timer event source. */ - chEvtRegister(&inserted_event, &el1, 1); - chEvtRegister(&removed_event, &el2, 2); - while (TRUE) - chEvtDispatch(evhndl, chEvtWaitOne(ALL_EVENTS)); - return 0; -} diff --git a/demos/ARM7-LPC214x-FATFS-GCC/mcuconf.h b/demos/ARM7-LPC214x-FATFS-GCC/mcuconf.h deleted file mode 100644 index 87621be7a4..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/mcuconf.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC214x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_LPC214x_UART0 TRUE -#define USE_LPC214x_UART1 TRUE -#define LPC214x_UART_FIFO_PRELOAD 16 -#define LPC214x_UART0_PRIORITY 1 -#define LPC214x_UART1_PRIORITY 2 - -/* - * SPI driver system settings. - */ -#define USE_LPC214x_SPI1 TRUE diff --git a/demos/ARM7-LPC214x-FATFS-GCC/readme.txt b/demos/ARM7-LPC214x-FATFS-GCC/readme.txt deleted file mode 100644 index 83abee7c69..0000000000 --- a/demos/ARM7-LPC214x-FATFS-GCC/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ -***************************************************************************** -** ChibiOS/RT + FatFS demo for LPC214x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex LPC-P2148 board. The port on other boards or other -members of the LPC2000 family should be an easy task. - -** The Demo ** - -The demo blinks the leds on the board by using multiple threads. -By pressing button 1 a directory scan on the MMC slot is performed, by -pressing the button 2 the test suite is activated on serial port 1. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. diff --git a/demos/ARM7-LPC214x-G++/Makefile b/demos/ARM7-LPC214x-G++/Makefile deleted file mode 100644 index 67b294b7c2..0000000000 --- a/demos/ARM7-LPC214x-G++/Makefile +++ /dev/null @@ -1,187 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_LPC_P2148/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC214x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/LPC214x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC2148.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(CHIBIOS)/os/various/ch.cpp main.cpp - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-LPC214x-G++/chconf.h b/demos/ARM7-LPC214x-G++/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-LPC214x-G++/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-LPC214x-G++/halconf.h b/demos/ARM7-LPC214x-G++/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/ARM7-LPC214x-G++/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-LPC214x-G++/main.cpp b/demos/ARM7-LPC214x-G++/main.cpp deleted file mode 100644 index 454e691b83..0000000000 --- a/demos/ARM7-LPC214x-G++/main.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.hpp" -#include "hal.h" -#include "test.h" -#include "evtimer.h" - -#define BOTH_BUTTONS (PAL_PORT_BIT(PA_BUTTON1) | PAL_PORT_BIT(PA_BUTTON2)) - -using namespace chibios_rt; - -/* - * LED blink sequences. - * NOTE: Sequences must always be terminated by a GOTO instruction. - * NOTE: The sequencer language could be easily improved but this is outside - * the scope of this demo. - */ -#define SLEEP 0 -#define GOTO 1 -#define STOP 2 -#define BITCLEAR 3 -#define BITSET 4 - -typedef struct { - uint8_t action; - uint32_t value; -} seqop_t; - -// Flashing sequence for LED1. -static const seqop_t LED1_sequence[] = -{ - {BITCLEAR, PAL_PORT_BIT(PA_LED1)}, - {SLEEP, 200}, - {BITSET, PAL_PORT_BIT(PA_LED1)}, - {SLEEP, 1800}, - {GOTO, 0} -}; - -// Flashing sequence for LED2. -static const seqop_t LED2_sequence[] = -{ - {SLEEP, 1000}, - {BITCLEAR, PAL_PORT_BIT(PA_LED2)}, - {SLEEP, 200}, - {BITSET, PAL_PORT_BIT(PA_LED2)}, - {SLEEP, 1800}, - {GOTO, 1} -}; - -// Flashing sequence for LED3. -static const seqop_t LED3_sequence[] = -{ - {BITCLEAR, PAL_PORT_BIT(PA_LEDUSB)}, - {SLEEP, 200}, - {BITSET, PAL_PORT_BIT(PA_LEDUSB)}, - {SLEEP, 300}, - {GOTO, 0} -}; - -/* - * Sequencer thread class. It can drive LEDs or other output pins. - * Any sequencer is just an instance of this class, all the details are - * totally encapsulated and hidden to the application level. - */ -class SequencerThread : public EnhancedThread<128> { -private: - const seqop_t *base, *curr; // Thread local variables. - -protected: - virtual msg_t Main(void) { - while (true) { - switch(curr->action) { - case SLEEP: - Sleep(curr->value); - break; - case GOTO: - curr = &base[curr->value]; - continue; - case STOP: - return 0; - case BITCLEAR: - palClearPort(IOPORT1, curr->value); - break; - case BITSET: - palSetPort(IOPORT1, curr->value); - break; - } - curr++; - } - } - -public: - SequencerThread(const seqop_t *sequence) : EnhancedThread<128>("sequencer") { - - base = curr = sequence; - } -}; - -/* - * Tester thread class. This thread executes the test suite. - */ -class TesterThread : public EnhancedThread<128> { - -protected: - virtual msg_t Main(void) { - - return TestThread(&SD1); - } - -public: - TesterThread(void) : EnhancedThread<128>("tester") { - } -}; - -/* - * Executed as an event handler at 500mS intervals. - */ -static void TimerHandler(eventid_t id) { - - (void)id; - if (!(palReadPort(IOPORT1) & BOTH_BUTTONS)) { // Both buttons - TesterThread tester; - tester.Wait(); - }; -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - TimerHandler - }; - static EvTimer evt; - struct EventListener el0; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - System::Init(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - evtInit(&evt, 500); // Initializes an event timer. - evtStart(&evt); // Starts the event timer. - chEvtRegister(&evt.et_es, &el0, 0); // Registers a listener on the source. - - /* - * Starts several instances of the SequencerThread class, each one operating - * on a different LED. - */ - SequencerThread blinker1(LED1_sequence); - SequencerThread blinker2(LED2_sequence); - SequencerThread blinker3(LED3_sequence); - - /* - * Serves timer events. - */ - while (true) - Event::Dispatch(evhndl, Event::WaitOne(ALL_EVENTS)); - - return 0; -} diff --git a/demos/ARM7-LPC214x-G++/mcuconf.h b/demos/ARM7-LPC214x-G++/mcuconf.h deleted file mode 100644 index 87621be7a4..0000000000 --- a/demos/ARM7-LPC214x-G++/mcuconf.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC214x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_LPC214x_UART0 TRUE -#define USE_LPC214x_UART1 TRUE -#define LPC214x_UART_FIFO_PRELOAD 16 -#define LPC214x_UART0_PRIORITY 1 -#define LPC214x_UART1_PRIORITY 2 - -/* - * SPI driver system settings. - */ -#define USE_LPC214x_SPI1 TRUE diff --git a/demos/ARM7-LPC214x-G++/readme.txt b/demos/ARM7-LPC214x-G++/readme.txt deleted file mode 100644 index 8f99ee1d76..0000000000 --- a/demos/ARM7-LPC214x-G++/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM7TDMI LPC214X using G++. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex LPC-P2148 board. The port on other boards or other -members of the LPC2000 family should be an easy task. - -** The Demo ** - -The demo blinks the leds on the board by using multiple threads implemented -as C++ classes. Pressing both buttons activates the test procedure on the -serial port 1. - -NOTE: the C++ GNU compiler can produce code sizes comparable to C if you - don't use RTTI and standard libraries, those are disabled by default - in the makefile. You can enable them if you have a lot of program space - available. It is possible to use a lot of C++ features without using - runtimes, just see the demo. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. diff --git a/demos/ARM7-LPC214x-GCC/Makefile b/demos/ARM7-LPC214x-GCC/Makefile deleted file mode 100644 index 6be46ea25d..0000000000 --- a/demos/ARM7-LPC214x-GCC/Makefile +++ /dev/null @@ -1,187 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = no -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_LPC_P2148/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC214x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARM/LPC214x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC2148.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = arm7tdmi - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARM/rules.mk diff --git a/demos/ARM7-LPC214x-GCC/chconf.h b/demos/ARM7-LPC214x-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARM7-LPC214x-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-LPC214x-GCC/halconf.h b/demos/ARM7-LPC214x-GCC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/ARM7-LPC214x-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARM7-LPC214x-GCC/main.c b/demos/ARM7-LPC214x-GCC/main.c deleted file mode 100644 index 4040f05222..0000000000 --- a/demos/ARM7-LPC214x-GCC/main.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#define BOTH_BUTTONS (PAL_PORT_BIT(PA_BUTTON1) | PAL_PORT_BIT(PA_BUTTON2)) - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPort(IOPORT1, PAL_PORT_BIT(PA_LED2)); - chThdSleepMilliseconds(200); - palSetPort(IOPORT1, PAL_PORT_BIT(PA_LED1) | PAL_PORT_BIT(PA_LED2)); - chThdSleepMilliseconds(800); - palClearPort(IOPORT1, PAL_PORT_BIT(PA_LED1)); - chThdSleepMilliseconds(200); - palSetPort(IOPORT1, PAL_PORT_BIT(PA_LED1) | PAL_PORT_BIT(PA_LED2)); - chThdSleepMilliseconds(800); - } - return 0; -} - -/* - * Yellow LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPad(IOPORT1, PA_LEDUSB); - chThdSleepMilliseconds(200); - palSetPad(IOPORT1, PA_LEDUSB); - chThdSleepMilliseconds(300); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * If a button is pressed during the reset then the blinking leds threads - * are not started in order to make accurate benchmarks. - */ - if ((palReadPort(IOPORT1) & BOTH_BUTTONS) == BOTH_BUTTONS) { - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - } - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the buttons state. - */ - while (TRUE) { - if (!palReadPad(IOPORT1, PA_BUTTON1)) - sdWrite(&SD1, (uint8_t *)"Hello World!\r\n", 14); - if (!palReadPad(IOPORT1, PA_BUTTON2)) - TestThread(&SD1); - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/demos/ARM7-LPC214x-GCC/mcuconf.h b/demos/ARM7-LPC214x-GCC/mcuconf.h deleted file mode 100644 index 87621be7a4..0000000000 --- a/demos/ARM7-LPC214x-GCC/mcuconf.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC214x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_LPC214x_UART0 TRUE -#define USE_LPC214x_UART1 TRUE -#define LPC214x_UART_FIFO_PRELOAD 16 -#define LPC214x_UART0_PRIORITY 1 -#define LPC214x_UART1_PRIORITY 2 - -/* - * SPI driver system settings. - */ -#define USE_LPC214x_SPI1 TRUE diff --git a/demos/ARM7-LPC214x-GCC/readme.txt b/demos/ARM7-LPC214x-GCC/readme.txt deleted file mode 100644 index 32d0360439..0000000000 --- a/demos/ARM7-LPC214x-GCC/readme.txt +++ /dev/null @@ -1,22 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM7TDMI LPC214X. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex LPC-P2148 board. The port on other boards or other -members of the LPC2000 family should be an easy task. - -** The Demo ** - -The demo blinks the leds on the board by using multiple threads. By pressing -the buttons on the board it is possible to send a message over the serial -port or activate the test procedure. -See main.c for details. Buzzer.c contains an interesting device driver -example that uses a physical timer for the waveform generation and a virtual -timer for the sound duration. - -** Build Procedure ** - -The demo was built using the YAGARTO toolchain but any toolchain based on GCC -and GNU userspace programs will work. diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/Makefile b/demos/ARMCM0-LPC1114-LPCXPRESSO/Makefile deleted file mode 100644 index 9919f15194..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_1114/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC11xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1114.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1114 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/chconf.h b/demos/ARMCM0-LPC1114-LPCXPRESSO/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/halconf.h b/demos/ARMCM0-LPC1114-LPCXPRESSO/halconf.h deleted file mode 100644 index d3766e0fd1..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.ewp b/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.ewp deleted file mode 100644 index b757f49857..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.ewp +++ /dev/null @@ -1,2219 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\EA_LPCXPRESSO_BB_1114\board.c - - - $PROJ_DIR$\..\..\..\boards\EA_LPCXPRESSO_BB_1114\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\core_cm0.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\LPC11xx.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\spi_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\spi_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC11xx\system_LPC11xx.h - - - - port - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v6m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v6m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v6m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\LPC11xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\LPC11xx\vectors.s - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.eww b/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.icf b/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.icf deleted file mode 100644 index a31967680a..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x00007FFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x10000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x10001FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x200; -define symbol __ICFEDIT_size_heap__ = 0x200; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x200; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/keil/ch.uvproj b/demos/ARMCM0-LPC1114-LPCXPRESSO/keil/ch.uvproj deleted file mode 100644 index 8b14cacee4..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/keil/ch.uvproj +++ /dev/null @@ -1,1010 +0,0 @@ - - - - 1.1 - -

### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - LPC1114x301 - NXP (founded by Philips) - IRAM(0x10000000-0x10001FFF) IROM(0-0x7FFF) CLOCK(12000000) CPUTYPE("Cortex-M0") - - "STARTUP\NXP\LPC11xx\startup_LPC11xx.s" ("NXP LPC11xx Startup Code") - UL2CM3(-UV1742AOE -O463 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD10000000 -FC800 -FN1 -FF0LPC1xxx_32 -FS00 -FL08000) - 5063 - LPC11xx.h - - - - - - - - - - - 0 - - - - NXP\LPC11xx\ - NXP\LPC11xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - - DARMP1.DLL - -pLPC1114 - SARMCM3.DLL - - TARMP1.DLL - -pLPC1114 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x2000 - - - 1 - 0x0 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x2000 - - - 0 - 0x10002000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\LPC11xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\LPC11xx;..\..\..\boards\EA_LPCXPRESSO_BB_1114;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\EA_LPCXPRESSO_BB_1114;..\..\..\os\ports\RVCT\ARMCMx\LPC11xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\EA_LPCXPRESSO_BB_1114\board.c - - - board.h - 5 - ..\..\..\boards\EA_LPCXPRESSO_BB_1114\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - chcore_v6m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v6m.c - - - chcore_v6m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v6m.h - - - chcoreasm_v6m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v6m.s - - - cmparams.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\LPC11xx\cmparams.h - - - vectors.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\LPC11xx\vectors.s - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - can.c - 1 - ..\..\..\os\hal\src\can.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - i2c.c - 1 - ..\..\..\os\hal\src\i2c.c - - - mac.c - 1 - ..\..\..\os\hal\src\mac.c - - - mmc_spi.c - 1 - ..\..\..\os\hal\src\mmc_spi.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - uart.c - 1 - ..\..\..\os\hal\src\uart.c - - - adc.h - 5 - ..\..\..\os\hal\include\adc.h - - - can.h - 5 - ..\..\..\os\hal\include\can.h - - - hal.h - 5 - ..\..\..\os\hal\include\hal.h - - - i2c.h - 5 - ..\..\..\os\hal\include\i2c.h - - - mac.h - 5 - ..\..\..\os\hal\include\mac.h - - - mii.h - 5 - ..\..\..\os\hal\include\mii.h - - - mmc_spi.h - 5 - ..\..\..\os\hal\include\mmc_spi.h - - - pal.h - 5 - ..\..\..\os\hal\include\pal.h - - - pwm.h - 5 - ..\..\..\os\hal\include\pwm.h - - - serial.h - 5 - ..\..\..\os\hal\include\serial.h - - - spi.h - 5 - ..\..\..\os\hal\include\spi.h - - - uart.h - 5 - ..\..\..\os\hal\include\uart.h - - - - - platform - - - core_cm0.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\core_cm0.h - - - hal_lld.c - 1 - ..\..\..\os\hal\platforms\LPC11xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\hal_lld.h - - - LPC11xx.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\LPC11xx.h - - - pal_lld.c - 1 - ..\..\..\os\hal\platforms\LPC11xx\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\pal_lld.h - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\LPC11xx\serial_lld.c - - - serial_lld.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\serial_lld.h - - - spi_lld.c - 1 - ..\..\..\os\hal\platforms\LPC11xx\spi_lld.c - - - spi_lld.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\spi_lld.h - - - system_LPC11xx.h - 5 - ..\..\..\os\hal\platforms\LPC11xx\system_LPC11xx.h - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - mcuconf.h - 5 - ..\mcuconf.h - - - - - - - - diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/main.c b/demos/ARMCM0-LPC1114-LPCXPRESSO/main.c deleted file mode 100644 index 62190973b2..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/main.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Conversion table from hex digit to 7 segments encoding, bit 5 controls the - * dot. - * 8 = LU, 4 = RL, 2 = D, 1 = RU, 8 = U, 4 = M, 2 = LL, 1 = L. - */ -static uint8_t digits[32] = { - 0x24, 0xAF, 0xE0, 0xA2, 0x2B, 0x32, 0x30, 0xA7, - 0x20, 0x22, 0x21, 0x38, 0x74, 0xA8, 0x70, 0x71, - 0x04, 0x8F, 0xC0, 0x82, 0x0B, 0x12, 0x10, 0x87, - 0x00, 0x02, 0x01, 0x18, 0x54, 0x88, 0x50, 0x51 -}; - -/* - * SPI configuration (1MHz, CPHA=0, CPOL=0). - */ -static SPIConfig spicfg = { - NULL, - GPIO1, - GPIO1_SPI0SEL, - CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), - 48 -}; - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPad(GPIO0, GPIO0_LED2); - chThdSleepMilliseconds(500); - palSetPad(GPIO0, GPIO0_LED2); - chThdSleepMilliseconds(500); - } -} - -/* - * RGB LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - palSetPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - palSetPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3R)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - palSetPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3G)); - chThdSleepMilliseconds(250); - } -} - -/* - * Application entry point. - */ -int main(void) { - uint8_t i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the SD1 and SPI1 drivers. - */ - sdStart(&SD1, NULL); /* Default: 38400,8,N,1. */ - spiStart(&SPID1, &spicfg); - - /* - * Creates the blinker threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - - /* - * Normal main() thread activity, in this demo it updates the 7-segments - * display on the LPCXpresso main board using the SPI driver. - */ - i = 0; - while (TRUE) { - if (!palReadPad(GPIO0, GPIO0_SW3)) - TestThread(&SD1); - spiSelect(&SPID1); - spiSend(&SPID1, 1, &digits[i]); /* Non polled method. */ - spiUnselect(&SPID1); - chThdSleepMilliseconds(500); - spiSelect(&SPID1); - spiPolledExchange(&SPID1, digits[i | 0x10]); /* Polled method. */ - spiUnselect(&SPID1); - chThdSleepMilliseconds(500); - i = (i + 1) & 15; - } -} diff --git a/demos/ARMCM0-LPC1114-LPCXPRESSO/mcuconf.h b/demos/ARMCM0-LPC1114-LPCXPRESSO/mcuconf.h deleted file mode 100644 index f07f88ddd7..0000000000 --- a/demos/ARMCM0-LPC1114-LPCXPRESSO/mcuconf.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC1114 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC11xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC11xx_SYSPLL_MUL 4 -#define LPC11xx_SYSPLL_DIV 4 -#define LPC11xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC11xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC11xx_GPT_USE_CT16B0 TRUE -#define LPC11xx_GPT_USE_CT16B1 TRUE -#define LPC11xx_GPT_USE_CT32B0 TRUE -#define LPC11xx_GPT_USE_CT32B1 TRUE -#define LPC11xx_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT16B1_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC11xx_SERIAL_USE_UART0 TRUE -#define LPC11xx_SERIAL_FIFO_PRELOAD 16 -#define LPC11xx_SERIAL_UART0CLKDIV 1 -#define LPC11xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC11xx_SPI_USE_SSP0 TRUE -#define LPC11xx_SPI_USE_SSP1 FALSE -#define LPC11xx_SPI_SSP0CLKDIV 1 -#define LPC11xx_SPI_SSP1CLKDIV 1 -#define LPC11xx_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP1_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/demos/ARMCM0-LPC11U14-LPCXPRESSO/Makefile b/demos/ARMCM0-LPC11U14-LPCXPRESSO/Makefile deleted file mode 100644 index dc2aa318fd..0000000000 --- a/demos/ARMCM0-LPC11U14-LPCXPRESSO/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_11U14/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC11Uxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC11U14.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1114 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM0-LPC11U14-LPCXPRESSO/chconf.h b/demos/ARMCM0-LPC11U14-LPCXPRESSO/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM0-LPC11U14-LPCXPRESSO/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM0-LPC11U14-LPCXPRESSO/halconf.h b/demos/ARMCM0-LPC11U14-LPCXPRESSO/halconf.h deleted file mode 100644 index d3766e0fd1..0000000000 --- a/demos/ARMCM0-LPC11U14-LPCXPRESSO/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM0-LPC11U14-LPCXPRESSO/main.c b/demos/ARMCM0-LPC11U14-LPCXPRESSO/main.c deleted file mode 100644 index a4dce854cf..0000000000 --- a/demos/ARMCM0-LPC11U14-LPCXPRESSO/main.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Conversion table from hex digit to 7 segments encoding, bit 5 controls the - * dot. - * 8 = LU, 4 = RL, 2 = D, 1 = RU, 8 = U, 4 = M, 2 = LL, 1 = L. - */ -static uint8_t digits[32] = { - 0x24, 0xAF, 0xE0, 0xA2, 0x2B, 0x32, 0x30, 0xA7, - 0x20, 0x22, 0x21, 0x38, 0x74, 0xA8, 0x70, 0x71, - 0x04, 0x8F, 0xC0, 0x82, 0x0B, 0x12, 0x10, 0x87, - 0x00, 0x02, 0x01, 0x18, 0x54, 0x88, 0x50, 0x51 -}; - -/* - * SPI configuration (1MHz, CPHA=0, CPOL=0). - */ -static SPIConfig spicfg = { - NULL, - GPIO0, - GPIO0_SPI0SEL, - CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), - 48 -}; - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPad(GPIO0, GPIO0_LED2); - chThdSleepMilliseconds(500); - palSetPad(GPIO0, GPIO0_LED2); - chThdSleepMilliseconds(500); - } -} - -/* - * RGB LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPort(GPIO0, PAL_PORT_BIT(GPIO0_LED3B) | - PAL_PORT_BIT(GPIO0_LED3R) | - PAL_PORT_BIT(GPIO0_LED3G)); - chThdSleepMilliseconds(250); - palClearPort(GPIO0, PAL_PORT_BIT(GPIO0_LED3B) | - PAL_PORT_BIT(GPIO0_LED3R) | - PAL_PORT_BIT(GPIO0_LED3G)); - palSetPort(GPIO0, PAL_PORT_BIT(GPIO0_LED3B)); - chThdSleepMilliseconds(250); - palClearPort(GPIO0, PAL_PORT_BIT(GPIO0_LED3B) | - PAL_PORT_BIT(GPIO0_LED3R) | - PAL_PORT_BIT(GPIO0_LED3G)); - palSetPort(GPIO0, PAL_PORT_BIT(GPIO0_LED3R)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO0_LED3B) | - PAL_PORT_BIT(GPIO0_LED3R) | - PAL_PORT_BIT(GPIO0_LED3G)); - palSetPort(GPIO0, PAL_PORT_BIT(GPIO0_LED3G)); - chThdSleepMilliseconds(250); - } -} - -/* - * Application entry point. - */ -int main(void) { - uint8_t i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the SD1 and SPI1 drivers. - */ - sdStart(&SD1, NULL); /* Default: 38400,8,N,1. */ - spiStart(&SPID1, &spicfg); - - /* - * Creates the blinker threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - - /* - * Normal main() thread activity, in this demo it updates the 7-segments - * display on the LPCXpresso main board using the SPI driver. - */ - i = 0; - while (TRUE) { - if (!palReadPad(GPIO0, GPIO0_SW3)) - TestThread(&SD1); - spiSelect(&SPID1); - spiSend(&SPID1, 1, &digits[i]); /* Non polled method. */ - spiUnselect(&SPID1); - chThdSleepMilliseconds(500); - spiSelect(&SPID1); - spiPolledExchange(&SPID1, digits[i | 0x10]); /* Polled method. */ - spiUnselect(&SPID1); - chThdSleepMilliseconds(500); - i = (i + 1) & 15; - } -} diff --git a/demos/ARMCM0-LPC11U14-LPCXPRESSO/mcuconf.h b/demos/ARMCM0-LPC11U14-LPCXPRESSO/mcuconf.h deleted file mode 100644 index 984ca40a24..0000000000 --- a/demos/ARMCM0-LPC11U14-LPCXPRESSO/mcuconf.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC11U14 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC_SYSPLL_MUL 4 -#define LPC_SYSPLL_DIV 4 -#define LPC_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC_SYSABHCLK_DIV 1 - -/* - * GPT driver system settings. - */ -#define LPC_GPT_USE_CT16B0 TRUE -#define LPC_GPT_USE_CT16B1 TRUE -#define LPC_GPT_USE_CT32B0 TRUE -#define LPC_GPT_USE_CT32B1 TRUE -#define LPC_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC_GPT_CT16B1_IRQ_PRIORITY 2 -#define LPC_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * SERIAL driver system settings. - */ -#define LPC_SERIAL_USE_UART0 TRUE -#define LPC_SERIAL_FIFO_PRELOAD 16 -#define LPC_SERIAL_UART0CLKDIV 1 -#define LPC_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC_SPI_USE_SSP0 TRUE -#define LPC_SPI_USE_SSP1 FALSE -#define LPC_SPI_SSP0CLKDIV 1 -#define LPC_SPI_SSP1CLKDIV 1 -#define LPC_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC_SPI_SSP1_IRQ_PRIORITY 1 -#define LPC_SPI_SSP_ERROR_HOOK(spip) chSysHalt() diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/.cproject b/demos/ARMCM0-STM32F051-DISCOVERY/.cproject deleted file mode 100644 index a5d58c50ae..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/.project b/demos/ARMCM0-STM32F051-DISCOVERY/.project deleted file mode 100644 index 0a02ef68b8..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - ARMCM0-STM32F051-DISCOVERY - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/Makefile b/demos/ARMCM0-STM32F051-DISCOVERY/Makefile deleted file mode 100644 index 808327ae4c..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/chconf.h b/demos/ARMCM0-STM32F051-DISCOVERY/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/halconf.h b/demos/ARMCM0-STM32F051-DISCOVERY/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/main.c b/demos/ARMCM0-STM32F051-DISCOVERY/main.c deleted file mode 100644 index 5af0813e95..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/main.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Blue LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED4); - chThdSleepMilliseconds(500); - palSetPad(GPIOC, GPIOC_LED4); - chThdSleepMilliseconds(500); - } -} - -/* - * Green LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED3); - chThdSleepMilliseconds(250); - palSetPad(GPIOC, GPIOC_LED3); - chThdSleepMilliseconds(250); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - * PA9 and PA10 are routed to USART1. - */ - sdStart(&SD1, NULL); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(1)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(1)); /* USART1 RX. */ - - /* - * Creates the blinker threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state, when the button is - * pressed the test procedure is launched with output on the serial - * driver 1. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD1); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/mcuconf.h b/demos/ARMCM0-STM32F051-DISCOVERY/mcuconf.h deleted file mode 100644 index 99642838fc..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/mcuconf.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/demos/ARMCM0-STM32F051-DISCOVERY/readme.txt b/demos/ARMCM0-STM32F051-DISCOVERY/readme.txt deleted file mode 100644 index 4672d786c7..0000000000 --- a/demos/ARMCM0-STM32F051-DISCOVERY/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M0 STM32F051. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F0-Discovery board. - -** The Demo ** - - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-GENERIC-KERNEL/Makefile b/demos/ARMCM3-GENERIC-KERNEL/Makefile deleted file mode 100644 index 13e548692f..0000000000 --- a/demos/ARMCM3-GENERIC-KERNEL/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSTM32F10X_MD - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-GENERIC-KERNEL/chconf.h b/demos/ARMCM3-GENERIC-KERNEL/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-GENERIC-KERNEL/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-GENERIC-KERNEL/main.c b/demos/ARMCM3-GENERIC-KERNEL/main.c deleted file mode 100644 index f36a2e01e1..0000000000 --- a/demos/ARMCM3-GENERIC-KERNEL/main.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" - -#if !defined(SYSTEM_CLOCK) -#define SYSTEM_CLOCK 8000000 -#endif - -static uint32_t seconds_counter; -static uint32_t minutes_counter; - -/* - * This is a periodic thread that does absolutely nothing except increasing - * the seconds counter. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(1000); - seconds_counter++; - } -} - -/* - * Application entry point. - */ -int main(void) { - - /** - * Hardware initialization, in this simple demo just the systick timer is - * initialized. - */ - STBase->RVR = SYSTEM_CLOCK / CH_FREQUENCY - 1; - STBase->CVR = 0; - STBase->CSR = CLKSOURCE_CORE_BITS | ENABLE_ON_BITS | TICKINT_ENABLED_BITS; - - /* - * System initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - chSysInit(); - - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * increasing the minutes counter. - */ - while (TRUE) { - chThdSleepSeconds(60); - minutes_counter++; - } -} diff --git a/demos/ARMCM3-GENERIC-KERNEL/readme.txt b/demos/ARMCM3-GENERIC-KERNEL/readme.txt deleted file mode 100644 index 0c13627af8..0000000000 --- a/demos/ARMCM3-GENERIC-KERNEL/readme.txt +++ /dev/null @@ -1,14 +0,0 @@ -***************************************************************************** -** ChibiOS/RT demo for generict ARM Cortex-M3 processor, kernel only. ** -***************************************************************************** - -** TARGET ** - -The demo runs on any ARM Cortex-M3 processor after changing few constants -in main.c, the defaults are setup for an STM32F1xx. - -** Build Procedure ** - -The demo has been tested by using the free CodeSourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/Makefile b/demos/ARMCM3-LPC1343-LPCXPRESSO/Makefile deleted file mode 100644 index 9b6daf3c0a..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_1343/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC13xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC13xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1343.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1348 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/chconf.h b/demos/ARMCM3-LPC1343-LPCXPRESSO/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/halconf.h b/demos/ARMCM3-LPC1343-LPCXPRESSO/halconf.h deleted file mode 100644 index d3766e0fd1..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.ewp b/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.ewp deleted file mode 100644 index 34617d457e..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.ewp +++ /dev/null @@ -1,2222 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\EA_LPCXPRESSO_BB_1343\board.c - - - $PROJ_DIR$\..\..\..\boards\EA_LPCXPRESSO_BB_1343\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\core_cm3.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\LPC13xx.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\spi_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\spi_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\LPC13xx\system_LPC13xx.h - - - - port - - LPC13xx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\LPC13xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\LPC13xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.eww b/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.icf b/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.icf deleted file mode 100644 index a31967680a..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x00000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x00007FFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x10000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x10001FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x200; -define symbol __ICFEDIT_size_heap__ = 0x200; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x200; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/keil/ch.uvproj b/demos/ARMCM3-LPC1343-LPCXPRESSO/keil/ch.uvproj deleted file mode 100644 index 175779e8ed..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/keil/ch.uvproj +++ /dev/null @@ -1,1005 +0,0 @@ - - - - 1.1 - -
### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - LPC1343 - NXP (founded by Philips) - IRAM(0x10000000-0x10001FFF) IROM(0-0x7FFF) CLOCK(12000000) CPUTYPE("Cortex-M3") - - "STARTUP\NXP\LPC13xx\startup_LPC13xx.s" ("NXP LPC13xx Startup Code") - UL2CM3(-UV0446D8E -O463 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD10000000 -FC800 -FN1 -FF0LPC1xxx_32 -FS00 -FL08000) - 4919 - LPC13xx.h - - - - - - - - - - - 0 - - - - NXP\LPC13xx\ - NXP\LPC13xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - - DARMP1.DLL - -pLPC1343 - SARMCM3.DLL - - TARMP1.DLL - -pLPC1343 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x2000 - - - 1 - 0x0 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x8000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x10000000 - 0x2000 - - - 0 - 0x10002000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\LPC13xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\LPC13xx;..\..\..\boards\EA_LPCXPRESSO_BB_1343;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\EA_LPCXPRESSO_BB_1343;..\..\..\os\ports\RVCT\ARMCMx\LPC13xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\EA_LPCXPRESSO_BB_1343\board.c - - - board.h - 5 - ..\..\..\boards\EA_LPCXPRESSO_BB_1343\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - vectors.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\LPC13xx\vectors.s - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - can.c - 1 - ..\..\..\os\hal\src\can.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - i2c.c - 1 - ..\..\..\os\hal\src\i2c.c - - - mac.c - 1 - ..\..\..\os\hal\src\mac.c - - - mmc_spi.c - 1 - ..\..\..\os\hal\src\mmc_spi.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - uart.c - 1 - ..\..\..\os\hal\src\uart.c - - - adc.h - 5 - ..\..\..\os\hal\include\adc.h - - - can.h - 5 - ..\..\..\os\hal\include\can.h - - - hal.h - 5 - ..\..\..\os\hal\include\hal.h - - - i2c.h - 5 - ..\..\..\os\hal\include\i2c.h - - - mac.h - 5 - ..\..\..\os\hal\include\mac.h - - - mii.h - 5 - ..\..\..\os\hal\include\mii.h - - - mmc_spi.h - 5 - ..\..\..\os\hal\include\mmc_spi.h - - - pal.h - 5 - ..\..\..\os\hal\include\pal.h - - - pwm.h - 5 - ..\..\..\os\hal\include\pwm.h - - - serial.h - 5 - ..\..\..\os\hal\include\serial.h - - - spi.h - 5 - ..\..\..\os\hal\include\spi.h - - - uart.h - 5 - ..\..\..\os\hal\include\uart.h - - - - - platform - - - core_cm3.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\core_cm3.h - - - hal_lld.c - 1 - ..\..\..\os\hal\platforms\LPC13xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\hal_lld.h - - - LPC13xx.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\LPC13xx.h - - - pal_lld.c - 1 - ..\..\..\os\hal\platforms\LPC13xx\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\pal_lld.h - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\LPC13xx\serial_lld.c - - - serial_lld.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\serial_lld.h - - - spi_lld.c - 1 - ..\..\..\os\hal\platforms\LPC13xx\spi_lld.c - - - spi_lld.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\spi_lld.h - - - system_LPC13xx.h - 5 - ..\..\..\os\hal\platforms\LPC13xx\system_LPC13xx.h - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - mcuconf.h - 5 - ..\mcuconf.h - - - - - - - -
diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/main.c b/demos/ARMCM3-LPC1343-LPCXPRESSO/main.c deleted file mode 100644 index 41408beb9a..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/main.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Conversion table from hex digit to 7 segments encoding, bit 5 controls the - * dot. - * 8 = LU, 4 = RL, 2 = D, 1 = RU, 8 = U, 4 = M, 2 = LL, 1 = L. - */ -static uint8_t digits[32] = { - 0x24, 0xAF, 0xE0, 0xA2, 0x2B, 0x32, 0x30, 0xA7, - 0x20, 0x22, 0x21, 0x38, 0x74, 0xA8, 0x70, 0x71, - 0x04, 0x8F, 0xC0, 0x82, 0x0B, 0x12, 0x10, 0x87, - 0x00, 0x02, 0x01, 0x18, 0x54, 0x88, 0x50, 0x51 -}; - -/* - * SPI configuration (1MHz, CPHA=0, CPOL=0). - */ -static SPIConfig spicfg = { - NULL, - GPIO1, - GPIO1_SPI0SEL, - CR0_DSS8BIT | CR0_FRFSPI | CR0_CLOCKRATE(0), - 72 -}; - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPad(GPIO0, GPIO0_LED2); - chThdSleepMilliseconds(500); - palSetPad(GPIO0, GPIO0_LED2); - chThdSleepMilliseconds(500); - } -} - -/* - * RGB LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - palSetPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - palSetPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3R)); - chThdSleepMilliseconds(250); - palClearPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3B) | - PAL_PORT_BIT(GPIO1_LED3R) | - PAL_PORT_BIT(GPIO1_LED3G)); - palSetPort(GPIO1, PAL_PORT_BIT(GPIO1_LED3G)); - chThdSleepMilliseconds(250); - } -} - -/* - * Application entry point. - */ -int main(void) { - uint8_t i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the SD1 and SPI1 drivers. - */ - sdStart(&SD1, NULL); /* Default: 38400,8,N,1. */ - spiStart(&SPID1, &spicfg); - - /* - * Creates the blinker threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - - /* - * Normal main() thread activity, in this demo it updates the 7-segments - * display on the LPCXpresso main board using the SPI driver. - */ - i = 0; - while (TRUE) { - if (!palReadPad(GPIO0, GPIO0_SW3)) - TestThread(&SD1); - spiSelect(&SPID1); - spiSend(&SPID1, 1, &digits[i]); /* Non polled method. */ - spiUnselect(&SPID1); - chThdSleepMilliseconds(500); - spiSelect(&SPID1); - spiPolledExchange(&SPID1, digits[i | 0x10]); /* Polled method. */ - spiUnselect(&SPID1); - chThdSleepMilliseconds(500); - i = (i + 1) & 15; - } -} diff --git a/demos/ARMCM3-LPC1343-LPCXPRESSO/mcuconf.h b/demos/ARMCM3-LPC1343-LPCXPRESSO/mcuconf.h deleted file mode 100644 index 7058670134..0000000000 --- a/demos/ARMCM3-LPC1343-LPCXPRESSO/mcuconf.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC13xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 7...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC13xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC13xx_SYSPLL_MUL 6 -#define LPC13xx_SYSPLL_DIV 4 -#define LPC13xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC13xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC13xx_GPT_USE_CT16B0 TRUE -#define LPC13xx_GPT_USE_CT16B1 TRUE -#define LPC13xx_GPT_USE_CT32B0 TRUE -#define LPC13xx_GPT_USE_CT32B1 TRUE -#define LPC13xx_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT16B1_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC13xx_SERIAL_USE_UART0 TRUE -#define LPC13xx_SERIAL_FIFO_PRELOAD 16 -#define LPC13xx_SERIAL_UART0CLKDIV 1 -#define LPC13xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC13xx_SPI_USE_SSP0 TRUE -#define LPC13xx_SPI_USE_SSP1 FALSE -#define LPC13xx_SPI_SSP0CLKDIV 1 -#define LPC13xx_SPI_SSP1CLKDIV 1 -#define LPC13xx_SPI_SSP0_IRQ_PRIORITY 5 -#define LPC13xx_SPI_SSP1_IRQ_PRIORITY 5 -#define LPC13xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC13xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/demos/ARMCM3-LPC1343-OLIMEX/Makefile b/demos/ARMCM3-LPC1343-OLIMEX/Makefile deleted file mode 100644 index c87f797bd1..0000000000 --- a/demos/ARMCM3-LPC1343-OLIMEX/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_LPC_P1343/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC13xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC13xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1343.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1348 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-LPC1343-OLIMEX/chconf.h b/demos/ARMCM3-LPC1343-OLIMEX/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-LPC1343-OLIMEX/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-LPC1343-OLIMEX/halconf.h b/demos/ARMCM3-LPC1343-OLIMEX/halconf.h deleted file mode 100644 index 91d295ccf9..0000000000 --- a/demos/ARMCM3-LPC1343-OLIMEX/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-LPC1343-OLIMEX/main.c b/demos/ARMCM3-LPC1343-OLIMEX/main.c deleted file mode 100644 index d0ebafaa7f..0000000000 --- a/demos/ARMCM3-LPC1343-OLIMEX/main.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * LED blinker1 thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker1"); - while (TRUE) { - palClearPad(GPIO3, GPIO3_LED1); - chThdSleepMilliseconds(500); - palSetPad(GPIO3, GPIO3_LED1); - chThdSleepMilliseconds(500); - } -} - -/* - * LED blinker2 thread, times are in milliseconds. - */ -static WORKING_AREA(waThread2, 128); -static msg_t Thread2(void *arg) { - - (void)arg; - chRegSetThreadName("blinker2"); - while (TRUE) { - palClearPad(GPIO3, GPIO3_LED2); - chThdSleepMilliseconds(500); - palSetPad(GPIO3, GPIO3_LED2); - chThdSleepMilliseconds(480); - } -} - -/* - * LED scanlight thread, times are in milliseconds. - */ -static WORKING_AREA(waThread3, 128); -static msg_t Thread3(void *arg) { - - (void)arg; - chRegSetThreadName("scanner1"); - palSetPort(GPIO2, PAL_PORT_BIT(GPIO2_LED5) | - PAL_PORT_BIT(GPIO2_LED6) | - PAL_PORT_BIT(GPIO2_LED7) | - PAL_PORT_BIT(GPIO2_LED8)); - while (TRUE) { - palClearPort( GPIO2, PAL_PORT_BIT(GPIO2_LED5)); - chThdSleepMilliseconds(50); - palSetPort( GPIO2, PAL_PORT_BIT(GPIO2_LED8)); - chThdSleepMilliseconds(150); - palClearPort( GPIO2, PAL_PORT_BIT(GPIO2_LED6)); - chThdSleepMilliseconds(50); - palSetPort( GPIO2, PAL_PORT_BIT(GPIO2_LED5)); - chThdSleepMilliseconds(150); - palClearPort( GPIO2, PAL_PORT_BIT(GPIO2_LED7)); - chThdSleepMilliseconds(50); - palSetPort( GPIO2, PAL_PORT_BIT(GPIO2_LED6)); - chThdSleepMilliseconds(150); - palClearPort( GPIO2, PAL_PORT_BIT(GPIO2_LED8)); - chThdSleepMilliseconds(50); - palSetPort( GPIO2, PAL_PORT_BIT(GPIO2_LED7)); - chThdSleepMilliseconds(150); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Creates the LED threads. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO, Thread3, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM3-LPC1343-OLIMEX/mcuconf.h b/demos/ARMCM3-LPC1343-OLIMEX/mcuconf.h deleted file mode 100644 index 5b486fe633..0000000000 --- a/demos/ARMCM3-LPC1343-OLIMEX/mcuconf.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC13xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 7...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC13xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC13xx_SYSPLL_MUL 6 -#define LPC13xx_SYSPLL_DIV 4 -#define LPC13xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC13xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC13xx_GPT_USE_CT16B0 TRUE -#define LPC13xx_GPT_USE_CT16B1 TRUE -#define LPC13xx_GPT_USE_CT32B0 TRUE -#define LPC13xx_GPT_USE_CT32B1 TRUE -#define LPC13xx_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT16B1_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC13xx_SERIAL_USE_UART0 TRUE -#define LPC13xx_SERIAL_FIFO_PRELOAD 16 -#define LPC13xx_SERIAL_UART0CLKDIV 1 -#define LPC13xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC13xx_SPI_USE_SSP0 TRUE -#define LPC13xx_SPI_SSP0CLKDIV 1 -#define LPC13xx_SPI_SSP0_IRQ_PRIORITY 5 -#define LPC13xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC13xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/.cproject b/demos/ARMCM3-STM32F100-DISCOVERY/.cproject deleted file mode 100644 index 4398edd6ee..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/.cproject +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/.project b/demos/ARMCM3-STM32F100-DISCOVERY/.project deleted file mode 100644 index 778be5cc48..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - ARMCM3-STM32F100-DISCOVERY - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32VL_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/Makefile b/demos/ARMCM3-STM32F100-DISCOVERY/Makefile deleted file mode 100644 index 1438aabd23..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM32VL_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F100xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/chconf.h b/demos/ARMCM3-STM32F100-DISCOVERY/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/halconf.h b/demos/ARMCM3-STM32F100-DISCOVERY/halconf.h deleted file mode 100644 index 01ebaf5056..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.ewp b/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.ewp deleted file mode 100644 index ce8710f22e..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.ewp +++ /dev/null @@ -1,2305 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\ST_STM32VL_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\boards\ST_STM32VL_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\adc_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\adc_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f100.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f105_f107.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\pwm_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\pwm_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\spi_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\spi_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_rcc.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32f10x.h - - - - port - - STM32F1xx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.eww b/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.icf b/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.icf deleted file mode 100644 index fe1ac2c14e..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/keil/ch.uvproj b/demos/ARMCM3-STM32F100-DISCOVERY/keil/ch.uvproj deleted file mode 100644 index 04bc38e644..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/keil/ch.uvproj +++ /dev/null @@ -1,1135 +0,0 @@ - - - - 1.1 - -
### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - STM32F100RB - STMicroelectronics - IRAM(0x20000000-0x20001FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") - - "STARTUP\ST\STM32F10x\startup_stm32f10x_md_vl.s" ("STM32 Medium density Value Line Startup Code") - UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000) - 5086 - stm32f10x.h - - - - - - - - - - SFD\ST\STM32F100x\STM32F100.sfr - 0 - - - - ST\STM32F10x\ - ST\STM32F10x\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - - DCM.DLL - -pCM3 - SARMCM3.DLL - - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 1 - 0x8000000 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x2000 - - - 0 - 0x20002000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\STM32F1xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\STM32;..\..\..\os\hal\platforms\STM32\GPIOv1;..\..\..\os\hal\platforms\STM32\DMAv1;..\..\..\os\hal\platforms\STM32\USBv1;..\..\..\os\hal\platforms\STM32F1xx;..\..\..\boards\ST_STM32VL_DISCOVERY;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\ST_STM32VL_DISCOVERY;..\..\..\os\ports\RVCT\ARMCMx\STM32F1xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\ST_STM32VL_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\boards\ST_STM32VL_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - vectors.s - 2 - D:\Progetti\ChibiOS-RT\os\ports\RVCT\ARMCMx\STM32F1xx\vectors.s - - - chcoreasm_v7m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - can.c - 1 - ..\..\..\os\hal\src\can.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - i2c.c - 1 - ..\..\..\os\hal\src\i2c.c - - - mac.c - 1 - ..\..\..\os\hal\src\mac.c - - - mmc_spi.c - 1 - ..\..\..\os\hal\src\mmc_spi.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - uart.c - 1 - ..\..\..\os\hal\src\uart.c - - - adc.h - 5 - ..\..\..\os\hal\include\adc.h - - - can.h - 5 - ..\..\..\os\hal\include\can.h - - - hal.h - 5 - ..\..\..\os\hal\include\hal.h - - - i2c.h - 5 - ..\..\..\os\hal\include\i2c.h - - - mac.h - 5 - ..\..\..\os\hal\include\mac.h - - - mii.h - 5 - ..\..\..\os\hal\include\mii.h - - - mmc_spi.h - 5 - ..\..\..\os\hal\include\mmc_spi.h - - - pal.h - 5 - ..\..\..\os\hal\include\pal.h - - - pwm.h - 5 - ..\..\..\os\hal\include\pwm.h - - - serial.h - 5 - ..\..\..\os\hal\include\serial.h - - - spi.h - 5 - ..\..\..\os\hal\include\spi.h - - - uart.h - 5 - ..\..\..\os\hal\include\uart.h - - - usb.c - 1 - ..\..\..\os\hal\src\usb.c - - - ext.c - 1 - ..\..\..\os\hal\src\ext.c - - - gpt.c - 1 - ..\..\..\os\hal\src\gpt.c - - - icu.c - 1 - ..\..\..\os\hal\src\icu.c - - - rtc.c - 1 - ..\..\..\os\hal\src\rtc.c - - - sdc.c - 1 - ..\..\..\os\hal\src\sdc.c - - - serial_usb.c - 1 - ..\..\..\os\hal\src\serial_usb.c - - - tm.c - 1 - ..\..\..\os\hal\src\tm.c - - - usb_cdc.h - 5 - ..\..\..\os\hal\include\usb_cdc.h - - - ext.h - 5 - ..\..\..\os\hal\include\ext.h - - - gpt.h - 5 - ..\..\..\os\hal\include\gpt.h - - - icu.h - 5 - ..\..\..\os\hal\include\icu.h - - - rtc.h - 5 - ..\..\..\os\hal\include\rtc.h - - - sdc.h - 5 - ..\..\..\os\hal\include\sdc.h - - - serial_usb.h - 5 - ..\..\..\os\hal\include\serial_usb.h - - - tm.h - 5 - ..\..\..\os\hal\include\tm.h - - - usb.h - 5 - ..\..\..\os\hal\include\usb.h - - - - - platform - - - adc_lld.c - 1 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\adc_lld.c - - - can_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\can_lld.c - - - hal_lld.c - 1 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\hal_lld.c - - - pal_lld.c - 1 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - pwm_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\pwm_lld.c - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\serial_lld.c - - - spi_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\spi_lld.c - - - uart_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\uart_lld.c - - - adc_lld.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\adc_lld.h - - - can_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\can_lld.h - - - hal_lld.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\hal_lld.h - - - hal_lld_f103.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - pal_lld.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - pwm_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\pwm_lld.h - - - serial_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\serial_lld.h - - - spi_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\spi_lld.h - - - stm32f10x.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\stm32f10x.h - - - uart_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\uart_lld.h - - - stm32_dma.c - 1 - ..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.h - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - - - - - -
diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/main.c b/demos/ARMCM3-STM32F100-DISCOVERY/main.c deleted file mode 100644 index 3c5079bd7f..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/main.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -static void pwmpcb(PWMDriver *pwmp); -static void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n); -static void spicb(SPIDriver *spip); - -/* Total number of channels to be sampled by a single ADC operation.*/ -#define ADC_GRP1_NUM_CHANNELS 2 - -/* Depth of the conversion buffer, channels are sampled four times each.*/ -#define ADC_GRP1_BUF_DEPTH 4 - -/* - * ADC samples buffer. - */ -static adcsample_t samples[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; - -/* - * ADC conversion group. - * Mode: Linear buffer, 4 samples of 2 channels, SW triggered. - * Channels: IN10 (41.5 cycles sample time) - * Sensor (239.5 cycles sample time) - */ -static const ADCConversionGroup adcgrpcfg = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - adccb, - NULL, - /* HW dependent part.*/ - 0, - ADC_CR2_TSVREFE, - ADC_SMPR1_SMP_AN10(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5), - 0, - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ1_N(ADC_CHANNEL_SENSOR) -}; - -/* - * PWM configuration structure. - * Cyclic callback enabled, channels 3 and 4 enabled without callbacks, - * the active state is a logic one. - */ -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* PWM period 1S (in ticks). */ - pwmpcb, - { - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL} - }, - /* HW dependent part.*/ - 0, -#if STM32_PWM_USE_ADVANCED - 0 -#endif -}; - -/* - * SPI configuration structure. - * Maximum speed (12MHz), CPHA=0, CPOL=0, 16bits frames, MSb transmitted first. - * The slave select line is the pin GPIOA_SPI1NSS on the port GPIOA. - */ -static const SPIConfig spicfg = { - spicb, - /* HW dependent part.*/ - GPIOA, - GPIOA_SPI1NSS, - SPI_CR1_DFF -}; - -/* - * PWM cyclic callback. - * A new ADC conversion is started. - */ -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - - /* Starts an asynchronous ADC conversion operation, the conversion - will be executed in parallel to the current PWM cycle and will - terminate before the next PWM cycle.*/ - chSysLockFromIsr(); - adcStartConversionI(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH); - chSysUnlockFromIsr(); -} - -/* - * ADC end conversion callback. - * The PWM channels are reprogrammed using the latest ADC samples. - * The latest samples are transmitted into a single SPI transaction. - */ -void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void) buffer; (void) n; - /* Note, only in the ADC_COMPLETE state because the ADC driver fires an - intermediate callback when the buffer is half full.*/ - if (adcp->state == ADC_COMPLETE) { - adcsample_t avg_ch1, avg_ch2; - - /* Calculates the average values from the ADC samples.*/ - avg_ch1 = (samples[0] + samples[2] + samples[4] + samples[6]) / 4; - avg_ch2 = (samples[1] + samples[3] + samples[5] + samples[7]) / 4; - - chSysLockFromIsr(); - - /* Changes the channels pulse width, the change will be effective - starting from the next cycle.*/ - pwmEnableChannelI(&PWMD3, 2, PWM_FRACTION_TO_WIDTH(&PWMD3, 4096, avg_ch1)); - pwmEnableChannelI(&PWMD3, 3, PWM_FRACTION_TO_WIDTH(&PWMD3, 4096, avg_ch2)); - - /* SPI slave selection and transmission start.*/ - spiSelectI(&SPID1); - spiStartSendI(&SPID1, ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH, samples); - - chSysUnlockFromIsr(); - } -} - -/* - * SPI end transfer callback. - */ -static void spicb(SPIDriver *spip) { - - /* On transfer end just releases the slave select line.*/ - chSysLockFromIsr(); - spiUnselectI(spip); - chSysUnlockFromIsr(); -} - -/* - * This is a periodic thread that does absolutely nothing except increasing - * a seconds counter. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - static uint32_t seconds_counter; - - (void)arg; - chRegSetThreadName("counter"); - while (TRUE) { - chThdSleepMilliseconds(1000); - seconds_counter++; - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * If the user button is pressed after the reset then the test suite is - * executed immediately before activating the various device drivers in - * order to not alter the benchmark scores. - */ - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD1); - - /* - * Initializes the SPI driver 1. - */ - spiStart(&SPID1, &spicfg); - - /* - * Initializes the ADC driver 1. - * The pin PC0 on the port GPIOC is programmed as analog input. - */ - adcStart(&ADCD1, NULL); - palSetGroupMode(GPIOC, PAL_PORT_BIT(0), 0, PAL_MODE_INPUT_ANALOG); - - /* - * Initializes the PWM driver 1, re-routes the TIM3 outputs, programs the - * pins as alternate functions. - * Note, the AFIO access routes the TIM3 output pins on the PC6...PC9 - * where the LEDs are connected. - */ - pwmStart(&PWMD3, &pwmcfg); - AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_0 | AFIO_MAPR_TIM3_REMAP_1; - palSetGroupMode(GPIOC, PAL_PORT_BIT(GPIOC_LED3) | PAL_PORT_BIT(GPIOC_LED4), - 0, - PAL_MODE_STM32_ALTERNATE_PUSHPULL); - - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state, when the button is - * pressed the test procedure is launched with output on the serial - * driver 1. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD1); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/mcuconf.h b/demos/ARMCM3-STM32F100-DISCOVERY/mcuconf.h deleted file mode 100644 index 8c7361203f..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/mcuconf.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F100_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_ADCPRE STM32_ADCPRE_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 TRUE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - diff --git a/demos/ARMCM3-STM32F100-DISCOVERY/readme.txt b/demos/ARMCM3-STM32F100-DISCOVERY/readme.txt deleted file mode 100644 index acd92f66a3..0000000000 --- a/demos/ARMCM3-STM32F100-DISCOVERY/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F100xB. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32VL-Discovery board. - -** The Demo ** - -The demo shows how to use the ADC, PWM and SPI drivers using asynchronous -APIs. The ADC samples two channels (temperature sensor and PC0) and modulates -the PWM using the sampled values. The sample data is also transmitted using -the SPI port 1. -By pressing the button located on the board the test procedure is activated -with output on the serial port COM1 (USART1). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F103-FATFS/.cproject b/demos/ARMCM3-STM32F103-FATFS/.cproject deleted file mode 100644 index e1326e7bea..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F103-FATFS/.project b/demos/ARMCM3-STM32F103-FATFS/.project deleted file mode 100644 index b02fd30a20..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/.project +++ /dev/null @@ -1,48 +0,0 @@ - - - ARMCM3-STM32F103-FATFS - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P103 - - - fatfs - 2 - CHIBIOS/ext/fatfs - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F103-FATFS/Makefile b/demos/ARMCM3-STM32F103-FATFS/Makefile deleted file mode 100644 index 33b6433fbe..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/Makefile +++ /dev/null @@ -1,213 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(TESTSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSTDOUT_SD=SD2 -DSTDIN_SD=SD2 - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F103-FATFS/chconf.h b/demos/ARMCM3-STM32F103-FATFS/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103-FATFS/ffconf.h b/demos/ARMCM3-STM32F103-FATFS/ffconf.h deleted file mode 100644 index e6a13cea3a..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 1 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/demos/ARMCM3-STM32F103-FATFS/halconf.h b/demos/ARMCM3-STM32F103-FATFS/halconf.h deleted file mode 100644 index 40d5d756c4..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103-FATFS/main.c b/demos/ARMCM3-STM32F103-FATFS/main.c deleted file mode 100644 index 42c83435e0..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/main.c +++ /dev/null @@ -1,392 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "evtimer.h" -#include "chprintf.h" - -#include "ff.h" - -/*===========================================================================*/ -/* Card insertion monitor. */ -/*===========================================================================*/ - -#define POLLING_INTERVAL 10 -#define POLLING_DELAY 10 - -/** - * @brief Card monitor timer. - */ -static VirtualTimer tmr; - -/** - * @brief Debounce counter. - */ -static unsigned cnt; - -/** - * @brief Card event sources. - */ -static EventSource inserted_event, removed_event; - -/** - * @brief Insertion monitor timer callback function. - * - * @param[in] p pointer to the @p BaseBlockDevice object - * - * @notapi - */ -static void tmrfunc(void *p) { - BaseBlockDevice *bbdp = p; - - /* The presence check is performed only while the driver is not in a - transfer state because it is often performed by changing the mode of - the pin connected to the CS/D3 contact of the card, this could disturb - the transfer.*/ - blkstate_t state = blkGetDriverState(bbdp); - chSysLockFromIsr(); - if ((state != BLK_READING) && (state != BLK_WRITING)) { - /* Safe to perform the check.*/ - if (cnt > 0) { - if (blkIsInserted(bbdp)) { - if (--cnt == 0) { - chEvtBroadcastI(&inserted_event); - } - } - else - cnt = POLLING_INTERVAL; - } - else { - if (!blkIsInserted(bbdp)) { - cnt = POLLING_INTERVAL; - chEvtBroadcastI(&removed_event); - } - } - } - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, bbdp); - chSysUnlockFromIsr(); -} - -/** - * @brief Polling monitor start. - * - * @param[in] p pointer to an object implementing @p BaseBlockDevice - * - * @notapi - */ -static void tmr_init(void *p) { - - chEvtInit(&inserted_event); - chEvtInit(&removed_event); - chSysLock(); - cnt = POLLING_INTERVAL; - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, p); - chSysUnlock(); -} - -/*===========================================================================*/ -/* FatFs related. */ -/*===========================================================================*/ - -/** - * @brief FS object. - */ -FATFS MMC_FS; - -/** - * MMC driver instance. - */ -MMCDriver MMCD1; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig hs_spicfg = {NULL, IOPORT2, GPIOB_SPI2NSS, 0}; - -/* Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig ls_spicfg = {NULL, IOPORT2, GPIOB_SPI2NSS, - SPI_CR1_BR_2 | SPI_CR1_BR_1}; - -/* MMC/SD over SPI driver configuration.*/ -static MMCConfig mmccfg = {&SPID2, &ls_spicfg, &hs_spicfg}; - -/* Generic large buffer.*/ -uint8_t fbuff[1024]; - -static FRESULT scan_files(BaseSequentialStream *chp, char *path) { - FRESULT res; - FILINFO fno; - DIR dir; - int i; - char *fn; - -#if _USE_LFN - fno.lfname = 0; - fno.lfsize = 0; -#endif - res = f_opendir(&dir, path); - if (res == FR_OK) { - i = strlen(path); - for (;;) { - res = f_readdir(&dir, &fno); - if (res != FR_OK || fno.fname[0] == 0) - break; - if (fno.fname[0] == '.') - continue; - fn = fno.fname; - if (fno.fattrib & AM_DIR) { - path[i++] = '/'; - strcpy(&path[i], fn); - res = scan_files(chp, path); - if (res != FR_OK) - break; - path[--i] = 0; - } - else { - chprintf(chp, "%s/%s\r\n", path, fn); - } - } - } - return res; -} - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_tree(BaseSequentialStream *chp, int argc, char *argv[]) { - FRESULT err; - uint32_t clusters; - FATFS *fsp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: tree\r\n"); - return; - } - if (!fs_ready) { - chprintf(chp, "File System not mounted\r\n"); - return; - } - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chprintf(chp, "FS: f_getfree() failed\r\n"); - return; - } - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)MMC_FS.csize, - clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMC_SECTOR_SIZE); - fbuff[0] = 0; - scan_files(chp, (char *)fbuff); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"tree", cmd_tree}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/*===========================================================================*/ -/* Main and generic code. */ -/*===========================================================================*/ - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palTogglePad(IOPORT3, GPIOC_LED); - if (fs_ready) - chThdSleepMilliseconds(200); - else - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * MMC card insertion event. - */ -static void InsertHandler(eventid_t id) { - FRESULT err; - - (void)id; - /* - * On insertion MMC initialization and FS mount. - */ - if (mmcConnect(&MMCD1)) { - return; - } - err = f_mount(0, &MMC_FS); - if (err != FR_OK) { - mmcDisconnect(&MMCD1); - return; - } - fs_ready = TRUE; -} - -/* - * MMC card removal event. - */ -static void RemoveHandler(eventid_t id) { - - (void)id; - mmcDisconnect(&MMCD1); - fs_ready = FALSE; -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - InsertHandler, - RemoveHandler - }; - Thread *shelltp = NULL; - struct EventListener el0, el1; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Initializes the MMC driver to work with SPI2. - */ - palSetPadMode(IOPORT2, GPIOB_SPI2NSS, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(IOPORT2, GPIOB_SPI2NSS); - mmcObjectInit(&MMCD1); - mmcStart(&MMCD1, &mmccfg); - - /* - * Activates the card insertion monitor. - */ - tmr_init(&MMCD1); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and listen for events. - */ - chEvtRegister(&inserted_event, &el0, 0); - chEvtRegister(&removed_event, &el1, 1); - while (TRUE) { - if (!shelltp) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chEvtDispatch(evhndl, chEvtWaitOneTimeout(ALL_EVENTS, MS2ST(500))); - } - return 0; -} diff --git a/demos/ARMCM3-STM32F103-FATFS/mcuconf.h b/demos/ARMCM3-STM32F103-FATFS/mcuconf.h deleted file mode 100644 index c523f51ab1..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/demos/ARMCM3-STM32F103-FATFS/readme.txt b/demos/ARMCM3-STM32F103-FATFS/readme.txt deleted file mode 100644 index 4178478bb3..0000000000 --- a/demos/ARMCM3-STM32F103-FATFS/readme.txt +++ /dev/null @@ -1,33 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F103. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -This demo shows how to integrate the FatFs file system and use the SPI and MMC -drivers. -The demo flashes the board LED using a thread and monitors the MMC slot for -a card insertion. When a card is inserted then the file system is mounted -and the LED flashes faster. -A command line shell is spawned on SD2, all the interaction with the demo is -performed using the command shell, type "help" for a list of the available -commands. - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain, -YAGARTO and an experimental WinARM build including GCC 4.3.0. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F103-G++/.cproject b/demos/ARMCM3-STM32F103-G++/.cproject deleted file mode 100644 index bbb50b1d8f..0000000000 --- a/demos/ARMCM3-STM32F103-G++/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F103-G++/.project b/demos/ARMCM3-STM32F103-G++/.project deleted file mode 100644 index 252cbf296a..0000000000 --- a/demos/ARMCM3-STM32F103-G++/.project +++ /dev/null @@ -1,44 +0,0 @@ - - - ARMCM3-STM32F103-G++ - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P103 - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F103-G++/Makefile b/demos/ARMCM3-STM32F103-G++/Makefile deleted file mode 100644 index 7fa37b7b07..0000000000 --- a/demos/ARMCM3-STM32F103-G++/Makefile +++ /dev/null @@ -1,208 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(CHIBIOS)/os/various/ch.cpp main.cpp - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -#LD = $(TRGT)gcc -LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F103-G++/chconf.h b/demos/ARMCM3-STM32F103-G++/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F103-G++/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103-G++/halconf.h b/demos/ARMCM3-STM32F103-G++/halconf.h deleted file mode 100644 index 0b2461b618..0000000000 --- a/demos/ARMCM3-STM32F103-G++/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp deleted file mode 100644 index 431367d55c..0000000000 --- a/demos/ARMCM3-STM32F103-G++/main.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.hpp" -#include "hal.h" -#include "test.h" -#include "evtimer.h" - -using namespace chibios_rt; - -/* - * LED blink sequences. - * NOTE: Sequences must always be terminated by a GOTO instruction. - * NOTE: The sequencer language could be easily improved but this is outside - * the scope of this demo. - */ -#define SLEEP 0 -#define GOTO 1 -#define STOP 2 -#define BITCLEAR 3 -#define BITSET 4 - -typedef struct { - uint8_t action; - uint32_t value; -} seqop_t; - -// Flashing sequence for LED1. -static const seqop_t LED1_sequence[] = -{ - {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 200}, - {BITSET, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 800}, - {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 400}, - {BITSET, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 600}, - {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 600}, - {BITSET, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 400}, - {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 800}, - {BITSET, PAL_PORT_BIT(GPIOC_LED)}, - {SLEEP, 200}, - {GOTO, 0} -}; - -/* - * Sequencer thread class. It can drive LEDs or other output pins. - * Any sequencer is just an instance of this class, all the details are - * totally encapsulated and hidden to the application level. - */ -class SequencerThread : public EnhancedThread<128> { -private: - const seqop_t *base, *curr; // Thread local variables. - -protected: - virtual msg_t Main(void) { - while (true) { - switch(curr->action) { - case SLEEP: - Sleep(curr->value); - break; - case GOTO: - curr = &base[curr->value]; - continue; - case STOP: - return 0; - case BITCLEAR: - palClearPort(GPIOC, curr->value); - break; - case BITSET: - palSetPort(GPIOC, curr->value); - break; - } - curr++; - } - } - -public: - SequencerThread(const seqop_t *sequence) : EnhancedThread<128>("sequencer") { - - base = curr = sequence; - } -}; - -/* - * Tester thread class. This thread executes the test suite. - */ -class TesterThread : public EnhancedThread<256> { - -protected: - virtual msg_t Main(void) { - - return TestThread(&SD2); - } - -public: - TesterThread(void) : EnhancedThread<256>("tester") { - } -}; - -/* - * Executed as an event handler at 500mS intervals. - */ -static void TimerHandler(eventid_t id) { - - (void)id; - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - TesterThread tester; - tester.Wait(); - }; -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - TimerHandler - }; - static EvTimer evt; - struct EventListener el0; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - System::Init(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - evtInit(&evt, 500); // Initializes an event timer. - evtStart(&evt); // Starts the event timer. - chEvtRegister(&evt.et_es, &el0, 0); // Registers a listener on the source. - - /* - * Starts several instances of the SequencerThread class, each one operating - * on a different LED. - */ - SequencerThread blinker1(LED1_sequence); - - /* - * Serves timer events. - */ - while (true) - Event::Dispatch(evhndl, Event::WaitOne(ALL_EVENTS)); - - return 0; -} diff --git a/demos/ARMCM3-STM32F103-G++/mcuconf.h b/demos/ARMCM3-STM32F103-G++/mcuconf.h deleted file mode 100644 index b3c48a3b29..0000000000 --- a/demos/ARMCM3-STM32F103-G++/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/demos/ARMCM3-STM32F103-G++/readme.txt b/demos/ARMCM3-STM32F103-G++/readme.txt deleted file mode 100644 index e4ff861569..0000000000 --- a/demos/ARMCM3-STM32F103-G++/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F103. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The demo flashes the board LED using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port -SD2 (USART2). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F103/.cproject b/demos/ARMCM3-STM32F103/.cproject deleted file mode 100644 index 3eb8aa88c7..0000000000 --- a/demos/ARMCM3-STM32F103/.cproject +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F103/.project b/demos/ARMCM3-STM32F103/.project deleted file mode 100644 index c32eaeafce..0000000000 --- a/demos/ARMCM3-STM32F103/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - ARMCM3-STM32F103 - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P103 - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F103/Makefile b/demos/ARMCM3-STM32F103/Makefile deleted file mode 100644 index f9c6ec62a0..0000000000 --- a/demos/ARMCM3-STM32F103/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F103/chconf.h b/demos/ARMCM3-STM32F103/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F103/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103/codeblocks/ch.cbp b/demos/ARMCM3-STM32F103/codeblocks/ch.cbp deleted file mode 100644 index 3de4549fbf..0000000000 --- a/demos/ARMCM3-STM32F103/codeblocks/ch.cbp +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - diff --git a/demos/ARMCM3-STM32F103/codeblocks/ch.workspace b/demos/ARMCM3-STM32F103/codeblocks/ch.workspace deleted file mode 100644 index bee5a82f66..0000000000 --- a/demos/ARMCM3-STM32F103/codeblocks/ch.workspace +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/demos/ARMCM3-STM32F103/halconf.h b/demos/ARMCM3-STM32F103/halconf.h deleted file mode 100644 index 0b2461b618..0000000000 --- a/demos/ARMCM3-STM32F103/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103/iar/ch.ewp b/demos/ARMCM3-STM32F103/iar/ch.ewp deleted file mode 100644 index 95822a6769..0000000000 --- a/demos/ARMCM3-STM32F103/iar/ch.ewp +++ /dev/null @@ -1,2287 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\OLIMEX_STM32_P103\board.c - - - $PROJ_DIR$\..\..\..\boards\OLIMEX_STM32_P103\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f100.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f105_f107.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_rcc.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32f10x.h - - - - port - - STM32F1xx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM3-STM32F103/iar/ch.eww b/demos/ARMCM3-STM32F103/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM3-STM32F103/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM3-STM32F103/iar/ch.icf b/demos/ARMCM3-STM32F103/iar/ch.icf deleted file mode 100644 index 67ef6e73aa..0000000000 --- a/demos/ARMCM3-STM32F103/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM3-STM32F103/keil/ch.uvproj b/demos/ARMCM3-STM32F103/keil/ch.uvproj deleted file mode 100644 index 343efce1c8..0000000000 --- a/demos/ARMCM3-STM32F103/keil/ch.uvproj +++ /dev/null @@ -1,1075 +0,0 @@ - - - - 1.1 - -
### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - STM32F103RB - STMicroelectronics - IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") - - "STARTUP\ST\STM32F10x.s" ("STM32 Startup Code") - UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000) - 4231 - stm32f10x_lib.h - - - - - - - - - - - 0 - - - - ST\STM32F10x\ - ST\STM32F10x\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - - DARMSTM.DLL - -pSTM32F103RB - SARMCM3.DLL - - TARMSTM.DLL - -pSTM32F103RB - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x5000 - - - 1 - 0x8000000 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x5000 - - - 0 - 0x20005000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\STM32F1xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\STM32;..\..\..\os\hal\platforms\STM32\GPIOv1;..\..\..\os\hal\platforms\STM32\DMAv1;..\..\..\os\hal\platforms\STM32\USBv1;..\..\..\os\hal\platforms\STM32F1xx;..\..\..\boards\OLIMEX_STM32_P103;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\OLIMEX_STM32_P103;..\..\..\os\ports\RVCT\ARMCMx\STM32F1xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\OLIMEX_STM32_P103\board.c - - - board.h - 5 - ..\..\..\boards\OLIMEX_STM32_P103\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - vectors.s - 2 - D:\Progetti\ChibiOS-RT\os\ports\RVCT\ARMCMx\STM32F1xx\vectors.s - - - chcoreasm_v7m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - can.c - 1 - ..\..\..\os\hal\src\can.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - i2c.c - 1 - ..\..\..\os\hal\src\i2c.c - - - mac.c - 1 - ..\..\..\os\hal\src\mac.c - - - mmc_spi.c - 1 - ..\..\..\os\hal\src\mmc_spi.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - uart.c - 1 - ..\..\..\os\hal\src\uart.c - - - adc.h - 5 - ..\..\..\os\hal\include\adc.h - - - can.h - 5 - ..\..\..\os\hal\include\can.h - - - hal.h - 5 - ..\..\..\os\hal\include\hal.h - - - i2c.h - 5 - ..\..\..\os\hal\include\i2c.h - - - mac.h - 5 - ..\..\..\os\hal\include\mac.h - - - mii.h - 5 - ..\..\..\os\hal\include\mii.h - - - mmc_spi.h - 5 - ..\..\..\os\hal\include\mmc_spi.h - - - pal.h - 5 - ..\..\..\os\hal\include\pal.h - - - pwm.h - 5 - ..\..\..\os\hal\include\pwm.h - - - serial.h - 5 - ..\..\..\os\hal\include\serial.h - - - spi.h - 5 - ..\..\..\os\hal\include\spi.h - - - uart.h - 5 - ..\..\..\os\hal\include\uart.h - - - ext.c - 1 - ..\..\..\os\hal\src\ext.c - - - gpt.c - 1 - ..\..\..\os\hal\src\gpt.c - - - icu.c - 1 - ..\..\..\os\hal\src\icu.c - - - rtc.c - 1 - ..\..\..\os\hal\src\rtc.c - - - sdc.c - 1 - ..\..\..\os\hal\src\sdc.c - - - serial_usb.c - 1 - ..\..\..\os\hal\src\serial_usb.c - - - usb.c - 1 - ..\..\..\os\hal\src\usb.c - - - ext.h - 5 - ..\..\..\os\hal\include\ext.h - - - gpt.h - 5 - ..\..\..\os\hal\include\gpt.h - - - icu.h - 5 - ..\..\..\os\hal\include\icu.h - - - rtc.h - 5 - ..\..\..\os\hal\include\rtc.h - - - sdc.h - 5 - ..\..\..\os\hal\include\sdc.h - - - serial_usb.h - 5 - ..\..\..\os\hal\include\serial_usb.h - - - usb.h - 5 - ..\..\..\os\hal\include\usb.h - - - usb_cdc.h - 5 - ..\..\..\os\hal\include\usb_cdc.h - - - tm.h - 5 - ..\..\..\os\hal\include\tm.h - - - tm.c - 1 - ..\..\..\os\hal\src\tm.c - - - - - platform - - - hal_lld.c - 1 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\hal_lld.c - - - pal_lld.c - 1 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\serial_lld.c - - - hal_lld.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\hal_lld.h - - - hal_lld_f103.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - pal_lld.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - serial_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\serial_lld.h - - - stm32f10x.h - 5 - D:\Progetti\ChibiOS-RT\os\hal\platforms\STM32F1xx\stm32f10x.h - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - mcuconf.h - 5 - ..\mcuconf.h - - - - - - - -
diff --git a/demos/ARMCM3-STM32F103/main.c b/demos/ARMCM3-STM32F103/main.c deleted file mode 100644 index 88786fdd2e..0000000000 --- a/demos/ARMCM3-STM32F103/main.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD2); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM3-STM32F103/mcuconf.h b/demos/ARMCM3-STM32F103/mcuconf.h deleted file mode 100644 index b3c48a3b29..0000000000 --- a/demos/ARMCM3-STM32F103/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/demos/ARMCM3-STM32F103/readme.txt b/demos/ARMCM3-STM32F103/readme.txt deleted file mode 100644 index e4ff861569..0000000000 --- a/demos/ARMCM3-STM32F103/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F103. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The demo flashes the board LED using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port -SD2 (USART2). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F103/ride7/ch.rapp b/demos/ARMCM3-STM32F103/ride7/ch.rapp deleted file mode 100644 index f0aec5e6d0..0000000000 --- a/demos/ARMCM3-STM32F103/ride7/ch.rapp +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - -
- -
- -
- - -
-
- - -
-
- - -
- -
- -
- - - -
-
- - - -
-
- - - -
-
- - -
- -
- -
- - -
-
- - -
- -
-
-
-
\ No newline at end of file diff --git a/demos/ARMCM3-STM32F103/ride7/ch.rprj b/demos/ARMCM3-STM32F103/ride7/ch.rprj deleted file mode 100644 index d9f866c847..0000000000 --- a/demos/ARMCM3-STM32F103/ride7/ch.rprj +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/.cproject b/demos/ARMCM3-STM32F103ZG-FATFS/.cproject deleted file mode 100644 index 09c606434a..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/.project b/demos/ARMCM3-STM32F103ZG-FATFS/.project deleted file mode 100644 index 00c9826813..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/.project +++ /dev/null @@ -1,48 +0,0 @@ - - - ARMCM3-STM32F103ZG-FATFS - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM3210E_EVAL - - - fatfs - 2 - CHIBIOS/ext/fatfs - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/Makefile b/demos/ARMCM3-STM32F103ZG-FATFS/Makefile deleted file mode 100644 index f258f4faf1..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/Makefile +++ /dev/null @@ -1,214 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM3210E_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xG.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(TESTSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSTDOUT_SD=SD1 -DSTDIN_SD=SD1 - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/chconf.h b/demos/ARMCM3-STM32F103ZG-FATFS/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/ffconf.h b/demos/ARMCM3-STM32F103ZG-FATFS/ffconf.h deleted file mode 100644 index e6a13cea3a..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 1 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/halconf.h b/demos/ARMCM3-STM32F103ZG-FATFS/halconf.h deleted file mode 100644 index 63e37a04e4..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp b/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp deleted file mode 100644 index c67494acff..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp +++ /dev/null @@ -1,2330 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\ST_STM3210E_EVAL\board.c - - - $PROJ_DIR$\..\..\..\boards\ST_STM3210E_EVAL\board.h - - - - fatfs - - $PROJ_DIR$\..\..\..\ext\fatfs\src\diskio.c - - - $PROJ_DIR$\..\..\..\ext\fatfs\src\diskio.h - - - $PROJ_DIR$\..\..\..\ext\fatfs\src\ff.c - - - $PROJ_DIR$\..\..\..\ext\fatfs\src\ff.h - - - $PROJ_DIR$\..\..\..\ext\fatfs\src\ffconf.h - - - $PROJ_DIR$\..\..\..\ext\fatfs\src\integer.h - - - $PROJ_DIR$\..\..\..\ext\fatfs\src\option\syncobj.c - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f100.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f105_f107.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\sdc_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\sdc_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_rcc.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32f10x.h - - - - port - - STM32F1xx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - various - - $PROJ_DIR$\..\..\..\os\various\chprintf.c - - - $PROJ_DIR$\..\..\..\os\various\chprintf.h - - - $PROJ_DIR$\..\..\..\os\various\shell.c - - - $PROJ_DIR$\..\..\..\os\various\shell.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.eww b/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.icf b/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.icf deleted file mode 100644 index b29e342a92..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x08100000; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/main.c b/demos/ARMCM3-STM32F103ZG-FATFS/main.c deleted file mode 100644 index 28bd21d3ad..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/main.c +++ /dev/null @@ -1,369 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "evtimer.h" -#include "chprintf.h" - -#include "ff.h" - -/*===========================================================================*/ -/* Card insertion monitor. */ -/*===========================================================================*/ - -#define POLLING_INTERVAL 10 -#define POLLING_DELAY 10 - -/** - * @brief Card monitor timer. - */ -static VirtualTimer tmr; - -/** - * @brief Debounce counter. - */ -static unsigned cnt; - -/** - * @brief Card event sources. - */ -static EventSource inserted_event, removed_event; - -/** - * @brief Insertion monitor timer callback function. - * - * @param[in] p pointer to the @p BaseBlockDevice object - * - * @notapi - */ -static void tmrfunc(void *p) { - BaseBlockDevice *bbdp = p; - - chSysLockFromIsr(); - if (cnt > 0) { - if (blkIsInserted(bbdp)) { - if (--cnt == 0) { - chEvtBroadcastI(&inserted_event); - } - } - else - cnt = POLLING_INTERVAL; - } - else { - if (!blkIsInserted(bbdp)) { - cnt = POLLING_INTERVAL; - chEvtBroadcastI(&removed_event); - } - } - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, bbdp); - chSysUnlockFromIsr(); -} - -/** - * @brief Polling monitor start. - * - * @param[in] p pointer to an object implementing @p BaseBlockDevice - * - * @notapi - */ -static void tmr_init(void *p) { - - chEvtInit(&inserted_event); - chEvtInit(&removed_event); - chSysLock(); - cnt = POLLING_INTERVAL; - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, p); - chSysUnlock(); -} - -/*===========================================================================*/ -/* FatFs related. */ -/*===========================================================================*/ - -/** - * @brief FS object. - */ -FATFS SDC_FS; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Generic large buffer.*/ -uint8_t fbuff[1024]; - -static FRESULT scan_files(BaseSequentialStream *chp, char *path) { - FRESULT res; - FILINFO fno; - DIR dir; - int i; - char *fn; - -#if _USE_LFN - fno.lfname = 0; - fno.lfsize = 0; -#endif - res = f_opendir(&dir, path); - if (res == FR_OK) { - i = strlen(path); - for (;;) { - res = f_readdir(&dir, &fno); - if (res != FR_OK || fno.fname[0] == 0) - break; - if (fno.fname[0] == '.') - continue; - fn = fno.fname; - if (fno.fattrib & AM_DIR) { - path[i++] = '/'; - strcpy(&path[i], fn); - res = scan_files(chp, path); - if (res != FR_OK) - break; - path[--i] = 0; - } - else { - chprintf(chp, "%s/%s\r\n", path, fn); - } - } - } - return res; -} - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_tree(BaseSequentialStream *chp, int argc, char *argv[]) { - FRESULT err; - uint32_t clusters; - FATFS *fsp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: tree\r\n"); - return; - } - if (!fs_ready) { - chprintf(chp, "File System not mounted\r\n"); - return; - } - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chprintf(chp, "FS: f_getfree() failed\r\n"); - return; - } - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)SDC_FS.csize, - clusters * (uint32_t)SDC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - fbuff[0] = 0; - scan_files(chp, (char *)fbuff); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"tree", cmd_tree}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -/*===========================================================================*/ -/* Main and generic code. */ -/*===========================================================================*/ - -/* - * SD card insertion event. - */ -static void InsertHandler(eventid_t id) { - FRESULT err; - - (void)id; - /* - * On insertion SDC initialization and FS mount. - */ - if (sdcConnect(&SDCD1)) - return; - - err = f_mount(0, &SDC_FS); - if (err != FR_OK) { - sdcDisconnect(&SDCD1); - return; - } - fs_ready = TRUE; -} - -/* - * SD card removal event. - */ -static void RemoveHandler(eventid_t id) { - - (void)id; - sdcDisconnect(&SDCD1); - fs_ready = FALSE; -} - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOF, GPIOF_LED4); - palSetPad(GPIOF, GPIOF_LED1); - chThdSleepMilliseconds(250); - palClearPad(GPIOF, GPIOF_LED1); - palSetPad(GPIOF, GPIOF_LED2); - chThdSleepMilliseconds(250); - palClearPad(GPIOF, GPIOF_LED2); - palSetPad(GPIOF, GPIOF_LED3); - chThdSleepMilliseconds(250); - palClearPad(GPIOF, GPIOF_LED3); - palSetPad(GPIOF, GPIOF_LED4); - chThdSleepMilliseconds(250); - } -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - InsertHandler, - RemoveHandler - }; - Thread *shelltp = NULL; - struct EventListener el0, el1; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 and SDC driver 1 using default - * configuration. - */ - sdStart(&SD1, NULL); - sdcStart(&SDCD1, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Activates the card insertion monitor. - */ - tmr_init(&SDCD1); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and listen for events. - */ - chEvtRegister(&inserted_event, &el0, 0); - chEvtRegister(&removed_event, &el1, 1); - while (TRUE) { - if (!shelltp) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chEvtDispatch(evhndl, chEvtWaitOneTimeout(ALL_EVENTS, MS2ST(500))); - } -} diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/mcuconf.h b/demos/ARMCM3-STM32F103ZG-FATFS/mcuconf.h deleted file mode 100644 index 56a5d6a7d0..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/readme.txt b/demos/ARMCM3-STM32F103ZG-FATFS/readme.txt deleted file mode 100644 index 188810c722..0000000000 --- a/demos/ARMCM3-STM32F103ZG-FATFS/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F103ZG. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STM3210E-EVAL board. - -** The Demo ** - -The demo flashes the board LEDs using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port -SD1 (USART1). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F107-FATFS/.cproject b/demos/ARMCM3-STM32F107-FATFS/.cproject deleted file mode 100644 index 5e99ce93d6..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F107-FATFS/.project b/demos/ARMCM3-STM32F107-FATFS/.project deleted file mode 100644 index 684f00f8b2..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/.project +++ /dev/null @@ -1,48 +0,0 @@ - - - ARMCM3-STM32F107-FATFS - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P107 - - - fatfs - 2 - CHIBIOS/ext/fatfs - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F107-FATFS/Makefile b/demos/ARMCM3-STM32F107-FATFS/Makefile deleted file mode 100644 index e3a7d620b8..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/Makefile +++ /dev/null @@ -1,212 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P107/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform_f105_f107.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F107xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(TESTSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F107-FATFS/chconf.h b/demos/ARMCM3-STM32F107-FATFS/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107-FATFS/ffconf.h b/demos/ARMCM3-STM32F107-FATFS/ffconf.h deleted file mode 100644 index e6a13cea3a..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 1 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/demos/ARMCM3-STM32F107-FATFS/halconf.h b/demos/ARMCM3-STM32F107-FATFS/halconf.h deleted file mode 100644 index 40d5d756c4..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107-FATFS/main.c b/demos/ARMCM3-STM32F107-FATFS/main.c deleted file mode 100644 index 9c6e03f5b3..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/main.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "evtimer.h" -#include "chprintf.h" - -#include "ff.h" - -/*===========================================================================*/ -/* Card insertion monitor. */ -/*===========================================================================*/ - -#define POLLING_INTERVAL 10 -#define POLLING_DELAY 10 - -/** - * @brief Card monitor timer. - */ -static VirtualTimer tmr; - -/** - * @brief Debounce counter. - */ -static unsigned cnt; - -/** - * @brief Card event sources. - */ -static EventSource inserted_event, removed_event; - -/** - * @brief Insertion monitor timer callback function. - * - * @param[in] p pointer to the @p BaseBlockDevice object - * - * @notapi - */ -static void tmrfunc(void *p) { - BaseBlockDevice *bbdp = p; - - chSysLockFromIsr(); - if (cnt > 0) { - if (blkIsInserted(bbdp)) { - if (--cnt == 0) { - chEvtBroadcastI(&inserted_event); - } - } - else - cnt = POLLING_INTERVAL; - } - else { - if (!blkIsInserted(bbdp)) { - cnt = POLLING_INTERVAL; - chEvtBroadcastI(&removed_event); - } - } - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, bbdp); - chSysUnlockFromIsr(); -} - -/** - * @brief Polling monitor start. - * - * @param[in] p pointer to an object implementing @p BaseBlockDevice - * - * @notapi - */ -static void tmr_init(void *p) { - - chEvtInit(&inserted_event); - chEvtInit(&removed_event); - chSysLock(); - cnt = POLLING_INTERVAL; - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, p); - chSysUnlock(); -} - -/*===========================================================================*/ -/* FatFs related. */ -/*===========================================================================*/ - -/** - * @brief FS object. - */ -FATFS MMC_FS; - -/** - * MMC driver instance. - */ -MMCDriver MMCD1; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig hs_spicfg = {NULL, GPIOA, GPIOA_SPI3_CS_MMC, 0}; - -/* Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig ls_spicfg = {NULL, GPIOA, GPIOA_SPI3_CS_MMC, - SPI_CR1_BR_2 | SPI_CR1_BR_1}; - -/* MMC/SD over SPI driver configuration.*/ -static MMCConfig mmccfg = {&SPID3, &ls_spicfg, &hs_spicfg}; - -/* Generic large buffer.*/ -uint8_t fbuff[1024]; - -static FRESULT scan_files(BaseSequentialStream *chp, char *path) { - FRESULT res; - FILINFO fno; - DIR dir; - int i; - char *fn; - -#if _USE_LFN - fno.lfname = 0; - fno.lfsize = 0; -#endif - res = f_opendir(&dir, path); - if (res == FR_OK) { - i = strlen(path); - for (;;) { - res = f_readdir(&dir, &fno); - if (res != FR_OK || fno.fname[0] == 0) - break; - if (fno.fname[0] == '.') - continue; - fn = fno.fname; - if (fno.fattrib & AM_DIR) { - path[i++] = '/'; - strcpy(&path[i], fn); - res = scan_files(chp, path); - if (res != FR_OK) - break; - path[--i] = 0; - } - else { - chprintf(chp, "%s/%s\r\n", path, fn); - } - } - } - return res; -} - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_tree(BaseSequentialStream *chp, int argc, char *argv[]) { - FRESULT err; - uint32_t clusters; - FATFS *fsp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: tree\r\n"); - return; - } - if (!fs_ready) { - chprintf(chp, "File System not mounted\r\n"); - return; - } - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chprintf(chp, "FS: f_getfree() failed\r\n"); - return; - } - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)MMC_FS.csize, - clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMC_SECTOR_SIZE); - fbuff[0] = 0; - scan_files(chp, (char *)fbuff); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"tree", cmd_tree}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD3, - commands -}; - -/*===========================================================================*/ -/* Main and generic code. */ -/*===========================================================================*/ - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palTogglePad(IOPORT3, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(fs_ready ? 125 : 500); - } - return 0; -} - -/* - * MMC card insertion event. - */ -static void InsertHandler(eventid_t id) { - FRESULT err; - - (void)id; - /* - * On insertion MMC initialization and FS mount. - */ - if (mmcConnect(&MMCD1)) { - return; - } - err = f_mount(0, &MMC_FS); - if (err != FR_OK) { - mmcDisconnect(&MMCD1); - return; - } - fs_ready = TRUE; -} - -/* - * MMC card removal event. - */ -static void RemoveHandler(eventid_t id) { - - (void)id; - mmcDisconnect(&MMCD1); - fs_ready = FALSE; -} - -/* - * Application entry point. - */ -int main(void) { - static const evhandler_t evhndl[] = { - InsertHandler, - RemoveHandler - }; - Thread *shelltp = NULL; - struct EventListener el0, el1; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD3, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Initializes the MMC driver to work with SPI2. - */ - mmcObjectInit(&MMCD1); - mmcStart(&MMCD1, &mmccfg); - - /* - * Activates the card insertion monitor. - */ - tmr_init(&MMCD1); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and listen for events. - */ - chEvtRegister(&inserted_event, &el0, 0); - chEvtRegister(&removed_event, &el1, 1); - while (TRUE) { - if (!shelltp) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chEvtDispatch(evhndl, chEvtWaitOne(ALL_EVENTS)); - } - return 0; -} diff --git a/demos/ARMCM3-STM32F107-FATFS/mcuconf.h b/demos/ARMCM3-STM32F107-FATFS/mcuconf.h deleted file mode 100644 index a60eb7af84..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/mcuconf.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F107 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F107_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_PREDIV1 -#define STM32_PREDIV1SRC STM32_PREDIV1SRC_PLL2 -#define STM32_PREDIV1_VALUE 5 -#define STM32_PLLMUL_VALUE 9 -#define STM32_PREDIV2_VALUE 5 -#define STM32_PLL2MUL_VALUE 8 -#define STM32_PLL3MUL_VALUE 10 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_OTG_CLOCK_REQUIRED TRUE -#define STM32_OTGFSPRE STM32_OTGFSPRE_DIV3 -#define STM32_I2S_CLOCK_REQUIRED FALSE -#define STM32_MCOSEL STM32_MCOSEL_PLL3 -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/demos/ARMCM3-STM32F107-FATFS/readme.txt b/demos/ARMCM3-STM32F107-FATFS/readme.txt deleted file mode 100644 index bf9d03077d..0000000000 --- a/demos/ARMCM3-STM32F107-FATFS/readme.txt +++ /dev/null @@ -1,33 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F107. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P107 board. - -** The Demo ** - -This demo shows how to integrate the FatFs file system and use the SPI and MMC -drivers. -The demo flashes the board LED using a thread and monitors the MMC slot for -a card insertion. When a card is inserted then the file system is mounted -and the LED flashes faster. -A command line shell is spawned on SD3, all the interaction with the demo is -performed using the command shell, type "help" for a list of the available -commands. - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain, -YAGARTO and an experimental WinARM build including GCC 4.3.0. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F107-LWIP/.cproject b/demos/ARMCM3-STM32F107-LWIP/.cproject deleted file mode 100644 index e04c80ba46..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F107-LWIP/.project b/demos/ARMCM3-STM32F107-LWIP/.project deleted file mode 100644 index c73c5f2f49..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/.project +++ /dev/null @@ -1,48 +0,0 @@ - - - ARMCM3-STM32F107-LWIP - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P107 - - - lwip - 2 - CHIBIOS/ext/lwip - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F107-LWIP/Makefile b/demos/ARMCM3-STM32F107-LWIP/Makefile deleted file mode 100644 index 1f25723132..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/Makefile +++ /dev/null @@ -1,210 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P107/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform_f105_f107.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/lwip_bindings/lwip.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F107xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(LWSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - web/web.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) $(LWINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F107-LWIP/chconf.h b/demos/ARMCM3-STM32F107-LWIP/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107-LWIP/halconf.h b/demos/ARMCM3-STM32F107-LWIP/halconf.h deleted file mode 100644 index ea8a906e99..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC TRUE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107-LWIP/lwipopts.h b/demos/ARMCM3-STM32F107-LWIP/lwipopts.h deleted file mode 100644 index 1bfbd1de6f..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/lwipopts.h +++ /dev/null @@ -1,2030 +0,0 @@ -/** - * @file - * - * lwIP Options Configuration - */ - -/* - * Copyright (c) 2001-2004 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIPOPT_H__ -#define __LWIPOPT_H__ - - -/* - ----------------------------------------------- - ---------- Platform specific locking ---------- - ----------------------------------------------- -*/ - -/** - * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain - * critical regions during buffer allocation, deallocation and memory - * allocation and deallocation. - */ -#ifndef SYS_LIGHTWEIGHT_PROT -#define SYS_LIGHTWEIGHT_PROT 0 -#endif - -/** - * NO_SYS==1: Provides VERY minimal functionality. Otherwise, - * use lwIP facilities. - */ -#ifndef NO_SYS -#define NO_SYS 0 -#endif - -/** - * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 - * Mainly for compatibility to old versions. - */ -#ifndef NO_SYS_NO_TIMERS -#define NO_SYS_NO_TIMERS 0 -#endif - -/** - * MEMCPY: override this if you have a faster implementation at hand than the - * one included in your C library - */ -#ifndef MEMCPY -#define MEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/** - * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a - * call to memcpy() if the length is known at compile time and is small. - */ -#ifndef SMEMCPY -#define SMEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/* - ------------------------------------ - ---------- Memory options ---------- - ------------------------------------ -*/ -/** - * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library - * instead of the lwip internal allocator. Can save code size if you - * already use it. - */ -#ifndef MEM_LIBC_MALLOC -#define MEM_LIBC_MALLOC 0 -#endif - -/** -* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. -* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution -* speed and usage from interrupts! -*/ -#ifndef MEMP_MEM_MALLOC -#define MEMP_MEM_MALLOC 0 -#endif - -/** - * MEM_ALIGNMENT: should be set to the alignment of the CPU - * 4 byte alignment -> #define MEM_ALIGNMENT 4 - * 2 byte alignment -> #define MEM_ALIGNMENT 2 - */ -#ifndef MEM_ALIGNMENT -#define MEM_ALIGNMENT 4 -#endif - -/** - * MEM_SIZE: the size of the heap memory. If the application will send - * a lot of data that needs to be copied, this should be set high. - */ -#ifndef MEM_SIZE -#define MEM_SIZE 1600 -#endif - -/** - * MEMP_SEPARATE_POOLS: if defined to 1, each pool is placed in its own array. - * This can be used to individually change the location of each pool. - * Default is one big array for all pools - */ -#ifndef MEMP_SEPARATE_POOLS -#define MEMP_SEPARATE_POOLS 0 -#endif - -/** - * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable - * amount of bytes before and after each memp element in every pool and fills - * it with a prominent default value. - * MEMP_OVERFLOW_CHECK == 0 no checking - * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed - * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time - * memp_malloc() or memp_free() is called (useful but slow!) - */ -#ifndef MEMP_OVERFLOW_CHECK -#define MEMP_OVERFLOW_CHECK 0 -#endif - -/** - * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make - * sure that there are no cycles in the linked lists. - */ -#ifndef MEMP_SANITY_CHECK -#define MEMP_SANITY_CHECK 0 -#endif - -/** - * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set - * of memory pools of various sizes. When mem_malloc is called, an element of - * the smallest pool that can provide the length needed is returned. - * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. - */ -#ifndef MEM_USE_POOLS -#define MEM_USE_POOLS 0 -#endif - -/** - * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next - * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more - * reliable. */ -#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL -#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 -#endif - -/** - * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h - * that defines additional pools beyond the "standard" ones required - * by lwIP. If you set this to 1, you must have lwippools.h in your - * inlude path somewhere. - */ -#ifndef MEMP_USE_CUSTOM_POOLS -#define MEMP_USE_CUSTOM_POOLS 0 -#endif - -/** - * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from - * interrupt context (or another context that doesn't allow waiting for a - * semaphore). - * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, - * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs - * with each loop so that mem_free can run. - * - * ATTENTION: As you can see from the above description, this leads to dis-/ - * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc - * can need longer. - * - * If you don't want that, at least for NO_SYS=0, you can still use the following - * functions to enqueue a deallocation call which then runs in the tcpip_thread - * context: - * - pbuf_free_callback(p); - * - mem_free_callback(m); - */ -#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT -#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 -#endif - -/* - ------------------------------------------------ - ---------- Internal Memory Pool Sizes ---------- - ------------------------------------------------ -*/ -/** - * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). - * If the application sends a lot of data out of ROM (or other static memory), - * this should be set high. - */ -#ifndef MEMP_NUM_PBUF -#define MEMP_NUM_PBUF 16 -#endif - -/** - * MEMP_NUM_RAW_PCB: Number of raw connection PCBs - * (requires the LWIP_RAW option) - */ -#ifndef MEMP_NUM_RAW_PCB -#define MEMP_NUM_RAW_PCB 4 -#endif - -/** - * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One - * per active UDP "connection". - * (requires the LWIP_UDP option) - */ -#ifndef MEMP_NUM_UDP_PCB -#define MEMP_NUM_UDP_PCB 4 -#endif - -/** - * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB -#define MEMP_NUM_TCP_PCB 5 -#endif - -/** - * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB_LISTEN -#define MEMP_NUM_TCP_PCB_LISTEN 8 -#endif - -/** - * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_SEG -#define MEMP_NUM_TCP_SEG 16 -#endif - -/** - * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for - * reassembly (whole packets, not fragments!) - */ -#ifndef MEMP_NUM_REASSDATA -#define MEMP_NUM_REASSDATA 5 -#endif - -/** - * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent - * (fragments, not whole packets!). - * This is only used with IP_FRAG_USES_STATIC_BUF==0 and - * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs - * where the packet is not yet sent when netif->output returns. - */ -#ifndef MEMP_NUM_FRAG_PBUF -#define MEMP_NUM_FRAG_PBUF 15 -#endif - -/** - * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing - * packets (pbufs) that are waiting for an ARP request (to resolve - * their destination address) to finish. - * (requires the ARP_QUEUEING option) - */ -#ifndef MEMP_NUM_ARP_QUEUE -#define MEMP_NUM_ARP_QUEUE 30 -#endif - -/** - * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces - * can be members et the same time (one per netif - allsystems group -, plus one - * per netif membership). - * (requires the LWIP_IGMP option) - */ -#ifndef MEMP_NUM_IGMP_GROUP -#define MEMP_NUM_IGMP_GROUP 8 -#endif - -/** - * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. - * (requires NO_SYS==0) - */ -#ifndef MEMP_NUM_SYS_TIMEOUT -#define MEMP_NUM_SYS_TIMEOUT 3 -#endif - -/** - * MEMP_NUM_NETBUF: the number of struct netbufs. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETBUF -#define MEMP_NUM_NETBUF 2 -#endif - -/** - * MEMP_NUM_NETCONN: the number of struct netconns. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETCONN -#define MEMP_NUM_NETCONN 4 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used - * for callback/timeout API communication. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_API -#define MEMP_NUM_TCPIP_MSG_API 8 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used - * for incoming packets. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_INPKT -#define MEMP_NUM_TCPIP_MSG_INPKT 8 -#endif - -/** - * MEMP_NUM_SNMP_NODE: the number of leafs in the SNMP tree. - */ -#ifndef MEMP_NUM_SNMP_NODE -#define MEMP_NUM_SNMP_NODE 50 -#endif - -/** - * MEMP_NUM_SNMP_ROOTNODE: the number of branches in the SNMP tree. - * Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least! - */ -#ifndef MEMP_NUM_SNMP_ROOTNODE -#define MEMP_NUM_SNMP_ROOTNODE 30 -#endif - -/** - * MEMP_NUM_SNMP_VARBIND: the number of concurrent requests (does not have to - * be changed normally) - 2 of these are used per request (1 for input, - * 1 for output) - */ -#ifndef MEMP_NUM_SNMP_VARBIND -#define MEMP_NUM_SNMP_VARBIND 2 -#endif - -/** - * MEMP_NUM_SNMP_VALUE: the number of OID or values concurrently used - * (does not have to be changed normally) - 3 of these are used per request - * (1 for the value read and 2 for OIDs - input and output) - */ -#ifndef MEMP_NUM_SNMP_VALUE -#define MEMP_NUM_SNMP_VALUE 3 -#endif - -/** - * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls - * (before freeing the corresponding memory using lwip_freeaddrinfo()). - */ -#ifndef MEMP_NUM_NETDB -#define MEMP_NUM_NETDB 1 -#endif - -/** - * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list - * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. - */ -#ifndef MEMP_NUM_LOCALHOSTLIST -#define MEMP_NUM_LOCALHOSTLIST 1 -#endif - -/** - * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE - * interfaces (only used with PPPOE_SUPPORT==1) - */ -#ifndef MEMP_NUM_PPPOE_INTERFACES -#define MEMP_NUM_PPPOE_INTERFACES 1 -#endif - -/** - * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. - */ -#ifndef PBUF_POOL_SIZE -#define PBUF_POOL_SIZE 16 -#endif - -/* - --------------------------------- - ---------- ARP options ---------- - --------------------------------- -*/ -/** - * LWIP_ARP==1: Enable ARP functionality. - */ -#ifndef LWIP_ARP -#define LWIP_ARP 1 -#endif - -/** - * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. - */ -#ifndef ARP_TABLE_SIZE -#define ARP_TABLE_SIZE 10 -#endif - -/** - * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address - * resolution. By default, only the most recent packet is queued per IP address. - * This is sufficient for most protocols and mainly reduces TCP connection - * startup time. Set this to 1 if you know your application sends more than one - * packet in a row to an IP address that is not in the ARP cache. - */ -#ifndef ARP_QUEUEING -#define ARP_QUEUEING 0 -#endif - -/** - * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be - * updated with the source MAC and IP addresses supplied in the packet. - * You may want to disable this if you do not trust LAN peers to have the - * correct addresses, or as a limited approach to attempt to handle - * spoofing. If disabled, lwIP will need to make a new ARP request if - * the peer is not already in the ARP table, adding a little latency. - * The peer *is* in the ARP table if it requested our address before. - * Also notice that this slows down input processing of every IP packet! - */ -#ifndef ETHARP_TRUST_IP_MAC -#define ETHARP_TRUST_IP_MAC 0 -#endif - -/** - * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. - * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. - * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. - * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. - */ -#ifndef ETHARP_SUPPORT_VLAN -#define ETHARP_SUPPORT_VLAN 0 -#endif - -/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP - * might be disabled - */ -#ifndef LWIP_ETHERNET -#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) -#endif - -/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure - * alignment of payload after that header. Since the header is 14 bytes long, - * without this padding e.g. addresses in the IP header will not be aligned - * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. - */ -#ifndef ETH_PAD_SIZE -#define ETH_PAD_SIZE 0 -#endif - -/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table - * entries (using etharp_add_static_entry/etharp_remove_static_entry). - */ -#ifndef ETHARP_SUPPORT_STATIC_ENTRIES -#define ETHARP_SUPPORT_STATIC_ENTRIES 0 -#endif - - -/* - -------------------------------- - ---------- IP options ---------- - -------------------------------- -*/ -/** - * IP_FORWARD==1: Enables the ability to forward IP packets across network - * interfaces. If you are going to run lwIP on a device with only one network - * interface, define this to 0. - */ -#ifndef IP_FORWARD -#define IP_FORWARD 0 -#endif - -/** - * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. - * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. - * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). - */ -#ifndef IP_OPTIONS_ALLOWED -#define IP_OPTIONS_ALLOWED 1 -#endif - -/** - * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that - * this option does not affect outgoing packet sizes, which can be controlled - * via IP_FRAG. - */ -#ifndef IP_REASSEMBLY -#define IP_REASSEMBLY 1 -#endif - -/** - * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note - * that this option does not affect incoming packet sizes, which can be - * controlled via IP_REASSEMBLY. - */ -#ifndef IP_FRAG -#define IP_FRAG 1 -#endif - -/** - * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) - * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived - * in this time, the whole packet is discarded. - */ -#ifndef IP_REASS_MAXAGE -#define IP_REASS_MAXAGE 3 -#endif - -/** - * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. - * Since the received pbufs are enqueued, be sure to configure - * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive - * packets even if the maximum amount of fragments is enqueued for reassembly! - */ -#ifndef IP_REASS_MAX_PBUFS -#define IP_REASS_MAX_PBUFS 10 -#endif - -/** - * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP - * fragmentation. Otherwise pbufs are allocated and reference the original - * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1, - * new PBUF_RAM pbufs are used for fragments). - * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs! - */ -#ifndef IP_FRAG_USES_STATIC_BUF -#define IP_FRAG_USES_STATIC_BUF 0 -#endif - -/** - * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer - * (requires IP_FRAG_USES_STATIC_BUF==1) - */ -#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) -#define IP_FRAG_MAX_MTU 1500 -#endif - -/** - * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. - */ -#ifndef IP_DEFAULT_TTL -#define IP_DEFAULT_TTL 255 -#endif - -/** - * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast - * filter per pcb on udp and raw send operations. To enable broadcast filter - * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. - */ -#ifndef IP_SOF_BROADCAST -#define IP_SOF_BROADCAST 0 -#endif - -/** - * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast - * filter on recv operations. - */ -#ifndef IP_SOF_BROADCAST_RECV -#define IP_SOF_BROADCAST_RECV 0 -#endif - -/* - ---------------------------------- - ---------- ICMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_ICMP==1: Enable ICMP module inside the IP stack. - * Be careful, disable that make your product non-compliant to RFC1122 - */ -#ifndef LWIP_ICMP -#define LWIP_ICMP 1 -#endif - -/** - * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. - */ -#ifndef ICMP_TTL -#define ICMP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) - */ -#ifndef LWIP_BROADCAST_PING -#define LWIP_BROADCAST_PING 0 -#endif - -/** - * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) - */ -#ifndef LWIP_MULTICAST_PING -#define LWIP_MULTICAST_PING 0 -#endif - -/* - --------------------------------- - ---------- RAW options ---------- - --------------------------------- -*/ -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef LWIP_RAW -#define LWIP_RAW 1 -#endif - -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef RAW_TTL -#define RAW_TTL (IP_DEFAULT_TTL) -#endif - -/* - ---------------------------------- - ---------- DHCP options ---------- - ---------------------------------- -*/ -/** - * LWIP_DHCP==1: Enable DHCP module. - */ -#ifndef LWIP_DHCP -#define LWIP_DHCP 0 -#endif - -/** - * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. - */ -#ifndef DHCP_DOES_ARP_CHECK -#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) -#endif - -/* - ------------------------------------ - ---------- AUTOIP options ---------- - ------------------------------------ -*/ -/** - * LWIP_AUTOIP==1: Enable AUTOIP module. - */ -#ifndef LWIP_AUTOIP -#define LWIP_AUTOIP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on - * the same interface at the same time. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP -#define LWIP_DHCP_AUTOIP_COOP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes - * that should be sent before falling back on AUTOIP. This can be set - * as low as 1 to get an AutoIP address very quickly, but you should - * be prepared to handle a changing IP address when DHCP overrides - * AutoIP. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES -#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 -#endif - -/* - ---------------------------------- - ---------- SNMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP - * transport. - */ -#ifndef LWIP_SNMP -#define LWIP_SNMP 0 -#endif - -/** - * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will - * allow. At least one request buffer is required. - * Does not have to be changed unless external MIBs answer request asynchronously - */ -#ifndef SNMP_CONCURRENT_REQUESTS -#define SNMP_CONCURRENT_REQUESTS 1 -#endif - -/** - * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap - * destination is required - */ -#ifndef SNMP_TRAP_DESTINATIONS -#define SNMP_TRAP_DESTINATIONS 1 -#endif - -/** - * SNMP_PRIVATE_MIB: - * When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. - */ -#ifndef SNMP_PRIVATE_MIB -#define SNMP_PRIVATE_MIB 0 -#endif - -/** - * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not - * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). - * Unsafe requests are disabled by default! - */ -#ifndef SNMP_SAFE_REQUESTS -#define SNMP_SAFE_REQUESTS 1 -#endif - -/** - * The maximum length of strings used. This affects the size of - * MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_OCTET_STRING_LEN -#define SNMP_MAX_OCTET_STRING_LEN 127 -#endif - -/** - * The maximum depth of the SNMP tree. - * With private MIBs enabled, this depends on your MIB! - * This affects the size of MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_TREE_DEPTH -#define SNMP_MAX_TREE_DEPTH 15 -#endif - -/** - * The size of the MEMP_SNMP_VALUE elements, normally calculated from - * SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH. - */ -#ifndef SNMP_MAX_VALUE_SIZE -#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH)) -#endif - -/* - ---------------------------------- - ---------- IGMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_IGMP==1: Turn on IGMP module. - */ -#ifndef LWIP_IGMP -#define LWIP_IGMP 0 -#endif - -/* - ---------------------------------- - ---------- DNS options ----------- - ---------------------------------- -*/ -/** - * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS - * transport. - */ -#ifndef LWIP_DNS -#define LWIP_DNS 0 -#endif - -/** DNS maximum number of entries to maintain locally. */ -#ifndef DNS_TABLE_SIZE -#define DNS_TABLE_SIZE 4 -#endif - -/** DNS maximum host name length supported in the name table. */ -#ifndef DNS_MAX_NAME_LENGTH -#define DNS_MAX_NAME_LENGTH 256 -#endif - -/** The maximum of DNS servers */ -#ifndef DNS_MAX_SERVERS -#define DNS_MAX_SERVERS 2 -#endif - -/** DNS do a name checking between the query and the response. */ -#ifndef DNS_DOES_NAME_CHECK -#define DNS_DOES_NAME_CHECK 1 -#endif - -/** DNS message max. size. Default value is RFC compliant. */ -#ifndef DNS_MSG_SIZE -#define DNS_MSG_SIZE 512 -#endif - -/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, - * you have to define - * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} - * (an array of structs name/address, where address is an u32_t in network - * byte order). - * - * Instead, you can also use an external function: - * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) - * that returns the IP address or INADDR_NONE if not found. - */ -#ifndef DNS_LOCAL_HOSTLIST -#define DNS_LOCAL_HOSTLIST 0 -#endif /* DNS_LOCAL_HOSTLIST */ - -/** If this is turned on, the local host-list can be dynamically changed - * at runtime. */ -#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC -#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 -#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ - -/* - --------------------------------- - ---------- UDP options ---------- - --------------------------------- -*/ -/** - * LWIP_UDP==1: Turn on UDP. - */ -#ifndef LWIP_UDP -#define LWIP_UDP 1 -#endif - -/** - * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) - */ -#ifndef LWIP_UDPLITE -#define LWIP_UDPLITE 0 -#endif - -/** - * UDP_TTL: Default Time-To-Live value. - */ -#ifndef UDP_TTL -#define UDP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. - */ -#ifndef LWIP_NETBUF_RECVINFO -#define LWIP_NETBUF_RECVINFO 0 -#endif - -/* - --------------------------------- - ---------- TCP options ---------- - --------------------------------- -*/ -/** - * LWIP_TCP==1: Turn on TCP. - */ -#ifndef LWIP_TCP -#define LWIP_TCP 1 -#endif - -/** - * TCP_TTL: Default Time-To-Live value. - */ -#ifndef TCP_TTL -#define TCP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * TCP_WND: The size of a TCP window. This must be at least - * (2 * TCP_MSS) for things to work well - */ -#ifndef TCP_WND -#define TCP_WND (4 * TCP_MSS) -#endif - -/** - * TCP_MAXRTX: Maximum number of retransmissions of data segments. - */ -#ifndef TCP_MAXRTX -#define TCP_MAXRTX 12 -#endif - -/** - * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. - */ -#ifndef TCP_SYNMAXRTX -#define TCP_SYNMAXRTX 6 -#endif - -/** - * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. - * Define to 0 if your device is low on memory. - */ -#ifndef TCP_QUEUE_OOSEQ -#define TCP_QUEUE_OOSEQ (LWIP_TCP) -#endif - -/** - * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, - * you might want to increase this.) - * For the receive side, this MSS is advertised to the remote side - * when opening a connection. For the transmit size, this MSS sets - * an upper limit on the MSS advertised by the remote host. - */ -#ifndef TCP_MSS -#define TCP_MSS 536 -#endif - -/** - * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really - * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which - * reflects the available reassembly buffer size at the remote host) and the - * largest size permitted by the IP layer" (RFC 1122) - * Setting this to 1 enables code that checks TCP_MSS against the MTU of the - * netif used for a connection and limits the MSS if it would be too big otherwise. - */ -#ifndef TCP_CALCULATE_EFF_SEND_MSS -#define TCP_CALCULATE_EFF_SEND_MSS 1 -#endif - - -/** - * TCP_SND_BUF: TCP sender buffer space (bytes). - */ -#ifndef TCP_SND_BUF -#define TCP_SND_BUF 256 -#endif - -/** - * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least - * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. - */ -#ifndef TCP_SND_QUEUELEN -#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) -#endif - -/** - * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than - * TCP_SND_BUF. It is the amount of space which must be available in the - * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). - */ -#ifndef TCP_SNDLOWAT -#define TCP_SNDLOWAT ((TCP_SND_BUF)/2) -#endif - -/** - * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be grater - * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below - * this number, select returns writable (combined with TCP_SNDLOWAT). - */ -#ifndef TCP_SNDQUEUELOWAT -#define TCP_SNDQUEUELOWAT ((TCP_SND_QUEUELEN)/2) -#endif - -/** - * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. - */ -#ifndef TCP_LISTEN_BACKLOG -#define TCP_LISTEN_BACKLOG 0 -#endif - -/** - * The maximum allowed backlog for TCP listen netconns. - * This backlog is used unless another is explicitly specified. - * 0xff is the maximum (u8_t). - */ -#ifndef TCP_DEFAULT_LISTEN_BACKLOG -#define TCP_DEFAULT_LISTEN_BACKLOG 0xff -#endif - -/** - * TCP_OVERSIZE: The maximum number of bytes that tcp_write may - * allocate ahead of time in an attempt to create shorter pbuf chains - * for transmission. The meaningful range is 0 to TCP_MSS. Some - * suggested values are: - * - * 0: Disable oversized allocation. Each tcp_write() allocates a new - pbuf (old behaviour). - * 1: Allocate size-aligned pbufs with minimal excess. Use this if your - * scatter-gather DMA requires aligned fragments. - * 128: Limit the pbuf/memory overhead to 20%. - * TCP_MSS: Try to create unfragmented TCP packets. - * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. - */ -#ifndef TCP_OVERSIZE -#define TCP_OVERSIZE TCP_MSS -#endif - -/** - * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. - */ -#ifndef LWIP_TCP_TIMESTAMPS -#define LWIP_TCP_TIMESTAMPS 0 -#endif - -/** - * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an - * explicit window update - */ -#ifndef TCP_WND_UPDATE_THRESHOLD -#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) -#endif - -/** - * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. - * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all - * events (accept, sent, etc) that happen in the system. - * LWIP_CALLBACK_API==1: The PCB callback function is called directly - * for the event. - */ -//#define LWIP_EVENT_API - -/* - ---------------------------------- - ---------- Pbuf options ---------- - ---------------------------------- -*/ -/** - * PBUF_LINK_HLEN: the number of bytes that should be allocated for a - * link level header. The default is 14, the standard value for - * Ethernet. - */ -#ifndef PBUF_LINK_HLEN -#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) -#endif - -/** - * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is - * designed to accomodate single full size TCP frame in one pbuf, including - * TCP_MSS, IP header, and link header. - */ -#ifndef PBUF_POOL_BUFSIZE -#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) -#endif - -/* - ------------------------------------------------ - ---------- Network Interfaces options ---------- - ------------------------------------------------ -*/ -/** - * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname - * field. - */ -#ifndef LWIP_NETIF_HOSTNAME -#define LWIP_NETIF_HOSTNAME 0 -#endif - -/** - * LWIP_NETIF_API==1: Support netif api (in netifapi.c) - */ -#ifndef LWIP_NETIF_API -#define LWIP_NETIF_API 0 -#endif - -/** - * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface - * changes its up/down status (i.e., due to DHCP IP acquistion) - */ -#ifndef LWIP_NETIF_STATUS_CALLBACK -#define LWIP_NETIF_STATUS_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface - * whenever the link changes (i.e., link down) - */ -#ifndef LWIP_NETIF_LINK_CALLBACK -#define LWIP_NETIF_LINK_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table - * indices) in struct netif. TCP and UDP can make use of this to prevent - * scanning the ARP table for every sent packet. While this is faster for big - * ARP tables or many concurrent connections, it might be counterproductive - * if you have a tiny ARP table or if there never are concurrent connections. - */ -#ifndef LWIP_NETIF_HWADDRHINT -#define LWIP_NETIF_HWADDRHINT 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP - * address equal to the netif IP address, looping them back up the stack. - */ -#ifndef LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 0 -#endif - -/** - * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback - * sending for each netif (0 = disabled) - */ -#ifndef LWIP_LOOPBACK_MAX_PBUFS -#define LWIP_LOOPBACK_MAX_PBUFS 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in - * the system, as netifs must change how they behave depending on this setting - * for the LWIP_NETIF_LOOPBACK option to work. - * Setting this is needed to avoid reentering non-reentrant functions like - * tcp_input(). - * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a - * multithreaded environment like tcpip.c. In this case, netif->input() - * is called directly. - * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. - * The packets are put on a list and netif_poll() must be called in - * the main application loop. - */ -#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING -#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) -#endif - -/** - * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data - * to be sent into one single pbuf. This is for compatibility with DMA-enabled - * MACs that do not support scatter-gather. - * Beware that this might involve CPU-memcpy before transmitting that would not - * be needed without this flag! Use this only if you need to! - * - * @todo: TCP and IP-frag do not work with this, yet: - */ -#ifndef LWIP_NETIF_TX_SINGLE_PBUF -#define LWIP_NETIF_TX_SINGLE_PBUF 0 -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - -/* - ------------------------------------ - ---------- LOOPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c - */ -#ifndef LWIP_HAVE_LOOPIF -#define LWIP_HAVE_LOOPIF 0 -#endif - -/* - ------------------------------------ - ---------- SLIPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c - */ -#ifndef LWIP_HAVE_SLIPIF -#define LWIP_HAVE_SLIPIF 0 -#endif - -/* - ------------------------------------ - ---------- Thread options ---------- - ------------------------------------ -*/ -/** - * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. - */ -#ifndef TCPIP_THREAD_NAME -#define TCPIP_THREAD_NAME "tcpip_thread" -#endif - -/** - * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_STACKSIZE -#define TCPIP_THREAD_STACKSIZE 1024 -#endif - -/** - * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_PRIO -#define TCPIP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when tcpip_init is called. - */ -#ifndef TCPIP_MBOX_SIZE -#define TCPIP_MBOX_SIZE 4 -#endif - -/** - * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. - */ -#ifndef SLIPIF_THREAD_NAME -#define SLIPIF_THREAD_NAME "slipif_loop" -#endif - -/** - * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_STACKSIZE -#define SLIPIF_THREAD_STACKSIZE 1024 -#endif - -/** - * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_PRIO -#define SLIPIF_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * PPP_THREAD_NAME: The name assigned to the pppInputThread. - */ -#ifndef PPP_THREAD_NAME -#define PPP_THREAD_NAME "pppInputThread" -#endif - -/** - * PPP_THREAD_STACKSIZE: The stack size used by the pppInputThread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_STACKSIZE -#define PPP_THREAD_STACKSIZE 1024 -#endif - -/** - * PPP_THREAD_PRIO: The priority assigned to the pppInputThread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_PRIO -#define PPP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. - */ -#ifndef DEFAULT_THREAD_NAME -#define DEFAULT_THREAD_NAME "lwIP" -#endif - -/** - * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_STACKSIZE -#define DEFAULT_THREAD_STACKSIZE 1024 -#endif - -/** - * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_PRIO -#define DEFAULT_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_RAW_RECVMBOX_SIZE -#define DEFAULT_RAW_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_UDP_RECVMBOX_SIZE -#define DEFAULT_UDP_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_TCP_RECVMBOX_SIZE -#define DEFAULT_TCP_RECVMBOX_SIZE 40 -#endif - -/** - * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when the acceptmbox is created. - */ -#ifndef DEFAULT_ACCEPTMBOX_SIZE -#define DEFAULT_ACCEPTMBOX_SIZE 4 -#endif - -/* - ---------------------------------------------- - ---------- Sequential layer options ---------- - ---------------------------------------------- -*/ -/** - * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING -#define LWIP_TCPIP_CORE_LOCKING 0 -#endif - -/** - * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT -#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 -#endif - -/** - * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) - */ -#ifndef LWIP_NETCONN -#define LWIP_NETCONN 1 -#endif - -/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout tod create - * timers running in tcpip_thread from another thread. - */ -#ifndef LWIP_TCPIP_TIMEOUT -#define LWIP_TCPIP_TIMEOUT 1 -#endif - -/* - ------------------------------------ - ---------- Socket options ---------- - ------------------------------------ -*/ -/** - * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) - */ -#ifndef LWIP_SOCKET -#define LWIP_SOCKET 1 -#endif - -/** - * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. - * (only used if you use sockets.c) - */ -#ifndef LWIP_COMPAT_SOCKETS -#define LWIP_COMPAT_SOCKETS 1 -#endif - -/** - * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. - * Disable this option if you use a POSIX operating system that uses the same - * names (read, write & close). (only used if you use sockets.c) - */ -#ifndef LWIP_POSIX_SOCKETS_IO_NAMES -#define LWIP_POSIX_SOCKETS_IO_NAMES 1 -#endif - -/** - * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT - * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set - * in seconds. (does not require sockets.c, and will affect tcp.c) - */ -#ifndef LWIP_TCP_KEEPALIVE -#define LWIP_TCP_KEEPALIVE 0 -#endif - -/** - * LWIP_SO_RCVTIMEO==1: Enable SO_RCVTIMEO processing. - */ -#ifndef LWIP_SO_RCVTIMEO -#define LWIP_SO_RCVTIMEO 0 -#endif - -/** - * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. - */ -#ifndef LWIP_SO_RCVBUF -#define LWIP_SO_RCVBUF 0 -#endif - -/** - * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. - */ -#ifndef RECV_BUFSIZE_DEFAULT -#define RECV_BUFSIZE_DEFAULT INT_MAX -#endif - -/** - * SO_REUSE==1: Enable SO_REUSEADDR option. - */ -#ifndef SO_REUSE -#define SO_REUSE 0 -#endif - -/** - * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets - * to all local matches if SO_REUSEADDR is turned on. - * WARNING: Adds a memcpy for every packet if passing to more than one pcb! - */ -#ifndef SO_REUSE_RXTOALL -#define SO_REUSE_RXTOALL 0 -#endif - -/* - ---------------------------------------- - ---------- Statistics options ---------- - ---------------------------------------- -*/ -/** - * LWIP_STATS==1: Enable statistics collection in lwip_stats. - */ -#ifndef LWIP_STATS -#define LWIP_STATS 1 -#endif - -#if LWIP_STATS - -/** - * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. - */ -#ifndef LWIP_STATS_DISPLAY -#define LWIP_STATS_DISPLAY 0 -#endif - -/** - * LINK_STATS==1: Enable link stats. - */ -#ifndef LINK_STATS -#define LINK_STATS 1 -#endif - -/** - * ETHARP_STATS==1: Enable etharp stats. - */ -#ifndef ETHARP_STATS -#define ETHARP_STATS (LWIP_ARP) -#endif - -/** - * IP_STATS==1: Enable IP stats. - */ -#ifndef IP_STATS -#define IP_STATS 1 -#endif - -/** - * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is - * on if using either frag or reass. - */ -#ifndef IPFRAG_STATS -#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) -#endif - -/** - * ICMP_STATS==1: Enable ICMP stats. - */ -#ifndef ICMP_STATS -#define ICMP_STATS 1 -#endif - -/** - * IGMP_STATS==1: Enable IGMP stats. - */ -#ifndef IGMP_STATS -#define IGMP_STATS (LWIP_IGMP) -#endif - -/** - * UDP_STATS==1: Enable UDP stats. Default is on if - * UDP enabled, otherwise off. - */ -#ifndef UDP_STATS -#define UDP_STATS (LWIP_UDP) -#endif - -/** - * TCP_STATS==1: Enable TCP stats. Default is on if TCP - * enabled, otherwise off. - */ -#ifndef TCP_STATS -#define TCP_STATS (LWIP_TCP) -#endif - -/** - * MEM_STATS==1: Enable mem.c stats. - */ -#ifndef MEM_STATS -#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) -#endif - -/** - * MEMP_STATS==1: Enable memp.c pool stats. - */ -#ifndef MEMP_STATS -#define MEMP_STATS (MEMP_MEM_MALLOC == 0) -#endif - -/** - * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). - */ -#ifndef SYS_STATS -#define SYS_STATS (NO_SYS == 0) -#endif - -#else - -#define LINK_STATS 0 -#define IP_STATS 0 -#define IPFRAG_STATS 0 -#define ICMP_STATS 0 -#define IGMP_STATS 0 -#define UDP_STATS 0 -#define TCP_STATS 0 -#define MEM_STATS 0 -#define MEMP_STATS 0 -#define SYS_STATS 0 -#define LWIP_STATS_DISPLAY 0 - -#endif /* LWIP_STATS */ - -/* - --------------------------------- - ---------- PPP options ---------- - --------------------------------- -*/ -/** - * PPP_SUPPORT==1: Enable PPP. - */ -#ifndef PPP_SUPPORT -#define PPP_SUPPORT 0 -#endif - -/** - * PPPOE_SUPPORT==1: Enable PPP Over Ethernet - */ -#ifndef PPPOE_SUPPORT -#define PPPOE_SUPPORT 0 -#endif - -/** - * PPPOS_SUPPORT==1: Enable PPP Over Serial - */ -#ifndef PPPOS_SUPPORT -#define PPPOS_SUPPORT PPP_SUPPORT -#endif - -#if PPP_SUPPORT - -/** - * NUM_PPP: Max PPP sessions. - */ -#ifndef NUM_PPP -#define NUM_PPP 1 -#endif - -/** - * PAP_SUPPORT==1: Support PAP. - */ -#ifndef PAP_SUPPORT -#define PAP_SUPPORT 0 -#endif - -/** - * CHAP_SUPPORT==1: Support CHAP. - */ -#ifndef CHAP_SUPPORT -#define CHAP_SUPPORT 0 -#endif - -/** - * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef MSCHAP_SUPPORT -#define MSCHAP_SUPPORT 0 -#endif - -/** - * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CBCP_SUPPORT -#define CBCP_SUPPORT 0 -#endif - -/** - * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CCP_SUPPORT -#define CCP_SUPPORT 0 -#endif - -/** - * VJ_SUPPORT==1: Support VJ header compression. - */ -#ifndef VJ_SUPPORT -#define VJ_SUPPORT 0 -#endif - -/** - * MD5_SUPPORT==1: Support MD5 (see also CHAP). - */ -#ifndef MD5_SUPPORT -#define MD5_SUPPORT 0 -#endif - -/* - * Timeouts - */ -#ifndef FSM_DEFTIMEOUT -#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef FSM_DEFMAXTERMREQS -#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXCONFREQS -#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXNAKLOOPS -#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ -#endif - -#ifndef UPAP_DEFTIMEOUT -#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ -#endif - -#ifndef UPAP_DEFREQTIME -#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ -#endif - -#ifndef CHAP_DEFTIMEOUT -#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef CHAP_DEFTRANSMITS -#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ -#endif - -/* Interval in seconds between keepalive echo requests, 0 to disable. */ -#ifndef LCP_ECHOINTERVAL -#define LCP_ECHOINTERVAL 0 -#endif - -/* Number of unanswered echo requests before failure. */ -#ifndef LCP_MAXECHOFAILS -#define LCP_MAXECHOFAILS 3 -#endif - -/* Max Xmit idle time (in jiffies) before resend flag char. */ -#ifndef PPP_MAXIDLEFLAG -#define PPP_MAXIDLEFLAG 100 -#endif - -/* - * Packet sizes - * - * Note - lcp shouldn't be allowed to negotiate stuff outside these - * limits. See lcp.h in the pppd directory. - * (XXX - these constants should simply be shared by lcp.c instead - * of living in lcp.h) - */ -#define PPP_MTU 1500 /* Default MTU (size of Info field) */ -#ifndef PPP_MAXMTU -/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ -#define PPP_MAXMTU 1500 /* Largest MTU we allow */ -#endif -#define PPP_MINMTU 64 -#define PPP_MRU 1500 /* default MRU = max length of info field */ -#define PPP_MAXMRU 1500 /* Largest MRU we allow */ -#ifndef PPP_DEFMRU -#define PPP_DEFMRU 296 /* Try for this */ -#endif -#define PPP_MINMRU 128 /* No MRUs below this */ - -#ifndef MAXNAMELEN -#define MAXNAMELEN 256 /* max length of hostname or name for auth */ -#endif -#ifndef MAXSECRETLEN -#define MAXSECRETLEN 256 /* max length of password or secret */ -#endif - -#endif /* PPP_SUPPORT */ - -/* - -------------------------------------- - ---------- Checksum options ---------- - -------------------------------------- -*/ -/** - * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. - */ -#ifndef CHECKSUM_GEN_IP -#define CHECKSUM_GEN_IP 1 -#endif - -/** - * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. - */ -#ifndef CHECKSUM_GEN_UDP -#define CHECKSUM_GEN_UDP 1 -#endif - -/** - * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. - */ -#ifndef CHECKSUM_GEN_TCP -#define CHECKSUM_GEN_TCP 1 -#endif - -/** - * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. - */ -#ifndef CHECKSUM_CHECK_IP -#define CHECKSUM_CHECK_IP 1 -#endif - -/** - * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. - */ -#ifndef CHECKSUM_CHECK_UDP -#define CHECKSUM_CHECK_UDP 1 -#endif - -/** - * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. - */ -#ifndef CHECKSUM_CHECK_TCP -#define CHECKSUM_CHECK_TCP 1 -#endif - -/** - * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from - * application buffers to pbufs. - */ -#ifndef LWIP_CHECKSUM_ON_COPY -#define LWIP_CHECKSUM_ON_COPY 0 -#endif - -/* - --------------------------------------- - ---------- Debugging options ---------- - --------------------------------------- -*/ -/** - * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is - * compared against this value. If it is smaller, then debugging - * messages are written. - */ -#ifndef LWIP_DBG_MIN_LEVEL -#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF -#endif - -/** - * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable - * debug messages of certain types. - */ -#ifndef LWIP_DBG_TYPES_ON -#define LWIP_DBG_TYPES_ON LWIP_DBG_ON -#endif - -/** - * ETHARP_DEBUG: Enable debugging in etharp.c. - */ -#ifndef ETHARP_DEBUG -#define ETHARP_DEBUG LWIP_DBG_OFF -#endif - -/** - * NETIF_DEBUG: Enable debugging in netif.c. - */ -#ifndef NETIF_DEBUG -#define NETIF_DEBUG LWIP_DBG_OFF -#endif - -/** - * PBUF_DEBUG: Enable debugging in pbuf.c. - */ -#ifndef PBUF_DEBUG -#define PBUF_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_LIB_DEBUG: Enable debugging in api_lib.c. - */ -#ifndef API_LIB_DEBUG -#define API_LIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_MSG_DEBUG: Enable debugging in api_msg.c. - */ -#ifndef API_MSG_DEBUG -#define API_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SOCKETS_DEBUG: Enable debugging in sockets.c. - */ -#ifndef SOCKETS_DEBUG -#define SOCKETS_DEBUG LWIP_DBG_OFF -#endif - -/** - * ICMP_DEBUG: Enable debugging in icmp.c. - */ -#ifndef ICMP_DEBUG -#define ICMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IGMP_DEBUG: Enable debugging in igmp.c. - */ -#ifndef IGMP_DEBUG -#define IGMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * INET_DEBUG: Enable debugging in inet.c. - */ -#ifndef INET_DEBUG -#define INET_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_DEBUG: Enable debugging for IP. - */ -#ifndef IP_DEBUG -#define IP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. - */ -#ifndef IP_REASS_DEBUG -#define IP_REASS_DEBUG LWIP_DBG_OFF -#endif - -/** - * RAW_DEBUG: Enable debugging in raw.c. - */ -#ifndef RAW_DEBUG -#define RAW_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEM_DEBUG: Enable debugging in mem.c. - */ -#ifndef MEM_DEBUG -#define MEM_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEMP_DEBUG: Enable debugging in memp.c. - */ -#ifndef MEMP_DEBUG -#define MEMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SYS_DEBUG: Enable debugging in sys.c. - */ -#ifndef SYS_DEBUG -#define SYS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TIMERS_DEBUG: Enable debugging in timers.c. - */ -#ifndef TIMERS_DEBUG -#define TIMERS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_DEBUG: Enable debugging for TCP. - */ -#ifndef TCP_DEBUG -#define TCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. - */ -#ifndef TCP_INPUT_DEBUG -#define TCP_INPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. - */ -#ifndef TCP_FR_DEBUG -#define TCP_FR_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit - * timeout. - */ -#ifndef TCP_RTO_DEBUG -#define TCP_RTO_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. - */ -#ifndef TCP_CWND_DEBUG -#define TCP_CWND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. - */ -#ifndef TCP_WND_DEBUG -#define TCP_WND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. - */ -#ifndef TCP_OUTPUT_DEBUG -#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. - */ -#ifndef TCP_RST_DEBUG -#define TCP_RST_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. - */ -#ifndef TCP_QLEN_DEBUG -#define TCP_QLEN_DEBUG LWIP_DBG_OFF -#endif - -/** - * UDP_DEBUG: Enable debugging in UDP. - */ -#ifndef UDP_DEBUG -#define UDP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCPIP_DEBUG: Enable debugging in tcpip.c. - */ -#ifndef TCPIP_DEBUG -#define TCPIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * PPP_DEBUG: Enable debugging for PPP. - */ -#ifndef PPP_DEBUG -#define PPP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SLIP_DEBUG: Enable debugging in slipif.c. - */ -#ifndef SLIP_DEBUG -#define SLIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * DHCP_DEBUG: Enable debugging in dhcp.c. - */ -#ifndef DHCP_DEBUG -#define DHCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * AUTOIP_DEBUG: Enable debugging in autoip.c. - */ -#ifndef AUTOIP_DEBUG -#define AUTOIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. - */ -#ifndef SNMP_MSG_DEBUG -#define SNMP_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. - */ -#ifndef SNMP_MIB_DEBUG -#define SNMP_MIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * DNS_DEBUG: Enable debugging for DNS. - */ -#ifndef DNS_DEBUG -#define DNS_DEBUG LWIP_DBG_OFF -#endif - -#endif /* __LWIPOPT_H__ */ diff --git a/demos/ARMCM3-STM32F107-LWIP/main.c b/demos/ARMCM3-STM32F107-LWIP/main.c deleted file mode 100644 index 572f2a8eea..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/main.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "lwipthread.h" - -#include "web/web.h" - -/* - * Green LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(500); - palSetPad(GPIOC, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 3 using the driver default configuration. - */ - sdStart(&SD3, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Creates the LWIP threads (it changes priority internally). - */ - chThdCreateStatic(wa_lwip_thread, LWIP_THREAD_STACK_SIZE, NORMALPRIO + 1, - lwip_thread, NULL); - - /* - * Creates the HTTP thread (it changes priority internally). - */ - chThdCreateStatic(wa_http_server, sizeof(wa_http_server), NORMALPRIO + 1, - http_server, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (palReadPad(GPIOC, GPIOC_SWITCH_TAMPER) == 0) - TestThread(&SD3); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM3-STM32F107-LWIP/mcuconf.h b/demos/ARMCM3-STM32F107-LWIP/mcuconf.h deleted file mode 100644 index 662f107de3..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/mcuconf.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F107 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F107_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_PREDIV1 -#define STM32_PREDIV1SRC STM32_PREDIV1SRC_PLL2 -#define STM32_PREDIV1_VALUE 5 -#define STM32_PLLMUL_VALUE 9 -#define STM32_PREDIV2_VALUE 5 -#define STM32_PLL2MUL_VALUE 8 -#define STM32_PLL3MUL_VALUE 10 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_OTG_CLOCK_REQUIRED TRUE -#define STM32_OTGFSPRE STM32_OTGFSPRE_DIV3 -#define STM32_I2S_CLOCK_REQUIRED FALSE -#define STM32_MCOSEL STM32_MCOSEL_PLL3 -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/demos/ARMCM3-STM32F107-LWIP/readme.txt b/demos/ARMCM3-STM32F107-LWIP/readme.txt deleted file mode 100644 index 25d6c13f65..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F107. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P107 board. - -** The Demo ** - -The demo currently just flashes a LED using a thread and serves HTTP requests -at address 192.168.1.20 on port 80. -The button activates che ChibiOS/RT test suite, output on SD3. - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32F107-LWIP/web/web.c b/demos/ARMCM3-STM32F107-LWIP/web/web.c deleted file mode 100644 index 3a4a9b4f37..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/web/web.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * This file is a modified version of the lwIP web server demo. The original - * author is unknown because the file didn't contain any license information. - */ - -/** - * @file web.c - * @brief HTTP server wrapper thread code. - * @addtogroup WEB_THREAD - * @{ - */ - -#include "ch.h" - -#include "lwip/opt.h" -#include "lwip/arch.h" -#include "lwip/api.h" - -#include "web.h" - -#if LWIP_NETCONN - -static const char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; -static const char http_index_html[] = "Congrats!

Welcome to our lwIP HTTP server!

This is a small test page."; - -static void http_server_serve(struct netconn *conn) { - struct netbuf *inbuf; - char *buf; - u16_t buflen; - err_t err; - - /* Read the data from the port, blocking if nothing yet there. - We assume the request (the part we care about) is in one netbuf */ - err = netconn_recv(conn, &inbuf); - - if (err == ERR_OK) { - netbuf_data(inbuf, (void **)&buf, &buflen); - - /* Is this an HTTP GET command? (only check the first 5 chars, since - there are other formats for GET, and we're keeping it very simple )*/ - if (buflen>=5 && - buf[0]=='G' && - buf[1]=='E' && - buf[2]=='T' && - buf[3]==' ' && - buf[4]=='/' ) { - - /* Send the HTML header - * subtract 1 from the size, since we dont send the \0 in the string - * NETCONN_NOCOPY: our data is const static, so no need to copy it - */ - netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY); - - /* Send our HTML page */ - netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY); - } - } - /* Close the connection (server closes in HTTP) */ - netconn_close(conn); - - /* Delete the buffer (netconn_recv gives us ownership, - so we have to make sure to deallocate the buffer) */ - netbuf_delete(inbuf); -} - -/** - * Stack area for the http thread. - */ -WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -/** - * HTTP server thread. - */ -msg_t http_server(void *p) { - struct netconn *conn, *newconn; - err_t err; - - (void)p; - - /* Create a new TCP connection handle */ - conn = netconn_new(NETCONN_TCP); - LWIP_ERROR("http_server: invalid conn", (conn != NULL), return RDY_RESET;); - - /* Bind to port 80 (HTTP) with default IP address */ - netconn_bind(conn, NULL, WEB_THREAD_PORT); - - /* Put the connection into LISTEN state */ - netconn_listen(conn); - - /* Goes to the final priority after initialization.*/ - chThdSetPriority(WEB_THREAD_PRIORITY); - - while(1) { - err = netconn_accept(conn, &newconn); - if (err != ERR_OK) - continue; - http_server_serve(newconn); - netconn_delete(newconn); - } - return RDY_OK; -} - -#endif /* LWIP_NETCONN */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107-LWIP/web/web.h b/demos/ARMCM3-STM32F107-LWIP/web/web.h deleted file mode 100644 index 64c217afa3..0000000000 --- a/demos/ARMCM3-STM32F107-LWIP/web/web.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file web.h - * @brief HTTP server wrapper thread macros and structures. - * @addtogroup WEB_THREAD - * @{ - */ - -#ifndef _WEB_H_ -#define _WEB_H_ - -#ifndef WEB_THREAD_STACK_SIZE -#define WEB_THREAD_STACK_SIZE 1024 -#endif - -#ifndef WEB_THREAD_PORT -#define WEB_THREAD_PORT 80 -#endif - -#ifndef WEB_THREAD_PRIORITY -#define WEB_THREAD_PRIORITY (LOWPRIO + 2) -#endif - -extern WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -#ifdef __cplusplus -extern "C" { -#endif - msg_t http_server(void *p); -#ifdef __cplusplus -} -#endif - -#endif /* _WEB_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107/.cproject b/demos/ARMCM3-STM32F107/.cproject deleted file mode 100644 index 447f8acf45..0000000000 --- a/demos/ARMCM3-STM32F107/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32F107/.project b/demos/ARMCM3-STM32F107/.project deleted file mode 100644 index e0d22eca8e..0000000000 --- a/demos/ARMCM3-STM32F107/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - ARMCM3-STM32F107 - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P107 - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32F107/Makefile b/demos/ARMCM3-STM32F107/Makefile deleted file mode 100644 index 4d5d48b630..0000000000 --- a/demos/ARMCM3-STM32F107/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P107/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform_f105_f107.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F107xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32F107/chconf.h b/demos/ARMCM3-STM32F107/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32F107/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107/halconf.h b/demos/ARMCM3-STM32F107/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/ARMCM3-STM32F107/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32F107/iar/ch.ewp b/demos/ARMCM3-STM32F107/iar/ch.ewp deleted file mode 100644 index 8b33c97d61..0000000000 --- a/demos/ARMCM3-STM32F107/iar/ch.ewp +++ /dev/null @@ -1,2305 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\OLIMEX_STM32_P107\board.c - - - $PROJ_DIR$\..\..\..\boards\OLIMEX_STM32_P107\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2s.h - - - $PROJ_DIR$\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\os\hal\include\io_block.h - - - $PROJ_DIR$\..\..\..\os\hal\include\io_channel.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmcsd.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2s.c - - - $PROJ_DIR$\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmcsd.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f100.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f105_f107.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32_rcc.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F1xx\stm32f10x.h - - - - port - - STM32F1xx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F1xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM3-STM32F107/iar/ch.eww b/demos/ARMCM3-STM32F107/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM3-STM32F107/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM3-STM32F107/iar/ch.icf b/demos/ARMCM3-STM32F107/iar/ch.icf deleted file mode 100644 index 44efbcba3f..0000000000 --- a/demos/ARMCM3-STM32F107/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0802FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM3-STM32F107/keil/ch.uvproj b/demos/ARMCM3-STM32F107/keil/ch.uvproj deleted file mode 100644 index e079f081c0..0000000000 --- a/demos/ARMCM3-STM32F107/keil/ch.uvproj +++ /dev/null @@ -1,1090 +0,0 @@ - - - - 1.1 - -

### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - STM32F107VC - STMicroelectronics - IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x803FFFF) CLOCK(25000000) CPUTYPE("Cortex-M3") - - "STARTUP\ST\STM32F10x.s" ("STM32 Startup Code") - UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000) - 4889 - stm32f10x_lib.h - - - - - - - - - - SFD\ST\STM32F107x\STM32F107.sfr - 0 - - - - ST\STM32F10x\ - ST\STM32F10x\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - - DARMSTM.DLL - -pSTM32F107VC - SARMCM3.DLL - - TARMSTM.DLL - -pSTM32F107VC - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x10000 - - - 1 - 0x8000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x40000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x10000 - - - 0 - 0x20010000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\STM32F1xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\STM32;..\..\..\os\hal\platforms\STM32F1xx;..\..\..\os\hal\platforms\STM32\GPIOv1;..\..\..\os\hal\platforms\STM32\DMAv1;..\..\..\os\various;..\..\..\boards\OLIMEX_STM32_P107;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\OLIMEX_STM32_P107;..\..\..\os\ports\RVCT\ARMCMx\STM32F1xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\OLIMEX_STM32_P107\board.c - - - board.h - 5 - ..\..\..\boards\OLIMEX_STM32_P107\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - vectors.s - 2 - D:\Progetti\ChibiOS-RT\os\ports\RVCT\ARMCMx\STM32F1xx\vectors.s - - - chcoreasm_v7m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - can.c - 1 - ..\..\..\os\hal\src\can.c - - - gpt.c - 1 - ..\..\..\os\hal\src\gpt.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - i2c.c - 1 - ..\..\..\os\hal\src\i2c.c - - - mac.c - 1 - ..\..\..\os\hal\src\mac.c - - - mmc_spi.c - 1 - ..\..\..\os\hal\src\mmc_spi.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - serial_usb.c - 1 - ..\..\..\os\hal\src\serial_usb.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - uart.c - 1 - ..\..\..\os\hal\src\uart.c - - - usb.c - 1 - ..\..\..\os\hal\src\usb.c - - - adc.h - 5 - ..\..\..\os\hal\include\adc.h - - - can.h - 5 - ..\..\..\os\hal\include\can.h - - - gpt.h - 5 - ..\..\..\os\hal\include\gpt.h - - - hal.h - 5 - ..\..\..\os\hal\include\hal.h - - - i2c.h - 5 - ..\..\..\os\hal\include\i2c.h - - - mac.h - 5 - ..\..\..\os\hal\include\mac.h - - - mii.h - 5 - ..\..\..\os\hal\include\mii.h - - - mmc_spi.h - 5 - ..\..\..\os\hal\include\mmc_spi.h - - - pal.h - 5 - ..\..\..\os\hal\include\pal.h - - - pwm.h - 5 - ..\..\..\os\hal\include\pwm.h - - - serial.h - 5 - ..\..\..\os\hal\include\serial.h - - - serial_usb.h - 5 - ..\..\..\os\hal\include\serial_usb.h - - - spi.h - 5 - ..\..\..\os\hal\include\spi.h - - - uart.h - 5 - ..\..\..\os\hal\include\uart.h - - - usb.h - 5 - ..\..\..\os\hal\include\usb.h - - - ext.h - 5 - ..\..\..\os\hal\include\ext.h - - - icu.h - 5 - ..\..\..\os\hal\include\icu.h - - - rtc.h - 5 - ..\..\..\os\hal\include\rtc.h - - - sdc.h - 5 - ..\..\..\os\hal\include\sdc.h - - - usb_cdc.h - 5 - ..\..\..\os\hal\include\usb_cdc.h - - - ext.c - 1 - ..\..\..\os\hal\src\ext.c - - - icu.c - 1 - ..\..\..\os\hal\src\icu.c - - - rtc.c - 1 - ..\..\..\os\hal\src\rtc.c - - - sdc.c - 1 - ..\..\..\os\hal\src\sdc.c - - - - - platform - - - serial_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\serial_lld.h - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\serial_lld.c - - - pal_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.h - - - pal_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\GPIOv1\pal_lld.c - - - stm32f10x.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\stm32f10x.h - - - hal_lld.c - 1 - ..\..\..\os\hal\platforms\STM32F1xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\hal_lld.h - - - hal_lld_f100.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f100.h - - - hal_lld_f103.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f103.h - - - hal_lld_f105_f107.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\hal_lld_f105_f107.h - - - stm32_rcc.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\stm32_rcc.h - - - stm32_dma.c - 1 - ..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\os\hal\platforms\STM32F1xx\stm32_dma.h - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - mcuconf.h - 5 - ..\mcuconf.h - - - - - - - - diff --git a/demos/ARMCM3-STM32F107/main.c b/demos/ARMCM3-STM32F107/main.c deleted file mode 100644 index e92bfb0492..0000000000 --- a/demos/ARMCM3-STM32F107/main.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Green LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(500); - palSetPad(GPIOC, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 3 using the driver default configuration. - */ - sdStart(&SD3, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (palReadPad(GPIOC, GPIOC_SWITCH_TAMPER) == 0) - TestThread(&SD3); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM3-STM32F107/mcuconf.h b/demos/ARMCM3-STM32F107/mcuconf.h deleted file mode 100644 index 662f107de3..0000000000 --- a/demos/ARMCM3-STM32F107/mcuconf.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F107 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F107_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_PREDIV1 -#define STM32_PREDIV1SRC STM32_PREDIV1SRC_PLL2 -#define STM32_PREDIV1_VALUE 5 -#define STM32_PLLMUL_VALUE 9 -#define STM32_PREDIV2_VALUE 5 -#define STM32_PLL2MUL_VALUE 8 -#define STM32_PLL3MUL_VALUE 10 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_OTG_CLOCK_REQUIRED TRUE -#define STM32_OTGFSPRE STM32_OTGFSPRE_DIV3 -#define STM32_I2S_CLOCK_REQUIRED FALSE -#define STM32_MCOSEL STM32_MCOSEL_PLL3 -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 TRUE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/demos/ARMCM3-STM32F107/readme.txt b/demos/ARMCM3-STM32F107/readme.txt deleted file mode 100644 index cce940bd62..0000000000 --- a/demos/ARMCM3-STM32F107/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F107. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P107 board. - -** The Demo ** - -The demo flashes the board LED using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port -SD3 (USART3). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/.cproject b/demos/ARMCM3-STM32L152-DISCOVERY/.cproject deleted file mode 100644 index 30af73e1ea..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/.cproject +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/.project b/demos/ARMCM3-STM32L152-DISCOVERY/.project deleted file mode 100644 index a1f6875a8c..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - ARMCM3-STM32L152-DISCOVERY - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/Makefile b/demos/ARMCM3-STM32L152-DISCOVERY/Makefile deleted file mode 100644 index dc82a2f042..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/chconf.h b/demos/ARMCM3-STM32L152-DISCOVERY/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/halconf.h b/demos/ARMCM3-STM32L152-DISCOVERY/halconf.h deleted file mode 100644 index 01ebaf5056..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.ewp b/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.ewp deleted file mode 100644 index 5f4618dac3..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.ewp +++ /dev/null @@ -1,2293 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\ST_STM32L_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\boards\ST_STM32L_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\adc_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\adc_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\pwm_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\pwm_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\spi_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\spi_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32L1xx\stm32l1xx.h - - - - port - - STM32Lxx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32L1xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32L1xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.eww b/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.icf b/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.icf deleted file mode 100644 index 376fd3e5d6..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x20003FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/keil/ch.uvproj b/demos/ARMCM3-STM32L152-DISCOVERY/keil/ch.uvproj deleted file mode 100644 index 51c0c26fcd..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/keil/ch.uvproj +++ /dev/null @@ -1,975 +0,0 @@ - - - - 1.1 - -
### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - STM32L152RB - STMicroelectronics - IRAM(0x20000000-0x20003FFF) IROM(0x8000000-0x801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") - - "STARTUP\ST\STM32L1xx\startup_stm32l1xx_md.s" ("STM32L15xx Medium density Startup Code") - ULP2CM3(-O207 -S8 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32L15x_128 -FS08000000 -FL020000) - 5248 - stm32l1xx.h - - - - - - - - - - SFD\ST\STM32L15x\STM32L15x.sfr - 0 - - - - ST\STM32L1xx\ - ST\STM32L1xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - - DCM.DLL - -pCM3 - SARMCM3.DLL - - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x4000 - - - 1 - 0x8000000 - 0x20000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x20000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x4000 - - - 0 - 0x20004000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\STM32L1xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\STM32;..\..\..\os\hal\platforms\STM32\GPIOv2;..\..\..\os\hal\platforms\STM32L1xx;..\..\..\boards\ST_STM32L_DISCOVERY;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\ST_STM32L_DISCOVERY;..\..\..\os\ports\RVCT\ARMCMx\STM32L1xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\ST_STM32L_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\boards\ST_STM32L_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - cmparams.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\STM32L1xx\cmparams.h - - - vectors.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\STM32L1xx\vectors.s - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - usb.c - 1 - ..\..\..\os\hal\src\usb.c - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - can.c - 1 - ..\..\..\os\hal\src\can.c - - - ext.c - 1 - ..\..\..\os\hal\src\ext.c - - - gpt.c - 1 - ..\..\..\os\hal\src\gpt.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - i2c.c - 1 - ..\..\..\os\hal\src\i2c.c - - - icu.c - 1 - ..\..\..\os\hal\src\icu.c - - - mac.c - 1 - ..\..\..\os\hal\src\mac.c - - - mmc_spi.c - 1 - ..\..\..\os\hal\src\mmc_spi.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - rtc.c - 1 - ..\..\..\os\hal\src\rtc.c - - - sdc.c - 1 - ..\..\..\os\hal\src\sdc.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - serial_usb.c - 1 - ..\..\..\os\hal\src\serial_usb.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - tm.c - 1 - ..\..\..\os\hal\src\tm.c - - - uart.c - 1 - ..\..\..\os\hal\src\uart.c - - - - - platform - - - pal_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - mac_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\mac_lld.c - - - pwm_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\pwm_lld.c - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\serial_lld.c - - - spi_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\spi_lld.c - - - stm32_dma.c - 1 - ..\..\..\os\hal\platforms\STM32L1xx\stm32_dma.c - - - adc_lld.c - 1 - ..\..\..\os\hal\platforms\STM32L1xx\adc_lld.c - - - hal_lld.c - 1 - ..\..\..\os\hal\platforms\STM32L1xx\hal_lld.c - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - - - - - -
diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/main.c b/demos/ARMCM3-STM32L152-DISCOVERY/main.c deleted file mode 100644 index e21b8a3118..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/main.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -static void pwmpcb(PWMDriver *pwmp); -static void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n); -static void spicb(SPIDriver *spip); - -/* Total number of channels to be sampled by a single ADC operation.*/ -#define ADC_GRP1_NUM_CHANNELS 2 - -/* Depth of the conversion buffer, channels are sampled four times each.*/ -#define ADC_GRP1_BUF_DEPTH 4 - -/* - * ADC samples buffer. - */ -static adcsample_t samples[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; - -/* - * ADC conversion group. - * Mode: Linear buffer, 4 samples of 2 channels, SW triggered. - * Channels: IN10 (48 cycles sample time) - * Sensor (192 cycles sample time) - */ -static const ADCConversionGroup adcgrpcfg = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - adccb, - NULL, - /* HW dependent part.*/ - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, - ADC_SMPR2_SMP_AN10(ADC_SAMPLE_48) | ADC_SMPR2_SMP_SENSOR(ADC_SAMPLE_192), - 0, - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, - 0, - 0, - ADC_SQR5_SQ2_N(ADC_CHANNEL_IN10) | ADC_SQR5_SQ1_N(ADC_CHANNEL_SENSOR) -}; - -/* - * PWM configuration structure. - * Cyclic callback enabled, channels 1 and 2 enabled without callbacks, - * the active state is a logic one. - */ -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* PWM period 1S (in ticks). */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - /* HW dependent part.*/ - 0 -}; - -/* - * SPI configuration structure. - * Maximum speed (12MHz), CPHA=0, CPOL=0, 16bits frames, MSb transmitted first. - * The slave select line is the pin GPIOA_SPI1NSS on the port GPIOA. - */ -static const SPIConfig spicfg = { - spicb, - /* HW dependent part.*/ - GPIOB, - 12, - SPI_CR1_DFF -}; - -/* - * PWM cyclic callback. - * A new ADC conversion is started. - */ -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - - /* Starts an asynchronous ADC conversion operation, the conversion - will be executed in parallel to the current PWM cycle and will - terminate before the next PWM cycle.*/ - chSysLockFromIsr(); - adcStartConversionI(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH); - chSysUnlockFromIsr(); -} - -/* - * ADC end conversion callback. - * The PWM channels are reprogrammed using the latest ADC samples. - * The latest samples are transmitted into a single SPI transaction. - */ -void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void) buffer; (void) n; - /* Note, only in the ADC_COMPLETE state because the ADC driver fires an - intermediate callback when the buffer is half full.*/ - if (adcp->state == ADC_COMPLETE) { - adcsample_t avg_ch1, avg_ch2; - - /* Calculates the average values from the ADC samples.*/ - avg_ch1 = (samples[0] + samples[2] + samples[4] + samples[6]) / 4; - avg_ch2 = (samples[1] + samples[3] + samples[5] + samples[7]) / 4; - - chSysLockFromIsr(); - - /* Changes the channels pulse width, the change will be effective - starting from the next cycle.*/ - pwmEnableChannelI(&PWMD4, 0, PWM_FRACTION_TO_WIDTH(&PWMD4, 4096, avg_ch1)); - pwmEnableChannelI(&PWMD4, 1, PWM_FRACTION_TO_WIDTH(&PWMD4, 4096, avg_ch2)); - - /* SPI slave selection and transmission start.*/ - spiSelectI(&SPID2); - spiStartSendI(&SPID2, ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH, samples); - - chSysUnlockFromIsr(); - } -} - -/* - * SPI end transfer callback. - */ -static void spicb(SPIDriver *spip) { - - /* On transfer end just releases the slave select line.*/ - chSysLockFromIsr(); - spiUnselectI(spip); - chSysUnlockFromIsr(); -} - -/* - * This is a periodic thread that does absolutely nothing except increasing - * a seconds counter. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - static uint32_t seconds_counter; - - (void)arg; - chRegSetThreadName("counter"); - while (TRUE) { - chThdSleepMilliseconds(1000); - seconds_counter++; - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - * PA9 and PA10 are routed to USART1. - */ - sdStart(&SD1, NULL); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); - - /* - * If the user button is pressed after the reset then the test suite is - * executed immediately before activating the various device drivers in - * order to not alter the benchmark scores. - */ - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD1); - - /* - * Initializes the SPI driver 2. The SPI2 signals are routed as follow: - * PB12 - NSS. - * PB13 - SCK. - * PB14 - MISO. - * PB15 - MOSI. - */ - spiStart(&SPID2, &spicfg); - palSetPad(GPIOB, 12); - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* NSS. */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5)); /* MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* MOSI. */ - - /* - * Initializes the ADC driver 1 and enable the thermal sensor. - * The pin PC0 on the port GPIOC is programmed as analog input. - */ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - palSetPadMode(GPIOC, 0, PAL_MODE_INPUT_ANALOG); - - /* - * Initializes the PWM driver 4, routes the TIM4 outputs to the board LEDs. - */ - pwmStart(&PWMD4, &pwmcfg); - palSetPadMode(GPIOB, GPIOB_LED4, PAL_MODE_ALTERNATE(2)); - palSetPadMode(GPIOB, GPIOB_LED3, PAL_MODE_ALTERNATE(2)); - - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state, when the button is - * pressed the test procedure is launched with output on the serial - * driver 1. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD1); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/mcuconf.h b/demos/ARMCM3-STM32L152-DISCOVERY/mcuconf.h deleted file mode 100644 index 4d76d47e87..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 TRUE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/demos/ARMCM3-STM32L152-DISCOVERY/readme.txt b/demos/ARMCM3-STM32L152-DISCOVERY/readme.txt deleted file mode 100644 index 7d8d1b0acd..0000000000 --- a/demos/ARMCM3-STM32L152-DISCOVERY/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32L152. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32L-Discovery board. - -** The Demo ** - -The demo shows how to use the ADC, PWM and SPI drivers using asynchronous -APIs. The ADC samples two channels (temperature sensor and PC0) and modulates -the PWM using the sampled values. The sample data is also transmitted using -the SPI port 2 (NSS=PB12, SCK=PB13, MISO=PB14, MOSI=PB15). -By pressing the button located on the board the test procedure is activated -with output on the serial port COM1 (USART1). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/Makefile b/demos/ARMCM4-STM32F303-DISCOVERY/Makefile deleted file mode 100644 index 1c85a2ecbb..0000000000 --- a/demos/ARMCM4-STM32F303-DISCOVERY/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F3xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xc.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/halconf.h b/demos/ARMCM4-STM32F303-DISCOVERY/halconf.h deleted file mode 100644 index 390f4b23e2..0000000000 --- a/demos/ARMCM4-STM32F303-DISCOVERY/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/main.c b/demos/ARMCM4-STM32F303-DISCOVERY/main.c deleted file mode 100644 index 649d705709..0000000000 --- a/demos/ARMCM4-STM32F303-DISCOVERY/main.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -//#include "test.h" - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { -// palSetPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); -// palClearPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state, when the button is - * pressed the test procedure is launched with output on the serial - * driver 2. - */ - while (TRUE) { -// if (palReadPad(GPIOA, GPIOA_BUTTON)) -// TestThread(&SD2); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/mcuconf.h b/demos/ARMCM4-STM32F303-DISCOVERY/mcuconf.h deleted file mode 100644 index 0b1607150f..0000000000 --- a/demos/ARMCM4-STM32F303-DISCOVERY/mcuconf.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/readme.txt b/demos/ARMCM4-STM32F303-DISCOVERY/readme.txt deleted file mode 100644 index 0bad189d3d..0000000000 --- a/demos/ARMCM4-STM32F303-DISCOVERY/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M4 STM32F303. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F3-Discovery board. - -** The Demo ** - - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.cproject b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.cproject deleted file mode 100644 index 4c0ec4132d..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.cproject +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project deleted file mode 100644 index 20074f5a76..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - ARMCM4-STM32F407-DISCOVERY-MEMS - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j1 - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile deleted file mode 100644 index 1ed33ade1b..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/Makefile +++ /dev/null @@ -1,225 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/devices_lib/accel/lis302dl.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - usbcfg.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/chconf.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h deleted file mode 100644 index d4013c7d4b..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c deleted file mode 100644 index f52b9bffbd..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/main.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "chprintf.h" -#include "shell.h" -#include "lis302dl.h" - -#include "usbcfg.h" - -/* Virtual serial port over USB.*/ -static SerialUSBDriver SDU1; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Accelerometer related. */ -/*===========================================================================*/ - -/* - * PWM configuration structure. - * Cyclic callback enabled, channels 1 and 4 enabled without callbacks, - * the active state is a logic one. - */ -static const PWMConfig pwmcfg = { - 100000, /* 100kHz PWM clock frequency. */ - 128, /* PWM period is 128 cycles. */ - NULL, - { - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL} - }, - /* HW dependent part.*/ - 0 -}; - -/* - * SPI1 configuration structure. - * Speed 5.25MHz, CPHA=1, CPOL=1, 8bits frames, MSb transmitted first. - * The slave select line is the pin GPIOE_CS_SPI on the port GPIOE. - */ -static const SPIConfig spi1cfg = { - NULL, - /* HW dependent part.*/ - GPIOE, - GPIOE_CS_SPI, - SPI_CR1_BR_0 | SPI_CR1_BR_1 | SPI_CR1_CPOL | SPI_CR1_CPHA -}; - -/* - * SPI2 configuration structure. - * Speed 21MHz, CPHA=0, CPOL=0, 8bits frames, MSb transmitted first. - * The slave select line is the pin 12 on the port GPIOA. - */ -static const SPIConfig spi2cfg = { - NULL, - /* HW dependent part.*/ - GPIOB, - 12, - 0 -}; - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - static int8_t xbuf[4], ybuf[4]; /* Last accelerometer data.*/ - systime_t time; /* Next deadline.*/ - - (void)arg; - chRegSetThreadName("reader"); - - /* LIS302DL initialization.*/ - lis302dlWriteRegister(&SPID1, LIS302DL_CTRL_REG1, 0x43); - lis302dlWriteRegister(&SPID1, LIS302DL_CTRL_REG2, 0x00); - lis302dlWriteRegister(&SPID1, LIS302DL_CTRL_REG3, 0x00); - - /* Reader thread loop.*/ - time = chTimeNow(); - while (TRUE) { - int32_t x, y; - unsigned i; - - /* Keeping an history of the latest four accelerometer readings.*/ - for (i = 3; i > 0; i--) { - xbuf[i] = xbuf[i - 1]; - ybuf[i] = ybuf[i - 1]; - } - - /* Reading MEMS accelerometer X and Y registers.*/ - xbuf[0] = (int8_t)lis302dlReadRegister(&SPID1, LIS302DL_OUTX); - ybuf[0] = (int8_t)lis302dlReadRegister(&SPID1, LIS302DL_OUTY); - - /* Transmitting accelerometer the data over SPI2.*/ - spiSelect(&SPID2); - spiSend(&SPID2, 4, xbuf); - spiSend(&SPID2, 4, ybuf); - spiUnselect(&SPID2); - - /* Calculating average of the latest four accelerometer readings.*/ - x = ((int32_t)xbuf[0] + (int32_t)xbuf[1] + - (int32_t)xbuf[2] + (int32_t)xbuf[3]) / 4; - y = ((int32_t)ybuf[0] + (int32_t)ybuf[1] + - (int32_t)ybuf[2] + (int32_t)ybuf[3]) / 4; - - /* Reprogramming the four PWM channels using the accelerometer data.*/ - if (y < 0) { - pwmEnableChannel(&PWMD4, 0, (pwmcnt_t)-y); - pwmEnableChannel(&PWMD4, 2, (pwmcnt_t)0); - } - else { - pwmEnableChannel(&PWMD4, 2, (pwmcnt_t)y); - pwmEnableChannel(&PWMD4, 0, (pwmcnt_t)0); - } - if (x < 0) { - pwmEnableChannel(&PWMD4, 1, (pwmcnt_t)-x); - pwmEnableChannel(&PWMD4, 3, (pwmcnt_t)0); - } - else { - pwmEnableChannel(&PWMD4, 3, (pwmcnt_t)x); - pwmEnableChannel(&PWMD4, 1, (pwmcnt_t)0); - } - - /* Waiting until the next 250 milliseconds time interval.*/ - chThdSleepUntil(time += MS2ST(100)); - } -} - -/*===========================================================================*/ -/* Initialization and main thread. */ -/*===========================================================================*/ - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Activates the serial driver 2 using the driver default configuration. - * PA2(TX) and PA3(RX) are routed to USART2. - */ - sdStart(&SD2, NULL); - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - - /* - * Initializes the SPI driver 1 in order to access the MEMS. The signals - * are already initialized in the board file. - */ - spiStart(&SPID1, &spi1cfg); - - /* - * Initializes the SPI driver 2. The SPI2 signals are routed as follow: - * PB12 - NSS. - * PB13 - SCK. - * PB14 - MISO. - * PB15 - MOSI. - */ - spiStart(&SPID2, &spi2cfg); - palSetPad(GPIOB, 12); - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* NSS. */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5)); /* MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* MOSI. */ - - /* - * Initializes the PWM driver 4, routes the TIM4 outputs to the board LEDs. - */ - pwmStart(&PWMD4, &pwmcfg); - palSetPadMode(GPIOD, GPIOD_LED4, PAL_MODE_ALTERNATE(2)); /* Green. */ - palSetPadMode(GPIOD, GPIOD_LED3, PAL_MODE_ALTERNATE(2)); /* Orange. */ - palSetPadMode(GPIOD, GPIOD_LED5, PAL_MODE_ALTERNATE(2)); /* Red. */ - palSetPadMode(GPIOD, GPIOD_LED6, PAL_MODE_ALTERNATE(2)); /* Blue. */ - - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), - NORMALPRIO + 10, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state, when the button is - * pressed the test procedure is launched with output on the serial - * driver 2. - */ - while (TRUE) { - if (!shelltp) { - if (SDU1.config->usbp->state == USB_ACTIVE) { - /* Spawns a new shell.*/ - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - } - } - else { - /* If the previous shell exited.*/ - if (chThdTerminated(shelltp)) { - /* Recovers memory of the previous shell.*/ - chThdRelease(shelltp); - shelltp = NULL; - } - } - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h deleted file mode 100644 index c0748cee5e..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 TRUE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 TRUE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/readme.txt b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/readme.txt deleted file mode 100644 index 0bfb13daf4..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M4 STM32F407. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F4-Discovery board. - -** The Demo ** - -The demo shows how to use PWM and SPI drivers using synchronous APIs. The PWM -driver the four board lets with the data read from the LIS320DL accelerometer. -The data is also transmitted on the SPI2 port. -By pressing the button located on the board the test procedure is activated -with output on the serial port SD2 (USART2). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c deleted file mode 100644 index 7472b634d5..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "usb_cdc.h" - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 2, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(usbp); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -const SerialUSBConfig serusbcfg = { - &USBD1 -}; diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h b/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h deleted file mode 100644 index 4e98067eb6..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY-MEMS/usbcfg.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _USBCFG_H_ -#define _USBCFG_H_ - -extern const USBConfig usbcfg; -extern SerialUSBConfig serusbcfg; - -#endif /* _USBCFG_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/.cproject b/demos/ARMCM4-STM32F407-DISCOVERY/.cproject deleted file mode 100644 index 8f117a33f2..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/.cproject +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/.project b/demos/ARMCM4-STM32F407-DISCOVERY/.project deleted file mode 100644 index 910df56838..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - ARMCM4-STM32F407-DISCOVERY - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/Makefile b/demos/ARMCM4-STM32F407-DISCOVERY/Makefile deleted file mode 100644 index 95fe53ba61..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/Makefile +++ /dev/null @@ -1,224 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/devices_lib/accel/lis302dl.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/chconf.h b/demos/ARMCM4-STM32F407-DISCOVERY/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h b/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h deleted file mode 100644 index 390f4b23e2..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.ewp b/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.ewp deleted file mode 100644 index 5982bc9098..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.ewp +++ /dev/null @@ -1,2314 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\boards\ST_STM32F4_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\boards\ST_STM32F4_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\adc_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\adc_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\pwm_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\pwm_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\spi_lld.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32\spi_lld.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\stm32_rcc.h - - - $PROJ_DIR$\..\..\..\os\hal\platforms\STM32F4xx\stm32f4xx.h - - - - port - - STM32F4xx - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F4xx\cmparams.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\STM32F4xx\vectors.s - - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - various - - devices_lib - - accel - - $PROJ_DIR$\..\..\..\os\various\devices_lib\accel\lis302dl.c - - - $PROJ_DIR$\..\..\..\os\various\devices_lib\accel\lis302dl.h - - - - - $PROJ_DIR$\..\..\..\os\various\chprintf.c - - - $PROJ_DIR$\..\..\..\os\various\chprintf.h - - - - - test - - $PROJ_DIR$\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.eww b/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.icf b/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.icf deleted file mode 100644 index c0a51f44cb..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/keil/ch.uvproj b/demos/ARMCM4-STM32F407-DISCOVERY/keil/ch.uvproj deleted file mode 100644 index d38a6dc51f..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/keil/ch.uvproj +++ /dev/null @@ -1,980 +0,0 @@ - - - - 1.1 - -
### uVision Project, (C) Keil Software
- - - - Demo - 0x4 - ARM-ADS - - - STM32F407VG - STMicroelectronics - IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - "Startup\ST\STM32F4xx\startup_stm32f4xx.s" ("STM32F4xx Startup Code") - UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) - 6103 - stm32f4xx.h - - - - - - - - - - SFD\ST\STM32F4xx\STM32F4xx.sfr - 0 - - - - ST\STM32F4xx\ - ST\STM32F4xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 1 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x20020000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\os\kernel\include;..\..\..\os\ports\common\ARMCMx;..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\os\ports\RVCT\ARMCMx;..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx;..\..\..\os\hal\include;..\..\..\os\hal\platforms\STM32;..\..\..\os\hal\platforms\STM32\GPIOv2;..\..\..\os\hal\platforms\STM32F4xx;..\..\..\os\various;..\..\..\os\various\devices_lib\accel;..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\boards\ST_STM32F4_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\boards\ST_STM32F4_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - cmparams.h - 5 - ..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\cmparams.h - - - vectors.s - 2 - ..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\vectors.s - - - nvic.c - 1 - ..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\os\kernel\include\chvt.h - - - - - hal - - - adc.c - 1 - ..\..\..\os\hal\src\adc.c - - - hal.c - 1 - ..\..\..\os\hal\src\hal.c - - - pal.c - 1 - ..\..\..\os\hal\src\pal.c - - - pwm.c - 1 - ..\..\..\os\hal\src\pwm.c - - - serial.c - 1 - ..\..\..\os\hal\src\serial.c - - - spi.c - 1 - ..\..\..\os\hal\src\spi.c - - - adc.h - 5 - ..\..\..\os\hal\include\adc.h - - - hal.h - 5 - ..\..\..\os\hal\include\hal.h - - - pal.h - 5 - ..\..\..\os\hal\include\pal.h - - - pwm.h - 5 - ..\..\..\os\hal\include\pwm.h - - - serial.h - 5 - ..\..\..\os\hal\include\serial.h - - - spi.h - 5 - ..\..\..\os\hal\include\spi.h - - - - - platform - - - adc_lld.c - 1 - ..\..\..\os\hal\platforms\STM32F4xx\adc_lld.c - - - adc_lld.h - 5 - ..\..\..\os\hal\platforms\STM32F4xx\adc_lld.h - - - hal_lld.c - 1 - ..\..\..\os\hal\platforms\STM32F4xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\os\hal\platforms\STM32F4xx\hal_lld.h - - - pal_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - pwm_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\pwm_lld.c - - - pwm_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\pwm_lld.h - - - serial_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\serial_lld.c - - - spi_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\spi_lld.h - - - spi_lld.c - 1 - ..\..\..\os\hal\platforms\STM32\spi_lld.c - - - serial_lld.h - 5 - ..\..\..\os\hal\platforms\STM32\serial_lld.h - - - stm32_dma.c - 1 - ..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.h - - - stm32_rcc.h - 5 - ..\..\..\os\hal\platforms\STM32F4xx\stm32_rcc.h - - - stm32f4xx.h - 5 - ..\..\..\os\hal\platforms\STM32F4xx\stm32f4xx.h - - - - - test - - - test.c - 1 - ..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - - - - - -
diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/main.c b/demos/ARMCM4-STM32F407-DISCOVERY/main.c deleted file mode 100644 index 6d0ac5cdbd..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/main.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -static void pwmpcb(PWMDriver *pwmp); -static void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n); -static void spicb(SPIDriver *spip); - -/* Total number of channels to be sampled by a single ADC operation.*/ -#define ADC_GRP1_NUM_CHANNELS 2 - -/* Depth of the conversion buffer, channels are sampled four times each.*/ -#define ADC_GRP1_BUF_DEPTH 4 - -/* - * ADC samples buffer. - */ -static adcsample_t samples[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; - -/* - * ADC conversion group. - * Mode: Linear buffer, 4 samples of 2 channels, SW triggered. - * Channels: IN11 (48 cycles sample time) - * Sensor (192 cycles sample time) - */ -static const ADCConversionGroup adcgrpcfg = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - adccb, - NULL, - /* HW dependent part.*/ - 0, - ADC_CR2_SWSTART, - ADC_SMPR1_SMP_AN11(ADC_SAMPLE_56) | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144), - 0, - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ1_N(ADC_CHANNEL_SENSOR) -}; - -/* - * PWM configuration structure. - * Cyclic callback enabled, channels 1 and 4 enabled without callbacks, - * the active state is a logic one. - */ -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* PWM period 1S (in ticks). */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_ACTIVE_HIGH, NULL} - }, - /* HW dependent part.*/ - 0 -}; - -/* - * SPI2 configuration structure. - * Speed 21MHz, CPHA=0, CPOL=0, 16bits frames, MSb transmitted first. - * The slave select line is the pin 12 on the port GPIOA. - */ -static const SPIConfig spi2cfg = { - spicb, - /* HW dependent part.*/ - GPIOB, - 12, - SPI_CR1_DFF -}; - -/* - * PWM cyclic callback. - * A new ADC conversion is started. - */ -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - - /* Starts an asynchronous ADC conversion operation, the conversion - will be executed in parallel to the current PWM cycle and will - terminate before the next PWM cycle.*/ - chSysLockFromIsr(); - adcStartConversionI(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH); - chSysUnlockFromIsr(); -} - -/* - * ADC end conversion callback. - * The PWM channels are reprogrammed using the latest ADC samples. - * The latest samples are transmitted into a single SPI transaction. - */ -void adccb(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void) buffer; (void) n; - /* Note, only in the ADC_COMPLETE state because the ADC driver fires an - intermediate callback when the buffer is half full.*/ - if (adcp->state == ADC_COMPLETE) { - adcsample_t avg_ch1, avg_ch2; - - /* Calculates the average values from the ADC samples.*/ - avg_ch1 = (samples[0] + samples[2] + samples[4] + samples[6]) / 4; - avg_ch2 = (samples[1] + samples[3] + samples[5] + samples[7]) / 4; - - chSysLockFromIsr(); - - /* Changes the channels pulse width, the change will be effective - starting from the next cycle.*/ - pwmEnableChannelI(&PWMD4, 0, PWM_FRACTION_TO_WIDTH(&PWMD4, 4096, avg_ch1)); - pwmEnableChannelI(&PWMD4, 3, PWM_FRACTION_TO_WIDTH(&PWMD4, 4096, avg_ch2)); - - /* SPI slave selection and transmission start.*/ - spiSelectI(&SPID2); - spiStartSendI(&SPID2, ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH, samples); - - chSysUnlockFromIsr(); - } -} - -/* - * SPI end transfer callback. - */ -static void spicb(SPIDriver *spip) { - - /* On transfer end just releases the slave select line.*/ - chSysLockFromIsr(); - spiUnselectI(spip); - chSysUnlockFromIsr(); -} - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - palClearPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - * PA2(TX) and PA3(RX) are routed to USART2. - */ - sdStart(&SD2, NULL); - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - - /* - * If the user button is pressed after the reset then the test suite is - * executed immediately before activating the various device drivers in - * order to not alter the benchmark scores. - */ - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD2); - - /* - * Initializes the SPI driver 2. The SPI2 signals are routed as follow: - * PB12 - NSS. - * PB13 - SCK. - * PB14 - MISO. - * PB15 - MOSI. - */ - spiStart(&SPID2, &spi2cfg); - palSetPad(GPIOB, 12); - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* NSS. */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5)); /* MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* MOSI. */ - - /* - * Initializes the ADC driver 1 and enable the thermal sensor. - * The pin PC1 on the port GPIOC is programmed as analog input. - */ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_ANALOG); - - /* - * Initializes the PWM driver 4, routes the TIM4 outputs to the board LEDs. - */ - pwmStart(&PWMD4, &pwmcfg); - palSetPadMode(GPIOD, GPIOD_LED4, PAL_MODE_ALTERNATE(2)); /* Green. */ - palSetPadMode(GPIOD, GPIOD_LED6, PAL_MODE_ALTERNATE(2)); /* Blue. */ - - /* - * Creates the example thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state, when the button is - * pressed the test procedure is launched with output on the serial - * driver 2. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - TestThread(&SD2); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/mcuconf.h b/demos/ARMCM4-STM32F407-DISCOVERY/mcuconf.h deleted file mode 100644 index 35f524ea23..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 TRUE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/readme.txt b/demos/ARMCM4-STM32F407-DISCOVERY/readme.txt deleted file mode 100644 index 653db79ab3..0000000000 --- a/demos/ARMCM4-STM32F407-DISCOVERY/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M4 STM32F407. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F4-Discovery board. - -** The Demo ** - -The demo shows how to use the ADC, PWM and SPI drivers using asynchronous -APIs. The ADC samples two channels (temperature sensor and PC1) and modulates -the PWM using the sampled values. The sample data is also transmitted using -the SPI port 2 (NSS=PB12, SCK=PB13, MISO=PB14, MOSI=PB15). -By pressing the button located on the board the test procedure is activated -with output on the serial port SD2 (USART2). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. just modify the TRGT line in the makefile in order to use -different GCC toolchains. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.cproject b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.cproject deleted file mode 100644 index a5d3f27fe7..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.project b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.project deleted file mode 100644 index f8e5d5b3e7..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/.project +++ /dev/null @@ -1,105 +0,0 @@ - - - ARMCM4-STM32F407-LWIP-FATFS-USB - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j1 - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_E407 - - - fatfs - 2 - CHIBIOS/ext/fatfs - - - lwip - 2 - CHIBIOS/ext/lwip - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/Makefile b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/Makefile deleted file mode 100644 index 89cd7d532c..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/Makefile +++ /dev/null @@ -1,229 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_E407/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/lwip_bindings/lwip.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(LWSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/shell.c \ - web/web.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) $(LWINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/chconf.h b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/ffconf.h b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/ffconf.h deleted file mode 100644 index e6a13cea3a..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 1 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/halconf.h b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/halconf.h deleted file mode 100644 index 5dc4e04521..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC TRUE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/lwipopts.h b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/lwipopts.h deleted file mode 100644 index 1bfbd1de6f..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/lwipopts.h +++ /dev/null @@ -1,2030 +0,0 @@ -/** - * @file - * - * lwIP Options Configuration - */ - -/* - * Copyright (c) 2001-2004 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIPOPT_H__ -#define __LWIPOPT_H__ - - -/* - ----------------------------------------------- - ---------- Platform specific locking ---------- - ----------------------------------------------- -*/ - -/** - * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain - * critical regions during buffer allocation, deallocation and memory - * allocation and deallocation. - */ -#ifndef SYS_LIGHTWEIGHT_PROT -#define SYS_LIGHTWEIGHT_PROT 0 -#endif - -/** - * NO_SYS==1: Provides VERY minimal functionality. Otherwise, - * use lwIP facilities. - */ -#ifndef NO_SYS -#define NO_SYS 0 -#endif - -/** - * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 - * Mainly for compatibility to old versions. - */ -#ifndef NO_SYS_NO_TIMERS -#define NO_SYS_NO_TIMERS 0 -#endif - -/** - * MEMCPY: override this if you have a faster implementation at hand than the - * one included in your C library - */ -#ifndef MEMCPY -#define MEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/** - * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a - * call to memcpy() if the length is known at compile time and is small. - */ -#ifndef SMEMCPY -#define SMEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/* - ------------------------------------ - ---------- Memory options ---------- - ------------------------------------ -*/ -/** - * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library - * instead of the lwip internal allocator. Can save code size if you - * already use it. - */ -#ifndef MEM_LIBC_MALLOC -#define MEM_LIBC_MALLOC 0 -#endif - -/** -* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. -* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution -* speed and usage from interrupts! -*/ -#ifndef MEMP_MEM_MALLOC -#define MEMP_MEM_MALLOC 0 -#endif - -/** - * MEM_ALIGNMENT: should be set to the alignment of the CPU - * 4 byte alignment -> #define MEM_ALIGNMENT 4 - * 2 byte alignment -> #define MEM_ALIGNMENT 2 - */ -#ifndef MEM_ALIGNMENT -#define MEM_ALIGNMENT 4 -#endif - -/** - * MEM_SIZE: the size of the heap memory. If the application will send - * a lot of data that needs to be copied, this should be set high. - */ -#ifndef MEM_SIZE -#define MEM_SIZE 1600 -#endif - -/** - * MEMP_SEPARATE_POOLS: if defined to 1, each pool is placed in its own array. - * This can be used to individually change the location of each pool. - * Default is one big array for all pools - */ -#ifndef MEMP_SEPARATE_POOLS -#define MEMP_SEPARATE_POOLS 0 -#endif - -/** - * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable - * amount of bytes before and after each memp element in every pool and fills - * it with a prominent default value. - * MEMP_OVERFLOW_CHECK == 0 no checking - * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed - * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time - * memp_malloc() or memp_free() is called (useful but slow!) - */ -#ifndef MEMP_OVERFLOW_CHECK -#define MEMP_OVERFLOW_CHECK 0 -#endif - -/** - * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make - * sure that there are no cycles in the linked lists. - */ -#ifndef MEMP_SANITY_CHECK -#define MEMP_SANITY_CHECK 0 -#endif - -/** - * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set - * of memory pools of various sizes. When mem_malloc is called, an element of - * the smallest pool that can provide the length needed is returned. - * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. - */ -#ifndef MEM_USE_POOLS -#define MEM_USE_POOLS 0 -#endif - -/** - * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next - * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more - * reliable. */ -#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL -#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 -#endif - -/** - * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h - * that defines additional pools beyond the "standard" ones required - * by lwIP. If you set this to 1, you must have lwippools.h in your - * inlude path somewhere. - */ -#ifndef MEMP_USE_CUSTOM_POOLS -#define MEMP_USE_CUSTOM_POOLS 0 -#endif - -/** - * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from - * interrupt context (or another context that doesn't allow waiting for a - * semaphore). - * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, - * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs - * with each loop so that mem_free can run. - * - * ATTENTION: As you can see from the above description, this leads to dis-/ - * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc - * can need longer. - * - * If you don't want that, at least for NO_SYS=0, you can still use the following - * functions to enqueue a deallocation call which then runs in the tcpip_thread - * context: - * - pbuf_free_callback(p); - * - mem_free_callback(m); - */ -#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT -#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 -#endif - -/* - ------------------------------------------------ - ---------- Internal Memory Pool Sizes ---------- - ------------------------------------------------ -*/ -/** - * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). - * If the application sends a lot of data out of ROM (or other static memory), - * this should be set high. - */ -#ifndef MEMP_NUM_PBUF -#define MEMP_NUM_PBUF 16 -#endif - -/** - * MEMP_NUM_RAW_PCB: Number of raw connection PCBs - * (requires the LWIP_RAW option) - */ -#ifndef MEMP_NUM_RAW_PCB -#define MEMP_NUM_RAW_PCB 4 -#endif - -/** - * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One - * per active UDP "connection". - * (requires the LWIP_UDP option) - */ -#ifndef MEMP_NUM_UDP_PCB -#define MEMP_NUM_UDP_PCB 4 -#endif - -/** - * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB -#define MEMP_NUM_TCP_PCB 5 -#endif - -/** - * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB_LISTEN -#define MEMP_NUM_TCP_PCB_LISTEN 8 -#endif - -/** - * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_SEG -#define MEMP_NUM_TCP_SEG 16 -#endif - -/** - * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for - * reassembly (whole packets, not fragments!) - */ -#ifndef MEMP_NUM_REASSDATA -#define MEMP_NUM_REASSDATA 5 -#endif - -/** - * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent - * (fragments, not whole packets!). - * This is only used with IP_FRAG_USES_STATIC_BUF==0 and - * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs - * where the packet is not yet sent when netif->output returns. - */ -#ifndef MEMP_NUM_FRAG_PBUF -#define MEMP_NUM_FRAG_PBUF 15 -#endif - -/** - * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing - * packets (pbufs) that are waiting for an ARP request (to resolve - * their destination address) to finish. - * (requires the ARP_QUEUEING option) - */ -#ifndef MEMP_NUM_ARP_QUEUE -#define MEMP_NUM_ARP_QUEUE 30 -#endif - -/** - * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces - * can be members et the same time (one per netif - allsystems group -, plus one - * per netif membership). - * (requires the LWIP_IGMP option) - */ -#ifndef MEMP_NUM_IGMP_GROUP -#define MEMP_NUM_IGMP_GROUP 8 -#endif - -/** - * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. - * (requires NO_SYS==0) - */ -#ifndef MEMP_NUM_SYS_TIMEOUT -#define MEMP_NUM_SYS_TIMEOUT 3 -#endif - -/** - * MEMP_NUM_NETBUF: the number of struct netbufs. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETBUF -#define MEMP_NUM_NETBUF 2 -#endif - -/** - * MEMP_NUM_NETCONN: the number of struct netconns. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETCONN -#define MEMP_NUM_NETCONN 4 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used - * for callback/timeout API communication. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_API -#define MEMP_NUM_TCPIP_MSG_API 8 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used - * for incoming packets. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_INPKT -#define MEMP_NUM_TCPIP_MSG_INPKT 8 -#endif - -/** - * MEMP_NUM_SNMP_NODE: the number of leafs in the SNMP tree. - */ -#ifndef MEMP_NUM_SNMP_NODE -#define MEMP_NUM_SNMP_NODE 50 -#endif - -/** - * MEMP_NUM_SNMP_ROOTNODE: the number of branches in the SNMP tree. - * Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least! - */ -#ifndef MEMP_NUM_SNMP_ROOTNODE -#define MEMP_NUM_SNMP_ROOTNODE 30 -#endif - -/** - * MEMP_NUM_SNMP_VARBIND: the number of concurrent requests (does not have to - * be changed normally) - 2 of these are used per request (1 for input, - * 1 for output) - */ -#ifndef MEMP_NUM_SNMP_VARBIND -#define MEMP_NUM_SNMP_VARBIND 2 -#endif - -/** - * MEMP_NUM_SNMP_VALUE: the number of OID or values concurrently used - * (does not have to be changed normally) - 3 of these are used per request - * (1 for the value read and 2 for OIDs - input and output) - */ -#ifndef MEMP_NUM_SNMP_VALUE -#define MEMP_NUM_SNMP_VALUE 3 -#endif - -/** - * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls - * (before freeing the corresponding memory using lwip_freeaddrinfo()). - */ -#ifndef MEMP_NUM_NETDB -#define MEMP_NUM_NETDB 1 -#endif - -/** - * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list - * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. - */ -#ifndef MEMP_NUM_LOCALHOSTLIST -#define MEMP_NUM_LOCALHOSTLIST 1 -#endif - -/** - * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE - * interfaces (only used with PPPOE_SUPPORT==1) - */ -#ifndef MEMP_NUM_PPPOE_INTERFACES -#define MEMP_NUM_PPPOE_INTERFACES 1 -#endif - -/** - * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. - */ -#ifndef PBUF_POOL_SIZE -#define PBUF_POOL_SIZE 16 -#endif - -/* - --------------------------------- - ---------- ARP options ---------- - --------------------------------- -*/ -/** - * LWIP_ARP==1: Enable ARP functionality. - */ -#ifndef LWIP_ARP -#define LWIP_ARP 1 -#endif - -/** - * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. - */ -#ifndef ARP_TABLE_SIZE -#define ARP_TABLE_SIZE 10 -#endif - -/** - * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address - * resolution. By default, only the most recent packet is queued per IP address. - * This is sufficient for most protocols and mainly reduces TCP connection - * startup time. Set this to 1 if you know your application sends more than one - * packet in a row to an IP address that is not in the ARP cache. - */ -#ifndef ARP_QUEUEING -#define ARP_QUEUEING 0 -#endif - -/** - * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be - * updated with the source MAC and IP addresses supplied in the packet. - * You may want to disable this if you do not trust LAN peers to have the - * correct addresses, or as a limited approach to attempt to handle - * spoofing. If disabled, lwIP will need to make a new ARP request if - * the peer is not already in the ARP table, adding a little latency. - * The peer *is* in the ARP table if it requested our address before. - * Also notice that this slows down input processing of every IP packet! - */ -#ifndef ETHARP_TRUST_IP_MAC -#define ETHARP_TRUST_IP_MAC 0 -#endif - -/** - * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. - * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. - * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. - * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. - */ -#ifndef ETHARP_SUPPORT_VLAN -#define ETHARP_SUPPORT_VLAN 0 -#endif - -/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP - * might be disabled - */ -#ifndef LWIP_ETHERNET -#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) -#endif - -/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure - * alignment of payload after that header. Since the header is 14 bytes long, - * without this padding e.g. addresses in the IP header will not be aligned - * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. - */ -#ifndef ETH_PAD_SIZE -#define ETH_PAD_SIZE 0 -#endif - -/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table - * entries (using etharp_add_static_entry/etharp_remove_static_entry). - */ -#ifndef ETHARP_SUPPORT_STATIC_ENTRIES -#define ETHARP_SUPPORT_STATIC_ENTRIES 0 -#endif - - -/* - -------------------------------- - ---------- IP options ---------- - -------------------------------- -*/ -/** - * IP_FORWARD==1: Enables the ability to forward IP packets across network - * interfaces. If you are going to run lwIP on a device with only one network - * interface, define this to 0. - */ -#ifndef IP_FORWARD -#define IP_FORWARD 0 -#endif - -/** - * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. - * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. - * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). - */ -#ifndef IP_OPTIONS_ALLOWED -#define IP_OPTIONS_ALLOWED 1 -#endif - -/** - * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that - * this option does not affect outgoing packet sizes, which can be controlled - * via IP_FRAG. - */ -#ifndef IP_REASSEMBLY -#define IP_REASSEMBLY 1 -#endif - -/** - * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note - * that this option does not affect incoming packet sizes, which can be - * controlled via IP_REASSEMBLY. - */ -#ifndef IP_FRAG -#define IP_FRAG 1 -#endif - -/** - * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) - * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived - * in this time, the whole packet is discarded. - */ -#ifndef IP_REASS_MAXAGE -#define IP_REASS_MAXAGE 3 -#endif - -/** - * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. - * Since the received pbufs are enqueued, be sure to configure - * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive - * packets even if the maximum amount of fragments is enqueued for reassembly! - */ -#ifndef IP_REASS_MAX_PBUFS -#define IP_REASS_MAX_PBUFS 10 -#endif - -/** - * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP - * fragmentation. Otherwise pbufs are allocated and reference the original - * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1, - * new PBUF_RAM pbufs are used for fragments). - * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs! - */ -#ifndef IP_FRAG_USES_STATIC_BUF -#define IP_FRAG_USES_STATIC_BUF 0 -#endif - -/** - * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer - * (requires IP_FRAG_USES_STATIC_BUF==1) - */ -#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) -#define IP_FRAG_MAX_MTU 1500 -#endif - -/** - * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. - */ -#ifndef IP_DEFAULT_TTL -#define IP_DEFAULT_TTL 255 -#endif - -/** - * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast - * filter per pcb on udp and raw send operations. To enable broadcast filter - * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. - */ -#ifndef IP_SOF_BROADCAST -#define IP_SOF_BROADCAST 0 -#endif - -/** - * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast - * filter on recv operations. - */ -#ifndef IP_SOF_BROADCAST_RECV -#define IP_SOF_BROADCAST_RECV 0 -#endif - -/* - ---------------------------------- - ---------- ICMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_ICMP==1: Enable ICMP module inside the IP stack. - * Be careful, disable that make your product non-compliant to RFC1122 - */ -#ifndef LWIP_ICMP -#define LWIP_ICMP 1 -#endif - -/** - * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. - */ -#ifndef ICMP_TTL -#define ICMP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) - */ -#ifndef LWIP_BROADCAST_PING -#define LWIP_BROADCAST_PING 0 -#endif - -/** - * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) - */ -#ifndef LWIP_MULTICAST_PING -#define LWIP_MULTICAST_PING 0 -#endif - -/* - --------------------------------- - ---------- RAW options ---------- - --------------------------------- -*/ -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef LWIP_RAW -#define LWIP_RAW 1 -#endif - -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef RAW_TTL -#define RAW_TTL (IP_DEFAULT_TTL) -#endif - -/* - ---------------------------------- - ---------- DHCP options ---------- - ---------------------------------- -*/ -/** - * LWIP_DHCP==1: Enable DHCP module. - */ -#ifndef LWIP_DHCP -#define LWIP_DHCP 0 -#endif - -/** - * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. - */ -#ifndef DHCP_DOES_ARP_CHECK -#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) -#endif - -/* - ------------------------------------ - ---------- AUTOIP options ---------- - ------------------------------------ -*/ -/** - * LWIP_AUTOIP==1: Enable AUTOIP module. - */ -#ifndef LWIP_AUTOIP -#define LWIP_AUTOIP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on - * the same interface at the same time. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP -#define LWIP_DHCP_AUTOIP_COOP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes - * that should be sent before falling back on AUTOIP. This can be set - * as low as 1 to get an AutoIP address very quickly, but you should - * be prepared to handle a changing IP address when DHCP overrides - * AutoIP. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES -#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 -#endif - -/* - ---------------------------------- - ---------- SNMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP - * transport. - */ -#ifndef LWIP_SNMP -#define LWIP_SNMP 0 -#endif - -/** - * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will - * allow. At least one request buffer is required. - * Does not have to be changed unless external MIBs answer request asynchronously - */ -#ifndef SNMP_CONCURRENT_REQUESTS -#define SNMP_CONCURRENT_REQUESTS 1 -#endif - -/** - * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap - * destination is required - */ -#ifndef SNMP_TRAP_DESTINATIONS -#define SNMP_TRAP_DESTINATIONS 1 -#endif - -/** - * SNMP_PRIVATE_MIB: - * When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. - */ -#ifndef SNMP_PRIVATE_MIB -#define SNMP_PRIVATE_MIB 0 -#endif - -/** - * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not - * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). - * Unsafe requests are disabled by default! - */ -#ifndef SNMP_SAFE_REQUESTS -#define SNMP_SAFE_REQUESTS 1 -#endif - -/** - * The maximum length of strings used. This affects the size of - * MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_OCTET_STRING_LEN -#define SNMP_MAX_OCTET_STRING_LEN 127 -#endif - -/** - * The maximum depth of the SNMP tree. - * With private MIBs enabled, this depends on your MIB! - * This affects the size of MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_TREE_DEPTH -#define SNMP_MAX_TREE_DEPTH 15 -#endif - -/** - * The size of the MEMP_SNMP_VALUE elements, normally calculated from - * SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH. - */ -#ifndef SNMP_MAX_VALUE_SIZE -#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH)) -#endif - -/* - ---------------------------------- - ---------- IGMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_IGMP==1: Turn on IGMP module. - */ -#ifndef LWIP_IGMP -#define LWIP_IGMP 0 -#endif - -/* - ---------------------------------- - ---------- DNS options ----------- - ---------------------------------- -*/ -/** - * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS - * transport. - */ -#ifndef LWIP_DNS -#define LWIP_DNS 0 -#endif - -/** DNS maximum number of entries to maintain locally. */ -#ifndef DNS_TABLE_SIZE -#define DNS_TABLE_SIZE 4 -#endif - -/** DNS maximum host name length supported in the name table. */ -#ifndef DNS_MAX_NAME_LENGTH -#define DNS_MAX_NAME_LENGTH 256 -#endif - -/** The maximum of DNS servers */ -#ifndef DNS_MAX_SERVERS -#define DNS_MAX_SERVERS 2 -#endif - -/** DNS do a name checking between the query and the response. */ -#ifndef DNS_DOES_NAME_CHECK -#define DNS_DOES_NAME_CHECK 1 -#endif - -/** DNS message max. size. Default value is RFC compliant. */ -#ifndef DNS_MSG_SIZE -#define DNS_MSG_SIZE 512 -#endif - -/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, - * you have to define - * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} - * (an array of structs name/address, where address is an u32_t in network - * byte order). - * - * Instead, you can also use an external function: - * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) - * that returns the IP address or INADDR_NONE if not found. - */ -#ifndef DNS_LOCAL_HOSTLIST -#define DNS_LOCAL_HOSTLIST 0 -#endif /* DNS_LOCAL_HOSTLIST */ - -/** If this is turned on, the local host-list can be dynamically changed - * at runtime. */ -#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC -#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 -#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ - -/* - --------------------------------- - ---------- UDP options ---------- - --------------------------------- -*/ -/** - * LWIP_UDP==1: Turn on UDP. - */ -#ifndef LWIP_UDP -#define LWIP_UDP 1 -#endif - -/** - * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) - */ -#ifndef LWIP_UDPLITE -#define LWIP_UDPLITE 0 -#endif - -/** - * UDP_TTL: Default Time-To-Live value. - */ -#ifndef UDP_TTL -#define UDP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. - */ -#ifndef LWIP_NETBUF_RECVINFO -#define LWIP_NETBUF_RECVINFO 0 -#endif - -/* - --------------------------------- - ---------- TCP options ---------- - --------------------------------- -*/ -/** - * LWIP_TCP==1: Turn on TCP. - */ -#ifndef LWIP_TCP -#define LWIP_TCP 1 -#endif - -/** - * TCP_TTL: Default Time-To-Live value. - */ -#ifndef TCP_TTL -#define TCP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * TCP_WND: The size of a TCP window. This must be at least - * (2 * TCP_MSS) for things to work well - */ -#ifndef TCP_WND -#define TCP_WND (4 * TCP_MSS) -#endif - -/** - * TCP_MAXRTX: Maximum number of retransmissions of data segments. - */ -#ifndef TCP_MAXRTX -#define TCP_MAXRTX 12 -#endif - -/** - * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. - */ -#ifndef TCP_SYNMAXRTX -#define TCP_SYNMAXRTX 6 -#endif - -/** - * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. - * Define to 0 if your device is low on memory. - */ -#ifndef TCP_QUEUE_OOSEQ -#define TCP_QUEUE_OOSEQ (LWIP_TCP) -#endif - -/** - * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, - * you might want to increase this.) - * For the receive side, this MSS is advertised to the remote side - * when opening a connection. For the transmit size, this MSS sets - * an upper limit on the MSS advertised by the remote host. - */ -#ifndef TCP_MSS -#define TCP_MSS 536 -#endif - -/** - * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really - * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which - * reflects the available reassembly buffer size at the remote host) and the - * largest size permitted by the IP layer" (RFC 1122) - * Setting this to 1 enables code that checks TCP_MSS against the MTU of the - * netif used for a connection and limits the MSS if it would be too big otherwise. - */ -#ifndef TCP_CALCULATE_EFF_SEND_MSS -#define TCP_CALCULATE_EFF_SEND_MSS 1 -#endif - - -/** - * TCP_SND_BUF: TCP sender buffer space (bytes). - */ -#ifndef TCP_SND_BUF -#define TCP_SND_BUF 256 -#endif - -/** - * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least - * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. - */ -#ifndef TCP_SND_QUEUELEN -#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) -#endif - -/** - * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than - * TCP_SND_BUF. It is the amount of space which must be available in the - * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). - */ -#ifndef TCP_SNDLOWAT -#define TCP_SNDLOWAT ((TCP_SND_BUF)/2) -#endif - -/** - * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be grater - * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below - * this number, select returns writable (combined with TCP_SNDLOWAT). - */ -#ifndef TCP_SNDQUEUELOWAT -#define TCP_SNDQUEUELOWAT ((TCP_SND_QUEUELEN)/2) -#endif - -/** - * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. - */ -#ifndef TCP_LISTEN_BACKLOG -#define TCP_LISTEN_BACKLOG 0 -#endif - -/** - * The maximum allowed backlog for TCP listen netconns. - * This backlog is used unless another is explicitly specified. - * 0xff is the maximum (u8_t). - */ -#ifndef TCP_DEFAULT_LISTEN_BACKLOG -#define TCP_DEFAULT_LISTEN_BACKLOG 0xff -#endif - -/** - * TCP_OVERSIZE: The maximum number of bytes that tcp_write may - * allocate ahead of time in an attempt to create shorter pbuf chains - * for transmission. The meaningful range is 0 to TCP_MSS. Some - * suggested values are: - * - * 0: Disable oversized allocation. Each tcp_write() allocates a new - pbuf (old behaviour). - * 1: Allocate size-aligned pbufs with minimal excess. Use this if your - * scatter-gather DMA requires aligned fragments. - * 128: Limit the pbuf/memory overhead to 20%. - * TCP_MSS: Try to create unfragmented TCP packets. - * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. - */ -#ifndef TCP_OVERSIZE -#define TCP_OVERSIZE TCP_MSS -#endif - -/** - * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. - */ -#ifndef LWIP_TCP_TIMESTAMPS -#define LWIP_TCP_TIMESTAMPS 0 -#endif - -/** - * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an - * explicit window update - */ -#ifndef TCP_WND_UPDATE_THRESHOLD -#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) -#endif - -/** - * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. - * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all - * events (accept, sent, etc) that happen in the system. - * LWIP_CALLBACK_API==1: The PCB callback function is called directly - * for the event. - */ -//#define LWIP_EVENT_API - -/* - ---------------------------------- - ---------- Pbuf options ---------- - ---------------------------------- -*/ -/** - * PBUF_LINK_HLEN: the number of bytes that should be allocated for a - * link level header. The default is 14, the standard value for - * Ethernet. - */ -#ifndef PBUF_LINK_HLEN -#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) -#endif - -/** - * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is - * designed to accomodate single full size TCP frame in one pbuf, including - * TCP_MSS, IP header, and link header. - */ -#ifndef PBUF_POOL_BUFSIZE -#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) -#endif - -/* - ------------------------------------------------ - ---------- Network Interfaces options ---------- - ------------------------------------------------ -*/ -/** - * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname - * field. - */ -#ifndef LWIP_NETIF_HOSTNAME -#define LWIP_NETIF_HOSTNAME 0 -#endif - -/** - * LWIP_NETIF_API==1: Support netif api (in netifapi.c) - */ -#ifndef LWIP_NETIF_API -#define LWIP_NETIF_API 0 -#endif - -/** - * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface - * changes its up/down status (i.e., due to DHCP IP acquistion) - */ -#ifndef LWIP_NETIF_STATUS_CALLBACK -#define LWIP_NETIF_STATUS_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface - * whenever the link changes (i.e., link down) - */ -#ifndef LWIP_NETIF_LINK_CALLBACK -#define LWIP_NETIF_LINK_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table - * indices) in struct netif. TCP and UDP can make use of this to prevent - * scanning the ARP table for every sent packet. While this is faster for big - * ARP tables or many concurrent connections, it might be counterproductive - * if you have a tiny ARP table or if there never are concurrent connections. - */ -#ifndef LWIP_NETIF_HWADDRHINT -#define LWIP_NETIF_HWADDRHINT 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP - * address equal to the netif IP address, looping them back up the stack. - */ -#ifndef LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 0 -#endif - -/** - * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback - * sending for each netif (0 = disabled) - */ -#ifndef LWIP_LOOPBACK_MAX_PBUFS -#define LWIP_LOOPBACK_MAX_PBUFS 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in - * the system, as netifs must change how they behave depending on this setting - * for the LWIP_NETIF_LOOPBACK option to work. - * Setting this is needed to avoid reentering non-reentrant functions like - * tcp_input(). - * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a - * multithreaded environment like tcpip.c. In this case, netif->input() - * is called directly. - * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. - * The packets are put on a list and netif_poll() must be called in - * the main application loop. - */ -#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING -#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) -#endif - -/** - * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data - * to be sent into one single pbuf. This is for compatibility with DMA-enabled - * MACs that do not support scatter-gather. - * Beware that this might involve CPU-memcpy before transmitting that would not - * be needed without this flag! Use this only if you need to! - * - * @todo: TCP and IP-frag do not work with this, yet: - */ -#ifndef LWIP_NETIF_TX_SINGLE_PBUF -#define LWIP_NETIF_TX_SINGLE_PBUF 0 -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - -/* - ------------------------------------ - ---------- LOOPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c - */ -#ifndef LWIP_HAVE_LOOPIF -#define LWIP_HAVE_LOOPIF 0 -#endif - -/* - ------------------------------------ - ---------- SLIPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c - */ -#ifndef LWIP_HAVE_SLIPIF -#define LWIP_HAVE_SLIPIF 0 -#endif - -/* - ------------------------------------ - ---------- Thread options ---------- - ------------------------------------ -*/ -/** - * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. - */ -#ifndef TCPIP_THREAD_NAME -#define TCPIP_THREAD_NAME "tcpip_thread" -#endif - -/** - * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_STACKSIZE -#define TCPIP_THREAD_STACKSIZE 1024 -#endif - -/** - * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_PRIO -#define TCPIP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when tcpip_init is called. - */ -#ifndef TCPIP_MBOX_SIZE -#define TCPIP_MBOX_SIZE 4 -#endif - -/** - * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. - */ -#ifndef SLIPIF_THREAD_NAME -#define SLIPIF_THREAD_NAME "slipif_loop" -#endif - -/** - * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_STACKSIZE -#define SLIPIF_THREAD_STACKSIZE 1024 -#endif - -/** - * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_PRIO -#define SLIPIF_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * PPP_THREAD_NAME: The name assigned to the pppInputThread. - */ -#ifndef PPP_THREAD_NAME -#define PPP_THREAD_NAME "pppInputThread" -#endif - -/** - * PPP_THREAD_STACKSIZE: The stack size used by the pppInputThread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_STACKSIZE -#define PPP_THREAD_STACKSIZE 1024 -#endif - -/** - * PPP_THREAD_PRIO: The priority assigned to the pppInputThread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_PRIO -#define PPP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. - */ -#ifndef DEFAULT_THREAD_NAME -#define DEFAULT_THREAD_NAME "lwIP" -#endif - -/** - * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_STACKSIZE -#define DEFAULT_THREAD_STACKSIZE 1024 -#endif - -/** - * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_PRIO -#define DEFAULT_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_RAW_RECVMBOX_SIZE -#define DEFAULT_RAW_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_UDP_RECVMBOX_SIZE -#define DEFAULT_UDP_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_TCP_RECVMBOX_SIZE -#define DEFAULT_TCP_RECVMBOX_SIZE 40 -#endif - -/** - * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when the acceptmbox is created. - */ -#ifndef DEFAULT_ACCEPTMBOX_SIZE -#define DEFAULT_ACCEPTMBOX_SIZE 4 -#endif - -/* - ---------------------------------------------- - ---------- Sequential layer options ---------- - ---------------------------------------------- -*/ -/** - * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING -#define LWIP_TCPIP_CORE_LOCKING 0 -#endif - -/** - * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT -#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 -#endif - -/** - * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) - */ -#ifndef LWIP_NETCONN -#define LWIP_NETCONN 1 -#endif - -/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout tod create - * timers running in tcpip_thread from another thread. - */ -#ifndef LWIP_TCPIP_TIMEOUT -#define LWIP_TCPIP_TIMEOUT 1 -#endif - -/* - ------------------------------------ - ---------- Socket options ---------- - ------------------------------------ -*/ -/** - * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) - */ -#ifndef LWIP_SOCKET -#define LWIP_SOCKET 1 -#endif - -/** - * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. - * (only used if you use sockets.c) - */ -#ifndef LWIP_COMPAT_SOCKETS -#define LWIP_COMPAT_SOCKETS 1 -#endif - -/** - * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. - * Disable this option if you use a POSIX operating system that uses the same - * names (read, write & close). (only used if you use sockets.c) - */ -#ifndef LWIP_POSIX_SOCKETS_IO_NAMES -#define LWIP_POSIX_SOCKETS_IO_NAMES 1 -#endif - -/** - * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT - * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set - * in seconds. (does not require sockets.c, and will affect tcp.c) - */ -#ifndef LWIP_TCP_KEEPALIVE -#define LWIP_TCP_KEEPALIVE 0 -#endif - -/** - * LWIP_SO_RCVTIMEO==1: Enable SO_RCVTIMEO processing. - */ -#ifndef LWIP_SO_RCVTIMEO -#define LWIP_SO_RCVTIMEO 0 -#endif - -/** - * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. - */ -#ifndef LWIP_SO_RCVBUF -#define LWIP_SO_RCVBUF 0 -#endif - -/** - * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. - */ -#ifndef RECV_BUFSIZE_DEFAULT -#define RECV_BUFSIZE_DEFAULT INT_MAX -#endif - -/** - * SO_REUSE==1: Enable SO_REUSEADDR option. - */ -#ifndef SO_REUSE -#define SO_REUSE 0 -#endif - -/** - * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets - * to all local matches if SO_REUSEADDR is turned on. - * WARNING: Adds a memcpy for every packet if passing to more than one pcb! - */ -#ifndef SO_REUSE_RXTOALL -#define SO_REUSE_RXTOALL 0 -#endif - -/* - ---------------------------------------- - ---------- Statistics options ---------- - ---------------------------------------- -*/ -/** - * LWIP_STATS==1: Enable statistics collection in lwip_stats. - */ -#ifndef LWIP_STATS -#define LWIP_STATS 1 -#endif - -#if LWIP_STATS - -/** - * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. - */ -#ifndef LWIP_STATS_DISPLAY -#define LWIP_STATS_DISPLAY 0 -#endif - -/** - * LINK_STATS==1: Enable link stats. - */ -#ifndef LINK_STATS -#define LINK_STATS 1 -#endif - -/** - * ETHARP_STATS==1: Enable etharp stats. - */ -#ifndef ETHARP_STATS -#define ETHARP_STATS (LWIP_ARP) -#endif - -/** - * IP_STATS==1: Enable IP stats. - */ -#ifndef IP_STATS -#define IP_STATS 1 -#endif - -/** - * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is - * on if using either frag or reass. - */ -#ifndef IPFRAG_STATS -#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) -#endif - -/** - * ICMP_STATS==1: Enable ICMP stats. - */ -#ifndef ICMP_STATS -#define ICMP_STATS 1 -#endif - -/** - * IGMP_STATS==1: Enable IGMP stats. - */ -#ifndef IGMP_STATS -#define IGMP_STATS (LWIP_IGMP) -#endif - -/** - * UDP_STATS==1: Enable UDP stats. Default is on if - * UDP enabled, otherwise off. - */ -#ifndef UDP_STATS -#define UDP_STATS (LWIP_UDP) -#endif - -/** - * TCP_STATS==1: Enable TCP stats. Default is on if TCP - * enabled, otherwise off. - */ -#ifndef TCP_STATS -#define TCP_STATS (LWIP_TCP) -#endif - -/** - * MEM_STATS==1: Enable mem.c stats. - */ -#ifndef MEM_STATS -#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) -#endif - -/** - * MEMP_STATS==1: Enable memp.c pool stats. - */ -#ifndef MEMP_STATS -#define MEMP_STATS (MEMP_MEM_MALLOC == 0) -#endif - -/** - * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). - */ -#ifndef SYS_STATS -#define SYS_STATS (NO_SYS == 0) -#endif - -#else - -#define LINK_STATS 0 -#define IP_STATS 0 -#define IPFRAG_STATS 0 -#define ICMP_STATS 0 -#define IGMP_STATS 0 -#define UDP_STATS 0 -#define TCP_STATS 0 -#define MEM_STATS 0 -#define MEMP_STATS 0 -#define SYS_STATS 0 -#define LWIP_STATS_DISPLAY 0 - -#endif /* LWIP_STATS */ - -/* - --------------------------------- - ---------- PPP options ---------- - --------------------------------- -*/ -/** - * PPP_SUPPORT==1: Enable PPP. - */ -#ifndef PPP_SUPPORT -#define PPP_SUPPORT 0 -#endif - -/** - * PPPOE_SUPPORT==1: Enable PPP Over Ethernet - */ -#ifndef PPPOE_SUPPORT -#define PPPOE_SUPPORT 0 -#endif - -/** - * PPPOS_SUPPORT==1: Enable PPP Over Serial - */ -#ifndef PPPOS_SUPPORT -#define PPPOS_SUPPORT PPP_SUPPORT -#endif - -#if PPP_SUPPORT - -/** - * NUM_PPP: Max PPP sessions. - */ -#ifndef NUM_PPP -#define NUM_PPP 1 -#endif - -/** - * PAP_SUPPORT==1: Support PAP. - */ -#ifndef PAP_SUPPORT -#define PAP_SUPPORT 0 -#endif - -/** - * CHAP_SUPPORT==1: Support CHAP. - */ -#ifndef CHAP_SUPPORT -#define CHAP_SUPPORT 0 -#endif - -/** - * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef MSCHAP_SUPPORT -#define MSCHAP_SUPPORT 0 -#endif - -/** - * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CBCP_SUPPORT -#define CBCP_SUPPORT 0 -#endif - -/** - * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CCP_SUPPORT -#define CCP_SUPPORT 0 -#endif - -/** - * VJ_SUPPORT==1: Support VJ header compression. - */ -#ifndef VJ_SUPPORT -#define VJ_SUPPORT 0 -#endif - -/** - * MD5_SUPPORT==1: Support MD5 (see also CHAP). - */ -#ifndef MD5_SUPPORT -#define MD5_SUPPORT 0 -#endif - -/* - * Timeouts - */ -#ifndef FSM_DEFTIMEOUT -#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef FSM_DEFMAXTERMREQS -#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXCONFREQS -#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXNAKLOOPS -#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ -#endif - -#ifndef UPAP_DEFTIMEOUT -#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ -#endif - -#ifndef UPAP_DEFREQTIME -#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ -#endif - -#ifndef CHAP_DEFTIMEOUT -#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef CHAP_DEFTRANSMITS -#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ -#endif - -/* Interval in seconds between keepalive echo requests, 0 to disable. */ -#ifndef LCP_ECHOINTERVAL -#define LCP_ECHOINTERVAL 0 -#endif - -/* Number of unanswered echo requests before failure. */ -#ifndef LCP_MAXECHOFAILS -#define LCP_MAXECHOFAILS 3 -#endif - -/* Max Xmit idle time (in jiffies) before resend flag char. */ -#ifndef PPP_MAXIDLEFLAG -#define PPP_MAXIDLEFLAG 100 -#endif - -/* - * Packet sizes - * - * Note - lcp shouldn't be allowed to negotiate stuff outside these - * limits. See lcp.h in the pppd directory. - * (XXX - these constants should simply be shared by lcp.c instead - * of living in lcp.h) - */ -#define PPP_MTU 1500 /* Default MTU (size of Info field) */ -#ifndef PPP_MAXMTU -/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ -#define PPP_MAXMTU 1500 /* Largest MTU we allow */ -#endif -#define PPP_MINMTU 64 -#define PPP_MRU 1500 /* default MRU = max length of info field */ -#define PPP_MAXMRU 1500 /* Largest MRU we allow */ -#ifndef PPP_DEFMRU -#define PPP_DEFMRU 296 /* Try for this */ -#endif -#define PPP_MINMRU 128 /* No MRUs below this */ - -#ifndef MAXNAMELEN -#define MAXNAMELEN 256 /* max length of hostname or name for auth */ -#endif -#ifndef MAXSECRETLEN -#define MAXSECRETLEN 256 /* max length of password or secret */ -#endif - -#endif /* PPP_SUPPORT */ - -/* - -------------------------------------- - ---------- Checksum options ---------- - -------------------------------------- -*/ -/** - * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. - */ -#ifndef CHECKSUM_GEN_IP -#define CHECKSUM_GEN_IP 1 -#endif - -/** - * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. - */ -#ifndef CHECKSUM_GEN_UDP -#define CHECKSUM_GEN_UDP 1 -#endif - -/** - * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. - */ -#ifndef CHECKSUM_GEN_TCP -#define CHECKSUM_GEN_TCP 1 -#endif - -/** - * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. - */ -#ifndef CHECKSUM_CHECK_IP -#define CHECKSUM_CHECK_IP 1 -#endif - -/** - * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. - */ -#ifndef CHECKSUM_CHECK_UDP -#define CHECKSUM_CHECK_UDP 1 -#endif - -/** - * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. - */ -#ifndef CHECKSUM_CHECK_TCP -#define CHECKSUM_CHECK_TCP 1 -#endif - -/** - * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from - * application buffers to pbufs. - */ -#ifndef LWIP_CHECKSUM_ON_COPY -#define LWIP_CHECKSUM_ON_COPY 0 -#endif - -/* - --------------------------------------- - ---------- Debugging options ---------- - --------------------------------------- -*/ -/** - * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is - * compared against this value. If it is smaller, then debugging - * messages are written. - */ -#ifndef LWIP_DBG_MIN_LEVEL -#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF -#endif - -/** - * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable - * debug messages of certain types. - */ -#ifndef LWIP_DBG_TYPES_ON -#define LWIP_DBG_TYPES_ON LWIP_DBG_ON -#endif - -/** - * ETHARP_DEBUG: Enable debugging in etharp.c. - */ -#ifndef ETHARP_DEBUG -#define ETHARP_DEBUG LWIP_DBG_OFF -#endif - -/** - * NETIF_DEBUG: Enable debugging in netif.c. - */ -#ifndef NETIF_DEBUG -#define NETIF_DEBUG LWIP_DBG_OFF -#endif - -/** - * PBUF_DEBUG: Enable debugging in pbuf.c. - */ -#ifndef PBUF_DEBUG -#define PBUF_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_LIB_DEBUG: Enable debugging in api_lib.c. - */ -#ifndef API_LIB_DEBUG -#define API_LIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_MSG_DEBUG: Enable debugging in api_msg.c. - */ -#ifndef API_MSG_DEBUG -#define API_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SOCKETS_DEBUG: Enable debugging in sockets.c. - */ -#ifndef SOCKETS_DEBUG -#define SOCKETS_DEBUG LWIP_DBG_OFF -#endif - -/** - * ICMP_DEBUG: Enable debugging in icmp.c. - */ -#ifndef ICMP_DEBUG -#define ICMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IGMP_DEBUG: Enable debugging in igmp.c. - */ -#ifndef IGMP_DEBUG -#define IGMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * INET_DEBUG: Enable debugging in inet.c. - */ -#ifndef INET_DEBUG -#define INET_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_DEBUG: Enable debugging for IP. - */ -#ifndef IP_DEBUG -#define IP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. - */ -#ifndef IP_REASS_DEBUG -#define IP_REASS_DEBUG LWIP_DBG_OFF -#endif - -/** - * RAW_DEBUG: Enable debugging in raw.c. - */ -#ifndef RAW_DEBUG -#define RAW_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEM_DEBUG: Enable debugging in mem.c. - */ -#ifndef MEM_DEBUG -#define MEM_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEMP_DEBUG: Enable debugging in memp.c. - */ -#ifndef MEMP_DEBUG -#define MEMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SYS_DEBUG: Enable debugging in sys.c. - */ -#ifndef SYS_DEBUG -#define SYS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TIMERS_DEBUG: Enable debugging in timers.c. - */ -#ifndef TIMERS_DEBUG -#define TIMERS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_DEBUG: Enable debugging for TCP. - */ -#ifndef TCP_DEBUG -#define TCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. - */ -#ifndef TCP_INPUT_DEBUG -#define TCP_INPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. - */ -#ifndef TCP_FR_DEBUG -#define TCP_FR_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit - * timeout. - */ -#ifndef TCP_RTO_DEBUG -#define TCP_RTO_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. - */ -#ifndef TCP_CWND_DEBUG -#define TCP_CWND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. - */ -#ifndef TCP_WND_DEBUG -#define TCP_WND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. - */ -#ifndef TCP_OUTPUT_DEBUG -#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. - */ -#ifndef TCP_RST_DEBUG -#define TCP_RST_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. - */ -#ifndef TCP_QLEN_DEBUG -#define TCP_QLEN_DEBUG LWIP_DBG_OFF -#endif - -/** - * UDP_DEBUG: Enable debugging in UDP. - */ -#ifndef UDP_DEBUG -#define UDP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCPIP_DEBUG: Enable debugging in tcpip.c. - */ -#ifndef TCPIP_DEBUG -#define TCPIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * PPP_DEBUG: Enable debugging for PPP. - */ -#ifndef PPP_DEBUG -#define PPP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SLIP_DEBUG: Enable debugging in slipif.c. - */ -#ifndef SLIP_DEBUG -#define SLIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * DHCP_DEBUG: Enable debugging in dhcp.c. - */ -#ifndef DHCP_DEBUG -#define DHCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * AUTOIP_DEBUG: Enable debugging in autoip.c. - */ -#ifndef AUTOIP_DEBUG -#define AUTOIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. - */ -#ifndef SNMP_MSG_DEBUG -#define SNMP_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. - */ -#ifndef SNMP_MIB_DEBUG -#define SNMP_MIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * DNS_DEBUG: Enable debugging for DNS. - */ -#ifndef DNS_DEBUG -#define DNS_DEBUG LWIP_DBG_OFF -#endif - -#endif /* __LWIPOPT_H__ */ diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/main.c b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/main.c deleted file mode 100644 index 09a6ae3a60..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/main.c +++ /dev/null @@ -1,687 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "usb_cdc.h" -#include "chprintf.h" -#include "shell.h" - -#include "lwipthread.h" -#include "web/web.h" - -#include "ff.h" - -/*===========================================================================*/ -/* Card insertion monitor. */ -/*===========================================================================*/ - -#define POLLING_INTERVAL 10 -#define POLLING_DELAY 10 - -/** - * @brief Card monitor timer. - */ -static VirtualTimer tmr; - -/** - * @brief Debounce counter. - */ -static unsigned cnt; - -/** - * @brief Card event sources. - */ -static EventSource inserted_event, removed_event; - -/** - * @brief Insertion monitor timer callback function. - * - * @param[in] p pointer to the @p BaseBlockDevice object - * - * @notapi - */ -static void tmrfunc(void *p) { - BaseBlockDevice *bbdp = p; - - chSysLockFromIsr(); - if (cnt > 0) { - if (blkIsInserted(bbdp)) { - if (--cnt == 0) { - chEvtBroadcastI(&inserted_event); - } - } - else - cnt = POLLING_INTERVAL; - } - else { - if (!blkIsInserted(bbdp)) { - cnt = POLLING_INTERVAL; - chEvtBroadcastI(&removed_event); - } - } - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, bbdp); - chSysUnlockFromIsr(); -} - -/** - * @brief Polling monitor start. - * - * @param[in] p pointer to an object implementing @p BaseBlockDevice - * - * @notapi - */ -static void tmr_init(void *p) { - - chEvtInit(&inserted_event); - chEvtInit(&removed_event); - chSysLock(); - cnt = POLLING_INTERVAL; - chVTSetI(&tmr, MS2ST(POLLING_DELAY), tmrfunc, p); - chSysUnlock(); -} - -/*===========================================================================*/ -/* FatFs related. */ -/*===========================================================================*/ - -/** - * @brief FS object. - */ -static FATFS SDC_FS; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Generic large buffer.*/ -static uint8_t fbuff[1024]; - -static FRESULT scan_files(BaseSequentialStream *chp, char *path) { - FRESULT res; - FILINFO fno; - DIR dir; - int i; - char *fn; - -#if _USE_LFN - fno.lfname = 0; - fno.lfsize = 0; -#endif - res = f_opendir(&dir, path); - if (res == FR_OK) { - i = strlen(path); - for (;;) { - res = f_readdir(&dir, &fno); - if (res != FR_OK || fno.fname[0] == 0) - break; - if (fno.fname[0] == '.') - continue; - fn = fno.fname; - if (fno.fattrib & AM_DIR) { - path[i++] = '/'; - strcpy(&path[i], fn); - res = scan_files(chp, path); - if (res != FR_OK) - break; - path[--i] = 0; - } - else { - chprintf(chp, "%s/%s\r\n", path, fn); - } - } - } - return res; -} - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 2, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(usbp); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1 -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_tree(BaseSequentialStream *chp, int argc, char *argv[]) { - FRESULT err; - uint32_t clusters; - FATFS *fsp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: tree\r\n"); - return; - } - if (!fs_ready) { - chprintf(chp, "File System not mounted\r\n"); - return; - } - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chprintf(chp, "FS: f_getfree() failed\r\n"); - return; - } - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)SDC_FS.csize, - clusters * (uint32_t)SDC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - fbuff[0] = 0; - scan_files(chp, (char *)fbuff); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"tree", cmd_tree}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Main and generic code. */ -/*===========================================================================*/ - -/* - * Card insertion event. - */ -static void InsertHandler(eventid_t id) { - FRESULT err; - - (void)id; - /* - * On insertion SDC initialization and FS mount. - */ - if (sdcConnect(&SDCD1)) - return; - - err = f_mount(0, &SDC_FS); - if (err != FR_OK) { - sdcDisconnect(&SDCD1); - return; - } - fs_ready = TRUE; -} - -/* - * Card removal event. - */ -static void RemoveHandler(eventid_t id) { - - (void)id; - sdcDisconnect(&SDCD1); - fs_ready = FALSE; -} - -/* - * Green LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palTogglePad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(fs_ready ? 125 : 500); - } -} - -/* - * Application entry point. - */ -int main(void) { - static Thread *shelltp = NULL; - static const evhandler_t evhndl[] = { - InsertHandler, - RemoveHandler - }; - struct EventListener el0, el1; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Activates the serial driver 6 and SDC driver 1 using default - * configuration. - */ - sdStart(&SD6, NULL); - sdcStart(&SDCD1, NULL); - - /* - * Activates the card insertion monitor. - */ - tmr_init(&SDCD1); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Creates the LWIP threads (it changes priority internally). - */ - chThdCreateStatic(wa_lwip_thread, LWIP_THREAD_STACK_SIZE, NORMALPRIO + 2, - lwip_thread, NULL); - - /* - * Creates the HTTP thread (it changes priority internally). - */ - chThdCreateStatic(wa_http_server, sizeof(wa_http_server), NORMALPRIO + 1, - http_server, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and listen for events. - */ - chEvtRegister(&inserted_event, &el0, 0); - chEvtRegister(&removed_event, &el1, 1); - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - if (palReadPad(GPIOA, GPIOA_BUTTON_WKUP) != 0) { - } - chEvtDispatch(evhndl, chEvtWaitOneTimeout(ALL_EVENTS, MS2ST(500))); - } -} diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/mcuconf.h b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/mcuconf.h deleted file mode 100644 index c52aaf90ff..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 12 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 TRUE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 TRUE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/readme.txt b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/readme.txt deleted file mode 100644 index f7cc4c9422..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M4 STM32F407. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-E407 board. - -** The Demo ** - -The demo currently just flashes a LED using a thread and serves HTTP requests -at address 192.168.1.20 on port 80. -FatFs integrated using SDIO. -The USB-FS port is used as USB-CDC and a command shell is ready to accepts -commands there. - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.c b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.c deleted file mode 100644 index 2efa7e1c52..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * This file is a modified version of the lwIP web server demo. The original - * author is unknown because the file didn't contain any license information. - */ - -/** - * @file web.c - * @brief HTTP server wrapper thread code. - * @addtogroup WEB_THREAD - * @{ - */ - -#include "ch.h" - -#include "lwip/opt.h" -#include "lwip/arch.h" -#include "lwip/api.h" - -#include "web.h" - -#if LWIP_NETCONN - -static const char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; -static const char http_index_html[] = "Congrats!

Welcome to our lwIP HTTP server!

This is a small test page."; - -static void http_server_serve(struct netconn *conn) { - struct netbuf *inbuf; - char *buf; - u16_t buflen; - err_t err; - - /* Read the data from the port, blocking if nothing yet there. - We assume the request (the part we care about) is in one netbuf */ - err = netconn_recv(conn, &inbuf); - - if (err == ERR_OK) { - netbuf_data(inbuf, (void **)&buf, &buflen); - - /* Is this an HTTP GET command? (only check the first 5 chars, since - there are other formats for GET, and we're keeping it very simple )*/ - if (buflen>=5 && - buf[0]=='G' && - buf[1]=='E' && - buf[2]=='T' && - buf[3]==' ' && - buf[4]=='/' ) { - - /* Send the HTML header - * subtract 1 from the size, since we dont send the \0 in the string - * NETCONN_NOCOPY: our data is const static, so no need to copy it - */ - netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY); - - /* Send our HTML page */ - netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY); - } - } - /* Close the connection (server closes in HTTP) */ - netconn_close(conn); - - /* Delete the buffer (netconn_recv gives us ownership, - so we have to make sure to deallocate the buffer) */ - netbuf_delete(inbuf); -} - -/** - * Stack area for the http thread. - */ -WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -/** - * HTTP server thread. - */ -msg_t http_server(void *p) { - struct netconn *conn, *newconn; - err_t err; - - (void)p; - chRegSetThreadName("http"); - - /* Create a new TCP connection handle */ - conn = netconn_new(NETCONN_TCP); - LWIP_ERROR("http_server: invalid conn", (conn != NULL), return RDY_RESET;); - - /* Bind to port 80 (HTTP) with default IP address */ - netconn_bind(conn, NULL, WEB_THREAD_PORT); - - /* Put the connection into LISTEN state */ - netconn_listen(conn); - - /* Goes to the final priority after initialization.*/ - chThdSetPriority(WEB_THREAD_PRIORITY); - - while(1) { - err = netconn_accept(conn, &newconn); - if (err != ERR_OK) - continue; - http_server_serve(newconn); - netconn_delete(newconn); - } - return RDY_OK; -} - -#endif /* LWIP_NETCONN */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.h b/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.h deleted file mode 100644 index 64c217afa3..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP-FATFS-USB/web/web.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file web.h - * @brief HTTP server wrapper thread macros and structures. - * @addtogroup WEB_THREAD - * @{ - */ - -#ifndef _WEB_H_ -#define _WEB_H_ - -#ifndef WEB_THREAD_STACK_SIZE -#define WEB_THREAD_STACK_SIZE 1024 -#endif - -#ifndef WEB_THREAD_PORT -#define WEB_THREAD_PORT 80 -#endif - -#ifndef WEB_THREAD_PRIORITY -#define WEB_THREAD_PRIORITY (LOWPRIO + 2) -#endif - -extern WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -#ifdef __cplusplus -extern "C" { -#endif - msg_t http_server(void *p); -#ifdef __cplusplus -} -#endif - -#endif /* _WEB_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP/.cproject b/demos/ARMCM4-STM32F407-LWIP/.cproject deleted file mode 100644 index 07ed16b196..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/ARMCM4-STM32F407-LWIP/.project b/demos/ARMCM4-STM32F407-LWIP/.project deleted file mode 100644 index f11f3e6fc1..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/.project +++ /dev/null @@ -1,53 +0,0 @@ - - - ARMCM4-STM32F407-LWIP - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P407 - - - fatfs - 2 - CHIBIOS/ext/fatfs - - - lwip - 2 - CHIBIOS/ext/lwip - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/ARMCM4-STM32F407-LWIP/Makefile b/demos/ARMCM4-STM32F407-LWIP/Makefile deleted file mode 100644 index e8aec516ad..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/Makefile +++ /dev/null @@ -1,224 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P407/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/lwip_bindings/lwip.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(LWSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - web/web.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) $(LWINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/demos/ARMCM4-STM32F407-LWIP/chconf.h b/demos/ARMCM4-STM32F407-LWIP/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP/halconf.h b/demos/ARMCM4-STM32F407-LWIP/halconf.h deleted file mode 100644 index ea8a906e99..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC TRUE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP/lwipopts.h b/demos/ARMCM4-STM32F407-LWIP/lwipopts.h deleted file mode 100644 index 1bfbd1de6f..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/lwipopts.h +++ /dev/null @@ -1,2030 +0,0 @@ -/** - * @file - * - * lwIP Options Configuration - */ - -/* - * Copyright (c) 2001-2004 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIPOPT_H__ -#define __LWIPOPT_H__ - - -/* - ----------------------------------------------- - ---------- Platform specific locking ---------- - ----------------------------------------------- -*/ - -/** - * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain - * critical regions during buffer allocation, deallocation and memory - * allocation and deallocation. - */ -#ifndef SYS_LIGHTWEIGHT_PROT -#define SYS_LIGHTWEIGHT_PROT 0 -#endif - -/** - * NO_SYS==1: Provides VERY minimal functionality. Otherwise, - * use lwIP facilities. - */ -#ifndef NO_SYS -#define NO_SYS 0 -#endif - -/** - * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 - * Mainly for compatibility to old versions. - */ -#ifndef NO_SYS_NO_TIMERS -#define NO_SYS_NO_TIMERS 0 -#endif - -/** - * MEMCPY: override this if you have a faster implementation at hand than the - * one included in your C library - */ -#ifndef MEMCPY -#define MEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/** - * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a - * call to memcpy() if the length is known at compile time and is small. - */ -#ifndef SMEMCPY -#define SMEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/* - ------------------------------------ - ---------- Memory options ---------- - ------------------------------------ -*/ -/** - * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library - * instead of the lwip internal allocator. Can save code size if you - * already use it. - */ -#ifndef MEM_LIBC_MALLOC -#define MEM_LIBC_MALLOC 0 -#endif - -/** -* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. -* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution -* speed and usage from interrupts! -*/ -#ifndef MEMP_MEM_MALLOC -#define MEMP_MEM_MALLOC 0 -#endif - -/** - * MEM_ALIGNMENT: should be set to the alignment of the CPU - * 4 byte alignment -> #define MEM_ALIGNMENT 4 - * 2 byte alignment -> #define MEM_ALIGNMENT 2 - */ -#ifndef MEM_ALIGNMENT -#define MEM_ALIGNMENT 4 -#endif - -/** - * MEM_SIZE: the size of the heap memory. If the application will send - * a lot of data that needs to be copied, this should be set high. - */ -#ifndef MEM_SIZE -#define MEM_SIZE 1600 -#endif - -/** - * MEMP_SEPARATE_POOLS: if defined to 1, each pool is placed in its own array. - * This can be used to individually change the location of each pool. - * Default is one big array for all pools - */ -#ifndef MEMP_SEPARATE_POOLS -#define MEMP_SEPARATE_POOLS 0 -#endif - -/** - * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable - * amount of bytes before and after each memp element in every pool and fills - * it with a prominent default value. - * MEMP_OVERFLOW_CHECK == 0 no checking - * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed - * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time - * memp_malloc() or memp_free() is called (useful but slow!) - */ -#ifndef MEMP_OVERFLOW_CHECK -#define MEMP_OVERFLOW_CHECK 0 -#endif - -/** - * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make - * sure that there are no cycles in the linked lists. - */ -#ifndef MEMP_SANITY_CHECK -#define MEMP_SANITY_CHECK 0 -#endif - -/** - * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set - * of memory pools of various sizes. When mem_malloc is called, an element of - * the smallest pool that can provide the length needed is returned. - * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. - */ -#ifndef MEM_USE_POOLS -#define MEM_USE_POOLS 0 -#endif - -/** - * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next - * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more - * reliable. */ -#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL -#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 -#endif - -/** - * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h - * that defines additional pools beyond the "standard" ones required - * by lwIP. If you set this to 1, you must have lwippools.h in your - * inlude path somewhere. - */ -#ifndef MEMP_USE_CUSTOM_POOLS -#define MEMP_USE_CUSTOM_POOLS 0 -#endif - -/** - * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from - * interrupt context (or another context that doesn't allow waiting for a - * semaphore). - * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, - * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs - * with each loop so that mem_free can run. - * - * ATTENTION: As you can see from the above description, this leads to dis-/ - * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc - * can need longer. - * - * If you don't want that, at least for NO_SYS=0, you can still use the following - * functions to enqueue a deallocation call which then runs in the tcpip_thread - * context: - * - pbuf_free_callback(p); - * - mem_free_callback(m); - */ -#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT -#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 -#endif - -/* - ------------------------------------------------ - ---------- Internal Memory Pool Sizes ---------- - ------------------------------------------------ -*/ -/** - * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). - * If the application sends a lot of data out of ROM (or other static memory), - * this should be set high. - */ -#ifndef MEMP_NUM_PBUF -#define MEMP_NUM_PBUF 16 -#endif - -/** - * MEMP_NUM_RAW_PCB: Number of raw connection PCBs - * (requires the LWIP_RAW option) - */ -#ifndef MEMP_NUM_RAW_PCB -#define MEMP_NUM_RAW_PCB 4 -#endif - -/** - * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One - * per active UDP "connection". - * (requires the LWIP_UDP option) - */ -#ifndef MEMP_NUM_UDP_PCB -#define MEMP_NUM_UDP_PCB 4 -#endif - -/** - * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB -#define MEMP_NUM_TCP_PCB 5 -#endif - -/** - * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB_LISTEN -#define MEMP_NUM_TCP_PCB_LISTEN 8 -#endif - -/** - * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_SEG -#define MEMP_NUM_TCP_SEG 16 -#endif - -/** - * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for - * reassembly (whole packets, not fragments!) - */ -#ifndef MEMP_NUM_REASSDATA -#define MEMP_NUM_REASSDATA 5 -#endif - -/** - * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent - * (fragments, not whole packets!). - * This is only used with IP_FRAG_USES_STATIC_BUF==0 and - * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs - * where the packet is not yet sent when netif->output returns. - */ -#ifndef MEMP_NUM_FRAG_PBUF -#define MEMP_NUM_FRAG_PBUF 15 -#endif - -/** - * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing - * packets (pbufs) that are waiting for an ARP request (to resolve - * their destination address) to finish. - * (requires the ARP_QUEUEING option) - */ -#ifndef MEMP_NUM_ARP_QUEUE -#define MEMP_NUM_ARP_QUEUE 30 -#endif - -/** - * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces - * can be members et the same time (one per netif - allsystems group -, plus one - * per netif membership). - * (requires the LWIP_IGMP option) - */ -#ifndef MEMP_NUM_IGMP_GROUP -#define MEMP_NUM_IGMP_GROUP 8 -#endif - -/** - * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. - * (requires NO_SYS==0) - */ -#ifndef MEMP_NUM_SYS_TIMEOUT -#define MEMP_NUM_SYS_TIMEOUT 3 -#endif - -/** - * MEMP_NUM_NETBUF: the number of struct netbufs. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETBUF -#define MEMP_NUM_NETBUF 2 -#endif - -/** - * MEMP_NUM_NETCONN: the number of struct netconns. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETCONN -#define MEMP_NUM_NETCONN 4 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used - * for callback/timeout API communication. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_API -#define MEMP_NUM_TCPIP_MSG_API 8 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used - * for incoming packets. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_INPKT -#define MEMP_NUM_TCPIP_MSG_INPKT 8 -#endif - -/** - * MEMP_NUM_SNMP_NODE: the number of leafs in the SNMP tree. - */ -#ifndef MEMP_NUM_SNMP_NODE -#define MEMP_NUM_SNMP_NODE 50 -#endif - -/** - * MEMP_NUM_SNMP_ROOTNODE: the number of branches in the SNMP tree. - * Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least! - */ -#ifndef MEMP_NUM_SNMP_ROOTNODE -#define MEMP_NUM_SNMP_ROOTNODE 30 -#endif - -/** - * MEMP_NUM_SNMP_VARBIND: the number of concurrent requests (does not have to - * be changed normally) - 2 of these are used per request (1 for input, - * 1 for output) - */ -#ifndef MEMP_NUM_SNMP_VARBIND -#define MEMP_NUM_SNMP_VARBIND 2 -#endif - -/** - * MEMP_NUM_SNMP_VALUE: the number of OID or values concurrently used - * (does not have to be changed normally) - 3 of these are used per request - * (1 for the value read and 2 for OIDs - input and output) - */ -#ifndef MEMP_NUM_SNMP_VALUE -#define MEMP_NUM_SNMP_VALUE 3 -#endif - -/** - * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls - * (before freeing the corresponding memory using lwip_freeaddrinfo()). - */ -#ifndef MEMP_NUM_NETDB -#define MEMP_NUM_NETDB 1 -#endif - -/** - * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list - * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. - */ -#ifndef MEMP_NUM_LOCALHOSTLIST -#define MEMP_NUM_LOCALHOSTLIST 1 -#endif - -/** - * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE - * interfaces (only used with PPPOE_SUPPORT==1) - */ -#ifndef MEMP_NUM_PPPOE_INTERFACES -#define MEMP_NUM_PPPOE_INTERFACES 1 -#endif - -/** - * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. - */ -#ifndef PBUF_POOL_SIZE -#define PBUF_POOL_SIZE 16 -#endif - -/* - --------------------------------- - ---------- ARP options ---------- - --------------------------------- -*/ -/** - * LWIP_ARP==1: Enable ARP functionality. - */ -#ifndef LWIP_ARP -#define LWIP_ARP 1 -#endif - -/** - * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. - */ -#ifndef ARP_TABLE_SIZE -#define ARP_TABLE_SIZE 10 -#endif - -/** - * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address - * resolution. By default, only the most recent packet is queued per IP address. - * This is sufficient for most protocols and mainly reduces TCP connection - * startup time. Set this to 1 if you know your application sends more than one - * packet in a row to an IP address that is not in the ARP cache. - */ -#ifndef ARP_QUEUEING -#define ARP_QUEUEING 0 -#endif - -/** - * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be - * updated with the source MAC and IP addresses supplied in the packet. - * You may want to disable this if you do not trust LAN peers to have the - * correct addresses, or as a limited approach to attempt to handle - * spoofing. If disabled, lwIP will need to make a new ARP request if - * the peer is not already in the ARP table, adding a little latency. - * The peer *is* in the ARP table if it requested our address before. - * Also notice that this slows down input processing of every IP packet! - */ -#ifndef ETHARP_TRUST_IP_MAC -#define ETHARP_TRUST_IP_MAC 0 -#endif - -/** - * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. - * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. - * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. - * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. - */ -#ifndef ETHARP_SUPPORT_VLAN -#define ETHARP_SUPPORT_VLAN 0 -#endif - -/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP - * might be disabled - */ -#ifndef LWIP_ETHERNET -#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) -#endif - -/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure - * alignment of payload after that header. Since the header is 14 bytes long, - * without this padding e.g. addresses in the IP header will not be aligned - * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. - */ -#ifndef ETH_PAD_SIZE -#define ETH_PAD_SIZE 0 -#endif - -/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table - * entries (using etharp_add_static_entry/etharp_remove_static_entry). - */ -#ifndef ETHARP_SUPPORT_STATIC_ENTRIES -#define ETHARP_SUPPORT_STATIC_ENTRIES 0 -#endif - - -/* - -------------------------------- - ---------- IP options ---------- - -------------------------------- -*/ -/** - * IP_FORWARD==1: Enables the ability to forward IP packets across network - * interfaces. If you are going to run lwIP on a device with only one network - * interface, define this to 0. - */ -#ifndef IP_FORWARD -#define IP_FORWARD 0 -#endif - -/** - * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. - * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. - * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). - */ -#ifndef IP_OPTIONS_ALLOWED -#define IP_OPTIONS_ALLOWED 1 -#endif - -/** - * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that - * this option does not affect outgoing packet sizes, which can be controlled - * via IP_FRAG. - */ -#ifndef IP_REASSEMBLY -#define IP_REASSEMBLY 1 -#endif - -/** - * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note - * that this option does not affect incoming packet sizes, which can be - * controlled via IP_REASSEMBLY. - */ -#ifndef IP_FRAG -#define IP_FRAG 1 -#endif - -/** - * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) - * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived - * in this time, the whole packet is discarded. - */ -#ifndef IP_REASS_MAXAGE -#define IP_REASS_MAXAGE 3 -#endif - -/** - * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. - * Since the received pbufs are enqueued, be sure to configure - * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive - * packets even if the maximum amount of fragments is enqueued for reassembly! - */ -#ifndef IP_REASS_MAX_PBUFS -#define IP_REASS_MAX_PBUFS 10 -#endif - -/** - * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP - * fragmentation. Otherwise pbufs are allocated and reference the original - * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1, - * new PBUF_RAM pbufs are used for fragments). - * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs! - */ -#ifndef IP_FRAG_USES_STATIC_BUF -#define IP_FRAG_USES_STATIC_BUF 0 -#endif - -/** - * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer - * (requires IP_FRAG_USES_STATIC_BUF==1) - */ -#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) -#define IP_FRAG_MAX_MTU 1500 -#endif - -/** - * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. - */ -#ifndef IP_DEFAULT_TTL -#define IP_DEFAULT_TTL 255 -#endif - -/** - * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast - * filter per pcb on udp and raw send operations. To enable broadcast filter - * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. - */ -#ifndef IP_SOF_BROADCAST -#define IP_SOF_BROADCAST 0 -#endif - -/** - * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast - * filter on recv operations. - */ -#ifndef IP_SOF_BROADCAST_RECV -#define IP_SOF_BROADCAST_RECV 0 -#endif - -/* - ---------------------------------- - ---------- ICMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_ICMP==1: Enable ICMP module inside the IP stack. - * Be careful, disable that make your product non-compliant to RFC1122 - */ -#ifndef LWIP_ICMP -#define LWIP_ICMP 1 -#endif - -/** - * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. - */ -#ifndef ICMP_TTL -#define ICMP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) - */ -#ifndef LWIP_BROADCAST_PING -#define LWIP_BROADCAST_PING 0 -#endif - -/** - * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) - */ -#ifndef LWIP_MULTICAST_PING -#define LWIP_MULTICAST_PING 0 -#endif - -/* - --------------------------------- - ---------- RAW options ---------- - --------------------------------- -*/ -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef LWIP_RAW -#define LWIP_RAW 1 -#endif - -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef RAW_TTL -#define RAW_TTL (IP_DEFAULT_TTL) -#endif - -/* - ---------------------------------- - ---------- DHCP options ---------- - ---------------------------------- -*/ -/** - * LWIP_DHCP==1: Enable DHCP module. - */ -#ifndef LWIP_DHCP -#define LWIP_DHCP 0 -#endif - -/** - * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. - */ -#ifndef DHCP_DOES_ARP_CHECK -#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) -#endif - -/* - ------------------------------------ - ---------- AUTOIP options ---------- - ------------------------------------ -*/ -/** - * LWIP_AUTOIP==1: Enable AUTOIP module. - */ -#ifndef LWIP_AUTOIP -#define LWIP_AUTOIP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on - * the same interface at the same time. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP -#define LWIP_DHCP_AUTOIP_COOP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes - * that should be sent before falling back on AUTOIP. This can be set - * as low as 1 to get an AutoIP address very quickly, but you should - * be prepared to handle a changing IP address when DHCP overrides - * AutoIP. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES -#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 -#endif - -/* - ---------------------------------- - ---------- SNMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP - * transport. - */ -#ifndef LWIP_SNMP -#define LWIP_SNMP 0 -#endif - -/** - * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will - * allow. At least one request buffer is required. - * Does not have to be changed unless external MIBs answer request asynchronously - */ -#ifndef SNMP_CONCURRENT_REQUESTS -#define SNMP_CONCURRENT_REQUESTS 1 -#endif - -/** - * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap - * destination is required - */ -#ifndef SNMP_TRAP_DESTINATIONS -#define SNMP_TRAP_DESTINATIONS 1 -#endif - -/** - * SNMP_PRIVATE_MIB: - * When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. - */ -#ifndef SNMP_PRIVATE_MIB -#define SNMP_PRIVATE_MIB 0 -#endif - -/** - * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not - * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). - * Unsafe requests are disabled by default! - */ -#ifndef SNMP_SAFE_REQUESTS -#define SNMP_SAFE_REQUESTS 1 -#endif - -/** - * The maximum length of strings used. This affects the size of - * MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_OCTET_STRING_LEN -#define SNMP_MAX_OCTET_STRING_LEN 127 -#endif - -/** - * The maximum depth of the SNMP tree. - * With private MIBs enabled, this depends on your MIB! - * This affects the size of MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_TREE_DEPTH -#define SNMP_MAX_TREE_DEPTH 15 -#endif - -/** - * The size of the MEMP_SNMP_VALUE elements, normally calculated from - * SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH. - */ -#ifndef SNMP_MAX_VALUE_SIZE -#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH)) -#endif - -/* - ---------------------------------- - ---------- IGMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_IGMP==1: Turn on IGMP module. - */ -#ifndef LWIP_IGMP -#define LWIP_IGMP 0 -#endif - -/* - ---------------------------------- - ---------- DNS options ----------- - ---------------------------------- -*/ -/** - * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS - * transport. - */ -#ifndef LWIP_DNS -#define LWIP_DNS 0 -#endif - -/** DNS maximum number of entries to maintain locally. */ -#ifndef DNS_TABLE_SIZE -#define DNS_TABLE_SIZE 4 -#endif - -/** DNS maximum host name length supported in the name table. */ -#ifndef DNS_MAX_NAME_LENGTH -#define DNS_MAX_NAME_LENGTH 256 -#endif - -/** The maximum of DNS servers */ -#ifndef DNS_MAX_SERVERS -#define DNS_MAX_SERVERS 2 -#endif - -/** DNS do a name checking between the query and the response. */ -#ifndef DNS_DOES_NAME_CHECK -#define DNS_DOES_NAME_CHECK 1 -#endif - -/** DNS message max. size. Default value is RFC compliant. */ -#ifndef DNS_MSG_SIZE -#define DNS_MSG_SIZE 512 -#endif - -/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, - * you have to define - * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} - * (an array of structs name/address, where address is an u32_t in network - * byte order). - * - * Instead, you can also use an external function: - * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) - * that returns the IP address or INADDR_NONE if not found. - */ -#ifndef DNS_LOCAL_HOSTLIST -#define DNS_LOCAL_HOSTLIST 0 -#endif /* DNS_LOCAL_HOSTLIST */ - -/** If this is turned on, the local host-list can be dynamically changed - * at runtime. */ -#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC -#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 -#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ - -/* - --------------------------------- - ---------- UDP options ---------- - --------------------------------- -*/ -/** - * LWIP_UDP==1: Turn on UDP. - */ -#ifndef LWIP_UDP -#define LWIP_UDP 1 -#endif - -/** - * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) - */ -#ifndef LWIP_UDPLITE -#define LWIP_UDPLITE 0 -#endif - -/** - * UDP_TTL: Default Time-To-Live value. - */ -#ifndef UDP_TTL -#define UDP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. - */ -#ifndef LWIP_NETBUF_RECVINFO -#define LWIP_NETBUF_RECVINFO 0 -#endif - -/* - --------------------------------- - ---------- TCP options ---------- - --------------------------------- -*/ -/** - * LWIP_TCP==1: Turn on TCP. - */ -#ifndef LWIP_TCP -#define LWIP_TCP 1 -#endif - -/** - * TCP_TTL: Default Time-To-Live value. - */ -#ifndef TCP_TTL -#define TCP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * TCP_WND: The size of a TCP window. This must be at least - * (2 * TCP_MSS) for things to work well - */ -#ifndef TCP_WND -#define TCP_WND (4 * TCP_MSS) -#endif - -/** - * TCP_MAXRTX: Maximum number of retransmissions of data segments. - */ -#ifndef TCP_MAXRTX -#define TCP_MAXRTX 12 -#endif - -/** - * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. - */ -#ifndef TCP_SYNMAXRTX -#define TCP_SYNMAXRTX 6 -#endif - -/** - * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. - * Define to 0 if your device is low on memory. - */ -#ifndef TCP_QUEUE_OOSEQ -#define TCP_QUEUE_OOSEQ (LWIP_TCP) -#endif - -/** - * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, - * you might want to increase this.) - * For the receive side, this MSS is advertised to the remote side - * when opening a connection. For the transmit size, this MSS sets - * an upper limit on the MSS advertised by the remote host. - */ -#ifndef TCP_MSS -#define TCP_MSS 536 -#endif - -/** - * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really - * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which - * reflects the available reassembly buffer size at the remote host) and the - * largest size permitted by the IP layer" (RFC 1122) - * Setting this to 1 enables code that checks TCP_MSS against the MTU of the - * netif used for a connection and limits the MSS if it would be too big otherwise. - */ -#ifndef TCP_CALCULATE_EFF_SEND_MSS -#define TCP_CALCULATE_EFF_SEND_MSS 1 -#endif - - -/** - * TCP_SND_BUF: TCP sender buffer space (bytes). - */ -#ifndef TCP_SND_BUF -#define TCP_SND_BUF 256 -#endif - -/** - * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least - * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. - */ -#ifndef TCP_SND_QUEUELEN -#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) -#endif - -/** - * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than - * TCP_SND_BUF. It is the amount of space which must be available in the - * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). - */ -#ifndef TCP_SNDLOWAT -#define TCP_SNDLOWAT ((TCP_SND_BUF)/2) -#endif - -/** - * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be grater - * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below - * this number, select returns writable (combined with TCP_SNDLOWAT). - */ -#ifndef TCP_SNDQUEUELOWAT -#define TCP_SNDQUEUELOWAT ((TCP_SND_QUEUELEN)/2) -#endif - -/** - * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. - */ -#ifndef TCP_LISTEN_BACKLOG -#define TCP_LISTEN_BACKLOG 0 -#endif - -/** - * The maximum allowed backlog for TCP listen netconns. - * This backlog is used unless another is explicitly specified. - * 0xff is the maximum (u8_t). - */ -#ifndef TCP_DEFAULT_LISTEN_BACKLOG -#define TCP_DEFAULT_LISTEN_BACKLOG 0xff -#endif - -/** - * TCP_OVERSIZE: The maximum number of bytes that tcp_write may - * allocate ahead of time in an attempt to create shorter pbuf chains - * for transmission. The meaningful range is 0 to TCP_MSS. Some - * suggested values are: - * - * 0: Disable oversized allocation. Each tcp_write() allocates a new - pbuf (old behaviour). - * 1: Allocate size-aligned pbufs with minimal excess. Use this if your - * scatter-gather DMA requires aligned fragments. - * 128: Limit the pbuf/memory overhead to 20%. - * TCP_MSS: Try to create unfragmented TCP packets. - * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. - */ -#ifndef TCP_OVERSIZE -#define TCP_OVERSIZE TCP_MSS -#endif - -/** - * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. - */ -#ifndef LWIP_TCP_TIMESTAMPS -#define LWIP_TCP_TIMESTAMPS 0 -#endif - -/** - * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an - * explicit window update - */ -#ifndef TCP_WND_UPDATE_THRESHOLD -#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) -#endif - -/** - * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. - * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all - * events (accept, sent, etc) that happen in the system. - * LWIP_CALLBACK_API==1: The PCB callback function is called directly - * for the event. - */ -//#define LWIP_EVENT_API - -/* - ---------------------------------- - ---------- Pbuf options ---------- - ---------------------------------- -*/ -/** - * PBUF_LINK_HLEN: the number of bytes that should be allocated for a - * link level header. The default is 14, the standard value for - * Ethernet. - */ -#ifndef PBUF_LINK_HLEN -#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) -#endif - -/** - * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is - * designed to accomodate single full size TCP frame in one pbuf, including - * TCP_MSS, IP header, and link header. - */ -#ifndef PBUF_POOL_BUFSIZE -#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) -#endif - -/* - ------------------------------------------------ - ---------- Network Interfaces options ---------- - ------------------------------------------------ -*/ -/** - * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname - * field. - */ -#ifndef LWIP_NETIF_HOSTNAME -#define LWIP_NETIF_HOSTNAME 0 -#endif - -/** - * LWIP_NETIF_API==1: Support netif api (in netifapi.c) - */ -#ifndef LWIP_NETIF_API -#define LWIP_NETIF_API 0 -#endif - -/** - * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface - * changes its up/down status (i.e., due to DHCP IP acquistion) - */ -#ifndef LWIP_NETIF_STATUS_CALLBACK -#define LWIP_NETIF_STATUS_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface - * whenever the link changes (i.e., link down) - */ -#ifndef LWIP_NETIF_LINK_CALLBACK -#define LWIP_NETIF_LINK_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table - * indices) in struct netif. TCP and UDP can make use of this to prevent - * scanning the ARP table for every sent packet. While this is faster for big - * ARP tables or many concurrent connections, it might be counterproductive - * if you have a tiny ARP table or if there never are concurrent connections. - */ -#ifndef LWIP_NETIF_HWADDRHINT -#define LWIP_NETIF_HWADDRHINT 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP - * address equal to the netif IP address, looping them back up the stack. - */ -#ifndef LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 0 -#endif - -/** - * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback - * sending for each netif (0 = disabled) - */ -#ifndef LWIP_LOOPBACK_MAX_PBUFS -#define LWIP_LOOPBACK_MAX_PBUFS 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in - * the system, as netifs must change how they behave depending on this setting - * for the LWIP_NETIF_LOOPBACK option to work. - * Setting this is needed to avoid reentering non-reentrant functions like - * tcp_input(). - * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a - * multithreaded environment like tcpip.c. In this case, netif->input() - * is called directly. - * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. - * The packets are put on a list and netif_poll() must be called in - * the main application loop. - */ -#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING -#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) -#endif - -/** - * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data - * to be sent into one single pbuf. This is for compatibility with DMA-enabled - * MACs that do not support scatter-gather. - * Beware that this might involve CPU-memcpy before transmitting that would not - * be needed without this flag! Use this only if you need to! - * - * @todo: TCP and IP-frag do not work with this, yet: - */ -#ifndef LWIP_NETIF_TX_SINGLE_PBUF -#define LWIP_NETIF_TX_SINGLE_PBUF 0 -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - -/* - ------------------------------------ - ---------- LOOPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c - */ -#ifndef LWIP_HAVE_LOOPIF -#define LWIP_HAVE_LOOPIF 0 -#endif - -/* - ------------------------------------ - ---------- SLIPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c - */ -#ifndef LWIP_HAVE_SLIPIF -#define LWIP_HAVE_SLIPIF 0 -#endif - -/* - ------------------------------------ - ---------- Thread options ---------- - ------------------------------------ -*/ -/** - * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. - */ -#ifndef TCPIP_THREAD_NAME -#define TCPIP_THREAD_NAME "tcpip_thread" -#endif - -/** - * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_STACKSIZE -#define TCPIP_THREAD_STACKSIZE 1024 -#endif - -/** - * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_PRIO -#define TCPIP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when tcpip_init is called. - */ -#ifndef TCPIP_MBOX_SIZE -#define TCPIP_MBOX_SIZE 4 -#endif - -/** - * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. - */ -#ifndef SLIPIF_THREAD_NAME -#define SLIPIF_THREAD_NAME "slipif_loop" -#endif - -/** - * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_STACKSIZE -#define SLIPIF_THREAD_STACKSIZE 1024 -#endif - -/** - * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_PRIO -#define SLIPIF_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * PPP_THREAD_NAME: The name assigned to the pppInputThread. - */ -#ifndef PPP_THREAD_NAME -#define PPP_THREAD_NAME "pppInputThread" -#endif - -/** - * PPP_THREAD_STACKSIZE: The stack size used by the pppInputThread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_STACKSIZE -#define PPP_THREAD_STACKSIZE 1024 -#endif - -/** - * PPP_THREAD_PRIO: The priority assigned to the pppInputThread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_PRIO -#define PPP_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. - */ -#ifndef DEFAULT_THREAD_NAME -#define DEFAULT_THREAD_NAME "lwIP" -#endif - -/** - * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_STACKSIZE -#define DEFAULT_THREAD_STACKSIZE 1024 -#endif - -/** - * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_PRIO -#define DEFAULT_THREAD_PRIO (LOWPRIO + 1) -#endif - -/** - * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_RAW_RECVMBOX_SIZE -#define DEFAULT_RAW_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_UDP_RECVMBOX_SIZE -#define DEFAULT_UDP_RECVMBOX_SIZE 4 -#endif - -/** - * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_TCP_RECVMBOX_SIZE -#define DEFAULT_TCP_RECVMBOX_SIZE 40 -#endif - -/** - * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when the acceptmbox is created. - */ -#ifndef DEFAULT_ACCEPTMBOX_SIZE -#define DEFAULT_ACCEPTMBOX_SIZE 4 -#endif - -/* - ---------------------------------------------- - ---------- Sequential layer options ---------- - ---------------------------------------------- -*/ -/** - * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING -#define LWIP_TCPIP_CORE_LOCKING 0 -#endif - -/** - * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT -#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 -#endif - -/** - * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) - */ -#ifndef LWIP_NETCONN -#define LWIP_NETCONN 1 -#endif - -/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout tod create - * timers running in tcpip_thread from another thread. - */ -#ifndef LWIP_TCPIP_TIMEOUT -#define LWIP_TCPIP_TIMEOUT 1 -#endif - -/* - ------------------------------------ - ---------- Socket options ---------- - ------------------------------------ -*/ -/** - * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) - */ -#ifndef LWIP_SOCKET -#define LWIP_SOCKET 1 -#endif - -/** - * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. - * (only used if you use sockets.c) - */ -#ifndef LWIP_COMPAT_SOCKETS -#define LWIP_COMPAT_SOCKETS 1 -#endif - -/** - * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. - * Disable this option if you use a POSIX operating system that uses the same - * names (read, write & close). (only used if you use sockets.c) - */ -#ifndef LWIP_POSIX_SOCKETS_IO_NAMES -#define LWIP_POSIX_SOCKETS_IO_NAMES 1 -#endif - -/** - * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT - * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set - * in seconds. (does not require sockets.c, and will affect tcp.c) - */ -#ifndef LWIP_TCP_KEEPALIVE -#define LWIP_TCP_KEEPALIVE 0 -#endif - -/** - * LWIP_SO_RCVTIMEO==1: Enable SO_RCVTIMEO processing. - */ -#ifndef LWIP_SO_RCVTIMEO -#define LWIP_SO_RCVTIMEO 0 -#endif - -/** - * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. - */ -#ifndef LWIP_SO_RCVBUF -#define LWIP_SO_RCVBUF 0 -#endif - -/** - * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. - */ -#ifndef RECV_BUFSIZE_DEFAULT -#define RECV_BUFSIZE_DEFAULT INT_MAX -#endif - -/** - * SO_REUSE==1: Enable SO_REUSEADDR option. - */ -#ifndef SO_REUSE -#define SO_REUSE 0 -#endif - -/** - * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets - * to all local matches if SO_REUSEADDR is turned on. - * WARNING: Adds a memcpy for every packet if passing to more than one pcb! - */ -#ifndef SO_REUSE_RXTOALL -#define SO_REUSE_RXTOALL 0 -#endif - -/* - ---------------------------------------- - ---------- Statistics options ---------- - ---------------------------------------- -*/ -/** - * LWIP_STATS==1: Enable statistics collection in lwip_stats. - */ -#ifndef LWIP_STATS -#define LWIP_STATS 1 -#endif - -#if LWIP_STATS - -/** - * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. - */ -#ifndef LWIP_STATS_DISPLAY -#define LWIP_STATS_DISPLAY 0 -#endif - -/** - * LINK_STATS==1: Enable link stats. - */ -#ifndef LINK_STATS -#define LINK_STATS 1 -#endif - -/** - * ETHARP_STATS==1: Enable etharp stats. - */ -#ifndef ETHARP_STATS -#define ETHARP_STATS (LWIP_ARP) -#endif - -/** - * IP_STATS==1: Enable IP stats. - */ -#ifndef IP_STATS -#define IP_STATS 1 -#endif - -/** - * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is - * on if using either frag or reass. - */ -#ifndef IPFRAG_STATS -#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) -#endif - -/** - * ICMP_STATS==1: Enable ICMP stats. - */ -#ifndef ICMP_STATS -#define ICMP_STATS 1 -#endif - -/** - * IGMP_STATS==1: Enable IGMP stats. - */ -#ifndef IGMP_STATS -#define IGMP_STATS (LWIP_IGMP) -#endif - -/** - * UDP_STATS==1: Enable UDP stats. Default is on if - * UDP enabled, otherwise off. - */ -#ifndef UDP_STATS -#define UDP_STATS (LWIP_UDP) -#endif - -/** - * TCP_STATS==1: Enable TCP stats. Default is on if TCP - * enabled, otherwise off. - */ -#ifndef TCP_STATS -#define TCP_STATS (LWIP_TCP) -#endif - -/** - * MEM_STATS==1: Enable mem.c stats. - */ -#ifndef MEM_STATS -#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) -#endif - -/** - * MEMP_STATS==1: Enable memp.c pool stats. - */ -#ifndef MEMP_STATS -#define MEMP_STATS (MEMP_MEM_MALLOC == 0) -#endif - -/** - * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). - */ -#ifndef SYS_STATS -#define SYS_STATS (NO_SYS == 0) -#endif - -#else - -#define LINK_STATS 0 -#define IP_STATS 0 -#define IPFRAG_STATS 0 -#define ICMP_STATS 0 -#define IGMP_STATS 0 -#define UDP_STATS 0 -#define TCP_STATS 0 -#define MEM_STATS 0 -#define MEMP_STATS 0 -#define SYS_STATS 0 -#define LWIP_STATS_DISPLAY 0 - -#endif /* LWIP_STATS */ - -/* - --------------------------------- - ---------- PPP options ---------- - --------------------------------- -*/ -/** - * PPP_SUPPORT==1: Enable PPP. - */ -#ifndef PPP_SUPPORT -#define PPP_SUPPORT 0 -#endif - -/** - * PPPOE_SUPPORT==1: Enable PPP Over Ethernet - */ -#ifndef PPPOE_SUPPORT -#define PPPOE_SUPPORT 0 -#endif - -/** - * PPPOS_SUPPORT==1: Enable PPP Over Serial - */ -#ifndef PPPOS_SUPPORT -#define PPPOS_SUPPORT PPP_SUPPORT -#endif - -#if PPP_SUPPORT - -/** - * NUM_PPP: Max PPP sessions. - */ -#ifndef NUM_PPP -#define NUM_PPP 1 -#endif - -/** - * PAP_SUPPORT==1: Support PAP. - */ -#ifndef PAP_SUPPORT -#define PAP_SUPPORT 0 -#endif - -/** - * CHAP_SUPPORT==1: Support CHAP. - */ -#ifndef CHAP_SUPPORT -#define CHAP_SUPPORT 0 -#endif - -/** - * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef MSCHAP_SUPPORT -#define MSCHAP_SUPPORT 0 -#endif - -/** - * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CBCP_SUPPORT -#define CBCP_SUPPORT 0 -#endif - -/** - * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CCP_SUPPORT -#define CCP_SUPPORT 0 -#endif - -/** - * VJ_SUPPORT==1: Support VJ header compression. - */ -#ifndef VJ_SUPPORT -#define VJ_SUPPORT 0 -#endif - -/** - * MD5_SUPPORT==1: Support MD5 (see also CHAP). - */ -#ifndef MD5_SUPPORT -#define MD5_SUPPORT 0 -#endif - -/* - * Timeouts - */ -#ifndef FSM_DEFTIMEOUT -#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef FSM_DEFMAXTERMREQS -#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXCONFREQS -#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXNAKLOOPS -#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ -#endif - -#ifndef UPAP_DEFTIMEOUT -#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ -#endif - -#ifndef UPAP_DEFREQTIME -#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ -#endif - -#ifndef CHAP_DEFTIMEOUT -#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef CHAP_DEFTRANSMITS -#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ -#endif - -/* Interval in seconds between keepalive echo requests, 0 to disable. */ -#ifndef LCP_ECHOINTERVAL -#define LCP_ECHOINTERVAL 0 -#endif - -/* Number of unanswered echo requests before failure. */ -#ifndef LCP_MAXECHOFAILS -#define LCP_MAXECHOFAILS 3 -#endif - -/* Max Xmit idle time (in jiffies) before resend flag char. */ -#ifndef PPP_MAXIDLEFLAG -#define PPP_MAXIDLEFLAG 100 -#endif - -/* - * Packet sizes - * - * Note - lcp shouldn't be allowed to negotiate stuff outside these - * limits. See lcp.h in the pppd directory. - * (XXX - these constants should simply be shared by lcp.c instead - * of living in lcp.h) - */ -#define PPP_MTU 1500 /* Default MTU (size of Info field) */ -#ifndef PPP_MAXMTU -/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ -#define PPP_MAXMTU 1500 /* Largest MTU we allow */ -#endif -#define PPP_MINMTU 64 -#define PPP_MRU 1500 /* default MRU = max length of info field */ -#define PPP_MAXMRU 1500 /* Largest MRU we allow */ -#ifndef PPP_DEFMRU -#define PPP_DEFMRU 296 /* Try for this */ -#endif -#define PPP_MINMRU 128 /* No MRUs below this */ - -#ifndef MAXNAMELEN -#define MAXNAMELEN 256 /* max length of hostname or name for auth */ -#endif -#ifndef MAXSECRETLEN -#define MAXSECRETLEN 256 /* max length of password or secret */ -#endif - -#endif /* PPP_SUPPORT */ - -/* - -------------------------------------- - ---------- Checksum options ---------- - -------------------------------------- -*/ -/** - * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. - */ -#ifndef CHECKSUM_GEN_IP -#define CHECKSUM_GEN_IP 1 -#endif - -/** - * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. - */ -#ifndef CHECKSUM_GEN_UDP -#define CHECKSUM_GEN_UDP 1 -#endif - -/** - * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. - */ -#ifndef CHECKSUM_GEN_TCP -#define CHECKSUM_GEN_TCP 1 -#endif - -/** - * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. - */ -#ifndef CHECKSUM_CHECK_IP -#define CHECKSUM_CHECK_IP 1 -#endif - -/** - * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. - */ -#ifndef CHECKSUM_CHECK_UDP -#define CHECKSUM_CHECK_UDP 1 -#endif - -/** - * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. - */ -#ifndef CHECKSUM_CHECK_TCP -#define CHECKSUM_CHECK_TCP 1 -#endif - -/** - * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from - * application buffers to pbufs. - */ -#ifndef LWIP_CHECKSUM_ON_COPY -#define LWIP_CHECKSUM_ON_COPY 0 -#endif - -/* - --------------------------------------- - ---------- Debugging options ---------- - --------------------------------------- -*/ -/** - * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is - * compared against this value. If it is smaller, then debugging - * messages are written. - */ -#ifndef LWIP_DBG_MIN_LEVEL -#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF -#endif - -/** - * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable - * debug messages of certain types. - */ -#ifndef LWIP_DBG_TYPES_ON -#define LWIP_DBG_TYPES_ON LWIP_DBG_ON -#endif - -/** - * ETHARP_DEBUG: Enable debugging in etharp.c. - */ -#ifndef ETHARP_DEBUG -#define ETHARP_DEBUG LWIP_DBG_OFF -#endif - -/** - * NETIF_DEBUG: Enable debugging in netif.c. - */ -#ifndef NETIF_DEBUG -#define NETIF_DEBUG LWIP_DBG_OFF -#endif - -/** - * PBUF_DEBUG: Enable debugging in pbuf.c. - */ -#ifndef PBUF_DEBUG -#define PBUF_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_LIB_DEBUG: Enable debugging in api_lib.c. - */ -#ifndef API_LIB_DEBUG -#define API_LIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_MSG_DEBUG: Enable debugging in api_msg.c. - */ -#ifndef API_MSG_DEBUG -#define API_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SOCKETS_DEBUG: Enable debugging in sockets.c. - */ -#ifndef SOCKETS_DEBUG -#define SOCKETS_DEBUG LWIP_DBG_OFF -#endif - -/** - * ICMP_DEBUG: Enable debugging in icmp.c. - */ -#ifndef ICMP_DEBUG -#define ICMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IGMP_DEBUG: Enable debugging in igmp.c. - */ -#ifndef IGMP_DEBUG -#define IGMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * INET_DEBUG: Enable debugging in inet.c. - */ -#ifndef INET_DEBUG -#define INET_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_DEBUG: Enable debugging for IP. - */ -#ifndef IP_DEBUG -#define IP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. - */ -#ifndef IP_REASS_DEBUG -#define IP_REASS_DEBUG LWIP_DBG_OFF -#endif - -/** - * RAW_DEBUG: Enable debugging in raw.c. - */ -#ifndef RAW_DEBUG -#define RAW_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEM_DEBUG: Enable debugging in mem.c. - */ -#ifndef MEM_DEBUG -#define MEM_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEMP_DEBUG: Enable debugging in memp.c. - */ -#ifndef MEMP_DEBUG -#define MEMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SYS_DEBUG: Enable debugging in sys.c. - */ -#ifndef SYS_DEBUG -#define SYS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TIMERS_DEBUG: Enable debugging in timers.c. - */ -#ifndef TIMERS_DEBUG -#define TIMERS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_DEBUG: Enable debugging for TCP. - */ -#ifndef TCP_DEBUG -#define TCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. - */ -#ifndef TCP_INPUT_DEBUG -#define TCP_INPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. - */ -#ifndef TCP_FR_DEBUG -#define TCP_FR_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit - * timeout. - */ -#ifndef TCP_RTO_DEBUG -#define TCP_RTO_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. - */ -#ifndef TCP_CWND_DEBUG -#define TCP_CWND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. - */ -#ifndef TCP_WND_DEBUG -#define TCP_WND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. - */ -#ifndef TCP_OUTPUT_DEBUG -#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. - */ -#ifndef TCP_RST_DEBUG -#define TCP_RST_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. - */ -#ifndef TCP_QLEN_DEBUG -#define TCP_QLEN_DEBUG LWIP_DBG_OFF -#endif - -/** - * UDP_DEBUG: Enable debugging in UDP. - */ -#ifndef UDP_DEBUG -#define UDP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCPIP_DEBUG: Enable debugging in tcpip.c. - */ -#ifndef TCPIP_DEBUG -#define TCPIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * PPP_DEBUG: Enable debugging for PPP. - */ -#ifndef PPP_DEBUG -#define PPP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SLIP_DEBUG: Enable debugging in slipif.c. - */ -#ifndef SLIP_DEBUG -#define SLIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * DHCP_DEBUG: Enable debugging in dhcp.c. - */ -#ifndef DHCP_DEBUG -#define DHCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * AUTOIP_DEBUG: Enable debugging in autoip.c. - */ -#ifndef AUTOIP_DEBUG -#define AUTOIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. - */ -#ifndef SNMP_MSG_DEBUG -#define SNMP_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. - */ -#ifndef SNMP_MIB_DEBUG -#define SNMP_MIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * DNS_DEBUG: Enable debugging for DNS. - */ -#ifndef DNS_DEBUG -#define DNS_DEBUG LWIP_DBG_OFF -#endif - -#endif /* __LWIPOPT_H__ */ diff --git a/demos/ARMCM4-STM32F407-LWIP/main.c b/demos/ARMCM4-STM32F407-LWIP/main.c deleted file mode 100644 index 4ef577da87..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/main.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "lwipthread.h" - -#include "web/web.h" - -/* - * Green LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOF, GPIOF_STAT1); - chThdSleepMilliseconds(500); - palSetPad(GPIOF, GPIOF_STAT1); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 6 using the driver default configuration. - */ - sdStart(&SD6, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Creates the LWIP threads (it changes priority internally). - */ - chThdCreateStatic(wa_lwip_thread, LWIP_THREAD_STACK_SIZE, NORMALPRIO + 1, - lwip_thread, NULL); - - /* - * Creates the HTTP thread (it changes priority internally). - */ - chThdCreateStatic(wa_http_server, sizeof(wa_http_server), NORMALPRIO + 1, - http_server, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (palReadPad(GPIOC, GPIOC_SWITCH_TAMPER) == 0) - TestThread(&SD6); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/ARMCM4-STM32F407-LWIP/mcuconf.h b/demos/ARMCM4-STM32F407-LWIP/mcuconf.h deleted file mode 100644 index 19a11d4415..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 25 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 TRUE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/demos/ARMCM4-STM32F407-LWIP/readme.txt b/demos/ARMCM4-STM32F407-LWIP/readme.txt deleted file mode 100644 index 57a2526ca7..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M4 STM32F407. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P407 board. - -** The Demo ** - -The demo currently just flashes a LED using a thread and serves HTTP requests -at address 192.168.1.20 on port 80. -The button activates che ChibiOS/RT test suite, output on SD6. - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/demos/ARMCM4-STM32F407-LWIP/web/web.c b/demos/ARMCM4-STM32F407-LWIP/web/web.c deleted file mode 100644 index 3a4a9b4f37..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/web/web.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * This file is a modified version of the lwIP web server demo. The original - * author is unknown because the file didn't contain any license information. - */ - -/** - * @file web.c - * @brief HTTP server wrapper thread code. - * @addtogroup WEB_THREAD - * @{ - */ - -#include "ch.h" - -#include "lwip/opt.h" -#include "lwip/arch.h" -#include "lwip/api.h" - -#include "web.h" - -#if LWIP_NETCONN - -static const char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; -static const char http_index_html[] = "Congrats!

Welcome to our lwIP HTTP server!

This is a small test page."; - -static void http_server_serve(struct netconn *conn) { - struct netbuf *inbuf; - char *buf; - u16_t buflen; - err_t err; - - /* Read the data from the port, blocking if nothing yet there. - We assume the request (the part we care about) is in one netbuf */ - err = netconn_recv(conn, &inbuf); - - if (err == ERR_OK) { - netbuf_data(inbuf, (void **)&buf, &buflen); - - /* Is this an HTTP GET command? (only check the first 5 chars, since - there are other formats for GET, and we're keeping it very simple )*/ - if (buflen>=5 && - buf[0]=='G' && - buf[1]=='E' && - buf[2]=='T' && - buf[3]==' ' && - buf[4]=='/' ) { - - /* Send the HTML header - * subtract 1 from the size, since we dont send the \0 in the string - * NETCONN_NOCOPY: our data is const static, so no need to copy it - */ - netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY); - - /* Send our HTML page */ - netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY); - } - } - /* Close the connection (server closes in HTTP) */ - netconn_close(conn); - - /* Delete the buffer (netconn_recv gives us ownership, - so we have to make sure to deallocate the buffer) */ - netbuf_delete(inbuf); -} - -/** - * Stack area for the http thread. - */ -WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -/** - * HTTP server thread. - */ -msg_t http_server(void *p) { - struct netconn *conn, *newconn; - err_t err; - - (void)p; - - /* Create a new TCP connection handle */ - conn = netconn_new(NETCONN_TCP); - LWIP_ERROR("http_server: invalid conn", (conn != NULL), return RDY_RESET;); - - /* Bind to port 80 (HTTP) with default IP address */ - netconn_bind(conn, NULL, WEB_THREAD_PORT); - - /* Put the connection into LISTEN state */ - netconn_listen(conn); - - /* Goes to the final priority after initialization.*/ - chThdSetPriority(WEB_THREAD_PRIORITY); - - while(1) { - err = netconn_accept(conn, &newconn); - if (err != ERR_OK) - continue; - http_server_serve(newconn); - netconn_delete(newconn); - } - return RDY_OK; -} - -#endif /* LWIP_NETCONN */ - -/** @} */ diff --git a/demos/ARMCM4-STM32F407-LWIP/web/web.h b/demos/ARMCM4-STM32F407-LWIP/web/web.h deleted file mode 100644 index 64c217afa3..0000000000 --- a/demos/ARMCM4-STM32F407-LWIP/web/web.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file web.h - * @brief HTTP server wrapper thread macros and structures. - * @addtogroup WEB_THREAD - * @{ - */ - -#ifndef _WEB_H_ -#define _WEB_H_ - -#ifndef WEB_THREAD_STACK_SIZE -#define WEB_THREAD_STACK_SIZE 1024 -#endif - -#ifndef WEB_THREAD_PORT -#define WEB_THREAD_PORT 80 -#endif - -#ifndef WEB_THREAD_PRIORITY -#define WEB_THREAD_PRIORITY (LOWPRIO + 2) -#endif - -extern WORKING_AREA(wa_http_server, WEB_THREAD_STACK_SIZE); - -#ifdef __cplusplus -extern "C" { -#endif - msg_t http_server(void *p); -#ifdef __cplusplus -} -#endif - -#endif /* _WEB_H_ */ - -/** @} */ diff --git a/demos/AVR-AT90CANx-GCC/Makefile b/demos/AVR-AT90CANx-GCC/Makefile deleted file mode 100644 index fa9309e2f4..0000000000 --- a/demos/AVR-AT90CANx-GCC/Makefile +++ /dev/null @@ -1,652 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - - -# MCU name -MCU = at90can128 - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# Typical values are: -# F_CPU = 1000000 -# F_CPU = 1843200 -# F_CPU = 2000000 -# F_CPU = 3686400 -# F_CPU = 4000000 -# F_CPU = 7372800 -# F_CPU = 8000000 -# F_CPU = 11059200 -# F_CPU = 14745600 -# F_CPU = 16000000 -# F_CPU = 18432000 -# F_CPU = 20000000 -F_CPU = 16000000 - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = ch - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_AVR_CAN/board.mk -include $(CHIBIOS)/os/hal/platforms/AVR/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/AVR/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - main.c - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be separated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -#CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be separated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware: alf avr910 avrisp bascom bsd -# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 -# -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = stk500 - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = com1 # programmer connected to serial device - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex bin eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -bin: $(TARGET).bin -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -%.bin: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O binary -R .eeprom $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).bin - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex bin eep lss sym coff extcoff \ -clean clean_list program debug gdb-config - - - - - - diff --git a/demos/AVR-AT90CANx-GCC/chconf.h b/demos/AVR-AT90CANx-GCC/chconf.h deleted file mode 100644 index ec84e58afb..0000000000 --- a/demos/AVR-AT90CANx-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/AVR-AT90CANx-GCC/halconf.h b/demos/AVR-AT90CANx-GCC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/AVR-AT90CANx-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/AVR-AT90CANx-GCC/main.c b/demos/AVR-AT90CANx-GCC/main.c deleted file mode 100644 index 7361d7017d..0000000000 --- a/demos/AVR-AT90CANx-GCC/main.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -static WORKING_AREA(waThread1, 32); -static msg_t Thread1(void *arg) { - - while (TRUE) { - palTogglePad(IOPORT5, PORTE_LED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Starts the LED blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - while(TRUE) { - if (!palReadPad(IOPORT5, PORTE_BUTTON)) - TestThread(&SD2); - chThdSleepMilliseconds(500); - } - - return 0; -} diff --git a/demos/AVR-AT90CANx-GCC/mcuconf.h b/demos/AVR-AT90CANx-GCC/mcuconf.h deleted file mode 100644 index 51cb93729d..0000000000 --- a/demos/AVR-AT90CANx-GCC/mcuconf.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AVR drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_AVR_USART0 FALSE -#define USE_AVR_USART1 TRUE - -/* - * SPI driver system settings. - */ diff --git a/demos/AVR-AT90CANx-GCC/readme.txt b/demos/AVR-AT90CANx-GCC/readme.txt deleted file mode 100644 index 3102bcf15b..0000000000 --- a/demos/AVR-AT90CANx-GCC/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for Atmel AVR AT90CAN128. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex AVR-CAN board. - -** The Demo ** - -The demo currently just flashes the board LED using a thread. It will be -expanded in next releases. -By pressing the board button the test suite is activated, output on serial -port 2. - -** Build Procedure ** - -The demo was built using the WinAVR toolchain. - -** Notes ** - -The demo requires include files from WinAVR that are not part of the ChibiOS/RT -distribution, please install WinAVR. - - http://winavr.sourceforge.net/ diff --git a/demos/AVR-ATmega128-GCC/Makefile b/demos/AVR-ATmega128-GCC/Makefile deleted file mode 100644 index 0ea8e8cff3..0000000000 --- a/demos/AVR-ATmega128-GCC/Makefile +++ /dev/null @@ -1,652 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - - -# MCU name -MCU = atmega128 - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# Typical values are: -# F_CPU = 1000000 -# F_CPU = 1843200 -# F_CPU = 2000000 -# F_CPU = 3686400 -# F_CPU = 4000000 -# F_CPU = 7372800 -# F_CPU = 8000000 -# F_CPU = 11059200 -# F_CPU = 14745600 -# F_CPU = 16000000 -# F_CPU = 18432000 -# F_CPU = 20000000 -F_CPU = 16000000 - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = ch - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_AVR_MT_128/board.mk -include $(CHIBIOS)/os/hal/platforms/AVR/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/AVR/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - lcd.c main.c - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = 2 - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be separated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -#CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be separated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware: alf avr910 avrisp bascom bsd -# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 -# -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = stk500 - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = com1 # programmer connected to serial device - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex bin eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -bin: $(TARGET).bin -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -%.bin: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O binary -R .eeprom $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).bin - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex bin eep lss sym coff extcoff \ -clean clean_list program debug gdb-config - - - - - - diff --git a/demos/AVR-ATmega128-GCC/chconf.h b/demos/AVR-ATmega128-GCC/chconf.h deleted file mode 100644 index ec84e58afb..0000000000 --- a/demos/AVR-ATmega128-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/AVR-ATmega128-GCC/halconf.h b/demos/AVR-ATmega128-GCC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/AVR-ATmega128-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/AVR-ATmega128-GCC/lcd.c b/demos/AVR-ATmega128-GCC/lcd.c deleted file mode 100644 index f010cced34..0000000000 --- a/demos/AVR-ATmega128-GCC/lcd.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "lcd.h" - -static void e_pulse(void) { - volatile uint8_t i; - - PORTC |= PORTC_44780_E_MASK; - for (i = 0; i < ELOOPVALUE; i++); - ; - PORTC &= ~PORTC_44780_E_MASK; -} - -static void wait_not_busy(void) { - - chThdSleep(2); -} - -/* - * 44780 soft reset procedure. - */ -void lcdInit(void) { - - PORTC = (PORTC & ~(PORTC_44780_DATA_MASK | PORTC_44780_RS_MASK | - PORTC_44780_E_MASK | PORTC_44780_RW_MASK)) | - (LCD_CMD_INIT8 & PORTC_44780_DATA_MASK); - chThdSleep(50); - e_pulse(); - chThdSleep(10); - e_pulse(); - chThdSleep(2); - e_pulse(); - wait_not_busy(); - PORTC = (PORTC & ~(PORTC_44780_DATA_MASK | PORTC_44780_RS_MASK | - PORTC_44780_E_MASK | PORTC_44780_RW_MASK)) | - (LCD_CMD_INIT4 & PORTC_44780_DATA_MASK); - e_pulse(); - lcdCmd(LCD_CMD_INIT4); - lcdCmd(LCD_SET_DM | LCD_DM_DISPLAY_ON); - lcdCmd(LCD_SET_INCREMENT_MODE); -} - -/* - * Sends a command byte to the 44780. - */ -void lcdCmd(uint8_t cmd) { - - wait_not_busy(); - PORTC = (PORTC | PORTC_44780_DATA_MASK) & (cmd | - (0x0F & ~PORTC_44780_RS_MASK)); - e_pulse(); - PORTC = (PORTC | PORTC_44780_DATA_MASK) & ((cmd << 4) | - (0x0F & ~PORTC_44780_RS_MASK)); - e_pulse(); -} - -/* - * Writes a char on the LCD at the current position. - */ -void lcdPutc(char c) { - uint8_t b; - - wait_not_busy(); - b = c | 0x0F; - PORTC = (PORTC | PORTC_44780_DATA_MASK | PORTC_44780_RS_MASK) & - (c | 0x0F); - e_pulse(); - PORTC = (PORTC | PORTC_44780_DATA_MASK | PORTC_44780_RS_MASK) & - ((c << 4) | 0x0F); - e_pulse(); -} - -/* - * Writes a string on the LCD at an absolute address. - */ -void lcdPuts(uint8_t pos, char *p) { - - lcdCmd(LCD_SET_DDRAM_ADDRESS | pos); - while (*p) - lcdPutc(*p++); -} diff --git a/demos/AVR-ATmega128-GCC/lcd.h b/demos/AVR-ATmega128-GCC/lcd.h deleted file mode 100644 index 64e2c67f2b..0000000000 --- a/demos/AVR-ATmega128-GCC/lcd.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _LCD_H_ -#define _LCD_H_ - -#define ELOOPVALUE 10 - -#define LCD_CLEAR 0x01 - -#define LCD_RETURN_HOME 0x02 - -#define LCD_SET_INCREMENT_MODE 0x06 - -#define LCD_SET_DM 0x08 -#define LCD_DM_DISPLAY_ON 4 -#define LCD_DM_DISPLAY_OFF 0 -#define LCD_DM_CURSOR_ON 2 -#define LCD_DM_CURSOR_OFF 0 -#define LCD_DM_BLINK_ON 1 -#define LCD_DM_BLINK_OFF 0 - -#define LCD_CMD_INIT4 0x28 -#define LCD_CMD_INIT8 0x38 - -#define LCD_SET_DDRAM_ADDRESS 0x80 - -#define LCD_LINE1 0 -#define LCD_LINE2 40 - -void lcdInit(void); -void lcdCmd(uint8_t cmd); -void lcdPutc(char c); -void lcdPuts(uint8_t pos, char *p); - -#endif /* _LCD_H_ */ diff --git a/demos/AVR-ATmega128-GCC/main.c b/demos/AVR-ATmega128-GCC/main.c deleted file mode 100644 index 0c9fae6398..0000000000 --- a/demos/AVR-ATmega128-GCC/main.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "lcd.h" - -static WORKING_AREA(waThread1, 32); -static msg_t Thread1(void *arg) { - - while (TRUE) { - if (!palReadPad(IOPORT1, PORTA_BUTTON2)) - palTogglePad(IOPORT1, PORTA_RELAY); - chThdSleepMilliseconds(1000); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * This initialization requires the OS already active because it uses delay - * APIs inside. - */ - lcdInit(); - lcdCmd(LCD_CLEAR); - lcdPuts(LCD_LINE1, " ChibiOS/RT "); - lcdPuts(LCD_LINE2, " Hello World! "); - - /* - * Starts the LED blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - while(TRUE) { - if (!palReadPad(IOPORT1, PORTA_BUTTON1)) - TestThread(&SD2); - chThdSleepMilliseconds(500); - } -} diff --git a/demos/AVR-ATmega128-GCC/mcuconf.h b/demos/AVR-ATmega128-GCC/mcuconf.h deleted file mode 100644 index 51cb93729d..0000000000 --- a/demos/AVR-ATmega128-GCC/mcuconf.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AVR drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_AVR_USART0 FALSE -#define USE_AVR_USART1 TRUE - -/* - * SPI driver system settings. - */ diff --git a/demos/AVR-ATmega128-GCC/readme.txt b/demos/AVR-ATmega128-GCC/readme.txt deleted file mode 100644 index 7158463fb4..0000000000 --- a/demos/AVR-ATmega128-GCC/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for Atmel AVR ATmega128. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex AVR-MT-128 board. - -** The Demo ** - -The demo currently just writes a hello world on the LCD and toggles the relay -using a thread while button 2 is pressed. -By pressing the button 1 the test suite is activated, output on serial port 2. - -** Build Procedure ** - -The demo was built using the WinAVR toolchain. - -** Notes ** - -The demo requires include files from WinAVR that are not part of the ChibiOS/RT -distribution, please install WinAVR. - - http://winavr.sourceforge.net/ diff --git a/demos/AVR-ArduinoMega-GCC/Makefile b/demos/AVR-ArduinoMega-GCC/Makefile deleted file mode 100644 index 9113e88fc5..0000000000 --- a/demos/AVR-ArduinoMega-GCC/Makefile +++ /dev/null @@ -1,630 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- -#---------------------------------------------------------------------------- -# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. -# -# Released to the Public Domain -# -# Additional material for this makefile was written by: -# Peter Fleury -# Tim Henigan -# Colin O'Flynn -# Reiner Patommel -# Markus Pfaff -# Sander Pool -# Frederik Rouleau -# Carlos Lamas -# -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device, using avrdude. -# Please customize the avrdude settings below first! -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - - -# MCU name -MCU = atmega1280 - - -# Processor frequency. -F_CPU = 16000000 - - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - - -# Target file name (without extension). -TARGET = ch - - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = . - - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/ARDUINO_MEGA/board.mk -include $(CHIBIOS)/os/hal/platforms/AVR/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/AVR/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - - -# List C source files here. (C dependencies are automatically generated.) -SRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - main.c - - -# List C++ source files here. (C dependencies are automatically generated.) -CPPSRC = - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = 2 - - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - - -# Compiler flag to set the C Standard level. -# c89 = "ANSI" C -# gnu89 = c89 plus GCC extensions -# c99 = ISO C99 standard (not yet fully implemented) -# gnu99 = c99 plus GCC extensions -CSTANDARD = -std=gnu99 - - -# Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL - - -# Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) - - -# Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL -#CPPDEFS += -D__STDC_LIMIT_MACROS -#CPPDEFS += -D__STDC_CONSTANT_MACROS - - - -#---------------- Compiler Options C ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -#CFLAGS += -fno-strict-aliasing -CFLAGS += -Wall -CFLAGS += -Wstrict-prototypes -#CFLAGS += -mshort-calls -#CFLAGS += -fno-unit-at-a-time -#CFLAGS += -Wundef -#CFLAGS += -Wunreachable-code -#CFLAGS += -Wsign-compare -CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) - - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wall -CFLAGS += -Wundef -#CPPFLAGS += -mshort-calls -#CPPFLAGS += -fno-unit-at-a-time -#CPPFLAGS += -Wstrict-prototypes -#CPPFLAGS += -Wunreachable-code -#CPPFLAGS += -Wsign-compare -CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CPPFLAGS += $(CSTANDARD) - - -#---------------- Assembler Options ---------------- -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex -# dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 - - -#---------------- Library Options ---------------- -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -# If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_MIN) -#PRINTF_LIB = $(PRINTF_LIB_FLOAT) - - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -# If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_MIN) -#SCANF_LIB = $(SCANF_LIB_FLOAT) - - -MATH_LIB = -lm - - -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) -#LDFLAGS += -T linker_script.x - - - -#---------------- Programming Options (avrdude) ---------------- - -# Programming hardware: alf avr910 avrisp bascom bsd -# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 -# -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = stk500 - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = com1 # programmer connected to serial device - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -REMOVEDIR = rm -rf -COPY = cp -WINSHELL = cmd - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_CPP = Compiling C++: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: - - - - -# Define all object files. -OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) - -# Define all listing files. -LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) - - -# Compiler flags to generate dependency files. -GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d - - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -build: elf hex bin eep lss sym -#build: lib - - -elf: $(TARGET).elf -hex: $(TARGET).hex -bin: $(TARGET).bin -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym -LIBNAME=lib$(TARGET).a -lib: $(LIBNAME) - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ - 2>/dev/null; echo; fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ - 2>/dev/null; echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -%.bin: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O binary -R .eeprom $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Create library from object files. -.SECONDARY : $(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @echo - @echo $(MSG_CREATING_LIBRARY) $@ - $(AR) $@ $(OBJ) - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @echo - @echo $(MSG_COMPILING_CPP) $< - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C++ source files. -%.s : %.cpp - $(CC) -S $(ALL_CPPFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -$(OBJDIR)/%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Create preprocessed source for use in sending a bug report. -%.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).bin - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) - $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRC:.c=.i) - $(REMOVEDIR) .dep - - -# Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex bin eep lss sym coff extcoff \ -clean clean_list program debug gdb-config - diff --git a/demos/AVR-ArduinoMega-GCC/chconf.h b/demos/AVR-ArduinoMega-GCC/chconf.h deleted file mode 100644 index 06e84e4d25..0000000000 --- a/demos/AVR-ArduinoMega-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE FALSE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitily from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/AVR-ArduinoMega-GCC/halconf.h b/demos/AVR-ArduinoMega-GCC/halconf.h deleted file mode 100644 index eb013c9a7f..0000000000 --- a/demos/AVR-ArduinoMega-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intevals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/AVR-ArduinoMega-GCC/main.c b/demos/AVR-ArduinoMega-GCC/main.c deleted file mode 100644 index e3df7660bd..0000000000 --- a/demos/AVR-ArduinoMega-GCC/main.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -static WORKING_AREA(waThread1, 32); -static msg_t Thread1(void *arg) { - - while (TRUE) { - palTogglePad(IOPORT2, PORTB_LED1); - chThdSleepMilliseconds(1000); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - palClearPad(IOPORT2, PORTB_LED1); - sdStart(&SD1, NULL); - - /* - * Starts the LED blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - TestThread(&SD1); - while(TRUE) { - chThdSleepMilliseconds(1000); - } -} diff --git a/demos/AVR-ArduinoMega-GCC/mcuconf.h b/demos/AVR-ArduinoMega-GCC/mcuconf.h deleted file mode 100644 index 0b2d0610ba..0000000000 --- a/demos/AVR-ArduinoMega-GCC/mcuconf.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AVR drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_AVR_USART0 TRUE -#define USE_AVR_USART1 FALSE - -/* - * SPI driver system settings. - */ diff --git a/demos/AVR-ArduinoMega-GCC/readme.txt b/demos/AVR-ArduinoMega-GCC/readme.txt deleted file mode 100644 index 2a1524da79..0000000000 --- a/demos/AVR-ArduinoMega-GCC/readme.txt +++ /dev/null @@ -1,22 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for Atmel AVR ATmega1280. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Arduino Mega board. - -** The Demo ** - -The demo currently just prints the TestThread output on Serial0, which is -available on the board USB connector (FT232 converter), and toggles the LED -on PB7 (pin 13 on Arduino IDE) every second. - -** Build Procedure ** - -The demo was built using the GCC AVR toolchain. It should build with WinAVR too! - -** Notes ** - -This demo runs natively so the Arduino bootloader must be removed and the FUSEs -reprogrammed. The values used for fuses are LFUSE=0xe7 and HFUSE=0x99. diff --git a/demos/MSP430-MSP430x1611-GCC/Makefile b/demos/MSP430-MSP430x1611-GCC/Makefile deleted file mode 100644 index f454a45001..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/Makefile +++ /dev/null @@ -1,155 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = no -endif - -# Enable register caching optimization (read documentation). -# Option not tested on MSP430, DO NOT USE. -ifeq ($(USE_CURRP_CACHING),) - USE_CURRP_CACHING = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT = msp430.x - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/OLIMEX_MSP430_P1611/board.mk -include $(CHIBIOS)/os/hal/platforms/MSP430/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/MSP430/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = msp430x1611 - -TRGT = msp430- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -D__MSP430F1611__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/MSP430/rules.mk diff --git a/demos/MSP430-MSP430x1611-GCC/chconf.h b/demos/MSP430-MSP430x1611-GCC/chconf.h deleted file mode 100644 index 6159d83b83..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 100 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 10 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 512 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/MSP430-MSP430x1611-GCC/halconf.h b/demos/MSP430-MSP430x1611-GCC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/MSP430-MSP430x1611-GCC/main.c b/demos/MSP430-MSP430x1611-GCC/main.c deleted file mode 100644 index 00f2fb95c1..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/main.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 64); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(IOPORT6, P6_O_LED); - chThdSleepMilliseconds(500); - palClearPad(IOPORT6, P6_O_LED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * The main() function becomes a thread here then the interrupts are - * enabled and ChibiOS/RT goes live. - */ - chSysInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop. - */ - while (TRUE) { - if (!palReadPad(IOPORT6, P6_I_BUTTON)) - TestThread(&SD1); - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/demos/MSP430-MSP430x1611-GCC/mcuconf.h b/demos/MSP430-MSP430x1611-GCC/mcuconf.h deleted file mode 100644 index 9e48df774e..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/mcuconf.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * MSP430 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL driver system settings. - */ -#define MSP430_USE_CLOCK MSP430_CLOCK_SOURCE_XT2CLK - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * MAC driver system settings. - */ - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define USE_MSP430_USART0 TRUE -#define USE_MSP430_USART1 FALSE - -/* - * SPI driver system settings. - */ diff --git a/demos/MSP430-MSP430x1611-GCC/memory.x b/demos/MSP430-MSP430x1611-GCC/memory.x deleted file mode 100644 index 78164e0008..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/memory.x +++ /dev/null @@ -1,25 +0,0 @@ -MEMORY { - sfr : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ - peripheral_8bit : ORIGIN = 0x0010, LENGTH = 0x00f0 /* END=0x0100, size 240 */ - peripheral_16bit : ORIGIN = 0x0100, LENGTH = 0x0100 /* END=0x0200, size 256 */ - ram_mirror (wx) : ORIGIN = 0x0200, LENGTH = 0x0800 /* END=0x0a00, size 2K */ - infomem : ORIGIN = 0x1000, LENGTH = 0x0100 /* END=0x1100, size 256 as 2 128-byte segments */ - infob : ORIGIN = 0x1000, LENGTH = 0x0080 /* END=0x1080, size 128 */ - infoa : ORIGIN = 0x1080, LENGTH = 0x0080 /* END=0x1100, size 128 */ - ram (wx) : ORIGIN = 0x1100, LENGTH = 0x2800 /* END=0x3900, size 10K */ - rom (rx) : ORIGIN = 0x4000, LENGTH = 0xbfe0 /* END=0xffe0, size 49120 */ - vectors : ORIGIN = 0xffe0, LENGTH = 0x0020 /* END=0x10000, size 32 as 16 2-byte segments */ - /* Remaining banks are absent */ - bsl : ORIGIN = 0x0000, LENGTH = 0x0000 - infoc : ORIGIN = 0x0000, LENGTH = 0x0000 - infod : ORIGIN = 0x0000, LENGTH = 0x0000 - ram2 (wx) : ORIGIN = 0x0000, LENGTH = 0x0000 - usbram (wx) : ORIGIN = 0x0000, LENGTH = 0x0000 - far_rom : ORIGIN = 0x00000000, LENGTH = 0x00000000 -} -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_FAR_ROM", far_rom); -PROVIDE (__info_segment_size = 0x80); -PROVIDE (__infob = 0x1000); -PROVIDE (__infoa = 0x1080); diff --git a/demos/MSP430-MSP430x1611-GCC/msp430.x b/demos/MSP430-MSP430x1611-GCC/msp430.x deleted file mode 100644 index c66c3a1a1c..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/msp430.x +++ /dev/null @@ -1,184 +0,0 @@ -/* Default linker script, for normal executables */ -OUTPUT_FORMAT("elf32-msp430") -OUTPUT_ARCH("msp430") -INCLUDE memory.x -INCLUDE periph.x -SECTIONS -{ - /* Read-only sections, merged into text segment. */ - .hash : { *(.hash) } - .dynsym : { *(.dynsym) } - .dynstr : { *(.dynstr) } - .gnu.version : { *(.gnu.version) } - .gnu.version_d : { *(.gnu.version_d) } - .gnu.version_r : { *(.gnu.version_r) } - .rel.init : { *(.rel.init) } - .rela.init : { *(.rela.init) } - .rel.fini : { *(.rel.fini) } - .rela.fini : { *(.rela.fini) } - .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } - .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } - .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } - .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } - .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } - .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } - .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } - .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } - .rel.ctors : { *(.rel.ctors) } - .rela.ctors : { *(.rela.ctors) } - .rel.dtors : { *(.rel.dtors) } - .rela.dtors : { *(.rela.dtors) } - .rel.got : { *(.rel.got) } - .rela.got : { *(.rela.got) } - .rel.plt : { *(.rel.plt) } - .rela.plt : { *(.rela.plt) } - .text : - { - . = ALIGN(2); - KEEP(*(.init .init.*)) - KEEP(*(.init0)) /* Start here after reset. */ - KEEP(*(.init1)) /* User definable. */ - KEEP(*(.init2)) /* Initialize stack. */ - KEEP(*(.init3)) /* Initialize hardware, user definable. */ - KEEP(*(.init4)) /* Copy data to .data, clear bss. */ - KEEP(*(.init5)) /* User definable. */ - KEEP(*(.init6)) /* C++ constructors. */ - KEEP(*(.init7)) /* User definable. */ - KEEP(*(.init8)) /* User definable. */ - KEEP(*(.init9)) /* Call main(). */ - KEEP(*(.fini9)) /* Falls into here after main(). User definable. */ - KEEP(*(.fini8)) /* User definable. */ - KEEP(*(.fini7)) /* User definable. */ - KEEP(*(.fini6)) /* C++ destructors. */ - KEEP(*(.fini5)) /* User definable. */ - KEEP(*(.fini4)) /* User definable. */ - KEEP(*(.fini3)) /* User definable. */ - KEEP(*(.fini2)) /* User definable. */ - KEEP(*(.fini1)) /* User definable. */ - KEEP(*(.fini0)) /* Infinite loop after program termination. */ - KEEP(*(.fini .fini.*)) - . = ALIGN(2); - __ctors_start = . ; - KEEP(*(.ctors)) - __ctors_end = . ; - __dtors_start = . ; - KEEP(*(.dtors)) - __dtors_end = . ; - . = ALIGN(2); - *(.text .text.* .gnu.linkonce.t.*) - . = ALIGN(2); - } > REGION_TEXT - .rodata : - { - . = ALIGN(2); - *(.rodata .rodata.* .gnu.linkonce.r.*) - . = ALIGN(2); - } > REGION_TEXT - _etext = .; /* Past last read-only (loadable) segment */ - .data : - { - . = ALIGN(2); - PROVIDE (__data_start = .) ; - *(.data .data.* .gnu.linkonce.d.*) - . = ALIGN(2); - _edata = . ; /* Past last read-write (loadable) segment */ - } > REGION_DATA AT > REGION_TEXT - PROVIDE (__data_load_start = LOADADDR(.data) ); - PROVIDE (__data_size = SIZEOF(.data) ); - .bss : - { - PROVIDE (__bss_start = .) ; - *(.bss .bss.*) - *(COMMON) - . = ALIGN(2); - PROVIDE (__bss_end = .) ; - } > REGION_DATA - PROVIDE (__bss_size = SIZEOF(.bss) ); - .noinit : - { - PROVIDE (__noinit_start = .) ; - *(.noinit .noinit.*) - . = ALIGN(2); - PROVIDE (__noinit_end = .) ; - } > REGION_DATA - . = ALIGN(2); - _end = . ; /* Past last write (loadable) segment */ - .infomem : - { - *(.infomem) - . = ALIGN(2); - *(.infomem.*) - } > infomem - .infomemnobits : - { - *(.infomemnobits) - . = ALIGN(2); - *(.infomemnobits.*) - } > infomem - .infoa : - { - *(.infoa .infoa.*) - } > infoa - .infob : - { - *(.infob .infob.*) - } > infob - .infoc : - { - *(.infoc .infoc.*) - } > infoc - .infod : - { - *(.infod .infod.*) - } > infod - .vectors : - { - PROVIDE (__vectors_start = .) ; - KEEP(*(.vectors*)) - _vectors_end = . ; - } > vectors - .fartext : - { - . = ALIGN(2); - *(.fartext) - . = ALIGN(2); - *(.fartext.*) - _efartext = .; - } > REGION_FAR_ROM - /* Stabs for profiling information*/ - .profiler 0 : { *(.profiler) } - /* 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) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - PROVIDE (__stack = ORIGIN(ram) + LENGTH(ram)); - PROVIDE (__data_start_rom = _etext); - PROVIDE (__data_end_rom = _etext + SIZEOF (.data)); -} diff --git a/demos/MSP430-MSP430x1611-GCC/periph.x b/demos/MSP430-MSP430x1611-GCC/periph.x deleted file mode 100644 index 525d0692bf..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/periph.x +++ /dev/null @@ -1,165 +0,0 @@ -__IE1 = 0x0000; -__IFG1 = 0x0002; -__ME1 = 0x0004; -__IE2 = 0x0001; -__IFG2 = 0x0003; -__ME2 = 0x0005; -__WDTCTL = 0x0120; -__MPY = 0x0130; -__MPYS = 0x0132; -__MAC = 0x0134; -__MACS = 0x0136; -__OP2 = 0x0138; -__RESLO = 0x013A; -__RESHI = 0x013C; -__SUMEXT = 0x013E; -__P1IN = 0x0020; -__P1OUT = 0x0021; -__P1DIR = 0x0022; -__P1IFG = 0x0023; -__P1IES = 0x0024; -__P1IE = 0x0025; -__P1SEL = 0x0026; -__P2IN = 0x0028; -__P2OUT = 0x0029; -__P2DIR = 0x002A; -__P2IFG = 0x002B; -__P2IES = 0x002C; -__P2IE = 0x002D; -__P2SEL = 0x002E; -__P3IN = 0x0018; -__P3OUT = 0x0019; -__P3DIR = 0x001A; -__P3SEL = 0x001B; -__P4IN = 0x001C; -__P4OUT = 0x001D; -__P4DIR = 0x001E; -__P4SEL = 0x001F; -__P5IN = 0x0030; -__P5OUT = 0x0031; -__P5DIR = 0x0032; -__P5SEL = 0x0033; -__P6IN = 0x0034; -__P6OUT = 0x0035; -__P6DIR = 0x0036; -__P6SEL = 0x0037; -__U0CTL = 0x0070; -__U0TCTL = 0x0071; -__U0RCTL = 0x0072; -__U0MCTL = 0x0073; -__U0BR0 = 0x0074; -__U0BR1 = 0x0075; -__U0RXBUF = 0x0076; -__U0TXBUF = 0x0077; -__U1CTL = 0x0078; -__U1TCTL = 0x0079; -__U1RCTL = 0x007A; -__U1MCTL = 0x007B; -__U1BR0 = 0x007C; -__U1BR1 = 0x007D; -__U1RXBUF = 0x007E; -__U1TXBUF = 0x007F; -__I2CIE = 0x0050; -__I2CIFG = 0x0051; -__I2CNDAT = 0x0052; -__I2CTCTL = 0x0071; -__I2CDCTL = 0x0072; -__I2CPSC = 0x0073; -__I2CSCLH = 0x0074; -__I2CSCLL = 0x0075; -__I2CDRB = 0x0076; -__I2CDRW = 0x0076; -__I2COA = 0x0118; -__I2CSA = 0x011A; -__I2CIV = 0x011C; -__TAIV = 0x012E; -__TACTL = 0x0160; -__TACCTL0 = 0x0162; -__TACCTL1 = 0x0164; -__TACCTL2 = 0x0166; -__TAR = 0x0170; -__TACCR0 = 0x0172; -__TACCR1 = 0x0174; -__TACCR2 = 0x0176; -__TBIV = 0x011E; -__TBCTL = 0x0180; -__TBCCTL0 = 0x0182; -__TBCCTL1 = 0x0184; -__TBCCTL2 = 0x0186; -__TBCCTL3 = 0x0188; -__TBCCTL4 = 0x018A; -__TBCCTL5 = 0x018C; -__TBCCTL6 = 0x018E; -__TBR = 0x0190; -__TBCCR0 = 0x0192; -__TBCCR1 = 0x0194; -__TBCCR2 = 0x0196; -__TBCCR3 = 0x0198; -__TBCCR4 = 0x019A; -__TBCCR5 = 0x019C; -__TBCCR6 = 0x019E; -__DCOCTL = 0x0056; -__BCSCTL1 = 0x0057; -__BCSCTL2 = 0x0058; -__SVSCTL = 0x0055; -__FCTL1 = 0x0128; -__FCTL2 = 0x012A; -__FCTL3 = 0x012C; -__CACTL1 = 0x0059; -__CACTL2 = 0x005A; -__CAPD = 0x005B; -__ADC12CTL0 = 0x01A0; -__ADC12CTL1 = 0x01A2; -__ADC12IFG = 0x01A4; -__ADC12IE = 0x01A6; -__ADC12IV = 0x01A8; -__ADC12MEM0 = 0x0140; -__ADC12MEM1 = 0x0142; -__ADC12MEM2 = 0x0144; -__ADC12MEM3 = 0x0146; -__ADC12MEM4 = 0x0148; -__ADC12MEM5 = 0x014A; -__ADC12MEM6 = 0x014C; -__ADC12MEM7 = 0x014E; -__ADC12MEM8 = 0x0150; -__ADC12MEM9 = 0x0152; -__ADC12MEM10 = 0x0154; -__ADC12MEM11 = 0x0156; -__ADC12MEM12 = 0x0158; -__ADC12MEM13 = 0x015A; -__ADC12MEM14 = 0x015C; -__ADC12MEM15 = 0x015E; -__ADC12MCTL0 = 0x0080; -__ADC12MCTL1 = 0x0081; -__ADC12MCTL2 = 0x0082; -__ADC12MCTL3 = 0x0083; -__ADC12MCTL4 = 0x0084; -__ADC12MCTL5 = 0x0085; -__ADC12MCTL6 = 0x0086; -__ADC12MCTL7 = 0x0087; -__ADC12MCTL8 = 0x0088; -__ADC12MCTL9 = 0x0089; -__ADC12MCTL10 = 0x008A; -__ADC12MCTL11 = 0x008B; -__ADC12MCTL12 = 0x008C; -__ADC12MCTL13 = 0x008D; -__ADC12MCTL14 = 0x008E; -__ADC12MCTL15 = 0x008F; -__DAC12_0CTL = 0x01c0; -__DAC12_1CTL = 0x01c2; -__DAC12_0DAT = 0x01c8; -__DAC12_1DAT = 0x01ca; -__DMACTL0 = 0x0122; -__DMACTL1 = 0x0124; -__DMA0CTL = 0x01e0; -__DMA1CTL = 0x01e8; -__DMA2CTL = 0x01f0; -__DMA0SA = 0x01e2; -__DMA0DA = 0x01e4; -__DMA0SZ = 0x01e6; -__DMA1SA = 0x01ea; -__DMA1DA = 0x01ec; -__DMA1SZ = 0x01ee; -__DMA2SA = 0x01f2; -__DMA2DA = 0x01f4; -__DMA2SZ = 0x01f6; diff --git a/demos/MSP430-MSP430x1611-GCC/readme.txt b/demos/MSP430-MSP430x1611-GCC/readme.txt deleted file mode 100644 index 90dc78ff98..0000000000 --- a/demos/MSP430-MSP430x1611-GCC/readme.txt +++ /dev/null @@ -1,29 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for Texas Instruments MSP430. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex MSP430-P1611 board with a 8MHz xtal installed. In -order to execute the demo without an crystal you need to edit mcuconf.h -and change: -#define MSP430_USE_CLOCK MSP430_CLOCK_SOURCE_XT2CLK -in: -#define MSP430_USE_CLOCK MSP430_CLOCK_SOURCE_DCOCLK - -** The Demo ** - -The demo flashes the board LED using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port -COM1 (USART0). - -** Build Procedure ** - -The demo was built using the MSPGCC toolchain. - -** Notes ** - -The demo requires include files from MSPGCC that are not part of the ChibiOS/RT -distribution, please install MSPGCC. - - http://mspgcc.sourceforge.net/ diff --git a/demos/PPC-SPC560P-GCC/.cproject b/demos/PPC-SPC560P-GCC/.cproject deleted file mode 100644 index 8583cd0c18..0000000000 --- a/demos/PPC-SPC560P-GCC/.cproject +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/PPC-SPC560P-GCC/.project b/demos/PPC-SPC560P-GCC/.project deleted file mode 100644 index bfb6550ac8..0000000000 --- a/demos/PPC-SPC560P-GCC/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - PPC-SPC560P-GCC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/GENERIC_SPC560P - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/PPC-SPC560P-GCC/Makefile b/demos/PPC-SPC560P-GCC/Makefile deleted file mode 100644 index 62303fdd1f..0000000000 --- a/demos/PPC-SPC560P-GCC/Makefile +++ /dev/null @@ -1,163 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = no -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/GENERIC_SPC560P/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC560Pxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC560Pxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC560P44.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/demos/PPC-SPC560P-GCC/chconf.h b/demos/PPC-SPC560P-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/PPC-SPC560P-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/PPC-SPC560P-GCC/halconf.h b/demos/PPC-SPC560P-GCC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/PPC-SPC560P-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/PPC-SPC560P-GCC/main.c b/demos/PPC-SPC560P-GCC/main.c deleted file mode 100644 index b296da2228..0000000000 --- a/demos/PPC-SPC560P-GCC/main.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "chprintf.h" - -#define SHELL_WA_SIZE THD_WA_SIZE(1024) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.sp, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - - while (TRUE) { - unsigned i; - - for (i = 0; i < 4; i++) { - palClearPad(PD, PD_LED1); - chThdSleepMilliseconds(100); - palClearPad(PD, PD_LED2); - chThdSleepMilliseconds(100); - palClearPad(PD, PD_LED3); - chThdSleepMilliseconds(100); - palClearPad(PD, PD_LED4); - chThdSleepMilliseconds(100); - palSetPad(PD, PD_LED1); - chThdSleepMilliseconds(100); - palSetPad(PD, PD_LED2); - chThdSleepMilliseconds(100); - palSetPad(PD, PD_LED3); - chThdSleepMilliseconds(100); - palSetPad(PD, PD_LED4); - chThdSleepMilliseconds(300); - } - - for (i = 0; i < 4; i++) { - palTogglePort(PD, PAL_PORT_BIT(PD_LED1) | PAL_PORT_BIT(PD_LED2) | - PAL_PORT_BIT(PD_LED3) | PAL_PORT_BIT(PD_LED4)); - chThdSleepMilliseconds(500); - palTogglePort(PD, PAL_PORT_BIT(PD_LED1) | PAL_PORT_BIT(PD_LED2) | - PAL_PORT_BIT(PD_LED3) | PAL_PORT_BIT(PD_LED4)); - chThdSleepMilliseconds(500); - } - - for (i = 0; i < 4; i++) { - palTogglePad(PD, PD_LED1); - chThdSleepMilliseconds(250); - palTogglePad(PD, PD_LED1); - palTogglePad(PD, PD_LED2); - chThdSleepMilliseconds(250); - palTogglePad(PD, PD_LED2); - palTogglePad(PD, PD_LED3); - chThdSleepMilliseconds(250); - palTogglePad(PD, PD_LED3); - palTogglePad(PD, PD_LED4); - chThdSleepMilliseconds(250); - palTogglePad(PD, PD_LED4); - } - - for (i = 0; i < 4; i++) { - palClearPort(PD, PAL_PORT_BIT(PD_LED1) | PAL_PORT_BIT(PD_LED3)); - palSetPort(PD, PAL_PORT_BIT(PD_LED2) | PAL_PORT_BIT(PD_LED4)); - chThdSleepMilliseconds(500); - palClearPort(PD, PAL_PORT_BIT(PD_LED2) | PAL_PORT_BIT(PD_LED4)); - palSetPort(PD, PAL_PORT_BIT(PD_LED1) | PAL_PORT_BIT(PD_LED3)); - chThdSleepMilliseconds(500); - } - - palSetPort(PD, PAL_PORT_BIT(PD_LED1) | PAL_PORT_BIT(PD_LED2) | - PAL_PORT_BIT(PD_LED3) | PAL_PORT_BIT(PD_LED4)); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - - if (!shelltp) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } - return 0; -} diff --git a/demos/PPC-SPC560P-GCC/mcuconf.h b/demos/PPC-SPC560P-GCC/mcuconf.h deleted file mode 100644 index 49369ce5da..0000000000 --- a/demos/PPC-SPC560P-GCC/mcuconf.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * SPC560Pxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC560Pxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT3_IRQ_PRIORITY 4 - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/demos/PPC-SPC563M-GCC/.cproject b/demos/PPC-SPC563M-GCC/.cproject deleted file mode 100644 index 51543c2ba8..0000000000 --- a/demos/PPC-SPC563M-GCC/.cproject +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/PPC-SPC563M-GCC/.project b/demos/PPC-SPC563M-GCC/.project deleted file mode 100644 index 562a9ec5e0..0000000000 --- a/demos/PPC-SPC563M-GCC/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - PPC-SPC563M-GCC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/GENERIC_SPC563M - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/demos/PPC-SPC563M-GCC/Makefile b/demos/PPC-SPC563M-GCC/Makefile deleted file mode 100644 index a19a93cd8e..0000000000 --- a/demos/PPC-SPC563M-GCC/Makefile +++ /dev/null @@ -1,163 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = no -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/GENERIC_SPC563M/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC56x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC563Mxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC563M64.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/demos/PPC-SPC563M-GCC/chconf.h b/demos/PPC-SPC563M-GCC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/demos/PPC-SPC563M-GCC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/PPC-SPC563M-GCC/halconf.h b/demos/PPC-SPC563M-GCC/halconf.h deleted file mode 100644 index 83783d10fe..0000000000 --- a/demos/PPC-SPC563M-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -/*#include "mcuconf.h"*/ - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL FALSE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/PPC-SPC563M-GCC/main.c b/demos/PPC-SPC563M-GCC/main.c deleted file mode 100644 index aab1b4d442..0000000000 --- a/demos/PPC-SPC563M-GCC/main.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "chprintf.h" - -#define SHELL_WA_SIZE THD_WA_SIZE(1024) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.sp, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - - SIU.GPDO[GPIO_LED1].R = 1; - SIU.GPDO[GPIO_LED2].R = 1; - SIU.GPDO[GPIO_LED3].R = 1; - SIU.GPDO[GPIO_LED4].R = 1; - - while (TRUE) { - SIU.GPDO[GPIO_LED1].R = 0; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED2].R = 0; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED3].R = 0; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED4].R = 0; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED1].R = 1; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED2].R = 1; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED3].R = 1; - chThdSleepMilliseconds(100); - SIU.GPDO[GPIO_LED4].R = 1; - chThdSleepMilliseconds(300); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - - if (!shelltp) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } -#if 0 - if (SIU.GPDI[GPIO_BUTTON1].B.PDI) { - volatile msg_t result; -#if 0 - MemoryStream report; - - msObjectInit(&report, report_buffer, sizeof(report_buffer), 0); - result = TestThread(&report); -#else - result = TestThread(&SD1); -#endif - } -#endif - chThdSleepMilliseconds(1000); - } - return 0; -} diff --git a/demos/Posix-GCC/Makefile b/demos/Posix-GCC/Makefile deleted file mode 100644 index f5eae1c05d..0000000000 --- a/demos/Posix-GCC/Makefile +++ /dev/null @@ -1,164 +0,0 @@ -# -# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!! -# -############################################################################################## -# -# On command line: -# -# make all = Create project -# -# make clean = Clean project files. -# -# To rebuild project do "make clean" and "make all". -# - -############################################################################################## -# Start of default section -# - -TRGT = -CC = $(TRGT)gcc -AS = $(TRGT)gcc -x assembler-with-cpp - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSIMULATOR -DSHELL_USE_IPRINTF=FALSE - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################################## - -############################################################################################## -# Start of user section -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT = - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/simulator/board.mk -include ${CHIBIOS}/os/hal/hal.mk -include ${CHIBIOS}/os/hal/platforms/Posix/platform.mk -include ${CHIBIOS}/os/ports/GCC/SIMIA32/port.mk -include ${CHIBIOS}/os/kernel/kernel.mk -include ${CHIBIOS}/test/test.mk - -# List C source files here -SRC = ${PORTSRC} \ - ${KERNSRC} \ - ${TESTSRC} \ - ${HALSRC} \ - ${PLATFORMSRC} \ - $(BOARDSRC) \ - ${CHIBIOS}/os/various/shell.c \ - ${CHIBIOS}/os/various/chprintf.c \ - main.c - -# List ASM source files here -ASRC = - -# List all user directories here -UINCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - ${CHIBIOS}/os/various - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# Define optimisation level here -OPT = -ggdb -O2 -fomit-frame-pointer - -# -# End of user defines -############################################################################################## - -INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR)) -LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) -DEFS = $(DDEFS) $(UDEFS) -ADEFS = $(DADEFS) $(UADEFS) -OBJS = $(ASRC:.s=.o) $(SRC:.c=.o) -LIBS = $(DLIBS) $(ULIBS) - -ASFLAGS = -Wa,-amhls=$(<:.s=.lst) $(ADEFS) -CPFLAGS = $(OPT) -Wall -Wextra -Wstrict-prototypes -fverbose-asm $(DEFS) - -ifeq ($(HOST_OSX),yes) - ifeq ($(OSX_SDK),) - OSX_SDK = /Developer/SDKs/MacOSX10.7.sdk - endif - ifeq ($(OSX_ARCH),) - OSX_ARCH = -mmacosx-version-min=10.3 -arch i386 - endif - - CPFLAGS += -isysroot $(OSX_SDK) $(OSX_ARCH) - LDFLAGS = -Wl -Map=$(PROJECT).map,-syslibroot,$(OSX_SDK),$(LIBDIR) - LIBS += $(OSX_ARCH) -else - # Linux, or other - CPFLAGS += -m32 -Wa,-alms=$(<:.c=.lst) - LDFLAGS = -m32 -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR) -endif - -# Generate dependency information -CPFLAGS += -MD -MP -MF .dep/$(@F).d - -# -# makefile rules -# - -all: $(OBJS) $(PROJECT) - -%o : %c - $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ - -%o : %s - $(AS) -c $(ASFLAGS) $< -o $@ - -$(PROJECT): $(OBJS) - $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ - -gcov: - -mkdir gcov - $(COV) -u $(subst /,\,$(SRC)) - -mv *.gcov ./gcov - -clean: - -rm -f $(OBJS) - -rm -f $(PROJECT) - -rm -f $(PROJECT).map - -rm -f $(SRC:.c=.c.bak) - -rm -f $(SRC:.c=.lst) - -rm -f $(ASRC:.s=.s.bak) - -rm -f $(ASRC:.s=.lst) - -rm -fR .dep - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/demos/Posix-GCC/chconf.h b/demos/Posix-GCC/chconf.h deleted file mode 100644 index e5794592e4..0000000000 --- a/demos/Posix-GCC/chconf.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0x20000 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/Posix-GCC/halconf.h b/demos/Posix-GCC/halconf.h deleted file mode 100644 index 2021371194..0000000000 --- a/demos/Posix-GCC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -/*#include "mcuconf.h"*/ - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/Posix-GCC/main.c b/demos/Posix-GCC/main.c deleted file mode 100644 index 7514faebf2..0000000000 --- a/demos/Posix-GCC/main.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "chprintf.h" - -#define SHELL_WA_SIZE THD_WA_SIZE(4096) -#define CONSOLE_WA_SIZE THD_WA_SIZE(4096) -#define TEST_WA_SIZE THD_WA_SIZE(4096) - -#define cputs(msg) chMsgSend(cdtp, (msg_t)msg) - -static Thread *cdtp; -static Thread *shelltp1; -static Thread *shelltp2; - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.esp, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -static const ShellConfig shell_cfg2 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Console print server done using synchronous messages. This makes the access - * to the C printf() thread safe and the print operation atomic among threads. - * In this example the message is the zero terminated string itself. - */ -static msg_t console_thread(void *arg) { - - (void)arg; - while (!chThdShouldTerminate()) { - Thread *tp = chMsgWait(); - puts((char *)chMsgGet(tp)); - fflush(stdout); - chMsgRelease(tp, RDY_OK); - } - return 0; -} - -/** - * @brief Shell termination handler. - * - * @param[in] id event id. - */ -static void termination_handler(eventid_t id) { - - (void)id; - if (shelltp1 && chThdTerminated(shelltp1)) { - chThdWait(shelltp1); - shelltp1 = NULL; - chThdSleepMilliseconds(10); - cputs("Init: shell on SD1 terminated"); - chSysLock(); - chOQResetI(&SD1.oqueue); - chSysUnlock(); - } - if (shelltp2 && chThdTerminated(shelltp2)) { - chThdWait(shelltp2); - shelltp2 = NULL; - chThdSleepMilliseconds(10); - cputs("Init: shell on SD2 terminated"); - chSysLock(); - chOQResetI(&SD2.oqueue); - chSysUnlock(); - } -} - -static EventListener sd1fel, sd2fel; - -/** - * @brief SD1 status change handler. - * - * @param[in] id event id. - */ -static void sd1_handler(eventid_t id) { - flagsmask_t flags; - - (void)id; - flags = chEvtGetAndClearFlags(&sd1fel); - if ((flags & CHN_CONNECTED) && (shelltp1 == NULL)) { - cputs("Init: connection on SD1"); - shelltp1 = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO + 1); - } - if (flags & CHN_DISCONNECTED) { - cputs("Init: disconnection on SD1"); - chSysLock(); - chIQResetI(&SD1.iqueue); - chSysUnlock(); - } -} - -/** - * @brief SD2 status change handler. - * - * @param[in] id event id. - */ -static void sd2_handler(eventid_t id) { - flagsmask_t flags; - - (void)id; - flags = chEvtGetAndClearFlags(&sd2fel); - if ((flags & CHN_CONNECTED) && (shelltp2 == NULL)) { - cputs("Init: connection on SD2"); - shelltp2 = shellCreate(&shell_cfg2, SHELL_WA_SIZE, NORMALPRIO + 10); - } - if (flags & CHN_DISCONNECTED) { - cputs("Init: disconnection on SD2"); - chSysLock(); - chIQResetI(&SD2.iqueue); - chSysUnlock(); - } -} - -static evhandler_t fhandlers[] = { - termination_handler, - sd1_handler, - sd2_handler -}; - -/*------------------------------------------------------------------------* - * Simulator main. * - *------------------------------------------------------------------------*/ -int main(void) { - EventListener tel; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Serial ports (simulated) initialization. - */ - sdStart(&SD1, NULL); - sdStart(&SD2, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - chEvtRegister(&shell_terminated, &tel, 0); - - /* - * Console thread started. - */ - cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO + 1, - console_thread, NULL); - - /* - * Initializing connection/disconnection events. - */ - cputs("Shell service started on SD1, SD2"); - cputs(" - Listening for connections on SD1"); - chEvtRegister(chnGetEventSource(&SD1), &sd1fel, 1); - cputs(" - Listening for connections on SD2"); - chEvtRegister(chnGetEventSource(&SD2), &sd2fel, 2); - - /* - * Events servicing loop. - */ - while (!chThdShouldTerminate()) - chEvtDispatch(fhandlers, chEvtWaitOne(ALL_EVENTS)); - - /* - * Clean simulator exit. - */ - chEvtUnregister(chnGetEventSource(&SD1), &sd1fel); - chEvtUnregister(chnGetEventSource(&SD2), &sd2fel); - return 0; -} diff --git a/demos/Posix-GCC/readme.txt b/demos/Posix-GCC/readme.txt deleted file mode 100644 index a1b5b44892..0000000000 --- a/demos/Posix-GCC/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for x86 into a Linux process ** -***************************************************************************** - -** TARGET ** - -The demo runs under x86 Linux as an application program. The serial -I/O is simulated over TCP/IP sockets. - -** The Demo ** - -The demo listens on the two serial ports, when a connection is detected a -thread is started that serves a small command shell. -The demo shows how create/terminate threads at runtime, how listen to events, -how ho work with serial ports, how use the messages. -You can develop your ChibiOS/RT application using this demo as a simulator -then you can recompile it for a different architecture. -See demo.c for details. - -** Build Procedure ** - -GCC required. The Makefile defaults to building for a Linux host. -To build on OS X, use the following command: `make HOST_OSX=yes` - -** Connect to the demo ** - -In order to connect to the demo use telnet on the listening ports. diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/ChibiOS-RT.stw b/demos/STM8L-STM8L152-DISCOVERY-STVD/ChibiOS-RT.stw deleted file mode 100644 index a6630271a8..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/ChibiOS-RT.stw +++ /dev/null @@ -1,16 +0,0 @@ -; STMicroelectronics Workspace file - -[Version] -Keyword=ST7Workspace-V0.7 - -[Project0] -Filename=cosmic\cosmic.stp -Dependencies= - -[Project1] -Filename=raisonance\raisonance.stp -Dependencies= -[Options] -ActiveProject=cosmic -ActiveConfig=Release -AddSortedElements=0 diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/cosmic.stp b/demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/cosmic.stp deleted file mode 100644 index 20fd5c578e..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/cosmic.stp +++ /dev/null @@ -1,2302 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=cosmic -Toolset=STM8 Cosmic - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=cosmic -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\ports\cosmic\stm8;..\..\..\boards\st_stm8l_discovery;..\..\..\os\hal\include;..\..\..\os\hal\src;..\..\..\test;..\demo;..\..\..\os\hal\platforms\stm8l; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,11,12,20,6,17 -String.100.0=STM8L152C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,31,15 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,11,13,11,54,55 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x1000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x40 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x40 -m 0x7c0 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x1000-0x13ff]=.eeprom -String.103.2=Zero Page[0x0-0x3f]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x40-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libis0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\ports\cosmic\stm8;..\..\..\boards\st_stm8l_discovery;..\..\..\os\hal\include;..\..\..\os\hal\src;..\..\..\test;..\demo;..\..\..\os\hal\platforms\stm8l; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,11,12,20,6,17 -String.100.0=STM8L152C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2012,1,23,18,22,6 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x1000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x40 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x40 -m 0x7c0 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x1000-0x13ff]=.eeprom -String.103.2=Zero Page[0x0-0x3f]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x40-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,31,15 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.vectors.c -Config.0=Root.Source Files...\demo\main.c.Config.0 -Config.1=Root.Source Files...\demo\main.c.Config.1 - -[Root.Source Files...\demo\main.c.Config.0] -Settings.0.0=Root.Source Files...\demo\main.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files...\demo\main.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files...\demo\main.c.Config.0.Settings.2 - -[Root.Source Files...\demo\main.c.Config.1] -Settings.1.0=Root.Source Files...\demo\main.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files...\demo\main.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files...\demo\main.c.Config.1.Settings.2 - -[Root.Source Files...\demo\main.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files...\demo\main.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files...\demo\main.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files...\demo\main.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.vectors.c] -ElemType=File -PathName=vectors.c -Next=Root.Source Files.Source Files\board -Config.0=Root.Source Files.vectors.c.Config.0 -Config.1=Root.Source Files.vectors.c.Config.1 - -[Root.Source Files.vectors.c.Config.0] -Settings.0.0=Root.Source Files.vectors.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.vectors.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.vectors.c.Config.0.Settings.2 - -[Root.Source Files.vectors.c.Config.1] -Settings.1.0=Root.Source Files.vectors.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.vectors.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.vectors.c.Config.1.Settings.2 - -[Root.Source Files.vectors.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.vectors.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.vectors.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.vectors.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.vectors.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.vectors.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\boards\st_stm8l_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board...\..\..\boards\st_stm8l_discovery\board.c] -ElemType=File -PathName=..\..\..\boards\st_stm8l_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal -Next=Root.Source Files.Source Files\test - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L] -ElemType=Folder -PathName=Source Files\os\hal\STM8L -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\shared_isr.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\shared_isr.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\shared_isr.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\serial_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,28,21 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,28,21 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.c] -ElemType=File -PathName=..\..\..\os\ports\cosmic\stm8\chcore.c - -[Root.Source Files.Source Files\test] -ElemType=Folder -PathName=Source Files\test -Child=Root.Source Files.Source Files\test...\..\..\test\test.c -Config.0=Root.Source Files.Source Files\test.Config.0 -Config.1=Root.Source Files.Source Files\test.Config.1 - -[Root.Source Files.Source Files\test.Config.0] -Settings.0.0=Root.Source Files.Source Files\test.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\test.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\test.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\test.Config.0.Settings.3 - -[Root.Source Files.Source Files\test.Config.1] -Settings.1.0=Root.Source Files.Source Files\test.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\test.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\test.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\test.Config.1.Settings.3 - -[Root.Source Files.Source Files\test.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\test.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\test.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\test.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\test.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,53 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\test.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Source Files.Source Files\test.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\test.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\test...\..\..\test\test.c] -ElemType=File -PathName=..\..\..\test\test.c -Next=Root.Source Files.Source Files\test...\..\..\test\testbmk.c - -[Root.Source Files.Source Files\test...\..\..\test\testbmk.c] -ElemType=File -PathName=..\..\..\test\testbmk.c -Next=Root.Source Files.Source Files\test...\..\..\test\testdyn.c - -[Root.Source Files.Source Files\test...\..\..\test\testdyn.c] -ElemType=File -PathName=..\..\..\test\testdyn.c -Next=Root.Source Files.Source Files\test...\..\..\test\testevt.c - -[Root.Source Files.Source Files\test...\..\..\test\testevt.c] -ElemType=File -PathName=..\..\..\test\testevt.c -Next=Root.Source Files.Source Files\test...\..\..\test\testheap.c - -[Root.Source Files.Source Files\test...\..\..\test\testheap.c] -ElemType=File -PathName=..\..\..\test\testheap.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmbox.c - -[Root.Source Files.Source Files\test...\..\..\test\testmbox.c] -ElemType=File -PathName=..\..\..\test\testmbox.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmsg.c - -[Root.Source Files.Source Files\test...\..\..\test\testmsg.c] -ElemType=File -PathName=..\..\..\test\testmsg.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmtx.c - -[Root.Source Files.Source Files\test...\..\..\test\testmtx.c] -ElemType=File -PathName=..\..\..\test\testmtx.c -Next=Root.Source Files.Source Files\test...\..\..\test\testpools.c - -[Root.Source Files.Source Files\test...\..\..\test\testpools.c] -ElemType=File -PathName=..\..\..\test\testpools.c -Next=Root.Source Files.Source Files\test...\..\..\test\testqueues.c - -[Root.Source Files.Source Files\test...\..\..\test\testqueues.c] -ElemType=File -PathName=..\..\..\test\testqueues.c -Next=Root.Source Files.Source Files\test...\..\..\test\testsem.c - -[Root.Source Files.Source Files\test...\..\..\test\testsem.c] -ElemType=File -PathName=..\..\..\test\testsem.c -Next=Root.Source Files.Source Files\test...\..\..\test\testthd.c - -[Root.Source Files.Source Files\test...\..\..\test\testthd.c] -ElemType=File -PathName=..\..\..\test\testthd.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -i..\..\..\os\hal\platforms\stm8l +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -ll -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,11,12,20,27,7 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -i..\..\..\os\hal\platforms\stm8l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\boards\st_stm8l_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2012,1,23,18,22,6 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\boards\st_stm8l_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\boards\st_stm8l_discovery\board.h] -ElemType=File -PathName=..\..\..\boards\st_stm8l_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal -Next=Root.Include Files.Include Files\test - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L] -ElemType=Folder -PathName=Include Files\os\hal\STM8L -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_mdp.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_mdp.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_mdp.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_md.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_md.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_md.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_hd.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_hd.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_hd.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\stm8l15x.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\stm8l15x.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\stm8l15x.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.h] -ElemType=File -PathName=..\..\..\os\ports\cosmic\stm8\chcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\test] -ElemType=Folder -PathName=Include Files\test -Child=Root.Include Files.Include Files\test...\..\..\test\test.h - -[Root.Include Files.Include Files\test...\..\..\test\test.h] -ElemType=File -PathName=..\..\..\test\test.h -Next=Root.Include Files.Include Files\test...\..\..\test\testbmk.h - -[Root.Include Files.Include Files\test...\..\..\test\testbmk.h] -ElemType=File -PathName=..\..\..\test\testbmk.h -Next=Root.Include Files.Include Files\test...\..\..\test\testdyn.h - -[Root.Include Files.Include Files\test...\..\..\test\testdyn.h] -ElemType=File -PathName=..\..\..\test\testdyn.h -Next=Root.Include Files.Include Files\test...\..\..\test\testevt.h - -[Root.Include Files.Include Files\test...\..\..\test\testevt.h] -ElemType=File -PathName=..\..\..\test\testevt.h -Next=Root.Include Files.Include Files\test...\..\..\test\testheap.h - -[Root.Include Files.Include Files\test...\..\..\test\testheap.h] -ElemType=File -PathName=..\..\..\test\testheap.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmbox.h - -[Root.Include Files.Include Files\test...\..\..\test\testmbox.h] -ElemType=File -PathName=..\..\..\test\testmbox.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmsg.h - -[Root.Include Files.Include Files\test...\..\..\test\testmsg.h] -ElemType=File -PathName=..\..\..\test\testmsg.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmtx.h - -[Root.Include Files.Include Files\test...\..\..\test\testmtx.h] -ElemType=File -PathName=..\..\..\test\testmtx.h -Next=Root.Include Files.Include Files\test...\..\..\test\testpools.h - -[Root.Include Files.Include Files\test...\..\..\test\testpools.h] -ElemType=File -PathName=..\..\..\test\testpools.h -Next=Root.Include Files.Include Files\test...\..\..\test\testqueues.h - -[Root.Include Files.Include Files\test...\..\..\test\testqueues.h] -ElemType=File -PathName=..\..\..\test\testqueues.h -Next=Root.Include Files.Include Files\test...\..\..\test\testsem.h - -[Root.Include Files.Include Files\test...\..\..\test\testsem.h] -ElemType=File -PathName=..\..\..\test\testsem.h -Next=Root.Include Files.Include Files\test...\..\..\test\testthd.h - -[Root.Include Files.Include Files\test...\..\..\test\testthd.h] -ElemType=File -PathName=..\..\..\test\testthd.h \ No newline at end of file diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/vectors.c b/demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/vectors.c deleted file mode 100644 index 902fc6d374..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/cosmic/vectors.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* This inclusion allows user ISR to be added to the HAL.*/ -#if defined(_USER_ISR_) -#include "user_isr.h" -#endif - -/** - * @brief Exception handler type. - */ -typedef void @far @interrupt (*interrupt_handler_t)(void); - -/* - * Various external symbols. - */ -void _stext(void); -@far @interrupt void vector_trap(void); -@far @interrupt void vector0(void); -@far @interrupt void vector1(void); -@far @interrupt void vector2(void); -@far @interrupt void vector3(void); -@far @interrupt void vector4(void); -@far @interrupt void vector5(void); -@far @interrupt void vector6(void); -@far @interrupt void vector7(void); -@far @interrupt void vector8(void); -@far @interrupt void vector9(void); -@far @interrupt void vector10(void); -@far @interrupt void vector11(void); -@far @interrupt void vector12(void); -@far @interrupt void vector13(void); -@far @interrupt void vector14(void); -@far @interrupt void vector15(void); -@far @interrupt void vector16(void); -@far @interrupt void vector17(void); -@far @interrupt void vector18(void); -@far @interrupt void vector19(void); -@far @interrupt void vector20(void); -@far @interrupt void vector21(void); -@far @interrupt void vector22(void); -@far @interrupt void vector23(void); -@far @interrupt void vector24(void); -@far @interrupt void vector25(void); -@far @interrupt void vector26(void); -@far @interrupt void vector27(void); -@far @interrupt void vector28(void); -@far @interrupt void vector29(void); - -/** - * @brief Exception vector type. - */ -typedef struct { - uint8_t ev_instruction; - interrupt_handler_t ev_handler; -} exception_vector_t; - -/** - * @brief Unhandled exception handler. - * @default This function is the default handler for all unused entries - * in the vector table. - */ -@far @interrupt void _unhandled_exception (void) -{ - while (TRUE) - ; -} - -/** - * @brief Exceptions table. - */ -exception_vector_t const _vectab[] = { - {0x82, (interrupt_handler_t)_stext}, /* reset */ - -#if defined(_TRAP_ISR) - {0x82, vector_trap}, -#else - {0x82, _unhandled_exception}, /* trap */ -#endif - -#if defined(_TLI_ISR) - {0x82, vector0}, -#else - {0x82, _unhandled_exception}, /* vector0 */ -#endif - -#if defined(_FLASH_ISR) - {0x82, vector1}, -#else - {0x82, _unhandled_exception}, /* vector1 */ -#endif - -#if defined(_DMA10_ISR) || defined(_DMA11_ISR) - {0x82, vector2}, -#else - {0x82, _unhandled_exception}, /* vector2 */ -#endif - -#if defined(_DMA12_ISR) || defined(_DMA13_ISR) - {0x82, vector3}, -#else - {0x82, _unhandled_exception}, /* vector3 */ -#endif - -#if defined(_RTC_ISR) || defined(_LSE_CSS_ISR) - {0x82, vector4}, -#else - {0x82, _unhandled_exception}, /* vector4 */ -#endif - -#if defined(_EXTIE_ISR) || defined(_EXTIF_ISR) || defined(_PVD_ISR) - {0x82, vector5}, -#else - {0x82, _unhandled_exception}, /* vector5 */ -#endif - -#if defined(_EXTIB_ISR) || defined(_EXTIG_ISR) - {0x82, vector6}, -#else - {0x82, _unhandled_exception}, /* vector6 */ -#endif - -#if defined(_EXTID_ISR) || defined(_EXTIH_ISR) - {0x82, vector7}, -#else - {0x82, _unhandled_exception}, /* vector7 */ -#endif - -#if defined(_EXTI0_ISR) - {0x82, vector8}, -#else - {0x82, _unhandled_exception}, /* vector8 */ -#endif - -#if defined(_EXTI1_ISR) - {0x82, vector9}, -#else - {0x82, _unhandled_exception}, /* vector9 */ -#endif - -#if defined(_EXTI2_ISR) - {0x82, vector10}, -#else - {0x82, _unhandled_exception}, /* vector10 */ -#endif - -#if defined(_EXTI3_ISR) - {0x82, vector11}, -#else - {0x82, _unhandled_exception}, /* vector11 */ -#endif - -#if defined(_EXTI4_ISR) - {0x82, vector12}, -#else - {0x82, _unhandled_exception}, /* vector12 */ -#endif - -#if defined(_EXTI5_ISR) - {0x82, vector13}, -#else - {0x82, _unhandled_exception}, /* vector13 */ -#endif - -#if defined(_EXTI6_ISR) - {0x82, vector14}, -#else - {0x82, _unhandled_exception}, /* vector14 */ -#endif - -#if defined(_EXTI7_ISR) - {0x82, vector15}, -#else - {0x82, _unhandled_exception}, /* vector15 */ -#endif - -#if defined(_LCD_ISR) || defined(_AES_ISR) - {0x82, vector16}, -#else - {0x82, _unhandled_exception}, /* vector16 */ -#endif - -#if defined(_CLK_ISR) || defined(_TIM1_BREAK_ISR) || defined(_DAC_ISR) - {0x82, vector17}, -#else - {0x82, _unhandled_exception}, /* vector17 */ -#endif - -#if defined(_COMP1_ISR) || defined(_COMP2_ISR) || defined(_ADC1_ISR) - {0x82, vector18}, -#else - {0x82, _unhandled_exception}, /* vector18 */ -#endif - -#if defined(_TIM2_UPDATE_ISR) || defined(_USART2_TRANSMIT_ISR) - {0x82, vector19}, -#else - {0x82, _unhandled_exception}, /* vector19 */ -#endif - -#if defined(_TIM2_COMPARE_ISR) || defined(_USART2_RECEIVE_ISR) - {0x82, vector20}, -#else - {0x82, _unhandled_exception}, /* vector20 */ -#endif - -#if defined(_TIM3_UPDATE_ISR) || defined(_USART3_TRANSMIT_ISR) - {0x82, vector21}, -#else - {0x82, _unhandled_exception}, /* vector21 */ -#endif - -#if defined(_TIM3_COMPARE_ISR) || defined(_USART3_RECEIVE_ISR) - {0x82, vector22}, -#else - {0x82, _unhandled_exception}, /* vector22 */ -#endif - -#if defined(_TIM1_UPDATE_ISR) - {0x82, vector23}, -#else - {0x82, _unhandled_exception}, /* vector23 */ -#endif - -#if defined(_TIM1_COMPARE_ISR) - {0x82, vector24}, -#else - {0x82, _unhandled_exception}, /* vector24 */ -#endif - -#if defined(_TIM4_UPDATE_ISR) - {0x82, vector25}, -#else - {0x82, _unhandled_exception}, /* vector25 */ -#endif - -#if defined(_SPI1_ISR) - {0x82, vector26}, -#else - {0x82, _unhandled_exception}, /* vector26 */ -#endif - -#if defined(_TIM5_UPDATE_ISR) || defined(_USART1_TRANSMIT_ISR) - {0x82, vector27}, -#else - {0x82, _unhandled_exception}, /* vector27 */ -#endif - -#if defined(_TIM5_COMPARE_ISR) || defined(_USART1_RECEIVE_ISR) - {0x82, vector28}, -#else - {0x82, _unhandled_exception}, /* vector28 */ -#endif - -#if defined(_SPI2_ISR) || defined(_I2C1_ISR) - {0x82, vector29}, -#else - {0x82, _unhandled_exception}, /* vector29 */ -#endif -}; diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/chconf.h b/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/chconf.h deleted file mode 100644 index 18b92af502..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 100 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 10 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/halconf.h b/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/main.c b/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/main.c deleted file mode 100644 index 8450914047..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/main.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 64); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOC, PC_LED4); - chThdSleepMilliseconds(250); - palClearPad(GPIOC, PC_LED4); - chThdSleepMilliseconds(250); - palSetPad(GPIOE, PE_LED3); - chThdSleepMilliseconds(250); - palClearPad(GPIOE, PE_LED3); - chThdSleepMilliseconds(250); - } - return 0; -} - -/* - * Application entry point. - */ -void main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - * The STM8L-Discovery requires USART1 pins remapping on PA2 and PA3. - */ - SYSCFG->RMPCR1 = 0x1C; - sdStart(&SD1, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - if (palReadPad(GPIOC, PC_BUTTON) == PAL_LOW) - TestThread(&SD1); - chThdSleepMilliseconds(1000); - } -} diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/mcuconf.h b/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/mcuconf.h deleted file mode 100644 index 95aa218453..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/demo/mcuconf.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM8 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL general settings. - */ -#define STM8L_NO_CLOCK_INIT FALSE -#define STM8L_HSI_ENABLED TRUE -#define STM8L_LSI_ENABLED TRUE -#define STM8L_HSE_ENABLED FALSE -#define STM8L_LSE_ENABLED TRUE -#define STM8L_SYSCLK_SOURCE CLK_SYSSEL_HSI -#define STM8L_SYSCLK_DIVIDER CLK_SYSCLK_DIV1 -#define STM8L_RTCCLK_SOURCE CLK_RTCSEL_LSE -#define STM8L_RTCCLK_DIVIDER CLK_RTCCLK_DIV1 - -/* - * SERIAL driver system settings. - */ -#define STM8L_SERIAL_USE_USART1 TRUE -#define STM8L_SERIAL_USE_USART2 FALSE -#define STM8L_SERIAL_USE_USART3 FALSE diff --git a/demos/STM8L-STM8L152-DISCOVERY-STVD/raisonance/raisonance.stp b/demos/STM8L-STM8L152-DISCOVERY-STVD/raisonance/raisonance.stp deleted file mode 100644 index 508b7693d9..0000000000 --- a/demos/STM8L-STM8L152-DISCOVERY-STVD/raisonance/raisonance.stp +++ /dev/null @@ -1,2215 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=raisonance -Toolset=Raisonance - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=raisonance -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,4,10,30,46 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\STM8;INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\boards\st_stm8l_discovery;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\hal\include;..\..\..\os\hal\src;..\..\..\test;..\..\..\os\ports\rc\stm8;..\..\..\os\hal\platforms\stm8l; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,11,12,20,6,17 -String.100.0=STM8L152C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,32,28 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] DEBUGLINES DEBUGPUBLICS DEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,11,13,16,33,31 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x101) EEPROMSTART(0x1000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,4,11,25,50 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\STM8;INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,11,13,17,40,20 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\boards\st_stm8l_discovery;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\hal\include;..\..\..\os\hal\src;..\..\..\os\ports\rc\stm8;..\..\..\os\hal\platforms\stm8l;..\..\..\test; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,11,12,20,6,17 -String.100.0=STM8L152C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] NODEBUGLINES NODEBUGPUBLICS NODEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,11,13,16,33,31 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x101) EEPROMSTART(0x1000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,32,28 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.Source Files\board -Config.0=Root.Source Files...\demo\main.c.Config.0 -Config.1=Root.Source Files...\demo\main.c.Config.1 - -[Root.Source Files...\demo\main.c.Config.0] -Settings.0.0=Root.Source Files...\demo\main.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files...\demo\main.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files...\demo\main.c.Config.0.Settings.2 - -[Root.Source Files...\demo\main.c.Config.1] -Settings.1.0=Root.Source Files...\demo\main.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files...\demo\main.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files...\demo\main.c.Config.1.Settings.2 - -[Root.Source Files...\demo\main.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files...\demo\main.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\boards\st_stm8l_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board...\..\..\boards\st_stm8l_discovery\board.c] -ElemType=File -PathName=..\..\..\boards\st_stm8l_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal -Next=Root.Source Files.Source Files\test - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L] -ElemType=Folder -PathName=Source Files\os\hal\STM8L -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\serial_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\shared_isr.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\shared_isr.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\shared_isr.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,29,17 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,29,17 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,29,17 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,26,10 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,29,17 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\rc\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\rc\stm8\chcore.c] -ElemType=File -PathName=..\..\..\os\ports\rc\stm8\chcore.c - -[Root.Source Files.Source Files\test] -ElemType=Folder -PathName=Source Files\test -Child=Root.Source Files.Source Files\test...\..\..\test\testthd.c -Config.0=Root.Source Files.Source Files\test.Config.0 -Config.1=Root.Source Files.Source Files\test.Config.1 - -[Root.Source Files.Source Files\test.Config.0] -Settings.0.0=Root.Source Files.Source Files\test.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\test.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\test.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\test.Config.0.Settings.3 - -[Root.Source Files.Source Files\test.Config.1] -Settings.1.0=Root.Source Files.Source Files\test.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\test.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\test.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\test.Config.1.Settings.3 - -[Root.Source Files.Source Files\test.Config.0.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\test.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\test.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\test.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\test.Config.1.Settings.0] -String.6.0=2010,11,12,20,29,54 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\test.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\test.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Source Files.Source Files\test.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\test...\..\..\test\testthd.c] -ElemType=File -PathName=..\..\..\test\testthd.c -Next=Root.Source Files.Source Files\test...\..\..\test\testsem.c - -[Root.Source Files.Source Files\test...\..\..\test\testsem.c] -ElemType=File -PathName=..\..\..\test\testsem.c -Next=Root.Source Files.Source Files\test...\..\..\test\testqueues.c - -[Root.Source Files.Source Files\test...\..\..\test\testqueues.c] -ElemType=File -PathName=..\..\..\test\testqueues.c -Next=Root.Source Files.Source Files\test...\..\..\test\testpools.c - -[Root.Source Files.Source Files\test...\..\..\test\testpools.c] -ElemType=File -PathName=..\..\..\test\testpools.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmtx.c - -[Root.Source Files.Source Files\test...\..\..\test\testmtx.c] -ElemType=File -PathName=..\..\..\test\testmtx.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmsg.c - -[Root.Source Files.Source Files\test...\..\..\test\testmsg.c] -ElemType=File -PathName=..\..\..\test\testmsg.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmbox.c - -[Root.Source Files.Source Files\test...\..\..\test\testmbox.c] -ElemType=File -PathName=..\..\..\test\testmbox.c -Next=Root.Source Files.Source Files\test...\..\..\test\testheap.c - -[Root.Source Files.Source Files\test...\..\..\test\testheap.c] -ElemType=File -PathName=..\..\..\test\testheap.c -Next=Root.Source Files.Source Files\test...\..\..\test\testevt.c - -[Root.Source Files.Source Files\test...\..\..\test\testevt.c] -ElemType=File -PathName=..\..\..\test\testevt.c -Next=Root.Source Files.Source Files\test...\..\..\test\testdyn.c - -[Root.Source Files.Source Files\test...\..\..\test\testdyn.c] -ElemType=File -PathName=..\..\..\test\testdyn.c -Next=Root.Source Files.Source Files\test...\..\..\test\testbmk.c - -[Root.Source Files.Source Files\test...\..\..\test\testbmk.c] -ElemType=File -PathName=..\..\..\test\testbmk.c -Next=Root.Source Files.Source Files\test...\..\..\test\test.c - -[Root.Source Files.Source Files\test...\..\..\test\test.c] -ElemType=File -PathName=..\..\..\test\test.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\boards\st_stm8l_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) PIN(..\..\..\os\hal\platforms\stm8l) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,11,12,20,27,7 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\boards\st_stm8l_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\boards\st_stm8l_discovery\board.h] -ElemType=File -PathName=..\..\..\boards\st_stm8l_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal -Next=Root.Include Files.Include Files\test - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L] -ElemType=Folder -PathName=Include Files\os\hal\STM8L -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\serial_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\pal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_mdp.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_mdp.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_mdp.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_md.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_md.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_md.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_hd.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_hd.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld_stm8l_hd.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\hal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\hal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\stm8l15x.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\STM8L...\..\..\os\hal\platforms\stm8l\stm8l15x.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8l\stm8l15x.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\os\ports\rc\stm8\chtypes.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chcore.h] -ElemType=File -PathName=..\..\..\os\ports\rc\stm8\chcore.h - -[Root.Include Files.Include Files\test] -ElemType=Folder -PathName=Include Files\test -Child=Root.Include Files.Include Files\test...\..\..\test\testsem.h - -[Root.Include Files.Include Files\test...\..\..\test\testsem.h] -ElemType=File -PathName=..\..\..\test\testsem.h -Next=Root.Include Files.Include Files\test...\..\..\test\testqueues.h - -[Root.Include Files.Include Files\test...\..\..\test\testqueues.h] -ElemType=File -PathName=..\..\..\test\testqueues.h -Next=Root.Include Files.Include Files\test...\..\..\test\testpools.h - -[Root.Include Files.Include Files\test...\..\..\test\testpools.h] -ElemType=File -PathName=..\..\..\test\testpools.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmtx.h - -[Root.Include Files.Include Files\test...\..\..\test\testmtx.h] -ElemType=File -PathName=..\..\..\test\testmtx.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmsg.h - -[Root.Include Files.Include Files\test...\..\..\test\testmsg.h] -ElemType=File -PathName=..\..\..\test\testmsg.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmbox.h - -[Root.Include Files.Include Files\test...\..\..\test\testmbox.h] -ElemType=File -PathName=..\..\..\test\testmbox.h -Next=Root.Include Files.Include Files\test...\..\..\test\testheap.h - -[Root.Include Files.Include Files\test...\..\..\test\testheap.h] -ElemType=File -PathName=..\..\..\test\testheap.h -Next=Root.Include Files.Include Files\test...\..\..\test\testevt.h - -[Root.Include Files.Include Files\test...\..\..\test\testevt.h] -ElemType=File -PathName=..\..\..\test\testevt.h -Next=Root.Include Files.Include Files\test...\..\..\test\testdyn.h - -[Root.Include Files.Include Files\test...\..\..\test\testdyn.h] -ElemType=File -PathName=..\..\..\test\testdyn.h -Next=Root.Include Files.Include Files\test...\..\..\test\testbmk.h - -[Root.Include Files.Include Files\test...\..\..\test\testbmk.h] -ElemType=File -PathName=..\..\..\test\testbmk.h -Next=Root.Include Files.Include Files\test...\..\..\test\test.h - -[Root.Include Files.Include Files\test...\..\..\test\test.h] -ElemType=File -PathName=..\..\..\test\test.h -Next=Root.Include Files.Include Files\test...\..\..\test\testthd.h - -[Root.Include Files.Include Files\test...\..\..\test\testthd.h] -ElemType=File -PathName=..\..\..\test\testthd.h \ No newline at end of file diff --git a/demos/STM8S-STM8S105-DISCOVERY-IAR/ch.ewp b/demos/STM8S-STM8S105-DISCOVERY-IAR/ch.ewp deleted file mode 100644 index 7b9761816b..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-IAR/ch.ewp +++ /dev/null @@ -1,1770 +0,0 @@ - - - - 2 - - Debug - - STM8 - - 1 - - General - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - ICCSTM8 - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ASTM8 - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 0 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 2 - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 2 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - STM8 - - 0 - - General - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - ICCSTM8 - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ASTM8 - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 0 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 2 - - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 2 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\boards\ST_STM8S_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\boards\ST_STM8S_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\os\hal\include\spi.h - - - - src - - $PROJ_DIR$\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\os\hal\src\spi.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\os\kernel\include\chbsem.h - - - $PROJ_DIR$\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\os\kernel\include\chfiles.h - - - $PROJ_DIR$\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\hal_lld.c - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\hal_lld.h - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\pal_lld.c - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\pal_lld.h - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\serial_lld.c - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\serial_lld.h - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\spi_lld.c - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\spi_lld.h - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\stm8s.h - - - $PROJ_DIR$\..\..\os\hal\platforms\STM8S\stm8s_type.h - - - - port - - $PROJ_DIR$\..\..\os\ports\IAR\STM8\chcore.c - - - $PROJ_DIR$\..\..\os\ports\IAR\STM8\chcore.h - - - $PROJ_DIR$\..\..\os\ports\IAR\STM8\chcore_stm8.s - - - $PROJ_DIR$\..\..\os\ports\IAR\STM8\chtypes.h - - - - - $PROJ_DIR$\chconf.h - - - $PROJ_DIR$\halconf.h - - - $PROJ_DIR$\main.c - - - $PROJ_DIR$\mcuconf.h - - - - diff --git a/demos/STM8S-STM8S105-DISCOVERY-IAR/ch.eww b/demos/STM8S-STM8S105-DISCOVERY-IAR/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-IAR/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/demos/STM8S-STM8S105-DISCOVERY-IAR/chconf.h b/demos/STM8S-STM8S105-DISCOVERY-IAR/chconf.h deleted file mode 100644 index b7180026da..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-IAR/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 100 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 10 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT FALSE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES FALSE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/STM8S-STM8S105-DISCOVERY-IAR/halconf.h b/demos/STM8S-STM8S105-DISCOVERY-IAR/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-IAR/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/STM8S-STM8S105-DISCOVERY-IAR/main.c b/demos/STM8S-STM8S105-DISCOVERY-IAR/main.c deleted file mode 100644 index 86cea38931..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-IAR/main.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 64); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOD, PD_LD10); - chThdSleepMilliseconds(500); - palSetPad(GPIOD, PD_LD10); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -void main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - if (palReadPad(GPIOG, 0) == PAL_LOW) - /*TestThread(&SD2)*/; - if (palReadPad(GPIOG, 1) == PAL_LOW) - sdWriteTimeout(&SD2, "Hello World!\r\n", 14, TIME_INFINITE); - chThdSleepMilliseconds(1000); - } -} diff --git a/demos/STM8S-STM8S105-DISCOVERY-IAR/mcuconf.h b/demos/STM8S-STM8S105-DISCOVERY-IAR/mcuconf.h deleted file mode 100644 index 4b1082e5ac..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-IAR/mcuconf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM8 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL general settings. - */ -#define STM8S_NO_CLOCK_INIT FALSE -#define STM8S_HSI_ENABLED FALSE -#define STM8S_LSI_ENABLED TRUE -#define STM8S_HSE_ENABLED TRUE -#define STM8S_SYSCLK_SOURCE CLK_SYSSEL_HSE -#define STM8S_HSI_DIVIDER CLK_HSI_DIV1 -#define STM8S_CPU_DIVIDER CLK_CPU_DIV1 - -/* - * SERIAL driver system settings. - */ -#define STM8S_SERIAL_USE_UART1 FALSE -#define STM8S_SERIAL_USE_UART2 TRUE -#define STM8S_SERIAL_USE_UART3 FALSE - -/* - * SPI driver system settings. - */ -#define STM8S_SPI_USE_SPI TRUE -#define STM8S_SPI_ERROR_HOOK(spip) chSysHalt() diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/ChibiOS-RT.stw b/demos/STM8S-STM8S105-DISCOVERY-STVD/ChibiOS-RT.stw deleted file mode 100644 index a6630271a8..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/ChibiOS-RT.stw +++ /dev/null @@ -1,16 +0,0 @@ -; STMicroelectronics Workspace file - -[Version] -Keyword=ST7Workspace-V0.7 - -[Project0] -Filename=cosmic\cosmic.stp -Dependencies= - -[Project1] -Filename=raisonance\raisonance.stp -Dependencies= -[Options] -ActiveProject=cosmic -ActiveConfig=Release -AddSortedElements=0 diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/cosmic.stp b/demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/cosmic.stp deleted file mode 100644 index c9868a0f1c..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/cosmic.stp +++ /dev/null @@ -1,2072 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=cosmic -Toolset=STM8 Cosmic - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=cosmic -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\ports\cosmic\stm8;..\..\..\boards\st_stm8s_discovery;..\..\..\os\hal\platforms\stm8s;..\..\..\os\hal\include;..\..\..\os\hal\src;..\..\..\test;..\demo; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,5,25,14,45,56 -String.100.0=STM8S105C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,26,17,30,51 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,6,4,10,29,4 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x4000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x100 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x100 -m 0x700 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x4000-0x43ff]=.eeprom -String.103.2=Zero Page[0x0-0xff]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x100-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\ports\cosmic\stm8;..\..\..\boards\st_stm8s_discovery;..\..\..\os\hal\platforms\stm8s;..\..\..\os\hal\include;..\..\..\os\hal\src;..\..\..\test;..\demo; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,5,25,14,45,56 -String.100.0=STM8S105C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,6,5,11,53,48 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x4000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x100 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x100 -m 0x700 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x4000-0x43ff]=.eeprom -String.103.2=Zero Page[0x0-0xff]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x100-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files.Source Files\test -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\test] -ElemType=Folder -PathName=Source Files\test -Child=Root.Source Files.Source Files\test...\..\..\test\testthd.c -Next=Root.Source Files.vectors.c - -[Root.Source Files.Source Files\test...\..\..\test\testthd.c] -ElemType=File -PathName=..\..\..\test\testthd.c -Next=Root.Source Files.Source Files\test...\..\..\test\testsem.c - -[Root.Source Files.Source Files\test...\..\..\test\testsem.c] -ElemType=File -PathName=..\..\..\test\testsem.c -Next=Root.Source Files.Source Files\test...\..\..\test\testqueues.c - -[Root.Source Files.Source Files\test...\..\..\test\testqueues.c] -ElemType=File -PathName=..\..\..\test\testqueues.c -Next=Root.Source Files.Source Files\test...\..\..\test\testpools.c - -[Root.Source Files.Source Files\test...\..\..\test\testpools.c] -ElemType=File -PathName=..\..\..\test\testpools.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmtx.c - -[Root.Source Files.Source Files\test...\..\..\test\testmtx.c] -ElemType=File -PathName=..\..\..\test\testmtx.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmsg.c - -[Root.Source Files.Source Files\test...\..\..\test\testmsg.c] -ElemType=File -PathName=..\..\..\test\testmsg.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmbox.c - -[Root.Source Files.Source Files\test...\..\..\test\testmbox.c] -ElemType=File -PathName=..\..\..\test\testmbox.c -Next=Root.Source Files.Source Files\test...\..\..\test\testheap.c - -[Root.Source Files.Source Files\test...\..\..\test\testheap.c] -ElemType=File -PathName=..\..\..\test\testheap.c -Next=Root.Source Files.Source Files\test...\..\..\test\testevt.c - -[Root.Source Files.Source Files\test...\..\..\test\testevt.c] -ElemType=File -PathName=..\..\..\test\testevt.c -Next=Root.Source Files.Source Files\test...\..\..\test\testdyn.c - -[Root.Source Files.Source Files\test...\..\..\test\testdyn.c] -ElemType=File -PathName=..\..\..\test\testdyn.c -Next=Root.Source Files.Source Files\test...\..\..\test\testbmk.c - -[Root.Source Files.Source Files\test...\..\..\test\testbmk.c] -ElemType=File -PathName=..\..\..\test\testbmk.c -Next=Root.Source Files.Source Files\test...\..\..\test\test.c - -[Root.Source Files.Source Files\test...\..\..\test\test.c] -ElemType=File -PathName=..\..\..\test\test.c - -[Root.Source Files.vectors.c] -ElemType=File -PathName=vectors.c -Next=Root.Source Files...\demo\main.c - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.Source Files\board - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\boards\st_stm8s_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board...\..\..\boards\st_stm8s_discovery\board.c] -ElemType=File -PathName=..\..\..\boards\st_stm8s_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s] -ElemType=Folder -PathName=Source Files\os\hal\stm8s -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\spi_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,6,3,11,20,12 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,54,38 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,6,3,11,20,12 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,6,2,17,48,49 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,54,38 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,6,2,17,48,49 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.c] -ElemType=File -PathName=..\..\..\os\ports\cosmic\stm8\chcore.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\chconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\os\hal\include -i..\..\..\os\hal\platforms\stm8s -i..\..\..\boards\st_stm8s_discovery -i..\..\..\os\ports\cosmic\stm8 -i..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\halconf.h - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\boards\st_stm8s_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\boards\st_stm8s_discovery\board.h] -ElemType=File -PathName=..\..\..\boards\st_stm8s_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal -Next=Root.Include Files.Include Files\test - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s] -ElemType=Folder -PathName=Include Files\os\hal\stm8s -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\spi_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\hal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\stm8s.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s_type.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chioch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chioch.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chioch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chcore.h] -ElemType=File -PathName=..\..\..\os\ports\cosmic\stm8\chcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\cosmic\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\test] -ElemType=Folder -PathName=Include Files\test -Child=Root.Include Files.Include Files\test...\..\..\test\testthd.h - -[Root.Include Files.Include Files\test...\..\..\test\testthd.h] -ElemType=File -PathName=..\..\..\test\testthd.h -Next=Root.Include Files.Include Files\test...\..\..\test\testsem.h - -[Root.Include Files.Include Files\test...\..\..\test\testsem.h] -ElemType=File -PathName=..\..\..\test\testsem.h -Next=Root.Include Files.Include Files\test...\..\..\test\testqueues.h - -[Root.Include Files.Include Files\test...\..\..\test\testqueues.h] -ElemType=File -PathName=..\..\..\test\testqueues.h -Next=Root.Include Files.Include Files\test...\..\..\test\testpools.h - -[Root.Include Files.Include Files\test...\..\..\test\testpools.h] -ElemType=File -PathName=..\..\..\test\testpools.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmtx.h - -[Root.Include Files.Include Files\test...\..\..\test\testmtx.h] -ElemType=File -PathName=..\..\..\test\testmtx.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmsg.h - -[Root.Include Files.Include Files\test...\..\..\test\testmsg.h] -ElemType=File -PathName=..\..\..\test\testmsg.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmbox.h - -[Root.Include Files.Include Files\test...\..\..\test\testmbox.h] -ElemType=File -PathName=..\..\..\test\testmbox.h -Next=Root.Include Files.Include Files\test...\..\..\test\testheap.h - -[Root.Include Files.Include Files\test...\..\..\test\testheap.h] -ElemType=File -PathName=..\..\..\test\testheap.h -Next=Root.Include Files.Include Files\test...\..\..\test\testevt.h - -[Root.Include Files.Include Files\test...\..\..\test\testevt.h] -ElemType=File -PathName=..\..\..\test\testevt.h -Next=Root.Include Files.Include Files\test...\..\..\test\testdyn.h - -[Root.Include Files.Include Files\test...\..\..\test\testdyn.h] -ElemType=File -PathName=..\..\..\test\testdyn.h -Next=Root.Include Files.Include Files\test...\..\..\test\testbmk.h - -[Root.Include Files.Include Files\test...\..\..\test\testbmk.h] -ElemType=File -PathName=..\..\..\test\testbmk.h -Next=Root.Include Files.Include Files\test...\..\..\test\test.h - -[Root.Include Files.Include Files\test...\..\..\test\test.h] -ElemType=File -PathName=..\..\..\test\test.h \ No newline at end of file diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/vectors.c b/demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/vectors.c deleted file mode 100644 index ed3570a876..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/cosmic/vectors.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief Exception handler type. - */ -typedef void @far @interrupt (*interrupt_handler_t)(void); - -/* - * Various external symbols. - */ -void _stext(void); -@far @interrupt void vector10(void); -@far @interrupt void vector13(void); -@far @interrupt void vector17(void); -@far @interrupt void vector18(void); -@far @interrupt void vector20(void); -@far @interrupt void vector21(void); - -/** - * @brief Exception vector type. - */ -typedef struct { - uint8_t ev_instruction; - interrupt_handler_t ev_handler; -} exception_vector_t; - -/** - * @brief Undefined interrupt handler. - * @note It should never be invoked. - */ -@far @interrupt static void vector (void) -{ - return; -} - -/** - * @brief Exceptions table. - */ -exception_vector_t const _vectab[] = { - {0x82, (interrupt_handler_t)_stext}, /* reset */ - {0x82, vector}, /* trap */ - {0x82, vector}, /* vector0 */ - {0x82, vector}, /* vector1 */ - {0x82, vector}, /* vector2 */ - {0x82, vector}, /* vector3 */ - {0x82, vector}, /* vector4 */ - {0x82, vector}, /* vector5 */ - {0x82, vector}, /* vector6 */ - {0x82, vector}, /* vector7 */ - {0x82, vector}, /* vector8 */ - {0x82, vector}, /* vector9 */ -#if HAL_USE_SPI && STM8S_SPI_USE_SPI - {0x82, vector10}, -#else - {0x82, vector}, /* vector10 */ -#endif - {0x82, vector}, /* vector11 */ - {0x82, vector}, /* vector12 */ - {0x82, vector13}, /* vector13 */ - {0x82, vector}, /* vector14 */ - {0x82, vector}, /* vector15 */ - {0x82, vector}, /* vector16 */ -#if HAL_USE_SERIAL && STM8S_SERIAL_USE_UART1 - {0x82, vector17}, /* vector17 */ - {0x82, vector18}, /* vector18 */ -#else - {0x82, vector}, /* vector17 */ - {0x82, vector}, /* vector18 */ -#endif - {0x82, vector}, /* vector19 */ -#if HAL_USE_SERIAL && (STM8S_SERIAL_USE_UART2 || STM8S_SERIAL_USE_UART3) - {0x82, vector20}, /* vector20 */ - {0x82, vector21}, /* vector21 */ -#else - {0x82, vector}, /* vector20 */ - {0x82, vector}, /* vector21 */ -#endif - {0x82, vector}, /* vector22 */ - {0x82, vector}, /* vector23 */ - {0x82, vector}, /* vector24 */ - {0x82, vector}, /* vector25 */ - {0x82, vector}, /* vector26 */ - {0x82, vector}, /* vector27 */ - {0x82, vector}, /* vector28 */ - {0x82, vector}, /* vector29 */ -}; diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/chconf.h b/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/chconf.h deleted file mode 100644 index 18b92af502..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 100 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 10 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/halconf.h b/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/main.c b/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/main.c deleted file mode 100644 index 56490cde07..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/main.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 64); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOD, PD_LD10); - chThdSleepMilliseconds(500); - palSetPad(GPIOD, PD_LD10); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -void main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - if (palReadPad(GPIOG, 0) == PAL_LOW) - TestThread(&SD2); - if (palReadPad(GPIOG, 1) == PAL_LOW) - sdWriteTimeout(&SD2, "Hello World!\r\n", 14, TIME_INFINITE); - chThdSleepMilliseconds(1000); - } -} diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/mcuconf.h b/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/mcuconf.h deleted file mode 100644 index 4b1082e5ac..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/demo/mcuconf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM8 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL general settings. - */ -#define STM8S_NO_CLOCK_INIT FALSE -#define STM8S_HSI_ENABLED FALSE -#define STM8S_LSI_ENABLED TRUE -#define STM8S_HSE_ENABLED TRUE -#define STM8S_SYSCLK_SOURCE CLK_SYSSEL_HSE -#define STM8S_HSI_DIVIDER CLK_HSI_DIV1 -#define STM8S_CPU_DIVIDER CLK_CPU_DIV1 - -/* - * SERIAL driver system settings. - */ -#define STM8S_SERIAL_USE_UART1 FALSE -#define STM8S_SERIAL_USE_UART2 TRUE -#define STM8S_SERIAL_USE_UART3 FALSE - -/* - * SPI driver system settings. - */ -#define STM8S_SPI_USE_SPI TRUE -#define STM8S_SPI_ERROR_HOOK(spip) chSysHalt() diff --git a/demos/STM8S-STM8S105-DISCOVERY-STVD/raisonance/raisonance.stp b/demos/STM8S-STM8S105-DISCOVERY-STVD/raisonance/raisonance.stp deleted file mode 100644 index e6b080fdab..0000000000 --- a/demos/STM8S-STM8S105-DISCOVERY-STVD/raisonance/raisonance.stp +++ /dev/null @@ -1,2161 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=raisonance -Toolset=Raisonance - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=raisonance -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,4,10,30,46 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\STM8;INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\boards\st_stm8s_discovery;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\hal\include;..\..\..\os\hal\platforms\stm8s;..\..\..\os\hal\src;..\..\..\test;..\..\..\os\ports\rc\stm8; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,6,4,10,10,40 -String.100.0=STM8S105C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] DEBUGLINES DEBUGPUBLICS DEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,6,4,12,15,0 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x100) EEPROMSTART(0x4000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,4,11,25,50 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\STM8;INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\boards\st_stm8s_discovery;..\..\..\os\kernel\src;..\..\..\os\kernel\include;..\..\..\os\hal\include;..\..\..\os\hal\platforms\stm8s;..\..\..\os\hal\src;..\..\..\test;..\..\..\os\ports\rc\stm8; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,6,4,10,10,40 -String.100.0=STM8S105C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] NODEBUGLINES NODEBUGPUBLICS NODEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,6,4,12,15,0 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x100) EEPROMSTART(0x4000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.Source Files\board -Config.0=Root.Source Files...\demo\main.c.Config.0 -Config.1=Root.Source Files...\demo\main.c.Config.1 - -[Root.Source Files...\demo\main.c.Config.0] -Settings.0.0=Root.Source Files...\demo\main.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files...\demo\main.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files...\demo\main.c.Config.0.Settings.2 - -[Root.Source Files...\demo\main.c.Config.1] -Settings.1.0=Root.Source Files...\demo\main.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files...\demo\main.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files...\demo\main.c.Config.1.Settings.2 - -[Root.Source Files...\demo\main.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,12,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files...\demo\main.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,12,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\boards\st_stm8s_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,6,4,10,11,42 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,6,4,10,11,42 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board...\..\..\boards\st_stm8s_discovery\board.c] -ElemType=File -PathName=..\..\..\boards\st_stm8s_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal -Next=Root.Source Files.Source Files\test - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,6,4,10,13,32 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,6,4,10,13,32 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s] -ElemType=Folder -PathName=Source Files\os\hal\stm8s -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\spi_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.c] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\rc\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,6,4,10,13,43 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,6,4,10,13,43 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\os\ports\rc\stm8\chcore.c] -ElemType=File -PathName=..\..\..\os\ports\rc\stm8\chcore.c - -[Root.Source Files.Source Files\test] -ElemType=Folder -PathName=Source Files\test -Child=Root.Source Files.Source Files\test...\..\..\test\testthd.c -Config.0=Root.Source Files.Source Files\test.Config.0 -Config.1=Root.Source Files.Source Files\test.Config.1 - -[Root.Source Files.Source Files\test.Config.0] -Settings.0.0=Root.Source Files.Source Files\test.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\test.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\test.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\test.Config.0.Settings.3 - -[Root.Source Files.Source Files\test.Config.1] -Settings.1.0=Root.Source Files.Source Files\test.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\test.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\test.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\test.Config.1.Settings.3 - -[Root.Source Files.Source Files\test.Config.0.Settings.0] -String.6.0=2010,6,4,10,11,52 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\test.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\test.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\test.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\test.Config.1.Settings.0] -String.6.0=2010,6,4,10,11,52 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\test.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\test.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\test.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\test...\..\..\test\testthd.c] -ElemType=File -PathName=..\..\..\test\testthd.c -Next=Root.Source Files.Source Files\test...\..\..\test\testsem.c - -[Root.Source Files.Source Files\test...\..\..\test\testsem.c] -ElemType=File -PathName=..\..\..\test\testsem.c -Next=Root.Source Files.Source Files\test...\..\..\test\testqueues.c - -[Root.Source Files.Source Files\test...\..\..\test\testqueues.c] -ElemType=File -PathName=..\..\..\test\testqueues.c -Next=Root.Source Files.Source Files\test...\..\..\test\testpools.c - -[Root.Source Files.Source Files\test...\..\..\test\testpools.c] -ElemType=File -PathName=..\..\..\test\testpools.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmtx.c - -[Root.Source Files.Source Files\test...\..\..\test\testmtx.c] -ElemType=File -PathName=..\..\..\test\testmtx.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmsg.c - -[Root.Source Files.Source Files\test...\..\..\test\testmsg.c] -ElemType=File -PathName=..\..\..\test\testmsg.c -Next=Root.Source Files.Source Files\test...\..\..\test\testmbox.c - -[Root.Source Files.Source Files\test...\..\..\test\testmbox.c] -ElemType=File -PathName=..\..\..\test\testmbox.c -Next=Root.Source Files.Source Files\test...\..\..\test\testheap.c - -[Root.Source Files.Source Files\test...\..\..\test\testheap.c] -ElemType=File -PathName=..\..\..\test\testheap.c -Next=Root.Source Files.Source Files\test...\..\..\test\testevt.c - -[Root.Source Files.Source Files\test...\..\..\test\testevt.c] -ElemType=File -PathName=..\..\..\test\testevt.c -Next=Root.Source Files.Source Files\test...\..\..\test\testdyn.c - -[Root.Source Files.Source Files\test...\..\..\test\testdyn.c] -ElemType=File -PathName=..\..\..\test\testdyn.c -Next=Root.Source Files.Source Files\test...\..\..\test\testbmk.c - -[Root.Source Files.Source Files\test...\..\..\test\testbmk.c] -ElemType=File -PathName=..\..\..\test\testbmk.c -Next=Root.Source Files.Source Files\test...\..\..\test\test.c - -[Root.Source Files.Source Files\test...\..\..\test\test.c] -ElemType=File -PathName=..\..\..\test\test.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\os\ports\RC\stm8) PIN(..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\os\kernel\include) PIN(..\..\..\os\hal\include) PIN(..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\boards\st_stm8s_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\boards\st_stm8s_discovery\board.h] -ElemType=File -PathName=..\..\..\boards\st_stm8s_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal -Next=Root.Include Files.Include Files\test - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s] -ElemType=Folder -PathName=Include Files\os\hal\stm8s -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\spi_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\spi_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s_type.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\stm8s_type.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\stm8s.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\stm8s.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\serial_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\pal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\os\hal\platforms\stm8s\hal_lld.h] -ElemType=File -PathName=..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chioch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chioch.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chioch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\os\ports\rc\stm8\chtypes.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\os\ports\rc\stm8\chcore.h] -ElemType=File -PathName=..\..\..\os\ports\rc\stm8\chcore.h - -[Root.Include Files.Include Files\test] -ElemType=Folder -PathName=Include Files\test -Child=Root.Include Files.Include Files\test...\..\..\test\testsem.h - -[Root.Include Files.Include Files\test...\..\..\test\testsem.h] -ElemType=File -PathName=..\..\..\test\testsem.h -Next=Root.Include Files.Include Files\test...\..\..\test\testqueues.h - -[Root.Include Files.Include Files\test...\..\..\test\testqueues.h] -ElemType=File -PathName=..\..\..\test\testqueues.h -Next=Root.Include Files.Include Files\test...\..\..\test\testpools.h - -[Root.Include Files.Include Files\test...\..\..\test\testpools.h] -ElemType=File -PathName=..\..\..\test\testpools.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmtx.h - -[Root.Include Files.Include Files\test...\..\..\test\testmtx.h] -ElemType=File -PathName=..\..\..\test\testmtx.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmsg.h - -[Root.Include Files.Include Files\test...\..\..\test\testmsg.h] -ElemType=File -PathName=..\..\..\test\testmsg.h -Next=Root.Include Files.Include Files\test...\..\..\test\testmbox.h - -[Root.Include Files.Include Files\test...\..\..\test\testmbox.h] -ElemType=File -PathName=..\..\..\test\testmbox.h -Next=Root.Include Files.Include Files\test...\..\..\test\testheap.h - -[Root.Include Files.Include Files\test...\..\..\test\testheap.h] -ElemType=File -PathName=..\..\..\test\testheap.h -Next=Root.Include Files.Include Files\test...\..\..\test\testevt.h - -[Root.Include Files.Include Files\test...\..\..\test\testevt.h] -ElemType=File -PathName=..\..\..\test\testevt.h -Next=Root.Include Files.Include Files\test...\..\..\test\testdyn.h - -[Root.Include Files.Include Files\test...\..\..\test\testdyn.h] -ElemType=File -PathName=..\..\..\test\testdyn.h -Next=Root.Include Files.Include Files\test...\..\..\test\testbmk.h - -[Root.Include Files.Include Files\test...\..\..\test\testbmk.h] -ElemType=File -PathName=..\..\..\test\testbmk.h -Next=Root.Include Files.Include Files\test...\..\..\test\test.h - -[Root.Include Files.Include Files\test...\..\..\test\test.h] -ElemType=File -PathName=..\..\..\test\test.h -Next=Root.Include Files.Include Files\test...\..\..\test\testthd.h - -[Root.Include Files.Include Files\test...\..\..\test\testthd.h] -ElemType=File -PathName=..\..\..\test\testthd.h \ No newline at end of file diff --git a/demos/STM8S-STM8S208-RC/ch.rapp b/demos/STM8S-STM8S208-RC/ch.rapp deleted file mode 100644 index 095ec08746..0000000000 --- a/demos/STM8S-STM8S208-RC/ch.rapp +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - -

- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - -
- -
- -
- - -
-
- - - - -
-
- - - -
- -
- -
- - -
-
- - - -
-
- - - -
- -
- -
- - -
- -
-
-
- \ No newline at end of file diff --git a/demos/STM8S-STM8S208-RC/ch.rprj b/demos/STM8S-STM8S208-RC/ch.rprj deleted file mode 100644 index 90c0371682..0000000000 --- a/demos/STM8S-STM8S208-RC/ch.rprj +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/demos/STM8S-STM8S208-RC/chconf.h b/demos/STM8S-STM8S208-RC/chconf.h deleted file mode 100644 index 18b92af502..0000000000 --- a/demos/STM8S-STM8S208-RC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 100 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 10 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 128 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/STM8S-STM8S208-RC/halconf.h b/demos/STM8S-STM8S208-RC/halconf.h deleted file mode 100644 index c9b3ad25a2..0000000000 --- a/demos/STM8S-STM8S208-RC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/STM8S-STM8S208-RC/main.c b/demos/STM8S-STM8S208-RC/main.c deleted file mode 100644 index f71912c238..0000000000 --- a/demos/STM8S-STM8S208-RC/main.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -/* - * LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 64); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(IOPORT2, PB_LED(7)); - chThdSleepMilliseconds(500); - palSetPad(IOPORT2, PB_LED(7)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -void main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1 using the driver default configuration. - */ - sdStart(&SD1, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - if (palReadPad(IOPORT7, PG_BT5) == PAL_LOW) - TestThread(&SD1); - if (palReadPad(IOPORT7, PG_BT6) == PAL_LOW) - sdWriteTimeout(&SD1, "Hello World!\r\n", 14, TIME_INFINITE); - chThdSleepMilliseconds(1000); - } -} diff --git a/demos/STM8S-STM8S208-RC/mcuconf.h b/demos/STM8S-STM8S208-RC/mcuconf.h deleted file mode 100644 index b6d2398f15..0000000000 --- a/demos/STM8S-STM8S208-RC/mcuconf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM8 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL general settings. - */ -#define STM8S_NO_CLOCK_INIT FALSE -#define STM8S_HSI_ENABLED TRUE -#define STM8S_LSI_ENABLED TRUE -#define STM8S_HSE_ENABLED FALSE -#define STM8S_SYSCLK_SOURCE CLK_SYSSEL_HSI -#define STM8S_HSI_DIVIDER CLK_HSI_DIV1 -#define STM8S_CPU_DIVIDER CLK_CPU_DIV1 - -/* - * SERIAL driver system settings. - */ -#define STM8S_SERIAL_USE_UART1 TRUE -#define STM8S_SERIAL_USE_UART2 FALSE -#define STM8S_SERIAL_USE_UART3 FALSE - -/* - * SPI driver system settings. - */ -#define STM8S_SPI_USE_SPI TRUE -#define STM8S_SPI_ERROR_HOOK(spip) chSysHalt() diff --git a/demos/STM8S-STM8S208-RC/readme.txt b/demos/STM8S-STM8S208-RC/readme.txt deleted file mode 100644 index 011f75c569..0000000000 --- a/demos/STM8S-STM8S208-RC/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ -***************************************************************************** -** ChibiOS/RT demo for STM8S208RB. ** -***************************************************************************** - -** TARGET ** - -The demo runs on a Raisonance REva+STM8S208RB board. - -** The Demo ** - -The demo flashes the board LED using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port. - -** Build Procedure ** - -From withing the Ride7 IDE open the project, compile and run it. diff --git a/demos/Win32-MinGW/Makefile b/demos/Win32-MinGW/Makefile deleted file mode 100644 index 73e938d44b..0000000000 --- a/demos/Win32-MinGW/Makefile +++ /dev/null @@ -1,149 +0,0 @@ -# -# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!! -# -############################################################################################## -# -# On command line: -# -# make all = Create project -# -# make clean = Clean project files. -# -# To rebuild project do "make clean" and "make all". -# - -############################################################################################## -# Start of default section -# - -TRGT = mingw32- -CC = $(TRGT)gcc -AS = $(TRGT)gcc -x assembler-with-cpp - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSIMULATOR -DSHELL_USE_IPRINTF=FALSE - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = -lws2_32 - -# -# End of default section -############################################################################################## - -############################################################################################## -# Start of user section -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT = - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/simulator/board.mk -include ${CHIBIOS}/os/hal/hal.mk -include ${CHIBIOS}/os/hal/platforms/Win32/platform.mk -include ${CHIBIOS}/os/ports/GCC/SIMIA32/port.mk -include ${CHIBIOS}/os/kernel/kernel.mk -include ${CHIBIOS}/test/test.mk - -# List C source files here -SRC = ${PORTSRC} \ - ${KERNSRC} \ - ${TESTSRC} \ - ${HALSRC} \ - ${PLATFORMSRC} \ - $(BOARDSRC) \ - ${CHIBIOS}/os/various/shell.c \ - ${CHIBIOS}/os/various/chprintf.c \ - main.c - -# List ASM source files here -ASRC = - -# List all user directories here -UINCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - ${CHIBIOS}/os/various - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# Define optimisation level here -OPT = -ggdb -O2 -fomit-frame-pointer - -# -# End of user defines -############################################################################################## - - -INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR)) -LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) -DEFS = $(DDEFS) $(UDEFS) -ADEFS = $(DADEFS) $(UADEFS) -OBJS = $(ASRC:.s=.o) $(SRC:.c=.o) -LIBS = $(DLIBS) $(ULIBS) - -LDFLAGS = -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR) -ASFLAGS = -Wa,-amhls=$(<:.s=.lst) $(ADEFS) -CPFLAGS = $(OPT) -Wall -Wextra -Wstrict-prototypes -fverbose-asm -Wa,-alms=$(<:.c=.lst) $(DEFS) - -# Generate dependency information -CPFLAGS += -MD -MP -MF .dep/$(@F).d - -# -# makefile rules -# - -all: $(OBJS) $(PROJECT).exe - -%o : %c - $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ - -%o : %s - $(AS) -c $(ASFLAGS) $< -o $@ - -%exe: $(OBJS) - $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ - -gcov: - -mkdir gcov - $(COV) -u $(subst /,\,$(SRC)) - -mv *.gcov ./gcov - -clean: - -rm -f $(OBJS) - -rm -f $(PROJECT).exe - -rm -f $(PROJECT).map - -rm -f $(SRC:.c=.c.bak) - -rm -f $(SRC:.c=.lst) - -rm -f $(ASRC:.s=.s.bak) - -rm -f $(ASRC:.s=.lst) - -rm -fR .dep - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/demos/Win32-MinGW/chconf.h b/demos/Win32-MinGW/chconf.h deleted file mode 100644 index e5794592e4..0000000000 --- a/demos/Win32-MinGW/chconf.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0x20000 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/demos/Win32-MinGW/halconf.h b/demos/Win32-MinGW/halconf.h deleted file mode 100644 index 2021371194..0000000000 --- a/demos/Win32-MinGW/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -/*#include "mcuconf.h"*/ - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/demos/Win32-MinGW/main.c b/demos/Win32-MinGW/main.c deleted file mode 100644 index 7514faebf2..0000000000 --- a/demos/Win32-MinGW/main.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "shell.h" -#include "chprintf.h" - -#define SHELL_WA_SIZE THD_WA_SIZE(4096) -#define CONSOLE_WA_SIZE THD_WA_SIZE(4096) -#define TEST_WA_SIZE THD_WA_SIZE(4096) - -#define cputs(msg) chMsgSend(cdtp, (msg_t)msg) - -static Thread *cdtp; -static Thread *shelltp1; -static Thread *shelltp2; - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.esp, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -static const ShellConfig shell_cfg2 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Console print server done using synchronous messages. This makes the access - * to the C printf() thread safe and the print operation atomic among threads. - * In this example the message is the zero terminated string itself. - */ -static msg_t console_thread(void *arg) { - - (void)arg; - while (!chThdShouldTerminate()) { - Thread *tp = chMsgWait(); - puts((char *)chMsgGet(tp)); - fflush(stdout); - chMsgRelease(tp, RDY_OK); - } - return 0; -} - -/** - * @brief Shell termination handler. - * - * @param[in] id event id. - */ -static void termination_handler(eventid_t id) { - - (void)id; - if (shelltp1 && chThdTerminated(shelltp1)) { - chThdWait(shelltp1); - shelltp1 = NULL; - chThdSleepMilliseconds(10); - cputs("Init: shell on SD1 terminated"); - chSysLock(); - chOQResetI(&SD1.oqueue); - chSysUnlock(); - } - if (shelltp2 && chThdTerminated(shelltp2)) { - chThdWait(shelltp2); - shelltp2 = NULL; - chThdSleepMilliseconds(10); - cputs("Init: shell on SD2 terminated"); - chSysLock(); - chOQResetI(&SD2.oqueue); - chSysUnlock(); - } -} - -static EventListener sd1fel, sd2fel; - -/** - * @brief SD1 status change handler. - * - * @param[in] id event id. - */ -static void sd1_handler(eventid_t id) { - flagsmask_t flags; - - (void)id; - flags = chEvtGetAndClearFlags(&sd1fel); - if ((flags & CHN_CONNECTED) && (shelltp1 == NULL)) { - cputs("Init: connection on SD1"); - shelltp1 = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO + 1); - } - if (flags & CHN_DISCONNECTED) { - cputs("Init: disconnection on SD1"); - chSysLock(); - chIQResetI(&SD1.iqueue); - chSysUnlock(); - } -} - -/** - * @brief SD2 status change handler. - * - * @param[in] id event id. - */ -static void sd2_handler(eventid_t id) { - flagsmask_t flags; - - (void)id; - flags = chEvtGetAndClearFlags(&sd2fel); - if ((flags & CHN_CONNECTED) && (shelltp2 == NULL)) { - cputs("Init: connection on SD2"); - shelltp2 = shellCreate(&shell_cfg2, SHELL_WA_SIZE, NORMALPRIO + 10); - } - if (flags & CHN_DISCONNECTED) { - cputs("Init: disconnection on SD2"); - chSysLock(); - chIQResetI(&SD2.iqueue); - chSysUnlock(); - } -} - -static evhandler_t fhandlers[] = { - termination_handler, - sd1_handler, - sd2_handler -}; - -/*------------------------------------------------------------------------* - * Simulator main. * - *------------------------------------------------------------------------*/ -int main(void) { - EventListener tel; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Serial ports (simulated) initialization. - */ - sdStart(&SD1, NULL); - sdStart(&SD2, NULL); - - /* - * Shell manager initialization. - */ - shellInit(); - chEvtRegister(&shell_terminated, &tel, 0); - - /* - * Console thread started. - */ - cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO + 1, - console_thread, NULL); - - /* - * Initializing connection/disconnection events. - */ - cputs("Shell service started on SD1, SD2"); - cputs(" - Listening for connections on SD1"); - chEvtRegister(chnGetEventSource(&SD1), &sd1fel, 1); - cputs(" - Listening for connections on SD2"); - chEvtRegister(chnGetEventSource(&SD2), &sd2fel, 2); - - /* - * Events servicing loop. - */ - while (!chThdShouldTerminate()) - chEvtDispatch(fhandlers, chEvtWaitOne(ALL_EVENTS)); - - /* - * Clean simulator exit. - */ - chEvtUnregister(chnGetEventSource(&SD1), &sd1fel); - chEvtUnregister(chnGetEventSource(&SD2), &sd2fel); - return 0; -} diff --git a/demos/Win32-MinGW/readme.txt b/demos/Win32-MinGW/readme.txt deleted file mode 100644 index 047425ffe6..0000000000 --- a/demos/Win32-MinGW/readme.txt +++ /dev/null @@ -1,33 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for x86 into a Win32 process ** -***************************************************************************** - -** TARGET ** - -The demo runs under any Windows version as an application program. The serial -I/O is simulated over TCP/IP sockets. - -** The Demo ** - -The demo listens on the two serial ports, when a connection is detected a -thread is started that serves a small command shell. -The demo shows how create/terminate threads at runtime, how listen to events, -how ho work with serial ports, how use the messages. -You can develop your ChibiOS/RT application using this demo as a simulator -then you can recompile it for a different architecture. -See demo.c for details. - -** Build Procedure ** - -The demo was built using the MinGW toolchain. - -** Connect to the demo ** - -In order to connect to the demo a telnet client is required. A good choice -is PuTTY: - -http://www.putty.org/ - -Host Name: 127.0.0.1 -Port: 29001 and/or 29002 -Connection Type: Raw diff --git a/docs/Doxyfile_chm b/docs/Doxyfile_chm deleted file mode 100644 index 8688f79c92..0000000000 --- a/docs/Doxyfile_chm +++ /dev/null @@ -1,1831 +0,0 @@ -# Doxyfile 1.7.4 - -# 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 = ChibiOS/RT - -# 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 = 2.5.1 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# 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-Cyrillic, 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 = YES - -# 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 = "C:/Documents and Settings/Administrator/" - -# 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 if your file system -# 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 = NO - -# 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 = 2 - -# 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 = "iclass=@par Function Class:\n This is an \ - I-Class API, this function can be \ - invoked from within a system lock zone by both \ - threads and interrupt handlers." \ - "sclass=@par Function Class:\n This is an \ - S-Class API, this function can be \ - invoked from within a system lock zone by threads \ - only." \ - "api=@par Function Class:\n Normal API, this \ - function can be invoked by regular system threads \ - but not from within a lock zone." \ - "notapi=@par Function Class:\n Not an API, this \ - function is for internal use only." \ - "isr=@par Function Class:\n Interrupt handler, \ - this function should not be directly invoked." \ - "init=@par Function Class:\n Initializer, this \ - function just initializes an object and can be \ - invoked before the kernel is initialized." \ - "special=@par Function Class:\n Special function, \ - this function has special requirements see the \ - notes." - -# 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 = YES - -# 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, CSharp, 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 makes 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 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 the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# 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 penalty. -# 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 roughly 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 = NO - -# 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 = NO - -# 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 namespaces 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 = YES - -# 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 = YES - -# 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 FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# 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 = NO - -# 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 - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = 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 macro 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 macros 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 = NO - -# 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 = ./rsc/layout.xml - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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 - -# The WARN_NO_PARAMDOC option can be enabled 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 = YES - -# 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 = ../docs/src \ - ../os/kernel \ - ../os/kernel/include \ - ../os/kernel/src \ - ../os/kernel/templates \ - ../os/ports \ - ../os/ports/common/ARMCMx \ - ../os/ports/GCC/ARM \ - ../os/ports/GCC/ARM/LPC214x \ - ../os/ports/GCC/ARM/AT91SAM7 \ - ../os/ports/GCC/ARMCMx \ - ../os/ports/GCC/ARMCMx/STM32F1xx \ - ../os/ports/GCC/ARMCMx/STM32L1xx \ - ../os/ports/GCC/ARMCMx/LPC11xx \ - ../os/ports/GCC/ARMCMx/LPC13xx \ - ../os/ports/GCC/PPC \ - ../os/ports/GCC/AVR \ - ../os/ports/GCC/MSP430 \ - ../os/ports/IAR/ARMCMx \ - ../os/ports/IAR/ARMCMx/STM32F1xx \ - ../os/ports/IAR/ARMCMx/STM32L1xx \ - ../os/ports/IAR/ARMCMx/LPC11xx \ - ../os/ports/IAR/ARMCMx/LPC13xx \ - ../os/ports/RVCT/ARMCMx \ - ../os/ports/RVCT/ARMCMx/STM32F1xx \ - ../os/ports/RVCT/ARMCMx/STM32L1xx \ - ../os/ports/RVCT/ARMCMx/LPC11xx \ - ../os/ports/RVCT/ARMCMx/LPC13xx \ - ../os/ports/cosmic/STM8 \ - ../os/ports/RC/STM8 \ - ../os/hal \ - ../os/hal/dox \ - ../os/hal/include \ - ../os/hal/src \ - ../os/hal/templates \ - ../os/hal/platforms \ - ../os/hal/platforms/AT91SAM7/platform.dox \ - ../os/hal/platforms/AVR/platform.dox \ - ../os/hal/platforms/LPC11xx/platform.dox \ - ../os/hal/platforms/LPC13xx/platform.dox \ - ../os/hal/platforms/LPC214x/platform.dox \ - ../os/hal/platforms/MSP430/platform.dox \ - ../os/hal/platforms/SPC56x/platform.dox \ - ../os/hal/platforms/STM32F1xx/platform.dox \ - ../os/hal/platforms/STM32F4xx/platform.dox \ - ../os/hal/platforms/STM32L1xx/platform.dox \ - ../os/hal/platforms/STM8L/platform.dox \ - ../os/hal/platforms/STM8S/platform.dox \ - ../os/various \ - ../test \ - ../ext/ext.dox - -# 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -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 \ - *.ddf \ - *.s - -# 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 = NO - -# 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 = ../os/hal/platforms/STM32F1xx/stm32f10x.h \ - ../os/hal/platforms/STM32L1xx/stm32l10x.h \ - ../os/hal/platforms/STM8/stm8s.h \ - ../os/hal/platforms/STM8/stm8s_type.h \ - ../os/hal/platforms/LPC11xx/LPC11xx.h \ - ../os/hal/platforms/LPC11xx/system_LPC11xx.h \ - ../os/hal/platforms/LPC13xx/LPC13xx.h \ - ../os/hal/platforms/LPC13xx/system_LPC13xx.h - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix file system 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 = - -# 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 = ./rsc - -# 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 or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -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 - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = YES - -# 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 = YES - -# 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 = NO - -# 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 = NO - -#--------------------------------------------------------------------------- -# 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. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is adviced to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = ./rsc/header_chm.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 = ./rsc/footer_chm.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 = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# 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 - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# 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 = YES - -# 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 = ../ChibiOS_RT.chm - -# 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 = "\"C:/Program Files/HTML Help Workshop/hhc.exe\"" - -# 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 = org.doxygen.Project - -# 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 = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# 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 - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -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 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# 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 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# When the SEARCHENGINE tag is enabled 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), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = NO - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = 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. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -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, 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 = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# 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 = YES - -# 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 = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when 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 = __DOXYGEN__ - -# 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 that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = NO - -#--------------------------------------------------------------------------- -# 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 also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = NO - -# 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 = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called Helvetica to the output -# directory and reference it in all dot files that doxygen generates. -# When you want a differently looking font you can specify the font name -# using DOT_FONTNAME. You 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 = 8 - -# 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 = YES - -# 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 = NO - -# 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 = NO - -# 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 = YES - -# 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 generate a 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 = NO - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, 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 MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_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 = 20 - -# 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 = 3 - -# 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 = YES - -# 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 = YES - -# 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/docs/Doxyfile_html b/docs/Doxyfile_html deleted file mode 100644 index f96084966f..0000000000 --- a/docs/Doxyfile_html +++ /dev/null @@ -1,1831 +0,0 @@ -# Doxyfile 1.7.4 - -# 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 = ChibiOS/RT - -# 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 = 2.5.1 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# 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-Cyrillic, 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 = YES - -# 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 = "C:/Documents and Settings/Administrator/" - -# 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 if your file system -# 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 = NO - -# 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 = 2 - -# 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 = "iclass=@par Function Class:\n This is an \ - I-Class API, this function can be \ - invoked from within a system lock zone by both \ - threads and interrupt handlers." \ - "sclass=@par Function Class:\n This is an \ - S-Class API, this function can be \ - invoked from within a system lock zone by threads \ - only." \ - "api=@par Function Class:\n Normal API, this \ - function can be invoked by regular system threads \ - but not from within a lock zone." \ - "notapi=@par Function Class:\n Not an API, this \ - function is for internal use only." \ - "isr=@par Function Class:\n Interrupt handler, \ - this function should not be directly invoked." \ - "init=@par Function Class:\n Initializer, this \ - function just initializes an object and can be \ - invoked before the kernel is initialized." \ - "special=@par Function Class:\n Special function, \ - this function has special requirements see the \ - notes." - -# 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 = YES - -# 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, CSharp, 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 makes 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 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 the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# 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 penalty. -# 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 roughly 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 = NO - -# 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 = NO - -# 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 namespaces 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 = YES - -# 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 = YES - -# 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 FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# 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 = NO - -# 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 - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = 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 macro 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 macros 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 = NO - -# 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 = ./rsc/layout.xml - -#--------------------------------------------------------------------------- -# 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 = YES - -# 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 - -# The WARN_NO_PARAMDOC option can be enabled 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 = YES - -# 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 = ../docs/src \ - ../os/kernel \ - ../os/kernel/include \ - ../os/kernel/src \ - ../os/kernel/templates \ - ../os/ports \ - ../os/ports/common/ARMCMx \ - ../os/ports/GCC/ARM \ - ../os/ports/GCC/ARM/LPC214x \ - ../os/ports/GCC/ARM/AT91SAM7 \ - ../os/ports/GCC/ARMCMx \ - ../os/ports/GCC/ARMCMx/STM32F1xx \ - ../os/ports/GCC/ARMCMx/STM32L1xx \ - ../os/ports/GCC/ARMCMx/LPC11xx \ - ../os/ports/GCC/ARMCMx/LPC13xx \ - ../os/ports/GCC/PPC \ - ../os/ports/GCC/AVR \ - ../os/ports/GCC/MSP430 \ - ../os/ports/IAR/ARMCMx \ - ../os/ports/IAR/ARMCMx/STM32F1xx \ - ../os/ports/IAR/ARMCMx/STM32L1xx \ - ../os/ports/IAR/ARMCMx/LPC11xx \ - ../os/ports/IAR/ARMCMx/LPC13xx \ - ../os/ports/RVCT/ARMCMx \ - ../os/ports/RVCT/ARMCMx/STM32F1xx \ - ../os/ports/RVCT/ARMCMx/STM32L1xx \ - ../os/ports/RVCT/ARMCMx/LPC11xx \ - ../os/ports/RVCT/ARMCMx/LPC13xx \ - ../os/ports/cosmic/STM8 \ - ../os/ports/RC/STM8 \ - ../os/hal \ - ../os/hal/dox \ - ../os/hal/include \ - ../os/hal/src \ - ../os/hal/templates \ - ../os/hal/platforms \ - ../os/hal/platforms/AT91SAM7/platform.dox \ - ../os/hal/platforms/AVR/platform.dox \ - ../os/hal/platforms/LPC11xx/platform.dox \ - ../os/hal/platforms/LPC13xx/platform.dox \ - ../os/hal/platforms/LPC214x/platform.dox \ - ../os/hal/platforms/MSP430/platform.dox \ - ../os/hal/platforms/SPC56x/platform.dox \ - ../os/hal/platforms/STM32F1xx/platform.dox \ - ../os/hal/platforms/STM32F4xx/platform.dox \ - ../os/hal/platforms/STM32L1xx/platform.dox \ - ../os/hal/platforms/STM8L/platform.dox \ - ../os/hal/platforms/STM8S/platform.dox \ - ../os/various \ - ../test \ - ../ext/ext.dox - -# 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -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 \ - *.ddf \ - *.s - -# 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 = NO - -# 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 = ../os/hal/platforms/STM32F1xx/stm32f10x.h \ - ../os/hal/platforms/STM32L1xx/stm32l10x.h \ - ../os/hal/platforms/STM8/stm8s.h \ - ../os/hal/platforms/STM8/stm8s_type.h \ - ../os/hal/platforms/LPC11xx/LPC11xx.h \ - ../os/hal/platforms/LPC11xx/system_LPC11xx.h \ - ../os/hal/platforms/LPC13xx/LPC13xx.h \ - ../os/hal/platforms/LPC13xx/system_LPC13xx.h - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix file system 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 = - -# 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 = ./rsc - -# 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 or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -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 - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# 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 = NO - -# 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 = YES - -# 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 = YES - -# 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 = NO - -# 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 = NO - -#--------------------------------------------------------------------------- -# 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. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is adviced to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = ./rsc/header_html.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 = ./rsc/footer_html.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 = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# 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 - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# 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 = ../ChibiOS_RT.chm - -# 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 = "\"C:/Program Files/HTML Help Workshop/hhc.exe\"" - -# 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 = org.doxygen.Project - -# 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 = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# 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 - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -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 = YES - -# 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 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# 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 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# When the SEARCHENGINE tag is enabled 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), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = NO - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = 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. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -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, 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 = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# 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 = YES - -# 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 = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when 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 = __DOXYGEN__ - -# 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 that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = NO - -#--------------------------------------------------------------------------- -# 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 also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = NO - -# 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 = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called Helvetica to the output -# directory and reference it in all dot files that doxygen generates. -# When you want a differently looking font you can specify the font name -# using DOT_FONTNAME. You 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 = 8 - -# 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 = YES - -# 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 = NO - -# 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 = NO - -# 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 = YES - -# 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 generate a 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 = NO - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, 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 MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_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 = 20 - -# 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 = 3 - -# 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 = YES - -# 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 = YES - -# 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/docs/html/logo_small.png b/docs/html/logo_small.png deleted file mode 100644 index c53451bbac96dd9568ca295eb43478cdb1c9aeec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7697 zcmV+s9`50ZP)00004XF*Lt006O% z3;baP00009a7bBm0017r0017r0mErjQvd)Rvq?ljRA}DKdU>>5MYZ?dRdt4*Zr^#z zJP#xgAp}Ag0|6c}goyBnpvVj=JVXfiiGupT=`qMtKSdA(UIav$5dsOsBp3(@Arl$N zO>*a6uAN$;=GQnwGA5rl-()-Wiw2oa+A*>6rl! z(h&??APmg&|3E1mN=-yW%-oml-MV4RmK~dz`HnkogYlro!u4M}k4Y0Tks&7jdn269 z7!w4(ANYRY8#3Yd`+sI;GFtn-9|XQJW>A2Ed;Z}upq@cB{Ojd&{7PfTksAJpm zVCOW(pg<`OeEC0cAtI7eE?@TQnh*av;ljke9l32AH&1JtvZZscsX=hScnAO#uykpkoIdVzqenDV)hFki z^e;_AM@lIXz!(DnLWqOa`gZ_?W(SZf-d%|?F>y$9N7pu&y<4xp>DUV&DUym3hLCFfsu*1w!RY0NYlP=xqLA_R#D5yL;EdU`Iu_2PGS zE-e64fv;b1?H^xyYS+&6Pj34`cTe{#A3kU&RZaKNOJ06Ussn}&-B&5q)02AaiC;bY z*T*)ccdA-;D=}ibRAwU39vP3&1rOFTC*lLl55HQn4|WNIQXBE(FQ}5Nz@cF0ujRGk6Ro2$0zT z`5+WHH9|$vlmQh&S)})9-D)bqy8GYnz4DrG7_CtpHsrz~LI42pAHTYD%$etNcg;N)_8zs3 zngWx8Qr-g~V~7YKhFs!O7y0|BypMF6P@q#I>?9&Vsh3Ezuo;mI>S!IrCR?T9`r2<_ z|J`qYOCT~psG~zJxB!4!2U4n)>z19g@bsp!b}`Vo4=Ltie5#TOLO@eyQEPcwA0uUS-~ofLq8 z4oC@1AQT#(b)IDuRRn?A1i%599BU22mVNIAUp(WC#~ypub>qx*I6J5iSL@b&(ORgU zYB&3_-gFH2FFck1Qtrh3?@5u<^4%dU;?JixCPqjE00Yt$s6aZ99OBpsBW$0dUJxmXYVFiP zVu<5bD7QhxhpNO#)kbegJW zS|(uQflxr2S%V-jE(AMG!fG5_HM}3Q!kA1soA>&AxLh>}>yq(uphc9x0BN9r{S4_M z8_l}FLR;DO{*srLoHA>UHd;x=zz3=+A_4$J@B?jI)iJy8gw zi4DsL#+p@-BR@+hk%=jQ;trFXZc&jlTeX!Gz>ETcnYBo_n>k~TS@P<;%mRS-*P_VG zfWVrcU-|Ow-@CF6x<}8f@|+SXD0WhQuLc0+V!4+|BkwSeJ^1we`4@ZwgAh32QbI^( zoP$1yfUq5vk4 z5s)!(8^urV{ZX!%ACP{(3ke~jgQZ^>AK$zEZfko|MNP@>lhxWzN_5cDqE@+vsk+9E z#4RsJrVIce94xgNS6cCEyLWW}2-@SIz(E205|@kY=4GR!^85PAg`#CyVch`;N-6-9 zQX!(&x+>Xl&woCA*%|-#(UL5sM83o50^11@stK5=TD`yN{U;uI7yt~>U~3`v2Q`Oi zj4{n4hTU`9LtI`m|v6e4J?fBd6+zdZBYw$){+ zWVw%o1+ih$sS$3aV8^Hi`0ei=_Pnx^a!}o3e>7m2i=>psn6u{2edd8zj>=9?uQpqj zW-~jrF0eol4tTv(Xd@H=fI*J)J9IEo?Vxmix2Nim%1j=x0SLhLq$;3Q!gAmfn|mJo zQMp`HO1=BuJ7;|5gvno;bi=J*GXXI$GYcVw5X|tvub()1_zB&cy~I!@B48(kQzhIw zp&Ssku(@;7+V?*Q6#kld1LM0aH!W< zSJmHI_{!N={`Btq4Hr?(PnAIkPVnJd%cV{r~Aug38gaYESB4;K{j6frAvl1 z)mSy^s_EZY^Uj)C)2GjyJ}aozRU_=$iL#HUE{Jh-n!5e>cY%j? zCD=){9dK&>N1uK0mLjwp$*d@NO^p)+!zIe53N=AEZ`%;o%0QSKIAR{0npkfG0P#-M1 z@iwyk6D~Sh3sIA(YiZr>XYtXOAKp+}8023+*2Fwq2Sw{C9T*VZ_8BDBJi$KMF^ zNm%L#6k6*Ojy`4KaSQiu_Del%#n6hQU4d>yMud3oq166-726Y|J@&>(-3` z0DPDjIN(SE3+c>?^{bsKpgfBJfw|mgjK|VOus}M91pokLi-OkEkDHqA%005_cg5KS zHQsC)zjWy3oS0&vBb6ham?bS~IZ`>&R-$sKor-n6x#{itk&%Katy;eHpgcIRu#O)) zSz<&+SUM;a0ssM(Txi+7tB@}!Wf74&tpAWvQoZokrwZjvG;Wz3p@S$e$U`_IYY+~4 zDT*jTlI#Q!d3!(F8Lft{Ri?6%sw<=Yy+yBRN-YrN00MBMk{uzGk${E_Nv1sX_j?$H zte+ncpJA|p6b?XyO_`ZMI*1Y=U<+aEzLvK3w(;Y~GxK2qgj4Lw?#)y}1xtvL6+;z4 z=>Tg01}lof!cxlAWRf*Cv`eRUr*>}oukA-&-k58lJ;m;{$TbBGqw7axr5|gIrS@jh zTlSn#SKDc+&HXLOWL-2?!H#U6-1z$1WjbVY-u@n{G^-Lb=`LJkH$`&mDa_4Plx<9op90H99QD-S>r0x|#v>{N?rlVroX z$ht&UOn6b z5P%8TaA+PPN*IXPZfK~(TL1+BjF~h!>Q?%B0t6~Dm$=YwjL&Y3Lw3H8z2!pZd-J(|j_8t5`QVz%uYLNF#mCM#zAKX|=u&HM zXDksJH+rCyI1m7cVZE#a0{~7^2n&S;LWr`aF-_ygHjWQ5e=G(L=4cHWOIaY%M^o$o zMJ%Hj7!Gn=>M^kxOIe7hY^yF=Rqg}hGifFt5Yg+TAWuv{20#J@pmQW#aH@n!Ytdym ztCRUyB97Z|?+Z&FFIYLDJ-g^f9k*%BxV#nXD~kH65m95eZQnZMxFZh^-~DR=Tb2bt ztKNClmf&Z#@j#at0Kf-X83_~p#{lsD%??CdvErp~e)sC7Z@i*VExO_k*MK1rGX2tp zz~fR6=@KJ?lN2bx%d!)bHpqxADyt+_7-8vsg^X=M5qo+Hoq^7CI?biB(Lr}Av#-4~ zlj(oyrRPVFA39{{kg#Ss*aBh0mF`b(Xj!j(D5W$rvjG5r06sTu>i$f1&^mws+8CwO zYp*|d-o*>NYVpvY9{Swy;ms2!MRO{VqCx`fD3Z^1g^&)Y2wE|zV#2Nzkp_0-vJf#j zFg!^n-xF3fW_o?axU+qGv8}sB!iQ}gHN&gA`uhq*2CVM(zHOV{ee75FeOmnkE`)$( zP=@SUpn$0RR;Eu^3=xDI@?q_~@_11Q9W0Kpyx=eu@hn?8cQ-A=}-& zQmBh;${bXoB|v*jnq6|LDiXfJJOP6vg*BwM{`J2syYpK&PM$Dc8>2qX^MoU8onK$Q zqAv~&5v#wi9F!S+5$}UjFFIKW8R$Ssb%=!w4JOfoI7F+gsv)*j!Km1d3k$)-F+N72 z$9|R!fKuqz3%6FVW)|o*Nd|LX!ECK+2CY4Bnm)GPm8}M>LRK~x0(UkxYI?JH|Ai9+fFc_wEi?376 z%+Vn-Hd5J9AuLc;C=@a<7+?*`MOn>IVWb7dV-7$UxYSF2AC+=CmWQ#!#`UN3+cs~> z=TfCy&&nmQwC~;W+G~IA?CJk|N&xvMSf3OUNE(?u@7r-dhEQH1S}-%qSjxl&4H!VN4y+qM)+Dx=rWrk_ob zgCc7JD)PAcX--AMhIiMdcJIX?yKeQHTX(N<8=TeeynDx@ZvlWYW^nO=!98DQ0C@bF z-*lROr$SM{N)__Mh^=7v8JAxg_3?QvwF$$f~&_hHT0#5nbts5fLElT zK%j-zx|BDmZbJnY8q+ zO+IJrSrz$;w%vXGEnX>0FSYI69vQ>AWX81w#|+lP zidR?GT9q?Sm=*4|F%tlqz(^&ZdhW^Jzx7b{1gD%b5J0vka64mvc<`yZ`i5|);{dt) z>9Z0{gi;{kmA72}@Tx~fAL$mh`FRSi3^Yl&PG7!VdGByMA%mrC&E% zivwHe2!n1nctjw44}u^F0%pE`(KXf#7;%+THAks2aL&A0Z98`EZdp5X=J1N+VAM4( zjDYjMIFFeNL7vDkb0L#XcXyH2*=%-j!tlZ{|L&pt8>YvS^Kj^eR`Uh2d7+g!9_=A; z_UDg(@x?zCiUrNZ1(%!|n*$@SaO&rZnlmiX45!VXyy3k!w{71P82=N;5e~8Y7lI?r z#u&>{*W9u2$rVplH%0pPmHZB12OJ3zgBcrThNg@f|HuPR9dX1oZFESQ4-iTRrI!OW zB9o=8weKulaQ*!9$dU>KBRf)%#J)WNwesgiOc~zP_{;}y)J#xJ9F(}&LWzt}H8Ly6 zE13HhegB3VzGsXHp8|)V77xb2#0*l<4YyzQ^yWuv8Y=pF^Qe&}7CQA&?h!xw!B6+> zY3s{ot12okI`7N2XPTzNZ|~+(4ksNhOllEAP5LR-F@@@ zE5Ee5Dw(C2F829kFyew!ssHfUuOD0bVj(V|i>v?_UV0@N5<-ZNFRKT(GXQMc3WDIY zc?)h{|GyqudapbV(8wt0Qp)&5u?9s+ENuyduW~*5%7qtQ_qA*0EtoGGz(U#67fd?- zSSg&)0*7A6!Ur+~BKTBB#31nFmB~xzTtZtplC;qQ4#>E;V#~HCR=rqzk~ML5EH(l* zwtN7G8y~B4KuX~U-fiFg;kEO=&FdKZ*%>OTkFiEftVq;I9q8JIWUfu$b>pJnKKO^t z>o#>|vP_uU&I`|;_w8@q2@Hk|0ED#mp_}^9+_rRyNLh9%pINc$&G&jb?6m@Y@bgrY zsfc^fIXqj_><+D{*==%1Oq~1)Cp`F_n1I8500a<9Spaax>8Jnh@n5v}bv0JGxtJa` zymm@`Y0|1c` zLhjhM`GU*lZY}Le*jA!Hmb3G{DgEuszH#ZlF1&8hwR>Va(Sz9|&i%zbzqf7YzzGm0 z1PnKnLdF{rnM}S^=3*Te)&=``cc%7i)0cKC5MWuFy^+>Z)aRkc#IbRVv@A zsTX83#w%6Fw&2@eyk*$%VVk#X5JV#J*O5T5v!areIF4NVBDDctLNQt$rrE8XVaHlbMDUQj!3nw;$RAF zd@80nvz45Bz@Z>rQFx!8|LLRWo_DD+`m>lhA;gnUEH=aYk2!MGs%5)lRqn>U+kK}z z`pCrYZMnq{{^`aGzIW0or!rGm6b<&%QpzWv{PnfBd`%0qE%GB!G@u-4N-7-(&uGp= zX$KVhgNDl5^G}~MFN`wje4hT z?f7xE(fZhiwmr-a0PsIRY+=u~{I*gGb^3O_)V=GY?bGX< zj4|O}UFauaemHsNS(kq0vJEZUoigug-`P>I@<|TYle*;J+Zp6;fiyw8a{Sx zePh!=hSdXP+s>`;N`~yNz%T1)qsr}qpWSxL)mPtk$IotEziCybqv!lHFP%Gg0fa^M zXB^yP=4`hAmTz5s)M=xCc-QsJdgam;V~?*p;p&E}=`d&EOeRBzKc+XZ{A$zP*1CHA z%Gcli^V0WUUApGgp5A>2ulj!A2RhJ3GxNT-y_elMziNhbr@)+xj=k#2e|1KKJ08CO z>Pp2zN9(?@N(g5-EPzjnLKK$1uf6)>O^d#K-@P|?X4;uKJdXHjie| zMjsG&|5c!aAPBV9;d#Yyl1w^1`;ucX{QA^s|5hW9fM4Ht_l9+UYa9#ldC+*2_4w}| z2-iVo);bu(|931v#%Qe#867^!m_dCHUVnxK1}G+Dv<`y(FJnyj+u$Fy*3A6otFO%Z z{Dd3tKV{mr)i4H@zV(-EZ+6t__9@?~Z@e69CPg=G_#nh^@N++dnF}`>gb)G;7yuNA zL}ZAJF@S&P*y_Lxh(ZV{l@d}(rKA!%YT>Nevrjqu zukWk`89AqEW}TIA9keYG-aI%nz-O)lhgntmAo+Md3;cgOLPhlDdb)dhP>Z3>P4Rd# z2!dO0yM9B@-~6EX)w3_X{L0=jsw)rpj5u^r+T~Xh*MKtLxzO3 zK1D+Q69D)G1_%!j;J|^z@U$E=2yqCH{bvDiI7lG|I4Gh%f#JUaR4j%)hHl>500000 LNkvXXu0mjfy>y+q diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index bf4fe4e3f2..0000000000 --- a/docs/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/readme.txt b/docs/readme.txt deleted file mode 100644 index 9924d779f0..0000000000 --- a/docs/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -*** Documentation build procedure *** - -The following software must be installed: -- Doxygen 1.7.4 or later. -- Graphviz 2.26.3 or later. The ./bin directory must be specified in the path - in order to make Graphviz accessible by Doxygen. - -Build procedure: -- Run Doxywizard. -- Load ./docs/Doxyfile_html or ./docs/Doxyfile_chm from Doxywizard. -- Start. diff --git a/docs/reports/AT91SAM7X-48-ARM.txt b/docs/reports/AT91SAM7X-48-ARM.txt deleted file mode 100644 index 3198727f35..0000000000 --- a/docs/reports/AT91SAM7X-48-ARM.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -Settings: MCK=48.054857, MC_FMR = AT91C_MC_FWS_1FWS (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 12:28:19 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure ARM mode -*** Platform: AT91SAM7x -*** Test Board: Olimex SAM7-EX256 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 116919 msgs/S, 233838 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 89887 msgs/S, 179774 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 89887 msgs/S, 179774 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 380288 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 64709 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 93398 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 26941 reschedules/S, 161646 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 203272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 272700 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 263496 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 449056 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 322048 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/AT91SAM7X-48-THUMB.txt b/docs/reports/AT91SAM7X-48-THUMB.txt deleted file mode 100644 index 21a3632e52..0000000000 --- a/docs/reports/AT91SAM7X-48-THUMB.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -Settings: MCK=48.054857, MC_FMR = AT91C_MC_FWS_1FWS (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 13:03:08 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure THUMB mode -*** Platform: AT91SAM7x -*** Test Board: Olimex SAM7-EX256 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 107489 msgs/S, 214978 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 88253 msgs/S, 176506 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 88253 msgs/S, 176506 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 402392 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 67753 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 101772 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 28388 reschedules/S, 170328 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 199720 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 289356 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 323198 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 364448 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 256824 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/ATmega128-16.txt b/docs/reports/ATmega128-16.txt deleted file mode 100644 index a171ab1084..0000000000 --- a/docs/reports/ATmega128-16.txt +++ /dev/null @@ -1,149 +0,0 @@ -*************************************************************************** -Options: -O2 -Settings: F_CPU=16000000 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 21:11:04 -*** Compiler: GCC 4.3.0 -*** Architecture: AVR -*** Core Variant: MegaAVR -*** Port Info: None -*** Platform: ATmega128 -*** Test Board: Olimex AVR-MT-128 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 31561 msgs/S, 63122 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 24980 msgs/S, 49960 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 24980 msgs/S, 49960 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 88896 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 19766 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 25179 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 7891 reschedules/S, 47346 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 60760 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 91888 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 85722 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 227568 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 116724 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 234 bytes ---- Thread: 31 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1114-48-GCC.txt b/docs/reports/LPC1114-48-GCC.txt deleted file mode 100644 index 4e0118f006..0000000000 --- a/docs/reports/LPC1114-48-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -Settings: CLK=48, (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:34:26 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv6-M -*** Core Variant: Cortex-M0 -*** Port Info: Preemption through NMI -*** Platform: LPC11xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1114 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 127622 msgs/S, 255244 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 101340 msgs/S, 202680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 101340 msgs/S, 202680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 384536 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 79026 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 111784 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 30914 reschedules/S, 185484 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 245084 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 377384 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 351018 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 591196 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 354276 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1114-48-RVCT.txt b/docs/reports/LPC1114-48-RVCT.txt deleted file mode 100644 index 06c95d3e33..0000000000 --- a/docs/reports/LPC1114-48-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: CLK=48, (2 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:37:26 -*** Compiler: RVCT -*** Architecture: ARMv6-M -*** Core Variant: Cortex-M0 -*** Port Info: Preemption through NMI -*** Platform: LPC11xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1114 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 122129 msgs/S, 244258 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 102916 msgs/S, 205832 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 103361 msgs/S, 206722 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 380136 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 79326 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 113161 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 33700 reschedules/S, 202200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 232092 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 341100 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 307102 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 618184 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 382800 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1343-72-GCC.txt b/docs/reports/LPC1343-72-GCC.txt deleted file mode 100644 index 4e8c8d7fcf..0000000000 --- a/docs/reports/LPC1343-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -Settings: CLK=72, (3 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:42:36 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: LPC13xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1343 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 268027 msgs/S, 536054 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 217012 msgs/S, 434024 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 217012 msgs/S, 434024 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 974024 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 161791 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 237078 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 67574 reschedules/S, 405444 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 512180 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 623284 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 665126 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 860284 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 635676 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1343-72-IAR.txt b/docs/reports/LPC1343-72-IAR.txt deleted file mode 100644 index f106ef9d3d..0000000000 --- a/docs/reports/LPC1343-72-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: CLK=72, (3 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 20:09:51 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: LPC13xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1343 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 252028 msgs/S, 504056 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 220329 msgs/S, 440658 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 219661 msgs/S, 439322 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 856376 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 159269 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 223772 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 72334 reschedules/S, 434004 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 469472 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 646692 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 665016 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1026020 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 661984 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1343-72-RVCT.txt b/docs/reports/LPC1343-72-RVCT.txt deleted file mode 100644 index f135a267a6..0000000000 --- a/docs/reports/LPC1343-72-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: CLK=72, (3 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:48:24 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: LPC13xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1343 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 250294 msgs/S, 500588 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 219004 msgs/S, 438008 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 217021 msgs/S, 434042 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 885512 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 164008 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 233236 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 71977 reschedules/S, 431862 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 498840 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 613984 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 647154 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 984024 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 653036 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC2148-48-ARM.txt b/docs/reports/LPC2148-48-ARM.txt deleted file mode 100644 index 0d0e430df4..0000000000 --- a/docs/reports/LPC2148-48-ARM.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -Settings: CCLK=48, MAMCR=2, MAMTIM=3 (3 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 16:47:23 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure ARM mode -*** Platform: LPC214x -*** Test Board: Olimex LPC-P2148 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 148529 msgs/S, 297058 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 113332 msgs/S, 226664 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 113332 msgs/S, 226664 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 493680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 86173 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 122631 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 34987 reschedules/S, 209922 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 268312 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 388444 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 325360 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 607348 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 380356 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC2148-48-THUMB.txt b/docs/reports/LPC2148-48-THUMB.txt deleted file mode 100644 index c70f4276f7..0000000000 --- a/docs/reports/LPC2148-48-THUMB.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -Settings: CCLK=48, MAMCR=2, MAMTIM=3 (3 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 16:28:18 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure THUMB mode -*** Platform: LPC214x -*** Test Board: Olimex LPC-P2148 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 107903 msgs/S, 215806 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 89018 msgs/S, 178036 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 89018 msgs/S, 178036 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 410760 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 69081 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 105994 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 29094 reschedules/S, 174564 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 210820 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 292036 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 326310 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 350856 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 244212 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/MSP430F1611-0.75.txt b/docs/reports/MSP430F1611-0.75.txt deleted file mode 100644 index 802d60e695..0000000000 --- a/docs/reports/MSP430F1611-0.75.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -Settings: MCLK=DCOCLK 750kHz -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 20:51:54 -*** Compiler: GCC 3.2.3 -*** Architecture: MSP430 -*** Core Variant: MSP430 -*** Port Info: None -*** Platform: MSP430x16x -*** Test Board: Olimex MSP430-P1611 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 1880 msgs/S, 3760 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 1549 msgs/S, 3098 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 1549 msgs/S, 3098 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 5456 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 1065 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 1434 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 489 reschedules/S, 2934 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 3520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 6340 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 5626 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 13908 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 7520 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 224 bytes ---- Thread: 38 bytes ---- Timer : 10 bytes ---- Semaph: 6 bytes ---- EventS: 2 bytes ---- EventL: 6 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 20 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/MSP430F1611-8.txt b/docs/reports/MSP430F1611-8.txt deleted file mode 100644 index fd2ac8942a..0000000000 --- a/docs/reports/MSP430F1611-8.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -Settings: MCLK=XT2CLK 8MHz -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 25 2012 - 11:28:57 -*** Compiler: GCC 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -*** Architecture: MSP430 -*** Core Variant: MSP430 -*** Port Info: None -*** Platform: MSP430 -*** Test Board: Olimex MSP430-P1611 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 22756 msgs/S, 45512 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 17949 msgs/S, 35898 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 17949 msgs/S, 35898 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 67552 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 12780 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 18071 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 5449 reschedules/S, 32694 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 42200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 73280 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 69456 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 140132 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 76804 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 222 bytes ---- Thread: 38 bytes ---- Timer : 10 bytes ---- Semaph: 6 bytes ---- EventS: 2 bytes ---- EventL: 6 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 20 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/SPC563M64-80.txt b/docs/reports/SPC563M64-80.txt deleted file mode 100644 index fc754adcce..0000000000 --- a/docs/reports/SPC563M64-80.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=80 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Feb 8 2012 - 10:21:46 -*** Compiler: GCC 4.4.1 -*** Architecture: Power Architecture -*** Core Variant: e200z3 -*** Port Info: None -*** Platform: SPC563M64 -*** Test Board: Generic SPC563 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 278226 msgs/S, 556452 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 224935 msgs/S, 449870 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 224935 msgs/S, 449870 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 890960 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 178638 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 255935 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 73319 reschedules/S, 439914 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 609448 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 766412 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 1094200 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1027008 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 841232 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 764 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F051-48-GCC.txt b/docs/reports/STM32F051-48-GCC.txt deleted file mode 100644 index 1d2b671f5a..0000000000 --- a/docs/reports/STM32F051-48-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=48, ACR=0x11 (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: May 19 2012 - 17:24:06 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv6-M -*** Core Variant: Cortex-M0 -*** Port Info: Preemption through NMI -*** Platform: STM32F0 Entry Level -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 151223 msgs/S, 302446 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 119158 msgs/S, 238316 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 119158 msgs/S, 238316 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 456240 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 92602 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 132740 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 36254 reschedules/S, 217524 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 273820 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 427652 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 417370 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 682712 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 422920 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 404 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F100-24-GCC.txt b/docs/reports/STM32F100-24-GCC.txt deleted file mode 100644 index 7d22dd1ad4..0000000000 --- a/docs/reports/STM32F100-24-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=24, ACR=0x10 (no wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 14:51:29 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Value Line Medium Density -*** Test Board: ST STM32VL-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 107466 msgs/S, 214932 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 88361 msgs/S, 176722 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 88361 msgs/S, 176722 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 364984 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 64312 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 91069 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 27423 reschedules/S, 164538 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 194360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 262192 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 305910 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 381748 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 268084 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F100-24-IAR.txt b/docs/reports/STM32F100-24-IAR.txt deleted file mode 100644 index 5c5d3512bc..0000000000 --- a/docs/reports/STM32F100-24-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=24, ACR=0x10 (no wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 14:57:36 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Value Line Medium Density -*** Test Board: ST STM32VL-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 99411 msgs/S, 198822 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 86444 msgs/S, 172888 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 86444 msgs/S, 172888 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 336632 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 62625 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 88700 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 28919 reschedules/S, 173514 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 183540 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 252964 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 309832 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 472444 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 271112 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F100-24-RVCT.txt b/docs/reports/STM32F100-24-RVCT.txt deleted file mode 100644 index b747c1afee..0000000000 --- a/docs/reports/STM32F100-24-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=24, ACR=0x10 (no wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 15:04:43 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Value Line Medium Density -*** Test Board: ST STM32VL-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 101100 msgs/S, 202200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 86761 msgs/S, 173522 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 86761 msgs/S, 173522 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 340272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 63800 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 91072 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 29203 reschedules/S, 175218 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 203920 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 242700 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 311922 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 454500 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 274248 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-48-GCC.txt b/docs/reports/STM32F103-48-GCC.txt deleted file mode 100644 index a9e91a2592..0000000000 --- a/docs/reports/STM32F103-48-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=48, ACR=0x11 (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 11:54:27 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 197697 msgs/S, 395394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 162180 msgs/S, 324360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 162180 msgs/S, 324360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 683520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 118726 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 170879 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 49070 reschedules/S, 294420 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 347320 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 466776 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 490722 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 640048 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 461148 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-GCC-compact.txt b/docs/reports/STM32F103-72-GCC-compact.txt deleted file mode 100644 index 7cd8594e89..0000000000 --- a/docs/reports/STM32F103-72-GCC-compact.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 11:58:05 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Compact kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 275197 msgs/S, 550394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 221680 msgs/S, 443360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 221680 msgs/S, 443360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 952928 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 163998 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 240229 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 66137 reschedules/S, 396822 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 471772 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 623236 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 641326 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 842560 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 632848 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-GCC.txt b/docs/reports/STM32F103-72-GCC.txt deleted file mode 100644 index d9345d56d4..0000000000 --- a/docs/reports/STM32F103-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 25 2012 - 12:56:39 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 268998 msgs/S, 537996 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 213760 msgs/S, 427520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 213760 msgs/S, 427520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 975576 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 158908 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 236273 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 64647 reschedules/S, 387882 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 478040 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 623212 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 647076 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 787132 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 596056 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 404 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-IAR-compact.txt b/docs/reports/STM32F103-72-IAR-compact.txt deleted file mode 100644 index cf318340a0..0000000000 --- a/docs/reports/STM32F103-72-IAR-compact.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:04:29 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Compact kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 250283 msgs/S, 500566 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 216355 msgs/S, 432710 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 215059 msgs/S, 430118 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 850064 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 154479 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 228038 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 70146 reschedules/S, 420876 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 474140 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 664692 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 707650 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1122300 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 650024 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-IAR.txt b/docs/reports/STM32F103-72-IAR.txt deleted file mode 100644 index 13b904158b..0000000000 --- a/docs/reports/STM32F103-72-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:19:46 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 241831 msgs/S, 483662 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 211248 msgs/S, 422496 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 210000 msgs/S, 420000 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 841272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 149324 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 217650 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 69192 reschedules/S, 415152 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 467900 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 661520 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 690526 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1071880 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 632748 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-RVCT-compact.txt b/docs/reports/STM32F103-72-RVCT-compact.txt deleted file mode 100644 index 21982a672b..0000000000 --- a/docs/reports/STM32F103-72-RVCT-compact.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:14:42 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Compact kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 245998 msgs/S, 491996 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 210638 msgs/S, 421276 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 210638 msgs/S, 421276 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 852568 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 157180 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 231712 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 67698 reschedules/S, 406188 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 504052 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 608404 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 598586 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 957740 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 669744 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-RVCT.txt b/docs/reports/STM32F103-72-RVCT.txt deleted file mode 100644 index 8b11922834..0000000000 --- a/docs/reports/STM32F103-72-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:17:39 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 244331 msgs/S, 488662 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 212523 msgs/S, 425046 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 212523 msgs/S, 425046 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 860304 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 153165 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 224497 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 68542 reschedules/S, 411252 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 493700 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 574396 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 598628 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 855192 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 617932 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F107-72-GCC.txt b/docs/reports/STM32F107-72-GCC.txt deleted file mode 100644 index a8290110ca..0000000000 --- a/docs/reports/STM32F107-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 11:49:01 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Connectivity Line -*** Test Board: Olimex STM32-P107 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 266998 msgs/S, 533996 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 213748 msgs/S, 427496 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 213748 msgs/S, 427496 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 962456 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 159254 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 236261 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 64820 reschedules/S, 388920 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 474856 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 608060 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 644192 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 787148 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 596068 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-GCC-FPU.txt b/docs/reports/STM32F407-168-GCC-FPU.txt deleted file mode 100644 index 9b37d76f07..0000000000 --- a/docs/reports/STM32F407-168-GCC-FPU.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=168, ACR=0x705 (5 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 1 2012 - 14:19:33 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4F -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 576749 msgs/S, 1153498 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 493633 msgs/S, 987266 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 493631 msgs/S, 987262 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 1672112 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 382319 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 510144 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 156526 reschedules/S, 939156 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1063936 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1804680 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2124518 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 2685364 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1885792 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 644 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-GCC.txt b/docs/reports/STM32F407-168-GCC.txt deleted file mode 100644 index e28a0a1f9f..0000000000 --- a/docs/reports/STM32F407-168-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=168, ACR=0x705 (5 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 9 2012 - 15:07:48 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 752723 msgs/S, 1505446 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 617124 msgs/S, 1234248 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 617119 msgs/S, 1234238 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 2528968 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 448823 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 635833 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 193383 reschedules/S, 1160298 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1356420 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1804932 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2124810 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 2685732 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1886044 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 372 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-IAR.txt b/docs/reports/STM32F407-168-IAR.txt deleted file mode 100644 index c05a4d60ea..0000000000 --- a/docs/reports/STM32F407-168-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=168, ACR=0x705 (5 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 15 2012 - 20:30:59 -*** Compiler: IAR -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 682340 msgs/S, 1364680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 593133 msgs/S, 1186266 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 593132 msgs/S, 1186264 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 2315264 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 424953 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 603812 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 203217 reschedules/S, 1219302 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1370264 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1669144 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2098174 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 3010820 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1780940 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-RVCT.txt b/docs/reports/STM32F407-168-RVCT.txt deleted file mode 100644 index 60ed4ab1cb..0000000000 --- a/docs/reports/STM32F407-168-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 15 2012 - 20:25:03 -*** Compiler: RVCT -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 711269 msgs/S, 1422538 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 610399 msgs/S, 1220798 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 610399 msgs/S, 1220798 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 2393744 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 448826 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 640691 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 205457 reschedules/S, 1232742 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1434680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1724960 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2223332 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 3197328 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1951860 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32L152-32-GCC.txt b/docs/reports/STM32L152-32-GCC.txt deleted file mode 100644 index 5218cd1efa..0000000000 --- a/docs/reports/STM32L152-32-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 13:25:45 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32L1 Ultra Low Power Medium Density -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 131606 msgs/S, 263212 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 107961 msgs/S, 215922 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 107961 msgs/S, 215922 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 454200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 79829 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 114163 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 33107 reschedules/S, 198642 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 229120 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 329000 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 364000 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 468364 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 309232 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32L152-32-IAR.txt b/docs/reports/STM32L152-32-IAR.txt deleted file mode 100644 index ce8093bf43..0000000000 --- a/docs/reports/STM32L152-32-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 13:30:39 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32L1 Ultra Low Power Medium Density -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 121100 msgs/S, 242200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 106517 msgs/S, 213034 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 106517 msgs/S, 213034 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 418376 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 77689 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 110214 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 35153 reschedules/S, 210918 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 221188 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 312040 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 383674 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 522068 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 320060 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32L152-32-RVCT.txt b/docs/reports/STM32L152-32-RVCT.txt deleted file mode 100644 index 38e3f6ed71..0000000000 --- a/docs/reports/STM32L152-32-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 13:38:29 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32L1 Ultra Low Power Medium Density -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 122507 msgs/S, 245014 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 106169 msgs/S, 212338 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 106525 msgs/S, 213050 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 427528 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 78454 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 112558 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 35469 reschedules/S, 212814 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 241292 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 307556 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 359934 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 530856 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 321748 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM8L152-16-Cosmic.txt b/docs/reports/STM8L152-16-Cosmic.txt deleted file mode 100644 index a2d3063269..0000000000 --- a/docs/reports/STM8L152-16-Cosmic.txt +++ /dev/null @@ -1,7 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSI) -Compiler: Cosmic STM8 compiler 4.3.6. -*************************************************************************** - -FAILED (compiler regression) \ No newline at end of file diff --git a/docs/reports/STM8L152-16-Raisonance.txt b/docs/reports/STM8L152-16-Raisonance.txt deleted file mode 100644 index 508866149c..0000000000 --- a/docs/reports/STM8L152-16-Raisonance.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSI) -Compiler: Raisonance RKit-STM8_2.32.10.0307 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 23 2012 - 19:04:23 -*** Compiler: Raisonance -*** Architecture: STM8 -*** Port Info: None -*** Platform: STM8L -*** Test Board: ST STM8L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 30270 msgs/S, 60540 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 23197 msgs/S, 46394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 23197 msgs/S, 46394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 107360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 17468 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 27274 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 6268 reschedules/S, 37608 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 53228 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 76448 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 57698 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 125104 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 123176 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 218 bytes ---- Thread: 34 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM8S105-16-Cosmic.txt b/docs/reports/STM8S105-16-Cosmic.txt deleted file mode 100644 index a2d3063269..0000000000 --- a/docs/reports/STM8S105-16-Cosmic.txt +++ /dev/null @@ -1,7 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSI) -Compiler: Cosmic STM8 compiler 4.3.6. -*************************************************************************** - -FAILED (compiler regression) \ No newline at end of file diff --git a/docs/reports/STM8S105-16-Raisonance.txt b/docs/reports/STM8S105-16-Raisonance.txt deleted file mode 100644 index ab926e1368..0000000000 --- a/docs/reports/STM8S105-16-Raisonance.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSE) -Compiler: Raisonance RKit-STM8_2.32.10.0307 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 23 2012 - 19:17:23 -*** Compiler: Raisonance -*** Architecture: STM8 -*** Port Info: None -*** Platform: STM8S -*** Test Board: ST STM8S-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 30272 msgs/S, 60544 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 107368 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 17469 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 27276 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 6269 reschedules/S, 37614 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 53236 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 76456 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 57702 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 125116 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 123188 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 218 bytes ---- Thread: 34 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM8S208-16-Raisonance.txt b/docs/reports/STM8S208-16-Raisonance.txt deleted file mode 100644 index f57609eac1..0000000000 --- a/docs/reports/STM8S208-16-Raisonance.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: Optimized for speed (3) -Settings: CPUCLK=16MHz (HSI) -Compiler: Raisonance RKit-STM8_2.32.10.0307 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:04:12 -*** Compiler: Raisonance -*** Architecture: STM8 -*** Port Info: None -*** Platform: STM8S -*** Test Board: Raisonance REva V3 + STM8S208RB - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 30272 msgs/S, 60544 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 107368 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 17469 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 27276 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 6269 reschedules/S, 37614 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 53236 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 76456 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 57702 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 125116 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 123188 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 218 bytes ---- Thread: 34 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/build.txt b/docs/reports/build.txt deleted file mode 100644 index e05b19da96..0000000000 --- a/docs/reports/build.txt +++ /dev/null @@ -1,45 +0,0 @@ -Default maximum settings - * Building...OK - * Testing...OK -CH_OPTIMIZE_SPEED=FALSE - * Building...OK - * Testing...OK -CH_TIME_QUANTUM=0 - * Building...OK - * Testing...OK -CH_USE_REGISTRY=FALSE - * Building...OK - * Testing...OK -CH_USE_SEMAPHORES_PRIORITY=TRUE - * Building...OK - * Testing...OK -CH_USE_CONDVARS_TIMEOUT=FALSE - * Building...OK - * Testing...OK -CH_USE_EVENTS_TIMEOUT=FALSE - * Building...OK - * Testing...OK -CH_USE_MESSAGES_PRIORITY=TRUE - * Building...OK - * Testing...OK -CH_USE_DYNAMIC=FALSE - * Building...OK - * Testing...OK -CH_DBG_SYSTEM_STATE_CHECK=TRUE - * Building...OK - * Testing...OK -CH_DBG_ENABLE_CHECKS=TRUE - * Building...OK - * Testing...OK -CH_DBG_ENABLE_ASSERTS=TRUE - * Building...OK - * Testing...OK -CH_DBG_ENABLE_TRACE=TRUE - * Building...OK - * Testing...OK -CH_DBG_FILL_THREADS=TRUE - * Building...OK - * Testing...OK -CH_DBG_THREADS_PROFILING=FALSE - * Building...OK - * Testing...OK diff --git a/docs/reports/coverage.txt b/docs/reports/coverage.txt deleted file mode 100644 index a1ec85669a..0000000000 --- a/docs/reports/coverage.txt +++ /dev/null @@ -1,75 +0,0 @@ -mkdir gcov -gcov -u ..\..\os\kernel\src\chsys.c ..\..\os\kernel\src\chdebug.c ..\..\os\kernel\src\chlists.c ..\..\os\kernel\src\chvt.c ..\..\os\kernel\src\chschd.c ..\..\os\kernel\src\chthreads.c ..\..\os\kernel\src\chdynamic.c ..\..\os\kernel\src\chregistry.c ..\..\os\kernel\src\chsem.c ..\..\os\kernel\src\chmtx.c ..\..\os\kernel\src\chcond.c ..\..\os\kernel\src\chevents.c ..\..\os\kernel\src\chmsg.c ..\..\os\kernel\src\chmboxes.c ..\..\os\kernel\src\chqueues.c ..\..\os\kernel\src\chmemcore.c ..\..\os\kernel\src\chheap.c ..\..\os\kernel\src\chmempools.c -File `../../os/kernel/src/chsys.c' -Lines executed:100.00% of 21 -../../os/kernel/src/chsys.c:creating `chsys.c.gcov' - -File `../../os/kernel/src/chdebug.c' -Lines executed:100.00% of 10 -../../os/kernel/src/chdebug.c:creating `chdebug.c.gcov' - -File `../../os/kernel/src/chlists.c' -Lines executed:100.00% of 31 -../../os/kernel/src/chlists.c:creating `chlists.c.gcov' - -File `../../os/kernel/src/chvt.c' -Lines executed:100.00% of 29 -../../os/kernel/src/chvt.c:creating `chvt.c.gcov' - -File `../../os/kernel/src/chschd.c' -Lines executed:100.00% of 65 -../../os/kernel/src/chschd.c:creating `chschd.c.gcov' - -File `../../os/kernel/src/chthreads.c' -Lines executed:100.00% of 89 -../../os/kernel/src/chthreads.c:creating `chthreads.c.gcov' - -File `../../os/kernel/src/chdynamic.c' -Lines executed:100.00% of 50 -../../os/kernel/src/chdynamic.c:creating `chdynamic.c.gcov' - -File `../../os/kernel/src/chregistry.c' -Lines executed:100.00% of 18 -../../os/kernel/src/chregistry.c:creating `chregistry.c.gcov' - -File `../../os/kernel/src/chsem.c' -Lines executed:100.00% of 88 -../../os/kernel/src/chsem.c:creating `chsem.c.gcov' - -File `../../os/kernel/src/chmtx.c' -Lines executed:100.00% of 112 -../../os/kernel/src/chmtx.c:creating `chmtx.c.gcov' - -File `../../os/kernel/src/chcond.c' -Lines executed:100.00% of 59 -../../os/kernel/src/chcond.c:creating `chcond.c.gcov' - -File `../../os/kernel/src/chevents.c' -Lines executed:100.00% of 111 -../../os/kernel/src/chevents.c:creating `chevents.c.gcov' - -File `../../os/kernel/src/chmsg.c' -Lines executed:100.00% of 27 -../../os/kernel/src/chmsg.c:creating `chmsg.c.gcov' - -File `../../os/kernel/src/chmboxes.c' -Lines executed:100.00% of 94 -../../os/kernel/src/chmboxes.c:creating `chmboxes.c.gcov' - -File `../../os/kernel/src/chqueues.c' -Lines executed:96.72% of 122 -../../os/kernel/src/chqueues.c:creating `chqueues.c.gcov' - -File `../../os/kernel/src/chmemcore.c' -Lines executed:100.00% of 20 -../../os/kernel/src/chmemcore.c:creating `chmemcore.c.gcov' - -File `../../os/kernel/src/chheap.c' -Lines executed:100.00% of 79 -../../os/kernel/src/chheap.c:creating `chheap.c.gcov' - -File `../../os/kernel/src/chmempools.c' -Lines executed:100.00% of 28 -../../os/kernel/src/chmempools.c:creating `chmempools.c.gcov' - -mv -f *.gcov ./gcov diff --git a/docs/reports/kernel.txt b/docs/reports/kernel.txt deleted file mode 100644 index 42b5bfe351..0000000000 --- a/docs/reports/kernel.txt +++ /dev/null @@ -1,216 +0,0 @@ -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -O2 -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 12136 - -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -O2 -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 11660 - -Platform : PowerPC -OS Setup : Minimal kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -O2 -Kernel Size = 2196 - -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -Os -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 10664 - -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -Os -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 10124 - -Platform : PowerPC -OS Setup : Minimal kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -Os -Kernel Size = 2220 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 6312 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5892 - -Platform : ARM Cortex-M3 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -Kernel Size = 1496 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5672 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5344 - -Platform : ARM Cortex-M3 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -Kernel Size = 1332 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5628 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5408 - -Platform : ARM Cortex-M0 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -Kernel Size = 1356 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5120 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 4968 - -Platform : ARM Cortex-M0 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -Kernel Size = 1220 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 9424 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 8876 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -Kernel Size = 1932 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 8616 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 8240 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -Kernel Size = 1676 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=TRUE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 6184 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=FALSE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 5948 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 1384 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=TRUE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 5700 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=FALSE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 5512 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 1256 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -O2 -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 6592 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -O2 -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 6164 - -Platform : MSP430 -OS Setup : Minimal kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -O2 -Kernel Size = 1164 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -Os -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5888 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -Os -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5584 - -Platform : MSP430 -OS Setup : Minimal kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -Os -Kernel Size = 988 - diff --git a/docs/rsc/custom.css b/docs/rsc/custom.css deleted file mode 100644 index 4ac73ab1a6..0000000000 --- a/docs/rsc/custom.css +++ /dev/null @@ -1,800 +0,0 @@ -/* The standard CSS for doxygen */ - -body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; -} - -/* @group Heading Levels */ - -h1 { - font-size: 150%; -} - -h2 { - font-size: 120%; -} - -h3 { - font-size: 100%; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd, p.starttd { - margin-top: 2px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - padding: 2px; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #ffffff; - border: 1px double #869DCA; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code { - color: #4665A2; -} - -a.codeRef { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -.fragment { - font-family: monospace, fixed; - font-size: 105%; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 10px; - margin-right: 10px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #C4CFE5; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.memitem { - padding: 0; - margin-bottom: 10px; -} - -.memname { - white-space: nowrap; - font-weight: bold; - margin-left: 6px; -} - -.memproto { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 8px; - border-top-left-radius: 8px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 8px; - -moz-border-radius-topleft: 8px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 8px; - -webkit-border-top-left-radius: 8px; - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - -} - -.memdoc { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 2px 5px; - background-color: #FBFCFD; - border-top-width: 0; - /* opera specific markup */ - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} - -.params, .retval, .exception, .tparams { - border-spacing: 6px 2px; -} - -.params .paramname, .retval .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - - - - -/* @end */ - -/* @group Directory (tree) */ - -/* for the tree view */ - -.ftvtree { - font-family: sans-serif; - margin: 0px; -} - -/* these are for tree view when used as main index */ - -.directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; -} - -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -/* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. -*/ - -/* -.directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); -} -.directory h3.swap span { - display: none; -} -*/ - -.directory > h3 { - margin-top: 0; -} - -.directory p { - margin: 0px; - white-space: nowrap; -} - -.directory div { - display: none; - margin: 0px; -} - -.directory img { - vertical-align: -30%; -} - -/* these are for tree view when not used as main index */ - -.directory-alt { - font-size: 100%; - font-weight: bold; -} - -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -.directory-alt > h3 { - margin-top: 0; -} - -.directory-alt p { - margin: 0px; - white-space: nowrap; -} - -.directory-alt div { - display: none; - margin: 0px; -} - -.directory-alt img { - vertical-align: -30%; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable { - border-collapse:collapse; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; -} - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -div.ingroups -{ - font-size: 8pt; - padding-left: 5px; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -dl -{ - padding: 0 0 0 10px; -} - -dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug -{ - border-left:4px solid; - padding: 0 0 0 6px; -} - -dl.note -{ - border-color: #D0D000; -} - -dl.warning, dl.attention -{ - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant -{ - border-color: #00D000; -} - -dl.deprecated -{ - border-color: #505050; -} - -dl.todo -{ - border-color: #00C0E0; -} - -dl.test -{ - border-color: #3030E0; -} - -dl.bug -{ - border-color: #C08050; -} - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectname -{ - font: 300% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectbrief -{ - font: 120% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - diff --git a/docs/rsc/footer_chm.html b/docs/rsc/footer_chm.html deleted file mode 100644 index 6f8038e4fc..0000000000 --- a/docs/rsc/footer_chm.html +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/docs/rsc/footer_html.html b/docs/rsc/footer_html.html deleted file mode 100644 index d6f2fa429e..0000000000 --- a/docs/rsc/footer_html.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/docs/rsc/header_chm.html b/docs/rsc/header_chm.html deleted file mode 100644 index c45a0d3630..0000000000 --- a/docs/rsc/header_chm.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -$title - - - - -
-
- - - - - - -
-
ChibiOS/RT 2.5.0
-
-
diff --git a/docs/rsc/header_html.html b/docs/rsc/header_html.html deleted file mode 100644 index ed83489311..0000000000 --- a/docs/rsc/header_html.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - -$title - - - - - - - - - -
-
- - - - - - - -
-
ChibiOS/RT
2.5.0
-
- - -
-
diff --git a/docs/rsc/layout.xml b/docs/rsc/layout.xml deleted file mode 100644 index 9ec514ba82..0000000000 --- a/docs/rsc/layout.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/rsc/logo.png b/docs/rsc/logo.png deleted file mode 100644 index 7948daefba4efcb498af91a331000ae5ac87c406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16818 zcmV(}K+wO5P)JQIp^fx z#}{+3fAj$Ue?IWW=DEijt33 zZ1GQ+@{i_|f4XBI3N3W3dPoYe)iKJX3F*I<87g-if@cGG)L}qld<2Q z{*Ru>KjX1C;x0UUqJIll7BhMb^NeEj72~KIYlD8Dvyv%Zy3jpF^)X2yo;qf1HviER z`DZ*nS1jan-E~#fr6&dZv^du}m1wHXFbZV(9j`1r{iHAbWLBt8FF3W=+8SexMsASj z8va*}k-lBqH|^ZEVf%)ASKXb-<+L={GsMVpu91=IsBoZK3HWO3>kmJ2-n_Yo%@{r6 zpNqJcUUBAg&%ZG1@|xB}pONE6)&v1v@wT?MEnYu%g0n6+dYW%TSBH@!TE|I-0x zhgHv+b_a2VypCGOk<;dV{p@cZe&mvWFmachF{h(rxAO$H$T{Kp*t%4wP6@4CufM;e zH?7f8rDbdZlbtl%XKHEUjoNzJvN!+yCyzdGZ+Gk9v8Nxl?D-E4esHTkeCfeIKk)v$ z?ekz=}P^CrCKxcxa{3V}T&*@08Jo<}~_Gn~p)aS=F) z-xq8Ryqu46(|{ktKjA#r`-#1SYZB4w=tDQ&b^b+H{%;YtJ5DNnx7~Kb`|DS4d~aS|S0?8g?_Atv0nnOEuGf&dPgJ|!qdFPUg zFH9z*mtFmprMbW42aSAGa418@1mXd8WIKuiAPNu;b~+H<$P3-2ad?mNR~OQ@fM-DF z;?Fn|SGH5x1$<2;SP$fVSP!un8in`3&V@Laby}r*yEezDi`{bDZC8KyKMo0TKTGCz zrN>-tD?8Hen#xW-cae22wZZImn=lT=#r)%#JxD>Q$!^NWG4~LUZa0i+6qu_JHw#Hq zOLAZnScc(@;FkZq>9~^?<*O6_dDk^h#U4+0>G^~So7V*L=D3;1)n_U}da)u|1x<;b zf4S9c2_o2w#@c#2n!1E>lYsg)-0@gfh%RcHtRRh6>Rn zz6TKJ9O`hAAAavgH~*g>91`Mw2ImGAO1?%uP>%QJExh0&=Po%(c97See9fGR(hb-_ zun&cK!r<~T;1>=v0WJX5fdY|}M3d>NWzm(!Uhcj1?UhGddvt9&Y#fnO#~NDPfNcv4 z12l!L4I3YBfy3i?7g#D_Js<=~VYpo(iQm-o+%?FvHfq=jqA?H`D#9|xD6Ea(Wr8>| zhgY)&s3l>5!SN%LSmGOHw@#3M9eAby%h15*A3OJr*Vi6m;#Qn3N4FX7TGYtMBPL0A znErMmIZ3>R+RLf4lv$L8FT;dk55hlTs(K1$i}KFiObkZqCe}ar%rmp=r+way!zW0} zyJmVSo&Tl!)>ua_V#*GRoR|~ip`UOlULOXdI4Me`G+GKI##xr+JjCXu%#H$z3c-u3 zAR%ueOA0Y9NGViY78f3v8vcpjWku0UObTz{M7AFm0KbXr$EaU3;)7ON|8>lJ$`X!ew zKK9fp6Xt&2E!#UcUv%*WjawU(CDdD|aag_DS%s$QacnIwQ03=-E{Lg|4dHgL=!XHhie#6>9ZFIX7_h->{5?qcYu(-6{W zxGGu_rM$D8;hu;iO|(|-;$+o3>&H!;bzsE(AO76up1RA?!<7XRIt^@=#^AXjQiyTD zj9>!6U*HQ+#+f9t*_TjUA*`Eeg7vHJ^j#Qxkeft3=NpP?0_5L>S`IDk8q%o+)qqD(Z@=LL>xM267F$;vH2LR12QRKFSrh{ zFl=*VO$j$XFg{QY5Cza3{sK#)gh`vQ&n%`w_(sV@oi+v;oG2u?EdBytZq z{ftu@ntBcm=X%C4-yBKtQhNZ#OJ-}MKG1iAR84mo**+eaD8ZB_R0VgmM_|HSur?TJ zY8M~u+PC^T_T(As-rD3lSFx9{Y_9>F0>44bkKAVpiZEbgSaI3LfQw;K3n>(cKmu&lXy!()RS?%G zntDgi`Kj%c7%G80iUk;=o*{aW?(91sG9l`X^oPQaF;HsoA}Z~~bWgb6{B zDhy&F-#}!6Du!Da1p_1otOr~Q_!NT z0)AI~6jewDuqG9N64#?v_NHS-M>?g)IBbZ*p8ccmr*Uri*x5!uKYrSR&Sl!*hsIkg zSARm;C+>Of`b%#pERwSQ2ExoNQa06U`ts^wvyb__8@&3=W4#cPToYoM8NuB&4#hV0L@u4NA`?HeUDNV*_@*$u;Vg-=tM-w2#7C)UlI+v z?T!*KVL)oZXCxu#5;OD%fgUg6R2KV z6ZGX7?d!n1X!?wiB_ExB%@$bh3CsiaGLC^lfiy9vL?C<@`wju=fZ4( zrocfkXD!R~gQmZgCnqq^2nmLzqrgRWhOZS(TLX77{1&bNECz3?oPhy3QAij{m)%a( zczFU01Q42zFsMAVBT(KVocQ=U0!~oN_LC4KSXQ6laRd**ya=>)p%?`s%ttxU9sW9Y z@C&Z{@}2+rmqS3@=8p9vE2|b>xM1tEyS?*mwsHIjy?(W^3v5%cd0Y{0&l59Aa#@mc z6MKT#6&ek3(J~D?Q?)tQ<*H%!0Aqq%jhqR>4yTRM00$5E&kYzLH&dI8oI&hi zQZieGiGff;1%(&@6$_Bbq5{m;%_X3Tvr{x(~NxK&$Z zD5eYYIXqIP(gc0zD3jo7mN=5#46XxvNXwWAGeATOQd(jiHJ;@j5++Qx*90^Tg4o+c zx@1#pAFgoN8*y`mwwK;{`s*iM?_9#dGt^8E%0XCFG&ccAx)H8{5&+32_Ns85P%b>G zC?zd92$ra`j9K~$lo-qnKC*|IW%wJyjRIrH_Hx&DBU(elGZbKxOs|1>-i8tYT>-)t zKEy-;e*TZL8Yao7 zXM10SMc^)u5+-DeWNjTZ{1T>?LS7bN1Nj|Bh%y@YoDl2l`K32r{9ix&v;R&PrmWULr-KYWK&K1C&)lbP=<<2lHJrY@DNt^>j0|@Da3`6P_}@D90mc9lIsI# zfvoN8C;f?GG4I|awBJ9WOb;Wm6udDAvUIne>o+W!Wr-wPkjX9vOq68;*ej@EV2`8L zwqwX3FkV6THm(HjM?7h#Mn-u2(C3XJ!e}t_UJ{rj+e@V69vx(ko-0Nf1k?jV28FC; z#R5aXV46~}P|BJ|mJgG%aQyt%KXi3wuetsvmsz5{pt+My+)QA^q|xR^_mE6%e#H1_ zC0drZfs#GTaBBh)WEXM!N}i?1)5 zfBZf;*XQ)@<>RSy=ebHtDt3(Bmfj5V2$0Io54M504SPJG*@04U2DZG|=8Pe97i2}@ zfXoYk2G|xTMTD>hK?zKaint)mQvmRQ?VF5}*|IH!ludVVVZ?{J243 zj&|V}cHp9_U@n1Nk;!lGyKCQ^I~*uBsyg8N3a;v4XVN+YCO?b-4NY{CGW2HUL0NH^ zlNm1b4Z=q@A4&`m0zf8UG{6a{BFQ!wG)(JedHV;`(H**TkZYq**P$m@ zvos{J;1pVA9Qj>Oa4%Ehnx=M>v~jQ@=TX(3E;Tjh@Ujkh2pE&0LkE!q`le$DY|y$> zL{zCz91_U1DlNEkN91=8-2JVuerIo-JDd?b`NWeAzmCG2aJ9!(BRR??(6b;4fGYun zBSJ*q9a%U&JTmCv!U_jtX{xIdp-%#bXb9;^tcVNxu275s#DU)iCn>$XX)qs1H_wDA zy5fY(!h#%N;EMnRvFtROCLyYnGLKKUfmCnVvg06$yQed$#OeAE``oe$G74V#K|_!g z#|F9%5DO63@*@Ky<4d9mGhG@|e)rou@e-e%KQ$IkRm z(EtE#2aZ7?A>5e!6Z#^mPop)F=|pS~0^M(O0^@t#u8f^rck7J@NnAL3HttZeL|&do zkelJ+raaRt0E110ki`~6+ghk-Aaq>Hmj-=1*X?@#nZJIR!BbN!2$wrgk(0nJwv;Qig+T}Hl~(9wk0CX05^L<_-b=J+{CM8@~ugS zKi$1KJII~=ga$!?aEnjTn`K(E6~C-z+2mk}D=(=-yg3u^ipNt!ses4b(cXUW#P!yW zf9iMl#d0LR3%M1<9qNOE*eGCVfX?v12BiQMtXLdKJeX;ZEiSpp?RVX=mn-jwvHapQ z@64JvC;fP#^R)tOb`Ykm{n2ELo*O{^MXnU)69!x*qz-6U*!YNuEeOGdJ3NVw#B9VI zN|Tn^(uQmYEP&i%hD#(cNs#m(8z7cR3U6GxR7qWZJ+U(C$}6Y?Gd447FSy+H?VGne z^7}jgeyETB;a>X$#@zI*FP$=+shxD%<^TP_U0`_wZpjXsLJ6ZTl?1oKW(7b7BnJJA z^cBpjD+a5lYgT`_m&@*V3h9LSc%}=juj*q}*nI$OgUx)P8l)Q)5pNJT9DRmJS)oq~w1V1AlN10H zMGLBk(G9pst=Aigq{(16k|n(rO>#Zf*}}4RJp?F1YsCRjW79 zE+d{y(CH{fabcYzhA5+%09G>aucHK2u$7#F#M04U>~AsamQ;m3-glatl+8xGyr?S> z3}mcS8g$CQPdplnf#GKqrG%SNy$bO|panxX{a)hEpl4%RP2Dkzj+-!k@@1D^C0Fv$ zEVK~;VuN`(TA$eZQFm9@;BY2Yag5#5n9m%AJ|^^bq6-ZJ@iR?j) zVcl~^b?xebT`*QDjp;^!e*tV+?h-Vt1<%?GL^Dh)k`Rg$?-ZuaqL#QwOr)_oS_YP3 z8R&GfrEB*?_uPNYl~>sfq-?6)EWBiNzotjtHK&c6l<+2g@E_L4}PSJ z)BrMpmEl>D;Db(jPzG7@NpKIX8wcqh7|QNyJ;a>*$wLd*nEoS2=5##P2N zGQ^6wSk43>98eZ^Q*@gS|D3oe(9xQZ-_*@8ON6+Uil8NMxq&In43U6e6^ts{;{<>~ z#UeT0Waw*M)=kavX?vIgZ+$~Ba7vS6{_jny>{lr zBeWx!r*}DR}LlTesa{Xkj0ol zMC*E(b%9J;j0{?Oi3`(!3yuJd(bJa%g9pelKt)8$LbV1058w{wBohMRk_`3el5UWy z6BLWGKsD=y(z(FxA(5M6r?wzE&)^ESj{{CF>Zz&;3jQH^uuUeIo;kysY<1n?WU(ag zK>KiTD0{p-Nnl$PyJ#h5i=HXVImJW>?t-PCof3Blh`Vmb8YX;QFiF2Gqs``kIfKHL zkY|ObQRHE8OApwy82ie{zI0VGK@ai+%esmmx9!seP z##5k=mXBm=~tHBXI-TGh0W>)p7HbOj^RegU;ga| z*+Y}929UKg8wVQ_?xnh6*-%}>js$3Ag;v8}yTg(Zhn%>J?p)$v#1Tf$EqWbIOP_L& zsao_Bxlh&$HGt*b#br=LmM0}?t^>;=+vZ3jWl>g}I=RN}OMh}BAQr*0O@8*7-*M`Ows#D3Y7gIVr>BWq zfe8>|0M8k^su2`f`6ytm!JO=vW)g_Dbi9vNxnU`H`$5U;VeYLn%^78DmpyR(e)_ z6^7^&xT3&HTzIYQB@FOyVmwV&5mbsJi=bG+{l%>OWCasD03=vPe201N*$ZI;JKO$hT;)Qkd_^iZ z$MjE-!ZVeIOfRRR@ImB719O3910xkK=o!g8b&OA?ih}9@oSu` zUSwM{hYT*;7*G}zJx~@dUbwJ*d3<%{(KdIjGU8?C-% zvLsQ1$+9G?49)-_D-MZq1}~mrc9-n(OWW4=@HBIJB}GE#i@lHR+Ou<*b4r*KWs4#)D(EI zkTL;>gTQhRVZJ!Ja)cuscnugIsPD}D)&D{dFKlSwef?Z2HPjH5y`<`Fwe`tduFC|K z!qL)4G>tVH;2rltPp;e9K5 zO@#SinZ-ix;rX}Ud-sqL_dg!~5p@s?QR6HbPnjA(U8^3<6d5Zhn@BMM$%0>!jl^s; z+i#*b$05FJtp_Jwm&3ZUmf&sc$XugLZzCqdS!pre`EOfM(0zSk>NmV z%8SL4NJq^;f2&R99!1Y4FZsqrZ;R~?Z$l)ul@aRzVkP#Q>< z7KSsr!2Y%%QwK~?WtWUy@UY`OVMr1dW`HPnzP}v?RHB7VPn7tH>jg42&vb zB=00=o^i};kF8S|W(ryJ_@ho3<}?8hXbCHafm-^57xR6Im9Qd`1d$rWO07deTw!EROpmTeeWsfBGkIc6QR=%5F zrFhu4zj4k;PyJzYj?F1xl(?G)vt{KKlA;Wy5~`k;3k5f`J@&xkb4P{KPA3S7dcepT zT`qAdeaiGB7qv%YX~WEDc~vWb5K170ch7v-k*GMeXn> zc-}?d@#iG;TI4vuTTyC2t=MJJp5#dDgvz^f-G_|0OG;14M}=odE(U49ish(YFc%Rp zkVq;P`Hj42Q<%asCL&`@_0YnROny_}mFfjCE#g2JQP$F?f4pSx;^WO47=1^qSJ!0C zwC&i{T|a4J&X5LUDZ`{bpD)tiC(A5dFi5^|>zD56j}5%txb@-wwr9F_XZFNz`{{2w zA`!bkSUb8tuk&n9lbCJm_QtQDf7$-d)Mi(NyO~?F_&8I`VlHdqNC)w!euXOgM zSKj>dUx2y2voF%$62J4&N2V@0x-*w4xYUe96FEQ+N>g()5aax>?su&>QITwxpM(?g zN!^R(rLxdib*c#P4-IjrO`6X0MM;EmMx^51QT}*HiCNI{3h-7&T@O@krW(7{* zm%g#gV~}@O?K;LcPW4O9D$Kiw?*Q|vZyOsUJ5HW@d|h4Dvr8Y(=i>z}6^SKPyOPoM zSUPL-1!B2E$IwvDFgyGEFaPe<-TjeQ-+4QsYsa5`=3pihtSp0-=!*2~jQC4JOJ8{Y z)H6;$fSKB4#bQz>YFaERGo@G$k0j(Is*xir7alU=&NyOG!iMQErZDqyY4d1|xlK&9 z%g4a_Hn_;;5_JbcDCY%^5oN)e$b0|`O`5=>UB=S)w&`h8b+fvXuq6w|q8B`;M`e3O&p-VY)QcZn25>vUP zQmoAt@n;wl*bA~iW|S4{a!|{e2-?6VN*1483lZk@E5lE+je`vHXraBzi zWYXjDrJJ9>(LKT9wD^}IjCxSxM z1L+2tJ^k=c{qP{57$FIpW{A>ppc(q#gl4l+XgTJ3q8m^oGa%_x;Vn)eL- zAPh5nIW{~Y zsCT8lX6c5V{n0t|7Ukl3(=?b}udVV%24eu0!off~o6Q?WUo`Iah0~eB&|r*dhMUlZ zvu8#-yF69S{hed9X?y9hlWR^?WEZ;0F|-~x(Xp8^bAuQefDH;JoYKS-`XO~WI!dUd ziwt4R=YXv$z<`dB%SsTTab!#^6e*D0pphFiO;MN&Y?zOsZ$F16ZQOEe!FN*a9Kf%Y zWVrt6){-793phoZxskSa=c2F@KDWAV#~SaraAT}RRduJ9t#P%*Qbi2<-?RTU1~Z#hpYg%}=npy&SMRvQSio$(HoFOTh8cOp_vXD?D60qBoeSIE9 zN=8!y0|T|yW$m54eUYJf8U$~lzkeVW87e6W{o#)fTzZX5%$CpnVg~m2g|sufD7!o47v5|H~sx@ho#UixNh;= zcfSqP=^h(vZ}@O}{Tx=ujz9VEn}7VvX$$IKzyF=8Ij*cDhn+Ueq9jF(tz)&l6tE(a zSb0Q6HK{13=FUnP`>4cBY%}1bX)OzM?p>vopQ^aM*tcSEgFdI4@iKph7Ps=?xY#1w zwrxJer0Ig*+uJ+1yM4>nb?2OSwq#dej&1ENcCQEc79dh0kx?Xd(?^YuKJw726$jqj zig#wo3=jnpQ-zf;OfqV9F{8yCA{gF{Ke+Ahe>*INR$`;ZJZ8~L^`jUa)6KgFxoO9w z#C(dBdr6=|-WdQ&QBgHo^t2Y8kg9Om2#>v$@koje9np2dL9HQx=;&IW4^NlT?vRM* zJ#Ao;B&i}=L5Y?{A1;8(%vSc$gD>}IbYIRM>Fg;j3j|Aj8@FzJe%T9Geeas~?w%b@ zyQWT^kr+w=%Dd&pA3XfQK>H!nC%1_zJGFp#m4p7W$>r@bxco=O-nVD{MMSW5s zy?>nh>tEeqhLA=;IIE=39%6lUG}mRI#Rc|MnzSW&u1C*gz)YZK2(STmnE`Bw>5dp0 z!Gc87Bw#pTIUq*V8OROzD`QQqF)L8J#pr^o)tq3@^ypgLwE0)BTz0lOK1O6LbJ2D+l|N8b{eee6%91LZj zf9elGJ4xC^(=w50WA%V?8Z;wgfep+{j_~ha_1(|>`Mx>VH;<{E+`dqT$z#TA3W=NP zH9&e6QW*BIhZ*c{xDDv8szI~gq*@sT2nAoT0W zwR!6%r_-5AWo)YBowwfY@9x>UdgTFA7LKXMkJ#PcQ94Jqhb0li#`YP-vL1tHdeG08 z?cnCnXVY-soD1kRW8j)$&7X)o7NVwt)JG357NMmv=MXbflNcHR zGc2o(S(^Tc3xJIk%r6D6}?GMMO`7iB$&UYRJe2GWDo zAZ%jn+ydqqNXaxNDPZdk>^~J0Ex|H~y~|zxLf#l`Nnpi{n~8cTYL(QWTZE$-0?dMT zy;|(;k?u6lJK?lMB4yg0!Sd2*B;j@YlR)N7T4I{l>Dkq=(0B3Ka=n)RYv`lZc|DSr!(A4)~l|=^aFD zIwN1SECi<%D;WXwES!FHGMS7-6RvV%F!Szv?>S@1i8^+~NvkqXMk0?q{mkl>D`!og zbdZ$YwEhFP2lNJ-IXW7goPXRU4b~mtd4?GPzAwJyb92`BO551K(C4$rMp#|i@*yES(z)EfMqtMES&KeEQu&lqyRBYT0o>G4)lb6T-Qp3 zD+D{LVM{!s7AT-~@e#;$F1d-z7mmkL=}b1FbvPXE%JQ;!G~#wJkcG{=o0dKIwBPHv z>z@CbH}8dmB<|f0{>EG8O_?!VVA+bU^I`x(I8J>Dxnkm|yB!13uZA7S0q><7h4$%wAelnE6@t) zNJGhx1v!g3_^G@ptY`FEl=QhTKJLO@t!-LfR|#ux+0)vtt_SoU`sF)>5gd=2DWj->U7Ld62Ti@^x;|&>5sRA zl}%FYV~24H5n+RuFU3To>0%wF2m+$Jgd}B8xO~L8N&Q37p7yTvU^EwtNBeu*_B4b- zj`r3aOP_pf!j#d`Sg+ryj;bqp_K}xXz5d(*6Za2Gf1ezPfI3Ackget|BF9Di1zz6O z8m}2scHRY-@8u%k6=uzI|Pde+sD4XhUeDw7vGj0rQTTEd2 z`Ec8b2A!~doe^^N5BAYGdf&vo`PS>mdIJ#XF}8{8dpk$#B{Ksfs;4;t!gg)X0+Y7I zkv5H6%x3G@keAX!vJz#U*)4?vP8fA81X_r1S&%`bZrZIAr?soTe{ zEMK6s@PWm2@`gy8JWtX#8Cb03VYyC&$;G;P5f4V}g^UbmgfAJrVjB6Yy+VuTFOV_8 zjbZ{ou_hd8idI9R7@oq8i%C*eSDlO{nL%52?+&<}un4($N=qeQSpMeRxnn9PmcG~Z zJ{PT26hBs+?9yV~$DKLpnA4}d^TPhYvdv8!l_Bn0AW>$e%NJYTSf!L&g2;X3_LuId zWaWFm&TyUOP3u>kee1cstNZ8?)H8x*`p{tvn_7L>U?XU@28}W7p@glh_&8SH-P&t< z6_P4s29aL=NFOYt8 zV8pB$^PBeU35QC}Jm9Xp+v9F%YTmtj=hV3)51%__OV_47dOL{tTtA9`Nw{2r@4&!u zw2~`t`0h_{xpO$vOb!rF2~n!3e+u)BkpalV-2oR_z9;O;t#P`VfB9P%-uv4>@AGQ= z9f=4ysC*Rj*2|cKWW$U^TZ?IQa7`hqj!|fyB!jj3?ce_ChUSLjPCQ}uxG4c=Kv8US z7SC->bb!#Xg=zZbXhttMN0+Q$z5c!T-&^|PQ(HD|R8v~Q&$*iyn~CazvUyS+DxWp= zFkRywudltmE0IVx?rZ`h?c%R}BUc!D=$?DDYT}=WP1rEEIYX2bcGJKJW(s}VYC=hU zl&`8U-%G#CTzAG^S#+gOJf}Rfx?lN{k{!els-Cs>911jGrgSHoOSzrHBHDq3dE`oJ zFQeg^GP;lx#Xy76%MB+9H1hwvqZp#}{2a(FdRml){k6^h0gan}> z_Rg|5#~rcgZ!dfIUAO)5%|CAba1YSbnM47H9Tp{tsWzw2o6Qu4V$o2zboT5yCoMVo zyI22JO;0|#s(pF)*oh?r(_{5gNn@s8^v^ zoD!`mWn}V_&pR~KS&(C2zUfPCk2U9xlCas48{Oy0R>RpsckXTq2I}An{d#w)T=~hx zTQ{xW+_=p!$&~Ta#>|+p;lmGd1%2N9BlkX}k@JG_52MNn%vmYr2C%XT;h@??>3fK|F!FIw!OzuTQS(SW8{%jTr;rg5x`BD6oN&D8Z6U|h{fK< zfBxS;`qpJX8zz+wJU}^pX624(Pt{^Y%b*g=$4zX!P#~3kBx0AMTlciSku|rR}!ooId0z_i}#zj`3SLvitj_S6-_cKk5YjXtrP`d5bPzKLOG=b zsp=!{X5wR{Zwea0m;xfABbg7(6BaN0{eyoBdPeQn-S>GktY0?g+ou{CQgMuu?lg)u zHyBAm?_Eup^$SA_%pzMW?dvgWM~A<2#ka1%`s$OYI;i?}?sF=vWrk$JuS?O_|DGTdFUYs~5Fr z6_jr=6Ds-e56?|sbjIh6@^ z5=-aPVCnHCOBOAAY1u~`J}gqUJ9030|GcAO!n_qrU$k%IsSd+gA;B;JAUeyW3JHUC zSUMmcZ<5aB2j!?Vi5Ro!=xT{O@VOoEQk)c7UZgb^k|f{CdtD?jvXrOw+$c=WbXGE; zyF5oKjgXhtzp|H+9Bh8BzkKrgH+p3UNwyeAS50?SOKMPbgb82~JMIdJI7(SbKe^%h zOP_vh>5L<1z46wIwtDKQX3pbF)RFY5hwg#vm;;BBz7yu2@`ImWM^_rcw&qs*wE=~T zZkrILatmIG<7mn+$y?xBIN&2hw?D;2K87lTtY*B!WY`4r= z1ZtA-KD!hKJAKeWygP`qTvW<|2-(K3{qdEFwaFEm)^~L!`kgr}NmcPvxIV^W(){Y< zulmA?d(25^$$rwgGgjvsi3IgYzz*VxIOrw-wUC^_9Tz>ab zzQzm_H|haa)FHx4fI%lXIbb8P(RBAXYV)Hj(p4!rN-1bOvy!gd^4=FgTsWF`bnn=( zEAfYXZotsOTGo{Zq9e^kIJD=?y(&eor33v{y zYNd;q)Cy?uCng8{(^)ixGbAa0c$6!wt9n(j$z1-c1#f+s< zo(fX?C<#Q>m~i-X=ghc0+uxt!o&1h_?)BNes3$YOx$3F=@4s(%B9S~h6LBhjq&{IsN;&)dnGzpNU_bkvoUop}6-(Q*=)jOk*zeqI2O zzV%SF)gIdO@m;1X zMq-@H9#U1~&X=OHLOV!wk;PV%gQjZ}*PKKfBW#Ksv0A4ieOvywi2K#6PJHX3*Af$` zrxu@TLwA{y$OKjt79D}zTyvfL?ptsB_LbKdX5r;mp8d{cSC&=y+sg(VDTlTteby!C z-t(I$4=qhMta$07`!4Bwc|Z$D?sB_lx}2A?qSL!c7zU*PV+9mfQq5q`z9!<#apq?Z z)ie)7?>5*wU}su^RO~A&GRT2ZP}(NUbUQzM#FX>De)0XkzkA!BJwZa91=1;+AZneT zrsP2p_ZPQc^Xr@LbYH9jngLrVH)tkznQ#xSuRT;Xf*p>;#Nw%MTyf@K?tk8Q20oVv3}w)ARv%?SB=KxFY$b=! zUds<4&1_-ns$y1R9N^`?wYrhuy&D^Xp>cgyqSjXAvQrD9Q@`M}f*u8l}K9@F3)rHg>siYXkp60p_>Ph{{&Z{U`2X<~(jWc! zvWM?@uz=5f5?PuYlYj~_(|VXFu1XqxCPcK80#m|00w4PUKg{&%l8tFk75@Cdup+dS|Mr9$&Ow5{PwrreRurC1)p5)z>SE8?K{t&c?!VTC;5lXks<79mM5de zVB@a;e(Wx_M#+?A=2X{|lsK^?KN$6dKlkd={k_Zg9{#>-xg2xpwhF3@rhGbe&0&G5 zh~dDda+a~|0I%pO8QEE3_Db1)ZVpH+Ey0fQrtGn8rn1&>H_>`~=`|Nz(zC13*pS={ zW#IrgA!WovSF*)tCRkYtpvq#6rYk{T`qQ8PaR2@GCcgI7J)_G@FAJW0lz-N=K>ez0 z1AvOZr7Ss^YMx+4@PnP3QvJGkxF))2!#(`@D_?|@IIyjRcm_supgs>Ly}D&1vTS)K4+bVlUYfA2eopNJ(v1Bpw6 zM@t_(+P!havmir2<^a0rcy7z5E_mR?{rZI${nxFx+ZUo>g|&5WF{{2>J#sd>kkdPo zm!Ep!=;)?c4x`O&*?Y;D;3_U09hy-h9Y zW^6z%Gst&HfNkcXOkjT5V)1 zGVGkA|2qDm6*#0fUw*Q)r?a3HF2CZ3pK(!s5XZBBd0^J~vTy~pjUz8U@taT1zxL`f z#ZHd9YW&4No44?~%JQ?M3I{1WRXUh^ecqAk+;#95Isf}dm6Q?Z6dGL2JacKFf|Q+x zqpccYFDobhqp0@?Rvso3FZb=&We?SK2vU)}x_7ACG4w5CoP6C$-2%ZKVl zhx`bSvAJi_Q*Njqaft#nEjf{ug~@&Q+zcPx_#c;z4HEC+G`NU)=do%ZS@X&x!@u&O z@rt2*DX;n4e_ngtE&cB|Jao;ke)Y4Tz4-deZGY4b)r}7A;T|u`llA+ry=kFuGCr_T zRB!+Ut}FqA0et?!fa#*6kBw(Q%SlWojxf#5W#?Rc(M>=7<}fdQ2+ZIAcaM)&y?Wl) zzWl?VeCwWV51th~^7pN86ru>&Z5w&lVA10>p_Imtl3i62CK!rXef&xNnO9#t{@_M`SK9_DWA@3GpD129PZP1Ll{M!fa%H%gDT2PJ!0!m7lP*kiNkc*dMakZKW+kMZEu(~rva<=5nH93hUKx?` zeZ21D^Zny@9G~NN{CZHPX z{B@Q>q2i&V#oxW$>V5=&p|O%Xb&(GLai+WJhkssge)5VHe!rRgk4kQLm_2^D)ml;0 z`huB(wVkfzEsC9;o$wvgyH@(T=C_2+EDgiPB{?Y+Udkzj6Bq5nM}OIAUR3@kJ~>ez zwuwqHlwWgDk>(~VYg|j9`oUCP|1ov-hL(*g&d$lHJLWb%2rYeg@V@7(SG>_DSvQ?? zWL0-OkURfx-GSe~4Nla(coVjuv!&Ux`uoe5SF`5BkKOXI>nUAd-_)eEy0Tnn{3Ahi z@KahGsv1_JGNo%T5slGn|$sZPJHrY zlW|){pmxaP$6inOUA~{9onyV{;-yQSiH}A{jYUO8m-@e~{P_I&^TTJ)=3>H%M9dVw zR8=u*XPSDS+kFpz+VoeBw?*%l?)rEY{*nFr_eUotuBY5KHZF}MrHC`e;#YwH&nScZoYG3$^_J#E&WMP*`QqN%AFotCyyS6A15x^KON-8jR60|$2R z*~53}(8dS}8@X%OxO;kgyGKVE@M7;C>{5&Ds*X7R=IvY0ygaG!@Nk9UimIxzz-{8^ z&YxeSt*sp*rlh3QQ{=U-wz;{ytH_H_NJyyZOGU-WhK2@SQPE9mk&+$}5nK$6jCHlO z?kdlP`NYMyWMpJ?{aI)iD=I1)Y)snnDmE5NLX8Kp9;)w;SUt+{M>uXf7nl0w%f5gA z+EWUv!o<6Kd%ebgb&cw~ao z(he=n7pyAk>kCkBEY1vZ$hb=4S5r-YN!Z)l%kr}LxrkI&R=#=vUfJ1Ml3zeTT~pJ~ z$A@-iq?tK@T}TeEOv}vuVDml=^ET(%#>*UH#vHa|t={`CzbpLub%WhR$MQZm9v=rM z1%>hP@lQ4*8vOi+4jzp0^jxErs<$??x~1hsb@(xP1%>h;E&=SU(e2y3{I5z&6&^i$ z^lE0tT6p5Y*29CBw6wG~v9ZZtcU{=Au(){M#6*ad^=g4@1dh*}9bW60cN!WRnlAi~ za!WWHArW$J_oi>#Hg8rmGBRpUi;3Yg`I)A;zZ2Vi^6J%yy?gg&*v+oE5; zR`&PzZ@0X0gV$!b!QW{jH8oXGNJ#bP&!0MZKVGZ-o<5-U$xl*BN_&5p?uzhvO4q=E zPnftFKTg1*Lx%=iQU!FbUd^@{8X6jGe$PYc>d15A5V=9QdGjWPGB7Yu`{PFm9x&^` z1|A-s)C0jd`6txXSqoMc_x1JnQ&F6yc_g`+#l*xkGflZ7rJQ!A1^W7~o6pV66yLC6 z!^5a3X39~AX~F!ZX%*{{CPubhXBDno*@_P_Ir{VPO+!QdzKRe%6FO#Q-?wk~4t#$} zEh8iIcVXeg>C+odojPT*xaPCn1UDW(d)`!EpBgJ%`sItI1NlMcI;QP@FJ8P5ds-zj z5x`Kpsi7^yME>^e-CI6aS67phASW-cxcH;KzFyBaDKIdQe;EsJl6v2VnJ1{z^&ewm zVq*Iha|Z{9((>}&*7UpNIlq7ZZa&qcn3a`9aX%@w#)G0jvuDp9d{W)H(Vtn4vwN{) z=X7)!u3o(wVk^pHT5!L-_r&GPTMipm_cc|8A7gWLbTnD~5EmDx@O1}2Zpg_~r~IAS z->+2nPPJYXqu}_5wORa64FrJYZrGzj8WIsTpGV`W`WvnIqD zS1}>|Zu3USd!y9ZX1`ABf-yq-_MWt*s){p zB<1DhLl52B@Z4=>X+hMytC0Ph=_yOgLsJXRp;As_SM!};a&Fs}7#DYs@_}dWM*zR=npt*W5V z-`^jXlA=oPn#Av(p&^6>fdEx00e_tvwKcM>yhDeM;)6%|A) zoSvMF#`8TwS&_1zjBezOJZi!3;N%prboA)ahsnwNr|c!qU%VK1Q2)!rw{M3>^65Ez z{QU5?C$C+Lv{z7&{juZK@0utp-+T(W6F54BMMYGnPoHjg z2@CDryCESVfxr2a06+f?6BEW;w{B4id&`4Sq}QP)D<~@q2njJ>&9OcaCGEnyZy!B{ z3^e#j~+Y5CoRpL=Qz7D+aW$9gB@l697_AgkB5s(N{W8}$zB=%_WXdw?`p1# z7cUl8S2N-Aw`ZVuqJepnrfFhQm*-^nDdE+tHB(blA_ot81O+kOljAEcE`AsmMvqRV zsikGCcl`KqR7Ki|<915Vg|D8| z(rO*BeBt)GwN>j)Qj!<_aImV?IkgChS$XmJs!*@iqN47IjGF3dpPZbWiYB~;(i)H#k2~`0*|Wih#2>zlzr$F=r&7Qc$4Lcz-RhtE-Fshl+{{>-OyrYHQE!-o3l<%NJVx@*r=t z9q}!T|6Z*1srjuxKmO}OM#jpwTY1dJYE_?3IXX&+nRV>XkVa)kVd05ZR6Tqil`H+l zP8PZw`ubj|QRHO(%C#%U1E`-nN1^=f_T~BD@^5awK8Sf?>!*8Ti7z$sBw~k9Kv*_y zy4RR=IiO#FUnkFT^MUL6rG`;1U#cEzp@k|3a~FO8&VVxn#6h-|W(}36msdz+Bood- z$V&|zMvFfKs++cKDZ%ei(=xCmjtu>Ho#nbLLEzY)#HRUETZDDo!^5|`{u>jYw3nn5 zj{f{eMM0f7sj3R7Rl4x!cT9Zz+AUkQe72ujgHnWrkZpc<^`QOajSvX}9{Rs-2EZr; z?vs|5CO0(c`2PJ2xLG{LHC1yB->+xftlYTtw>LP;eu^L9XKHD|iXwaF48u;4;@@8{h}6;1 z$?8XueH0QBgZh)2_Gfzf8S5#K|qvF@ZyG@mCxoKd~WE8e#zosnKGw%I+ zHLKs%@t;143IlT7;vZZ2h^B1RnJ-mVUe3l^_jjuIPRj>fp@Ac!qH*|8qyYqS9Q1sf zl%y>*KhYpLB-wW1u-ngveDYbHCdS4rn>UvUjf{+xw6}+AGchwOtEw_CEiHBZ{_WfU z?YaD^Q|p6yWN0b(?%lib^~oN;!sew|RL`1Z}~+-?P9@IY|6S70EcL3McLGCAx_OiXVQ6N~V9 zu}0ScsMno5dD0!X4?V4@cdD>=sI)4B@B_aT zm6fdpdQ?P9oSB))T8xX2R~%mXs9WO0w}1bG<4;x}qT;N+Sy}!kfFq0dGq<$#eEgUV zfIH^hyP&MBqr3O+E&lO??d#XCbnDljP*hy&o^XKL$;k<;WqvE&b`L#^jDV^_MNQ4R z<<+4UMh1p+nwk~yzx(_7PGt5Ad0u zzJBLeiGy0pPqP7@BZk%6b#iSPX=!OWq@9oAgIX*v+5l`7S5~ga!6AL5HPbBk!2<^C z(Uy=l+ukpM97oN0@gk&>fM02h9CKTd1kCrsrvf~n#u6+>-H@CHA zzv4DOewB13->xfHuAsTdqiCw@=sduum>F(VN&XCu6qk_j>T0enet*C-Gc}bJm8NUT z-rU0Cgq+-(?^RXV(;q*6WaZ{&Vq;??5Ef+W#6(A)wy~9#7H3aS&pCBqc?J1Yl2&21qaU7~W7xm{;X^#Avy31tL^xA-9eTiqNt{?-w zkxz)o{x@5dia$jEpZ}q;Pmr1{m`jH7PfzeJT#!=@cR_nXo<8-)o_uUB_#67{8LfwG zA?=^lmLtpq*DqeA;a?M6uK#{Cy{tJjl=JqTJE>B$ujRC~7Ujh~7Ah($M7T=@Ud zjwkl-*|Q#)!RSH<;OJ;eYH!5I#tq&_o&Sm`1#)`7yPE4+^Sjq=^&ii3*U^@PeZPMf zSS^^PInA41)X-Ql=`T>*|K_C~I|@XU>tdp+L(V=J3PO+i$mRlTp9d)}s z%VMVS@^$r_HwB+(xGp>9*o?4eIxkG$YRz{!-rv_(>rO>oQCfO$X?gih{;rd-Pl#htq|R3A^{j^C*4?2N)`y4{)YVm&u{#WWWORV&Z&$a-(NRI#A# z#~x`UYu4%g3+9$O9U2-c>NsOo5|8v|>?6!qLdGYs^4I34(@<(H^!UY8Ic6-~-s~x=R9QfFsp&{SGV zONPm|1hpt80Re&inja`=#Vm9*5G`;&C#R-7f`ge+^9z6fnZmmB9X!a2X3lZMXj5`> zGD>u5>tIihCty=II?HZhVfIrW)6zWe-`{{53n7CVFN#ueW27nN1+YKhZFhIK2PB}S z#gX^?ZK#7iKp+%%aA^I%lik3|<;C9gXwGOl8;(jy;1qM3nwpa501iHX;ey3@`>~KT zthv|pv?Zkw9qypR^i9C|8`FK2C=x|Dom~?X%*x8j_KuEvb*~iZ7#N&++~m|JW|KS} zCRWC!Yzz!`R(}0@-quzu)07Y^ynv|#4olzo_*s+`B0!ifqa6+Xsge2p%v+8RN3agN zST?+8?_Pc|)zn#;F4fIwj}5rpI>d@TQ!zw?CRG41_T{Hm3OXh?rQyzxfHPTglh*a>^DjUA(9;H@NF;I4{(p z5J|A8Cy|k76%_LG^ZUlegdTO|yEtKQdY(~JQ&(13ziXUd$_Slr7~PZNmJJZ(QQlkh zPh3us)t%!g|nsEj{}ut)`ELHRm)mXnA;|#F{674ye~L@d^tw z0U+K!67}fO#x-l!;F`LFzUpJUu;eFBoS@pYX_HpF68 zIuK{HJD2vG9cE-?1Ui*;m{v%Rl=*F9i(iB`B8!HM$1%GQhLWCYSi_AfaL>mlBUJ6| z*|U8imjE$9qs+enh_}ax2batLn;X+McCuPbg3wUTWkju7lUJZ6Ry(8Ea0aasb%m%8 z^T%Gt$MYRH@Sbtv@7RavmFFKbGJM{>6V6{4Jv(qU=N=9@2Pdbc$*I$)9mkx;AP@r8hJ=Q0 z;Fr5`Bf8?&Tb#OH+-v)}(XEu|oSe|M#}K*hKdJfshoBCijT5^!>7jf<88uEf#RD;L zOLA-zH|@)3xF@HZbe-R=(&>1#;R^d|>CXuWW@#Tk3LH6dg!~0hxq*Qp4v#PlOvoi+ z?e{I$yjyO1W=0Sq#u^WIR18_L$DP}@ZR6+vT3H$6y1W?j>J>jkuMp^EjZIA(S?eH1 zRn*r%vbMI~y>q7zM6RJWvx5GwE2#99#l-})mbG%Qun^?ikbd`aeO(C=NBYorAr zi;#y06c|sQ1=p$U=!nFd5B8J=C@9QSiFcm!W#XzREOZAY*x&RTmnQe*ubL>C*C)Ja zLx3%b`e1EiLt22@>bkp%R#BmhhBF~|xvK}GvXr#WpZ5e99~>MskG=glX`n>?>eXNK zVnzY7yt23h_LAIqFWw!qrt3m+<_M2|`_?F6=+dQ2_9)$WUBJSBt!W@fyf_NU$?XG+ zVc(kT>VT)0w9}Vu{tIb*+5N9&`SFP==hjfK(AmWQ23m{;rK!mR$j^=c3P6`=X=z!C zzr1VLuJ+FkY^aB$vuuvDQ&UB#od@+w{WPxEgdd}hIag8b>NX0XnUI42^9eck|AJaZ z8lre(&iPH`|6^KRsBw!XDjGdSm3e6%SS-(Jp4~yh2!zpos>i#+7Okul_&mEGom3~^c`H`l*V}vT&a>fk zICjFz1T^4WQBcE7uUcD+LckS4`Awa7B1Q6p4}{sGZ{O&lytZfT*s(*1Nm&xgQp?Yu ze9-yPI?$79>+3y3LRiBiA^_Strq`|P!hxjQut5$l_bENSF4OEfxdc#Om9Q@XZCSaw zC5?@nWq(-pLCbW1|Ng)kRn@ZTox67RqSX)@jLt&K$VnqjR8;FhmgJNaT{AQ0=sPn{ zpvV=1Swoekv_vjG7G$COU{J*={DN>({7tfEs^>R>O&e12_aSx1C|$s!bWBX97o_mH z3Drd@CyflWmJN-7U*N@PYdSrYhGx_!esRdjXvC|z@7ZGXoyJENnc-EomoMb-suIWUkRBrN;|@04|dXJ!A< zqa1|pgS_EoKcHR$`u3LdxH`dhg-@Kvf|d|fAh*Hl&Nm3uBpyWbE81uasjut zOWLz&XBZb{n6zn~v9h*Szi(PanH@pO$ zN3}QwWAgJODX>X4vL0cy8bKR{^!()ELsFwq~0vYnBblG0D>V{K{q z3TOMAgTt}ek>+3@#%*61<%)dho{2y%dvVyuU33_cJ`aF`UE z4qQp2$u#|Cl&&(F0WIa+wQJRkNi)LGrSL*N&`|r+7f7FOY0;E)S)7R&UJnTbY9Mej z1A2M5l+!bn<2J+pQ3ng$+(Jx%{1kI`qTEkTPP#`%a>E@F5UX87Z?rxQV$3~XUnrM7 zdCzjqI;EXgm**$v=6tfVkI^!4@II2h+q9q5HyK~T7 z3I-B-h2Ci*aeB9qP+7LsZxJAC3Mmca9eLjvr(0To&l*DF{{l<#gIQ-j`;RNQ(Z;WAt?VgAyTh!-zm{f^W%Q^?{D090C;(N zdb(XV8;28C!tO`E(b7@EjM7yN3=CR8T7-47+{*&C^un7^fb(=R620&KrxDfOcfazS zGF6>UMTW+~NhABCwtRk~)2(+) zD4a-Wg;VH=HvmxdhOpod(Eo_^3D8_HpC+__KY()Z`+}7m)dj<|&Pn&_-wyB4AKr>Hg)t zx`6yIV58(O4(~HvhCQOFbO^ri-sUKL9B&|d2p+&<_W^NwzCPUt4c5)%YL)U{XezL* z(DJ;JlJ?OuZU5Ukwvmku2X$AI>g3Ff0zj*2$7g?h+}`gm4-<>*Z1_Wuf zPdEvvAZepoo&P%vkTnbY;34FJ)YPeMBk$h6Eymr=s+*-QfiuY?$RZ1 z9E(gHpd1hnfgL;6!l4sl+J4ksJyyxz_`=nzfe;)eo#q%I)p+Br>>huM>NEpUf|VFz6Q%5xM;*aF<*R3mj6?TLGM)26cCJ z@jjctis0XORd0i0AOQSb78{IKfKM0$LA2eFTq4vXc@-6UXX&WiE4#$R*wKLR0h(vJ zC@ImRr`0B1K5*N}C@p%W62eR|o$>t<{p8I%3`>yZ=gBAN8j{x^2*IN%CPb*@2z{MWa`8wz2rKnQRP}aI^D?s(f`u-m|eN@ zvVuj~Y#&y%si}#aBiP4Jo<3EiwIfuXXq4GY;uf~HUx4^lGp0Lt*-nTH$U#E`pQVI; z>0Ml&@9ggH_wMSt0S@+GIw9_^BJ^WW77MtDL`rRI+a~+NUWeES!ooi3=|@n(eL+Xu z{mk(j6nA(S(DGoX`$C(ex*eLkPeOuI-iLuIxSZ`yGYa1%GzJT{wV(Iy+(`>jFU#eh z*tLA;^=L0};@69tb=T*BX{A#<86=kA3n?m=UV3q)O;U257Y_s)fJadW}V#e@$oPi3V~l? zi4YrzNVO>Hlhe~1Upn-<=sFoGDZoAw|7`B!B1QbZ2b@PXpsy4Iv*_ySd4Bn#1U;Bf zN{XwjtjzDhgFc@RjO*8XBqr{Gm_+0}BrB-U#M-kuAVuOA6mH$xfify`qmY8B@*QEEy5*mB?+ue9{F(F#47 z`|UF_08b)Ej*!BtuCDHZWC8vdHJpA3JNA=ZR3xGSeHJF-jjGTi{I>#mWFp(b%zmb= z1zmjsV-?5$9Et&UuCS?z9UYHE2Vj|_J^tIWswZUMd*=H0b&d5j4sNeuLxuzd(6b&< z&7yS&U-=dv78Z5^mMWAiN&AP=t4mfPV+aNe0sBX3W}|dKAlZ@80qsrc0mljCWa3d6 ztR7D-UqO3j4(`zDt<)*;A+ZD8#Ndy?XK_-OskRfb@C% zK?MaO+rWGS#XYTDt-e4}*!)Bs4D_F+uU{j!c$Dmp0EueG)Q8x8#I-2tH(;YU)`SCz#mc3}- z{8rZszSh>V6s)cs2N|^(s^2l%mdPx$G)WyP=}_Mj$wh)4r31^35x`XQ61UW?>}YOF zB&(e|RRnR+9PTfr5a9jclP5DB!*{=UhC0L!+_82~czIy$niByFq14kR)f)|O-GWHL zj8Y1IL(JE^f3|UQ>OuPdJN@lIUE+mZz+QT(5UCHA(C^9zuT{QUj9^J#EJ=UOYr;BGKOLjih+<>CKtVc%sMtrED1 z$E|E^i1`E{T9=|NKH8DD4IHJ!k5#}N;x4W_E?yU^2}nlqi-Y=I-Q85649VJ=Oe8Y~ zsQ|bRlx=VLe~}eEo2p2uZQ0q`gk3>}AU?|jj)QB^yb%RRA%Ls-x?34gLoNLF)I+$p z2hkZIITp9Ja^la`*41^_XPUIpnwgow+$aVsg(2UPes>GfZXT)nn{^Ei z`d!O&B+zKEDPr>jT>Zl$Ms%8r<4~X+xG0CFzBV>U?*04kK`r|0oL}+jq+6Mc^b0otBnTneqlTZ= zUcP)OA}VS;d+*z8A4bE{Pn*TV)d75n6vx0JLizIL3lLQ)aw`JU3ptz^)v<-wu!mPuG9?bJ zGM$IURLtYH?Wj4q<9~;j zK38S-2|;2~OVDeZP(t+ZN01p_WaD%dDA;ZPQE$N3ogEi6p@?a~}5*GM2Fbtu_ z^9cxe0S6W%ZWO`u-T>{58aAVt!mVqz=(>-*qx2fulERE(uR4vvj6;wQHe;)98bG7J7J94YN`A21)14ik2ghVu9CUlQKLGQobA z56GNdo@+DH%(mQ79VOG5@R;Vnwa@Me2|H0|S+;Ch$IQ%3G!~$@GP_O}U*fHww1bU} z?Ik%naJ@3<8X`swyYad=u*Z<@N|2s}tC0$|A3vnrZdFN$iz|eqjAW%}R1^jhDPr)4k5pU*cOM|ag62A!m;IhEnOyUAR4FM`LXle_rAWH zF!lZ8#Kpu2UI7Q$+}2T575ML0X($4q-4en<&9!sx3&kPOFP5bBf zf^~L({IU5cp#kvXxDgBn4jo_$9D2%j3zVGn2~ST?il|gzz4J$MesFDgS?IDxLf>23 z*nnU2;nsLzxANxhJ&TXu0k$lZk)Iu8fI5YnRNK&CoErYD6zjyfF%1FJ zpk*a)D}Q)M6a(=tb8~Z+tvlqkwYL#A4gW;<_H8}KSnYtg4c$oZf;dU$wD%nV#k*7P9B2NJG^9z$GSyeo1k+wuA$;2y_5)`&!{;bw)Z z&IK!r#6hZ(V#;K zDJxTL3NP(o(BIi7HnOASBP1S#tR8&ig2C+;1&q~K*u|$ zt^M!$zJUApK`E8ProX^616UAB2t@V}6wCFs*n@52#AKvUHf`Pve`F-$tL}^7r<*9S z@~NSAo`AY7DJh9ik*|Pqkon8cd3jS%n+tTVAO->Lto4bwu<*OaXl~?SAkwY#G=?N0aV!CjaO>!x z_M?4=i~+HG0@ugp)ycM83m==L{4;=8YHMp{LESM~5E2#^06Hy?Bz9zEq=_kYiF0xsB^qJ{*p#xX zYrdur))Zhx0HP51Adr%Rsi`m#C{e5l5Cfeig(Bk^G*z@7q7A@*1L!@Q+z!fD`0E!J z5?W@PYbhU)9snJnreFzt0fCEP{DTB?NLcSi+m^?Ga6oxf6r2U5YWtbyA$Jotw27TP|9Q^J zS%frckYq%-)*MqZ@VsAr_yDxF*?wi|7`VYyaK6@+D}2X~hvm8QzX#$nT~s!@6C4s1 zrH1wVk1NvSGz`du-h&lG(gJn9}!X`QkWCp4u=phKd2o2Rkdz?rawIicC*o$}js3-t!JRcOl zzxGpBXh2&Y9K21`NDu*ZuMgPbN=;}f7}6nfGHw#6y{x&p$jt1lu8Bz?^i*(h?{87K z^w`Z;hyfs@FxZ;D4{Y$^qepAjty@Q-u%gm!2Nw7bL7ISjYrph2RnzOLj?TjuFX-UG z+`fBP0O?9_aFW?;uEzDZvY`}?wPkh>4${H=Mks;2IhL0CdE}EP_kcpdSyyJ&W~BB( zjzelo)BLd6MQv?*8=KjL=#|<)U9EDo$)tg3gL&8gHUy^f2AUkRqooku7|J(K^2+6Y zM7o|U`^s$I|3>Bner9fEb$9kRL~xSc5;JL?DQdlKV)ARaH;2q6L7iGn%|P4+THC9# zPbg7@k-#)1@pX7$)sa&46d>+@UGu`9>0dJcq6~~dtRQf)eH!RK74a!J+!TuA+^9eN zP3DFi@c{7In3!%~Q(DRma7@tKa)RuIujcTgTH@4GLb(~4=;+)F3Rc&d_P6PtSYF>V zWzTQdidROGTWNIsc=XW07922=(E#fv1eXHkm*(+KRirC;p)2|$zZHv}!c9^{G)MHv zk%I_m;&iN`z^m~?zH{rHJ9lcEn!cbR)j@lH7YV_7X|jYFJ6ena(6Nw*rRx1RQJ@U% z3R5c|ZrAbSV3-dP1O|)?yj%-I8U!j9(*RI3!tbx(vx}p(2xF`PElkbLE4VD`-6pY zaB$q{F7`&za~X5e^X=S-!lR$%wki#s&I5&77c5by72H$=!~!zB9{xSWouqAd@1`S@ zAP7fv_4E`o&Od>AfvQYHLsJOoj=%yqCN%{$sR&LyOkbR*5;P)cjLS`9(CF`Bh6b%( z#I*frJ9sW4t2&FGYw152HSR@%lpgOZPvA9XTDC(KCN+Qr5eo|o+1D-I_9rY8o;gat z-)!!JvovBFB-@7c8F~f6wIuFJl4VFte*oJf^K+Dy33Hd$Pj`qpf`#SVv?1i>OMe7f z^^5PVhlS6+P#*?XidmOHl%?pnIC5%=(JH7!Z9YPJ@FEveO;qCOQFG;uDT@!)o{E^w z4gYCK!HmdjG&sLx6mRZh5)zi*h)Rg0im$eYhDHJz2_hlwUBoMVJ%Uf6h{xWvClld7 zZW-4z$nZzwvLgl#SF!Tjw}5X54k%H;)Rl!YGTl~JNH{HZ7S(1KiBM!`WxYW88$zp_ zL5G6Lp8#VleeoF1kK^LZ9+K)oODakcKYTbAB1UGGDw2spI#~|^Y}CM-L~-7~e*Z4W z4^+etnz^x32J=CLG(JO{JA*wzDN#XXq;ZGG{6p_5Y^WI|3Le7cWMxH}3PH#hGgjsf zNKhz{j3rcGDaR*x(-Sb(RWd(*ylb<4O~~s{9F+|?^W%2VC6RK-3?;=2k+GJxHmebo z$moOw+UTK`1(?CFu*+n)#=v0b{5@?Wqqh|#+vp1=h{in(7AwM&3-d+UsZf>Vw zMvH(i_yH0U5)|GhMlw?c5VIc9HHZ^Le!%&GuSM&=>cqt94nIs!PmdzHtQslfR&C?q zp1|g0#`!yVZ90upx>_Z&koDJHa?W13z=n*LJw{^V;!2%v!Fc!r2_aj476~Ma-~n`T ztJP@P3k83#3LD-rGU7+a*Jj_~O-vaOQq&-INLJ|5smkiaz=3vQ!A!aO*`5`;h;vd7 z_M&@u_&%K~0?t72lBjXvUj&<*@9>>zlf^7EPDT1p)B08AD{SN^~<`a=t zFx1>K2p@mQ?~W_9qV#2pLP{aYaHx86P!Eaw`tTu(FlO>%{DOkMV8AB(z;loh%Zc10 z?|)s;zH+4-6R_mFV1d=?li3Gtw;PDSnyj7YGiwS|2lD^8v zQwZ|N!MFzUZYgk+LH3!HI?@mj`^0#22~b;>2~2YGIjko-xE2=|!FmRioJ>?@Whs!H zv-(kYQLO37`9_cgr5CZ1ATTIdJR)Th*$rI~ECOIxcJWBsyWNmJctws z26J*%C;p-NOwP}v+42DzlPm$wnYpsqK8<7&h`9FI-Xl7i_e_*D7X$-&9FVLoH=BnK zWwv36mpI302cCW+c)8TYT^RU5d|&g*72Sq6>Le3MAi$97~|#&r>tUYiBB6phUrvk3sU8)MOl8 zp&+?dbY-Gul=v`Gv+}|DC!wfC&*QeEvOsQVZ0jjx3L2@C`|yGDQn`3ynWqN(@mnBj z6v%TS@)jPl?x=i_RMWGrLgL1~P!K+m7l7&{38@AFA0gYd1T7#8KZvVmy^mOujEsR| zSHC)50+vNNV1hNQ(b*P-iWu|imFI|Z!6}eH9GdwrR*b^J!bsB+r&=IQT1JKkz#o{x zG<9F&l62PZ#BX1}n$Hejf+-%0&jhp46XQe;jg1xWJRXWtH()!FnHT3Lm{nD)#A$5+b4WLD zZ`T=@=u9F>8l*CjDtx>x5(Ai|Ta$i;`+EJKhwFouKMjw@aB7JC2Wkf6)f1eXS4=FU zv1Fn74wKPK^g(^JSGXl)n#2ML44?>e`K=3(j6rE; z3m=Z8D&c;#-`)*&J}~#z>=kMgHiKvbaPagxdq6n*JhNUx)q~{3vVHr~DcU0fKk`x#9ikt95d+fxPQ+c@DheKtnq}igPhzVlngjm7>+FMJg9cq( zUcL?~doLI#uB*#-6jgD#&k}Z*@8;M|1VK911r~q>_=P}JWS~qbrJx)k?xqH?dXZBS zOMj`matbZhe&q1189y+oHyMZu)rFGZJ^}WK1dx$ccZ$h2jM`IC)0*EgJN&DPXeU^G zBHE$5!1n2`E;YDyE4{_Hxv}vUTlc|LPT2bANuc*gNzyJUwD;_9Tqbp`8Is&;apBF4 zog1-WBsvI)S+eE2vj;?&H53F}v_6Y~eb5UC#Ad$r(v`k+-dTDz{dM0e=AM}Nn|rS< zFWVr>;)C@Mv4O$Wenj%{;g9S*^EgSpOm$n8>MM;~Kdr~A6Y4<*_VH`Jmw$QyMdo&PzQ|I71psTi6R7hIWX2aF z$M~UeS>D25tIZwR<)SWmZcC~{RKq=Mb(1wM7!)2F^`8w$TN4m8^wv~l^UI$0?VN^U z;%qjR8`VGF`EG5cEq0(X&Hg8caP`{vWqa9^pRp&MSKL%&nW&Myc{ppqd6hSuhv&qt zm5ZBX-j_Di{BW&4#;+z*a}59e*N}M4Z1Q)vLx%-Fzva>GXeHi_MrD9gtXy1-$kX0V z*MiHHDyo5d??(ssJJ|#00th7hquXW*$?at8RM%@lnt+98puL0(6QhxI5TY+kHQCoc zbbCtu$sqrC1FOuuTy$6^fd2jL`0|7eK%DDRH5ua1R|c`IDMZi>6YUSMC{z>@)hXZEsLG#gBcp<}UNOPSjmL3Sa(*sq%}%2QvR~ZKb7?lM z^Vsa4Gq_uTU7*mM%Ls#^=_nv_fP89&QF=Wp`a<*T87&PBB@AKLG>*XOr~o;&_YRW2 z+40!{c}UuF4Ln|KonKRvMpjOaT>SZNoN|1F!$hq5wB&)wwBt3rVquJks-ic*>Z8Gt z#IVShnnVZ3wQW0Fo2k1OWc=t5_Ublv>yLQ(yP){^>|uq=JI-=PDtjMzR9Nz(rYj=U z_jOd!@gvM?GG2B@+>x%dm|m1zW^kSTx0Zk3z9j9RiD%(1vqGZtrr**75lPMACKswg zVPoUdJ=fY*uqkLUl-N4DRLutz#{b?||;LNXo9L5&30G`Cig&#g{=L@2@ zOIXvntuBj~H?_AvfUzXasjh61A9;3^N){sH%|lzie)~pp^O!&&{C{*ACmgDdbZY9J zP4`W6S0gX|-8D;(@%W8^!W2q+disa9vF)?p5e1=e?HYvFPckr&05tOIZyqAkhmbPJ znK~WsslZhLfl5uLFk6*P)(jr4vctqH_fzql>0fr8-Lb*a zJ%b)LdLkTXMDFlkdca{Go{nb;C?i}DksJ&7$GCF>h{70rd>Omul|~W<T;Y>R0g;d@;9!EWLj2Lr7}AM4=5x-0PJ04#JxIZ0&GpGhM{%NxP~5svJCN7zL- z8ciG*M)3_lW|dH$b`c7sM@csZMp>;TxbWxHuUzp5px1EjH27F_^H4XwrKGDpEHbkC z-U{S{06-Aqj?Y_dbGe|^mg6CyIo+F^v&8}rT1(*g%O*AIK~D(Jz>Lt(AI_MY1UD!F z@K(Qejmfu!Dp1J_P>NJtR8O=sw?h{q@+F^^{xNqHcsRcsMEVJY*P7I!S;sZ9S}D)` zBxsry_*s7%i}CZHR#V%BFU&A9Gc%m8=(p5D3(oDxvDt^%On$jE6ymdx8}WrCsH_;1 zgB}V52@XMWDL_$!Qymypa{M=zd208jM`w1%0=iq3F2$YS69F0ZDkiVlC}3ke9|>;) zQ#m%axUis(zR1dof#3`Hs*B*|f|+`io2i;Dv+%5oSl0^jbE4xtefA6qXhaNiXE#G- zMI+O12HbxQHDlDx-0;l z7gYvL9hhHYPS*+q%wk~$Fs6?dc;dFu|NP3!J%)zA*ZFi|yp*8Tch?Jo;0Z1vh0>CC ziyka;T)X|+?oE~(bfh1k!|Rvb-<-FyR5HlfkB#YqVSO&CaX)|RPh+*XuRmtsaOADLY_x(to?CDekhogBqo2;)+5p&dx+( zLGzW}&yEOTaBP;tL_z$BQ5NPw>E>BcN;q3)OYWQ7_IG4}h2;!s&tH7#hENo)Rk$s; z_)>W2?~oxKX9-|JOvL_-s`eI4*J6x6?@x?&AcgQp=MTMPz|B8uH@@9HNZ*UOz91(v zx(}OHS6^Rz|7;M)!Je4ubVS^;oEHv3SD~UvL@X@RG$jP&#+ zU^TgSET<$_m!P8CkECRp<9kYWKRvCvpB=Bc4*b6y!Ylr?Z$^d~HZLeG074r{vSLh$ z3X+hIQmjMQL^*CBOnEdh+yM_z9D?Hy9y~~q(3k@s3PKmUfrfzi!(h`F$l*{S{h)?c z+&o0)sy=;y)OQaSo<4*gQYFspWOH4bQhvZK#R-#K4imMgsU*UUKZ7>P$Iripk}+};#=&4WzG^4Sc8n9-4$_om{4Zk!wU zMPg5slQHi6kUrN^K;h%PlJ*z{Lk8Jud!=b+EG%U>@!t(ZIJ!ng=EXA2XqROGg^teVc;%8C zA|H-f<8ox)&t&qY_V)HB(}pks7-;2#W3r2GxHlSkpHD1Bivs-ozC8_e74Yf9Ph&E4 zg4P%o1hC$XZNWe5#n`yIN{`wezvi}VgW8ByA(EHD$F0ByUx1L0x!?;;Fc!j0vW#HR zP!x`GTCMVE_CE$HJfC=xL>^&y66S)Mg?mPlNo}a@nr~n=_}~XP1K6N5;YUM`I0J7( zMIiL_N zLD<(N0XU>1TAawtD|qsUyUoJTarDPp(~ZYJVuFo~nu9Z8hEZNluGsB7S9iC=0N-#$ zjSFfp;(`+sY8pvT$#*3gKt_m#LxVC31+5a}lUmx^{(gg?)qql(uGKX)!O|;#_0O(+ z$M@pkVKAdsi-LP)PZRFaqto$H1MToZ#T5ddAYBc zX?x3<6=$H255v~tN;B~IddSKSo$c4J|B0J!kX#O~mQ1Hmo}Au6zG(}>2(%P?2M0be zv1dO)c7HZWYW&p6lQ-O=BpnVVYwUv%jW45n`4ZohR0KGP5WEhFN#Ra`k7J5qLVX6!nc0h$ zu^6+;U_E4#1z+88jrH;C>wGj4;g0x9AmaO2UGtXnXlS^&{kSc|`NSte4`&4*HA5kP z`F!q46a*Mf!lZQY%|t@g_4NEpv?(BdfZV)nVK{b+Fj6j=V6b zYRtLpmXr*aUg%>p`1bvK97K^+7OnTqkI(InLoZ}gSN{7eyXpfQ0zwi%i?<969x3q0 zz?EfVwaD1Ek+mvHCJF~iUV*FI4u&y(CQ?HuHu~Q~`%{4-_X-m^ww59+<*$y|VIVfeRd&b1uh;z4mA! z;za@(u+vBlZ9}4sl~o;+tPYNj=TUvhc;v;so68fAa59qMEKr}2cE$sEx<5G!-(E_( z4I%1DXy|E`XZvGd_ewyO)nD$G-U}7y72JcMKs%$zj{2d7wd#tC%3+9 zRijuENYlM}^BpK0YdT!!ui``LLqwdH@-Hp - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - Workspace base Workspace top - - - Thread Structure intctx Structure Thread Stack Stack Pointer - - - - Thread Local Storage - chThdLS() Stack Limit - - - extctx Structure INT_REQUIRED_STACK - diff --git a/docs/src/concepts.dox b/docs/src/concepts.dox deleted file mode 100644 index d2d311cfcd..0000000000 --- a/docs/src/concepts.dox +++ /dev/null @@ -1,410 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @page concepts Kernel Concepts - * @brief ChibiOS/RT Kernel Concepts - * - @ref naming - * - @ref api_suffixes - * - @ref interrupt_classes - * - @ref system_states - * - @ref scheduling - * - @ref thread_states - * - @ref priority - * - @ref warea - * . - * @section naming Naming Conventions - * ChibiOS/RT APIs are all named following this convention: - * @a ch\\\(). - * The possible groups are: @a Sys, @a Sch, @a Time, @a VT, @a Thd, @a Sem, - * @a Mtx, @a Cond, @a Evt, @a Msg, @a Reg, @a SequentialStream, @a IO, @a IQ, - * @a OQ, @a Dbg, @a Core, @a Heap, @a Pool. - * - * @section api_suffixes API Name Suffixes - * The suffix can be one of the following: - * - None, APIs without any suffix can be invoked only from the user - * code in the Normal state unless differently specified. See - * @ref system_states. - * - @anchor I-Class "I", I-Class APIs are invokable only from the - * I-Locked or S-Locked states. See @ref system_states. - * - @anchor S-Class "S", S-Class APIs are invokable only from the - * S-Locked state. See @ref system_states. - * . - * Examples: @p chThdCreateStatic(), @p chSemSignalI(), @p chIQGetTimeout(). - * - * @section interrupt_classes Interrupt Classes - * In ChibiOS/RT there are three logical interrupt classes: - * - Regular Interrupts. Maskable interrupt sources that cannot - * preempt (small parts of) the kernel code and are thus able to invoke - * operating system APIs from within their handlers. The interrupt handlers - * belonging to this class must be written following some rules. See the - * @ref system APIs group and the web article - * - * How to write interrupt handlers. - * - Fast Interrupts. Maskable interrupt sources with the ability - * to preempt the kernel code and thus have a lower latency and are less - * subject to jitter, see the web article - * - * Response Time and Jitter. - * Such sources are not supported on all the architectures.
- * Fast interrupts are not allowed to invoke any operating system API from - * within their handlers. Fast interrupt sources may, however, pend a lower - * priority regular interrupt where access to the operating system is - * possible. - * - Non Maskable Interrupts. Non maskable interrupt sources are - * totally out of the operating system control and have the lowest latency. - * Such sources are not supported on all the architectures. - * . - * The mapping of the above logical classes into physical interrupts priorities - * is, of course, port dependent. See the documentation of the various ports - * for details. - * - * @section system_states System States - * When using ChibiOS/RT the system can be in one of the following logical - * operating states: - * - Init. When the system is in this state all the maskable - * interrupt sources are disabled. In this state it is not possible to use - * any system API except @p chSysInit(). This state is entered after a - * physical reset. - * - Normal. All the interrupt sources are enabled and the system APIs - * are accessible, threads are running. - * - Suspended. In this state the fast interrupt sources are enabled but - * the regular interrupt sources are not. In this state it is not possible - * to use any system API except @p chSysDisable() or @p chSysEnable() in - * order to change state. - * - Disabled. When the system is in this state both the maskable - * regular and fast interrupt sources are disabled. In this state it is not - * possible to use any system API except @p chSysSuspend() or - * @p chSysEnable() in order to change state. - * - Sleep. Architecture-dependent low power mode, the idle thread - * goes in this state and waits for interrupts, after servicing the interrupt - * the Normal state is restored and the scheduler has a chance to reschedule. - * - S-Locked. Kernel locked and regular interrupt sources disabled. - * Fast interrupt sources are enabled. @ref S-Class and @ref I-Class APIs are - * invokable in this state. - * - I-Locked. Kernel locked and regular interrupt sources disabled. - * @ref I-Class APIs are invokable from this state. - * - Serving Regular Interrupt. No system APIs are accessible but it is - * possible to switch to the I-Locked state using @p chSysLockFromIsr() and - * then invoke any @ref I-Class API. Interrupt handlers can be preemptable on - * some architectures thus is important to switch to I-Locked state before - * invoking system APIs. - * - Serving Fast Interrupt. System APIs are not accessible. - * - Serving Non-Maskable Interrupt. System APIs are not accessible. - * - Halted. All interrupt sources are disabled and system stopped into - * an infinite loop. This state can be reached if the debug mode is activated - * and an error is detected or after explicitly invoking - * @p chSysHalt(). - * . - * Note that the above states are just Logical States that may have no - * real associated machine state on some architectures. The following diagram - * shows the possible transitions between the states: - * - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - init [label="Init", style="bold"]; - norm [label="Normal", shape=doublecircle]; - susp [label="Suspended"]; - disab [label="Disabled"]; - slock [label="S-Locked"]; - ilock [label="I-Locked"]; - slock [label="S-Locked"]; - sleep [label="Sleep"]; - sri [label="SRI"]; - init -> norm [label="chSysInit()"]; - norm -> slock [label="chSysLock()", constraint=false]; - slock -> norm [label="chSysUnlock()"]; - norm -> susp [label="chSysSuspend()"]; - susp -> disab [label="chSysDisable()"]; - norm -> disab [label="chSysDisable()"]; - susp -> norm [label="chSysEnable()"]; - disab -> norm [label="chSysEnable()"]; - disab -> susp [label="chSysSuspend()"]; - slock -> ilock [label="Context Switch", dir="both"]; - norm -> sri [label="Regular IRQ", style="dotted"]; - sri -> norm [label="Regular IRQ return", fontname=Helvetica, fontsize=8]; - sri -> ilock [label="chSysLockFromIsr()", constraint=false]; - ilock -> sri [label="chSysUnlockFromIsr()", fontsize=8]; - norm -> sleep [label="Idle Thread"]; - sleep -> sri [label="Regular IRQ", style="dotted"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - init [label="Init", style="bold"]; - norm [label="Normal", shape=doublecircle]; - susp [label="Suspended"]; - disab [label="Disabled"]; - slock [label="S-Locked"]; - ilock [label="I-Locked"]; - slock [label="S-Locked"]; - sleep [label="Sleep"]; - sri [label="SRI"]; - init -> norm [label="chSysInit()"]; - norm -> slock [label="chSysLock()", constraint=false]; - slock -> norm [label="chSysUnlock()"]; - norm -> susp [label="chSysSuspend()"]; - susp -> disab [label="chSysDisable()"]; - norm -> disab [label="chSysDisable()"]; - susp -> norm [label="chSysEnable()"]; - disab -> norm [label="chSysEnable()"]; - disab -> susp [label="chSysSuspend()"]; - slock -> ilock [label="Context Switch", dir="both"]; - norm -> sri [label="Regular IRQ", style="dotted"]; - sri -> norm [label="Regular IRQ return", fontname=Helvetica, fontsize=8]; - sri -> ilock [label="chSysLockFromIsr()", constraint=false]; - ilock -> sri [label="chSysUnlockFromIsr()", fontsize=8]; - norm -> sleep [label="Idle Thread"]; - sleep -> sri [label="Regular IRQ", style="dotted"]; - } - * @enddot - * @endif - * Note, the SFI, Halted and SNMI states were not shown - * because those are reachable from most states: - * - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - any1 [label="Any State\nexcept *"]; - sfi [label="SFI"]; - any1 -> sfi [style="dotted", label="Fast IRQ"]; - sfi -> any1 [label="Fast IRQ return"]; - } - * @enddot - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - any2 [label="Any State"]; - halt [label="Halted"]; - SNMI [label="SNMI"]; - any2 -> halt [label="chSysHalt()"]; - any2 -> SNMI [label="Synchronous NMI"]; - any2 -> SNMI [label="Asynchronous NMI", style="dotted"]; - SNMI -> any2 [label="NMI return"]; - halt -> SNMI [label="Asynchronous NMI", style="dotted"]; - SNMI -> halt [label="NMI return"]; - } - * @enddot - * @attention * except: Init, Halt, SNMI, Disabled. - * - * @section scheduling Scheduling - * The strategy is very simple the currently ready thread with the highest - * priority is executed. If more than one thread with equal priority are - * eligible for execution then they are executed in a round-robin way, the - * CPU time slice constant is configurable. The ready list is a double linked - * list of threads ordered by priority.

- * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - edge [fontname=Helvetica, fontsize=8]; - - subgraph cluster_running { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - currp [label="'currp'\npointer", style="bold"]; - T4 [label="Tuser(4)\nprio=100"]; - label = "Currently Running Thread"; - penwidth = 0; - } - - subgraph cluster_rlist { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - rh [label="ready list\nheader\nprio=0", style="bold"]; - Ti [label="Tidle\nprio=1"]; - Tm [label="Tmain\nprio=64"]; - T1 [label="Tuser(1)\nprio=32"]; - T2 [label="Tuser(2)\nprio=32"]; - T3 [label="Tuser(3)\nprio=80"]; - label = "Threads Ready for Execution"; - penwidth = 0; - } - - currp -> T4 - rh -> Ti -> T1 -> T2 -> Tm -> T3 -> rh [label="p_next"]; - rh -> T3 -> Tm -> T2 -> T1 -> Ti -> rh [label="p_prev"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - edge [fontname=Helvetica, fontsize=8]; - - subgraph cluster_running { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - currp [label="'currp'\npointer", style="bold"]; - T4 [label="Tuser(4)\nprio=100"]; - label = "Currently Running Thread"; - penwidth = 0; - } - - subgraph cluster_rlist { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - rh [label="ready list\nheader\nprio=0", style="bold"]; - Ti [label="Tidle\nprio=1"]; - Tm [label="Tmain\nprio=64"]; - T1 [label="Tuser(1)\nprio=32"]; - T2 [label="Tuser(2)\nprio=32"]; - T3 [label="Tuser(3)\nprio=80"]; - label = "Threads Ready for Execution"; - penwidth = 0; - } - - currp -> T4 - rh -> Ti -> T1 -> T2 -> Tm -> T3 -> rh [label="p_next"]; - rh -> T3 -> Tm -> T2 -> T1 -> Ti -> rh [label="p_prev"]; - } - * @enddot - * @endif - *
- * Note that the currently running thread is not in the ready list, the list - * only contains the threads ready to be executed but still actually waiting. - * - * @section thread_states Thread States - * The image shows how threads can change their state in ChibiOS/RT.
- * @if LATEX_PDF - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - size="5, 7"; - - edge [fontname=Helvetica, fontsize=8]; - start [label="Start", style="bold"]; - - run [label="Running"]; - ready [label="Ready"]; - suspend [label="Suspended"]; - sleep [label="Sleeping"]; - stop [label="Stop", style="bold"]; - - start -> suspend [label="\n chThdCreateI()", constraint=false, dir=back]; - start -> run [label="chThdCreate()"]; - start -> ready [label="chThdCreate()"]; - run -> ready [label="Reschedule", dir="both"]; - suspend -> run [label="chThdResume()"]; - suspend -> ready [label="chThdResume()"]; - run -> sleep [label="chSchGoSleepS()"]; - sleep -> run [label="chSchWakepuS()"]; - sleep -> ready [label="chSchWakepuS()"]; - run -> stop [label="chThdExit()"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - - edge [fontname=Helvetica, fontsize=8]; - start [label="Start", style="bold"]; - - run [label="Running"]; - ready [label="Ready"]; - suspend [label="Suspended"]; - sleep [label="Sleeping"]; - stop [label="Stop", style="bold"]; - - start -> suspend [label="\n chThdCreateI()", constraint=false, dir=back]; - start -> run [label="chThdCreate()"]; - start -> ready [label="chThdCreate()"]; - run -> ready [label="Reschedule", dir="both"]; - suspend -> run [label="chThdResume()"]; - suspend -> ready [label="chThdResume()"]; - run -> sleep [label="chSchGoSleepS()"]; - sleep -> run [label="chSchWakepuS()"]; - sleep -> ready [label="chSchWakepuS()"]; - run -> stop [label="chThdExit()"]; - } - * @enddot - * @endif - * - * @section priority Priority Levels - * Priorities in ChibiOS/RT are a contiguous numerical range but the initial - * and final values are not enforced.
- * The following table describes the various priority boundaries (from lowest - * to highest): - * - @p IDLEPRIO, this is the lowest priority level and is reserved for the - * idle thread, no other threads should share this priority level. This is - * the lowest numerical value of the priorities space. - * - @p LOWPRIO, the lowest priority level that can be assigned to an user - * thread. - * - @p NORMALPRIO, this is the central priority level for user threads. It is - * advisable to assign priorities to threads as values relative to - * @p NORMALPRIO, as example NORMALPRIO-1 or NORMALPRIO+4, this ensures the - * portability of code should the numerical range change in future - * implementations. - * - @p HIGHPRIO, the highest priority level that can be assigned to an user - * thread. - * - @p ABSPRO, absolute maximum software priority level, it can be higher than - * @p HIGHPRIO but the numerical values above @p HIGHPRIO up to @p ABSPRIO - * (inclusive) are reserved. This is the highest numerical value of the - * priorities space. - * . - * @section warea Thread Working Area - * Each thread has its own stack, a Thread structure and some preemption - * areas. All the structures are allocated into a "Thread Working Area", - * a thread private heap, usually statically declared in your code. - * Threads do not use any memory outside the allocated working area - * except when accessing static shared data.

- * @if LATEX_PDF - * @image latex workspace.eps - * @else - * @image html workspace.png - * @endif - *
- * Note that the preemption area is only present when the thread is not - * running (switched out), the context switching is done by pushing the - * registers on the stack of the switched-out thread and popping the registers - * of the switched-in thread from its stack. - * The preemption area can be divided in up to three structures: - * - External Context. - * - Interrupt Stack. - * - Internal Context. - * . - * See the port documentation for details, the area may change on - * the various ports and some structures may not be present (or be zero-sized). - */ diff --git a/docs/src/main.dox b/docs/src/main.dox deleted file mode 100644 index 71e2ef43fc..0000000000 --- a/docs/src/main.dox +++ /dev/null @@ -1,65 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @mainpage ChibiOS/RT - * @author Giovanni Di Sirio (gdisirio@users.sourceforge.net). - * - *

Chibi ?

- * I didn't want a serious name for this project. It is the Japanese word for - * small as in small child. So ChibiOS/RT - * @htmlonly (ちびOS/RT) @endhtmlonly - * means small Real Time Operating System. - * Source Wikipedia. - * - *

Features

- * - Free software, GPL3 licensed. Stable releases include a exception clause - * to the GPL. - * - Designed for realtime applications. - * - Easily portable. - * - Preemptive scheduling. - * - 128 priority levels. Multiple threads at the same priority level allowed. - * - Round robin scheduling for threads at the same priority level. - * - Offers threads, virtual timers, semaphores, mutexes, condvars, - * event flags, messages, mailboxes, I/O queues. - * - No static setup at compile time, there is no need to configure a maximum - * number of all the above objects. - * - PC simulator target included, the development can be done on a PC - * under Linux or Windows.
- * Timers, I/O channels and other HW resources are simulated in a guest OS - * process and the application code does not need to be aware of it. - * - No *need* for a memory allocator, all the kernel structures are static - * and declaratively allocated. - * - Optional, thread safe, Heap Allocator subsystem. - * - Optional, thread safe, Memory Pools Allocator subsystem. - * - Blocking and non blocking I/O channels with timeout and events generation - * capability. - * - Minimal system requirements: about 6KiB ROM with all options enabled and - * speed optimizations on. The size can shrink under 2KiB by disabling the - * the unused subsystems and optimizing for size. - * - Almost totally written in C with little ASM code required for ports. - * - Optional Hardware Abstraction Layer (HAL) with support for many device - * driver models and device driver implementations. - * . - *

Related pages

- * - @subpage concepts - * - @subpage testsuite - * . - */ diff --git a/ext/ext.dox b/ext/ext.dox deleted file mode 100644 index 86e32ec31c..0000000000 --- a/ext/ext.dox +++ /dev/null @@ -1,39 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup external External Components - * ChibiOS/RT supports several external libraries through support interfaces - * and/or demos. Credit should be given to the original authors for making - * available such useful code.
- * The current list of supported component is: - * - uIP, by Adam Dunkels at the Swedish Institute of Computer Science, - * link. - * - lwIP, many authors, - * link. - * - FatFs, by "ChaN", - * link. - * . - * External components and libraries are not directly supported and are used - * "as is" or with minor integration patching. - */ diff --git a/ext/fatfs-0.9-patched.zip b/ext/fatfs-0.9-patched.zip deleted file mode 100644 index 1c4fe889df4daadafc39ec2389f24d897f7c5b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681290 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

XpT(%n)j9;H0KzAadOAia&bE(ll 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

&r5BIvj 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ûIen{a%ccaM5R2{BC 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 lYZCY+MslhVR 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

M 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

fJbMC5 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

61TS-@^Ev?F>~?2lERI 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

Ip{bXpxERFFd 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 UnoxuVVHf;6vl!;T3rr&6zw8QyZ~y=R diff --git a/ext/lwip-1.4.0.zip b/ext/lwip-1.4.0.zip deleted file mode 100644 index a4ea860a2cf215213cc27f24194987c8265fdd8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606096 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

5J%aIiLD5uKzckZqt*CIx?bGdY^ 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

H;EBCLR7?8nldB@&fFWSDx6{5`hne1Si%CaAA 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%0A#QJ3=bmi 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

jaU+)?#l^Q;XY?@o^YTZGo&90xhH9M> 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

V(>&sWP5b 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 z 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°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�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

jg#$y- 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

k_m`LKT=j*!e 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 z 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�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 z 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

    hKYO)_m7ZFHal)TvJe_Dhnw>_2<< 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 diff --git a/os/hal/dox/adc.dox b/os/hal/dox/adc.dox deleted file mode 100644 index 48bfb491c6..0000000000 --- a/os/hal/dox/adc.dox +++ /dev/null @@ -1,146 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup ADC ADC Driver - * @brief Generic ADC Driver. - * @details This module implements a generic ADC (Analog to Digital Converter) - * driver supporting a variety of buffer and conversion modes. - * @pre In order to use the ADC driver the @p HAL_USE_ADC option - * must be enabled in @p halconf.h. - * - * @section adc_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - rankdir="LR"; - size="5, 7"; - - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="ADC_STOP\nLow Power"]; - uninit [label="ADC_UNINIT", style="bold"]; - ready [label="ADC_READY\nClock Enabled"]; - active [label="ADC_ACTIVE\nConverting"]; - error [label="ADC_ERROR\nError"]; - complete [label="ADC_COMPLETE\nComplete"]; - - uninit -> stop [label="\n adcInit()", constraint=false]; - stop -> ready [label="\nadcStart()"]; - ready -> ready [label="\nadcStart()\nadcStopConversion()"]; - ready -> stop [label="\nadcStop()"]; - stop -> stop [label="\nadcStop()"]; - ready -> active [label="\nadcStartConversion() (async)\nadcConvert() (sync)"]; - active -> ready [label="\nadcStopConversion()\nsync return"]; - active -> active [label="\nasync callback (half buffer)\nasync callback (full buffer circular)\n>acg_endcb<"]; - active -> complete [label="\n\nasync callback (full buffer)\n>end_cb<"]; - active -> error [label="\n\nasync callback (error)\n>error_cb<"]; - complete -> active [label="\nadcStartConversionI()\nthen\ncallback return"]; - complete -> ready [label="\ncallback return"]; - error -> active [label="\nadcStartConversionI()\nthen\ncallback return"]; - error -> ready [label="\ncallback return"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="ADC_STOP\nLow Power"]; - uninit [label="ADC_UNINIT", style="bold"]; - ready [label="ADC_READY\nClock Enabled"]; - active [label="ADC_ACTIVE\nConverting"]; - error [label="ADC_ERROR\nError"]; - complete [label="ADC_COMPLETE\nComplete"]; - - uninit -> stop [label="\n adcInit()", constraint=false]; - stop -> ready [label="\nadcStart()"]; - ready -> ready [label="\nadcStart()\nadcStopConversion()"]; - ready -> stop [label="\nadcStop()"]; - stop -> stop [label="\nadcStop()"]; - ready -> active [label="\nadcStartConversion() (async)\nadcConvert() (sync)"]; - active -> ready [label="\nadcStopConversion()\nsync return"]; - active -> active [label="\nasync callback (half buffer)\nasync callback (full buffer circular)\n>acg_endcb<"]; - active -> complete [label="\n\nasync callback (full buffer)\n>end_cb<"]; - active -> error [label="\n\nasync callback (error)\n>error_cb<"]; - complete -> active [label="\nadcStartConversionI()\nthen\ncallback return"]; - complete -> ready [label="\ncallback return"]; - error -> active [label="\nadcStartConversionI()\nthen\ncallback return"]; - error -> ready [label="\ncallback return"]; - } - * @enddot - * @endif - * - * @section adc_2 ADC Operations - * The ADC driver is quite complex, an explanation of the terminology and of - * the operational details follows. - * - * @subsection adc_2_1 ADC Conversion Groups - * The @p ADCConversionGroup is the objects that specifies a physical - * conversion operation. This structure contains some standard fields and - * several implementation-dependent fields.
    - * The standard fields define the CG mode, the number of channels belonging - * to the CG and the optional callbacks.
    - * The implementation-dependent fields specify the physical ADC operation - * mode, the analog channels belonging to the group and any other - * implementation-specific setting. Usually the extra fields just mirror - * the physical ADC registers, please refer to the vendor's MCU Reference - * Manual for details about the available settings. Details are also available - * into the documentation of the ADC low level drivers and in the various - * sample applications. - * - * @subsection adc_2_2 ADC Conversion Modes - * The driver supports several conversion modes: - * - One Shot, the driver performs a single group conversion then stops. - * - Linear Buffer, the driver performs a series of group conversions - * then stops. This mode is like a one shot conversion repeated N times, - * the buffer pointer increases after each conversion. The buffer is - * organized as an S(CG)*N samples matrix, when S(CG) is the conversion - * group size (number of channels) and N is the buffer depth (number of - * repeated conversions). - * - Circular Buffer, much like the linear mode but the operation does - * not stop when the buffer is filled, it is automatically restarted - * with the buffer pointer wrapping back to the buffer base. - * . - * @subsection adc_2_3 ADC Callbacks - * The driver is able to invoke callbacks during the conversion process. A - * callback is invoked when the operation has been completed or, in circular - * mode, when the buffer has been filled and the operation is restarted. In - * linear and circular modes a callback is also invoked when the buffer is - * half filled.
    - * The "half filled" and "filled" callbacks in circular mode allow to - * implement "streaming processing" of the sampled data, while the driver is - * busy filling one half of the buffer the application can process the - * other half, this allows for continuous interleaved operations. - * - * The driver is not thread safe for performance reasons, if you need to access - * the ADC bus from multiple threads then use the @p adcAcquireBus() and - * @p adcReleaseBus() APIs in order to gain exclusive access. - * - * @ingroup IO - */ diff --git a/os/hal/dox/can.dox b/os/hal/dox/can.dox deleted file mode 100644 index 93351bf1c9..0000000000 --- a/os/hal/dox/can.dox +++ /dev/null @@ -1,92 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup CAN CAN Driver - * @brief Generic CAN Driver. - * @details This module implements a generic CAN (Controller Area Network) - * driver allowing the exchange of information at frame level. - * @pre In order to use the CAN driver the @p HAL_USE_CAN option - * must be enabled in @p halconf.h. - * - * @section can_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="CAN_STOP\nLow Power"]; - uninit [label="CAN_UNINIT", style="bold"]; - starting [label="CAN_STARTING\nInitializing"]; - ready [label="CAN_READY\nClock Enabled"]; - sleep [label="CAN_SLEEP\nLow Power"]; - - uninit -> stop [label=" canInit()", constraint=false]; - stop -> stop [label="\ncanStop()"]; - stop -> ready [label="\ncanStart()\n(fast implementation)"]; - stop -> starting [label="\ncanStart()\n(slow implementation)"]; - starting -> starting [label="\ncanStart()\n(other thread)"]; - starting -> ready [label="\ninitialization complete\n(all threads)"]; - ready -> stop [label="\ncanStop()"]; - ready -> ready [label="\ncanStart()\ncanReceive()\ncanTransmit()"]; - ready -> sleep [label="\ncanSleep()"]; - sleep -> sleep [label="\ncanSleep()"]; - sleep -> ready [label="\ncanWakeup()"]; - sleep -> ready [label="\nhardware\nwakeup event"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="CAN_STOP\nLow Power"]; - uninit [label="CAN_UNINIT", style="bold"]; - starting [label="CAN_STARTING\nInitializing"]; - ready [label="CAN_READY\nClock Enabled"]; - sleep [label="CAN_SLEEP\nLow Power"]; - - uninit -> stop [label=" canInit()", constraint=false]; - stop -> stop [label="\ncanStop()"]; - stop -> ready [label="\ncanStart()\n(fast implementation)"]; - stop -> starting [label="\ncanStart()\n(slow implementation)"]; - starting -> starting [label="\ncanStart()\n(other thread)"]; - starting -> ready [label="\ninitialization complete\n(all threads)"]; - ready -> stop [label="\ncanStop()"]; - ready -> ready [label="\ncanStart()\ncanReceive()\ncanTransmit()"]; - ready -> sleep [label="\ncanSleep()"]; - sleep -> sleep [label="\ncanSleep()"]; - sleep -> ready [label="\ncanWakeup()"]; - sleep -> ready [label="\nhardware\nwakeup event"]; - } - * @enddot - * @endif - * - * @ingroup IO - */ diff --git a/os/hal/dox/ext.dox b/os/hal/dox/ext.dox deleted file mode 100644 index a1601b04a4..0000000000 --- a/os/hal/dox/ext.dox +++ /dev/null @@ -1,84 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup EXT EXT Driver - * @brief Generic EXT Driver. - * @details This module implements a generic EXT (EXTernal) driver. - * @pre In order to use the EXT driver the @p HAL_USE_EXT option - * must be enabled in @p halconf.h. - * - * @section ext_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=circle, fontname=Sans, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Sans, fontsize=8]; - - uninit [label="EXT_UNINIT", style="bold"]; - stop [label="EXT_STOP\nLow Power"]; - active [label="EXT_ACTIVE"]; - - uninit -> stop [label="extInit()"]; - stop -> stop [label="\nextStop()"]; - stop -> active [label="\nextStart()"]; - active -> stop [label="\nextStop()"]; - active -> active [label="\nextStart()"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=circle, fontname=Sans, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Sans, fontsize=8]; - - uninit [label="EXT_UNINIT", style="bold"]; - stop [label="EXT_STOP\nLow Power"]; - active [label="EXT_ACTIVE"]; - - uninit -> stop [label="extInit()"]; - stop -> stop [label="\nextStop()"]; - stop -> active [label="\nextStart()"]; - active -> stop [label="\nextStop()"]; - active -> active [label="\nextStart()"]; - } - * @enddot - * @endif - * - * @section ext_2 EXT Operations. - * This driver abstracts generic external interrupt sources, a callback - * is invoked when a programmable transition is detected on one of the - * configured channels. Several channel modes are possible. - * - EXT_CH_MODE_DISABLED, channel not used. - * - EXT_CH_MODE_RISING_EDGE, callback on a rising edge. - * - EXT_CH_MODE_FALLING_EDGE, callback on a falling edge. - * - EXT_CH_MODE_BOTH_EDGES, callback on a both edges. - * . - * @ingroup IO - */ diff --git a/os/hal/dox/gpt.dox b/os/hal/dox/gpt.dox deleted file mode 100644 index 4622c77e39..0000000000 --- a/os/hal/dox/gpt.dox +++ /dev/null @@ -1,78 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup GPT GPT Driver - * @brief Generic GPT Driver. - * @details This module implements a generic GPT (General Purpose Timer) - * driver. The timer can be programmed in order to trigger callbacks - * after a specified time period or continuously with a specified - * interval. - * @pre In order to use the GPT driver the @p HAL_USE_GPT option - * must be enabled in @p halconf.h. - * - * @section gpt_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="GPT_STOP\nLow Power"]; - uninit [label="GPT_UNINIT", style="bold"]; - ready [label="GPT_READY\nClock Enabled"]; - continuous [label="GPT_CONT..S\nContinuous\nMode"]; - oneshot [label="GPT_ONESHOT\nOne Shot\nMode"]; - - uninit -> stop [label=" gptInit()", constraint=false]; - stop -> stop [label="\ngptStop()"]; - stop -> ready [label="\ngptStart()"]; - ready -> stop [label="\ngptStop()"]; - ready -> ready [label="\ngptStart()"]; - ready -> continuous [label="\ngptStartContinuous()"]; - continuous -> ready [label="\ngptStopTimer()"]; - continuous -> continuous [label=">callback<"]; - ready -> oneshot [label="\ngptStartOneShot()\ngptPolledDelay()"]; - oneshot -> ready [label="\n>callback<\nor\nDelay Over"]; - } - * @enddot - * - * @section gpt_2 GPT Operations. - * This driver abstracts a generic timer composed of: - * - A clock prescaler. - * - A main up counter. - * - A comparator register that resets the main counter to zero when the limit - * is reached. A callback is invoked when this happens. - * . - * The timer can operate in three different modes: - * - Continuous Mode, a periodic callback is invoked until the driver - * is explicitly stopped. - * - One Shot Mode, a callback is invoked after the programmed period - * and then the timer automatically stops. - * - Delay Mode, the timer is used for inserting a brief delay into - * the execution flow, no callback is invoked in this mode. - * . - * @ingroup IO - */ diff --git a/os/hal/dox/hal.dox b/os/hal/dox/hal.dox deleted file mode 100644 index e5844569c3..0000000000 --- a/os/hal/dox/hal.dox +++ /dev/null @@ -1,36 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup HAL HAL Driver - * @brief Hardware Abstraction Layer. - * @details The HAL (Hardware Abstraction Layer) driver performs the system - * initialization and includes the platform support code shared by - * the other drivers. This driver does contain any API function - * except for a general initialization function @p halInit() that - * must be invoked before any HAL service can be used, usually the - * HAL initialization should be performed immediately before the - * kernel initialization.
    - * Some HAL driver implementations also offer a custom early clock - * setup function that can be invoked before the C runtime - * initialization in order to accelerate the startup time. - * - * @ingroup IO - */ diff --git a/os/hal/dox/i2c.dox b/os/hal/dox/i2c.dox deleted file mode 100644 index beb9f68a06..0000000000 --- a/os/hal/dox/i2c.dox +++ /dev/null @@ -1,102 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup I2C I2C Driver - * @brief Generic I2C Driver. - * @details This module implements a generic I2C (Inter-Integrated Circuit) - * driver. - * @pre In order to use the I2C driver the @p HAL_USE_I2C option - * must be enabled in @p halconf.h. - * - * @section i2c_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="I2C_STOP\nLow Power"]; - uninit [label="I2C_UNINIT", style="bold"]; - ready [label="I2C_READY\nClock Enabled"]; - active_tx [label="I2C_ACTIVE_TX\nBus TX Active"]; - active_rx [label="I2C_ACTIVE_RX\nBus RX Active"]; - locked [label="I2C_LOCKED\nBus Locked"]; - - uninit -> stop [label="i2cInit()", constraint=false]; - stop -> stop [label="i2cStop()"]; - stop -> ready [label="i2cStart()"]; - ready -> ready [label="i2cStart()"]; - ready -> stop [label="i2cStop()"]; - ready -> active_tx [label="i2cMasterTransmit()"]; - ready -> active_rx [label="i2cMasterReceive()"]; - active_tx -> ready [label="completed"]; - active_rx -> ready [label="completed"]; - active_tx -> locked [label="RDY_TIMEOUT"]; - active_rx -> locked [label="RDY_TIMEOUT"]; - locked -> stop [label="i2cStop()"]; - locked -> ready [label="i2cStart()"]; - } - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="I2C_STOP\nLow Power"]; - uninit [label="I2C_UNINIT", style="bold"]; - ready [label="I2C_READY\nClock Enabled"]; - active_tx [label="I2C_ACTIVE_TX\nBus TX Active"]; - active_rx [label="I2C_ACTIVE_RX\nBus RX Active"]; - locked [label="I2C_LOCKED\nBus Locked"]; - - uninit -> stop [label="i2cInit()", constraint=false]; - stop -> stop [label="i2cStop()"]; - stop -> ready [label="i2cStart()"]; - ready -> ready [label="i2cStart()"]; - ready -> stop [label="i2cStop()"]; - ready -> active_tx [label="i2cMasterTransmit()"]; - ready -> active_rx [label="i2cMasterReceive()"]; - active_tx -> ready [label="completed"]; - active_rx -> ready [label="completed"]; - active_tx -> locked [label="RDY_TIMEOUT"]; - active_rx -> locked [label="RDY_TIMEOUT"]; - locked -> stop [label="i2cStop()"]; - locked -> ready [label="i2cStart()"]; - } - * @enddot - * @endif - * The driver is not thread safe for performance reasons, if you need to access - * the I2C bus from multiple threads then use the @p i2cAcquireBus() and - * @p i2cReleaseBus() APIs in order to gain exclusive access. - * - * @ingroup IO - */ diff --git a/os/hal/dox/i2s.dox b/os/hal/dox/i2s.dox deleted file mode 100644 index 2c6cc4ca2c..0000000000 --- a/os/hal/dox/i2s.dox +++ /dev/null @@ -1,31 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup I2S I2S Driver - * @brief Generic I2S Driver. - * @details This module implements a generic I2S driver. - * @pre In order to use the I2S driver the @p HAL_USE_I2S option - * must be enabled in @p halconf.h. - * - * @section i2s_1 Driver State Machine - * - * @ingroup IO - */ diff --git a/os/hal/dox/icu.dox b/os/hal/dox/icu.dox deleted file mode 100644 index e51c5df6ff..0000000000 --- a/os/hal/dox/icu.dox +++ /dev/null @@ -1,115 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup ICU ICU Driver - * @brief Generic ICU Driver. - * @details This module implements a generic ICU (Input Capture Unit) driver. - * @pre In order to use the ICU driver the @p HAL_USE_ICU option - * must be enabled in @p halconf.h. - * - * @section icu_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=circle, fontname=Sans, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Sans, fontsize=8]; - - stop [label="ICU_STOP\nLow Power"]; - uninit [label="ICU_UNINIT", style="bold"]; - ready [label="ICU_READY\nClock Enabled"]; - waiting [label="ICU_WAITING"]; - active [label="ICU_ACTIVE"]; - idle [label="ICU_IDLE"]; - - uninit -> stop [label=" icuInit()", constraint=false]; - stop -> stop [label="\nicuStop()"]; - stop -> ready [label="\nicuStart()"]; - ready -> stop [label="\nicuStop()"]; - ready -> ready [label="\nicuStart()\nicuDisable()"]; - ready -> waiting [label="\nicuEnable()"]; - waiting -> active [label="\nStart Front"]; - waiting -> ready [label="\nicuDisable()"]; - active -> idle [label="\nStop Front\n>width_cb<"]; - active -> ready [label="\nicuDisable()\nicuDisableI()"]; - idle -> active [label="\nStart Front\n>period_cb<"]; - idle -> ready [label="\nicuDisable()\nicuDisableI()"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=circle, fontname=Sans, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Sans, fontsize=8]; - - stop [label="ICU_STOP\nLow Power"]; - uninit [label="ICU_UNINIT", style="bold"]; - ready [label="ICU_READY\nClock Enabled"]; - waiting [label="ICU_WAITING"]; - active [label="ICU_ACTIVE"]; - idle [label="ICU_IDLE"]; - - uninit -> stop [label=" icuInit()", constraint=false]; - stop -> stop [label="\nicuStop()"]; - stop -> ready [label="\nicuStart()"]; - ready -> stop [label="\nicuStop()"]; - ready -> ready [label="\nicuStart()\nicuDisable()"]; - ready -> waiting [label="\nicuEnable()"]; - waiting -> active [label="\nStart Front"]; - waiting -> ready [label="\nicuDisable()"]; - active -> idle [label="\nStop Front\n>width_cb<"]; - active -> ready [label="\nicuDisable()\nicuDisableI()"]; - idle -> active [label="\nStart Front\n>period_cb<"]; - idle -> ready [label="\nicuDisable()\nicuDisableI()"]; - } - * @enddot - * @endif - * - * @section icu_2 ICU Operations. - * This driver abstracts a generic Input Capture Unit composed of: - * - A clock prescaler. - * - A main up counter. - * - Two capture registers triggered by the rising and falling edges on - * the sampled input. - * . - * The ICU unit can be programmed to synchronize on the rising or falling - * edge of the sample input: - * - ICU_INPUT_ACTIVE_HIGH, a rising edge is the start signal. - * - ICU_INPUT_ACTIVE_LOW, a falling edge is the start signal. - * . - * After the activation the ICU unit can be in one of the following - * states at any time: - * - ICU_WAITING, waiting the first start signal. - * - ICU_ACTIVE, after a start signal. - * - ICU_IDLE, after a stop signal. - * . - * Callbacks are invoked when start or stop signals occur. - * - * @ingroup IO - */ diff --git a/os/hal/dox/mac.dox b/os/hal/dox/mac.dox deleted file mode 100644 index 7ea37bfd32..0000000000 --- a/os/hal/dox/mac.dox +++ /dev/null @@ -1,30 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup MAC MAC Driver - * @brief Generic MAC driver. - * @details This module implements a generic MAC (Media Access Control) - * driver for Ethernet controllers. - * @pre In order to use the MAC driver the @p HAL_USE_MAC option - * must be enabled in @p halconf.h. - * - * @ingroup IO - */ diff --git a/os/hal/dox/mmc_spi.dox b/os/hal/dox/mmc_spi.dox deleted file mode 100644 index 72c6ec7d76..0000000000 --- a/os/hal/dox/mmc_spi.dox +++ /dev/null @@ -1,119 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup MMC_SPI MMC over SPI Driver - * @brief Generic MMC driver. - * @details This module implements a portable MMC/SD driver that uses a SPI - * driver as physical layer. Hot plugging and removal are supported - * through kernel events. - * @pre In order to use the MMC_SPI driver the @p HAL_USE_MMC_SPI and - * @p HAL_USE_SPI options must be enabled in @p halconf.h. - * - * @section mmc_spi_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - any [label="Any State"]; - stop2 [label="MMC_STOP\nLow Power"]; - uninit [label="MMC_UNINIT", style="bold"]; - stop [label="MMC_STOP\nLow Power"]; - wait [label="MMC_WAIT\nWaiting Card"]; - inserted [label="MMC_INSERTED\nCard Inserted"]; - ready [label="MMC_READY\nCard Ready"]; - reading [label="MMC_READING\nReading"]; - writing [label="MMC_WRITING\nWriting"]; - - uninit -> stop [label="mmcInit()"]; - stop -> wait [label="mmcStart()", constraint=false]; - wait -> inserted [label="insertion (inserted event)"]; - inserted -> inserted [label="mmcDisconnect()"]; - inserted -> ready [label="mmcConnect()"]; - ready -> ready [label="mmcConnect()"]; - ready -> inserted [label="mmcDisconnect()"]; - ready -> reading [label="mmcStartSequentialRead()"]; - reading -> reading [label="mmcSequentialRead()"]; - reading -> ready [label="mmcStopSequentialRead()"]; - reading -> ready [label="read error"]; - ready -> writing [label="mmcStartSequentialWrite()"]; - writing -> writing [label="mmcSequentialWrite()"]; - writing -> ready [label="mmcStopSequentialWrite()"]; - writing -> ready [label="write error"]; - inserted -> wait [label="removal (removed event)"]; - ready -> wait [label="removal (removed event)"]; - reading -> wait [label="removal (removed event)"]; - writing -> wait [label="removal (removed event)"]; - - any -> stop2 [label="mmcStop()"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - any [label="Any State"]; - stop2 [label="MMC_STOP\nLow Power"]; - uninit [label="MMC_UNINIT", style="bold"]; - stop [label="MMC_STOP\nLow Power"]; - wait [label="MMC_WAIT\nWaiting Card"]; - inserted [label="MMC_INSERTED\nCard Inserted"]; - ready [label="MMC_READY\nCard Ready"]; - reading [label="MMC_READING\nReading"]; - writing [label="MMC_WRITING\nWriting"]; - - uninit -> stop [label="mmcInit()"]; - stop -> wait [label="mmcStart()", constraint=false]; - wait -> inserted [label="insertion (inserted event)"]; - inserted -> inserted [label="mmcDisconnect()"]; - inserted -> ready [label="mmcConnect()"]; - ready -> ready [label="mmcConnect()"]; - ready -> inserted [label="mmcDisconnect()"]; - ready -> reading [label="mmcStartSequentialRead()"]; - reading -> reading [label="mmcSequentialRead()"]; - reading -> ready [label="mmcStopSequentialRead()"]; - reading -> ready [label="read error"]; - ready -> writing [label="mmcStartSequentialWrite()"]; - writing -> writing [label="mmcSequentialWrite()"]; - writing -> ready [label="mmcStopSequentialWrite()"]; - writing -> ready [label="write error"]; - inserted -> wait [label="removal (removed event)"]; - ready -> wait [label="removal (removed event)"]; - reading -> wait [label="removal (removed event)"]; - writing -> wait [label="removal (removed event)"]; - - any -> stop2 [label="mmcStop()"]; - } - * @enddot - * @endif - * - * @ingroup IO - */ diff --git a/os/hal/dox/pal.dox b/os/hal/dox/pal.dox deleted file mode 100644 index 48187adf8d..0000000000 --- a/os/hal/dox/pal.dox +++ /dev/null @@ -1,74 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup PAL PAL Driver - * @brief I/O Ports Abstraction Layer - * @details This module defines an abstract interface for digital I/O ports. - * Note that most I/O ports functions are just macros. The macros - * have default software implementations that can be redefined in a - * PAL Low Level Driver if the target hardware supports special - * features like, for example, atomic bit set/reset/masking. Please - * refer to the ports specific documentation for details.
    - * The @ref PAL has the advantage to make the access to the I/O - * ports platform independent and still be optimized for the specific - * architectures.
    - * Note that the PAL Low Level Driver may also offer non standard - * macro and functions in order to support specific features but, - * of course, the use of such interfaces would not be portable. - * Such interfaces shall be marked with the architecture name inside - * the function names. - * @pre In order to use the PAL driver the @p HAL_USE_PAL option - * must be enabled in @p halconf.h. - * - * @section pal_1 Implementation Rules - * In implementing a PAL Low Level Driver there are some rules/behaviors that - * should be respected. - * - * @subsection pal_1_1 Writing on input pads - * The behavior is not specified but there are implementations better than - * others, this is the list of possible implementations, preferred options - * are on top: - * -# The written value is not actually output but latched, should the pads - * be reprogrammed as outputs the value would be in effect. - * -# The write operation is ignored. - * -# The write operation has side effects, as example disabling/enabling - * pull up/down resistors or changing the pad direction. This scenario is - * discouraged, please try to avoid this scenario. - * . - * @subsection pal_1_2 Reading from output pads - * The behavior is not specified but there are implementations better than - * others, this is the list of possible implementations, preferred options - * are on top: - * -# The actual pads states are read (not the output latch). - * -# The output latch value is read (regardless of the actual pads states). - * -# Unspecified, please try to avoid this scenario. - * . - * @subsection pal_1_3 Writing unused or unimplemented port bits - * The behavior is not specified. - * - * @subsection pal_1_4 Reading from unused or unimplemented port bits - * The behavior is not specified. - * - * @subsection pal_1_5 Reading or writing on pins associated to other functionalities - * The behavior is not specified. - * - * @ingroup IO - */ diff --git a/os/hal/dox/pwm.dox b/os/hal/dox/pwm.dox deleted file mode 100644 index 358e215b3a..0000000000 --- a/os/hal/dox/pwm.dox +++ /dev/null @@ -1,69 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup PWM PWM Driver - * @brief Generic PWM Driver. - * @details This module implements a generic PWM (Pulse Width Modulation) - * driver. - * @pre In order to use the PWM driver the @p HAL_USE_PWM option - * must be enabled in @p halconf.h. - * - * @section pwm_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - uninit [label="PWM_UNINIT", style="bold"]; - stop [label="PWM_STOP\nLow Power"]; - ready [label="PWM_READY\nClock Enabled"]; - uninit -> stop [label="pwmInit()"]; - stop -> stop [label="pwmStop()"]; - stop -> ready [label="pwmStart()"]; - ready -> stop [label="pwmStop()"]; - ready -> ready [label="pwmEnableChannel()\npwmDisableChannel()"]; - } - * @enddot - * - * @section pwm_2 PWM Operations. - * This driver abstracts a generic PWM timer composed of: - * - A clock prescaler. - * - A main up counter. - * - A comparator register that resets the main counter to zero when the limit - * is reached. An optional callback can be generated when this happens. - * - An array of @p PWM_CHANNELS PWM channels, each channel has an output, - * a comparator and is able to invoke an optional callback when a comparator - * match with the main counter happens. - * . - * A PWM channel output can be in two different states: - * - IDLE, when the channel is disabled or after a match occurred. - * - ACTIVE, when the channel is enabled and a match didn't occur yet - * in the current PWM cycle. - * . - * Note that the two states can be associated to both logical zero or one in - * the @p PWMChannelConfig structure. - * - * @ingroup IO - */ diff --git a/os/hal/dox/rtc.dox b/os/hal/dox/rtc.dox deleted file mode 100644 index 69a012f22c..0000000000 --- a/os/hal/dox/rtc.dox +++ /dev/null @@ -1,30 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup RTC RTC Driver - * @brief Real Time Clock Abstraction Layer - * @details This module defines an abstract interface for a Real Time Clock - * Peripheral. - * @pre In order to use the RTC driver the @p HAL_USE_RTC option - * must be enabled in @p halconf.h. - * - * @ingroup IO - */ diff --git a/os/hal/dox/sdc.dox b/os/hal/dox/sdc.dox deleted file mode 100644 index 0c6bcb6f53..0000000000 --- a/os/hal/dox/sdc.dox +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup SDC SDC Driver - * @brief Generic SD Card Driver. - * @details This module implements a generic SDC (Secure Digital Card) driver. - * @pre In order to use the SDC driver the @p HAL_USE_SDC option - * must be enabled in @p halconf.h. - * - * @section sdc_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=circle, fontname=Sans, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Sans, fontsize=8]; - - stop [label="SDC_STOP\nLow Power"]; - uninit [label="SDC_UNINIT", style="bold"]; - ready [label="SDC_READY\nClock Enabled"]; - connecting [label="SDC_CONN.ING\nConnecting"]; - disconnecting [label="SDC_DISC.ING\nDisconnecting"]; - active [label="SDC_ACTIVE\nCard Ready"]; - reading [label="SDC_READING\nReading"]; - writing [label="SDC_WRITING\nWriting"]; - - uninit -> stop [label=" sdcInit()", constraint=false]; - stop -> stop [label="\nsdcStop()"]; - stop -> ready [label="\nsdcStart()"]; - ready -> stop [label="\nsdcStop()"]; - ready -> ready [label="\nsdcStart()\nsdcDisconnect()"]; - ready -> connecting [label="\nsdcConnect()"]; - connecting -> active [label="\nconnection\nsuccessful"]; - connecting -> active [label="\nsdcConnect()", dir="back"]; - connecting -> ready [label="\nconnection\nfailed"]; - disconnecting -> active [label="\nsdcDisconnect()", dir="back"]; - ready -> disconnecting [label="\ndisconnection\nfinished", dir="back"]; - active -> reading [label="\nsdcRead()"]; - reading -> active [label="\nread finished\nread error"]; - active -> writing [label="\nsdcWrite()"]; - writing -> active [label="\nwrite finished\nwrite error"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=circle, fontname=Sans, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Sans, fontsize=8]; - - stop [label="SDC_STOP\nLow Power"]; - uninit [label="SDC_UNINIT", style="bold"]; - ready [label="SDC_READY\nClock Enabled"]; - connecting [label="SDC_CONN.ING\nConnecting"]; - disconnecting [label="SDC_DISC.ING\nDisconnecting"]; - active [label="SDC_ACTIVE\nCard Ready"]; - reading [label="SDC_READING\nReading"]; - writing [label="SDC_WRITING\nWriting"]; - - uninit -> stop [label=" sdcInit()", constraint=false]; - stop -> stop [label="\nsdcStop()"]; - stop -> ready [label="\nsdcStart()"]; - ready -> stop [label="\nsdcStop()"]; - ready -> ready [label="\nsdcStart()\nsdcDisconnect()"]; - ready -> connecting [label="\nsdcConnect()"]; - connecting -> active [label="\nconnection\nsuccessful"]; - connecting -> active [label="\nsdcConnect()", dir="back"]; - connecting -> ready [label="\nconnection\nfailed"]; - disconnecting -> active [label="\nsdcDisconnect()", dir="back"]; - ready -> disconnecting [label="\ndisconnection\nfinished", dir="back"]; - active -> reading [label="\nsdcRead()"]; - reading -> active [label="\nread finished\nread error"]; - active -> writing [label="\nsdcWrite()"]; - writing -> active [label="\nwrite finished\nwrite error"]; - } - * @enddot - * @endif - * - * @section sdc_2 SDC Operations. - * This driver allows to read or write single or multiple 512 bytes blocks - * on a SD Card. - * - * @ingroup IO - */ diff --git a/os/hal/dox/serial.dox b/os/hal/dox/serial.dox deleted file mode 100644 index 91fe46678e..0000000000 --- a/os/hal/dox/serial.dox +++ /dev/null @@ -1,61 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup SERIAL Serial Driver - * @brief Generic Serial Driver. - * @details This module implements a generic full duplex serial driver. The - * driver implements a @p SerialDriver interface and uses I/O Queues - * for communication between the upper and the lower driver. Event - * flags are used to notify the application about incoming data, - * outgoing data and other I/O events.
    - * The module also contains functions that make the implementation - * of the interrupt service routines much easier. - * @pre In order to use the SERIAL driver the @p HAL_USE_SERIAL option - * must be enabled in @p halconf.h. - * - * - * @section serial_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - uninit [label="SD_UNINIT", style="bold"]; - stop [label="SD_STOP\nLow Power"]; - ready [label="SD_READY\nClock Enabled"]; - - uninit -> stop [label=" sdInit()"]; - stop -> stop [label="\nsdStop()"]; - stop -> ready [label="\nsdStart()"]; - ready -> stop [label="\nsdStop()"]; - ready -> ready [label="\nsdStart()"]; - ready -> ready [label="\nAny I/O operation"]; - } - * @enddot - * - * @ingroup IO - */ diff --git a/os/hal/dox/serial_usb.dox b/os/hal/dox/serial_usb.dox deleted file mode 100644 index ed69b6c2b2..0000000000 --- a/os/hal/dox/serial_usb.dox +++ /dev/null @@ -1,56 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup SERIAL_USB Serial over USB Driver - * @brief Serial over USB Driver. - * @details This module implements an USB Communication Device Class - * (CDC) as a normal serial communication port accessible from - * the device application. - * @pre In order to use the USB over Serial driver the - * @p HAL_USE_SERIAL_USB option must be enabled in @p halconf.h. - * - * @section usb_serial_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - uninit [label="SDU_UNINIT", style="bold"]; - stop [label="SDU_STOP\nLow Power"]; - ready [label="SDU_READY\nClock Enabled"]; - - uninit -> stop [label=" sduInit()"]; - stop -> stop [label="\nsduStop()"]; - stop -> ready [label="\nsduStart()"]; - ready -> stop [label="\nsduStop()"]; - ready -> ready [label="\nsduStart()"]; - ready -> ready [label="\nAny I/O operation"]; - } - * @enddot - * - * @ingroup IO - */ diff --git a/os/hal/dox/spi.dox b/os/hal/dox/spi.dox deleted file mode 100644 index 86eea52811..0000000000 --- a/os/hal/dox/spi.dox +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup SPI SPI Driver - * @brief Generic SPI Driver. - * @details This module implements a generic SPI (Serial Peripheral Interface) - * driver allowing bidirectional and monodirectional transfers, - * complex atomic transactions are supported as well. - * @pre In order to use the SPI driver the @p HAL_USE_SPI option - * must be enabled in @p halconf.h. - * - * @section spi_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="SPI_STOP\nLow Power"]; - uninit [label="SPI_UNINIT", style="bold"]; - ready [label="SPI_READY\nClock Enabled"]; - active [label="SPI_ACTIVE\nBus Active"]; - complete [label="SPI_COMPLETE\nComplete"]; - - uninit -> stop [label="\n spiInit()", constraint=false]; - stop -> ready [label="\nspiStart()"]; - ready -> ready [label="\nspiSelect()\nspiUnselect()\nspiStart()"]; - ready -> stop [label="\nspiStop()"]; - stop -> stop [label="\nspiStop()"]; - ready -> active [label="\nspiStartXXXI() (async)\nspiXXX() (sync)"]; - active -> ready [label="\nsync return"]; - active -> complete [label="\nasync callback\n>spc_endcb<"]; - complete -> active [label="\nspiStartXXXI() (async)\nthen\ncallback return"]; - complete -> ready [label="\ncallback return"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="SPI_STOP\nLow Power"]; - uninit [label="SPI_UNINIT", style="bold"]; - ready [label="SPI_READY\nClock Enabled"]; - active [label="SPI_ACTIVE\nBus Active"]; - complete [label="SPI_COMPLETE\nComplete"]; - - uninit -> stop [label="\n spiInit()", constraint=false]; - stop -> ready [label="\nspiStart()"]; - ready -> ready [label="\nspiSelect()\nspiUnselect()\nspiStart()"]; - ready -> stop [label="\nspiStop()"]; - stop -> stop [label="\nspiStop()"]; - ready -> active [label="\nspiStartXXX() (async)\nspiXXX() (sync)"]; - active -> ready [label="\nsync return"]; - active -> complete [label="\nasync callback\n>spc_endcb<"]; - complete -> active [label="\nspiStartXXXI() (async)\nthen\ncallback return"]; - complete -> ready [label="\ncallback return"]; - } - * @enddot - * @endif - * - * The driver is not thread safe for performance reasons, if you need to access - * the SPI bus from multiple threads then use the @p spiAcquireBus() and - * @p spiReleaseBus() APIs in order to gain exclusive access. - * - * @ingroup IO - */ diff --git a/os/hal/dox/tm.dox b/os/hal/dox/tm.dox deleted file mode 100644 index c4c537776e..0000000000 --- a/os/hal/dox/tm.dox +++ /dev/null @@ -1,31 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup TM Time Measurement Driver - * - * @brief Time Measurement unit. - * @details This module implements a time measurement mechanism able to - * monitor a portion of code and store the best/worst/last - * measurement. The measurement is performed using the realtime - * counter mechanism abstracted in the HAL driver. - * - * @ingroup IO - */ diff --git a/os/hal/dox/uart.dox b/os/hal/dox/uart.dox deleted file mode 100644 index 27c1494fb7..0000000000 --- a/os/hal/dox/uart.dox +++ /dev/null @@ -1,125 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup UART UART Driver - * @brief Generic UART Driver. - * @details This driver abstracts a generic UART (Universal Asynchronous - * Receiver Transmitter) peripheral, the API is designed to be: - * - Unbuffered and copy-less, transfers are always directly performed - * from/to the application-level buffers without extra copy - * operations. - * - Asynchronous, the API is always non blocking. - * - Callbacks capable, operations completion and other events are - * notified using callbacks. - * . - * Special hardware features like deep hardware buffers, DMA transfers - * are hidden to the user but fully supportable by the low level - * implementations.
    - * This driver model is best used where communication events are - * meant to drive an higher level state machine, as example: - * - RS485 drivers. - * - Multipoint network drivers. - * - Serial protocol decoders. - * . - * If your application requires a synchronous buffered driver then - * the @ref SERIAL should be used instead. - * @pre In order to use the UART driver the @p HAL_USE_UART option - * must be enabled in @p halconf.h. - * - * @section uart_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - uninit [label="UART_UNINIT", style="bold"]; - stop [label="UART_STOP\nLow Power"]; - ready [label="UART_READY\nClock Enabled"]; - - uninit -> stop [label="\nuartInit()"]; - stop -> ready [label="\nuartStart()"]; - ready -> ready [label="\nuartStart()"]; - ready -> stop [label="\nuartStop()"]; - stop -> stop [label="\nuartStop()"]; - } - * @enddot - * - * @subsection uart_1_1 Transmitter sub State Machine - * The follow diagram describes the transmitter state machine, this diagram - * is valid while the driver is in the @p UART_READY state. This state - * machine is automatically reset to the @p TX_IDLE state each time the - * driver enters the @p UART_READY state. - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - tx_idle [label="TX_IDLE", style="bold"]; - tx_active [label="TX_ACTIVE"]; - tx_complete [label="TX_COMPLETE"]; - tx_fatal [label="Fatal Error", style="bold"]; - - tx_idle -> tx_active [label="\nuartStartSend()"]; - tx_idle -> tx_idle [label="\nuartStopSend()\n>uc_txend2<"]; - tx_active -> tx_complete [label="\nbuffer transmitted\n>uc_txend1<"]; - tx_active -> tx_idle [label="\nuartStopSend()"]; - tx_active -> tx_fatal [label="\nuartStartSend()"]; - tx_complete -> tx_active [label="\nuartStartSendI()\nthen\ncallback return"]; - tx_complete -> tx_idle [label="\ncallback return"]; - } - * @enddot - * - * @subsection uart_1_2 Receiver sub State Machine - * The follow diagram describes the receiver state machine, this diagram - * is valid while the driver is in the @p UART_READY state. This state - * machine is automatically reset to the @p RX_IDLE state each time the - * driver enters the @p UART_READY state. - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - rx_idle [label="RX_IDLE", style="bold"]; - rx_active [label="RX_ACTIVE"]; - rx_complete [label="RX_COMPLETE"]; - rx_fatal [label="Fatal Error", style="bold"]; - - rx_idle -> rx_idle [label="\nuartStopReceive()\n>uc_rxchar<\n>uc_rxerr<"]; - rx_idle -> rx_active [label="\nuartStartReceive()"]; - - rx_active -> rx_complete [label="\nbuffer filled\n>uc_rxend<"]; - rx_active -> rx_idle [label="\nuartStopReceive()"]; - rx_active -> rx_active [label="\nreceive error\n>uc_rxerr<"]; - rx_active -> rx_fatal [label="\nuartStartReceive()"]; - rx_complete -> rx_active [label="\nuartStartReceiveI()\nthen\ncallback return"]; - rx_complete -> rx_idle [label="\ncallback return"]; - } - * @enddot - * - * @ingroup IO - */ diff --git a/os/hal/dox/usb.dox b/os/hal/dox/usb.dox deleted file mode 100644 index 748e41afe7..0000000000 --- a/os/hal/dox/usb.dox +++ /dev/null @@ -1,180 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup USB USB Driver - * @brief Generic USB Driver. - * @details This module implements a generic USB (Universal Serial Bus) driver - * supporting device-mode operations. - * @pre In order to use the USB driver the @p HAL_USE_USB option - * must be enabled in @p halconf.h. - * - * @section usb_1 Driver State Machine - * The driver implements a state machine internally, not all the driver - * functionalities can be used in any moment, any transition not explicitly - * shown in the following diagram has to be considered an error and shall - * be captured by an assertion (if enabled). - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="USB_STOP\nLow Power"]; - uninit [label="USB_UNINIT", style="bold"]; - ready [label="USB_READY\nClock Enabled"]; - selected [label="\nUSB_SELECTED\naddress\nassigned"]; - configured [label="\nUSB_ACTIVE\nconfiguration\nselected"]; - - uninit -> stop [label=" usbInit()", constraint=false]; - stop -> stop [label="\nusbStop()"]; - stop -> ready [label="\nusbStart()"]; - ready -> stop [label="\nusbStop()"]; - ready -> ready [label="\n\nusbStart()"]; - ready -> ready [label="\nSUSPEND/WAKEUP\n>event_cb<"]; - ready -> selected [label="\nSET_ADDRESS\n>event_cb<"]; - selected -> ready [label="\nUSB RESET\n>event_cb<"]; - selected -> selected [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<"]; - selected -> configured [label="\nSET_CONF(n)\n>event_cb<"]; - configured -> selected [label="\nSET_CONF(0)\n>event_cb<"]; - configured -> configured [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<\n\nEndpoints Activity\n >in_cb< or >out_cb<"]; - configured -> ready [label="\nUSB RESET\n>event_cb<"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - stop [label="USB_STOP\nLow Power"]; - uninit [label="USB_UNINIT", style="bold"]; - ready [label="USB_READY\nClock Enabled"]; - selected [label="\nUSB_SELECTED\naddress\nassigned"]; - configured [label="\nUSB_ACTIVE\nconfiguration\nselected"]; - - uninit -> stop [label=" usbInit()", constraint=false]; - stop -> stop [label="\nusbStop()"]; - stop -> ready [label="\nusbStart()"]; - ready -> stop [label="\nusbStop()"]; - ready -> ready [label="\n\nusbStart()"]; - ready -> ready [label="\nSUSPEND/WAKEUP\n>event_cb<"]; - ready -> selected [label="\nSET_ADDRESS\n>event_cb<"]; - selected -> ready [label="\nUSB RESET\n>event_cb<"]; - selected -> selected [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<"]; - selected -> configured [label="\nSET_CONF(n)\n>event_cb<"]; - configured -> selected [label="\nSET_CONF(0)\n>event_cb<"]; - configured -> configured [label="\nSUSPEND/WAKEUP\n>event_cb<\n\nValid EP0 Message\n>requests_hook_cb<\n\nGET DESCRIPTOR\n>get_descriptor_cb<\n\nEndpoints Activity\n >in_cb< >out_cb< >setup_cb<"]; - configured -> ready [label="\nUSB RESET\n>event_cb<"]; - } - * @enddot - * @endif - * - * @section usb_2 USB Operations - * The USB driver is quite complex and USB is complex in itself, it is - * recommended to study the USB specification before trying to use the - * driver. - * - * @subsection usb_2_1 USB Implementation - * The USB driver abstracts the inner details of the underlying USB hardware. - * The driver works asynchronously and communicates with the application - * using callbacks. The application is responsible of the descriptors and - * strings required by the USB device class to be implemented and of the - * handling of the specific messages sent over the endpoint zero. Standard - * messages are handled internally to the driver. The application can use - * hooks in order to handle custom messages or override the handling of the - * default handling of standard messages. - * - * @subsection usb_2_2 USB Endpoints - * USB endpoints are the objects that the application uses to exchange - * data with the host. There are two kind of endpoints: - * - IN endpoints are used by the application to transmit data to - * the host.
    - * - OUT endpoints are used by the application to receive data from - * the host. - * . - * The driver invokes a callback after finishing an IN or OUT transaction. - * States diagram for OUT endpoints in transaction mode: - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - disabled [label="EP_DISABLED\nDisabled", style="bold"]; - receiving [label="EP_BUSY\nReceiving"]; - idle [label="EP_IDLE\nReady"]; - - disabled -> idle [label="\nusbInitEndpointI()"]; - idle -> receiving [label="\nusbPrepareReceive()\nusbStartReceiveI()"]; - receiving -> receiving [label="\nmore packets"]; - receiving -> idle [label="\nreception end\n>out_cb<"]; - receiving -> disabled [label="\nUSB RESET\nusbDisableEndpointsI()"]; - idle -> disabled [label="\nUSB RESET\nusbDisableEndpointsI()"]; - } - * @enddot - *

    - * States diagram for IN endpoints in transaction mode: - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", - width="0.9", height="0.9"]; - edge [fontname=Helvetica, fontsize=8]; - - disabled [label="EP_DISABLED\nDisabled", style="bold"]; - transmitting [label="EP_BUSY\nTransmitting"]; - idle [label="EP_IDLE\nReady"]; - - disabled -> idle [label="\usbInitEndpointI()"]; - idle -> transmitting [label="\nusbPrepareTransmit()\nusbStartTransmitI()"]; - transmitting -> transmitting [label="\nmore packets"]; - transmitting -> idle [label="\ntransmission end\n>in_cb<"]; - transmitting -> disabled [label="\nUSB RESET\nusbDisableEndpointsI()"]; - idle -> disabled [label="\nUSB RESET\nusbDisableEndpointsI()"]; - } - * @enddot - *

    - * - * @subsection usb_2_4 USB Callbacks - * The USB driver uses callbacks in order to interact with the application. - * There are several kinds of callbacks to be handled: - * - Driver events callback. As example errors, suspend event, reset event - * etc. - * - Messages Hook callback. This hook allows the application to implement - * handling of custom messages or to override the default handling of - * standard messages on endpoint zero. - * - Descriptor Requested callback. When the driver endpoint zero handler - * receives a GET DESCRIPTOR message and needs to send a descriptor to - * the host it queries the application using this callback. - * - Start of Frame callback. This callback is invoked each time a SOF - * packet is received. - * - Endpoint callbacks. Each endpoint informs the application about I/O - * conditions using those callbacks. - * . - * - * @ingroup IO - */ diff --git a/os/hal/hal.dox b/os/hal/hal.dox deleted file mode 100644 index 1ac7339572..0000000000 --- a/os/hal/hal.dox +++ /dev/null @@ -1,100 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup IO HAL - * @brief Hardware Abstraction Layer. - * @details Under ChibiOS/RT the set of the various device driver interfaces - * is called the HAL subsystem: Hardware Abstraction Layer. The HAL is the - * abstract interface between ChibiOS/RT application and hardware. - * - * @section hal_device_driver_arch HAL Device Drivers Architecture - * A device driver is usually split in two layers: - * - High Level Device Driver (HLD). This layer contains the definitions - * of the driver's APIs and the platform independent part of the driver.
    - * An HLD is composed by two files: - * - @p @.c, the HLD implementation file. This file must be - * included in the Makefile in order to use the driver. - * - @p @.h, the HLD header file. This file is implicitly - * included by the HAL header file @p hal.h. - * . - * - Low Level Device Driver (LLD). This layer contains the platform - * dependent part of the driver.
    - * A LLD is composed by two files: - * - @p @_lld.c, the LLD implementation file. This file must be - * included in the Makefile in order to use the driver. - * - @p @_lld.h, the LLD header file. This file is implicitly - * included by the HLD header file. - * . - * The LLD may be not present in those drivers that do not access the - * hardware directly but through other device drivers, as example the - * MMC_SPI driver uses the SPI and PAL drivers in order to implement - * its functionalities. - * . - * @subsection hal_device_driver_diagram Diagram - * @dot - digraph example { - graph [size="5, 7", pad="1.5, 0"]; - node [shape=rectangle, fontname=Helvetica, fontsize=8, - fixedsize="true", width="2.0", height="0.4"]; - edge [fontname=Helvetica, fontsize=8]; - - app [label="Application"]; - hld [label="High Level Driver"]; - lld [label="Low Level Driver"]; - hw [label="Microcontroller Hardware"]; - hal_lld [label="HAL shared low level code"]; - - app->hld; - hld->lld; - lld-> hw; - lld->hal_lld; - hal_lld->hw; - } - * @enddot - */ - -/** - * @defgroup HAL_CONF Configuration - * @brief @ref HAL Configuration. - * @details The file @p halconf.h contains the high level settings for all - * the drivers supported by the HAL. The low level, platform dependent, - * settings are contained in the @p mcuconf.h file instead and are describe - * in the various platforms reference manuals. - * - * @ingroup IO - */ - -/** - * @defgroup IO_CHANNEL Abstract I/O Channels - * @ingroup IO - */ - -/** - * @defgroup IO_BLOCK Abstract I/O Block Device - * @ingroup IO - */ - -/** - * @defgroup MMCSD MMC/SD Block Devices common ancestor - * @details This module implements a common ancestor for all device drivers - * accessing MMC or SD cards. - * @ingroup IO - */ diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S128.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S128.h deleted file mode 100644 index 8fc3a98830..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S128.h +++ /dev/null @@ -1,2229 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7S128.h -// Object : AT91SAM7S128 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:12:49) -// -// CVS Reference : /AT91SAM7S128.pl/1.12/Wed Aug 30 14:08:34 2006// -// CVS Reference : /SYS_SAM7S.pl/1.2/Thu Feb 3 10:47:39 2005// -// CVS Reference : /MC_SAM7S.pl/1.4/Thu Feb 16 16:45:50 2006// -// CVS Reference : /PMC_SAM7S_USB.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7S.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_4ept.pl/1.1/Thu Aug 3 12:26:00 2006// -// CVS Reference : /PWM_SAM7S.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:10:41 2004// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7S128_H -#define AT91SAM7S128_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[469]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved13[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved14[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved15[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved16[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved17[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved18[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved19[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved20[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved4[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[21]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000060) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000064) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000068) // (MC_FSR) MC Flash Status Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number -// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key -// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[4]; // Endpoint Control and Status Register - AT91_REG Reserved3[4]; // - AT91_REG UDP_FDR[4]; // Endpoint FIFO Data Register - AT91_REG Reserved4[5]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7S128 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register -#define AT91C_MC_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register -// ========== Register definition for PDC_SPI peripheral ========== -#define AT91C_SPI_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register -#define AT91C_SPI_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register -#define AT91C_SPI_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register -#define AT91C_SPI_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register -#define AT91C_SPI_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register -#define AT91C_SPI_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register -#define AT91C_SPI_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register -#define AT91C_SPI_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register -#define AT91C_SPI_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register -#define AT91C_SPI_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register -// ========== Register definition for SPI peripheral ========== -#define AT91C_SPI_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register -#define AT91C_SPI_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI) Status Register -#define AT91C_SPI_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register -#define AT91C_SPI_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI) Control Register -#define AT91C_SPI_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI) Mode Register -#define AT91C_SPI_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register -#define AT91C_SPI_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register -#define AT91C_SPI_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register -#define AT91C_SPI_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7S128 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 -#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 -#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data -#define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 -#define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave -#define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave -#define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock -#define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync -#define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock -#define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data -#define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data -#define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock -#define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync -#define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data -#define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data -#define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock -#define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send -#define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send -#define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect -#define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready -#define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready -#define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator -#define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data -#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 -#define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 -#define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 -#define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock -#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data -#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data -#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send -#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send -#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data -#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S128 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller -#define AT91C_ID_3_Reserved ( 3) // Reserved -#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter -#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_15_Reserved (15) // Reserved -#define AT91C_ID_16_Reserved (16) // Reserved -#define AT91C_ID_17_Reserved (17) // Reserved -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC0007FF7) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7S128 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address -#define AT91C_BASE_SPI (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S128 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00008000) // Internal SRAM size in byte (32 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00020000) // Internal FLASH size in byte (128 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (512) // Internal FLASH Number of Pages: 512 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (8) // Internal FLASH Number of Lock Bits: 8 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S256.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S256.h deleted file mode 100644 index a4f1af138a..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S256.h +++ /dev/null @@ -1,2229 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7S256.h -// Object : AT91SAM7S256 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:12:57) -// -// CVS Reference : /AT91SAM7S256.pl/1.12/Wed Aug 30 14:08:39 2006// -// CVS Reference : /SYS_SAM7S.pl/1.2/Thu Feb 3 10:47:39 2005// -// CVS Reference : /MC_SAM7S.pl/1.4/Thu Feb 16 16:45:50 2006// -// CVS Reference : /PMC_SAM7S_USB.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7S.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_4ept.pl/1.1/Thu Aug 3 12:26:00 2006// -// CVS Reference : /PWM_SAM7S.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:10:41 2004// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7S256_H -#define AT91SAM7S256_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[469]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved13[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved14[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved15[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved16[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved17[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved18[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved19[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved20[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved4[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[21]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000060) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000064) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000068) // (MC_FSR) MC Flash Status Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number -// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key -// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[4]; // Endpoint Control and Status Register - AT91_REG Reserved3[4]; // - AT91_REG UDP_FDR[4]; // Endpoint FIFO Data Register - AT91_REG Reserved4[5]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7S256 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register -#define AT91C_MC_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register -// ========== Register definition for PDC_SPI peripheral ========== -#define AT91C_SPI_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register -#define AT91C_SPI_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register -#define AT91C_SPI_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register -#define AT91C_SPI_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register -#define AT91C_SPI_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register -#define AT91C_SPI_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register -#define AT91C_SPI_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register -#define AT91C_SPI_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register -#define AT91C_SPI_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register -#define AT91C_SPI_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register -// ========== Register definition for SPI peripheral ========== -#define AT91C_SPI_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register -#define AT91C_SPI_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI) Status Register -#define AT91C_SPI_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register -#define AT91C_SPI_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI) Control Register -#define AT91C_SPI_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI) Mode Register -#define AT91C_SPI_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register -#define AT91C_SPI_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register -#define AT91C_SPI_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register -#define AT91C_SPI_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7S256 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 -#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 -#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data -#define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 -#define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave -#define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave -#define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock -#define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync -#define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock -#define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data -#define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data -#define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock -#define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync -#define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data -#define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data -#define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock -#define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send -#define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send -#define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect -#define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready -#define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready -#define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator -#define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data -#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 -#define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 -#define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 -#define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock -#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data -#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data -#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send -#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send -#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data -#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S256 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller -#define AT91C_ID_3_Reserved ( 3) // Reserved -#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter -#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_15_Reserved (15) // Reserved -#define AT91C_ID_16_Reserved (16) // Reserved -#define AT91C_ID_17_Reserved (17) // Reserved -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC0007FF7) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7S256 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address -#define AT91C_BASE_SPI (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S256 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00040000) // Internal FLASH size in byte (256 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (1024) // Internal FLASH Number of Pages: 1024 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (16) // Internal FLASH Number of Lock Bits: 16 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S512.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S512.h deleted file mode 100644 index aa45c3924b..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S512.h +++ /dev/null @@ -1,2303 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7S512.h -// Object : AT91SAM7S512 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:13:20) -// -// CVS Reference : /AT91SAM7S512.pl/1.6/Wed Aug 30 14:08:44 2006// -// CVS Reference : /SYS_SAM7S.pl/1.2/Thu Feb 3 10:47:39 2005// -// CVS Reference : /MC_SAM7SE.pl/1.10/Thu Feb 16 16:35:28 2006// -// CVS Reference : /PMC_SAM7S_USB.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7S.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_4ept.pl/1.1/Thu Aug 3 12:26:00 2006// -// CVS Reference : /PWM_SAM7S.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:10:41 2004// -// CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// CVS Reference : /EBI_SAM7SE512.pl/1.22/Fri Nov 18 17:47:47 2005// -// CVS Reference : /SMC_1783A.pl/1.4/Thu Feb 3 10:30:06 2005// -// CVS Reference : /SDRC_SAM7SE512.pl/1.7/Fri Jul 8 07:50:18 2005// -// CVS Reference : /HECC_SAM7SE512.pl/1.8/Tue Jul 12 06:31:42 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7S512_H -#define AT91SAM7S512_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[469]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved13[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved14[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved15[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved16[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved17[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved18[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved19[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved20[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved4[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Embedded Flash Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_EFC { - AT91_REG EFC_FMR; // MC Flash Mode Register - AT91_REG EFC_FCR; // MC Flash Command Register - AT91_REG EFC_FSR; // MC Flash Status Register - AT91_REG EFC_VR; // MC Flash Version Register -} AT91S_EFC, *AT91PS_EFC; -#else -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_FSR) MC Flash Status Register -#define MC_VR (AT91_CAST(AT91_REG *) 0x0000000C) // (MC_VR) MC Flash Version Register - -#endif -// -------- MC_FMR : (EFC Offset: 0x0) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (EFC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (EFC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (EFC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (EFC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (EFC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (EFC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (EFC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (EFC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (EFC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (EFC) Flash Microsecond Cycle Number -// -------- MC_FCR : (EFC Offset: 0x4) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (EFC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (EFC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (EFC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (EFC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (EFC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (EFC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (EFC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (EFC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (EFC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (EFC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (EFC) Writing Protect Key -// -------- MC_FSR : (EFC Offset: 0x8) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (EFC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (EFC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (EFC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (EFC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (EFC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (EFC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (EFC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (EFC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (EFC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (EFC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (EFC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (EFC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (EFC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (EFC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (EFC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (EFC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (EFC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (EFC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (EFC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (EFC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (EFC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (EFC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (EFC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (EFC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (EFC) Sector 15 Lock Status -// -------- EFC_VR : (EFC Offset: 0xc) EFC version register -------- -#define AT91C_EFC_VERSION (0xFFF << 0) // (EFC) EFC version number -#define AT91C_EFC_MFN (0x7 << 16) // (EFC) EFC MFN - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[1]; // - AT91_REG MC_PUIA[16]; // MC Protection Unit Area - AT91_REG MC_PUP; // MC Protection Unit Peripherals - AT91_REG MC_PUER; // MC Protection Unit Enable Register - AT91_REG Reserved1[2]; // - AT91_REG MC0_FMR; // MC Flash Mode Register - AT91_REG MC0_FCR; // MC Flash Command Register - AT91_REG MC0_FSR; // MC Flash Status Register - AT91_REG MC0_VR; // MC Flash Version Register - AT91_REG MC1_FMR; // MC Flash Mode Register - AT91_REG MC1_FCR; // MC Flash Command Register - AT91_REG MC1_FSR; // MC Flash Status Register - AT91_REG MC1_VR; // MC Flash Version Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_PUIA (AT91_CAST(AT91_REG *) 0x00000010) // (MC_PUIA) MC Protection Unit Area -#define MC_PUP (AT91_CAST(AT91_REG *) 0x00000050) // (MC_PUP) MC Protection Unit Peripherals -#define MC_PUER (AT91_CAST(AT91_REG *) 0x00000054) // (MC_PUER) MC Protection Unit Enable Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_MPU (0x1 << 2) // (MC) Memory protection Unit Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_PUIA : (MC Offset: 0x10) MC Protection Unit Area -------- -#define AT91C_MC_PROT (0x3 << 0) // (MC) Protection -#define AT91C_MC_PROT_PNAUNA (0x0) // (MC) Privilege: No Access, User: No Access -#define AT91C_MC_PROT_PRWUNA (0x1) // (MC) Privilege: Read/Write, User: No Access -#define AT91C_MC_PROT_PRWURO (0x2) // (MC) Privilege: Read/Write, User: Read Only -#define AT91C_MC_PROT_PRWURW (0x3) // (MC) Privilege: Read/Write, User: Read/Write -#define AT91C_MC_SIZE (0xF << 4) // (MC) Internal Area Size -#define AT91C_MC_SIZE_1KB (0x0 << 4) // (MC) Area size 1KByte -#define AT91C_MC_SIZE_2KB (0x1 << 4) // (MC) Area size 2KByte -#define AT91C_MC_SIZE_4KB (0x2 << 4) // (MC) Area size 4KByte -#define AT91C_MC_SIZE_8KB (0x3 << 4) // (MC) Area size 8KByte -#define AT91C_MC_SIZE_16KB (0x4 << 4) // (MC) Area size 16KByte -#define AT91C_MC_SIZE_32KB (0x5 << 4) // (MC) Area size 32KByte -#define AT91C_MC_SIZE_64KB (0x6 << 4) // (MC) Area size 64KByte -#define AT91C_MC_SIZE_128KB (0x7 << 4) // (MC) Area size 128KByte -#define AT91C_MC_SIZE_256KB (0x8 << 4) // (MC) Area size 256KByte -#define AT91C_MC_SIZE_512KB (0x9 << 4) // (MC) Area size 512KByte -#define AT91C_MC_SIZE_1MB (0xA << 4) // (MC) Area size 1MByte -#define AT91C_MC_SIZE_2MB (0xB << 4) // (MC) Area size 2MByte -#define AT91C_MC_SIZE_4MB (0xC << 4) // (MC) Area size 4MByte -#define AT91C_MC_SIZE_8MB (0xD << 4) // (MC) Area size 8MByte -#define AT91C_MC_SIZE_16MB (0xE << 4) // (MC) Area size 16MByte -#define AT91C_MC_SIZE_64MB (0xF << 4) // (MC) Area size 64MByte -#define AT91C_MC_BA (0x3FFFF << 10) // (MC) Internal Area Base Address -// -------- MC_PUP : (MC Offset: 0x50) MC Protection Unit Peripheral -------- -// -------- MC_PUER : (MC Offset: 0x54) MC Protection Unit Area -------- -#define AT91C_MC_PUEB (0x1 << 0) // (MC) Protection Unit enable Bit - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[4]; // Endpoint Control and Status Register - AT91_REG Reserved3[4]; // - AT91_REG UDP_FDR[4]; // Endpoint FIFO Data Register - AT91_REG Reserved4[5]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7S512 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for EFC0 peripheral ========== -#define AT91C_EFC0_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (EFC0) MC Flash Command Register -#define AT91C_EFC0_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (EFC0) MC Flash Status Register -#define AT91C_EFC0_VR (AT91_CAST(AT91_REG *) 0xFFFFFF6C) // (EFC0) MC Flash Version Register -#define AT91C_EFC0_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (EFC0) MC Flash Mode Register -// ========== Register definition for EFC1 peripheral ========== -#define AT91C_EFC1_VR (AT91_CAST(AT91_REG *) 0xFFFFFF7C) // (EFC1) MC Flash Version Register -#define AT91C_EFC1_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF74) // (EFC1) MC Flash Command Register -#define AT91C_EFC1_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF78) // (EFC1) MC Flash Status Register -#define AT91C_EFC1_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF70) // (EFC1) MC Flash Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_PUP (AT91_CAST(AT91_REG *) 0xFFFFFF50) // (MC) MC Protection Unit Peripherals -#define AT91C_MC_PUIA (AT91_CAST(AT91_REG *) 0xFFFFFF10) // (MC) MC Protection Unit Area -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_PUER (AT91_CAST(AT91_REG *) 0xFFFFFF54) // (MC) MC Protection Unit Enable Register -// ========== Register definition for PDC_SPI peripheral ========== -#define AT91C_SPI_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register -#define AT91C_SPI_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register -#define AT91C_SPI_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register -#define AT91C_SPI_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register -#define AT91C_SPI_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register -#define AT91C_SPI_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register -#define AT91C_SPI_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register -#define AT91C_SPI_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register -#define AT91C_SPI_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register -#define AT91C_SPI_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register -// ========== Register definition for SPI peripheral ========== -#define AT91C_SPI_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register -#define AT91C_SPI_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI) Status Register -#define AT91C_SPI_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register -#define AT91C_SPI_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI) Control Register -#define AT91C_SPI_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI) Mode Register -#define AT91C_SPI_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register -#define AT91C_SPI_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register -#define AT91C_SPI_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register -#define AT91C_SPI_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7S512 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 -#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 -#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data -#define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 -#define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave -#define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave -#define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock -#define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync -#define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock -#define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data -#define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data -#define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock -#define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync -#define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data -#define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data -#define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock -#define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send -#define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send -#define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect -#define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready -#define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready -#define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator -#define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data -#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 -#define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 -#define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 -#define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock -#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data -#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data -#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send -#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send -#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data -#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S512 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller -#define AT91C_ID_3_Reserved ( 3) // Reserved -#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter -#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_15_Reserved (15) // Reserved -#define AT91C_ID_16_Reserved (16) // Reserved -#define AT91C_ID_17_Reserved (17) // Reserved -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC0007FF7) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7S512 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_EFC0 (AT91_CAST(AT91PS_EFC) 0xFFFFFF60) // (EFC0) Base Address -#define AT91C_BASE_EFC1 (AT91_CAST(AT91PS_EFC) 0xFFFFFF70) // (EFC1) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address -#define AT91C_BASE_SPI (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S512 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00080000) // Internal FLASH size in byte (512 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (2048) // Internal FLASH Number of Pages: 2048 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (32) // Internal FLASH Number of Lock Bits: 32 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S64.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S64.h deleted file mode 100644 index d124ce2a9b..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7S64.h +++ /dev/null @@ -1,2229 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7S64.h -// Object : AT91SAM7S64 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:13:29) -// -// CVS Reference : /AT91SAM7S64.pl/1.23/Wed Aug 30 14:08:51 2006// -// CVS Reference : /SYS_SAM7S.pl/1.2/Thu Feb 3 10:47:39 2005// -// CVS Reference : /MC_SAM7S.pl/1.4/Thu Feb 16 16:45:50 2006// -// CVS Reference : /PMC_SAM7S_USB.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7S.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_4ept.pl/1.1/Thu Aug 3 12:26:00 2006// -// CVS Reference : /PWM_SAM7S.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:10:41 2004// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7S64_H -#define AT91SAM7S64_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[469]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved13[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved14[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved15[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved16[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved17[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved18[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved19[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved20[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[3]; // Programmable Clock Register - AT91_REG Reserved4[5]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[21]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000060) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000064) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000068) // (MC_FSR) MC Flash Status Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number -// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key -// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[4]; // Endpoint Control and Status Register - AT91_REG Reserved3[4]; // - AT91_REG UDP_FDR[4]; // Endpoint FIFO Data Register - AT91_REG Reserved4[5]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7S64 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register -#define AT91C_MC_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register -// ========== Register definition for PDC_SPI peripheral ========== -#define AT91C_SPI_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register -#define AT91C_SPI_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register -#define AT91C_SPI_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register -#define AT91C_SPI_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register -#define AT91C_SPI_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register -#define AT91C_SPI_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register -#define AT91C_SPI_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register -#define AT91C_SPI_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register -#define AT91C_SPI_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register -#define AT91C_SPI_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register -// ========== Register definition for SPI peripheral ========== -#define AT91C_SPI_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register -#define AT91C_SPI_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI) Status Register -#define AT91C_SPI_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register -#define AT91C_SPI_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI) Control Register -#define AT91C_SPI_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI) Mode Register -#define AT91C_SPI_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register -#define AT91C_SPI_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register -#define AT91C_SPI_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register -#define AT91C_SPI_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7S64 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 -#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 -#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data -#define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 -#define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave -#define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave -#define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock -#define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync -#define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock -#define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data -#define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data -#define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock -#define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync -#define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data -#define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data -#define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock -#define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send -#define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send -#define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect -#define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready -#define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready -#define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator -#define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data -#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 -#define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 -#define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 -#define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 -#define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock -#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data -#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data -#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send -#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send -#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data -#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller -#define AT91C_ID_3_Reserved ( 3) // Reserved -#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter -#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_15_Reserved (15) // Reserved -#define AT91C_ID_16_Reserved (16) // Reserved -#define AT91C_ID_17_Reserved (17) // Reserved -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC0007FF7) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7S64 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address -#define AT91C_BASE_SPI (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00004000) // Internal SRAM size in byte (16 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00010000) // Internal FLASH size in byte (64 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (128) // Internal FLASH Page Size: 128 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (4096) // Internal FLASH Lock Region Size: 4 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (512) // Internal FLASH Number of Pages: 512 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (16) // Internal FLASH Number of Lock Bits: 16 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X128.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X128.h deleted file mode 100644 index 7fab07f8b8..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X128.h +++ /dev/null @@ -1,2914 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7X128.h -// Object : AT91SAM7X128 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:15:23) -// -// CVS Reference : /AT91SAM7X128.pl/1.19/Wed Aug 30 14:09:08 2006// -// CVS Reference : /SYS_SAM7X.pl/1.3/Wed Feb 2 15:48:15 2005// -// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:22:29 2005// -// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7X.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_6ept.pl/1.1/Wed Aug 30 10:56:49 2006// -// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SSC_6078B.pl/1.2/Wed Apr 16 08:28:18 2008// -// CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /CAN_6019B.pl/1.1/Mon Jan 31 13:54:30 2005// -// CVS Reference : /EMACB_6119A.pl/1.6/Wed Jul 13 15:25:00 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7X128_H -#define AT91SAM7X128_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[85]; // - AT91_REG PIOB_PER; // PIO Enable Register - AT91_REG PIOB_PDR; // PIO Disable Register - AT91_REG PIOB_PSR; // PIO Status Register - AT91_REG Reserved13[1]; // - AT91_REG PIOB_OER; // Output Enable Register - AT91_REG PIOB_ODR; // Output Disable Registerr - AT91_REG PIOB_OSR; // Output Status Register - AT91_REG Reserved14[1]; // - AT91_REG PIOB_IFER; // Input Filter Enable Register - AT91_REG PIOB_IFDR; // Input Filter Disable Register - AT91_REG PIOB_IFSR; // Input Filter Status Register - AT91_REG Reserved15[1]; // - AT91_REG PIOB_SODR; // Set Output Data Register - AT91_REG PIOB_CODR; // Clear Output Data Register - AT91_REG PIOB_ODSR; // Output Data Status Register - AT91_REG PIOB_PDSR; // Pin Data Status Register - AT91_REG PIOB_IER; // Interrupt Enable Register - AT91_REG PIOB_IDR; // Interrupt Disable Register - AT91_REG PIOB_IMR; // Interrupt Mask Register - AT91_REG PIOB_ISR; // Interrupt Status Register - AT91_REG PIOB_MDER; // Multi-driver Enable Register - AT91_REG PIOB_MDDR; // Multi-driver Disable Register - AT91_REG PIOB_MDSR; // Multi-driver Status Register - AT91_REG Reserved16[1]; // - AT91_REG PIOB_PPUDR; // Pull-up Disable Register - AT91_REG PIOB_PPUER; // Pull-up Enable Register - AT91_REG PIOB_PPUSR; // Pull-up Status Register - AT91_REG Reserved17[1]; // - AT91_REG PIOB_ASR; // Select A Register - AT91_REG PIOB_BSR; // Select B Register - AT91_REG PIOB_ABSR; // AB Select Status Register - AT91_REG Reserved18[9]; // - AT91_REG PIOB_OWER; // Output Write Enable Register - AT91_REG PIOB_OWDR; // Output Write Disable Register - AT91_REG PIOB_OWSR; // Output Write Status Register - AT91_REG Reserved19[341]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved20[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved21[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved22[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved23[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved24[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved25[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved26[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved27[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved4[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[21]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000060) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000064) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000068) // (MC_FSR) MC Flash Status Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number -// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key -// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_CKG (0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection -#define AT91C_SSC_CKG_NONE (0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock -#define AT91C_SSC_CKG_LOW (0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low -#define AT91C_SSC_CKG_HIGH (0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STOP (0x1 << 12) // (SSC) Receive Stop Selection -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_CP0 (0x1 << 8) // (SSC) Compare 0 -#define AT91C_SSC_CP1 (0x1 << 9) // (SSC) Compare 1 -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register - AT91_REG Reserved3[2]; // - AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register - AT91_REG Reserved4[3]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt -#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 -#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CAN_MB { - AT91_REG CAN_MB_MMR; // MailBox Mode Register - AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register - AT91_REG CAN_MB_MID; // MailBox ID Register - AT91_REG CAN_MB_MFID; // MailBox Family ID Register - AT91_REG CAN_MB_MSR; // MailBox Status Register - AT91_REG CAN_MB_MDL; // MailBox Data Low Register - AT91_REG CAN_MB_MDH; // MailBox Data High Register - AT91_REG CAN_MB_MCR; // MailBox Control Register -} AT91S_CAN_MB, *AT91PS_CAN_MB; -#else -#define CAN_MMR (AT91_CAST(AT91_REG *) 0x00000000) // (CAN_MMR) MailBox Mode Register -#define CAN_MAM (AT91_CAST(AT91_REG *) 0x00000004) // (CAN_MAM) MailBox Acceptance Mask Register -#define CAN_MID (AT91_CAST(AT91_REG *) 0x00000008) // (CAN_MID) MailBox ID Register -#define CAN_MFID (AT91_CAST(AT91_REG *) 0x0000000C) // (CAN_MFID) MailBox Family ID Register -#define CAN_MSR (AT91_CAST(AT91_REG *) 0x00000010) // (CAN_MSR) MailBox Status Register -#define CAN_MDL (AT91_CAST(AT91_REG *) 0x00000014) // (CAN_MDL) MailBox Data Low Register -#define CAN_MDH (AT91_CAST(AT91_REG *) 0x00000018) // (CAN_MDH) MailBox Data High Register -#define CAN_MCR (AT91_CAST(AT91_REG *) 0x0000001C) // (CAN_MCR) MailBox Control Register - -#endif -// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- -#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark -#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority -#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type -#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) -// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- -#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode -#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode -#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version -// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- -// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- -// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- -#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value -#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code -#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request -#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort -#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready -#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored -// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- -// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- -// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- -#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox -#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CAN { - AT91_REG CAN_MR; // Mode Register - AT91_REG CAN_IER; // Interrupt Enable Register - AT91_REG CAN_IDR; // Interrupt Disable Register - AT91_REG CAN_IMR; // Interrupt Mask Register - AT91_REG CAN_SR; // Status Register - AT91_REG CAN_BR; // Baudrate Register - AT91_REG CAN_TIM; // Timer Register - AT91_REG CAN_TIMESTP; // Time Stamp Register - AT91_REG CAN_ECR; // Error Counter Register - AT91_REG CAN_TCR; // Transfer Command Register - AT91_REG CAN_ACR; // Abort Command Register - AT91_REG Reserved0[52]; // - AT91_REG CAN_VR; // Version Register - AT91_REG Reserved1[64]; // - AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 - AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 - AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 - AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 - AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 - AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 - AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 - AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 - AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 - AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 - AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 - AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 - AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 - AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 - AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 - AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 -} AT91S_CAN, *AT91PS_CAN; -#else -#define CAN_MR (AT91_CAST(AT91_REG *) 0x00000000) // (CAN_MR) Mode Register -#define CAN_IER (AT91_CAST(AT91_REG *) 0x00000004) // (CAN_IER) Interrupt Enable Register -#define CAN_IDR (AT91_CAST(AT91_REG *) 0x00000008) // (CAN_IDR) Interrupt Disable Register -#define CAN_IMR (AT91_CAST(AT91_REG *) 0x0000000C) // (CAN_IMR) Interrupt Mask Register -#define CAN_SR (AT91_CAST(AT91_REG *) 0x00000010) // (CAN_SR) Status Register -#define CAN_BR (AT91_CAST(AT91_REG *) 0x00000014) // (CAN_BR) Baudrate Register -#define CAN_TIM (AT91_CAST(AT91_REG *) 0x00000018) // (CAN_TIM) Timer Register -#define CAN_TIMESTP (AT91_CAST(AT91_REG *) 0x0000001C) // (CAN_TIMESTP) Time Stamp Register -#define CAN_ECR (AT91_CAST(AT91_REG *) 0x00000020) // (CAN_ECR) Error Counter Register -#define CAN_TCR (AT91_CAST(AT91_REG *) 0x00000024) // (CAN_TCR) Transfer Command Register -#define CAN_ACR (AT91_CAST(AT91_REG *) 0x00000028) // (CAN_ACR) Abort Command Register -#define CAN_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (CAN_VR) Version Register - -#endif -// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- -#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable -#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode -#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode -#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame -#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame -#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode -#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze -#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat -// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- -#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag -#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag -#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag -#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag -#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag -#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag -#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag -#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag -#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag -#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag -#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag -#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag -#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag -#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag -#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag -#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag -#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag -#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag -#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag -#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag -#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag -#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag -#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag -#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag -#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error -#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error -#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error -#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error -#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error -// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- -// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- -// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- -#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy -#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy -#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy -// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- -#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment -#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment -#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment -#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment -#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler -#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode -// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- -#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field -// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- -// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- -#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter -#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter -// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- -#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field -// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_EMAC { - AT91_REG EMAC_NCR; // Network Control Register - AT91_REG EMAC_NCFGR; // Network Configuration Register - AT91_REG EMAC_NSR; // Network Status Register - AT91_REG Reserved0[2]; // - AT91_REG EMAC_TSR; // Transmit Status Register - AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer - AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer - AT91_REG EMAC_RSR; // Receive Status Register - AT91_REG EMAC_ISR; // Interrupt Status Register - AT91_REG EMAC_IER; // Interrupt Enable Register - AT91_REG EMAC_IDR; // Interrupt Disable Register - AT91_REG EMAC_IMR; // Interrupt Mask Register - AT91_REG EMAC_MAN; // PHY Maintenance Register - AT91_REG EMAC_PTR; // Pause Time Register - AT91_REG EMAC_PFR; // Pause Frames received Register - AT91_REG EMAC_FTO; // Frames Transmitted OK Register - AT91_REG EMAC_SCF; // Single Collision Frame Register - AT91_REG EMAC_MCF; // Multiple Collision Frame Register - AT91_REG EMAC_FRO; // Frames Received OK Register - AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register - AT91_REG EMAC_ALE; // Alignment Error Register - AT91_REG EMAC_DTF; // Deferred Transmission Frame Register - AT91_REG EMAC_LCOL; // Late Collision Register - AT91_REG EMAC_ECOL; // Excessive Collision Register - AT91_REG EMAC_TUND; // Transmit Underrun Error Register - AT91_REG EMAC_CSE; // Carrier Sense Error Register - AT91_REG EMAC_RRE; // Receive Ressource Error Register - AT91_REG EMAC_ROV; // Receive Overrun Errors Register - AT91_REG EMAC_RSE; // Receive Symbol Errors Register - AT91_REG EMAC_ELE; // Excessive Length Errors Register - AT91_REG EMAC_RJA; // Receive Jabbers Register - AT91_REG EMAC_USF; // Undersize Frames Register - AT91_REG EMAC_STE; // SQE Test Error Register - AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register - AT91_REG EMAC_TPF; // Transmitted Pause Frames Register - AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] - AT91_REG EMAC_HRT; // Hash Address Top[63:32] - AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes - AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes - AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes - AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes - AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes - AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes - AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes - AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes - AT91_REG EMAC_TID; // Type ID Checking Register - AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register - AT91_REG EMAC_USRIO; // USER Input/Output Register - AT91_REG EMAC_WOL; // Wake On LAN Register - AT91_REG Reserved1[13]; // - AT91_REG EMAC_REV; // Revision Register -} AT91S_EMAC, *AT91PS_EMAC; -#else -#define EMAC_NCR (AT91_CAST(AT91_REG *) 0x00000000) // (EMAC_NCR) Network Control Register -#define EMAC_NCFGR (AT91_CAST(AT91_REG *) 0x00000004) // (EMAC_NCFGR) Network Configuration Register -#define EMAC_NSR (AT91_CAST(AT91_REG *) 0x00000008) // (EMAC_NSR) Network Status Register -#define EMAC_TSR (AT91_CAST(AT91_REG *) 0x00000014) // (EMAC_TSR) Transmit Status Register -#define EMAC_RBQP (AT91_CAST(AT91_REG *) 0x00000018) // (EMAC_RBQP) Receive Buffer Queue Pointer -#define EMAC_TBQP (AT91_CAST(AT91_REG *) 0x0000001C) // (EMAC_TBQP) Transmit Buffer Queue Pointer -#define EMAC_RSR (AT91_CAST(AT91_REG *) 0x00000020) // (EMAC_RSR) Receive Status Register -#define EMAC_ISR (AT91_CAST(AT91_REG *) 0x00000024) // (EMAC_ISR) Interrupt Status Register -#define EMAC_IER (AT91_CAST(AT91_REG *) 0x00000028) // (EMAC_IER) Interrupt Enable Register -#define EMAC_IDR (AT91_CAST(AT91_REG *) 0x0000002C) // (EMAC_IDR) Interrupt Disable Register -#define EMAC_IMR (AT91_CAST(AT91_REG *) 0x00000030) // (EMAC_IMR) Interrupt Mask Register -#define EMAC_MAN (AT91_CAST(AT91_REG *) 0x00000034) // (EMAC_MAN) PHY Maintenance Register -#define EMAC_PTR (AT91_CAST(AT91_REG *) 0x00000038) // (EMAC_PTR) Pause Time Register -#define EMAC_PFR (AT91_CAST(AT91_REG *) 0x0000003C) // (EMAC_PFR) Pause Frames received Register -#define EMAC_FTO (AT91_CAST(AT91_REG *) 0x00000040) // (EMAC_FTO) Frames Transmitted OK Register -#define EMAC_SCF (AT91_CAST(AT91_REG *) 0x00000044) // (EMAC_SCF) Single Collision Frame Register -#define EMAC_MCF (AT91_CAST(AT91_REG *) 0x00000048) // (EMAC_MCF) Multiple Collision Frame Register -#define EMAC_FRO (AT91_CAST(AT91_REG *) 0x0000004C) // (EMAC_FRO) Frames Received OK Register -#define EMAC_FCSE (AT91_CAST(AT91_REG *) 0x00000050) // (EMAC_FCSE) Frame Check Sequence Error Register -#define EMAC_ALE (AT91_CAST(AT91_REG *) 0x00000054) // (EMAC_ALE) Alignment Error Register -#define EMAC_DTF (AT91_CAST(AT91_REG *) 0x00000058) // (EMAC_DTF) Deferred Transmission Frame Register -#define EMAC_LCOL (AT91_CAST(AT91_REG *) 0x0000005C) // (EMAC_LCOL) Late Collision Register -#define EMAC_ECOL (AT91_CAST(AT91_REG *) 0x00000060) // (EMAC_ECOL) Excessive Collision Register -#define EMAC_TUND (AT91_CAST(AT91_REG *) 0x00000064) // (EMAC_TUND) Transmit Underrun Error Register -#define EMAC_CSE (AT91_CAST(AT91_REG *) 0x00000068) // (EMAC_CSE) Carrier Sense Error Register -#define EMAC_RRE (AT91_CAST(AT91_REG *) 0x0000006C) // (EMAC_RRE) Receive Ressource Error Register -#define EMAC_ROV (AT91_CAST(AT91_REG *) 0x00000070) // (EMAC_ROV) Receive Overrun Errors Register -#define EMAC_RSE (AT91_CAST(AT91_REG *) 0x00000074) // (EMAC_RSE) Receive Symbol Errors Register -#define EMAC_ELE (AT91_CAST(AT91_REG *) 0x00000078) // (EMAC_ELE) Excessive Length Errors Register -#define EMAC_RJA (AT91_CAST(AT91_REG *) 0x0000007C) // (EMAC_RJA) Receive Jabbers Register -#define EMAC_USF (AT91_CAST(AT91_REG *) 0x00000080) // (EMAC_USF) Undersize Frames Register -#define EMAC_STE (AT91_CAST(AT91_REG *) 0x00000084) // (EMAC_STE) SQE Test Error Register -#define EMAC_RLE (AT91_CAST(AT91_REG *) 0x00000088) // (EMAC_RLE) Receive Length Field Mismatch Register -#define EMAC_TPF (AT91_CAST(AT91_REG *) 0x0000008C) // (EMAC_TPF) Transmitted Pause Frames Register -#define EMAC_HRB (AT91_CAST(AT91_REG *) 0x00000090) // (EMAC_HRB) Hash Address Bottom[31:0] -#define EMAC_HRT (AT91_CAST(AT91_REG *) 0x00000094) // (EMAC_HRT) Hash Address Top[63:32] -#define EMAC_SA1L (AT91_CAST(AT91_REG *) 0x00000098) // (EMAC_SA1L) Specific Address 1 Bottom, First 4 bytes -#define EMAC_SA1H (AT91_CAST(AT91_REG *) 0x0000009C) // (EMAC_SA1H) Specific Address 1 Top, Last 2 bytes -#define EMAC_SA2L (AT91_CAST(AT91_REG *) 0x000000A0) // (EMAC_SA2L) Specific Address 2 Bottom, First 4 bytes -#define EMAC_SA2H (AT91_CAST(AT91_REG *) 0x000000A4) // (EMAC_SA2H) Specific Address 2 Top, Last 2 bytes -#define EMAC_SA3L (AT91_CAST(AT91_REG *) 0x000000A8) // (EMAC_SA3L) Specific Address 3 Bottom, First 4 bytes -#define EMAC_SA3H (AT91_CAST(AT91_REG *) 0x000000AC) // (EMAC_SA3H) Specific Address 3 Top, Last 2 bytes -#define EMAC_SA4L (AT91_CAST(AT91_REG *) 0x000000B0) // (EMAC_SA4L) Specific Address 4 Bottom, First 4 bytes -#define EMAC_SA4H (AT91_CAST(AT91_REG *) 0x000000B4) // (EMAC_SA4H) Specific Address 4 Top, Last 2 bytes -#define EMAC_TID (AT91_CAST(AT91_REG *) 0x000000B8) // (EMAC_TID) Type ID Checking Register -#define EMAC_TPQ (AT91_CAST(AT91_REG *) 0x000000BC) // (EMAC_TPQ) Transmit Pause Quantum Register -#define EMAC_USRIO (AT91_CAST(AT91_REG *) 0x000000C0) // (EMAC_USRIO) USER Input/Output Register -#define EMAC_WOL (AT91_CAST(AT91_REG *) 0x000000C4) // (EMAC_WOL) Wake On LAN Register -#define EMAC_REV (AT91_CAST(AT91_REG *) 0x000000FC) // (EMAC_REV) Revision Register - -#endif -// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- -#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. -#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. -#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. -#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. -#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. -#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. -#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. -#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. -#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. -#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. -#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. -#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame -#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame -// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- -#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. -#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. -#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. -#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. -#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. -#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable -#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. -#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. -#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. -#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) -#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 -#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 -#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 -#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 -#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) -#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) -#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) -#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer -#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable -#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS -#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) -#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS -// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- -#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) -#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) -#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) -// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- -#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) -#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) -#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) -#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go -#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame -#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) -#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) -// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- -#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) -#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) -#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) -// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- -#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) -#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) -#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) -#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) -#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) -#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) -#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) -#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) -#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) -#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) -#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) -#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) -#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) -// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- -// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- -// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- -// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- -#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) -#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) -#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) -#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) -#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) -#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) -// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- -#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII -#define AT91C_EMAC_CLKEN (0x1 << 1) // (EMAC) Clock Enable -// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- -#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address -#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable -#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable -#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable -// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- -#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) -#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7X128 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for PIOB peripheral ========== -#define AT91C_PIOB_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register -#define AT91C_PIOB_MDER (AT91_CAST(AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register -#define AT91C_PIOB_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register -#define AT91C_PIOB_IMR (AT91_CAST(AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register -#define AT91C_PIOB_ASR (AT91_CAST(AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register -#define AT91C_PIOB_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register -#define AT91C_PIOB_PSR (AT91_CAST(AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register -#define AT91C_PIOB_IER (AT91_CAST(AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register -#define AT91C_PIOB_CODR (AT91_CAST(AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register -#define AT91C_PIOB_OWER (AT91_CAST(AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register -#define AT91C_PIOB_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register -#define AT91C_PIOB_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register -#define AT91C_PIOB_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register -#define AT91C_PIOB_IDR (AT91_CAST(AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register -#define AT91C_PIOB_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register -#define AT91C_PIOB_PDR (AT91_CAST(AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register -#define AT91C_PIOB_ODR (AT91_CAST(AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr -#define AT91C_PIOB_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register -#define AT91C_PIOB_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register -#define AT91C_PIOB_SODR (AT91_CAST(AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register -#define AT91C_PIOB_ISR (AT91_CAST(AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register -#define AT91C_PIOB_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register -#define AT91C_PIOB_OSR (AT91_CAST(AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register -#define AT91C_PIOB_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register -#define AT91C_PIOB_IFER (AT91_CAST(AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register -#define AT91C_PIOB_BSR (AT91_CAST(AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register -#define AT91C_PIOB_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register -#define AT91C_PIOB_OER (AT91_CAST(AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register -#define AT91C_PIOB_PER (AT91_CAST(AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register -#define AT91C_MC_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register -// ========== Register definition for PDC_SPI1 peripheral ========== -#define AT91C_SPI1_PTCR (AT91_CAST(AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register -#define AT91C_SPI1_RPR (AT91_CAST(AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register -#define AT91C_SPI1_TNCR (AT91_CAST(AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register -#define AT91C_SPI1_TPR (AT91_CAST(AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register -#define AT91C_SPI1_TNPR (AT91_CAST(AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register -#define AT91C_SPI1_TCR (AT91_CAST(AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register -#define AT91C_SPI1_RCR (AT91_CAST(AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register -#define AT91C_SPI1_RNPR (AT91_CAST(AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register -#define AT91C_SPI1_RNCR (AT91_CAST(AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register -#define AT91C_SPI1_PTSR (AT91_CAST(AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register -// ========== Register definition for SPI1 peripheral ========== -#define AT91C_SPI1_IMR (AT91_CAST(AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register -#define AT91C_SPI1_IER (AT91_CAST(AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register -#define AT91C_SPI1_MR (AT91_CAST(AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register -#define AT91C_SPI1_RDR (AT91_CAST(AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register -#define AT91C_SPI1_IDR (AT91_CAST(AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register -#define AT91C_SPI1_SR (AT91_CAST(AT91_REG *) 0xFFFE4010) // (SPI1) Status Register -#define AT91C_SPI1_TDR (AT91_CAST(AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register -#define AT91C_SPI1_CR (AT91_CAST(AT91_REG *) 0xFFFE4000) // (SPI1) Control Register -#define AT91C_SPI1_CSR (AT91_CAST(AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register -// ========== Register definition for PDC_SPI0 peripheral ========== -#define AT91C_SPI0_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register -#define AT91C_SPI0_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register -#define AT91C_SPI0_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register -#define AT91C_SPI0_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register -#define AT91C_SPI0_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register -#define AT91C_SPI0_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register -#define AT91C_SPI0_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register -#define AT91C_SPI0_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register -#define AT91C_SPI0_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register -#define AT91C_SPI0_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register -// ========== Register definition for SPI0 peripheral ========== -#define AT91C_SPI0_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register -#define AT91C_SPI0_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI0) Status Register -#define AT91C_SPI0_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register -#define AT91C_SPI0_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI0) Control Register -#define AT91C_SPI0_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register -#define AT91C_SPI0_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register -#define AT91C_SPI0_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register -#define AT91C_SPI0_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register -#define AT91C_SPI0_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for CAN_MB0 peripheral ========== -#define AT91C_CAN_MB0_MDL (AT91_CAST(AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register -#define AT91C_CAN_MB0_MAM (AT91_CAST(AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register -#define AT91C_CAN_MB0_MCR (AT91_CAST(AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register -#define AT91C_CAN_MB0_MID (AT91_CAST(AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register -#define AT91C_CAN_MB0_MSR (AT91_CAST(AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register -#define AT91C_CAN_MB0_MFID (AT91_CAST(AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register -#define AT91C_CAN_MB0_MDH (AT91_CAST(AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register -#define AT91C_CAN_MB0_MMR (AT91_CAST(AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register -// ========== Register definition for CAN_MB1 peripheral ========== -#define AT91C_CAN_MB1_MDL (AT91_CAST(AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register -#define AT91C_CAN_MB1_MID (AT91_CAST(AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register -#define AT91C_CAN_MB1_MMR (AT91_CAST(AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register -#define AT91C_CAN_MB1_MSR (AT91_CAST(AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register -#define AT91C_CAN_MB1_MAM (AT91_CAST(AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register -#define AT91C_CAN_MB1_MDH (AT91_CAST(AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register -#define AT91C_CAN_MB1_MCR (AT91_CAST(AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register -#define AT91C_CAN_MB1_MFID (AT91_CAST(AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register -// ========== Register definition for CAN_MB2 peripheral ========== -#define AT91C_CAN_MB2_MCR (AT91_CAST(AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register -#define AT91C_CAN_MB2_MDH (AT91_CAST(AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register -#define AT91C_CAN_MB2_MID (AT91_CAST(AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register -#define AT91C_CAN_MB2_MDL (AT91_CAST(AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register -#define AT91C_CAN_MB2_MMR (AT91_CAST(AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register -#define AT91C_CAN_MB2_MAM (AT91_CAST(AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register -#define AT91C_CAN_MB2_MFID (AT91_CAST(AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register -#define AT91C_CAN_MB2_MSR (AT91_CAST(AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register -// ========== Register definition for CAN_MB3 peripheral ========== -#define AT91C_CAN_MB3_MFID (AT91_CAST(AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register -#define AT91C_CAN_MB3_MAM (AT91_CAST(AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register -#define AT91C_CAN_MB3_MID (AT91_CAST(AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register -#define AT91C_CAN_MB3_MCR (AT91_CAST(AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register -#define AT91C_CAN_MB3_MMR (AT91_CAST(AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register -#define AT91C_CAN_MB3_MSR (AT91_CAST(AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register -#define AT91C_CAN_MB3_MDL (AT91_CAST(AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register -#define AT91C_CAN_MB3_MDH (AT91_CAST(AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register -// ========== Register definition for CAN_MB4 peripheral ========== -#define AT91C_CAN_MB4_MID (AT91_CAST(AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register -#define AT91C_CAN_MB4_MMR (AT91_CAST(AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register -#define AT91C_CAN_MB4_MDH (AT91_CAST(AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register -#define AT91C_CAN_MB4_MFID (AT91_CAST(AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register -#define AT91C_CAN_MB4_MSR (AT91_CAST(AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register -#define AT91C_CAN_MB4_MCR (AT91_CAST(AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register -#define AT91C_CAN_MB4_MDL (AT91_CAST(AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register -#define AT91C_CAN_MB4_MAM (AT91_CAST(AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register -// ========== Register definition for CAN_MB5 peripheral ========== -#define AT91C_CAN_MB5_MSR (AT91_CAST(AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register -#define AT91C_CAN_MB5_MCR (AT91_CAST(AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register -#define AT91C_CAN_MB5_MFID (AT91_CAST(AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register -#define AT91C_CAN_MB5_MDH (AT91_CAST(AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register -#define AT91C_CAN_MB5_MID (AT91_CAST(AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register -#define AT91C_CAN_MB5_MMR (AT91_CAST(AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register -#define AT91C_CAN_MB5_MDL (AT91_CAST(AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register -#define AT91C_CAN_MB5_MAM (AT91_CAST(AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register -// ========== Register definition for CAN_MB6 peripheral ========== -#define AT91C_CAN_MB6_MFID (AT91_CAST(AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register -#define AT91C_CAN_MB6_MID (AT91_CAST(AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register -#define AT91C_CAN_MB6_MAM (AT91_CAST(AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register -#define AT91C_CAN_MB6_MSR (AT91_CAST(AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register -#define AT91C_CAN_MB6_MDL (AT91_CAST(AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register -#define AT91C_CAN_MB6_MCR (AT91_CAST(AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register -#define AT91C_CAN_MB6_MDH (AT91_CAST(AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register -#define AT91C_CAN_MB6_MMR (AT91_CAST(AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register -// ========== Register definition for CAN_MB7 peripheral ========== -#define AT91C_CAN_MB7_MCR (AT91_CAST(AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register -#define AT91C_CAN_MB7_MDH (AT91_CAST(AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register -#define AT91C_CAN_MB7_MFID (AT91_CAST(AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register -#define AT91C_CAN_MB7_MDL (AT91_CAST(AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register -#define AT91C_CAN_MB7_MID (AT91_CAST(AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register -#define AT91C_CAN_MB7_MMR (AT91_CAST(AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register -#define AT91C_CAN_MB7_MAM (AT91_CAST(AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register -#define AT91C_CAN_MB7_MSR (AT91_CAST(AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register -// ========== Register definition for CAN peripheral ========== -#define AT91C_CAN_TCR (AT91_CAST(AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register -#define AT91C_CAN_IMR (AT91_CAST(AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register -#define AT91C_CAN_IER (AT91_CAST(AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register -#define AT91C_CAN_ECR (AT91_CAST(AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register -#define AT91C_CAN_TIMESTP (AT91_CAST(AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register -#define AT91C_CAN_MR (AT91_CAST(AT91_REG *) 0xFFFD0000) // (CAN) Mode Register -#define AT91C_CAN_IDR (AT91_CAST(AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register -#define AT91C_CAN_ACR (AT91_CAST(AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register -#define AT91C_CAN_TIM (AT91_CAST(AT91_REG *) 0xFFFD0018) // (CAN) Timer Register -#define AT91C_CAN_SR (AT91_CAST(AT91_REG *) 0xFFFD0010) // (CAN) Status Register -#define AT91C_CAN_BR (AT91_CAST(AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register -#define AT91C_CAN_VR (AT91_CAST(AT91_REG *) 0xFFFD00FC) // (CAN) Version Register -// ========== Register definition for EMAC peripheral ========== -#define AT91C_EMAC_ISR (AT91_CAST(AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register -#define AT91C_EMAC_SA4H (AT91_CAST(AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes -#define AT91C_EMAC_SA1L (AT91_CAST(AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes -#define AT91C_EMAC_ELE (AT91_CAST(AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register -#define AT91C_EMAC_LCOL (AT91_CAST(AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register -#define AT91C_EMAC_RLE (AT91_CAST(AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register -#define AT91C_EMAC_WOL (AT91_CAST(AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register -#define AT91C_EMAC_DTF (AT91_CAST(AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register -#define AT91C_EMAC_TUND (AT91_CAST(AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register -#define AT91C_EMAC_NCR (AT91_CAST(AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register -#define AT91C_EMAC_SA4L (AT91_CAST(AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes -#define AT91C_EMAC_RSR (AT91_CAST(AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register -#define AT91C_EMAC_SA3L (AT91_CAST(AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes -#define AT91C_EMAC_TSR (AT91_CAST(AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register -#define AT91C_EMAC_IDR (AT91_CAST(AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register -#define AT91C_EMAC_RSE (AT91_CAST(AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register -#define AT91C_EMAC_ECOL (AT91_CAST(AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register -#define AT91C_EMAC_TID (AT91_CAST(AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register -#define AT91C_EMAC_HRB (AT91_CAST(AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] -#define AT91C_EMAC_TBQP (AT91_CAST(AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer -#define AT91C_EMAC_USRIO (AT91_CAST(AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register -#define AT91C_EMAC_PTR (AT91_CAST(AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register -#define AT91C_EMAC_SA2H (AT91_CAST(AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes -#define AT91C_EMAC_ROV (AT91_CAST(AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register -#define AT91C_EMAC_ALE (AT91_CAST(AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register -#define AT91C_EMAC_RJA (AT91_CAST(AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register -#define AT91C_EMAC_RBQP (AT91_CAST(AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer -#define AT91C_EMAC_TPF (AT91_CAST(AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register -#define AT91C_EMAC_NCFGR (AT91_CAST(AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register -#define AT91C_EMAC_HRT (AT91_CAST(AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] -#define AT91C_EMAC_USF (AT91_CAST(AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register -#define AT91C_EMAC_FCSE (AT91_CAST(AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register -#define AT91C_EMAC_TPQ (AT91_CAST(AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register -#define AT91C_EMAC_MAN (AT91_CAST(AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register -#define AT91C_EMAC_FTO (AT91_CAST(AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register -#define AT91C_EMAC_REV (AT91_CAST(AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register -#define AT91C_EMAC_IMR (AT91_CAST(AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register -#define AT91C_EMAC_SCF (AT91_CAST(AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register -#define AT91C_EMAC_PFR (AT91_CAST(AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register -#define AT91C_EMAC_MCF (AT91_CAST(AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register -#define AT91C_EMAC_NSR (AT91_CAST(AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register -#define AT91C_EMAC_SA2L (AT91_CAST(AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes -#define AT91C_EMAC_FRO (AT91_CAST(AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register -#define AT91C_EMAC_IER (AT91_CAST(AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register -#define AT91C_EMAC_SA1H (AT91_CAST(AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes -#define AT91C_EMAC_CSE (AT91_CAST(AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register -#define AT91C_EMAC_SA3H (AT91_CAST(AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes -#define AT91C_EMAC_RRE (AT91_CAST(AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register -#define AT91C_EMAC_STE (AT91_CAST(AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7X128 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_SPI0_NPCS0 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_SPI0_NPCS1 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPI0_NPCS2 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_SPI0_NPCS3 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_SPI0_MISO (AT91C_PIO_PA16) // SPI 0 Master In Slave -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_SPI0_MOSI (AT91C_PIO_PA17) // SPI 0 Master Out Slave -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_SPI0_SPCK (AT91C_PIO_PA18) // SPI 0 Serial Clock -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PA2_SPI1_NPCS1 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync -#define AT91C_PA21_SPI1_NPCS0 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock -#define AT91C_PA22_SPI1_SPCK (AT91C_PIO_PA22) // SPI 1 Serial Clock -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data -#define AT91C_PA23_SPI1_MOSI (AT91C_PIO_PA23) // SPI 1 Master Out Slave -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data -#define AT91C_PA24_SPI1_MISO (AT91C_PIO_PA24) // SPI 1 Master In Slave -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock -#define AT91C_PA25_SPI1_NPCS1 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync -#define AT91C_PA26_SPI1_NPCS2 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data -#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input -#define AT91C_PA29_SPI1_NPCS3 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send -#define AT91C_PA3_SPI1_NPCS2 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 -#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send -#define AT91C_PA4_SPI1_NPCS3 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock -#define AT91C_PA7_SPI0_NPCS1 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send -#define AT91C_PA8_SPI0_NPCS2 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send -#define AT91C_PA9_SPI0_NPCS3 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 -#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock -#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 -#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable -#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 -#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 -#define AT91C_PB10_SPI1_NPCS1 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 -#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 -#define AT91C_PB11_SPI1_NPCS2 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 -#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error -#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input -#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 -#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 -#define AT91C_PB13_SPI0_NPCS1 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 -#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 -#define AT91C_PB14_SPI0_NPCS2 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 -#define AT91C_PB15_ERXDV_ECRSDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid -#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 -#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected -#define AT91C_PB16_SPI1_NPCS3 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 -#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock -#define AT91C_PB17_SPI0_NPCS3 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 -#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec -#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger -#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 -#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 -#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input -#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 -#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 -#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 -#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 -#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 -#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 -#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 -#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 -#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 -#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect -#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 -#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready -#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 -#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready -#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 -#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator -#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 -#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 -#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 -#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 -#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 -#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 -#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 -#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 -#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 -#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 -#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 -#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 -#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 -#define AT91C_PB4_ECRS (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid -#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 -#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 -#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 -#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 -#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 -#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error -#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 -#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock -#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 -#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A -#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B -#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 -#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_CAN (15) // Control Area Network Controller -#define AT91C_ID_EMAC (16) // Ethernet MAC -#define AT91C_ID_ADC (17) // Analog-to-Digital Converter -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC003FFFF) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7X128 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_PIOB (AT91_CAST(AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI1 (AT91_CAST(AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address -#define AT91C_BASE_SPI1 (AT91_CAST(AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address -#define AT91C_BASE_PDC_SPI0 (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address -#define AT91C_BASE_SPI0 (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_CAN_MB0 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address -#define AT91C_BASE_CAN_MB1 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address -#define AT91C_BASE_CAN_MB2 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address -#define AT91C_BASE_CAN_MB3 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address -#define AT91C_BASE_CAN_MB4 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address -#define AT91C_BASE_CAN_MB5 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address -#define AT91C_BASE_CAN_MB6 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address -#define AT91C_BASE_CAN_MB7 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address -#define AT91C_BASE_CAN (AT91_CAST(AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address -#define AT91C_BASE_EMAC (AT91_CAST(AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00008000) // Internal SRAM size in byte (32 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00020000) // Internal FLASH size in byte (128 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (512) // Internal FLASH Number of Pages: 512 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (8) // Internal FLASH Number of Lock Bits: 8 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X256.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X256.h deleted file mode 100644 index 20b0e747d8..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X256.h +++ /dev/null @@ -1,2918 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the disclaimer below in the documentation and/or -// other materials provided with the distribution. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7X256.h -// Object : AT91SAM7X256 definitions -// Generated : AT91 SW Application Group 06/19/2007 (15:41:06) -// -// CVS Reference : /AT91SAM7X256.pl/1.16/Wed Aug 30 14:16:22 2006// -// CVS Reference : /SYS_SAM7X.pl/1.3/Wed Feb 2 15:48:15 2005// -// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:22:29 2005// -// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7X.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_6ept.pl/1.1/Wed Aug 30 14:20:52 2006// -// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SSC_6078B.pl/1.1/Wed Jul 13 15:25:46 2005// -// CVS Reference : /TWI_6061A.pl/1.2/Wed Oct 25 15:03:34 2006// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /CAN_6019B.pl/1.1/Mon Jan 31 13:54:30 2005// -// CVS Reference : /EMACB_6119A.pl/1.6/Wed Jul 13 15:25:00 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7X256_H -#define AT91SAM7X256_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[85]; // - AT91_REG PIOB_PER; // PIO Enable Register - AT91_REG PIOB_PDR; // PIO Disable Register - AT91_REG PIOB_PSR; // PIO Status Register - AT91_REG Reserved13[1]; // - AT91_REG PIOB_OER; // Output Enable Register - AT91_REG PIOB_ODR; // Output Disable Registerr - AT91_REG PIOB_OSR; // Output Status Register - AT91_REG Reserved14[1]; // - AT91_REG PIOB_IFER; // Input Filter Enable Register - AT91_REG PIOB_IFDR; // Input Filter Disable Register - AT91_REG PIOB_IFSR; // Input Filter Status Register - AT91_REG Reserved15[1]; // - AT91_REG PIOB_SODR; // Set Output Data Register - AT91_REG PIOB_CODR; // Clear Output Data Register - AT91_REG PIOB_ODSR; // Output Data Status Register - AT91_REG PIOB_PDSR; // Pin Data Status Register - AT91_REG PIOB_IER; // Interrupt Enable Register - AT91_REG PIOB_IDR; // Interrupt Disable Register - AT91_REG PIOB_IMR; // Interrupt Mask Register - AT91_REG PIOB_ISR; // Interrupt Status Register - AT91_REG PIOB_MDER; // Multi-driver Enable Register - AT91_REG PIOB_MDDR; // Multi-driver Disable Register - AT91_REG PIOB_MDSR; // Multi-driver Status Register - AT91_REG Reserved16[1]; // - AT91_REG PIOB_PPUDR; // Pull-up Disable Register - AT91_REG PIOB_PPUER; // Pull-up Enable Register - AT91_REG PIOB_PPUSR; // Pull-up Status Register - AT91_REG Reserved17[1]; // - AT91_REG PIOB_ASR; // Select A Register - AT91_REG PIOB_BSR; // Select B Register - AT91_REG PIOB_ABSR; // AB Select Status Register - AT91_REG Reserved18[9]; // - AT91_REG PIOB_OWER; // Output Write Enable Register - AT91_REG PIOB_OWDR; // Output Write Disable Register - AT91_REG PIOB_OWSR; // Output Write Status Register - AT91_REG Reserved19[341]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved20[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved21[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved22[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved23[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved24[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved25[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved26[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved27[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved4[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[21]; // - AT91_REG MC_FMR; // MC Flash Mode Register - AT91_REG MC_FCR; // MC Flash Command Register - AT91_REG MC_FSR; // MC Flash Status Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000060) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000064) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000068) // (MC_FSR) MC Flash Status Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number -// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key -// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_CKG (0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection -#define AT91C_SSC_CKG_NONE (0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock -#define AT91C_SSC_CKG_LOW (0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low -#define AT91C_SSC_CKG_HIGH (0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STOP (0x1 << 12) // (SSC) Receive Stop Selection -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_CP0 (0x1 << 8) // (SSC) Compare 0 -#define AT91C_SSC_CP1 (0x1 << 9) // (SSC) Compare 1 -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register - AT91_REG Reserved3[2]; // - AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register - AT91_REG Reserved4[3]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt -#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 -#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CAN_MB { - AT91_REG CAN_MB_MMR; // MailBox Mode Register - AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register - AT91_REG CAN_MB_MID; // MailBox ID Register - AT91_REG CAN_MB_MFID; // MailBox Family ID Register - AT91_REG CAN_MB_MSR; // MailBox Status Register - AT91_REG CAN_MB_MDL; // MailBox Data Low Register - AT91_REG CAN_MB_MDH; // MailBox Data High Register - AT91_REG CAN_MB_MCR; // MailBox Control Register -} AT91S_CAN_MB, *AT91PS_CAN_MB; -#else -#define CAN_MMR (AT91_CAST(AT91_REG *) 0x00000000) // (CAN_MMR) MailBox Mode Register -#define CAN_MAM (AT91_CAST(AT91_REG *) 0x00000004) // (CAN_MAM) MailBox Acceptance Mask Register -#define CAN_MID (AT91_CAST(AT91_REG *) 0x00000008) // (CAN_MID) MailBox ID Register -#define CAN_MFID (AT91_CAST(AT91_REG *) 0x0000000C) // (CAN_MFID) MailBox Family ID Register -#define CAN_MSR (AT91_CAST(AT91_REG *) 0x00000010) // (CAN_MSR) MailBox Status Register -#define CAN_MDL (AT91_CAST(AT91_REG *) 0x00000014) // (CAN_MDL) MailBox Data Low Register -#define CAN_MDH (AT91_CAST(AT91_REG *) 0x00000018) // (CAN_MDH) MailBox Data High Register -#define CAN_MCR (AT91_CAST(AT91_REG *) 0x0000001C) // (CAN_MCR) MailBox Control Register - -#endif -// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- -#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark -#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority -#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type -#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) -// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- -#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode -#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode -#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version -// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- -// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- -// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- -#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value -#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code -#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request -#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort -#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready -#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored -// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- -// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- -// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- -#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox -#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CAN { - AT91_REG CAN_MR; // Mode Register - AT91_REG CAN_IER; // Interrupt Enable Register - AT91_REG CAN_IDR; // Interrupt Disable Register - AT91_REG CAN_IMR; // Interrupt Mask Register - AT91_REG CAN_SR; // Status Register - AT91_REG CAN_BR; // Baudrate Register - AT91_REG CAN_TIM; // Timer Register - AT91_REG CAN_TIMESTP; // Time Stamp Register - AT91_REG CAN_ECR; // Error Counter Register - AT91_REG CAN_TCR; // Transfer Command Register - AT91_REG CAN_ACR; // Abort Command Register - AT91_REG Reserved0[52]; // - AT91_REG CAN_VR; // Version Register - AT91_REG Reserved1[64]; // - AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 - AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 - AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 - AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 - AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 - AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 - AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 - AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 - AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 - AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 - AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 - AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 - AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 - AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 - AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 - AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 -} AT91S_CAN, *AT91PS_CAN; -#else -#define CAN_MR (AT91_CAST(AT91_REG *) 0x00000000) // (CAN_MR) Mode Register -#define CAN_IER (AT91_CAST(AT91_REG *) 0x00000004) // (CAN_IER) Interrupt Enable Register -#define CAN_IDR (AT91_CAST(AT91_REG *) 0x00000008) // (CAN_IDR) Interrupt Disable Register -#define CAN_IMR (AT91_CAST(AT91_REG *) 0x0000000C) // (CAN_IMR) Interrupt Mask Register -#define CAN_SR (AT91_CAST(AT91_REG *) 0x00000010) // (CAN_SR) Status Register -#define CAN_BR (AT91_CAST(AT91_REG *) 0x00000014) // (CAN_BR) Baudrate Register -#define CAN_TIM (AT91_CAST(AT91_REG *) 0x00000018) // (CAN_TIM) Timer Register -#define CAN_TIMESTP (AT91_CAST(AT91_REG *) 0x0000001C) // (CAN_TIMESTP) Time Stamp Register -#define CAN_ECR (AT91_CAST(AT91_REG *) 0x00000020) // (CAN_ECR) Error Counter Register -#define CAN_TCR (AT91_CAST(AT91_REG *) 0x00000024) // (CAN_TCR) Transfer Command Register -#define CAN_ACR (AT91_CAST(AT91_REG *) 0x00000028) // (CAN_ACR) Abort Command Register -#define CAN_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (CAN_VR) Version Register - -#endif -// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- -#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable -#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode -#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode -#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame -#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame -#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode -#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze -#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat -// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- -#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag -#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag -#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag -#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag -#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag -#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag -#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag -#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag -#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag -#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag -#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag -#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag -#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag -#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag -#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag -#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag -#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag -#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag -#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag -#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag -#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag -#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag -#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag -#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag -#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error -#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error -#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error -#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error -#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error -// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- -// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- -// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- -#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy -#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy -#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy -// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- -#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment -#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment -#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment -#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment -#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler -#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode -// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- -#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field -// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- -// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- -#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter -#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter -// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- -#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field -// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_EMAC { - AT91_REG EMAC_NCR; // Network Control Register - AT91_REG EMAC_NCFGR; // Network Configuration Register - AT91_REG EMAC_NSR; // Network Status Register - AT91_REG Reserved0[2]; // - AT91_REG EMAC_TSR; // Transmit Status Register - AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer - AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer - AT91_REG EMAC_RSR; // Receive Status Register - AT91_REG EMAC_ISR; // Interrupt Status Register - AT91_REG EMAC_IER; // Interrupt Enable Register - AT91_REG EMAC_IDR; // Interrupt Disable Register - AT91_REG EMAC_IMR; // Interrupt Mask Register - AT91_REG EMAC_MAN; // PHY Maintenance Register - AT91_REG EMAC_PTR; // Pause Time Register - AT91_REG EMAC_PFR; // Pause Frames received Register - AT91_REG EMAC_FTO; // Frames Transmitted OK Register - AT91_REG EMAC_SCF; // Single Collision Frame Register - AT91_REG EMAC_MCF; // Multiple Collision Frame Register - AT91_REG EMAC_FRO; // Frames Received OK Register - AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register - AT91_REG EMAC_ALE; // Alignment Error Register - AT91_REG EMAC_DTF; // Deferred Transmission Frame Register - AT91_REG EMAC_LCOL; // Late Collision Register - AT91_REG EMAC_ECOL; // Excessive Collision Register - AT91_REG EMAC_TUND; // Transmit Underrun Error Register - AT91_REG EMAC_CSE; // Carrier Sense Error Register - AT91_REG EMAC_RRE; // Receive Ressource Error Register - AT91_REG EMAC_ROV; // Receive Overrun Errors Register - AT91_REG EMAC_RSE; // Receive Symbol Errors Register - AT91_REG EMAC_ELE; // Excessive Length Errors Register - AT91_REG EMAC_RJA; // Receive Jabbers Register - AT91_REG EMAC_USF; // Undersize Frames Register - AT91_REG EMAC_STE; // SQE Test Error Register - AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register - AT91_REG EMAC_TPF; // Transmitted Pause Frames Register - AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] - AT91_REG EMAC_HRT; // Hash Address Top[63:32] - AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes - AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes - AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes - AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes - AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes - AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes - AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes - AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes - AT91_REG EMAC_TID; // Type ID Checking Register - AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register - AT91_REG EMAC_USRIO; // USER Input/Output Register - AT91_REG EMAC_WOL; // Wake On LAN Register - AT91_REG Reserved1[13]; // - AT91_REG EMAC_REV; // Revision Register -} AT91S_EMAC, *AT91PS_EMAC; -#else -#define EMAC_NCR (AT91_CAST(AT91_REG *) 0x00000000) // (EMAC_NCR) Network Control Register -#define EMAC_NCFGR (AT91_CAST(AT91_REG *) 0x00000004) // (EMAC_NCFGR) Network Configuration Register -#define EMAC_NSR (AT91_CAST(AT91_REG *) 0x00000008) // (EMAC_NSR) Network Status Register -#define EMAC_TSR (AT91_CAST(AT91_REG *) 0x00000014) // (EMAC_TSR) Transmit Status Register -#define EMAC_RBQP (AT91_CAST(AT91_REG *) 0x00000018) // (EMAC_RBQP) Receive Buffer Queue Pointer -#define EMAC_TBQP (AT91_CAST(AT91_REG *) 0x0000001C) // (EMAC_TBQP) Transmit Buffer Queue Pointer -#define EMAC_RSR (AT91_CAST(AT91_REG *) 0x00000020) // (EMAC_RSR) Receive Status Register -#define EMAC_ISR (AT91_CAST(AT91_REG *) 0x00000024) // (EMAC_ISR) Interrupt Status Register -#define EMAC_IER (AT91_CAST(AT91_REG *) 0x00000028) // (EMAC_IER) Interrupt Enable Register -#define EMAC_IDR (AT91_CAST(AT91_REG *) 0x0000002C) // (EMAC_IDR) Interrupt Disable Register -#define EMAC_IMR (AT91_CAST(AT91_REG *) 0x00000030) // (EMAC_IMR) Interrupt Mask Register -#define EMAC_MAN (AT91_CAST(AT91_REG *) 0x00000034) // (EMAC_MAN) PHY Maintenance Register -#define EMAC_PTR (AT91_CAST(AT91_REG *) 0x00000038) // (EMAC_PTR) Pause Time Register -#define EMAC_PFR (AT91_CAST(AT91_REG *) 0x0000003C) // (EMAC_PFR) Pause Frames received Register -#define EMAC_FTO (AT91_CAST(AT91_REG *) 0x00000040) // (EMAC_FTO) Frames Transmitted OK Register -#define EMAC_SCF (AT91_CAST(AT91_REG *) 0x00000044) // (EMAC_SCF) Single Collision Frame Register -#define EMAC_MCF (AT91_CAST(AT91_REG *) 0x00000048) // (EMAC_MCF) Multiple Collision Frame Register -#define EMAC_FRO (AT91_CAST(AT91_REG *) 0x0000004C) // (EMAC_FRO) Frames Received OK Register -#define EMAC_FCSE (AT91_CAST(AT91_REG *) 0x00000050) // (EMAC_FCSE) Frame Check Sequence Error Register -#define EMAC_ALE (AT91_CAST(AT91_REG *) 0x00000054) // (EMAC_ALE) Alignment Error Register -#define EMAC_DTF (AT91_CAST(AT91_REG *) 0x00000058) // (EMAC_DTF) Deferred Transmission Frame Register -#define EMAC_LCOL (AT91_CAST(AT91_REG *) 0x0000005C) // (EMAC_LCOL) Late Collision Register -#define EMAC_ECOL (AT91_CAST(AT91_REG *) 0x00000060) // (EMAC_ECOL) Excessive Collision Register -#define EMAC_TUND (AT91_CAST(AT91_REG *) 0x00000064) // (EMAC_TUND) Transmit Underrun Error Register -#define EMAC_CSE (AT91_CAST(AT91_REG *) 0x00000068) // (EMAC_CSE) Carrier Sense Error Register -#define EMAC_RRE (AT91_CAST(AT91_REG *) 0x0000006C) // (EMAC_RRE) Receive Ressource Error Register -#define EMAC_ROV (AT91_CAST(AT91_REG *) 0x00000070) // (EMAC_ROV) Receive Overrun Errors Register -#define EMAC_RSE (AT91_CAST(AT91_REG *) 0x00000074) // (EMAC_RSE) Receive Symbol Errors Register -#define EMAC_ELE (AT91_CAST(AT91_REG *) 0x00000078) // (EMAC_ELE) Excessive Length Errors Register -#define EMAC_RJA (AT91_CAST(AT91_REG *) 0x0000007C) // (EMAC_RJA) Receive Jabbers Register -#define EMAC_USF (AT91_CAST(AT91_REG *) 0x00000080) // (EMAC_USF) Undersize Frames Register -#define EMAC_STE (AT91_CAST(AT91_REG *) 0x00000084) // (EMAC_STE) SQE Test Error Register -#define EMAC_RLE (AT91_CAST(AT91_REG *) 0x00000088) // (EMAC_RLE) Receive Length Field Mismatch Register -#define EMAC_TPF (AT91_CAST(AT91_REG *) 0x0000008C) // (EMAC_TPF) Transmitted Pause Frames Register -#define EMAC_HRB (AT91_CAST(AT91_REG *) 0x00000090) // (EMAC_HRB) Hash Address Bottom[31:0] -#define EMAC_HRT (AT91_CAST(AT91_REG *) 0x00000094) // (EMAC_HRT) Hash Address Top[63:32] -#define EMAC_SA1L (AT91_CAST(AT91_REG *) 0x00000098) // (EMAC_SA1L) Specific Address 1 Bottom, First 4 bytes -#define EMAC_SA1H (AT91_CAST(AT91_REG *) 0x0000009C) // (EMAC_SA1H) Specific Address 1 Top, Last 2 bytes -#define EMAC_SA2L (AT91_CAST(AT91_REG *) 0x000000A0) // (EMAC_SA2L) Specific Address 2 Bottom, First 4 bytes -#define EMAC_SA2H (AT91_CAST(AT91_REG *) 0x000000A4) // (EMAC_SA2H) Specific Address 2 Top, Last 2 bytes -#define EMAC_SA3L (AT91_CAST(AT91_REG *) 0x000000A8) // (EMAC_SA3L) Specific Address 3 Bottom, First 4 bytes -#define EMAC_SA3H (AT91_CAST(AT91_REG *) 0x000000AC) // (EMAC_SA3H) Specific Address 3 Top, Last 2 bytes -#define EMAC_SA4L (AT91_CAST(AT91_REG *) 0x000000B0) // (EMAC_SA4L) Specific Address 4 Bottom, First 4 bytes -#define EMAC_SA4H (AT91_CAST(AT91_REG *) 0x000000B4) // (EMAC_SA4H) Specific Address 4 Top, Last 2 bytes -#define EMAC_TID (AT91_CAST(AT91_REG *) 0x000000B8) // (EMAC_TID) Type ID Checking Register -#define EMAC_TPQ (AT91_CAST(AT91_REG *) 0x000000BC) // (EMAC_TPQ) Transmit Pause Quantum Register -#define EMAC_USRIO (AT91_CAST(AT91_REG *) 0x000000C0) // (EMAC_USRIO) USER Input/Output Register -#define EMAC_WOL (AT91_CAST(AT91_REG *) 0x000000C4) // (EMAC_WOL) Wake On LAN Register -#define EMAC_REV (AT91_CAST(AT91_REG *) 0x000000FC) // (EMAC_REV) Revision Register - -#endif -// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- -#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. -#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. -#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. -#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. -#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. -#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. -#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. -#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. -#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. -#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. -#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. -#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame -#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame -// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- -#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. -#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. -#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. -#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. -#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. -#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable -#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. -#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. -#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. -#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) -#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 -#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 -#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 -#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 -#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) -#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) -#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) -#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer -#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable -#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS -#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) -#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS -// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- -#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) -#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) -#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) -// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- -#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) -#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) -#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) -#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go -#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame -#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) -#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) -// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- -#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) -#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) -#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) -// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- -#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) -#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) -#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) -#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) -#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) -#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) -#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) -#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) -#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) -#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) -#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) -#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) -#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) -// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- -// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- -// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- -// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- -#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) -#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) -#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) -#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) -#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) -#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) -// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- -#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII -#define AT91C_EMAC_CLKEN (0x1 << 1) // (EMAC) Clock Enable -// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- -#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address -#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable -#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable -#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable -// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- -#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) -#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for PIOB peripheral ========== -#define AT91C_PIOB_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register -#define AT91C_PIOB_MDER (AT91_CAST(AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register -#define AT91C_PIOB_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register -#define AT91C_PIOB_IMR (AT91_CAST(AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register -#define AT91C_PIOB_ASR (AT91_CAST(AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register -#define AT91C_PIOB_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register -#define AT91C_PIOB_PSR (AT91_CAST(AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register -#define AT91C_PIOB_IER (AT91_CAST(AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register -#define AT91C_PIOB_CODR (AT91_CAST(AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register -#define AT91C_PIOB_OWER (AT91_CAST(AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register -#define AT91C_PIOB_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register -#define AT91C_PIOB_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register -#define AT91C_PIOB_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register -#define AT91C_PIOB_IDR (AT91_CAST(AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register -#define AT91C_PIOB_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register -#define AT91C_PIOB_PDR (AT91_CAST(AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register -#define AT91C_PIOB_ODR (AT91_CAST(AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr -#define AT91C_PIOB_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register -#define AT91C_PIOB_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register -#define AT91C_PIOB_SODR (AT91_CAST(AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register -#define AT91C_PIOB_ISR (AT91_CAST(AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register -#define AT91C_PIOB_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register -#define AT91C_PIOB_OSR (AT91_CAST(AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register -#define AT91C_PIOB_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register -#define AT91C_PIOB_IFER (AT91_CAST(AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register -#define AT91C_PIOB_BSR (AT91_CAST(AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register -#define AT91C_PIOB_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register -#define AT91C_PIOB_OER (AT91_CAST(AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register -#define AT91C_PIOB_PER (AT91_CAST(AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register -#define AT91C_MC_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register -// ========== Register definition for PDC_SPI1 peripheral ========== -#define AT91C_SPI1_PTCR (AT91_CAST(AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register -#define AT91C_SPI1_RPR (AT91_CAST(AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register -#define AT91C_SPI1_TNCR (AT91_CAST(AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register -#define AT91C_SPI1_TPR (AT91_CAST(AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register -#define AT91C_SPI1_TNPR (AT91_CAST(AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register -#define AT91C_SPI1_TCR (AT91_CAST(AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register -#define AT91C_SPI1_RCR (AT91_CAST(AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register -#define AT91C_SPI1_RNPR (AT91_CAST(AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register -#define AT91C_SPI1_RNCR (AT91_CAST(AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register -#define AT91C_SPI1_PTSR (AT91_CAST(AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register -// ========== Register definition for SPI1 peripheral ========== -#define AT91C_SPI1_IMR (AT91_CAST(AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register -#define AT91C_SPI1_IER (AT91_CAST(AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register -#define AT91C_SPI1_MR (AT91_CAST(AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register -#define AT91C_SPI1_RDR (AT91_CAST(AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register -#define AT91C_SPI1_IDR (AT91_CAST(AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register -#define AT91C_SPI1_SR (AT91_CAST(AT91_REG *) 0xFFFE4010) // (SPI1) Status Register -#define AT91C_SPI1_TDR (AT91_CAST(AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register -#define AT91C_SPI1_CR (AT91_CAST(AT91_REG *) 0xFFFE4000) // (SPI1) Control Register -#define AT91C_SPI1_CSR (AT91_CAST(AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register -// ========== Register definition for PDC_SPI0 peripheral ========== -#define AT91C_SPI0_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register -#define AT91C_SPI0_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register -#define AT91C_SPI0_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register -#define AT91C_SPI0_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register -#define AT91C_SPI0_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register -#define AT91C_SPI0_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register -#define AT91C_SPI0_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register -#define AT91C_SPI0_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register -#define AT91C_SPI0_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register -#define AT91C_SPI0_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register -// ========== Register definition for SPI0 peripheral ========== -#define AT91C_SPI0_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register -#define AT91C_SPI0_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI0) Status Register -#define AT91C_SPI0_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register -#define AT91C_SPI0_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI0) Control Register -#define AT91C_SPI0_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register -#define AT91C_SPI0_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register -#define AT91C_SPI0_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register -#define AT91C_SPI0_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register -#define AT91C_SPI0_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for CAN_MB0 peripheral ========== -#define AT91C_CAN_MB0_MDL (AT91_CAST(AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register -#define AT91C_CAN_MB0_MAM (AT91_CAST(AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register -#define AT91C_CAN_MB0_MCR (AT91_CAST(AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register -#define AT91C_CAN_MB0_MID (AT91_CAST(AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register -#define AT91C_CAN_MB0_MSR (AT91_CAST(AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register -#define AT91C_CAN_MB0_MFID (AT91_CAST(AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register -#define AT91C_CAN_MB0_MDH (AT91_CAST(AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register -#define AT91C_CAN_MB0_MMR (AT91_CAST(AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register -// ========== Register definition for CAN_MB1 peripheral ========== -#define AT91C_CAN_MB1_MDL (AT91_CAST(AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register -#define AT91C_CAN_MB1_MID (AT91_CAST(AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register -#define AT91C_CAN_MB1_MMR (AT91_CAST(AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register -#define AT91C_CAN_MB1_MSR (AT91_CAST(AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register -#define AT91C_CAN_MB1_MAM (AT91_CAST(AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register -#define AT91C_CAN_MB1_MDH (AT91_CAST(AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register -#define AT91C_CAN_MB1_MCR (AT91_CAST(AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register -#define AT91C_CAN_MB1_MFID (AT91_CAST(AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register -// ========== Register definition for CAN_MB2 peripheral ========== -#define AT91C_CAN_MB2_MCR (AT91_CAST(AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register -#define AT91C_CAN_MB2_MDH (AT91_CAST(AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register -#define AT91C_CAN_MB2_MID (AT91_CAST(AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register -#define AT91C_CAN_MB2_MDL (AT91_CAST(AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register -#define AT91C_CAN_MB2_MMR (AT91_CAST(AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register -#define AT91C_CAN_MB2_MAM (AT91_CAST(AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register -#define AT91C_CAN_MB2_MFID (AT91_CAST(AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register -#define AT91C_CAN_MB2_MSR (AT91_CAST(AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register -// ========== Register definition for CAN_MB3 peripheral ========== -#define AT91C_CAN_MB3_MFID (AT91_CAST(AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register -#define AT91C_CAN_MB3_MAM (AT91_CAST(AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register -#define AT91C_CAN_MB3_MID (AT91_CAST(AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register -#define AT91C_CAN_MB3_MCR (AT91_CAST(AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register -#define AT91C_CAN_MB3_MMR (AT91_CAST(AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register -#define AT91C_CAN_MB3_MSR (AT91_CAST(AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register -#define AT91C_CAN_MB3_MDL (AT91_CAST(AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register -#define AT91C_CAN_MB3_MDH (AT91_CAST(AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register -// ========== Register definition for CAN_MB4 peripheral ========== -#define AT91C_CAN_MB4_MID (AT91_CAST(AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register -#define AT91C_CAN_MB4_MMR (AT91_CAST(AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register -#define AT91C_CAN_MB4_MDH (AT91_CAST(AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register -#define AT91C_CAN_MB4_MFID (AT91_CAST(AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register -#define AT91C_CAN_MB4_MSR (AT91_CAST(AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register -#define AT91C_CAN_MB4_MCR (AT91_CAST(AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register -#define AT91C_CAN_MB4_MDL (AT91_CAST(AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register -#define AT91C_CAN_MB4_MAM (AT91_CAST(AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register -// ========== Register definition for CAN_MB5 peripheral ========== -#define AT91C_CAN_MB5_MSR (AT91_CAST(AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register -#define AT91C_CAN_MB5_MCR (AT91_CAST(AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register -#define AT91C_CAN_MB5_MFID (AT91_CAST(AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register -#define AT91C_CAN_MB5_MDH (AT91_CAST(AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register -#define AT91C_CAN_MB5_MID (AT91_CAST(AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register -#define AT91C_CAN_MB5_MMR (AT91_CAST(AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register -#define AT91C_CAN_MB5_MDL (AT91_CAST(AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register -#define AT91C_CAN_MB5_MAM (AT91_CAST(AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register -// ========== Register definition for CAN_MB6 peripheral ========== -#define AT91C_CAN_MB6_MFID (AT91_CAST(AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register -#define AT91C_CAN_MB6_MID (AT91_CAST(AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register -#define AT91C_CAN_MB6_MAM (AT91_CAST(AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register -#define AT91C_CAN_MB6_MSR (AT91_CAST(AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register -#define AT91C_CAN_MB6_MDL (AT91_CAST(AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register -#define AT91C_CAN_MB6_MCR (AT91_CAST(AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register -#define AT91C_CAN_MB6_MDH (AT91_CAST(AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register -#define AT91C_CAN_MB6_MMR (AT91_CAST(AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register -// ========== Register definition for CAN_MB7 peripheral ========== -#define AT91C_CAN_MB7_MCR (AT91_CAST(AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register -#define AT91C_CAN_MB7_MDH (AT91_CAST(AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register -#define AT91C_CAN_MB7_MFID (AT91_CAST(AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register -#define AT91C_CAN_MB7_MDL (AT91_CAST(AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register -#define AT91C_CAN_MB7_MID (AT91_CAST(AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register -#define AT91C_CAN_MB7_MMR (AT91_CAST(AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register -#define AT91C_CAN_MB7_MAM (AT91_CAST(AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register -#define AT91C_CAN_MB7_MSR (AT91_CAST(AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register -// ========== Register definition for CAN peripheral ========== -#define AT91C_CAN_TCR (AT91_CAST(AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register -#define AT91C_CAN_IMR (AT91_CAST(AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register -#define AT91C_CAN_IER (AT91_CAST(AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register -#define AT91C_CAN_ECR (AT91_CAST(AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register -#define AT91C_CAN_TIMESTP (AT91_CAST(AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register -#define AT91C_CAN_MR (AT91_CAST(AT91_REG *) 0xFFFD0000) // (CAN) Mode Register -#define AT91C_CAN_IDR (AT91_CAST(AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register -#define AT91C_CAN_ACR (AT91_CAST(AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register -#define AT91C_CAN_TIM (AT91_CAST(AT91_REG *) 0xFFFD0018) // (CAN) Timer Register -#define AT91C_CAN_SR (AT91_CAST(AT91_REG *) 0xFFFD0010) // (CAN) Status Register -#define AT91C_CAN_BR (AT91_CAST(AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register -#define AT91C_CAN_VR (AT91_CAST(AT91_REG *) 0xFFFD00FC) // (CAN) Version Register -// ========== Register definition for EMAC peripheral ========== -#define AT91C_EMAC_ISR (AT91_CAST(AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register -#define AT91C_EMAC_SA4H (AT91_CAST(AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes -#define AT91C_EMAC_SA1L (AT91_CAST(AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes -#define AT91C_EMAC_ELE (AT91_CAST(AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register -#define AT91C_EMAC_LCOL (AT91_CAST(AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register -#define AT91C_EMAC_RLE (AT91_CAST(AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register -#define AT91C_EMAC_WOL (AT91_CAST(AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register -#define AT91C_EMAC_DTF (AT91_CAST(AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register -#define AT91C_EMAC_TUND (AT91_CAST(AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register -#define AT91C_EMAC_NCR (AT91_CAST(AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register -#define AT91C_EMAC_SA4L (AT91_CAST(AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes -#define AT91C_EMAC_RSR (AT91_CAST(AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register -#define AT91C_EMAC_SA3L (AT91_CAST(AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes -#define AT91C_EMAC_TSR (AT91_CAST(AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register -#define AT91C_EMAC_IDR (AT91_CAST(AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register -#define AT91C_EMAC_RSE (AT91_CAST(AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register -#define AT91C_EMAC_ECOL (AT91_CAST(AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register -#define AT91C_EMAC_TID (AT91_CAST(AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register -#define AT91C_EMAC_HRB (AT91_CAST(AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] -#define AT91C_EMAC_TBQP (AT91_CAST(AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer -#define AT91C_EMAC_USRIO (AT91_CAST(AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register -#define AT91C_EMAC_PTR (AT91_CAST(AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register -#define AT91C_EMAC_SA2H (AT91_CAST(AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes -#define AT91C_EMAC_ROV (AT91_CAST(AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register -#define AT91C_EMAC_ALE (AT91_CAST(AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register -#define AT91C_EMAC_RJA (AT91_CAST(AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register -#define AT91C_EMAC_RBQP (AT91_CAST(AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer -#define AT91C_EMAC_TPF (AT91_CAST(AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register -#define AT91C_EMAC_NCFGR (AT91_CAST(AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register -#define AT91C_EMAC_HRT (AT91_CAST(AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] -#define AT91C_EMAC_USF (AT91_CAST(AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register -#define AT91C_EMAC_FCSE (AT91_CAST(AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register -#define AT91C_EMAC_TPQ (AT91_CAST(AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register -#define AT91C_EMAC_MAN (AT91_CAST(AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register -#define AT91C_EMAC_FTO (AT91_CAST(AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register -#define AT91C_EMAC_REV (AT91_CAST(AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register -#define AT91C_EMAC_IMR (AT91_CAST(AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register -#define AT91C_EMAC_SCF (AT91_CAST(AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register -#define AT91C_EMAC_PFR (AT91_CAST(AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register -#define AT91C_EMAC_MCF (AT91_CAST(AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register -#define AT91C_EMAC_NSR (AT91_CAST(AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register -#define AT91C_EMAC_SA2L (AT91_CAST(AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes -#define AT91C_EMAC_FRO (AT91_CAST(AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register -#define AT91C_EMAC_IER (AT91_CAST(AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register -#define AT91C_EMAC_SA1H (AT91_CAST(AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes -#define AT91C_EMAC_CSE (AT91_CAST(AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register -#define AT91C_EMAC_SA3H (AT91_CAST(AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes -#define AT91C_EMAC_RRE (AT91_CAST(AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register -#define AT91C_EMAC_STE (AT91_CAST(AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7X256 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_SPI0_NPCS0 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_SPI0_NPCS1 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPI0_NPCS2 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_SPI0_NPCS3 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_SPI0_MISO (AT91C_PIO_PA16) // SPI 0 Master In Slave -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_SPI0_MOSI (AT91C_PIO_PA17) // SPI 0 Master Out Slave -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_SPI0_SPCK (AT91C_PIO_PA18) // SPI 0 Serial Clock -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PA2_SPI1_NPCS1 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync -#define AT91C_PA21_SPI1_NPCS0 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock -#define AT91C_PA22_SPI1_SPCK (AT91C_PIO_PA22) // SPI 1 Serial Clock -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data -#define AT91C_PA23_SPI1_MOSI (AT91C_PIO_PA23) // SPI 1 Master Out Slave -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data -#define AT91C_PA24_SPI1_MISO (AT91C_PIO_PA24) // SPI 1 Master In Slave -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock -#define AT91C_PA25_SPI1_NPCS1 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync -#define AT91C_PA26_SPI1_NPCS2 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data -#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input -#define AT91C_PA29_SPI1_NPCS3 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send -#define AT91C_PA3_SPI1_NPCS2 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 -#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send -#define AT91C_PA4_SPI1_NPCS3 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock -#define AT91C_PA7_SPI0_NPCS1 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send -#define AT91C_PA8_SPI0_NPCS2 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send -#define AT91C_PA9_SPI0_NPCS3 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 -#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock -#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 -#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable -#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 -#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 -#define AT91C_PB10_SPI1_NPCS1 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 -#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 -#define AT91C_PB11_SPI1_NPCS2 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 -#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error -#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input -#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 -#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 -#define AT91C_PB13_SPI0_NPCS1 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 -#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 -#define AT91C_PB14_SPI0_NPCS2 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 -#define AT91C_PB15_ERXDV_ECRSDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid -#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 -#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected -#define AT91C_PB16_SPI1_NPCS3 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 -#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock -#define AT91C_PB17_SPI0_NPCS3 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 -#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec -#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger -#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 -#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 -#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input -#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 -#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 -#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 -#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 -#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 -#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 -#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 -#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 -#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 -#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect -#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 -#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready -#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 -#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready -#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 -#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator -#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 -#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 -#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 -#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 -#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 -#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 -#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 -#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 -#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 -#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 -#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 -#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 -#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 -#define AT91C_PB4_ECRS (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid -#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 -#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 -#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 -#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 -#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 -#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error -#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 -#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock -#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 -#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A -#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B -#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 -#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_CAN (15) // Control Area Network Controller -#define AT91C_ID_EMAC (16) // Ethernet MAC -#define AT91C_ID_ADC (17) // Analog-to-Digital Converter -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC003FFFF) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_PIOB (AT91_CAST(AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI1 (AT91_CAST(AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address -#define AT91C_BASE_SPI1 (AT91_CAST(AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address -#define AT91C_BASE_PDC_SPI0 (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address -#define AT91C_BASE_SPI0 (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_CAN_MB0 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address -#define AT91C_BASE_CAN_MB1 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address -#define AT91C_BASE_CAN_MB2 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address -#define AT91C_BASE_CAN_MB3 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address -#define AT91C_BASE_CAN_MB4 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address -#define AT91C_BASE_CAN_MB5 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address -#define AT91C_BASE_CAN_MB6 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address -#define AT91C_BASE_CAN_MB7 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address -#define AT91C_BASE_CAN (AT91_CAST(AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address -#define AT91C_BASE_EMAC (AT91_CAST(AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00040000) // Internal FLASH size in byte (256 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (1024) // Internal FLASH Number of Pages: 1024 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (16) // Internal FLASH Number of Lock Bits: 16 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X512.h b/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X512.h deleted file mode 100644 index 7c03a0db47..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/AT91SAM7X512.h +++ /dev/null @@ -1,2984 +0,0 @@ -// ---------------------------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// ---------------------------------------------------------------------------- -// Copyright (c) 2006, Atmel Corporation -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// -// Atmel's name may not be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE -// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. -// ---------------------------------------------------------------------------- -// File Name : AT91SAM7X512.h -// Object : AT91SAM7X512 definitions -// Generated : AT91 SW Application Group 07/07/2008 (16:15:41) -// -// CVS Reference : /AT91SAM7X512.pl/1.7/Wed Aug 30 14:09:17 2006// -// CVS Reference : /SYS_SAM7X.pl/1.3/Wed Feb 2 15:48:15 2005// -// CVS Reference : /MC_SAM7SE.pl/1.10/Thu Feb 16 16:35:28 2006// -// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 14:00:19 2005// -// CVS Reference : /RSTC_SAM7X.pl/1.2/Wed Jul 13 15:25:17 2005// -// CVS Reference : /UDP_6ept.pl/1.1/Wed Aug 30 10:56:49 2006// -// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 12:38:54 2005// -// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:21:42 2005// -// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:29:42 2005// -// CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// -// CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// -// CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// -// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:40:38 2005// -// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// -// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:54:41 2005// -// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:23:02 2005// -// CVS Reference : /US_6089C.pl/1.1/Mon Jan 31 13:56:02 2005// -// CVS Reference : /SSC_6078B.pl/1.2/Wed Apr 16 08:28:18 2008// -// CVS Reference : /TWI_6061A.pl/1.2/Fri Oct 27 11:40:48 2006// -// CVS Reference : /TC_6082A.pl/1.7/Wed Mar 9 16:31:51 2005// -// CVS Reference : /CAN_6019B.pl/1.1/Mon Jan 31 13:54:30 2005// -// CVS Reference : /EMACB_6119A.pl/1.6/Wed Jul 13 15:25:00 2005// -// CVS Reference : /ADC_6051C.pl/1.1/Mon Jan 31 13:12:40 2005// -// ---------------------------------------------------------------------------- - -#ifndef AT91SAM7X512_H -#define AT91SAM7X512_H - -#ifndef __ASSEMBLY__ -typedef volatile unsigned int AT91_REG;// Hardware register definition -#define AT91_CAST(a) (a) -#else -#define AT91_CAST(a) -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR System Peripherals -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SYS { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register - AT91_REG Reserved2[45]; // - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved3[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved4[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register - AT91_REG Reserved5[54]; // - AT91_REG PIOA_PER; // PIO Enable Register - AT91_REG PIOA_PDR; // PIO Disable Register - AT91_REG PIOA_PSR; // PIO Status Register - AT91_REG Reserved6[1]; // - AT91_REG PIOA_OER; // Output Enable Register - AT91_REG PIOA_ODR; // Output Disable Registerr - AT91_REG PIOA_OSR; // Output Status Register - AT91_REG Reserved7[1]; // - AT91_REG PIOA_IFER; // Input Filter Enable Register - AT91_REG PIOA_IFDR; // Input Filter Disable Register - AT91_REG PIOA_IFSR; // Input Filter Status Register - AT91_REG Reserved8[1]; // - AT91_REG PIOA_SODR; // Set Output Data Register - AT91_REG PIOA_CODR; // Clear Output Data Register - AT91_REG PIOA_ODSR; // Output Data Status Register - AT91_REG PIOA_PDSR; // Pin Data Status Register - AT91_REG PIOA_IER; // Interrupt Enable Register - AT91_REG PIOA_IDR; // Interrupt Disable Register - AT91_REG PIOA_IMR; // Interrupt Mask Register - AT91_REG PIOA_ISR; // Interrupt Status Register - AT91_REG PIOA_MDER; // Multi-driver Enable Register - AT91_REG PIOA_MDDR; // Multi-driver Disable Register - AT91_REG PIOA_MDSR; // Multi-driver Status Register - AT91_REG Reserved9[1]; // - AT91_REG PIOA_PPUDR; // Pull-up Disable Register - AT91_REG PIOA_PPUER; // Pull-up Enable Register - AT91_REG PIOA_PPUSR; // Pull-up Status Register - AT91_REG Reserved10[1]; // - AT91_REG PIOA_ASR; // Select A Register - AT91_REG PIOA_BSR; // Select B Register - AT91_REG PIOA_ABSR; // AB Select Status Register - AT91_REG Reserved11[9]; // - AT91_REG PIOA_OWER; // Output Write Enable Register - AT91_REG PIOA_OWDR; // Output Write Disable Register - AT91_REG PIOA_OWSR; // Output Write Status Register - AT91_REG Reserved12[85]; // - AT91_REG PIOB_PER; // PIO Enable Register - AT91_REG PIOB_PDR; // PIO Disable Register - AT91_REG PIOB_PSR; // PIO Status Register - AT91_REG Reserved13[1]; // - AT91_REG PIOB_OER; // Output Enable Register - AT91_REG PIOB_ODR; // Output Disable Registerr - AT91_REG PIOB_OSR; // Output Status Register - AT91_REG Reserved14[1]; // - AT91_REG PIOB_IFER; // Input Filter Enable Register - AT91_REG PIOB_IFDR; // Input Filter Disable Register - AT91_REG PIOB_IFSR; // Input Filter Status Register - AT91_REG Reserved15[1]; // - AT91_REG PIOB_SODR; // Set Output Data Register - AT91_REG PIOB_CODR; // Clear Output Data Register - AT91_REG PIOB_ODSR; // Output Data Status Register - AT91_REG PIOB_PDSR; // Pin Data Status Register - AT91_REG PIOB_IER; // Interrupt Enable Register - AT91_REG PIOB_IDR; // Interrupt Disable Register - AT91_REG PIOB_IMR; // Interrupt Mask Register - AT91_REG PIOB_ISR; // Interrupt Status Register - AT91_REG PIOB_MDER; // Multi-driver Enable Register - AT91_REG PIOB_MDDR; // Multi-driver Disable Register - AT91_REG PIOB_MDSR; // Multi-driver Status Register - AT91_REG Reserved16[1]; // - AT91_REG PIOB_PPUDR; // Pull-up Disable Register - AT91_REG PIOB_PPUER; // Pull-up Enable Register - AT91_REG PIOB_PPUSR; // Pull-up Status Register - AT91_REG Reserved17[1]; // - AT91_REG PIOB_ASR; // Select A Register - AT91_REG PIOB_BSR; // Select B Register - AT91_REG PIOB_ABSR; // AB Select Status Register - AT91_REG Reserved18[9]; // - AT91_REG PIOB_OWER; // Output Write Enable Register - AT91_REG PIOB_OWDR; // Output Write Disable Register - AT91_REG PIOB_OWSR; // Output Write Status Register - AT91_REG Reserved19[341]; // - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved20[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved21[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved22[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved23[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved24[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register - AT91_REG Reserved25[36]; // - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register - AT91_REG Reserved26[5]; // - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register - AT91_REG Reserved27[5]; // - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_SYS, *AT91PS_SYS; -#else - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_AIC { - AT91_REG AIC_SMR[32]; // Source Mode Register - AT91_REG AIC_SVR[32]; // Source Vector Register - AT91_REG AIC_IVR; // IRQ Vector Register - AT91_REG AIC_FVR; // FIQ Vector Register - AT91_REG AIC_ISR; // Interrupt Status Register - AT91_REG AIC_IPR; // Interrupt Pending Register - AT91_REG AIC_IMR; // Interrupt Mask Register - AT91_REG AIC_CISR; // Core Interrupt Status Register - AT91_REG Reserved0[2]; // - AT91_REG AIC_IECR; // Interrupt Enable Command Register - AT91_REG AIC_IDCR; // Interrupt Disable Command Register - AT91_REG AIC_ICCR; // Interrupt Clear Command Register - AT91_REG AIC_ISCR; // Interrupt Set Command Register - AT91_REG AIC_EOICR; // End of Interrupt Command Register - AT91_REG AIC_SPU; // Spurious Vector Register - AT91_REG AIC_DCR; // Debug Control Register (Protect) - AT91_REG Reserved1[1]; // - AT91_REG AIC_FFER; // Fast Forcing Enable Register - AT91_REG AIC_FFDR; // Fast Forcing Disable Register - AT91_REG AIC_FFSR; // Fast Forcing Status Register -} AT91S_AIC, *AT91PS_AIC; -#else -#define AIC_SMR (AT91_CAST(AT91_REG *) 0x00000000) // (AIC_SMR) Source Mode Register -#define AIC_SVR (AT91_CAST(AT91_REG *) 0x00000080) // (AIC_SVR) Source Vector Register -#define AIC_IVR (AT91_CAST(AT91_REG *) 0x00000100) // (AIC_IVR) IRQ Vector Register -#define AIC_FVR (AT91_CAST(AT91_REG *) 0x00000104) // (AIC_FVR) FIQ Vector Register -#define AIC_ISR (AT91_CAST(AT91_REG *) 0x00000108) // (AIC_ISR) Interrupt Status Register -#define AIC_IPR (AT91_CAST(AT91_REG *) 0x0000010C) // (AIC_IPR) Interrupt Pending Register -#define AIC_IMR (AT91_CAST(AT91_REG *) 0x00000110) // (AIC_IMR) Interrupt Mask Register -#define AIC_CISR (AT91_CAST(AT91_REG *) 0x00000114) // (AIC_CISR) Core Interrupt Status Register -#define AIC_IECR (AT91_CAST(AT91_REG *) 0x00000120) // (AIC_IECR) Interrupt Enable Command Register -#define AIC_IDCR (AT91_CAST(AT91_REG *) 0x00000124) // (AIC_IDCR) Interrupt Disable Command Register -#define AIC_ICCR (AT91_CAST(AT91_REG *) 0x00000128) // (AIC_ICCR) Interrupt Clear Command Register -#define AIC_ISCR (AT91_CAST(AT91_REG *) 0x0000012C) // (AIC_ISCR) Interrupt Set Command Register -#define AIC_EOICR (AT91_CAST(AT91_REG *) 0x00000130) // (AIC_EOICR) End of Interrupt Command Register -#define AIC_SPU (AT91_CAST(AT91_REG *) 0x00000134) // (AIC_SPU) Spurious Vector Register -#define AIC_DCR (AT91_CAST(AT91_REG *) 0x00000138) // (AIC_DCR) Debug Control Register (Protect) -#define AIC_FFER (AT91_CAST(AT91_REG *) 0x00000140) // (AIC_FFER) Fast Forcing Enable Register -#define AIC_FFDR (AT91_CAST(AT91_REG *) 0x00000144) // (AIC_FFDR) Fast Forcing Disable Register -#define AIC_FFSR (AT91_CAST(AT91_REG *) 0x00000148) // (AIC_FFSR) Fast Forcing Status Register - -#endif -// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- -#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level -#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level -#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level -#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type -#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive -#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered -#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered -#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive -#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered -// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- -#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status -#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status -// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- -#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode -#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Peripheral DMA Controller -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PDC { - AT91_REG PDC_RPR; // Receive Pointer Register - AT91_REG PDC_RCR; // Receive Counter Register - AT91_REG PDC_TPR; // Transmit Pointer Register - AT91_REG PDC_TCR; // Transmit Counter Register - AT91_REG PDC_RNPR; // Receive Next Pointer Register - AT91_REG PDC_RNCR; // Receive Next Counter Register - AT91_REG PDC_TNPR; // Transmit Next Pointer Register - AT91_REG PDC_TNCR; // Transmit Next Counter Register - AT91_REG PDC_PTCR; // PDC Transfer Control Register - AT91_REG PDC_PTSR; // PDC Transfer Status Register -} AT91S_PDC, *AT91PS_PDC; -#else -#define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register -#define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register -#define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register -#define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register -#define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register -#define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register -#define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register -#define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register -#define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register -#define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register - -#endif -// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- -#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable -#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable -#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable -#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable -// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Debug Unit -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_DBGU { - AT91_REG DBGU_CR; // Control Register - AT91_REG DBGU_MR; // Mode Register - AT91_REG DBGU_IER; // Interrupt Enable Register - AT91_REG DBGU_IDR; // Interrupt Disable Register - AT91_REG DBGU_IMR; // Interrupt Mask Register - AT91_REG DBGU_CSR; // Channel Status Register - AT91_REG DBGU_RHR; // Receiver Holding Register - AT91_REG DBGU_THR; // Transmitter Holding Register - AT91_REG DBGU_BRGR; // Baud Rate Generator Register - AT91_REG Reserved0[7]; // - AT91_REG DBGU_CIDR; // Chip ID Register - AT91_REG DBGU_EXID; // Chip ID Extension Register - AT91_REG DBGU_FNTR; // Force NTRST Register - AT91_REG Reserved1[45]; // - AT91_REG DBGU_RPR; // Receive Pointer Register - AT91_REG DBGU_RCR; // Receive Counter Register - AT91_REG DBGU_TPR; // Transmit Pointer Register - AT91_REG DBGU_TCR; // Transmit Counter Register - AT91_REG DBGU_RNPR; // Receive Next Pointer Register - AT91_REG DBGU_RNCR; // Receive Next Counter Register - AT91_REG DBGU_TNPR; // Transmit Next Pointer Register - AT91_REG DBGU_TNCR; // Transmit Next Counter Register - AT91_REG DBGU_PTCR; // PDC Transfer Control Register - AT91_REG DBGU_PTSR; // PDC Transfer Status Register -} AT91S_DBGU, *AT91PS_DBGU; -#else -#define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register -#define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register -#define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register -#define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register -#define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register -#define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register -#define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register -#define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register -#define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register -#define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000040) // (DBGU_CIDR) Chip ID Register -#define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000044) // (DBGU_EXID) Chip ID Extension Register -#define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register - -#endif -// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver -#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter -#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable -#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable -#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable -#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable -#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits -// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type -#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity -#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity -#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) -#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) -#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity -#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode -#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode -#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. -#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. -#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. -#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. -// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt -#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt -#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt -#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt -#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt -#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt -#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt -#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt -#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt -#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt -#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt -#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt -// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- -// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- -#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Parallel Input Output Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PIO { - AT91_REG PIO_PER; // PIO Enable Register - AT91_REG PIO_PDR; // PIO Disable Register - AT91_REG PIO_PSR; // PIO Status Register - AT91_REG Reserved0[1]; // - AT91_REG PIO_OER; // Output Enable Register - AT91_REG PIO_ODR; // Output Disable Registerr - AT91_REG PIO_OSR; // Output Status Register - AT91_REG Reserved1[1]; // - AT91_REG PIO_IFER; // Input Filter Enable Register - AT91_REG PIO_IFDR; // Input Filter Disable Register - AT91_REG PIO_IFSR; // Input Filter Status Register - AT91_REG Reserved2[1]; // - AT91_REG PIO_SODR; // Set Output Data Register - AT91_REG PIO_CODR; // Clear Output Data Register - AT91_REG PIO_ODSR; // Output Data Status Register - AT91_REG PIO_PDSR; // Pin Data Status Register - AT91_REG PIO_IER; // Interrupt Enable Register - AT91_REG PIO_IDR; // Interrupt Disable Register - AT91_REG PIO_IMR; // Interrupt Mask Register - AT91_REG PIO_ISR; // Interrupt Status Register - AT91_REG PIO_MDER; // Multi-driver Enable Register - AT91_REG PIO_MDDR; // Multi-driver Disable Register - AT91_REG PIO_MDSR; // Multi-driver Status Register - AT91_REG Reserved3[1]; // - AT91_REG PIO_PPUDR; // Pull-up Disable Register - AT91_REG PIO_PPUER; // Pull-up Enable Register - AT91_REG PIO_PPUSR; // Pull-up Status Register - AT91_REG Reserved4[1]; // - AT91_REG PIO_ASR; // Select A Register - AT91_REG PIO_BSR; // Select B Register - AT91_REG PIO_ABSR; // AB Select Status Register - AT91_REG Reserved5[9]; // - AT91_REG PIO_OWER; // Output Write Enable Register - AT91_REG PIO_OWDR; // Output Write Disable Register - AT91_REG PIO_OWSR; // Output Write Status Register -} AT91S_PIO, *AT91PS_PIO; -#else -#define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register -#define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register -#define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register -#define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register -#define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr -#define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register -#define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register -#define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register -#define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register -#define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register -#define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register -#define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register -#define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register -#define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register -#define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register -#define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register -#define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register -#define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register -#define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register -#define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register -#define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register -#define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register -#define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register -#define PIO_ASR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ASR) Select A Register -#define PIO_BSR (AT91_CAST(AT91_REG *) 0x00000074) // (PIO_BSR) Select B Register -#define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000078) // (PIO_ABSR) AB Select Status Register -#define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register -#define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register -#define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register - -#endif - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Clock Generator Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CKGR { - AT91_REG CKGR_MOR; // Main Oscillator Register - AT91_REG CKGR_MCFR; // Main Clock Frequency Register - AT91_REG Reserved0[1]; // - AT91_REG CKGR_PLLR; // PLL Register -} AT91S_CKGR, *AT91PS_CKGR; -#else -#define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000000) // (CKGR_MOR) Main Oscillator Register -#define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000004) // (CKGR_MCFR) Main Clock Frequency Register -#define CKGR_PLLR (AT91_CAST(AT91_REG *) 0x0000000C) // (CKGR_PLLR) PLL Register - -#endif -// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- -#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable -#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass -#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time -// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- -#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency -#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready -// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- -#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected -#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 -#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed -#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter -#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range -#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet -#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier -#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks -#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output -#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 -#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Power Management Controler -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PMC { - AT91_REG PMC_SCER; // System Clock Enable Register - AT91_REG PMC_SCDR; // System Clock Disable Register - AT91_REG PMC_SCSR; // System Clock Status Register - AT91_REG Reserved0[1]; // - AT91_REG PMC_PCER; // Peripheral Clock Enable Register - AT91_REG PMC_PCDR; // Peripheral Clock Disable Register - AT91_REG PMC_PCSR; // Peripheral Clock Status Register - AT91_REG Reserved1[1]; // - AT91_REG PMC_MOR; // Main Oscillator Register - AT91_REG PMC_MCFR; // Main Clock Frequency Register - AT91_REG Reserved2[1]; // - AT91_REG PMC_PLLR; // PLL Register - AT91_REG PMC_MCKR; // Master Clock Register - AT91_REG Reserved3[3]; // - AT91_REG PMC_PCKR[4]; // Programmable Clock Register - AT91_REG Reserved4[4]; // - AT91_REG PMC_IER; // Interrupt Enable Register - AT91_REG PMC_IDR; // Interrupt Disable Register - AT91_REG PMC_SR; // Status Register - AT91_REG PMC_IMR; // Interrupt Mask Register -} AT91S_PMC, *AT91PS_PMC; -#else -#define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register -#define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register -#define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register -#define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register -#define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register -#define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register -#define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register -#define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register -#define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register -#define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register -#define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register -#define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register - -#endif -// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- -#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock -#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock -#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output -#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output -// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- -// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- -// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- -// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- -// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- -// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- -#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection -#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected -#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected -#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected -#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler -#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock -#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 -#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 -#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 -#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 -#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 -#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 -// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- -// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- -#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask -#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask -#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask -#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask -// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- -// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- -// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Reset Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RSTC { - AT91_REG RSTC_RCR; // Reset Control Register - AT91_REG RSTC_RSR; // Reset Status Register - AT91_REG RSTC_RMR; // Reset Mode Register -} AT91S_RSTC, *AT91PS_RSTC; -#else -#define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register -#define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register -#define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register - -#endif -// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- -#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset -#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset -#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset -#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password -// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- -#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status -#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status -#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type -#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. -#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. -#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. -#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. -#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level -#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. -// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- -#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable -#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable -#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Length -#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_RTTC { - AT91_REG RTTC_RTMR; // Real-time Mode Register - AT91_REG RTTC_RTAR; // Real-time Alarm Register - AT91_REG RTTC_RTVR; // Real-time Value Register - AT91_REG RTTC_RTSR; // Real-time Status Register -} AT91S_RTTC, *AT91PS_RTTC; -#else -#define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register -#define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register -#define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register -#define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register - -#endif -// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- -#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value -#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable -#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable -#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart -// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- -#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value -// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- -#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value -// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- -#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status -#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PITC { - AT91_REG PITC_PIMR; // Period Interval Mode Register - AT91_REG PITC_PISR; // Period Interval Status Register - AT91_REG PITC_PIVR; // Period Interval Value Register - AT91_REG PITC_PIIR; // Period Interval Image Register -} AT91S_PITC, *AT91PS_PITC; -#else -#define PITC_PIMR (AT91_CAST(AT91_REG *) 0x00000000) // (PITC_PIMR) Period Interval Mode Register -#define PITC_PISR (AT91_CAST(AT91_REG *) 0x00000004) // (PITC_PISR) Period Interval Status Register -#define PITC_PIVR (AT91_CAST(AT91_REG *) 0x00000008) // (PITC_PIVR) Period Interval Value Register -#define PITC_PIIR (AT91_CAST(AT91_REG *) 0x0000000C) // (PITC_PIIR) Period Interval Image Register - -#endif -// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- -#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value -#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled -#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable -// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- -#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status -// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- -#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value -#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter -// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_WDTC { - AT91_REG WDTC_WDCR; // Watchdog Control Register - AT91_REG WDTC_WDMR; // Watchdog Mode Register - AT91_REG WDTC_WDSR; // Watchdog Status Register -} AT91S_WDTC, *AT91PS_WDTC; -#else -#define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register -#define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register -#define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register - -#endif -// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- -#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart -#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password -// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- -#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable -#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable -#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart -#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable -#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value -#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt -#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt -// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- -#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow -#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_VREG { - AT91_REG VREG_MR; // Voltage Regulator Mode Register -} AT91S_VREG, *AT91PS_VREG; -#else -#define VREG_MR (AT91_CAST(AT91_REG *) 0x00000000) // (VREG_MR) Voltage Regulator Mode Register - -#endif -// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- -#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Embedded Flash Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_EFC { - AT91_REG EFC_FMR; // MC Flash Mode Register - AT91_REG EFC_FCR; // MC Flash Command Register - AT91_REG EFC_FSR; // MC Flash Status Register - AT91_REG EFC_VR; // MC Flash Version Register -} AT91S_EFC, *AT91PS_EFC; -#else -#define MC_FMR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_FMR) MC Flash Mode Register -#define MC_FCR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_FCR) MC Flash Command Register -#define MC_FSR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_FSR) MC Flash Status Register -#define MC_VR (AT91_CAST(AT91_REG *) 0x0000000C) // (MC_VR) MC Flash Version Register - -#endif -// -------- MC_FMR : (EFC Offset: 0x0) MC Flash Mode Register -------- -#define AT91C_MC_FRDY (0x1 << 0) // (EFC) Flash Ready -#define AT91C_MC_LOCKE (0x1 << 2) // (EFC) Lock Error -#define AT91C_MC_PROGE (0x1 << 3) // (EFC) Programming Error -#define AT91C_MC_NEBP (0x1 << 7) // (EFC) No Erase Before Programming -#define AT91C_MC_FWS (0x3 << 8) // (EFC) Flash Wait State -#define AT91C_MC_FWS_0FWS (0x0 << 8) // (EFC) 1 cycle for Read, 2 for Write operations -#define AT91C_MC_FWS_1FWS (0x1 << 8) // (EFC) 2 cycles for Read, 3 for Write operations -#define AT91C_MC_FWS_2FWS (0x2 << 8) // (EFC) 3 cycles for Read, 4 for Write operations -#define AT91C_MC_FWS_3FWS (0x3 << 8) // (EFC) 4 cycles for Read, 4 for Write operations -#define AT91C_MC_FMCN (0xFF << 16) // (EFC) Flash Microsecond Cycle Number -// -------- MC_FCR : (EFC Offset: 0x4) MC Flash Command Register -------- -#define AT91C_MC_FCMD (0xF << 0) // (EFC) Flash Command -#define AT91C_MC_FCMD_START_PROG (0x1) // (EFC) Starts the programming of th epage specified by PAGEN. -#define AT91C_MC_FCMD_LOCK (0x2) // (EFC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (EFC) The lock sequence automatically happens after the programming sequence is completed. -#define AT91C_MC_FCMD_UNLOCK (0x4) // (EFC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. -#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (EFC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. -#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (EFC) Set General Purpose NVM bits. -#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (EFC) Clear General Purpose NVM bits. -#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (EFC) Set Security Bit. -#define AT91C_MC_PAGEN (0x3FF << 8) // (EFC) Page Number -#define AT91C_MC_KEY (0xFF << 24) // (EFC) Writing Protect Key -// -------- MC_FSR : (EFC Offset: 0x8) MC Flash Command Register -------- -#define AT91C_MC_SECURITY (0x1 << 4) // (EFC) Security Bit Status -#define AT91C_MC_GPNVM0 (0x1 << 8) // (EFC) Sector 0 Lock Status -#define AT91C_MC_GPNVM1 (0x1 << 9) // (EFC) Sector 1 Lock Status -#define AT91C_MC_GPNVM2 (0x1 << 10) // (EFC) Sector 2 Lock Status -#define AT91C_MC_GPNVM3 (0x1 << 11) // (EFC) Sector 3 Lock Status -#define AT91C_MC_GPNVM4 (0x1 << 12) // (EFC) Sector 4 Lock Status -#define AT91C_MC_GPNVM5 (0x1 << 13) // (EFC) Sector 5 Lock Status -#define AT91C_MC_GPNVM6 (0x1 << 14) // (EFC) Sector 6 Lock Status -#define AT91C_MC_GPNVM7 (0x1 << 15) // (EFC) Sector 7 Lock Status -#define AT91C_MC_LOCKS0 (0x1 << 16) // (EFC) Sector 0 Lock Status -#define AT91C_MC_LOCKS1 (0x1 << 17) // (EFC) Sector 1 Lock Status -#define AT91C_MC_LOCKS2 (0x1 << 18) // (EFC) Sector 2 Lock Status -#define AT91C_MC_LOCKS3 (0x1 << 19) // (EFC) Sector 3 Lock Status -#define AT91C_MC_LOCKS4 (0x1 << 20) // (EFC) Sector 4 Lock Status -#define AT91C_MC_LOCKS5 (0x1 << 21) // (EFC) Sector 5 Lock Status -#define AT91C_MC_LOCKS6 (0x1 << 22) // (EFC) Sector 6 Lock Status -#define AT91C_MC_LOCKS7 (0x1 << 23) // (EFC) Sector 7 Lock Status -#define AT91C_MC_LOCKS8 (0x1 << 24) // (EFC) Sector 8 Lock Status -#define AT91C_MC_LOCKS9 (0x1 << 25) // (EFC) Sector 9 Lock Status -#define AT91C_MC_LOCKS10 (0x1 << 26) // (EFC) Sector 10 Lock Status -#define AT91C_MC_LOCKS11 (0x1 << 27) // (EFC) Sector 11 Lock Status -#define AT91C_MC_LOCKS12 (0x1 << 28) // (EFC) Sector 12 Lock Status -#define AT91C_MC_LOCKS13 (0x1 << 29) // (EFC) Sector 13 Lock Status -#define AT91C_MC_LOCKS14 (0x1 << 30) // (EFC) Sector 14 Lock Status -#define AT91C_MC_LOCKS15 (0x1 << 31) // (EFC) Sector 15 Lock Status -// -------- EFC_VR : (EFC Offset: 0xc) EFC version register -------- -#define AT91C_EFC_VERSION (0xFFF << 0) // (EFC) EFC version number -#define AT91C_EFC_MFN (0x7 << 16) // (EFC) EFC MFN - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Memory Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_MC { - AT91_REG MC_RCR; // MC Remap Control Register - AT91_REG MC_ASR; // MC Abort Status Register - AT91_REG MC_AASR; // MC Abort Address Status Register - AT91_REG Reserved0[1]; // - AT91_REG MC_PUIA[16]; // MC Protection Unit Area - AT91_REG MC_PUP; // MC Protection Unit Peripherals - AT91_REG MC_PUER; // MC Protection Unit Enable Register - AT91_REG Reserved1[2]; // - AT91_REG MC0_FMR; // MC Flash Mode Register - AT91_REG MC0_FCR; // MC Flash Command Register - AT91_REG MC0_FSR; // MC Flash Status Register - AT91_REG MC0_VR; // MC Flash Version Register - AT91_REG MC1_FMR; // MC Flash Mode Register - AT91_REG MC1_FCR; // MC Flash Command Register - AT91_REG MC1_FSR; // MC Flash Status Register - AT91_REG MC1_VR; // MC Flash Version Register -} AT91S_MC, *AT91PS_MC; -#else -#define MC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (MC_RCR) MC Remap Control Register -#define MC_ASR (AT91_CAST(AT91_REG *) 0x00000004) // (MC_ASR) MC Abort Status Register -#define MC_AASR (AT91_CAST(AT91_REG *) 0x00000008) // (MC_AASR) MC Abort Address Status Register -#define MC_PUIA (AT91_CAST(AT91_REG *) 0x00000010) // (MC_PUIA) MC Protection Unit Area -#define MC_PUP (AT91_CAST(AT91_REG *) 0x00000050) // (MC_PUP) MC Protection Unit Peripherals -#define MC_PUER (AT91_CAST(AT91_REG *) 0x00000054) // (MC_PUER) MC Protection Unit Enable Register - -#endif -// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- -#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit -// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- -#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status -#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status -#define AT91C_MC_MPU (0x1 << 2) // (MC) Memory protection Unit Abort Status -#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status -#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte -#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word -#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word -#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status -#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read -#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write -#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch -#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source -#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source -#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source -#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source -// -------- MC_PUIA : (MC Offset: 0x10) MC Protection Unit Area -------- -#define AT91C_MC_PROT (0x3 << 0) // (MC) Protection -#define AT91C_MC_PROT_PNAUNA (0x0) // (MC) Privilege: No Access, User: No Access -#define AT91C_MC_PROT_PRWUNA (0x1) // (MC) Privilege: Read/Write, User: No Access -#define AT91C_MC_PROT_PRWURO (0x2) // (MC) Privilege: Read/Write, User: Read Only -#define AT91C_MC_PROT_PRWURW (0x3) // (MC) Privilege: Read/Write, User: Read/Write -#define AT91C_MC_SIZE (0xF << 4) // (MC) Internal Area Size -#define AT91C_MC_SIZE_1KB (0x0 << 4) // (MC) Area size 1KByte -#define AT91C_MC_SIZE_2KB (0x1 << 4) // (MC) Area size 2KByte -#define AT91C_MC_SIZE_4KB (0x2 << 4) // (MC) Area size 4KByte -#define AT91C_MC_SIZE_8KB (0x3 << 4) // (MC) Area size 8KByte -#define AT91C_MC_SIZE_16KB (0x4 << 4) // (MC) Area size 16KByte -#define AT91C_MC_SIZE_32KB (0x5 << 4) // (MC) Area size 32KByte -#define AT91C_MC_SIZE_64KB (0x6 << 4) // (MC) Area size 64KByte -#define AT91C_MC_SIZE_128KB (0x7 << 4) // (MC) Area size 128KByte -#define AT91C_MC_SIZE_256KB (0x8 << 4) // (MC) Area size 256KByte -#define AT91C_MC_SIZE_512KB (0x9 << 4) // (MC) Area size 512KByte -#define AT91C_MC_SIZE_1MB (0xA << 4) // (MC) Area size 1MByte -#define AT91C_MC_SIZE_2MB (0xB << 4) // (MC) Area size 2MByte -#define AT91C_MC_SIZE_4MB (0xC << 4) // (MC) Area size 4MByte -#define AT91C_MC_SIZE_8MB (0xD << 4) // (MC) Area size 8MByte -#define AT91C_MC_SIZE_16MB (0xE << 4) // (MC) Area size 16MByte -#define AT91C_MC_SIZE_64MB (0xF << 4) // (MC) Area size 64MByte -#define AT91C_MC_BA (0x3FFFF << 10) // (MC) Internal Area Base Address -// -------- MC_PUP : (MC Offset: 0x50) MC Protection Unit Peripheral -------- -// -------- MC_PUER : (MC Offset: 0x54) MC Protection Unit Area -------- -#define AT91C_MC_PUEB (0x1 << 0) // (MC) Protection Unit enable Bit - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Serial Parallel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SPI { - AT91_REG SPI_CR; // Control Register - AT91_REG SPI_MR; // Mode Register - AT91_REG SPI_RDR; // Receive Data Register - AT91_REG SPI_TDR; // Transmit Data Register - AT91_REG SPI_SR; // Status Register - AT91_REG SPI_IER; // Interrupt Enable Register - AT91_REG SPI_IDR; // Interrupt Disable Register - AT91_REG SPI_IMR; // Interrupt Mask Register - AT91_REG Reserved0[4]; // - AT91_REG SPI_CSR[4]; // Chip Select Register - AT91_REG Reserved1[48]; // - AT91_REG SPI_RPR; // Receive Pointer Register - AT91_REG SPI_RCR; // Receive Counter Register - AT91_REG SPI_TPR; // Transmit Pointer Register - AT91_REG SPI_TCR; // Transmit Counter Register - AT91_REG SPI_RNPR; // Receive Next Pointer Register - AT91_REG SPI_RNCR; // Receive Next Counter Register - AT91_REG SPI_TNPR; // Transmit Next Pointer Register - AT91_REG SPI_TNCR; // Transmit Next Counter Register - AT91_REG SPI_PTCR; // PDC Transfer Control Register - AT91_REG SPI_PTSR; // PDC Transfer Status Register -} AT91S_SPI, *AT91PS_SPI; -#else -#define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register -#define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register -#define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register -#define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register -#define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register -#define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register -#define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register -#define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register -#define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register - -#endif -// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- -#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable -#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable -#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset -#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer -// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- -#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode -#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select -#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select -#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select -#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode -#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection -#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection -#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection -#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select -#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects -// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- -#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data -#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- -#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data -#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status -// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- -#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full -#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty -#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error -#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status -#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer -#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer -#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt -#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt -#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt -#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt -#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status -// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- -// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- -// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- -// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- -#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity -#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase -#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer -#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer -#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer -#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer -#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer -#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer -#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer -#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer -#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer -#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer -#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer -#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate -#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK -#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Usart -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_USART { - AT91_REG US_CR; // Control Register - AT91_REG US_MR; // Mode Register - AT91_REG US_IER; // Interrupt Enable Register - AT91_REG US_IDR; // Interrupt Disable Register - AT91_REG US_IMR; // Interrupt Mask Register - AT91_REG US_CSR; // Channel Status Register - AT91_REG US_RHR; // Receiver Holding Register - AT91_REG US_THR; // Transmitter Holding Register - AT91_REG US_BRGR; // Baud Rate Generator Register - AT91_REG US_RTOR; // Receiver Time-out Register - AT91_REG US_TTGR; // Transmitter Time-guard Register - AT91_REG Reserved0[5]; // - AT91_REG US_FIDI; // FI_DI_Ratio Register - AT91_REG US_NER; // Nb Errors Register - AT91_REG Reserved1[1]; // - AT91_REG US_IF; // IRDA_FILTER Register - AT91_REG Reserved2[44]; // - AT91_REG US_RPR; // Receive Pointer Register - AT91_REG US_RCR; // Receive Counter Register - AT91_REG US_TPR; // Transmit Pointer Register - AT91_REG US_TCR; // Transmit Counter Register - AT91_REG US_RNPR; // Receive Next Pointer Register - AT91_REG US_RNCR; // Receive Next Counter Register - AT91_REG US_TNPR; // Transmit Next Pointer Register - AT91_REG US_TNCR; // Transmit Next Counter Register - AT91_REG US_PTCR; // PDC Transfer Control Register - AT91_REG US_PTSR; // PDC Transfer Status Register -} AT91S_USART, *AT91PS_USART; -#else -#define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register -#define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register -#define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register -#define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register -#define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register -#define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register -#define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register -#define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register -#define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register -#define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register -#define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register -#define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register -#define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register -#define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register - -#endif -// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- -#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break -#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break -#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out -#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address -#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations -#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge -#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out -#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable -#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable -#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable -#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable -// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- -#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode -#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal -#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 -#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking -#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem -#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 -#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 -#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA -#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking -#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock -#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 -#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) -#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) -#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock -#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits -#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits -#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits -#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits -#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select -#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits -#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit -#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits -#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits -#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order -#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length -#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select -#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode -#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge -#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK -#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions -#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter -// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- -#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break -#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out -#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached -#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge -#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag -#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag -#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag -#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag -// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- -// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- -// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- -#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input -#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input -#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input -#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_SSC { - AT91_REG SSC_CR; // Control Register - AT91_REG SSC_CMR; // Clock Mode Register - AT91_REG Reserved0[2]; // - AT91_REG SSC_RCMR; // Receive Clock ModeRegister - AT91_REG SSC_RFMR; // Receive Frame Mode Register - AT91_REG SSC_TCMR; // Transmit Clock Mode Register - AT91_REG SSC_TFMR; // Transmit Frame Mode Register - AT91_REG SSC_RHR; // Receive Holding Register - AT91_REG SSC_THR; // Transmit Holding Register - AT91_REG Reserved1[2]; // - AT91_REG SSC_RSHR; // Receive Sync Holding Register - AT91_REG SSC_TSHR; // Transmit Sync Holding Register - AT91_REG Reserved2[2]; // - AT91_REG SSC_SR; // Status Register - AT91_REG SSC_IER; // Interrupt Enable Register - AT91_REG SSC_IDR; // Interrupt Disable Register - AT91_REG SSC_IMR; // Interrupt Mask Register - AT91_REG Reserved3[44]; // - AT91_REG SSC_RPR; // Receive Pointer Register - AT91_REG SSC_RCR; // Receive Counter Register - AT91_REG SSC_TPR; // Transmit Pointer Register - AT91_REG SSC_TCR; // Transmit Counter Register - AT91_REG SSC_RNPR; // Receive Next Pointer Register - AT91_REG SSC_RNCR; // Receive Next Counter Register - AT91_REG SSC_TNPR; // Transmit Next Pointer Register - AT91_REG SSC_TNCR; // Transmit Next Counter Register - AT91_REG SSC_PTCR; // PDC Transfer Control Register - AT91_REG SSC_PTSR; // PDC Transfer Status Register -} AT91S_SSC, *AT91PS_SSC; -#else -#define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register -#define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register -#define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister -#define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register -#define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register -#define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register -#define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register -#define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register -#define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register -#define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register -#define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register -#define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register -#define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register -#define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register - -#endif -// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- -#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable -#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable -#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable -#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable -#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset -// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- -#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection -#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock -#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal -#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin -#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection -#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only -#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output -#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output -#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion -#define AT91C_SSC_CKG (0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection -#define AT91C_SSC_CKG_NONE (0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock -#define AT91C_SSC_CKG_LOW (0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low -#define AT91C_SSC_CKG_HIGH (0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High -#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection -#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. -#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start -#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input -#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input -#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input -#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input -#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input -#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input -#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 -#define AT91C_SSC_STOP (0x1 << 12) // (SSC) Receive Stop Selection -#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay -#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection -// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- -#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length -#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode -#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First -#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame -#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length -#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection -#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only -#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse -#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse -#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer -#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer -#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer -#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection -// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- -// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- -#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value -#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable -// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- -#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready -#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty -#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission -#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty -#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready -#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun -#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception -#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full -#define AT91C_SSC_CP0 (0x1 << 8) // (SSC) Compare 0 -#define AT91C_SSC_CP1 (0x1 << 9) // (SSC) Compare 1 -#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync -#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync -#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable -#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable -// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- -// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- -// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Two-wire Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TWI { - AT91_REG TWI_CR; // Control Register - AT91_REG TWI_MMR; // Master Mode Register - AT91_REG Reserved0[1]; // - AT91_REG TWI_IADR; // Internal Address Register - AT91_REG TWI_CWGR; // Clock Waveform Generator Register - AT91_REG Reserved1[3]; // - AT91_REG TWI_SR; // Status Register - AT91_REG TWI_IER; // Interrupt Enable Register - AT91_REG TWI_IDR; // Interrupt Disable Register - AT91_REG TWI_IMR; // Interrupt Mask Register - AT91_REG TWI_RHR; // Receive Holding Register - AT91_REG TWI_THR; // Transmit Holding Register - AT91_REG Reserved2[50]; // - AT91_REG TWI_RPR; // Receive Pointer Register - AT91_REG TWI_RCR; // Receive Counter Register - AT91_REG TWI_TPR; // Transmit Pointer Register - AT91_REG TWI_TCR; // Transmit Counter Register - AT91_REG TWI_RNPR; // Receive Next Pointer Register - AT91_REG TWI_RNCR; // Receive Next Counter Register - AT91_REG TWI_TNPR; // Transmit Next Pointer Register - AT91_REG TWI_TNCR; // Transmit Next Counter Register - AT91_REG TWI_PTCR; // PDC Transfer Control Register - AT91_REG TWI_PTSR; // PDC Transfer Status Register -} AT91S_TWI, *AT91PS_TWI; -#else -#define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register -#define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register -#define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register -#define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register -#define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register -#define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register -#define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register -#define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register -#define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register -#define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register - -#endif -// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- -#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition -#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition -#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled -#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled -#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset -// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- -#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size -#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address -#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address -#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address -#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address -#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction -#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address -// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- -#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider -#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider -#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider -// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- -#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed -#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY -#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY -#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error -#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error -#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged -#define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) -#define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) -#define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) -#define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) -// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- -// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- -// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR PWMC Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC_CH { - AT91_REG PWMC_CMR; // Channel Mode Register - AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register - AT91_REG PWMC_CPRDR; // Channel Period Register - AT91_REG PWMC_CCNTR; // Channel Counter Register - AT91_REG PWMC_CUPDR; // Channel Update Register - AT91_REG PWMC_Reserved[3]; // Reserved -} AT91S_PWMC_CH, *AT91PS_PWMC_CH; -#else -#define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register -#define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register -#define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CPRDR) Channel Period Register -#define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CCNTR) Channel Counter Register -#define PWMC_CUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CUPDR) Channel Update Register -#define Reserved (AT91_CAST(AT91_REG *) 0x00000014) // (Reserved) Reserved - -#endif -// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- -#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx -#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) -#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) -#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment -#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity -#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period -// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- -#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle -// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- -#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period -// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- -#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter -// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- -#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_PWMC { - AT91_REG PWMC_MR; // PWMC Mode Register - AT91_REG PWMC_ENA; // PWMC Enable Register - AT91_REG PWMC_DIS; // PWMC Disable Register - AT91_REG PWMC_SR; // PWMC Status Register - AT91_REG PWMC_IER; // PWMC Interrupt Enable Register - AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register - AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register - AT91_REG PWMC_ISR; // PWMC Interrupt Status Register - AT91_REG Reserved0[55]; // - AT91_REG PWMC_VR; // PWMC Version Register - AT91_REG Reserved1[64]; // - AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel -} AT91S_PWMC, *AT91PS_PWMC; -#else -#define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register -#define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register -#define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register -#define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register -#define PWMC_IER (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER) PWMC Interrupt Enable Register -#define PWMC_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR) PWMC Interrupt Disable Register -#define PWMC_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR) PWMC Interrupt Mask Register -#define PWMC_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR) PWMC Interrupt Status Register -#define PWMC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VR) PWMC Version Register - -#endif -// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- -#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. -#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A -#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) -#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. -#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B -#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) -// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- -#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 -#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 -#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 -#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 -// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- -// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- -// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- -// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- -// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- -// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR USB Device Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_UDP { - AT91_REG UDP_NUM; // Frame Number Register - AT91_REG UDP_GLBSTATE; // Global State Register - AT91_REG UDP_FADDR; // Function Address Register - AT91_REG Reserved0[1]; // - AT91_REG UDP_IER; // Interrupt Enable Register - AT91_REG UDP_IDR; // Interrupt Disable Register - AT91_REG UDP_IMR; // Interrupt Mask Register - AT91_REG UDP_ISR; // Interrupt Status Register - AT91_REG UDP_ICR; // Interrupt Clear Register - AT91_REG Reserved1[1]; // - AT91_REG UDP_RSTEP; // Reset Endpoint Register - AT91_REG Reserved2[1]; // - AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register - AT91_REG Reserved3[2]; // - AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register - AT91_REG Reserved4[3]; // - AT91_REG UDP_TXVC; // Transceiver Control Register -} AT91S_UDP, *AT91PS_UDP; -#else -#define UDP_FRM_NUM (AT91_CAST(AT91_REG *) 0x00000000) // (UDP_FRM_NUM) Frame Number Register -#define UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0x00000004) // (UDP_GLBSTATE) Global State Register -#define UDP_FADDR (AT91_CAST(AT91_REG *) 0x00000008) // (UDP_FADDR) Function Address Register -#define UDP_IER (AT91_CAST(AT91_REG *) 0x00000010) // (UDP_IER) Interrupt Enable Register -#define UDP_IDR (AT91_CAST(AT91_REG *) 0x00000014) // (UDP_IDR) Interrupt Disable Register -#define UDP_IMR (AT91_CAST(AT91_REG *) 0x00000018) // (UDP_IMR) Interrupt Mask Register -#define UDP_ISR (AT91_CAST(AT91_REG *) 0x0000001C) // (UDP_ISR) Interrupt Status Register -#define UDP_ICR (AT91_CAST(AT91_REG *) 0x00000020) // (UDP_ICR) Interrupt Clear Register -#define UDP_RSTEP (AT91_CAST(AT91_REG *) 0x00000028) // (UDP_RSTEP) Reset Endpoint Register -#define UDP_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (UDP_CSR) Endpoint Control and Status Register -#define UDP_FDR (AT91_CAST(AT91_REG *) 0x00000050) // (UDP_FDR) Endpoint FIFO Data Register -#define UDP_TXVC (AT91_CAST(AT91_REG *) 0x00000074) // (UDP_TXVC) Transceiver Control Register - -#endif -// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- -#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats -#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error -#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK -// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- -#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable -#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured -#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume -#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host -#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable -// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- -#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value -#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable -// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- -#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt -#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt -#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt -#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt -#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt -#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt -#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt -#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt -#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt -#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt -// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- -// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- -// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- -#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt -// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- -// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- -#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 -#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 -#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 -#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 -#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 -#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 -// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- -#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR -#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 -#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) -#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) -#define AT91C_UDP_STALLSENT (0x1 << 3) // (UDP) Stall sent (Control, bulk, interrupt endpoints) -#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready -#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). -#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). -#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction -#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type -#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control -#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT -#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT -#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT -#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN -#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN -#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN -#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle -#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable -#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO -// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- -#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TC { - AT91_REG TC_CCR; // Channel Control Register - AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) - AT91_REG Reserved0[2]; // - AT91_REG TC_CV; // Counter Value - AT91_REG TC_RA; // Register A - AT91_REG TC_RB; // Register B - AT91_REG TC_RC; // Register C - AT91_REG TC_SR; // Status Register - AT91_REG TC_IER; // Interrupt Enable Register - AT91_REG TC_IDR; // Interrupt Disable Register - AT91_REG TC_IMR; // Interrupt Mask Register -} AT91S_TC, *AT91PS_TC; -#else -#define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register -#define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) -#define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value -#define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A -#define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B -#define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C -#define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register -#define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register -#define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register -#define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register - -#endif -// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- -#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command -#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command -#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command -// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- -#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection -#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK -#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK -#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 -#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 -#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 -#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert -#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection -#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal -#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock -#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock -#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock -#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare -#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading -#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare -#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading -#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection -#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection -#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None -#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge -#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge -#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge -#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection -#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input -#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output -#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output -#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output -#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection -#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable -#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection -#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare -#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare -#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable -#define AT91C_TC_WAVE (0x1 << 15) // (TC) -#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA -#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none -#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set -#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear -#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle -#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection -#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None -#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA -#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA -#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none -#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set -#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear -#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle -#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection -#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None -#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA -#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA -#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA -#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA -#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none -#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set -#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear -#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle -#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA -#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none -#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set -#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear -#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle -#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB -#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none -#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set -#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear -#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle -#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB -#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none -#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set -#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear -#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle -#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB -#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none -#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set -#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear -#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle -#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB -#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none -#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set -#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear -#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle -// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- -#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow -#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun -#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare -#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare -#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare -#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading -#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading -#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger -#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling -#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror -#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror -// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- -// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- -// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Timer Counter Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_TCB { - AT91S_TC TCB_TC0; // TC Channel 0 - AT91_REG Reserved0[4]; // - AT91S_TC TCB_TC1; // TC Channel 1 - AT91_REG Reserved1[4]; // - AT91S_TC TCB_TC2; // TC Channel 2 - AT91_REG Reserved2[4]; // - AT91_REG TCB_BCR; // TC Block Control Register - AT91_REG TCB_BMR; // TC Block Mode Register -} AT91S_TCB, *AT91PS_TCB; -#else -#define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register -#define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register - -#endif -// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- -#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command -// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- -#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection -#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 -#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 -#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 -#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection -#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 -#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 -#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 -#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection -#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 -#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 -#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CAN_MB { - AT91_REG CAN_MB_MMR; // MailBox Mode Register - AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register - AT91_REG CAN_MB_MID; // MailBox ID Register - AT91_REG CAN_MB_MFID; // MailBox Family ID Register - AT91_REG CAN_MB_MSR; // MailBox Status Register - AT91_REG CAN_MB_MDL; // MailBox Data Low Register - AT91_REG CAN_MB_MDH; // MailBox Data High Register - AT91_REG CAN_MB_MCR; // MailBox Control Register -} AT91S_CAN_MB, *AT91PS_CAN_MB; -#else -#define CAN_MMR (AT91_CAST(AT91_REG *) 0x00000000) // (CAN_MMR) MailBox Mode Register -#define CAN_MAM (AT91_CAST(AT91_REG *) 0x00000004) // (CAN_MAM) MailBox Acceptance Mask Register -#define CAN_MID (AT91_CAST(AT91_REG *) 0x00000008) // (CAN_MID) MailBox ID Register -#define CAN_MFID (AT91_CAST(AT91_REG *) 0x0000000C) // (CAN_MFID) MailBox Family ID Register -#define CAN_MSR (AT91_CAST(AT91_REG *) 0x00000010) // (CAN_MSR) MailBox Status Register -#define CAN_MDL (AT91_CAST(AT91_REG *) 0x00000014) // (CAN_MDL) MailBox Data Low Register -#define CAN_MDH (AT91_CAST(AT91_REG *) 0x00000018) // (CAN_MDH) MailBox Data High Register -#define CAN_MCR (AT91_CAST(AT91_REG *) 0x0000001C) // (CAN_MCR) MailBox Control Register - -#endif -// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- -#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark -#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority -#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type -#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) -#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) -// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- -#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode -#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode -#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version -// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- -// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- -// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- -#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value -#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code -#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request -#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort -#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready -#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored -// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- -// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- -// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- -#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox -#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Control Area Network Interface -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_CAN { - AT91_REG CAN_MR; // Mode Register - AT91_REG CAN_IER; // Interrupt Enable Register - AT91_REG CAN_IDR; // Interrupt Disable Register - AT91_REG CAN_IMR; // Interrupt Mask Register - AT91_REG CAN_SR; // Status Register - AT91_REG CAN_BR; // Baudrate Register - AT91_REG CAN_TIM; // Timer Register - AT91_REG CAN_TIMESTP; // Time Stamp Register - AT91_REG CAN_ECR; // Error Counter Register - AT91_REG CAN_TCR; // Transfer Command Register - AT91_REG CAN_ACR; // Abort Command Register - AT91_REG Reserved0[52]; // - AT91_REG CAN_VR; // Version Register - AT91_REG Reserved1[64]; // - AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 - AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 - AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 - AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 - AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 - AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 - AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 - AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 - AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 - AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 - AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 - AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 - AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 - AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 - AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 - AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 -} AT91S_CAN, *AT91PS_CAN; -#else -#define CAN_MR (AT91_CAST(AT91_REG *) 0x00000000) // (CAN_MR) Mode Register -#define CAN_IER (AT91_CAST(AT91_REG *) 0x00000004) // (CAN_IER) Interrupt Enable Register -#define CAN_IDR (AT91_CAST(AT91_REG *) 0x00000008) // (CAN_IDR) Interrupt Disable Register -#define CAN_IMR (AT91_CAST(AT91_REG *) 0x0000000C) // (CAN_IMR) Interrupt Mask Register -#define CAN_SR (AT91_CAST(AT91_REG *) 0x00000010) // (CAN_SR) Status Register -#define CAN_BR (AT91_CAST(AT91_REG *) 0x00000014) // (CAN_BR) Baudrate Register -#define CAN_TIM (AT91_CAST(AT91_REG *) 0x00000018) // (CAN_TIM) Timer Register -#define CAN_TIMESTP (AT91_CAST(AT91_REG *) 0x0000001C) // (CAN_TIMESTP) Time Stamp Register -#define CAN_ECR (AT91_CAST(AT91_REG *) 0x00000020) // (CAN_ECR) Error Counter Register -#define CAN_TCR (AT91_CAST(AT91_REG *) 0x00000024) // (CAN_TCR) Transfer Command Register -#define CAN_ACR (AT91_CAST(AT91_REG *) 0x00000028) // (CAN_ACR) Abort Command Register -#define CAN_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (CAN_VR) Version Register - -#endif -// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- -#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable -#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode -#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode -#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame -#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame -#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode -#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze -#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat -// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- -#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag -#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag -#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag -#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag -#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag -#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag -#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag -#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag -#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag -#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag -#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag -#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag -#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag -#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag -#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag -#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag -#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag -#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag -#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag -#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag -#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag -#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag -#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag -#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag -#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error -#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error -#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error -#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error -#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error -// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- -// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- -// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- -#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy -#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy -#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy -// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- -#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment -#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment -#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment -#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment -#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler -#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode -// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- -#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field -// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- -// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- -#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter -#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter -// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- -#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field -// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_EMAC { - AT91_REG EMAC_NCR; // Network Control Register - AT91_REG EMAC_NCFGR; // Network Configuration Register - AT91_REG EMAC_NSR; // Network Status Register - AT91_REG Reserved0[2]; // - AT91_REG EMAC_TSR; // Transmit Status Register - AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer - AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer - AT91_REG EMAC_RSR; // Receive Status Register - AT91_REG EMAC_ISR; // Interrupt Status Register - AT91_REG EMAC_IER; // Interrupt Enable Register - AT91_REG EMAC_IDR; // Interrupt Disable Register - AT91_REG EMAC_IMR; // Interrupt Mask Register - AT91_REG EMAC_MAN; // PHY Maintenance Register - AT91_REG EMAC_PTR; // Pause Time Register - AT91_REG EMAC_PFR; // Pause Frames received Register - AT91_REG EMAC_FTO; // Frames Transmitted OK Register - AT91_REG EMAC_SCF; // Single Collision Frame Register - AT91_REG EMAC_MCF; // Multiple Collision Frame Register - AT91_REG EMAC_FRO; // Frames Received OK Register - AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register - AT91_REG EMAC_ALE; // Alignment Error Register - AT91_REG EMAC_DTF; // Deferred Transmission Frame Register - AT91_REG EMAC_LCOL; // Late Collision Register - AT91_REG EMAC_ECOL; // Excessive Collision Register - AT91_REG EMAC_TUND; // Transmit Underrun Error Register - AT91_REG EMAC_CSE; // Carrier Sense Error Register - AT91_REG EMAC_RRE; // Receive Ressource Error Register - AT91_REG EMAC_ROV; // Receive Overrun Errors Register - AT91_REG EMAC_RSE; // Receive Symbol Errors Register - AT91_REG EMAC_ELE; // Excessive Length Errors Register - AT91_REG EMAC_RJA; // Receive Jabbers Register - AT91_REG EMAC_USF; // Undersize Frames Register - AT91_REG EMAC_STE; // SQE Test Error Register - AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register - AT91_REG EMAC_TPF; // Transmitted Pause Frames Register - AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] - AT91_REG EMAC_HRT; // Hash Address Top[63:32] - AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes - AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes - AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes - AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes - AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes - AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes - AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes - AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes - AT91_REG EMAC_TID; // Type ID Checking Register - AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register - AT91_REG EMAC_USRIO; // USER Input/Output Register - AT91_REG EMAC_WOL; // Wake On LAN Register - AT91_REG Reserved1[13]; // - AT91_REG EMAC_REV; // Revision Register -} AT91S_EMAC, *AT91PS_EMAC; -#else -#define EMAC_NCR (AT91_CAST(AT91_REG *) 0x00000000) // (EMAC_NCR) Network Control Register -#define EMAC_NCFGR (AT91_CAST(AT91_REG *) 0x00000004) // (EMAC_NCFGR) Network Configuration Register -#define EMAC_NSR (AT91_CAST(AT91_REG *) 0x00000008) // (EMAC_NSR) Network Status Register -#define EMAC_TSR (AT91_CAST(AT91_REG *) 0x00000014) // (EMAC_TSR) Transmit Status Register -#define EMAC_RBQP (AT91_CAST(AT91_REG *) 0x00000018) // (EMAC_RBQP) Receive Buffer Queue Pointer -#define EMAC_TBQP (AT91_CAST(AT91_REG *) 0x0000001C) // (EMAC_TBQP) Transmit Buffer Queue Pointer -#define EMAC_RSR (AT91_CAST(AT91_REG *) 0x00000020) // (EMAC_RSR) Receive Status Register -#define EMAC_ISR (AT91_CAST(AT91_REG *) 0x00000024) // (EMAC_ISR) Interrupt Status Register -#define EMAC_IER (AT91_CAST(AT91_REG *) 0x00000028) // (EMAC_IER) Interrupt Enable Register -#define EMAC_IDR (AT91_CAST(AT91_REG *) 0x0000002C) // (EMAC_IDR) Interrupt Disable Register -#define EMAC_IMR (AT91_CAST(AT91_REG *) 0x00000030) // (EMAC_IMR) Interrupt Mask Register -#define EMAC_MAN (AT91_CAST(AT91_REG *) 0x00000034) // (EMAC_MAN) PHY Maintenance Register -#define EMAC_PTR (AT91_CAST(AT91_REG *) 0x00000038) // (EMAC_PTR) Pause Time Register -#define EMAC_PFR (AT91_CAST(AT91_REG *) 0x0000003C) // (EMAC_PFR) Pause Frames received Register -#define EMAC_FTO (AT91_CAST(AT91_REG *) 0x00000040) // (EMAC_FTO) Frames Transmitted OK Register -#define EMAC_SCF (AT91_CAST(AT91_REG *) 0x00000044) // (EMAC_SCF) Single Collision Frame Register -#define EMAC_MCF (AT91_CAST(AT91_REG *) 0x00000048) // (EMAC_MCF) Multiple Collision Frame Register -#define EMAC_FRO (AT91_CAST(AT91_REG *) 0x0000004C) // (EMAC_FRO) Frames Received OK Register -#define EMAC_FCSE (AT91_CAST(AT91_REG *) 0x00000050) // (EMAC_FCSE) Frame Check Sequence Error Register -#define EMAC_ALE (AT91_CAST(AT91_REG *) 0x00000054) // (EMAC_ALE) Alignment Error Register -#define EMAC_DTF (AT91_CAST(AT91_REG *) 0x00000058) // (EMAC_DTF) Deferred Transmission Frame Register -#define EMAC_LCOL (AT91_CAST(AT91_REG *) 0x0000005C) // (EMAC_LCOL) Late Collision Register -#define EMAC_ECOL (AT91_CAST(AT91_REG *) 0x00000060) // (EMAC_ECOL) Excessive Collision Register -#define EMAC_TUND (AT91_CAST(AT91_REG *) 0x00000064) // (EMAC_TUND) Transmit Underrun Error Register -#define EMAC_CSE (AT91_CAST(AT91_REG *) 0x00000068) // (EMAC_CSE) Carrier Sense Error Register -#define EMAC_RRE (AT91_CAST(AT91_REG *) 0x0000006C) // (EMAC_RRE) Receive Ressource Error Register -#define EMAC_ROV (AT91_CAST(AT91_REG *) 0x00000070) // (EMAC_ROV) Receive Overrun Errors Register -#define EMAC_RSE (AT91_CAST(AT91_REG *) 0x00000074) // (EMAC_RSE) Receive Symbol Errors Register -#define EMAC_ELE (AT91_CAST(AT91_REG *) 0x00000078) // (EMAC_ELE) Excessive Length Errors Register -#define EMAC_RJA (AT91_CAST(AT91_REG *) 0x0000007C) // (EMAC_RJA) Receive Jabbers Register -#define EMAC_USF (AT91_CAST(AT91_REG *) 0x00000080) // (EMAC_USF) Undersize Frames Register -#define EMAC_STE (AT91_CAST(AT91_REG *) 0x00000084) // (EMAC_STE) SQE Test Error Register -#define EMAC_RLE (AT91_CAST(AT91_REG *) 0x00000088) // (EMAC_RLE) Receive Length Field Mismatch Register -#define EMAC_TPF (AT91_CAST(AT91_REG *) 0x0000008C) // (EMAC_TPF) Transmitted Pause Frames Register -#define EMAC_HRB (AT91_CAST(AT91_REG *) 0x00000090) // (EMAC_HRB) Hash Address Bottom[31:0] -#define EMAC_HRT (AT91_CAST(AT91_REG *) 0x00000094) // (EMAC_HRT) Hash Address Top[63:32] -#define EMAC_SA1L (AT91_CAST(AT91_REG *) 0x00000098) // (EMAC_SA1L) Specific Address 1 Bottom, First 4 bytes -#define EMAC_SA1H (AT91_CAST(AT91_REG *) 0x0000009C) // (EMAC_SA1H) Specific Address 1 Top, Last 2 bytes -#define EMAC_SA2L (AT91_CAST(AT91_REG *) 0x000000A0) // (EMAC_SA2L) Specific Address 2 Bottom, First 4 bytes -#define EMAC_SA2H (AT91_CAST(AT91_REG *) 0x000000A4) // (EMAC_SA2H) Specific Address 2 Top, Last 2 bytes -#define EMAC_SA3L (AT91_CAST(AT91_REG *) 0x000000A8) // (EMAC_SA3L) Specific Address 3 Bottom, First 4 bytes -#define EMAC_SA3H (AT91_CAST(AT91_REG *) 0x000000AC) // (EMAC_SA3H) Specific Address 3 Top, Last 2 bytes -#define EMAC_SA4L (AT91_CAST(AT91_REG *) 0x000000B0) // (EMAC_SA4L) Specific Address 4 Bottom, First 4 bytes -#define EMAC_SA4H (AT91_CAST(AT91_REG *) 0x000000B4) // (EMAC_SA4H) Specific Address 4 Top, Last 2 bytes -#define EMAC_TID (AT91_CAST(AT91_REG *) 0x000000B8) // (EMAC_TID) Type ID Checking Register -#define EMAC_TPQ (AT91_CAST(AT91_REG *) 0x000000BC) // (EMAC_TPQ) Transmit Pause Quantum Register -#define EMAC_USRIO (AT91_CAST(AT91_REG *) 0x000000C0) // (EMAC_USRIO) USER Input/Output Register -#define EMAC_WOL (AT91_CAST(AT91_REG *) 0x000000C4) // (EMAC_WOL) Wake On LAN Register -#define EMAC_REV (AT91_CAST(AT91_REG *) 0x000000FC) // (EMAC_REV) Revision Register - -#endif -// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- -#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. -#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. -#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. -#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. -#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. -#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. -#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. -#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. -#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. -#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. -#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. -#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame -#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame -// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- -#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. -#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. -#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. -#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. -#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. -#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable -#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. -#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. -#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. -#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) -#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 -#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 -#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 -#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 -#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) -#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) -#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) -#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer -#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer -#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable -#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS -#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) -#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS -// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- -#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) -#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) -#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) -// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- -#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) -#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) -#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) -#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go -#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame -#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) -#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) -// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- -#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) -#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) -#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) -// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- -#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) -#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) -#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) -#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) -#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) -#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) -#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) -#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) -#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) -#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) -#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) -#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) -#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) -// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- -// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- -// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- -// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- -#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) -#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) -#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) -#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) -#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) -#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) -// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- -#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII -#define AT91C_EMAC_CLKEN (0x1 << 1) // (EMAC) Clock Enable -// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- -#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address -#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable -#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable -#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable -// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- -#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) -#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) - -// ***************************************************************************** -// SOFTWARE API DEFINITION FOR Analog to Digital Convertor -// ***************************************************************************** -#ifndef __ASSEMBLY__ -typedef struct _AT91S_ADC { - AT91_REG ADC_CR; // ADC Control Register - AT91_REG ADC_MR; // ADC Mode Register - AT91_REG Reserved0[2]; // - AT91_REG ADC_CHER; // ADC Channel Enable Register - AT91_REG ADC_CHDR; // ADC Channel Disable Register - AT91_REG ADC_CHSR; // ADC Channel Status Register - AT91_REG ADC_SR; // ADC Status Register - AT91_REG ADC_LCDR; // ADC Last Converted Data Register - AT91_REG ADC_IER; // ADC Interrupt Enable Register - AT91_REG ADC_IDR; // ADC Interrupt Disable Register - AT91_REG ADC_IMR; // ADC Interrupt Mask Register - AT91_REG ADC_CDR0; // ADC Channel Data Register 0 - AT91_REG ADC_CDR1; // ADC Channel Data Register 1 - AT91_REG ADC_CDR2; // ADC Channel Data Register 2 - AT91_REG ADC_CDR3; // ADC Channel Data Register 3 - AT91_REG ADC_CDR4; // ADC Channel Data Register 4 - AT91_REG ADC_CDR5; // ADC Channel Data Register 5 - AT91_REG ADC_CDR6; // ADC Channel Data Register 6 - AT91_REG ADC_CDR7; // ADC Channel Data Register 7 - AT91_REG Reserved1[44]; // - AT91_REG ADC_RPR; // Receive Pointer Register - AT91_REG ADC_RCR; // Receive Counter Register - AT91_REG ADC_TPR; // Transmit Pointer Register - AT91_REG ADC_TCR; // Transmit Counter Register - AT91_REG ADC_RNPR; // Receive Next Pointer Register - AT91_REG ADC_RNCR; // Receive Next Counter Register - AT91_REG ADC_TNPR; // Transmit Next Pointer Register - AT91_REG ADC_TNCR; // Transmit Next Counter Register - AT91_REG ADC_PTCR; // PDC Transfer Control Register - AT91_REG ADC_PTSR; // PDC Transfer Status Register -} AT91S_ADC, *AT91PS_ADC; -#else -#define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register -#define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register -#define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register -#define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register -#define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register -#define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register -#define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register -#define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register -#define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register -#define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register -#define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 -#define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 -#define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 -#define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 -#define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 -#define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 -#define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 -#define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 - -#endif -// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- -#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset -#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion -// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- -#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable -#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software -#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. -#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection -#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 -#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 -#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 -#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 -#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 -#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 -#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger -#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. -#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution -#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution -#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode -#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode -#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection -#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time -#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time -// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- -#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 -#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 -#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 -#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 -#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 -#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 -#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 -#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 -// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- -// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- -// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- -#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion -#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion -#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion -#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion -#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion -#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion -#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion -#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion -#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error -#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error -#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error -#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error -#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error -#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error -#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error -#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error -#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready -#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun -#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer -#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt -// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- -#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted -// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- -// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- -// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- -// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- -#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data -// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- -// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- -// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- -// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- -// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- -// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- -// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- - -// ***************************************************************************** -// REGISTER ADDRESS DEFINITION FOR AT91SAM7X512 -// ***************************************************************************** -// ========== Register definition for SYS peripheral ========== -// ========== Register definition for AIC peripheral ========== -#define AT91C_AIC_IVR (AT91_CAST(AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register -#define AT91C_AIC_SMR (AT91_CAST(AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register -#define AT91C_AIC_FVR (AT91_CAST(AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register -#define AT91C_AIC_DCR (AT91_CAST(AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) -#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register -#define AT91C_AIC_SVR (AT91_CAST(AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register -#define AT91C_AIC_FFSR (AT91_CAST(AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register -#define AT91C_AIC_ICCR (AT91_CAST(AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register -#define AT91C_AIC_ISR (AT91_CAST(AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register -#define AT91C_AIC_IMR (AT91_CAST(AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register -#define AT91C_AIC_IPR (AT91_CAST(AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register -#define AT91C_AIC_FFER (AT91_CAST(AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register -#define AT91C_AIC_IECR (AT91_CAST(AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register -#define AT91C_AIC_ISCR (AT91_CAST(AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register -#define AT91C_AIC_FFDR (AT91_CAST(AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register -#define AT91C_AIC_CISR (AT91_CAST(AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register -#define AT91C_AIC_IDCR (AT91_CAST(AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register -#define AT91C_AIC_SPU (AT91_CAST(AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register -// ========== Register definition for PDC_DBGU peripheral ========== -#define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register -#define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register -#define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register -#define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register -#define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register -#define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register -#define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register -#define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register -#define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register -#define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register -// ========== Register definition for DBGU peripheral ========== -#define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register -#define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register -#define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register -#define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register -#define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register -#define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register -#define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register -#define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0xFFFFF200) // (DBGU) Control Register -#define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register -#define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register -#define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register -#define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register -// ========== Register definition for PIOA peripheral ========== -#define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr -#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register -#define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register -#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register -#define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register -#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register -#define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register -#define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register -#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register -#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register -#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register -#define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register -#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register -#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register -#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register -#define AT91C_PIOA_BSR (AT91_CAST(AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register -#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register -#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register -#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register -#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register -#define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register -#define AT91C_PIOA_ASR (AT91_CAST(AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register -#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register -#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register -#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register -#define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register -#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register -#define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register -#define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register -// ========== Register definition for PIOB peripheral ========== -#define AT91C_PIOB_OWDR (AT91_CAST(AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register -#define AT91C_PIOB_MDER (AT91_CAST(AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register -#define AT91C_PIOB_PPUSR (AT91_CAST(AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register -#define AT91C_PIOB_IMR (AT91_CAST(AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register -#define AT91C_PIOB_ASR (AT91_CAST(AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register -#define AT91C_PIOB_PPUDR (AT91_CAST(AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register -#define AT91C_PIOB_PSR (AT91_CAST(AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register -#define AT91C_PIOB_IER (AT91_CAST(AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register -#define AT91C_PIOB_CODR (AT91_CAST(AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register -#define AT91C_PIOB_OWER (AT91_CAST(AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register -#define AT91C_PIOB_ABSR (AT91_CAST(AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register -#define AT91C_PIOB_IFDR (AT91_CAST(AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register -#define AT91C_PIOB_PDSR (AT91_CAST(AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register -#define AT91C_PIOB_IDR (AT91_CAST(AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register -#define AT91C_PIOB_OWSR (AT91_CAST(AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register -#define AT91C_PIOB_PDR (AT91_CAST(AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register -#define AT91C_PIOB_ODR (AT91_CAST(AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr -#define AT91C_PIOB_IFSR (AT91_CAST(AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register -#define AT91C_PIOB_PPUER (AT91_CAST(AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register -#define AT91C_PIOB_SODR (AT91_CAST(AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register -#define AT91C_PIOB_ISR (AT91_CAST(AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register -#define AT91C_PIOB_ODSR (AT91_CAST(AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register -#define AT91C_PIOB_OSR (AT91_CAST(AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register -#define AT91C_PIOB_MDSR (AT91_CAST(AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register -#define AT91C_PIOB_IFER (AT91_CAST(AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register -#define AT91C_PIOB_BSR (AT91_CAST(AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register -#define AT91C_PIOB_MDDR (AT91_CAST(AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register -#define AT91C_PIOB_OER (AT91_CAST(AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register -#define AT91C_PIOB_PER (AT91_CAST(AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register -// ========== Register definition for CKGR peripheral ========== -#define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register -#define AT91C_CKGR_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register -#define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register -// ========== Register definition for PMC peripheral ========== -#define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register -#define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register -#define AT91C_PMC_PLLR (AT91_CAST(AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register -#define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register -#define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register -#define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register -#define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register -#define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register -#define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register -#define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register -#define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register -#define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register -#define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register -#define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register -#define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0xFFFFFC68) // (PMC) Status Register -// ========== Register definition for RSTC peripheral ========== -#define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register -#define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register -#define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register -// ========== Register definition for RTTC peripheral ========== -#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register -#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register -#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register -#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register -// ========== Register definition for PITC peripheral ========== -#define AT91C_PITC_PIVR (AT91_CAST(AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register -#define AT91C_PITC_PISR (AT91_CAST(AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register -#define AT91C_PITC_PIIR (AT91_CAST(AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register -#define AT91C_PITC_PIMR (AT91_CAST(AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register -// ========== Register definition for WDTC peripheral ========== -#define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register -#define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register -#define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register -// ========== Register definition for VREG peripheral ========== -#define AT91C_VREG_MR (AT91_CAST(AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register -// ========== Register definition for EFC0 peripheral ========== -#define AT91C_EFC0_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF64) // (EFC0) MC Flash Command Register -#define AT91C_EFC0_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF68) // (EFC0) MC Flash Status Register -#define AT91C_EFC0_VR (AT91_CAST(AT91_REG *) 0xFFFFFF6C) // (EFC0) MC Flash Version Register -#define AT91C_EFC0_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF60) // (EFC0) MC Flash Mode Register -// ========== Register definition for EFC1 peripheral ========== -#define AT91C_EFC1_VR (AT91_CAST(AT91_REG *) 0xFFFFFF7C) // (EFC1) MC Flash Version Register -#define AT91C_EFC1_FCR (AT91_CAST(AT91_REG *) 0xFFFFFF74) // (EFC1) MC Flash Command Register -#define AT91C_EFC1_FSR (AT91_CAST(AT91_REG *) 0xFFFFFF78) // (EFC1) MC Flash Status Register -#define AT91C_EFC1_FMR (AT91_CAST(AT91_REG *) 0xFFFFFF70) // (EFC1) MC Flash Mode Register -// ========== Register definition for MC peripheral ========== -#define AT91C_MC_ASR (AT91_CAST(AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register -#define AT91C_MC_RCR (AT91_CAST(AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register -#define AT91C_MC_PUP (AT91_CAST(AT91_REG *) 0xFFFFFF50) // (MC) MC Protection Unit Peripherals -#define AT91C_MC_PUIA (AT91_CAST(AT91_REG *) 0xFFFFFF10) // (MC) MC Protection Unit Area -#define AT91C_MC_AASR (AT91_CAST(AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register -#define AT91C_MC_PUER (AT91_CAST(AT91_REG *) 0xFFFFFF54) // (MC) MC Protection Unit Enable Register -// ========== Register definition for PDC_SPI1 peripheral ========== -#define AT91C_SPI1_PTCR (AT91_CAST(AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register -#define AT91C_SPI1_RPR (AT91_CAST(AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register -#define AT91C_SPI1_TNCR (AT91_CAST(AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register -#define AT91C_SPI1_TPR (AT91_CAST(AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register -#define AT91C_SPI1_TNPR (AT91_CAST(AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register -#define AT91C_SPI1_TCR (AT91_CAST(AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register -#define AT91C_SPI1_RCR (AT91_CAST(AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register -#define AT91C_SPI1_RNPR (AT91_CAST(AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register -#define AT91C_SPI1_RNCR (AT91_CAST(AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register -#define AT91C_SPI1_PTSR (AT91_CAST(AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register -// ========== Register definition for SPI1 peripheral ========== -#define AT91C_SPI1_IMR (AT91_CAST(AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register -#define AT91C_SPI1_IER (AT91_CAST(AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register -#define AT91C_SPI1_MR (AT91_CAST(AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register -#define AT91C_SPI1_RDR (AT91_CAST(AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register -#define AT91C_SPI1_IDR (AT91_CAST(AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register -#define AT91C_SPI1_SR (AT91_CAST(AT91_REG *) 0xFFFE4010) // (SPI1) Status Register -#define AT91C_SPI1_TDR (AT91_CAST(AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register -#define AT91C_SPI1_CR (AT91_CAST(AT91_REG *) 0xFFFE4000) // (SPI1) Control Register -#define AT91C_SPI1_CSR (AT91_CAST(AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register -// ========== Register definition for PDC_SPI0 peripheral ========== -#define AT91C_SPI0_PTCR (AT91_CAST(AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register -#define AT91C_SPI0_TPR (AT91_CAST(AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register -#define AT91C_SPI0_TCR (AT91_CAST(AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register -#define AT91C_SPI0_RCR (AT91_CAST(AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register -#define AT91C_SPI0_PTSR (AT91_CAST(AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register -#define AT91C_SPI0_RNPR (AT91_CAST(AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register -#define AT91C_SPI0_RPR (AT91_CAST(AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register -#define AT91C_SPI0_TNCR (AT91_CAST(AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register -#define AT91C_SPI0_RNCR (AT91_CAST(AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register -#define AT91C_SPI0_TNPR (AT91_CAST(AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register -// ========== Register definition for SPI0 peripheral ========== -#define AT91C_SPI0_IER (AT91_CAST(AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register -#define AT91C_SPI0_SR (AT91_CAST(AT91_REG *) 0xFFFE0010) // (SPI0) Status Register -#define AT91C_SPI0_IDR (AT91_CAST(AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register -#define AT91C_SPI0_CR (AT91_CAST(AT91_REG *) 0xFFFE0000) // (SPI0) Control Register -#define AT91C_SPI0_MR (AT91_CAST(AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register -#define AT91C_SPI0_IMR (AT91_CAST(AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register -#define AT91C_SPI0_TDR (AT91_CAST(AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register -#define AT91C_SPI0_RDR (AT91_CAST(AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register -#define AT91C_SPI0_CSR (AT91_CAST(AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register -// ========== Register definition for PDC_US1 peripheral ========== -#define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register -#define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register -#define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register -#define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register -#define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register -#define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register -#define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register -#define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register -#define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register -#define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register -// ========== Register definition for US1 peripheral ========== -#define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register -#define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register -#define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register -#define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register -#define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register -#define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register -#define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register -#define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register -#define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register -#define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register -#define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register -#define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register -#define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0xFFFC4000) // (US1) Control Register -#define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0xFFFC4004) // (US1) Mode Register -// ========== Register definition for PDC_US0 peripheral ========== -#define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register -#define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register -#define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register -#define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register -#define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register -#define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register -#define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register -#define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register -#define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register -#define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register -// ========== Register definition for US0 peripheral ========== -#define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register -#define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register -#define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0xFFFC0000) // (US0) Control Register -#define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register -#define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register -#define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register -#define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0xFFFC0004) // (US0) Mode Register -#define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register -#define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register -#define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register -#define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register -#define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register -#define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register -#define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register -// ========== Register definition for PDC_SSC peripheral ========== -#define AT91C_SSC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register -#define AT91C_SSC_RPR (AT91_CAST(AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register -#define AT91C_SSC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register -#define AT91C_SSC_TPR (AT91_CAST(AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register -#define AT91C_SSC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register -#define AT91C_SSC_TCR (AT91_CAST(AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register -#define AT91C_SSC_RCR (AT91_CAST(AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register -#define AT91C_SSC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register -#define AT91C_SSC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register -#define AT91C_SSC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register -// ========== Register definition for SSC peripheral ========== -#define AT91C_SSC_RHR (AT91_CAST(AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register -#define AT91C_SSC_RSHR (AT91_CAST(AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register -#define AT91C_SSC_TFMR (AT91_CAST(AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register -#define AT91C_SSC_IDR (AT91_CAST(AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register -#define AT91C_SSC_THR (AT91_CAST(AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register -#define AT91C_SSC_RCMR (AT91_CAST(AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister -#define AT91C_SSC_IER (AT91_CAST(AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register -#define AT91C_SSC_TSHR (AT91_CAST(AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register -#define AT91C_SSC_SR (AT91_CAST(AT91_REG *) 0xFFFD4040) // (SSC) Status Register -#define AT91C_SSC_CMR (AT91_CAST(AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register -#define AT91C_SSC_TCMR (AT91_CAST(AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register -#define AT91C_SSC_CR (AT91_CAST(AT91_REG *) 0xFFFD4000) // (SSC) Control Register -#define AT91C_SSC_IMR (AT91_CAST(AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register -#define AT91C_SSC_RFMR (AT91_CAST(AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register -// ========== Register definition for TWI peripheral ========== -#define AT91C_TWI_IER (AT91_CAST(AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register -#define AT91C_TWI_CR (AT91_CAST(AT91_REG *) 0xFFFB8000) // (TWI) Control Register -#define AT91C_TWI_SR (AT91_CAST(AT91_REG *) 0xFFFB8020) // (TWI) Status Register -#define AT91C_TWI_IMR (AT91_CAST(AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register -#define AT91C_TWI_THR (AT91_CAST(AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register -#define AT91C_TWI_IDR (AT91_CAST(AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register -#define AT91C_TWI_IADR (AT91_CAST(AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register -#define AT91C_TWI_MMR (AT91_CAST(AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register -#define AT91C_TWI_CWGR (AT91_CAST(AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register -#define AT91C_TWI_RHR (AT91_CAST(AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register -// ========== Register definition for PWMC_CH3 peripheral ========== -#define AT91C_PWMC_CH3_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register -#define AT91C_PWMC_CH3_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved -#define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register -#define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register -#define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register -#define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register -// ========== Register definition for PWMC_CH2 peripheral ========== -#define AT91C_PWMC_CH2_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved -#define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register -#define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register -#define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register -#define AT91C_PWMC_CH2_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register -#define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register -// ========== Register definition for PWMC_CH1 peripheral ========== -#define AT91C_PWMC_CH1_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved -#define AT91C_PWMC_CH1_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register -#define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register -#define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register -#define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register -#define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register -// ========== Register definition for PWMC_CH0 peripheral ========== -#define AT91C_PWMC_CH0_Reserved (AT91_CAST(AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved -#define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register -#define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register -#define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register -#define AT91C_PWMC_CH0_CUPDR (AT91_CAST(AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register -#define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register -// ========== Register definition for PWMC peripheral ========== -#define AT91C_PWMC_IDR (AT91_CAST(AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register -#define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register -#define AT91C_PWMC_IER (AT91_CAST(AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register -#define AT91C_PWMC_VR (AT91_CAST(AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register -#define AT91C_PWMC_ISR (AT91_CAST(AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register -#define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register -#define AT91C_PWMC_IMR (AT91_CAST(AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register -#define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register -#define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register -// ========== Register definition for UDP peripheral ========== -#define AT91C_UDP_IMR (AT91_CAST(AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register -#define AT91C_UDP_FADDR (AT91_CAST(AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register -#define AT91C_UDP_NUM (AT91_CAST(AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register -#define AT91C_UDP_FDR (AT91_CAST(AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register -#define AT91C_UDP_ISR (AT91_CAST(AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register -#define AT91C_UDP_CSR (AT91_CAST(AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register -#define AT91C_UDP_IDR (AT91_CAST(AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register -#define AT91C_UDP_ICR (AT91_CAST(AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register -#define AT91C_UDP_RSTEP (AT91_CAST(AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register -#define AT91C_UDP_TXVC (AT91_CAST(AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register -#define AT91C_UDP_GLBSTATE (AT91_CAST(AT91_REG *) 0xFFFB0004) // (UDP) Global State Register -#define AT91C_UDP_IER (AT91_CAST(AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register -// ========== Register definition for TC0 peripheral ========== -#define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0xFFFA0020) // (TC0) Status Register -#define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0xFFFA001C) // (TC0) Register C -#define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0xFFFA0018) // (TC0) Register B -#define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register -#define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register -#define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0xFFFA0014) // (TC0) Register A -#define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register -#define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0xFFFA0010) // (TC0) Counter Value -#define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register -// ========== Register definition for TC1 peripheral ========== -#define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0xFFFA0058) // (TC1) Register B -#define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register -#define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register -#define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register -#define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0xFFFA0060) // (TC1) Status Register -#define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0xFFFA0054) // (TC1) Register A -#define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0xFFFA005C) // (TC1) Register C -#define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register -#define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0xFFFA0050) // (TC1) Counter Value -// ========== Register definition for TC2 peripheral ========== -#define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) -#define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register -#define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0xFFFA0090) // (TC2) Counter Value -#define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0xFFFA0094) // (TC2) Register A -#define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0xFFFA0098) // (TC2) Register B -#define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register -#define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register -#define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0xFFFA009C) // (TC2) Register C -#define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register -#define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0xFFFA00A0) // (TC2) Status Register -// ========== Register definition for TCB peripheral ========== -#define AT91C_TCB_BMR (AT91_CAST(AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register -#define AT91C_TCB_BCR (AT91_CAST(AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register -// ========== Register definition for CAN_MB0 peripheral ========== -#define AT91C_CAN_MB0_MDL (AT91_CAST(AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register -#define AT91C_CAN_MB0_MAM (AT91_CAST(AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register -#define AT91C_CAN_MB0_MCR (AT91_CAST(AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register -#define AT91C_CAN_MB0_MID (AT91_CAST(AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register -#define AT91C_CAN_MB0_MSR (AT91_CAST(AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register -#define AT91C_CAN_MB0_MFID (AT91_CAST(AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register -#define AT91C_CAN_MB0_MDH (AT91_CAST(AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register -#define AT91C_CAN_MB0_MMR (AT91_CAST(AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register -// ========== Register definition for CAN_MB1 peripheral ========== -#define AT91C_CAN_MB1_MDL (AT91_CAST(AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register -#define AT91C_CAN_MB1_MID (AT91_CAST(AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register -#define AT91C_CAN_MB1_MMR (AT91_CAST(AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register -#define AT91C_CAN_MB1_MSR (AT91_CAST(AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register -#define AT91C_CAN_MB1_MAM (AT91_CAST(AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register -#define AT91C_CAN_MB1_MDH (AT91_CAST(AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register -#define AT91C_CAN_MB1_MCR (AT91_CAST(AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register -#define AT91C_CAN_MB1_MFID (AT91_CAST(AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register -// ========== Register definition for CAN_MB2 peripheral ========== -#define AT91C_CAN_MB2_MCR (AT91_CAST(AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register -#define AT91C_CAN_MB2_MDH (AT91_CAST(AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register -#define AT91C_CAN_MB2_MID (AT91_CAST(AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register -#define AT91C_CAN_MB2_MDL (AT91_CAST(AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register -#define AT91C_CAN_MB2_MMR (AT91_CAST(AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register -#define AT91C_CAN_MB2_MAM (AT91_CAST(AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register -#define AT91C_CAN_MB2_MFID (AT91_CAST(AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register -#define AT91C_CAN_MB2_MSR (AT91_CAST(AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register -// ========== Register definition for CAN_MB3 peripheral ========== -#define AT91C_CAN_MB3_MFID (AT91_CAST(AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register -#define AT91C_CAN_MB3_MAM (AT91_CAST(AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register -#define AT91C_CAN_MB3_MID (AT91_CAST(AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register -#define AT91C_CAN_MB3_MCR (AT91_CAST(AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register -#define AT91C_CAN_MB3_MMR (AT91_CAST(AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register -#define AT91C_CAN_MB3_MSR (AT91_CAST(AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register -#define AT91C_CAN_MB3_MDL (AT91_CAST(AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register -#define AT91C_CAN_MB3_MDH (AT91_CAST(AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register -// ========== Register definition for CAN_MB4 peripheral ========== -#define AT91C_CAN_MB4_MID (AT91_CAST(AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register -#define AT91C_CAN_MB4_MMR (AT91_CAST(AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register -#define AT91C_CAN_MB4_MDH (AT91_CAST(AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register -#define AT91C_CAN_MB4_MFID (AT91_CAST(AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register -#define AT91C_CAN_MB4_MSR (AT91_CAST(AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register -#define AT91C_CAN_MB4_MCR (AT91_CAST(AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register -#define AT91C_CAN_MB4_MDL (AT91_CAST(AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register -#define AT91C_CAN_MB4_MAM (AT91_CAST(AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register -// ========== Register definition for CAN_MB5 peripheral ========== -#define AT91C_CAN_MB5_MSR (AT91_CAST(AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register -#define AT91C_CAN_MB5_MCR (AT91_CAST(AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register -#define AT91C_CAN_MB5_MFID (AT91_CAST(AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register -#define AT91C_CAN_MB5_MDH (AT91_CAST(AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register -#define AT91C_CAN_MB5_MID (AT91_CAST(AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register -#define AT91C_CAN_MB5_MMR (AT91_CAST(AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register -#define AT91C_CAN_MB5_MDL (AT91_CAST(AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register -#define AT91C_CAN_MB5_MAM (AT91_CAST(AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register -// ========== Register definition for CAN_MB6 peripheral ========== -#define AT91C_CAN_MB6_MFID (AT91_CAST(AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register -#define AT91C_CAN_MB6_MID (AT91_CAST(AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register -#define AT91C_CAN_MB6_MAM (AT91_CAST(AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register -#define AT91C_CAN_MB6_MSR (AT91_CAST(AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register -#define AT91C_CAN_MB6_MDL (AT91_CAST(AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register -#define AT91C_CAN_MB6_MCR (AT91_CAST(AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register -#define AT91C_CAN_MB6_MDH (AT91_CAST(AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register -#define AT91C_CAN_MB6_MMR (AT91_CAST(AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register -// ========== Register definition for CAN_MB7 peripheral ========== -#define AT91C_CAN_MB7_MCR (AT91_CAST(AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register -#define AT91C_CAN_MB7_MDH (AT91_CAST(AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register -#define AT91C_CAN_MB7_MFID (AT91_CAST(AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register -#define AT91C_CAN_MB7_MDL (AT91_CAST(AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register -#define AT91C_CAN_MB7_MID (AT91_CAST(AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register -#define AT91C_CAN_MB7_MMR (AT91_CAST(AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register -#define AT91C_CAN_MB7_MAM (AT91_CAST(AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register -#define AT91C_CAN_MB7_MSR (AT91_CAST(AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register -// ========== Register definition for CAN peripheral ========== -#define AT91C_CAN_TCR (AT91_CAST(AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register -#define AT91C_CAN_IMR (AT91_CAST(AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register -#define AT91C_CAN_IER (AT91_CAST(AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register -#define AT91C_CAN_ECR (AT91_CAST(AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register -#define AT91C_CAN_TIMESTP (AT91_CAST(AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register -#define AT91C_CAN_MR (AT91_CAST(AT91_REG *) 0xFFFD0000) // (CAN) Mode Register -#define AT91C_CAN_IDR (AT91_CAST(AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register -#define AT91C_CAN_ACR (AT91_CAST(AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register -#define AT91C_CAN_TIM (AT91_CAST(AT91_REG *) 0xFFFD0018) // (CAN) Timer Register -#define AT91C_CAN_SR (AT91_CAST(AT91_REG *) 0xFFFD0010) // (CAN) Status Register -#define AT91C_CAN_BR (AT91_CAST(AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register -#define AT91C_CAN_VR (AT91_CAST(AT91_REG *) 0xFFFD00FC) // (CAN) Version Register -// ========== Register definition for EMAC peripheral ========== -#define AT91C_EMAC_ISR (AT91_CAST(AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register -#define AT91C_EMAC_SA4H (AT91_CAST(AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes -#define AT91C_EMAC_SA1L (AT91_CAST(AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes -#define AT91C_EMAC_ELE (AT91_CAST(AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register -#define AT91C_EMAC_LCOL (AT91_CAST(AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register -#define AT91C_EMAC_RLE (AT91_CAST(AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register -#define AT91C_EMAC_WOL (AT91_CAST(AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register -#define AT91C_EMAC_DTF (AT91_CAST(AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register -#define AT91C_EMAC_TUND (AT91_CAST(AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register -#define AT91C_EMAC_NCR (AT91_CAST(AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register -#define AT91C_EMAC_SA4L (AT91_CAST(AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes -#define AT91C_EMAC_RSR (AT91_CAST(AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register -#define AT91C_EMAC_SA3L (AT91_CAST(AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes -#define AT91C_EMAC_TSR (AT91_CAST(AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register -#define AT91C_EMAC_IDR (AT91_CAST(AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register -#define AT91C_EMAC_RSE (AT91_CAST(AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register -#define AT91C_EMAC_ECOL (AT91_CAST(AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register -#define AT91C_EMAC_TID (AT91_CAST(AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register -#define AT91C_EMAC_HRB (AT91_CAST(AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] -#define AT91C_EMAC_TBQP (AT91_CAST(AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer -#define AT91C_EMAC_USRIO (AT91_CAST(AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register -#define AT91C_EMAC_PTR (AT91_CAST(AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register -#define AT91C_EMAC_SA2H (AT91_CAST(AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes -#define AT91C_EMAC_ROV (AT91_CAST(AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register -#define AT91C_EMAC_ALE (AT91_CAST(AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register -#define AT91C_EMAC_RJA (AT91_CAST(AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register -#define AT91C_EMAC_RBQP (AT91_CAST(AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer -#define AT91C_EMAC_TPF (AT91_CAST(AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register -#define AT91C_EMAC_NCFGR (AT91_CAST(AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register -#define AT91C_EMAC_HRT (AT91_CAST(AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] -#define AT91C_EMAC_USF (AT91_CAST(AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register -#define AT91C_EMAC_FCSE (AT91_CAST(AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register -#define AT91C_EMAC_TPQ (AT91_CAST(AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register -#define AT91C_EMAC_MAN (AT91_CAST(AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register -#define AT91C_EMAC_FTO (AT91_CAST(AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register -#define AT91C_EMAC_REV (AT91_CAST(AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register -#define AT91C_EMAC_IMR (AT91_CAST(AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register -#define AT91C_EMAC_SCF (AT91_CAST(AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register -#define AT91C_EMAC_PFR (AT91_CAST(AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register -#define AT91C_EMAC_MCF (AT91_CAST(AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register -#define AT91C_EMAC_NSR (AT91_CAST(AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register -#define AT91C_EMAC_SA2L (AT91_CAST(AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes -#define AT91C_EMAC_FRO (AT91_CAST(AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register -#define AT91C_EMAC_IER (AT91_CAST(AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register -#define AT91C_EMAC_SA1H (AT91_CAST(AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes -#define AT91C_EMAC_CSE (AT91_CAST(AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register -#define AT91C_EMAC_SA3H (AT91_CAST(AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes -#define AT91C_EMAC_RRE (AT91_CAST(AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register -#define AT91C_EMAC_STE (AT91_CAST(AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register -// ========== Register definition for PDC_ADC peripheral ========== -#define AT91C_ADC_PTSR (AT91_CAST(AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register -#define AT91C_ADC_PTCR (AT91_CAST(AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register -#define AT91C_ADC_TNPR (AT91_CAST(AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register -#define AT91C_ADC_TNCR (AT91_CAST(AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register -#define AT91C_ADC_RNPR (AT91_CAST(AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register -#define AT91C_ADC_RNCR (AT91_CAST(AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register -#define AT91C_ADC_RPR (AT91_CAST(AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register -#define AT91C_ADC_TCR (AT91_CAST(AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register -#define AT91C_ADC_TPR (AT91_CAST(AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register -#define AT91C_ADC_RCR (AT91_CAST(AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register -// ========== Register definition for ADC peripheral ========== -#define AT91C_ADC_CDR2 (AT91_CAST(AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 -#define AT91C_ADC_CDR3 (AT91_CAST(AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 -#define AT91C_ADC_CDR0 (AT91_CAST(AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 -#define AT91C_ADC_CDR5 (AT91_CAST(AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 -#define AT91C_ADC_CHDR (AT91_CAST(AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register -#define AT91C_ADC_SR (AT91_CAST(AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register -#define AT91C_ADC_CDR4 (AT91_CAST(AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 -#define AT91C_ADC_CDR1 (AT91_CAST(AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 -#define AT91C_ADC_LCDR (AT91_CAST(AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register -#define AT91C_ADC_IDR (AT91_CAST(AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register -#define AT91C_ADC_CR (AT91_CAST(AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register -#define AT91C_ADC_CDR7 (AT91_CAST(AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 -#define AT91C_ADC_CDR6 (AT91_CAST(AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 -#define AT91C_ADC_IER (AT91_CAST(AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register -#define AT91C_ADC_CHER (AT91_CAST(AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register -#define AT91C_ADC_CHSR (AT91_CAST(AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register -#define AT91C_ADC_MR (AT91_CAST(AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register -#define AT91C_ADC_IMR (AT91_CAST(AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register - -// ***************************************************************************** -// PIO DEFINITIONS FOR AT91SAM7X512 -// ***************************************************************************** -#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 -#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data -#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 -#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data -#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 -#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data -#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 -#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock -#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 -#define AT91C_PA12_SPI0_NPCS0 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 -#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 -#define AT91C_PA13_SPI0_NPCS1 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 -#define AT91C_PA14_SPI0_NPCS2 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 -#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 -#define AT91C_PA15_SPI0_NPCS3 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input -#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 -#define AT91C_PA16_SPI0_MISO (AT91C_PIO_PA16) // SPI 0 Master In Slave -#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 -#define AT91C_PA17_SPI0_MOSI (AT91C_PIO_PA17) // SPI 0 Master Out Slave -#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 -#define AT91C_PA18_SPI0_SPCK (AT91C_PIO_PA18) // SPI 0 Serial Clock -#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 -#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive -#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 -#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock -#define AT91C_PA2_SPI1_NPCS1 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 -#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit -#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 -#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync -#define AT91C_PA21_SPI1_NPCS0 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 -#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 -#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock -#define AT91C_PA22_SPI1_SPCK (AT91C_PIO_PA22) // SPI 1 Serial Clock -#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 -#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data -#define AT91C_PA23_SPI1_MOSI (AT91C_PIO_PA23) // SPI 1 Master Out Slave -#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 -#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data -#define AT91C_PA24_SPI1_MISO (AT91C_PIO_PA24) // SPI 1 Master In Slave -#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 -#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock -#define AT91C_PA25_SPI1_NPCS1 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 -#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync -#define AT91C_PA26_SPI1_NPCS2 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 -#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data -#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 -#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 -#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data -#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 -#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input -#define AT91C_PA29_SPI1_NPCS3 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 -#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send -#define AT91C_PA3_SPI1_NPCS2 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 -#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 -#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 -#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send -#define AT91C_PA4_SPI1_NPCS3 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 -#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data -#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 -#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data -#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 -#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock -#define AT91C_PA7_SPI0_NPCS1 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 -#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send -#define AT91C_PA8_SPI0_NPCS2 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 -#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send -#define AT91C_PA9_SPI0_NPCS3 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 -#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock -#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 -#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable -#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 -#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 -#define AT91C_PB10_SPI1_NPCS1 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 -#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 -#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 -#define AT91C_PB11_SPI1_NPCS2 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 -#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 -#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error -#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input -#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 -#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 -#define AT91C_PB13_SPI0_NPCS1 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 -#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 -#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 -#define AT91C_PB14_SPI0_NPCS2 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 -#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 -#define AT91C_PB15_ERXDV_ECRSDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid -#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 -#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected -#define AT91C_PB16_SPI1_NPCS3 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 -#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 -#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock -#define AT91C_PB17_SPI0_NPCS3 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 -#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 -#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec -#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger -#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 -#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 -#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input -#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 -#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 -#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 -#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 -#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 -#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 -#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 -#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 -#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 -#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 -#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 -#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 -#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A -#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect -#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 -#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B -#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready -#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 -#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A -#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready -#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 -#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B -#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator -#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 -#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A -#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 -#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 -#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B -#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 -#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 -#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 -#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 -#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 -#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 -#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 -#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 -#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 -#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 -#define AT91C_PB4_ECRS (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid -#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 -#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 -#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 -#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 -#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 -#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error -#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 -#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock -#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 -#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output - -// ***************************************************************************** -// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X512 -// ***************************************************************************** -#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) -#define AT91C_ID_SYS ( 1) // System Peripheral -#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A -#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B -#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 -#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 -#define AT91C_ID_US0 ( 6) // USART 0 -#define AT91C_ID_US1 ( 7) // USART 1 -#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller -#define AT91C_ID_TWI ( 9) // Two-Wire Interface -#define AT91C_ID_PWMC (10) // PWM Controller -#define AT91C_ID_UDP (11) // USB Device Port -#define AT91C_ID_TC0 (12) // Timer Counter 0 -#define AT91C_ID_TC1 (13) // Timer Counter 1 -#define AT91C_ID_TC2 (14) // Timer Counter 2 -#define AT91C_ID_CAN (15) // Control Area Network Controller -#define AT91C_ID_EMAC (16) // Ethernet MAC -#define AT91C_ID_ADC (17) // Analog-to-Digital Converter -#define AT91C_ID_18_Reserved (18) // Reserved -#define AT91C_ID_19_Reserved (19) // Reserved -#define AT91C_ID_20_Reserved (20) // Reserved -#define AT91C_ID_21_Reserved (21) // Reserved -#define AT91C_ID_22_Reserved (22) // Reserved -#define AT91C_ID_23_Reserved (23) // Reserved -#define AT91C_ID_24_Reserved (24) // Reserved -#define AT91C_ID_25_Reserved (25) // Reserved -#define AT91C_ID_26_Reserved (26) // Reserved -#define AT91C_ID_27_Reserved (27) // Reserved -#define AT91C_ID_28_Reserved (28) // Reserved -#define AT91C_ID_29_Reserved (29) // Reserved -#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) -#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) -#define AT91C_ALL_INT (0xC003FFFF) // ALL VALID INTERRUPTS - -// ***************************************************************************** -// BASE ADDRESS DEFINITIONS FOR AT91SAM7X512 -// ***************************************************************************** -#define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address -#define AT91C_BASE_AIC (AT91_CAST(AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address -#define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address -#define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address -#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address -#define AT91C_BASE_PIOB (AT91_CAST(AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address -#define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address -#define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address -#define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address -#define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address -#define AT91C_BASE_PITC (AT91_CAST(AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address -#define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address -#define AT91C_BASE_VREG (AT91_CAST(AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address -#define AT91C_BASE_EFC0 (AT91_CAST(AT91PS_EFC) 0xFFFFFF60) // (EFC0) Base Address -#define AT91C_BASE_EFC1 (AT91_CAST(AT91PS_EFC) 0xFFFFFF70) // (EFC1) Base Address -#define AT91C_BASE_MC (AT91_CAST(AT91PS_MC) 0xFFFFFF00) // (MC) Base Address -#define AT91C_BASE_PDC_SPI1 (AT91_CAST(AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address -#define AT91C_BASE_SPI1 (AT91_CAST(AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address -#define AT91C_BASE_PDC_SPI0 (AT91_CAST(AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address -#define AT91C_BASE_SPI0 (AT91_CAST(AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address -#define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address -#define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0xFFFC4000) // (US1) Base Address -#define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address -#define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0xFFFC0000) // (US0) Base Address -#define AT91C_BASE_PDC_SSC (AT91_CAST(AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address -#define AT91C_BASE_SSC (AT91_CAST(AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address -#define AT91C_BASE_TWI (AT91_CAST(AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address -#define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address -#define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address -#define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address -#define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address -#define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address -#define AT91C_BASE_UDP (AT91_CAST(AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address -#define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0xFFFA0000) // (TC0) Base Address -#define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0xFFFA0040) // (TC1) Base Address -#define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0xFFFA0080) // (TC2) Base Address -#define AT91C_BASE_TCB (AT91_CAST(AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address -#define AT91C_BASE_CAN_MB0 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address -#define AT91C_BASE_CAN_MB1 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address -#define AT91C_BASE_CAN_MB2 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address -#define AT91C_BASE_CAN_MB3 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address -#define AT91C_BASE_CAN_MB4 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address -#define AT91C_BASE_CAN_MB5 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address -#define AT91C_BASE_CAN_MB6 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address -#define AT91C_BASE_CAN_MB7 (AT91_CAST(AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address -#define AT91C_BASE_CAN (AT91_CAST(AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address -#define AT91C_BASE_EMAC (AT91_CAST(AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address -#define AT91C_BASE_PDC_ADC (AT91_CAST(AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address -#define AT91C_BASE_ADC (AT91_CAST(AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address - -// ***************************************************************************** -// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X512 -// ***************************************************************************** -// ISRAM -#define AT91C_ISRAM (0x00200000) // Internal SRAM base address -#define AT91C_ISRAM_SIZE (0x00020000) // Internal SRAM size in byte (128 Kbytes) -// IFLASH -#define AT91C_IFLASH (0x00100000) // Internal FLASH base address -#define AT91C_IFLASH_SIZE (0x00080000) // Internal FLASH size in byte (512 Kbytes) -#define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH Page Size: 256 bytes -#define AT91C_IFLASH_LOCK_REGION_SIZE (16384) // Internal FLASH Lock Region Size: 16 Kbytes -#define AT91C_IFLASH_NB_OF_PAGES (2048) // Internal FLASH Number of Pages: 2048 bytes -#define AT91C_IFLASH_NB_OF_LOCK_BITS (32) // Internal FLASH Number of Lock Bits: 32 bytes - -#endif diff --git a/os/hal/platforms/AT91SAM7/at91lib/aic.c b/os/hal/platforms/AT91SAM7/at91lib/aic.c deleted file mode 100644 index 66eebf94ed..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/aic.c +++ /dev/null @@ -1,84 +0,0 @@ -/* ---------------------------------------------------------------------------- - * ATMEL Microcontroller Software Support - ROUSSET - - * ---------------------------------------------------------------------------- - * Copyright (c) 2006, Atmel Corporation - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaiimer below. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the disclaimer below in the documentation and/or - * other materials provided with the distribution. - * - * Atmel's name may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * DISCLAIMED. IN NO EVENT SHALL ATMEL 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. - * ---------------------------------------------------------------------------- - */ - -//------------------------------------------------------------------------------ -// Headers -//------------------------------------------------------------------------------ - -#include "aic.h" -#include - -//------------------------------------------------------------------------------ -// Exported functions -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -/// Configures the interrupt associated with the given source, using the -/// specified mode and interrupt handler. -/// \param source Interrupt source to configure. -/// \param mode Triggering mode of the interrupt. -/// \param handler Interrupt handler function. -//------------------------------------------------------------------------------ -void AIC_ConfigureIT(unsigned int source, - unsigned int mode, - void (*handler)( void )) -{ - // Disable the interrupt first - AT91C_BASE_AIC->AIC_IDCR = 1 << source; - - // Configure mode and handler - AT91C_BASE_AIC->AIC_SMR[source] = mode; - AT91C_BASE_AIC->AIC_SVR[source] = (unsigned int) handler; - - // Clear interrupt - AT91C_BASE_AIC->AIC_ICCR = 1 << source; -} - -//------------------------------------------------------------------------------ -/// Enables interrupts coming from the given (unique) source. -/// \param source Interrupt source to enable. -//------------------------------------------------------------------------------ -void AIC_EnableIT(unsigned int source) -{ - AT91C_BASE_AIC->AIC_IECR = 1 << source; -} - -//------------------------------------------------------------------------------ -/// Disables interrupts coming from the given (unique) source. -/// \param source Interrupt source to enable. -//------------------------------------------------------------------------------ -void AIC_DisableIT(unsigned int source) -{ - AT91C_BASE_AIC->AIC_IDCR = 1 << source; -} - diff --git a/os/hal/platforms/AT91SAM7/at91lib/aic.h b/os/hal/platforms/AT91SAM7/at91lib/aic.h deleted file mode 100644 index e8e52c78a9..0000000000 --- a/os/hal/platforms/AT91SAM7/at91lib/aic.h +++ /dev/null @@ -1,78 +0,0 @@ -/* ---------------------------------------------------------------------------- - * ATMEL Microcontroller Software Support - ROUSSET - - * ---------------------------------------------------------------------------- - * Copyright (c) 2006, Atmel Corporation - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaiimer below. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the disclaimer below in the documentation and/or - * other materials provided with the distribution. - * - * Atmel's name may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * DISCLAIMED. IN NO EVENT SHALL ATMEL 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. - * ---------------------------------------------------------------------------- - */ - -//------------------------------------------------------------------------------ -/// \dir -/// !Purpose -/// -/// Methods and definitions for configuring interrupts using the Advanced -/// Interrupt Controller (AIC). -/// -/// !Usage -/// -# Configure an interrupt source using AIC_ConfigureIT -/// -# Enable or disable interrupt generation of a particular source with -/// AIC_EnableIT and AIC_DisableIT. -//------------------------------------------------------------------------------ - -#ifndef AIC_H -#define AIC_H - -//------------------------------------------------------------------------------ -// Headers -//------------------------------------------------------------------------------ - -#include - -//------------------------------------------------------------------------------ -// Definitions -//------------------------------------------------------------------------------ - -#ifndef AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL - /// Redefinition of missing constant. - #define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE -#endif - -//------------------------------------------------------------------------------ -// Global functions -//------------------------------------------------------------------------------ - -extern void AIC_ConfigureIT(unsigned int source, - unsigned int mode, - void (*handler)( void )); - -extern void AIC_EnableIT(unsigned int source); - -extern void AIC_DisableIT(unsigned int source); - -#endif //#ifndef AIC_H - diff --git a/os/hal/platforms/AT91SAM7/at91sam7.h b/os/hal/platforms/AT91SAM7/at91sam7.h deleted file mode 100644 index c567c5e4f5..0000000000 --- a/os/hal/platforms/AT91SAM7/at91sam7.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _AT91SAM7_H_ -#define _AT91SAM7_H_ - -/* - * Supported platforms. - */ -#define SAM7S64 0 -#define SAM7S128 1 -#define SAM7S256 2 -#define SAM7S512 3 -#define SAM7X128 4 -#define SAM7X256 5 -#define SAM7X512 6 - -#ifndef SAM7_PLATFORM -#error "SAM7 platform not defined" -#endif - -#if SAM7_PLATFORM == SAM7S64 -#include "at91lib/AT91SAM7S64.h" -#elif SAM7_PLATFORM == SAM7S128 -#include "at91lib/AT91SAM7S128.h" -#elif SAM7_PLATFORM == SAM7S256 -#include "at91lib/AT91SAM7S256.h" -#elif SAM7_PLATFORM == SAM7S512 -#include "at91lib/AT91SAM7S512.h" -#elif SAM7_PLATFORM == SAM7X128 -#include "at91lib/AT91SAM7X128.h" -#elif SAM7_PLATFORM == SAM7X256 -#include "at91lib/AT91SAM7X256.h" -#elif SAM7_PLATFORM == SAM7X512 -#include "at91lib/AT91SAM7X512.h" -#else -#error "SAM7 platform not supported" -#endif - -#endif /* _AT91SAM7_H_ */ diff --git a/os/hal/platforms/AT91SAM7/at91sam7_mii.c b/os/hal/platforms/AT91SAM7/at91sam7_mii.c deleted file mode 100644 index 58af184e35..0000000000 --- a/os/hal/platforms/AT91SAM7/at91sam7_mii.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/at91sam7_mii.c - * @brief AT91SAM7 low level MII driver code. - * - * @addtogroup AT91SAM7_MII - * @{ - */ - -#include "ch.h" -#include "hal.h" -#include "at91sam7_mii.h" - -#if HAL_USE_MAC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level MII driver initialization. - * - * @notapi - */ -void miiInit(void) { - -} - -/** - * @brief Resets a PHY device. - * - * @param[in] macp pointer to the @p MACDriver object - * - * @notapi - */ -void miiReset(MACDriver *macp) { - - (void)macp; - - /* - * Disables the pullups on all the pins that are latched on reset by the PHY. - */ - AT91C_BASE_PIOB->PIO_PPUDR = PHY_LATCHED_PINS; - -#ifdef PIOB_PHY_PD_MASK - /* - * PHY power control. - */ - AT91C_BASE_PIOB->PIO_OER = PIOB_PHY_PD_MASK; /* Becomes an output. */ - AT91C_BASE_PIOB->PIO_PPUDR = PIOB_PHY_PD_MASK;/* Default pullup disabled. */ -#if (PHY_HARDWARE == PHY_DAVICOM_9161) - AT91C_BASE_PIOB->PIO_CODR = PIOB_PHY_PD_MASK; /* Output to low level. */ -#else - AT91C_BASE_PIOB->PIO_SODR = PIOB_PHY_PD_MASK; /* Output to high level. */ -#endif -#endif - - /* - * PHY reset by pulsing the NRST pin. - */ - AT91C_BASE_RSTC->RSTC_RMR = 0xA5000100; - AT91C_BASE_RSTC->RSTC_RCR = 0xA5000000 | AT91C_RSTC_EXTRST; - while (!(AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_NRSTL)) - ; -} - -/** - * @brief Reads a PHY register through the MII interface. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[in] addr the register address - * @return The register value. - * - * @notapi - */ -phyreg_t miiGet(MACDriver *macp, phyaddr_t addr) { - - (void)macp; - AT91C_BASE_EMAC->EMAC_MAN = (0b01 << 30) | /* SOF */ - (0b10 << 28) | /* RW */ - (PHY_ADDRESS << 23) | /* PHYA */ - (addr << 18) | /* REGA */ - (0b10 << 16); /* CODE */ - while (!( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE)) - ; - return (phyreg_t)(AT91C_BASE_EMAC->EMAC_MAN & 0xFFFF); -} - -/** - * @brief Writes a PHY register through the MII interface. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[in] addr the register address - * @param[in] value the new register value - * - * @notapi - */ -void miiPut(MACDriver *macp, phyaddr_t addr, phyreg_t value) { - - (void)macp; - AT91C_BASE_EMAC->EMAC_MAN = (0b01 << 30) | /* SOF */ - (0b01 << 28) | /* RW */ - (PHY_ADDRESS << 23) | /* PHYA */ - (addr << 18) | /* REGA */ - (0b10 << 16) | /* CODE */ - value; - while (!( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE)) - ; -} - -#endif /* HAL_USE_MAC */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/at91sam7_mii.h b/os/hal/platforms/AT91SAM7/at91sam7_mii.h deleted file mode 100644 index a5b0e0a7e2..0000000000 --- a/os/hal/platforms/AT91SAM7/at91sam7_mii.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/at91sam7_mii.h - * @brief AT91SAM7 low level MII driver header. - * - * @addtogroup AT91SAM7_MII - * @{ - */ - -#ifndef _AT91SAM7_MII_H_ -#define _AT91SAM7_MII_H_ - -#if HAL_USE_MAC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define PHY_MICREL_KS8721 0 -#define PHY_DAVICOM_9161 1 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief PHY manufacturer and model. - */ -#if !defined(PHY_HARDWARE) || defined(__DOXYGEN__) -#define PHY_HARDWARE PHY_MICREL_KS8721 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** - * @brief Pins latched by the PHY at reset. - */ -#if PHY_HARDWARE == PHY_MICREL_KS8721 -#define PHY_ADDRESS 1 -#define PHY_ID MII_KS8721_ID -#define PHY_LATCHED_PINS (AT91C_PB4_ECRS | AT91C_PB5_ERX0 | \ - AT91C_PB6_ERX1 | AT91C_PB7_ERXER | \ - AT91C_PB13_ERX2 | AT91C_PB14_ERX3 | \ - AT91C_PB15_ERXDV_ECRSDV | AT91C_PB16_ECOL | \ - AT91C_PIO_PB26) - -#elif PHY_HARDWARE == PHY_DAVICOM_9161 -#define PHY_ADDRESS 0 -#define PHY_ID MII_DM9161_ID -#define PHY_LATCHED_PINS (AT91C_PB0_ETXCK_EREFCK | AT91C_PB4_ECRS | \ - AT91C_PB5_ERX0 | AT91C_PB6_ERX1 | \ - AT91C_PB7_ERXER | AT91C_PB13_ERX2 | \ - AT91C_PB14_ERX3 | AT91C_PB15_ERXDV_ECRSDV | \ - AT91C_PB16_ECOL | AT91C_PB17_ERXCK) -#endif /* PHY_HARDWARE */ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a PHY register value. - */ -typedef uint16_t phyreg_t; - -/** - * @brief Type of a PHY register address. - */ -typedef uint8_t phyaddr_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void miiInit(void); - void miiReset(MACDriver *macp); - phyreg_t miiGet(MACDriver *macp, phyaddr_t addr); - void miiPut(MACDriver *macp, phyaddr_t addr, phyreg_t value); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_MAC */ - -#endif /* _AT91SAM7_MII_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/ext_lld.c b/os/hal/platforms/AT91SAM7/ext_lld.c deleted file mode 100644 index 98f08c9b84..0000000000 --- a/os/hal/platforms/AT91SAM7/ext_lld.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/ext_lld.c - * @brief AT91SAM7 EXT subsystem low level driver source. - * - * @addtogroup EXT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief EXTDA driver identifier. - */ -EXTDriver EXTDA; - -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) -/** - * @brief EXTDB driver identifier. - */ -EXTDriver EXTDB; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Handles external interrupts. - * - * @param[in] extp pointer to the driver that received the interrupt - */ -static void ext_lld_serveInterrupt(EXTDriver *extp) { - uint32_t irqFlags; - uint32_t ch; - - chSysLockFromIsr(); - - /* Read flags of pending PIO interrupts.*/ - irqFlags = extp->pio->PIO_ISR; - - /* Call callback function for any pending interrupt.*/ - for(ch = 0; ch < 32; ch++) { - - /* Check if the channel is activated and if its IRQ flag is set.*/ - if((extp->config->channels[ch].mode & - EXT_CH_MODE_ENABLED & EXT_CH_MODE_EDGES_MASK) - && ((1 << ch) & irqFlags)) { - (extp->config->channels[ch].cb)(extp, ch); - } - } - - chSysUnlockFromIsr(); - - AT91C_BASE_AIC->AIC_EOICR = 0; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief EXTI[0] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTIA_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - ext_lld_serveInterrupt(&EXTDA); - - CH_IRQ_EPILOGUE(); -} - -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) -/** - * @brief EXTI[1] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTIB_IRQHandler) { - CH_IRQ_PROLOGUE(); - - ext_lld_serveInterrupt(&EXTDB); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level EXT driver initialization. - * - * @notapi - */ -void ext_lld_init(void) { - - /* Driver initialization.*/ - extObjectInit(&EXTDA); - - /* Set PIO base addresses.*/ - EXTDA.pio = AT91C_BASE_PIOA; - - /* Set peripheral IDs.*/ - EXTDA.pid = AT91C_ID_PIOA; - -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - /* Same for PIOB.*/ - extObjectInit(&EXTDB); - EXTDB.pio = AT91C_BASE_PIOB; - EXTDB.pid = AT91C_ID_PIOB; -#endif -} - -/** - * @brief Configures and activates the EXT peripheral. - * - * @param[in] extp pointer to the @p EXTDriver object - * - * @notapi - */ -void ext_lld_start(EXTDriver *extp) { - uint16_t ch; - uint32_t ier = 0; - const EXTConfig *config = extp->config; - - switch(extp->pid) { - case AT91C_ID_PIOA: - AIC_ConfigureIT(AT91C_ID_PIOA, SAM7_computeSMR(config->mode, - config->priority), - EXTIA_IRQHandler); - break; -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - case AT91C_ID_PIOB: - AIC_ConfigureIT(AT91C_ID_PIOB, SAM7_computeSMR(config->mode, - config->priority), - EXTIB_IRQHandler); - break; -#endif - } - - /* Enable and Disable channels with respect to config.*/ - for(ch = 0; ch < EXT_MAX_CHANNELS; ch++) { - ier |= (config->channels[ch].mode & EXT_CH_MODE_EDGES_MASK & EXT_CH_MODE_ENABLED ? 1 : 0) << ch; - } - extp->pio->PIO_IER = ier; - extp->pio->PIO_IDR = ~ier; - - /* Enable interrupt on corresponding PIO port in AIC.*/ - AIC_EnableIT(extp->pid); -} - -/** - * @brief Deactivates the EXT peripheral. - * - * @param[in] extp pointer to the @p EXTDriver object - * - * @notapi - */ -void ext_lld_stop(EXTDriver *extp) { - - /* Disable interrupt on corresponding PIO port in AIC.*/ - AIC_DisableIT(extp->pid); -} - -/** - * @brief Enables an EXT channel. - * - * @param[in] extp pointer to the @p EXTDriver object - * @param[in] channel channel to be enabled - * - * @notapi - */ -void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) { - - extp->pio->PIO_IER = (1 << channel); -} - -/** - * @brief Disables an EXT channel. - * - * @param[in] extp pointer to the @p EXTDriver object - * @param[in] channel channel to be disabled - * - * @notapi - */ -void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) { - - extp->pio->PIO_IDR = (1 << channel); -} - -#endif /* HAL_USE_EXT */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/ext_lld.h b/os/hal/platforms/AT91SAM7/ext_lld.h deleted file mode 100644 index 8ec6fea5db..0000000000 --- a/os/hal/platforms/AT91SAM7/ext_lld.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/ext_lld.h - * @brief AT91SAM7 EXT subsystem low level driver header. - * - * @addtogroup EXT - * @{ - */ - -#ifndef _EXT_LLD_H_ -#define _EXT_LLD_H_ - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Pointer to the SAM7 AIC register block. - */ -#define SAM7_EXT_AIC ((AT91PS_AIC *)AT91C_BASE_AIC) - -/** - * @brief Number of channels within one ext driver. - */ -#define EXT_MAX_CHANNELS 32 - -/** - * @brief Mask of priority bits in interrupt mode register. - */ -#define SAM7_EXT_PRIORITY_MASK 0x00000007 - -/** - * @brief Shifter for priority bits in interrupt mode register. - */ -#define SAM7_EXT_PRIORITY_SHIFTER 0 - -/** - * @brief Shifter for mode bits in interrupt mode register. - */ -#define SAM7_EXT_MODE_SHIFTER 5 - -/* - * On the SAM7 architecture, a single channel can only be enables or disabled - * Hence, undefine the other channel mode constants - */ -#ifdef EXT_CH_MODE_RISING_EDGE -#undef EXT_CH_MODE_RISING_EDGE -#endif - -#ifdef EXT_CH_MODE_FALLING_EDGE -#undef EXT_CH_MODE_FALLING_EDGE -#endif - -#ifdef EXT_CH_MODE_BOTH_EDGES -#undef EXT_CH_MODE_BOTH_EDGES -#endif - -/** - * @name EXT channels mode - * @{ - */ -#define EXT_CH_MODE_ENABLED 1 /**< @brief Channel is enabled. */ -/** @} */ - -/** - * @name EXT drivers mode - * @{ - */ -/** - * @brief Mask for modes. - */ -#define SAM7_EXT_MODE_MASK AT91C_AIC_SRCTYPE -/** - * @brief Falling edge callback. - */ -#define SAM7_EXT_MODE_FALLING_EDGE AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE -/** - * @brief Rising edge callback. - */ -#define SAM7_EXT_MODE_RISING_EDGE AT91C_AIC_SRCTYPE_POSITIVE_EDGE -/** - * @brief High-level callback. - */ -#define SAM7_EXT_MODE_HIGH_LEVEL AT91C_AIC_SRCTYPE_HIGH_LEVEL -/** - * @brief Low-level callback. - */ -#define SAM7_EXT_MODE_LOW_LEVEL AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL -/** @} */ - -/** - * @name EXT drivers priorities - * @{ - */ -#define SAM7_EXT_PRIOR_HIGHEST AT91C_AIC_PRIOR_HIGHEST -#define SAM7_EXT_PRIOR_LOWEST AT91C_AIC_PRIOR_LOWEST -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief EXT channel identifier. - */ -typedef uint32_t expchannel_t; - -/** - * @brief Type of an EXT generic notification callback. - * - * @param[in] extp pointer to the @p EXPDriver object triggering the - * callback - */ -typedef void (*extcallback_t)(EXTDriver *extp, expchannel_t channel); - -/** - * @brief Channel configuration structure. - */ -typedef struct { - /** - * @brief Channel mode. - */ - uint32_t mode; - /** - * @brief Channel callback. - * @details In the STM32 implementation a @p NULL callback pointer is - * valid and configures the channel as an event sources instead - * of an interrupt source. - */ - extcallback_t cb; -} EXTChannelConfig; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Channel configurations. - */ - EXTChannelConfig channels[EXT_MAX_CHANNELS]; - /* End of the mandatory fields.*/ - - /** - * @brief interrupt mode. - */ - uint32_t mode; - - /** - * @brief interrupt priority. - */ - uint32_t priority; -} EXTConfig; - -/** - * @brief Structure representing an EXT driver. - */ -struct EXTDriver { - /** - * @brief Driver state. - */ - extstate_t state; - /** - * @brief Current configuration data. - */ - const EXTConfig *config; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the corresponding PIO registers block. - */ - AT91PS_PIO pio; - /** - * @brief peripheral ID of the corresponding PIO block. - */ - uint32_t pid; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Computes the content for the interrupt source mode register. - */ -#define SAM7_computeSMR(mode, prio) ( \ - ((mode & SAM7_EXT_MODE_MASK) << SAM7_EXT_MODE_SHIFTER) | \ - ((prio & SAM7_EXT_PRIORITY_MASK) << SAM7_EXT_PRIORITY_SHIFTER) \ -) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern EXTDriver EXTDA; -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) -extern EXTDriver EXTDB; -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void ext_lld_init(void); - void ext_lld_start(EXTDriver *extp); - void ext_lld_stop(EXTDriver *extp); - void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel); - void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_EXT */ - -#endif /* _EXT_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/hal_lld.c b/os/hal/platforms/AT91SAM7/hal_lld.c deleted file mode 100644 index 07ae8973ea..0000000000 --- a/os/hal/platforms/AT91SAM7/hal_lld.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/hal_lld.c - * @brief AT91SAM7 HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -static CH_IRQ_HANDLER(spurious_handler) { - - CH_IRQ_PROLOGUE(); - - AT91SAM7_SPURIOUS_HANDLER_HOOK(); - - AT91C_BASE_AIC->AIC_EOICR = 0; - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - unsigned i; - - /* FIQ Handler weak symbol defined in vectors.s.*/ - void FiqHandler(void); - - /* Default AIC setup, the device drivers will modify it as needed.*/ - AT91C_BASE_AIC->AIC_ICCR = 0xFFFFFFFF; - AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; - AT91C_BASE_AIC->AIC_SVR[0] = (AT91_REG)FiqHandler; - for (i = 1; i < 31; i++) { - AT91C_BASE_AIC->AIC_SVR[i] = (AT91_REG)NULL; - AT91C_BASE_AIC->AIC_EOICR = (AT91_REG)i; - } - AT91C_BASE_AIC->AIC_SPU = (AT91_REG)spurious_handler; - -} - -/** - * @brief AT91SAM7 clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function must be invoked only after the system reset. - * - * @special - */ -void at91sam7_clock_init(void) { - - /* wait for reset */ - while((AT91C_BASE_RSTC->RSTC_RSR & (AT91C_RSTC_SRCMP | AT91C_RSTC_NRSTL)) != AT91C_RSTC_NRSTL) - ; - /* enable reset */ - AT91C_BASE_RSTC->RSTC_RMR = ((0xA5 << 24) | AT91C_RSTC_URSTEN); - - /* Flash Memory: 1 wait state, about 50 cycles in a microsecond.*/ -#if SAM7_PLATFORM == SAM7X512 - AT91C_BASE_MC->MC0_FMR = (AT91C_MC_FMCN & (50 << 16)) | AT91C_MC_FWS_1FWS; - AT91C_BASE_MC->MC1_FMR = (AT91C_MC_FMCN & (50 << 16)) | AT91C_MC_FWS_1FWS; -#else - AT91C_BASE_MC->MC_FMR = (AT91C_MC_FMCN & (50 << 16)) | AT91C_MC_FWS_1FWS; -#endif - - /* Enables the main oscillator and waits 56 slow cycles as startup time.*/ - AT91C_BASE_PMC->PMC_MOR = (AT91C_CKGR_OSCOUNT & (7 << 8)) | AT91C_CKGR_MOSCEN; - while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)) - ; - - /* PLL setup: DIV = 14, MUL = 72, PLLCOUNT = 10 - PLLfreq = 96109714 Hz (rounded).*/ - AT91C_BASE_PMC->PMC_PLLR = (AT91C_CKGR_DIV & 14) | - (AT91C_CKGR_PLLCOUNT & (10 << 8)) | - (AT91SAM7_USBDIV) | - (AT91C_CKGR_MUL & (72 << 16)); - while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)) - ; - - /* Master clock = PLLfreq / 2 = 48054858 Hz (rounded).*/ - AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; - while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)) - ; - - AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; - while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)) - ; -} - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/hal_lld.h b/os/hal/platforms/AT91SAM7/hal_lld.h deleted file mode 100644 index 3828193d27..0000000000 --- a/os/hal/platforms/AT91SAM7/hal_lld.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/hal_lld.h - * @brief AT91SAM7 HAL subsystem low level driver header. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "at91sam7.h" -#include "at91lib/aic.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "AT91SAM7x" - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Default action for the spurious handler, nothing. - */ -#if !defined(AT91SAM7_SPURIOUS_HANDLER_HOOK) || defined(__DOXYGEN__) -#define AT91SAM7_SPURIOUS_HANDLER_HOOK() -#endif - -/** - * @brief Default divider for the USB clock - half the PLL clock. - */ -#if !defined(AT91SAM7_USBDIV) || defined(__DOXYGEN__) -#define AT91SAM7_USBDIV AT91C_CKGR_USBDIV_1 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void at91sam7_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/mac_lld.c b/os/hal/platforms/AT91SAM7/mac_lld.c deleted file mode 100644 index 83f8d6ef1d..0000000000 --- a/os/hal/platforms/AT91SAM7/mac_lld.c +++ /dev/null @@ -1,555 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/mac_lld.c - * @brief AT91SAM7 low level MAC driver code. - * - * @addtogroup MAC - * @{ - */ - -#include - -#include "ch.h" -#include "hal.h" -#include "mii.h" -#include "at91sam7_mii.h" - -#if HAL_USE_MAC || defined(__DOXYGEN__) - -#define EMAC_PIN_MASK (AT91C_PB0_ETXCK_EREFCK | AT91C_PB1_ETXEN | \ - AT91C_PB2_ETX0 | AT91C_PB3_ETX1 | \ - AT91C_PB4_ECRS | AT91C_PB5_ERX0 | \ - AT91C_PB6_ERX1 | AT91C_PB7_ERXER | \ - AT91C_PB8_EMDC | AT91C_PB9_EMDIO | \ - AT91C_PB10_ETX2 | AT91C_PB11_ETX3 | \ - AT91C_PB12_ETXER | AT91C_PB13_ERX2 | \ - AT91C_PB14_ERX3 | AT91C_PB15_ERXDV_ECRSDV | \ - AT91C_PB16_ECOL | AT91C_PB17_ERXCK) - -#define RSR_BITS (AT91C_EMAC_BNA | AT91C_EMAC_REC | AT91C_EMAC_OVR) - -#define TSR_BITS (AT91C_EMAC_UBR | AT91C_EMAC_COL | AT91C_EMAC_RLES | \ - AT91C_EMAC_BEX | AT91C_EMAC_COMP | AT91C_EMAC_UND) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief Ethernet driver 1. - */ -MACDriver ETHD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -#ifndef __DOXYGEN__ - -static uint8_t default_mac[] = {0xAA, 0x55, 0x13, 0x37, 0x01, 0x10}; - -static EMACDescriptor *rxptr; -static EMACDescriptor *txptr; -static EMACDescriptor rd[EMAC_RECEIVE_DESCRIPTORS] - __attribute__((aligned(8))); -static EMACDescriptor td[EMAC_TRANSMIT_DESCRIPTORS] - __attribute__((aligned(8))); -static uint8_t rb[EMAC_RECEIVE_DESCRIPTORS * EMAC_RECEIVE_BUFFERS_SIZE] - __attribute__((aligned(8))); -static uint8_t tb[EMAC_TRANSMIT_DESCRIPTORS * EMAC_TRANSMIT_BUFFERS_SIZE] - __attribute__((aligned(8))); -#endif - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief IRQ handler. - */ -/** @cond never*/ -__attribute__((noinline)) -/** @endcond*/ -static void serve_interrupt(void) { - uint32_t isr, rsr, tsr; - - /* Fix for the EMAC errata */ - isr = AT91C_BASE_EMAC->EMAC_ISR; - rsr = AT91C_BASE_EMAC->EMAC_RSR; - tsr = AT91C_BASE_EMAC->EMAC_TSR; - - if ((isr & AT91C_EMAC_RCOMP) || (rsr & RSR_BITS)) { - if (rsr & AT91C_EMAC_REC) { - chSysLockFromIsr(); - chSemResetI(ÐD1.rdsem, 0); -#if MAC_USE_EVENTS - chEvtBroadcastI(ÐD1.rdevent); -#endif - chSysUnlockFromIsr(); - } - AT91C_BASE_EMAC->EMAC_RSR = RSR_BITS; - } - - if ((isr & AT91C_EMAC_TCOMP) || (tsr & TSR_BITS)) { - if (tsr & AT91C_EMAC_COMP) { - chSysLockFromIsr(); - chSemResetI(ÐD1.tdsem, 0); - chSysUnlockFromIsr(); - } - AT91C_BASE_EMAC->EMAC_TSR = TSR_BITS; - } - AT91C_BASE_AIC->AIC_EOICR = 0; -} - -/** - * @brief Cleans an incomplete frame. - * - * @param[in] from the start position of the incomplete frame - */ -static void cleanup(EMACDescriptor *from) { - - while (from != rxptr) { - from->w1 &= ~W1_R_OWNERSHIP; - if (++from >= &rd[EMAC_RECEIVE_DESCRIPTORS]) - from = rd; - } -} - -/** - * @brief MAC address setup. - * - * @param[in] p pointer to a six bytes buffer containing the MAC - * address - */ -static void set_address(const uint8_t *p) { - - AT91C_BASE_EMAC->EMAC_SA1L = (AT91_REG)((p[3] << 24) | (p[2] << 16) | - (p[1] << 8) | p[0]); - AT91C_BASE_EMAC->EMAC_SA1H = (AT91_REG)((p[5] << 8) | p[4]); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief EMAC IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(irq_handler) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level MAC initialization. - * - * @notapi - */ -void mac_lld_init(void) { - - miiInit(); - macObjectInit(ÐD1); - - /* - * Associated PHY initialization. - */ - miiReset(ÐD1); - - /* - * EMAC pins setup. Note, PB18 is not included because it is - * used as #PD control and not as EF100. - */ - AT91C_BASE_PIOB->PIO_ASR = EMAC_PIN_MASK; - AT91C_BASE_PIOB->PIO_PDR = EMAC_PIN_MASK; - AT91C_BASE_PIOB->PIO_PPUDR = EMAC_PIN_MASK; -} - -/** - * @brief Configures and activates the MAC peripheral. - * - * @param[in] macp pointer to the @p MACDriver object - * - * @notapi - */ -void mac_lld_start(MACDriver *macp) { - unsigned i; - - /* - * Buffers initialization. - */ - for (i = 0; i < EMAC_RECEIVE_DESCRIPTORS; i++) { - rd[i].w1 = (uint32_t)&rb[i * EMAC_RECEIVE_BUFFERS_SIZE]; - rd[i].w2 = 0; - } - rd[EMAC_RECEIVE_DESCRIPTORS - 1].w1 |= W1_R_WRAP; - rxptr = rd; - for (i = 0; i < EMAC_TRANSMIT_DESCRIPTORS; i++) { - td[i].w1 = (uint32_t)&tb[i * EMAC_TRANSMIT_BUFFERS_SIZE]; - td[i].w2 = EMAC_TRANSMIT_BUFFERS_SIZE | W2_T_LAST_BUFFER | W2_T_USED; - } - td[EMAC_TRANSMIT_DESCRIPTORS - 1].w2 |= W2_T_WRAP; - txptr = td; - - /* - * EMAC clock enable. - */ - AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_EMAC; - - /* - * EMAC Initial setup. - */ - AT91C_BASE_EMAC->EMAC_NCR = 0; /* Stopped but MCE active.*/ - AT91C_BASE_EMAC->EMAC_NCFGR = 2 << 10; /* MDC-CLK = MCK / 32 */ - AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN;/* Enable EMAC in MII mode.*/ - AT91C_BASE_EMAC->EMAC_RBQP = (AT91_REG)rd; /* RX descriptors list.*/ - AT91C_BASE_EMAC->EMAC_TBQP = (AT91_REG)td; /* TX descriptors list.*/ - AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_OVR | - AT91C_EMAC_REC | - AT91C_EMAC_BNA; /* Clears RSR.*/ - AT91C_BASE_EMAC->EMAC_NCFGR |= AT91C_EMAC_DRFCS;/* Initial NCFGR settings.*/ - AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TE | - AT91C_EMAC_RE | - AT91C_EMAC_CLRSTAT;/* Initial NCR settings.*/ - if (macp->config->mac_address == NULL) - set_address(default_mac); - else - set_address(macp->config->mac_address); - - /* - * PHY device identification. - */ - AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE; - if ((miiGet(ÐD1, MII_PHYSID1) != (PHY_ID >> 16)) || - ((miiGet(ÐD1, MII_PHYSID2) & 0xFFF0) != (PHY_ID & 0xFFF0))) - chSysHalt(); - AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE; - - /* - * Interrupt configuration. - */ - AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RCOMP | AT91C_EMAC_TCOMP; - AIC_ConfigureIT(AT91C_ID_EMAC, - AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | EMAC_INTERRUPT_PRIORITY, - irq_handler); - AIC_EnableIT(AT91C_ID_EMAC); -} - -/** - * @brief Deactivates the MAC peripheral. - * - * @param[in] macp pointer to the @p MACDriver object - * - * @notapi - */ -void mac_lld_stop(MACDriver *macp) { - - (void)macp; -} - -/** - * @brief Returns a transmission descriptor. - * @details One of the available transmission descriptors is locked and - * returned. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[out] tdp pointer to a @p MACTransmitDescriptor structure - * @return The operation status. - * @retval RDY_OK the descriptor has been obtained. - * @retval RDY_TIMEOUT descriptor not available. - * - * @notapi - */ -msg_t mac_lld_get_transmit_descriptor(MACDriver *macp, - MACTransmitDescriptor *tdp) { - EMACDescriptor *edp; - - (void)macp; - - if (!macp->link_up) - return RDY_TIMEOUT; - - chSysLock(); - edp = txptr; - if (!(edp->w2 & W2_T_USED) || (edp->w2 & W2_T_LOCKED)) { - chSysUnlock(); - return RDY_TIMEOUT; - } - /* - * Set the buffer size and configuration, the buffer is also marked - * as locked. - */ - if (++txptr >= &td[EMAC_TRANSMIT_DESCRIPTORS]) { - edp->w2 = W2_T_LOCKED | W2_T_USED | W2_T_LAST_BUFFER | W2_T_WRAP; - txptr = td; - } - else - edp->w2 = W2_T_LOCKED | W2_T_USED | W2_T_LAST_BUFFER; - chSysUnlock(); - tdp->offset = 0; - tdp->size = EMAC_TRANSMIT_BUFFERS_SIZE; - tdp->physdesc = edp; - return RDY_OK; -} - -/** - * @brief Writes to a transmit descriptor's stream. - * - * @param[in] tdp pointer to a @p MACTransmitDescriptor structure - * @param[in] buf pointer to the buffer containing the data to be - * written - * @param[in] size number of bytes to be written - * @return The number of bytes written into the descriptor's - * stream, this value can be less than the amount - * specified in the parameter @p size if the maximum - * frame size is reached. - * - * @notapi - */ -size_t mac_lld_write_transmit_descriptor(MACTransmitDescriptor *tdp, - uint8_t *buf, - size_t size) { - - if (size > tdp->size - tdp->offset) - size = tdp->size - tdp->offset; - if (size > 0) { - memcpy((uint8_t *)(tdp->physdesc->w1 & W1_T_ADDRESS_MASK) + - tdp->offset, - buf, size); - tdp->offset += size; - } - return size; -} - -/** - * @brief Releases a transmit descriptor and starts the transmission of the - * enqueued data as a single frame. - * - * @param[in] tdp the pointer to the @p MACTransmitDescriptor structure - * - * @notapi - */ -void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp) { - - chSysLock(); - tdp->physdesc->w2 = (tdp->physdesc->w2 & - ~(W2_T_LOCKED | W2_T_USED | W2_T_LENGTH_MASK)) | - tdp->offset; - AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TSTART; - chSysUnlock(); -} - -/** - * @brief Returns a receive descriptor. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[out] rdp pointer to a @p MACReceiveDescriptor structure - * @return The operation status. - * @retval RDY_OK the descriptor has been obtained. - * @retval RDY_TIMEOUT descriptor not available. - * - * @notapi - */ -msg_t mac_lld_get_receive_descriptor(MACDriver *macp, - MACReceiveDescriptor *rdp) { - unsigned n; - EMACDescriptor *edp; - - (void)macp; - n = EMAC_RECEIVE_DESCRIPTORS; - - /* - * Skips unused buffers, if any. - */ -skip: - while ((n > 0) && !(rxptr->w1 & W1_R_OWNERSHIP)) { - if (++rxptr >= &rd[EMAC_RECEIVE_DESCRIPTORS]) - rxptr = rd; - n--; - } - - /* - * Skips fragments, if any, cleaning them up. - */ - while ((n > 0) && (rxptr->w1 & W1_R_OWNERSHIP) && - !(rxptr->w2 & W2_R_FRAME_START)) { - rxptr->w1 &= ~W1_R_OWNERSHIP; - if (++rxptr >= &rd[EMAC_RECEIVE_DESCRIPTORS]) - rxptr = rd; - n--; - } - - /* - * Now compute the total frame size skipping eventual incomplete frames - * or holes... - */ -restart: - edp = rxptr; - while (n > 0) { - if (!(rxptr->w1 & W1_R_OWNERSHIP)) { - /* Empty buffer for some reason... cleaning up the incomplete frame.*/ - cleanup(edp); - goto skip; - } - /* - * End Of Frame found. - */ - if (rxptr->w2 & W2_R_FRAME_END) { - rdp->offset = 0; - rdp->size = rxptr->w2 & W2_T_LENGTH_MASK; - rdp->physdesc = edp; - return RDY_OK; - } - - if ((edp != rxptr) && (rxptr->w2 & W2_R_FRAME_START)) { - /* Found another start... cleaning up the incomplete frame.*/ - cleanup(edp); - goto restart; /* Another start buffer for some reason... */ - } - - if (++rxptr >= &rd[EMAC_RECEIVE_DESCRIPTORS]) - rxptr = rd; - n--; - } - return RDY_TIMEOUT; -} - -/** - * @brief Reads from a receive descriptor's stream. - * - * @param[in] rdp pointer to a @p MACReceiveDescriptor structure - * @param[in] buf pointer to the buffer that will receive the read data - * @param[in] size number of bytes to be read - * @return The number of bytes read from the descriptor's - * stream, this value can be less than the amount - * specified in the parameter @p size if there are - * no more bytes to read. - * - * @notapi - */ -size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp, - uint8_t *buf, - size_t size) { - if (size > rdp->size - rdp->offset) - size = rdp->size - rdp->offset; - if (size > 0) { - uint8_t *src = (uint8_t *)(rdp->physdesc->w1 & W1_R_ADDRESS_MASK) + - rdp->offset; - uint8_t *limit = &rb[EMAC_RECEIVE_DESCRIPTORS * EMAC_RECEIVE_BUFFERS_SIZE]; - if (src >= limit) - src -= EMAC_RECEIVE_DESCRIPTORS * EMAC_RECEIVE_BUFFERS_SIZE; - if (src + size > limit ) { - memcpy(buf, src, (size_t)(limit - src)); - memcpy(buf + (size_t)(limit - src), rb, size - (size_t)(limit - src)); - } - else - memcpy(buf, src, size); - rdp->offset += size; - } - return size; -} - -/** - * @brief Releases a receive descriptor. - * @details The descriptor and its buffer are made available for more incoming - * frames. - * - * @param[in] rdp the pointer to the @p MACReceiveDescriptor structure - * - * @notapi - */ -void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp) { - bool_t done; - EMACDescriptor *edp = rdp->physdesc; - - unsigned n = EMAC_RECEIVE_DESCRIPTORS; - do { - done = ((edp->w2 & W2_R_FRAME_END) != 0); - chDbgAssert(edp->w1 & W1_R_OWNERSHIP, - "mac_lld_release_receive_descriptor(), #1", - "found not owned descriptor"); - edp->w1 &= ~(W1_R_OWNERSHIP | W2_R_FRAME_START | W2_R_FRAME_END); - if (++edp >= &rd[EMAC_RECEIVE_DESCRIPTORS]) - edp = rd; - n--; - } - while ((n > 0) && !done); - /* - * Make rxptr point to the descriptor where the next frame will most - * likely appear. - */ - rxptr = edp; -} - -/** - * @brief Updates and returns the link status. - * - * @param[in] macp pointer to the @p MACDriver object - * @return The link status. - * @retval TRUE if the link is active. - * @retval FALSE if the link is down. - * - * @notapi - */ -bool_t mac_lld_poll_link_status(MACDriver *macp) { - uint32_t ncfgr, bmsr, bmcr, lpa; - - AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE; - (void)miiGet(macp, MII_BMSR); - bmsr = miiGet(macp, MII_BMSR); - if (!(bmsr & BMSR_LSTATUS)) { - AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE; - return macp->link_up = FALSE; - } - - ncfgr = AT91C_BASE_EMAC->EMAC_NCFGR & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD); - bmcr = miiGet(macp, MII_BMCR); - if (bmcr & BMCR_ANENABLE) { - lpa = miiGet(macp, MII_LPA); - if (lpa & (LPA_100HALF | LPA_100FULL | LPA_100BASE4)) - ncfgr |= AT91C_EMAC_SPD; - if (lpa & (LPA_10FULL | LPA_100FULL)) - ncfgr |= AT91C_EMAC_FD; - } - else { - if (bmcr & BMCR_SPEED100) - ncfgr |= AT91C_EMAC_SPD; - if (bmcr & BMCR_FULLDPLX) - ncfgr |= AT91C_EMAC_FD; - } - AT91C_BASE_EMAC->EMAC_NCFGR = ncfgr; - AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE; - return macp->link_up = TRUE; -} - -#endif /* HAL_USE_MAC */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/mac_lld.h b/os/hal/platforms/AT91SAM7/mac_lld.h deleted file mode 100644 index 33613b45dc..0000000000 --- a/os/hal/platforms/AT91SAM7/mac_lld.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/mac_lld.h - * @brief AT91SAM7 low level MAC driver header. - * - * @addtogroup MAC - * @{ - */ - -#ifndef _MAC_LLD_H_ -#define _MAC_LLD_H_ - -#if HAL_USE_MAC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define EMAC_RECEIVE_BUFFERS_SIZE 128 /* Do not modify */ -#define EMAC_TRANSMIT_BUFFERS_SIZE MAC_BUFFERS_SIZE -#define EMAC_RECEIVE_DESCRIPTORS \ - (((((MAC_BUFFERS_SIZE - 1) | (EMAC_RECEIVE_BUFFERS_SIZE - 1)) + 1) \ - / EMAC_RECEIVE_BUFFERS_SIZE) * MAC_RECEIVE_BUFFERS) -#define EMAC_TRANSMIT_DESCRIPTORS MAC_TRANSMIT_BUFFERS - -#define W1_R_OWNERSHIP 0x00000001 -#define W1_R_WRAP 0x00000002 -#define W1_R_ADDRESS_MASK 0xFFFFFFFC - -#define W2_R_LENGTH_MASK 0x00000FFF -#define W2_R_FRAME_START 0x00004000 -#define W2_R_FRAME_END 0x00008000 -#define W2_R_CFI 0x00010000 -#define W2_R_VLAN_PRIO_MASK 0x000E0000 -#define W2_R_PRIO_TAG_DETECTED 0x00100000 -#define W2_R_VLAN_TAG_DETECTED 0x00200000 -#define W2_R_TYPE_ID_MATCH 0x00400000 -#define W2_R_ADDR4_MATCH 0x00800000 -#define W2_R_ADDR3_MATCH 0x01000000 -#define W2_R_ADDR2_MATCH 0x02000000 -#define W2_R_ADDR1_MATCH 0x04000000 -#define W2_R_RFU1 0x08000000 -#define W2_R_ADDR_EXT_MATCH 0x10000000 -#define W2_R_UNICAST_MATCH 0x20000000 -#define W2_R_MULTICAST_MATCH 0x40000000 -#define W2_R_BROADCAST_DETECTED 0x80000000 - -#define W1_T_ADDRESS_MASK 0xFFFFFFFF - -#define W2_T_LENGTH_MASK 0x000007FF -#define W2_T_LOCKED 0x00000800 /* Not an EMAC flag. */ -#define W2_T_RFU1 0x00003000 -#define W2_T_LAST_BUFFER 0x00008000 -#define W2_T_NO_CRC 0x00010000 -#define W2_T_RFU2 0x07FE0000 -#define W2_T_BUFFERS_EXHAUSTED 0x08000000 -#define W2_T_TRANSMIT_UNDERRUN 0x10000000 -#define W2_T_RETRY_LIMIT_EXC 0x20000000 -#define W2_T_WRAP 0x40000000 -#define W2_T_USED 0x80000000 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Number of available transmit buffers. - */ -#if !defined(MAC_TRANSMIT_BUFFERS) || defined(__DOXYGEN__) -#define MAC_TRANSMIT_BUFFERS 2 -#endif - -/** - * @brief Number of available receive buffers. - */ -#if !defined(MAC_RECEIVE_BUFFERS) || defined(__DOXYGEN__) -#define MAC_RECEIVE_BUFFERS 2 -#endif - -/** - * @brief Maximum supported frame size. - */ -#if !defined(MAC_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define MAC_BUFFERS_SIZE 1518 -#endif - -/** - * @brief Interrupt priority level for the EMAC device. - */ -#if !defined(EMAC_INTERRUPT_PRIORITY) || defined(__DOXYGEN__) -#define EMAC_INTERRUPT_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 3) -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Structure representing a buffer physical descriptor. - * @note It represents both descriptor types. - */ -typedef struct { - uint32_t w1; - uint32_t w2; -} EMACDescriptor; - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief MAC address. - */ - uint8_t *mac_address; - /* End of the mandatory fields.*/ -} MACConfig; - -/** - * @brief Structure representing a MAC driver. - */ -struct MACDriver { - /** - * @brief Driver state. - */ - macstate_t state; - /** - * @brief Current configuration data. - */ - const MACConfig *config; - /** - * @brief Transmit semaphore. - */ - Semaphore tdsem; - /** - * @brief Receive semaphore. - */ - Semaphore rdsem; -#if MAC_USE_EVENTS || defined(__DOXYGEN__) - /** - * @brief Receive event. - */ - EventSource rdevent; -#endif - /* End of the mandatory fields.*/ - /** - * @brief Link status flag. - */ - bool_t link_up; -}; - -/** - * @brief Structure representing a transmit descriptor. - */ -typedef struct { - /** - * @brief Current write offset. - */ - size_t offset; - /** - * @brief Available space size. - */ - size_t size; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the physical descriptor. - */ - EMACDescriptor *physdesc; -} MACTransmitDescriptor; - -/** - * @brief Structure representing a receive descriptor. - */ -typedef struct { - /** - * @brief Current read offset. - */ - size_t offset; - /** - * @brief Available data size. - */ - size_t size; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the first descriptor of the buffers chain. - */ - EMACDescriptor *physdesc; -} MACReceiveDescriptor; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern MACDriver ETHD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void mac_lld_init(void); - void mac_lld_start(MACDriver *macp); - void mac_lld_stop(MACDriver *macp); - msg_t mac_lld_get_transmit_descriptor(MACDriver *macp, - MACTransmitDescriptor *tdp); - size_t mac_lld_write_transmit_descriptor(MACTransmitDescriptor *tdp, - uint8_t *buf, - size_t size); - void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp); - msg_t mac_lld_get_receive_descriptor(MACDriver *macp, - MACReceiveDescriptor *rdp); - size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp, - uint8_t *buf, - size_t size); - void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp); - bool_t mac_lld_poll_link_status(MACDriver *macp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_MAC */ - -#endif /* _MAC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/pal_lld.c b/os/hal/platforms/AT91SAM7/pal_lld.c deleted file mode 100644 index 733345c957..0000000000 --- a/os/hal/platforms/AT91SAM7/pal_lld.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/pal_lld.c - * @brief AT91SAM7 PIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief AT91SAM7 I/O ports configuration. - * @details PIO registers initialization. - * - * @param[in] config the AT91SAM7 ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - uint32_t ports = (1 << AT91C_ID_PIOA); -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - ports |= (1 << AT91C_ID_PIOB); -#endif - AT91C_BASE_PMC->PMC_PCER = ports; - - /* - * PIOA setup. - */ - AT91C_BASE_PIOA->PIO_PPUER = config->P0Data.pusr; /* Pull-up as spec.*/ - AT91C_BASE_PIOA->PIO_PPUDR = ~config->P0Data.pusr; - AT91C_BASE_PIOA->PIO_PER = 0xFFFFFFFF; /* PIO enabled.*/ - AT91C_BASE_PIOA->PIO_ODSR = config->P0Data.odsr; /* Data as specified.*/ - AT91C_BASE_PIOA->PIO_OER = config->P0Data.osr; /* Dir. as specified.*/ - AT91C_BASE_PIOA->PIO_ODR = ~config->P0Data.osr; - AT91C_BASE_PIOA->PIO_IFDR = 0xFFFFFFFF; /* Filter disabled.*/ - AT91C_BASE_PIOA->PIO_IDR = 0xFFFFFFFF; /* Int. disabled.*/ - AT91C_BASE_PIOA->PIO_MDDR = 0xFFFFFFFF; /* Push Pull drive.*/ - AT91C_BASE_PIOA->PIO_ASR = 0xFFFFFFFF; /* Peripheral A.*/ - AT91C_BASE_PIOA->PIO_OWER = 0xFFFFFFFF; /* Write enabled.*/ - - /* - * PIOB setup. - */ -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - AT91C_BASE_PIOB->PIO_PPUER = config->P1Data.pusr; /* Pull-up as spec.*/ - AT91C_BASE_PIOB->PIO_PPUDR = ~config->P1Data.pusr; - AT91C_BASE_PIOB->PIO_PER = 0xFFFFFFFF; /* PIO enabled.*/ - AT91C_BASE_PIOB->PIO_ODSR = config->P1Data.odsr; /* Data as specified.*/ - AT91C_BASE_PIOB->PIO_OER = config->P1Data.osr; /* Dir. as specified.*/ - AT91C_BASE_PIOB->PIO_ODR = ~config->P1Data.osr; - AT91C_BASE_PIOB->PIO_IFDR = 0xFFFFFFFF; /* Filter disabled.*/ - AT91C_BASE_PIOB->PIO_IDR = 0xFFFFFFFF; /* Int. disabled.*/ - AT91C_BASE_PIOB->PIO_MDDR = 0xFFFFFFFF; /* Push Pull drive.*/ - AT91C_BASE_PIOB->PIO_ASR = 0xFFFFFFFF; /* Peripheral A.*/ - AT91C_BASE_PIOB->PIO_OWER = 0xFFFFFFFF; /* Write enabled.*/ -#endif -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note This function is not meant to be invoked directly from the - * application code. - * @note @p PAL_MODE_RESET is implemented as input with pull-up. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * @note @p PAL_MODE_OUTPUT_OPENDRAIN also enables the pull-up resistor. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT_PULLUP: - port->PIO_PPUER = mask; - port->PIO_ODR = mask; - break; - case PAL_MODE_INPUT: - case PAL_MODE_INPUT_ANALOG: - port->PIO_PPUDR = mask; - port->PIO_ODR = mask; - break; - case PAL_MODE_UNCONNECTED: - port->PIO_SODR = mask; - /* Falls in */ - case PAL_MODE_OUTPUT_PUSHPULL: - port->PIO_PPUDR = mask; - port->PIO_OER = mask; - port->PIO_MDDR = mask; - break; - case PAL_MODE_OUTPUT_OPENDRAIN: - port->PIO_PPUER = mask; - port->PIO_OER = mask; - port->PIO_MDER = mask; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/pal_lld.h b/os/hal/platforms/AT91SAM7/pal_lld.h deleted file mode 100644 index fa0ad22d4b..0000000000 --- a/os/hal/platforms/AT91SAM7/pal_lld.h +++ /dev/null @@ -1,258 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/pal_lld.h - * @brief AT91SAM7 PIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLDOWN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief PIO port setup info. - */ -typedef struct { - /** Initial value for ODSR register (data).*/ - uint32_t odsr; - /** Initial value for OSR register (direction).*/ - uint32_t osr; - /** Initial value for PUSR register (Pull-ups).*/ - uint32_t pusr; -} at91sam7_pio_setup_t; - -/** - * @brief AT91SAM7 PIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialize the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { - /** @brief Port 0 setup data.*/ - at91sam7_pio_setup_t P0Data; -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) || defined(__DOXYGEN__) - /** @brief Port 1 setup data.*/ - at91sam7_pio_setup_t P1Data; -#endif -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @details This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - * @details This type can be a scalar or some kind of pointer, do not make - * any assumption about it, use the provided macros when populating - * variables of this type. - */ -typedef AT91PS_PIO ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief PIO port A identifier. - */ -#define IOPORT1 AT91C_BASE_PIOA - -/** - * @brief PIO port B identifier. - */ -#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) || defined(__DOXYGEN__) -#define IOPORT2 AT91C_BASE_PIOB -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads the physical I/O port states. - * @details This function is implemented by reading the PIO_PDSR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->PIO_PDSR) - -/** - * @brief Reads the output latch. - * @details This function is implemented by reading the PIO_ODSR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->PIO_ODSR) - -/** - * @brief Writes a bits mask on a I/O port. - * @details This function is implemented by writing the PIO_ODSR register, the - * implementation has no side effects. - * - * @param[in] port the port identifier - * @param[in] bits the bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->PIO_ODSR = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @details This function is implemented by writing the PIO_SODR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) ((port)->PIO_SODR = (bits)) - -/** - * @brief Clears a bits mask on a I/O port. - * @details This function is implemented by writing the PIO_CODR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) ((port)->PIO_CODR = (bits)) - -/** - * @brief Writes a group of bits. - * @details This function is implemented by writing the PIO_OWER, PIO_ODSR and - * PIO_OWDR registers, the implementation is not atomic because the - * multiple accesses. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset the group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group - * width are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - ((port)->PIO_OWER = (mask) << (offset), \ - (port)->PIO_ODSR = (bits) << (offset), \ - (port)->PIO_OWDR = (mask) << (offset)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Writes a logical state on an output pad. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) pal_lld_writegroup(port, 1, pad, bit) - -extern const PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/platform.dox b/os/hal/platforms/AT91SAM7/platform.dox deleted file mode 100644 index a3414d95c9..0000000000 --- a/os/hal/platforms/AT91SAM7/platform.dox +++ /dev/null @@ -1,140 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup AT91SAM7 AT91SAM7 Drivers - * @details This section describes all the supported drivers on the AT91SAM7 - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup AT91SAM7_HAL AT91SAM7 Initialization Support - * @details The AT91SAM7 HAL support is responsible for system initialization. - * - * @section at91sam7_hal_1 Supported HW resources - * - MC. - * - PMC. - * . - * @section at91sam7_hal_2 AT91SAM7 HAL driver implementation features - * - PLLs startup and stabilization. - * - Clock source selection. - * - Flash wait states. - * . -* @ingroup AT91SAM7 - */ - -/** - * @defgroup AT91SAM7_MAC AT91SAM7 MAC Support - * @details The AT91SAM7 MAC driver supports the EMAC peripheral. - * - * @section at91sam7_mac_1 Supported HW resources - * - EMAC. - * . - * @ingroup AT91SAM7 - */ - -/** - * @defgroup AT91SAM7_MII AT91SAM7 MII Support - * @details This driver supports the AT91SAM7 EMAC peripheral communicating - * with an external PHY transceiver. The driver currently supports - * the Micrel KS8721 PHY and the Davicom DV9161 modules. This driver - * is used internally by the MAC driver. - * - * @ingroup AT91SAM7 - */ - -/** - * @defgroup AT91SAM7_PAL AT91SAM7 PAL Support - * @details The AT91SAM7 PAL driver supports the PIO peripherals. - * - * @section at91sam7_pal_1 Supported HW resources - * - PIOA. - * - PIOB. - * . - * @section at91sam7_pal_2 AT91SAM7 PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 32 bits wide ports. - * - Atomic set/reset functions. - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section at91sam7_pal_3 Supported PAL setup modes - * The AT91SAM7 PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_ANALOG (same as @p PAL_MODE_INPUT). - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section at91sam7_pal_4 Suboptimal behavior - * The AT91SAM7 PIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup AT91SAM7 - */ - -/** - * @defgroup AT91SAM7_SERIAL AT91SAM7 Serial Support - * @details The AT91SAM7 Serial driver uses the USART/UART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section at91sam7_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - DBGU. - * . - * @section at91sam7_serial_2 AT91SAM7 Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable priority levels for each USART. - * . - * @ingroup AT91SAM7 - */ - -/** - * @defgroup AT91SAM7_SPI AT91SAM7 SPI Support - * @details The SPI driver supports the AT91SAM7 SPI peripherals using DMA - * channels for maximum performance. - * - * @section at91sam7_spi_1 Supported HW resources - * - SPI1. - * - SPI2. - * . - * @section at91sam7_spi_2 AT91SAM7 SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SPI can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each SPI. - * - DMA is used for receiving and transmitting. - * . - * @ingroup AT91SAM7 - */ diff --git a/os/hal/platforms/AT91SAM7/platform.mk b/os/hal/platforms/AT91SAM7/platform.mk deleted file mode 100644 index 83b53491a6..0000000000 --- a/os/hal/platforms/AT91SAM7/platform.mk +++ /dev/null @@ -1,12 +0,0 @@ -# List of all the AT91SAM7 platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/AT91SAM7/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/ext_lld.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/mac_lld.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/at91sam7_mii.c \ - ${CHIBIOS}/os/hal/platforms/AT91SAM7/at91lib/aic.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/AT91SAM7 diff --git a/os/hal/platforms/AT91SAM7/serial_lld.c b/os/hal/platforms/AT91SAM7/serial_lld.c deleted file mode 100644 index 33917b38f9..0000000000 --- a/os/hal/platforms/AT91SAM7/serial_lld.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/serial_lld.c - * @brief AT91SAM7 low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -#if (SAM7_PLATFORM == SAM7S64) || (SAM7_PLATFORM == SAM7S128) || \ - (SAM7_PLATFORM == SAM7S256) || (SAM7_PLATFORM == SAM7S512) - -#define SAM7_USART0_RX AT91C_PA5_RXD0 -#define SAM7_USART0_TX AT91C_PA6_TXD0 -#define SAM7_USART1_RX AT91C_PA21_RXD1 -#define SAM7_USART1_TX AT91C_PA22_TXD1 -#define SAM7_DBGU_RX AT91C_PA9_DRXD -#define SAM7_DBGU_TX AT91C_PA10_DTXD - -#elif (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \ - (SAM7_PLATFORM == SAM7X512) - -#define SAM7_USART0_RX AT91C_PA0_RXD0 -#define SAM7_USART0_TX AT91C_PA1_TXD0 -#define SAM7_USART1_RX AT91C_PA5_RXD1 -#define SAM7_USART1_TX AT91C_PA6_TXD1 -#define SAM7_DBGU_RX AT91C_PA27_DRXD -#define SAM7_DBGU_TX AT91C_PA28_DTXD - -#else -#error "serial lines not defined for this SAM7 version" -#endif - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if USE_SAM7_USART0 || defined(__DOXYGEN__) -/** @brief USART0 serial driver identifier.*/ -SerialDriver SD1; -#endif - -#if USE_SAM7_USART1 || defined(__DOXYGEN__) -/** @brief USART1 serial driver identifier.*/ -SerialDriver SD2; -#endif - -#if USE_SAM7_DBGU_UART || defined(__DOXYGEN__) -/** @brief DBGU_UART serial driver identifier.*/ -SerialDriver SD3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | - AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief USART initialization. - * - * @param[in] sdp communication channel associated to the USART - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart_init(SerialDriver *sdp, const SerialConfig *config) { - AT91PS_USART u = sdp->usart; - - /* Disables IRQ sources and stop operations.*/ - u->US_IDR = 0xFFFFFFFF; - u->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RSTSTA; - - /* New parameters setup.*/ - if (config->sc_mr & AT91C_US_OVER) - u->US_BRGR = MCK / (config->sc_speed * 8); - else - u->US_BRGR = MCK / (config->sc_speed * 16); - u->US_MR = config->sc_mr; - u->US_RTOR = 0; - u->US_TTGR = 0; - - /* Enables operations and IRQ sources.*/ - u->US_CR = AT91C_US_RXEN | AT91C_US_TXEN | AT91C_US_DTREN | AT91C_US_RTSEN; - u->US_IER = AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE | - AT91C_US_RXBRK; -} - -/** - * @brief USART de-initialization. - * - * @param[in] u pointer to an USART I/O block - */ -static void usart_deinit(AT91PS_USART u) { - - /* Disables IRQ sources and stop operations.*/ - u->US_IDR = 0xFFFFFFFF; - u->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RSTSTA; - u->US_MR = 0; - u->US_RTOR = 0; - u->US_TTGR = 0; -} - -/** - * @brief Error handling routine. - * - * @param[in] err USART CSR register value - * @param[in] sdp communication channel associated to the USART - */ -static void set_error(SerialDriver *sdp, AT91_REG csr) { - flagsmask_t sts = 0; - - if (csr & AT91C_US_OVRE) - sts |= SD_OVERRUN_ERROR; - if (csr & AT91C_US_PARE) - sts |= SD_PARITY_ERROR; - if (csr & AT91C_US_FRAME) - sts |= SD_FRAMING_ERROR; - if (csr & AT91C_US_RXBRK) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -#if defined(__GNUC__) -__attribute__((noinline)) -#endif -#if !USE_SAM7_DBGU_UART -static -#endif -/** - * @brief Common IRQ handler. - * - * @param[in] sdp communication channel associated to the USART - */ -void sd_lld_serve_interrupt(SerialDriver *sdp) { - uint32_t csr; - AT91PS_USART u = sdp->usart; - - csr = u->US_CSR; - if (csr & AT91C_US_RXRDY) { - chSysLockFromIsr(); - sdIncomingDataI(sdp, u->US_RHR); - chSysUnlockFromIsr(); - } - if ((u->US_IMR & AT91C_US_TXRDY) && (csr & AT91C_US_TXRDY)) { - msg_t b; - - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - u->US_IDR = AT91C_US_TXRDY; - } - else - u->US_THR = b; - chSysUnlockFromIsr(); - } - csr &= (AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE | AT91C_US_RXBRK); - if (csr != 0) { - set_error(sdp, csr); - u->US_CR = AT91C_US_RSTSTA; - } - AT91C_BASE_AIC->AIC_EOICR = 0; -} - -#if USE_SAM7_USART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - AT91C_BASE_US0->US_IER = AT91C_US_TXRDY; -} -#endif - -#if USE_SAM7_USART1 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - AT91C_BASE_US1->US_IER = AT91C_US_TXRDY; -} -#endif - -#if USE_SAM7_DBGU_UART || defined(__DOXYGEN__) -static void notify3(GenericQueue *qp) { - - (void)qp; - AT91C_BASE_DBGU->DBGU_IER = AT91C_US_TXRDY; -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if USE_SAM7_USART0 || defined(__DOXYGEN__) -/** - * @brief USART0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART0IrqHandler) { - - CH_IRQ_PROLOGUE(); - sd_lld_serve_interrupt(&SD1); - AT91C_BASE_AIC->AIC_EOICR = 0; - CH_IRQ_EPILOGUE(); -} -#endif - -#if USE_SAM7_USART1 || defined(__DOXYGEN__) -/** - * @brief USART1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART1IrqHandler) { - - CH_IRQ_PROLOGUE(); - sd_lld_serve_interrupt(&SD2); - AT91C_BASE_AIC->AIC_EOICR = 0; - CH_IRQ_EPILOGUE(); -} -#endif - -/* note - DBGU_UART IRQ is the SysIrq in board.c - since it's not vectored separately by the AIC.*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if USE_SAM7_USART0 - sdObjectInit(&SD1, NULL, notify1); - SD1.usart = AT91C_BASE_US0; - AT91C_BASE_PIOA->PIO_PDR = SAM7_USART0_RX | SAM7_USART0_TX; - AT91C_BASE_PIOA->PIO_ASR = SAM7_USART0_RX | SAM7_USART0_TX; - AT91C_BASE_PIOA->PIO_PPUDR = SAM7_USART0_RX | SAM7_USART0_TX; - AIC_ConfigureIT(AT91C_ID_US0, - AT91C_AIC_SRCTYPE_HIGH_LEVEL | SAM7_USART0_PRIORITY, - USART0IrqHandler); -#endif - -#if USE_SAM7_USART1 - sdObjectInit(&SD2, NULL, notify2); - SD2.usart = AT91C_BASE_US1; - AT91C_BASE_PIOA->PIO_PDR = SAM7_USART1_RX | SAM7_USART1_TX; - AT91C_BASE_PIOA->PIO_ASR = SAM7_USART1_RX | SAM7_USART1_TX; - AT91C_BASE_PIOA->PIO_PPUDR = SAM7_USART1_RX | SAM7_USART1_TX; - AIC_ConfigureIT(AT91C_ID_US1, - AT91C_AIC_SRCTYPE_HIGH_LEVEL | SAM7_USART1_PRIORITY, - USART1IrqHandler); -#endif - -#if USE_SAM7_DBGU_UART - sdObjectInit(&SD3, NULL, notify3); - /* this is a little cheap, but OK for now since there's enough overlap - between dbgu and usart register maps. it means we can reuse all the - same usart interrupt handling and config that already exists.*/ - SD3.usart = (AT91PS_USART)AT91C_BASE_DBGU; - AT91C_BASE_PIOA->PIO_PDR = SAM7_DBGU_RX | SAM7_DBGU_TX; - AT91C_BASE_PIOA->PIO_ASR = SAM7_DBGU_RX | SAM7_DBGU_TX; - AT91C_BASE_PIOA->PIO_PPUDR = SAM7_DBGU_RX | SAM7_DBGU_TX; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if USE_SAM7_USART0 - if (&SD1 == sdp) { - /* Starts the clock and clears possible sources of immediate interrupts.*/ - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_US0); - /* Enables associated interrupt vector.*/ - AIC_EnableIT(AT91C_ID_US0); - } -#endif -#if USE_SAM7_USART1 - if (&SD2 == sdp) { - /* Starts the clock and clears possible sources of immediate interrupts.*/ - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_US1); - /* Enables associated interrupt vector.*/ - AIC_EnableIT(AT91C_ID_US1); - } -#endif - /* Note - no explicit start for SD3 (DBGU_UART) since it's not included - in the AIC or PMC.*/ - } - usart_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - usart_deinit(sdp->usart); -#if USE_SAM7_USART0 - if (&SD1 == sdp) { - AT91C_BASE_PMC->PMC_PCDR = (1 << AT91C_ID_US0); - AIC_DisableIT(AT91C_ID_US0); - return; - } -#endif -#if USE_SAM7_USART1 - if (&SD2 == sdp) { - AT91C_BASE_PMC->PMC_PCDR = (1 << AT91C_ID_US1); - AIC_DisableIT(AT91C_ID_US1); - return; - } -#endif -#if USE_SAM7_DBGU_UART - if (&SD3 == sdp) { - AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF; - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/serial_lld.h b/os/hal/platforms/AT91SAM7/serial_lld.h deleted file mode 100644 index 283a051499..0000000000 --- a/os/hal/platforms/AT91SAM7/serial_lld.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/serial_lld.h - * @brief AT91SAM7 low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief UART0 driver enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SAM7_USART0) || defined(__DOXYGEN__) -#define USE_SAM7_USART0 TRUE -#endif - -/** - * @brief UART1 driver enable switch. - * @details If set to @p TRUE the support for USART2 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SAM7_USART1) || defined(__DOXYGEN__) -#define USE_SAM7_USART1 TRUE -#endif - -/** - * @brief DBGU UART driver enable switch. - * @details If set to @p TRUE the support for the DBGU UART is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SAM7_DBGU_UART) || defined(__DOXYGEN__) -#define USE_SAM7_DBGU_UART TRUE -#endif - -/** - * @brief UART1 interrupt priority level setting. - */ -#if !defined(SAM7_USART0_PRIORITY) || defined(__DOXYGEN__) -#define SAM7_USART0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#endif - -/** - * @brief UART2 interrupt priority level setting. - */ -#if !defined(SAM7_USART1_PRIORITY) || defined(__DOXYGEN__) -#define SAM7_USART1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#endif - -/** - * @brief DBGU_UART interrupt priority level setting. - */ -#if !defined(SAM7_DBGU_UART_PRIORITY) || defined(__DOXYGEN__) -#define SAM7_DBGU_UART_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2) -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief AT91SAM7 Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Bit rate. - * @details This is written to the US_BRGR register of the appropriate AT91S_USART - */ - uint32_t sc_speed; - /** - * @brief Initialization value for the MR register. - * @details This is written to the US_MR register of the appropriate AT91S_USART - */ - uint32_t sc_mr; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the USART registers block.*/ \ - AT91PS_USART usart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_SAM7_USART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_SAM7_USART1 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif -#if USE_SAM7_DBGU_UART -extern SerialDriver SD3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#if USE_SAM7_DBGU_UART - void sd_lld_serve_interrupt(SerialDriver *sdp); -#endif -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/spi_lld.c b/os/hal/platforms/AT91SAM7/spi_lld.c deleted file mode 100644 index 78da9dedbd..0000000000 --- a/os/hal/platforms/AT91SAM7/spi_lld.c +++ /dev/null @@ -1,401 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/spi_lld.c - * @brief AT91SAM7 low level SPI driver code. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if AT91SAM7_SPI_USE_SPI0 || defined(__DOXYGEN__) -/** @brief SPI1 driver identifier.*/ -SPIDriver SPID1; -#endif - -#if AT91SAM7_SPI_USE_SPI1 || defined(__DOXYGEN__) -/** @brief SPI2 driver identifier.*/ -SPIDriver SPID2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief Idle line value. - * @details This thing's DMA apparently does not allow to *not* increment - * the memory pointer so a buffer filled with ones is required - * somewhere. - * @note This buffer size also limits the maximum transfer size, 512B, - * for @p spiReceive() and @p spiIgnore(). @p spiSend() and - * @p spiExchange are not affected. - */ -static const uint16_t idle_buf[] = { - 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, 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, 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, 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, - 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, 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, 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, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes a SPI device. - */ -static void spi_init(AT91PS_SPI spi) { - - /* Software reset must be written twice (errata for revision B parts).*/ - spi->SPI_CR = AT91C_SPI_SWRST; - spi->SPI_CR = AT91C_SPI_SWRST; - spi->SPI_RCR = 0; - spi->SPI_RNCR = 0; - spi->SPI_TCR = 0; - spi->SPI_TNCR = 0; - spi->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS; - spi->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS; -} - -#if defined(__GNUC__) -__attribute__((noinline)) -#endif -/** - * @brief Shared interrupt handling code. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void spi_lld_serve_interrupt(SPIDriver *spip) { - uint32_t sr = spip->spi->SPI_SR; - - if ((sr & AT91C_SPI_ENDRX) != 0) { - (void)spip->spi->SPI_RDR; /* Clears eventual overflow.*/ - spip->spi->SPI_PTCR = AT91C_PDC_RXTDIS | - AT91C_PDC_TXTDIS; /* PDC disabled. */ - spip->spi->SPI_IDR = AT91C_SPI_ENDRX; /* Interrupt disabled. */ - spip->spi->SPI_CR = AT91C_SPI_SPIDIS; /* SPI disabled. */ - /* Portable SPI ISR code defined in the high level driver, note, it is - a macro.*/ - _spi_isr_code(spip); - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if AT91SAM7_SPI_USE_SPI0 || defined(__DOXYGEN__) -/** - * @brief SPI0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPI0IrqHandler) { - - CH_IRQ_PROLOGUE(); - spi_lld_serve_interrupt(&SPID1); - AT91C_BASE_AIC->AIC_EOICR = 0; - CH_IRQ_EPILOGUE(); -} -#endif - -#if AT91SAM7_SPI_USE_SPI1 || defined(__DOXYGEN__) -/** - * @brief SPI1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPI1IrqHandler) { - - CH_IRQ_PROLOGUE(); - spi_lld_serve_interrupt(&SPID2); - AT91C_BASE_AIC->AIC_EOICR = 0; - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - -#if AT91SAM7_SPI_USE_SPI0 - spiObjectInit(&SPID1); - SPID1.spi = AT91C_BASE_SPI0; - spi_init(AT91C_BASE_SPI0); - AT91C_BASE_PIOA->PIO_PDR = SPI0_MISO | SPI0_MOSI | SPI0_SCK; - AT91C_BASE_PIOA->PIO_ASR = SPI0_MISO | SPI0_MOSI | SPI0_SCK; - AT91C_BASE_PIOA->PIO_PPUDR = SPI0_MISO | SPI0_MOSI | SPI0_SCK; - AIC_ConfigureIT(AT91C_ID_SPI0, - AT91C_AIC_SRCTYPE_HIGH_LEVEL | AT91SAM7_SPI0_PRIORITY, - SPI0IrqHandler); -#endif - -#if AT91SAM7_SPI_USE_SPI1 - spiObjectInit(&SPID2); - SPID2.spi = AT91C_BASE_SPI1; - spi_init(AT91C_BASE_SPI1); - AT91C_BASE_PIOA->PIO_PDR = SPI1_MISO | SPI1_MOSI | SPI1_SCK; - AT91C_BASE_PIOA->PIO_BSR = SPI1_MISO | SPI1_MOSI | SPI1_SCK; - AT91C_BASE_PIOA->PIO_PPUDR = SPI1_MISO | SPI1_MOSI | SPI1_SCK; - AIC_ConfigureIT(AT91C_ID_SPI1, - AT91C_AIC_SRCTYPE_HIGH_LEVEL | AT91SAM7_SPI1_PRIORITY, - SPI1IrqHandler); -#endif -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - if (spip->state == SPI_STOP) { -#if AT91SAM7_SPI_USE_SPI0 - if (&SPID1 == spip) { - /* Clock activation.*/ - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI0); - /* Enables associated interrupt vector.*/ - AIC_EnableIT(AT91C_ID_SPI0); - } -#endif -#if AT91SAM7_SPI_USE_SPI1 - if (&SPID2 == spip) { - /* Clock activation.*/ - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI1); - /* Enables associated interrupt vector.*/ - AIC_EnableIT(AT91C_ID_SPI1); - } -#endif - } - /* Configuration.*/ - spip->spi->SPI_CSR[0] = spip->config->csr; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - if (spip->state != SPI_STOP) { -#if AT91SAM7_SPI_USE_SPI0 - if (&SPID1 == spip) { - AT91C_BASE_PMC->PMC_PCDR = (1 << AT91C_ID_SPI0); - AIC_DisableIT(AT91C_ID_SPI0); - } -#endif -#if AT91SAM7_SPI_USE_SPI1 - if (&SPID1 == spip) { - AT91C_BASE_PMC->PMC_PCDR = (1 << AT91C_ID_SPI1); - AIC_DisableIT(AT91C_ID_SPI0); - } -#endif - } -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This function transmits a series of idle words on the SPI bus and - * ignores the received data. This function can be invoked even - * when a slave select signal has not been yet asserted. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - spip->spi->SPI_TCR = n; - spip->spi->SPI_RCR = n; - spip->spi->SPI_TPR = (AT91_REG)idle_buf; - spip->spi->SPI_RPR = (AT91_REG)idle_buf; - spip->spi->SPI_IER = AT91C_SPI_ENDRX; - spip->spi->SPI_CR = AT91C_SPI_SPIEN; - spip->spi->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN; -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This function performs a simultaneous transmit/receive operation. - * @note The buffers are organized as uint8_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - spip->spi->SPI_TCR = n; - spip->spi->SPI_RCR = n; - spip->spi->SPI_TPR = (AT91_REG)txbuf; - spip->spi->SPI_RPR = (AT91_REG)rxbuf; - spip->spi->SPI_IER = AT91C_SPI_ENDRX; - spip->spi->SPI_CR = AT91C_SPI_SPIEN; - spip->spi->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN; -} - -/** - * @brief Sends data over the SPI bus. - * @note The buffers are organized as uint8_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - spip->spi->SPI_TCR = n; - spip->spi->SPI_RCR = n; - spip->spi->SPI_TPR = (AT91_REG)txbuf; - spip->spi->SPI_RPR = (AT91_REG)idle_buf; - spip->spi->SPI_IER = AT91C_SPI_ENDRX; - spip->spi->SPI_CR = AT91C_SPI_SPIEN; - spip->spi->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN; -} - -/** - * @brief Receives data from the SPI bus. - * @note The buffers are organized as uint8_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - spip->spi->SPI_TCR = n; - spip->spi->SPI_RCR = n; - spip->spi->SPI_TPR = (AT91_REG)idle_buf; - spip->spi->SPI_RPR = (AT91_REG)rxbuf; - spip->spi->SPI_IER = AT91C_SPI_ENDRX; - spip->spi->SPI_CR = AT91C_SPI_SPIEN; - spip->spi->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN; -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) { - - spip->spi->SPI_CR = AT91C_SPI_SPIEN; - spip->spi->SPI_TDR = frame; - while ((spip->spi->SPI_SR & AT91C_SPI_RDRF) == 0) - ; - return spip->spi->SPI_RDR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/AT91SAM7/spi_lld.h b/os/hal/platforms/AT91SAM7/spi_lld.h deleted file mode 100644 index c4c9eb63c3..0000000000 --- a/os/hal/platforms/AT91SAM7/spi_lld.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AT91SAM7/spi_lld.h - * @brief AT91SAM7 low level SPI driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Device compatibility.. */ -/*===========================================================================*/ - -#if defined (AT91C_BASE_SPI) -#define AT91C_BASE_SPI0 AT91C_BASE_SPI -#define AT91C_ID_SPI0 AT91C_ID_SPI - -#define SPI0_MISO (1 << 12) -#define SPI0_MOSI (1 << 13) -#define SPI0_SCK (1 << 14) -#else -#define SPI0_MISO (1 << 16) -#define SPI0_MOSI (1 << 17) -#define SPI0_SCK (1 << 18) - -#define SPI1_MISO (1 << 24) -#define SPI1_MOSI (1 << 23) -#define SPI1_SCK (1 << 22) -#endif - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief SPID1 enable switch (SPI0 device). - * @details If set to @p TRUE the support for SPI0 is included. - * @note The default is @p TRUE. - */ -#if !defined(AT91SAM7_SPI_USE_SPI0) || defined(__DOXYGEN__) -#define AT91SAM7_SPI_USE_SPI0 TRUE -#endif - -/** - * @brief SPID2 enable switch (SPI1 device). - * @details If set to @p TRUE the support for SPI1 is included. - * @note The default is @p TRUE. - */ -#if !defined(AT91SAM7_SPI_USE_SPI1) || defined(__DOXYGEN__) -#define AT91SAM7_SPI_USE_SPI1 TRUE -#endif - -/** - * @brief SPI0 device interrupt priority level setting. - */ -#if !defined(AT91SAM7_SPI0_PRIORITY) || defined(__DOXYGEN__) -#define AT91SAM7_SPI0_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) -#endif - -/** - * @brief SPI1 device interrupt priority level setting. - */ -#if !defined(AT91SAM7_SPI1_PRIORITY) || defined(__DOXYGEN__) -#define AT91SAM7_SPI1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 1) -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if defined (AT91C_BASE_SPI) && AT91SAM7_SPI_USE_SPI1 -#error "SPI1 not present" -#endif - -#if !AT91SAM7_SPI_USE_SPI0 && !AT91SAM7_SPI_USE_SPI1 -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SPI Chip Select Register initialization data. - */ - uint32_t csr; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SPIx registers block. - */ - AT91PS_SPI spi; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if AT91SAM7_SPI_USE_SPI0 && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#if AT91SAM7_SPI_USE_SPI1 && !defined(__DOXYGEN__) -extern SPIDriver SPID2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AVR/hal_lld.c b/os/hal/platforms/AVR/hal_lld.c deleted file mode 100644 index c2cd814965..0000000000 --- a/os/hal/platforms/AVR/hal_lld.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/hal_lld.c - * @brief AVR HAL subsystem low level driver code. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - -} - -/** @} */ diff --git a/os/hal/platforms/AVR/hal_lld.h b/os/hal/platforms/AVR/hal_lld.h deleted file mode 100644 index d16fe37dbb..0000000000 --- a/os/hal/platforms/AVR/hal_lld.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/hal_lld.h - * @brief AVR HAL subsystem low level driver header. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "ATmega128" - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AVR/i2c_lld.c b/os/hal/platforms/AVR/i2c_lld.c deleted file mode 100644 index 4795031ba2..0000000000 --- a/os/hal/platforms/AVR/i2c_lld.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/i2c_lld.c - * @brief AVR I2C subsystem low level driver source. - * - * @addtogroup I2C - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_I2C || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief I2C driver identifier.*/ -#if USE_AVR_I2C || defined(__DOXYGEN__) -I2CDriver I2CD; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Wakes up the waiting thread. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] msg wakeup message - * - * @notapi - */ -#define wakeup_isr(i2cp, msg) { \ - chSysLockFromIsr(); \ - if ((i2cp)->thread != NULL) { \ - Thread *tp = (i2cp)->thread; \ - (i2cp)->thread = NULL; \ - tp->p_u.rdymsg = (msg); \ - chSchReadyI(tp); \ - } \ - chSysUnlockFromIsr(); \ -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if USE_AVR_I2C || defined(__DOXYGEN__) -/** - * @brief I2C event interrupt handler. - * - * @notapi - */ -CH_IRQ_HANDLER(TWI_vect) { - CH_IRQ_PROLOGUE(); - - I2CDriver *i2cp = &I2CD; - - switch (TWSR & 0xF8) { - case TWI_START: - case TWI_REPEAT_START: - TWDR = (i2cp->addr << 1); - if ((i2cp->txbuf == NULL) || (i2cp->txbytes == 0) || (i2cp->txidx == i2cp->txbytes)) { - TWDR |= 0x01; - } - TWCR = ((1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - break; - case TWI_MASTER_TX_ADDR_ACK: - case TWI_MASTER_TX_DATA_ACK: - if (i2cp->txidx < i2cp->txbytes) { - TWDR = i2cp->txbuf[i2cp->txidx++]; - TWCR = ((1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - } else { - if (i2cp->rxbuf && i2cp->rxbytes) { - TWCR = ((1 << TWSTA) | (1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - } else { - TWCR = ((1 << TWSTO) | (1 << TWINT) | (1 << TWEN)); - wakeup_isr(i2cp, RDY_OK); - } - } - break; - case TWI_MASTER_RX_ADDR_ACK: - if (i2cp->rxidx == (i2cp->rxbytes - 1)) { - TWCR = ((1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - } else { - TWCR = ((1 << TWEA) | (1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - } - break; - case TWI_MASTER_RX_DATA_ACK: - i2cp->rxbuf[i2cp->rxidx++] = TWDR; - if (i2cp->rxidx == (i2cp->rxbytes - 1)) { - TWCR = ((1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - } else { - TWCR = ((1 << TWEA) | (1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - } - break; - case TWI_MASTER_RX_DATA_NACK: - i2cp->rxbuf[i2cp->rxidx] = TWDR; - TWCR = ((1 << TWSTO) | (1 << TWINT) | (1 << TWEN)); - wakeup_isr(i2cp, RDY_OK); - case TWI_MASTER_TX_ADDR_NACK: - case TWI_MASTER_TX_DATA_NACK: - case TWI_MASTER_RX_ADDR_NACK: - i2cp->errors |= I2CD_ACK_FAILURE; - break; - case TWI_ARBITRATION_LOST: - i2cp->errors |= I2CD_ARBITRATION_LOST; - break; - case TWI_BUS_ERROR: - i2cp->errors |= I2CD_BUS_ERROR; - break; - default: - /* FIXME: only gets here if there are other MASTERs in the bus */ - TWCR = ((1 << TWSTO) | (1 << TWINT) | (1 << TWEN)); - wakeup_isr(i2cp, RDY_RESET); - } - - if (i2cp->errors != I2CD_NO_ERROR) { - TWCR = ((1 << TWSTO) | (1 << TWINT) | (1 << TWEN)); - wakeup_isr(i2cp, RDY_RESET); - } - - CH_IRQ_EPILOGUE(); -} -#endif /* USE_AVR_I2C */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level I2C driver initialization. - * - * @notapi - */ -void i2c_lld_init(void) { - i2cObjectInit(&I2CD); -} - -/** - * @brief Configures and activates the I2C peripheral. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -void i2c_lld_start(I2CDriver *i2cp) { - - /* TODO: Test TWI without external pull-ups (use internal) */ - - /* Configure prescaler to 1 */ - TWSR &= 0xF8; - - /* Configure baudrate */ - TWBR = ((F_CPU / i2cp->config->clock_speed) - 16) / 2; -} - -/** - * @brief Deactivates the I2C peripheral. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -void i2c_lld_stop(I2CDriver *i2cp) { - - if (i2cp->state != I2C_STOP) { - /* Disable TWI subsystem and stop all operations */ - TWCR &= ~(1 << TWEN); - } -} - -/** - * @brief Receives data via the I2C bus as master. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] addr slave device address - * @param[out] rxbuf pointer to the receive buffer - * @param[in] rxbytes number of bytes to be received - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_INFINITE no timeout. - * . - * @return The operation status. - * @retval RDY_OK if the function succeeded. - * @retval RDY_RESET if one or more I2C errors occurred, the errors can - * be retrieved using @p i2cGetErrors(). - * @retval RDY_TIMEOUT if a timeout occurred before operation end. After a - * timeout the driver must be stopped and restarted - * because the bus is in an uncertain state. - * - * @notapi - */ -msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout) { - i2cp->addr = addr; - i2cp->txbuf = NULL; - i2cp->txbytes = 0; - i2cp->txidx = 0; - i2cp->rxbuf = rxbuf; - i2cp->rxbytes = rxbytes; - i2cp->rxidx = 0; - - /* Send START */ - TWCR = ((1 << TWSTA) | (1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - - chSysLock(); - i2cp->thread = chThdSelf(); - chSchGoSleepS(THD_STATE_SUSPENDED); - chSysUnlock(); - - return chThdSelf()->p_u.rdymsg; -} - -/** - * @brief Transmits data via the I2C bus as master. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] addr slave device address - * @param[in] txbuf pointer to the transmit buffer - * @param[in] txbytes number of bytes to be transmitted - * @param[out] rxbuf pointer to the receive buffer - * @param[in] rxbytes number of bytes to be received - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_INFINITE no timeout. - * . - * @return The operation status. - * @retval RDY_OK if the function succeeded. - * @retval RDY_RESET if one or more I2C errors occurred, the errors can - * be retrieved using @p i2cGetErrors(). - * @retval RDY_TIMEOUT if a timeout occurred before operation end. After a - * timeout the driver must be stopped and restarted - * because the bus is in an uncertain state. - * - * @notapi - */ -msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr, - const uint8_t *txbuf, size_t txbytes, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout) { - i2cp->addr = addr; - i2cp->txbuf = txbuf; - i2cp->txbytes = txbytes; - i2cp->txidx = 0; - i2cp->rxbuf = rxbuf; - i2cp->rxbytes = rxbytes; - i2cp->rxidx = 0; - - TWCR = ((1 << TWSTA) | (1 << TWINT) | (1 << TWEN) | (1 << TWIE)); - - chSysLock(); - i2cp->thread = chThdSelf(); - chSchGoSleepS(THD_STATE_SUSPENDED); - chSysUnlock(); - - return chThdSelf()->p_u.rdymsg; -} - -#endif /* HAL_USE_I2C */ - -/** @} */ diff --git a/os/hal/platforms/AVR/i2c_lld.h b/os/hal/platforms/AVR/i2c_lld.h deleted file mode 100644 index 290d04dd5e..0000000000 --- a/os/hal/platforms/AVR/i2c_lld.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/i2c_lld.h - * @brief AVR I2C subsystem low level driver header. - * - * @addtogroup I2C - * @{ - */ - -#ifndef _I2C_LLD_H_ -#define _I2C_LLD_H_ - -#if HAL_USE_I2C || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** @brief START transmitted.*/ -#define TWI_START 0x08 -/** @brief Repeated START transmitted.*/ -#define TWI_REPEAT_START 0x10 -/** @brief Arbitration Lost.*/ -#define TWI_ARBITRATION_LOST 0x38 -/** @brief Bus errors.*/ -#define TWI_BUS_ERROR 0x00 - -/** @brief SLA+W transmitted with ACK response.*/ -#define TWI_MASTER_TX_ADDR_ACK 0x18 -/** @brief SLA+W transmitted with NACK response.*/ -#define TWI_MASTER_TX_ADDR_NACK 0x20 -/** @brief DATA transmitted with ACK response.*/ -#define TWI_MASTER_TX_DATA_ACK 0x28 -/** @brief DATA transmitted with NACK response.*/ -#define TWI_MASTER_TX_DATA_NACK 0x30 - -/** @brief SLA+R transmitted with ACK response.*/ -#define TWI_MASTER_RX_ADDR_ACK 0x40 -/** @brief SLA+R transmitted with NACK response.*/ -#define TWI_MASTER_RX_ADDR_NACK 0x48 -/** @brief DATA received with ACK response.*/ -#define TWI_MASTER_RX_DATA_ACK 0x50 -/** @brief DATA received with NACK response.*/ -#define TWI_MASTER_RX_DATA_NACK 0x58 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief I2C driver enable switch. - * @details If set to @p TRUE the support for I2C is included. - * @note The default is @p FALSE. - */ -#if !defined(USE_AVR_I2C) || defined(__DOXYGEN__) -#define USE_AVR_I2C FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type representing I2C address. - */ -typedef uint8_t i2caddr_t; - -/** - * @brief I2C Driver condition flags type. - */ -typedef uint8_t i2cflags_t; - -/** - * @brief Driver configuration structure. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -typedef struct { - - /** - * @brief Specifies the I2C clock frequency. - */ - uint32_t clock_speed; - -} I2CConfig; - -/** - * @brief Structure representing an I2C driver. - */ -struct I2CDriver { - /** - * @brief Driver state. - */ - i2cstate_t state; - /** - * @brief Current configuration data. - */ - const I2CConfig *config; - /** - * @brief Error flags. - */ - i2cflags_t errors; -#if I2C_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* I2C_USE_MUTUAL_EXCLUSION */ -#if defined(I2C_DRIVER_EXT_FIELDS) - I2C_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Thread waiting for I/O completion. - */ - Thread *thread; - /** - * @brief Address of slave device. - */ - i2caddr_t addr; - /** - * @brief Pointer to the buffer with data to send. - */ - const uint8_t *txbuf; - /** - * @brief Number of bytes of data to send. - */ - size_t txbytes; - /** - * @brief Current index in buffer when sending data. - */ - size_t txidx; - /** - * @brief Pointer to the buffer to put received data. - */ - uint8_t *rxbuf; - /** - * @brief Number of bytes of data to receive. - */ - size_t rxbytes; - /** - * @brief Current index in buffer when receiving data. - */ - size_t rxidx; -}; - -/** - * @brief Type of a structure representing an I2C driver. - */ -typedef struct I2CDriver I2CDriver; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Get errors from I2C driver. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -#define i2c_lld_get_errors(i2cp) ((i2cp)->errors) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -#if USE_AVR_I2C -extern I2CDriver I2CD; -#endif -#endif /* !defined(__DOXYGEN__) */ - -#ifdef __cplusplus -extern "C" { -#endif - void i2c_lld_init(void); - void i2c_lld_start(I2CDriver *i2cp); - void i2c_lld_stop(I2CDriver *i2cp); - msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr, - const uint8_t *txbuf, size_t txbytes, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout); - msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_I2C */ - -#endif /* _I2C_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AVR/pal_lld.c b/os/hal/platforms/AVR/pal_lld.c deleted file mode 100644 index c5a4785b78..0000000000 --- a/os/hal/platforms/AVR/pal_lld.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/pal_lld.c - * @brief AVR GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief AVR GPIO ports configuration. - * @details GPIO registers initialization. - * - * @param[in] config the AVR ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - -#if defined(PORTA) || defined(__DOXYGEN__) - PORTA = config->porta.out; - DDRA = config->porta.dir; -#endif - -#if defined(PORTB) || defined(__DOXYGEN__) - PORTB = config->portb.out; - DDRB = config->portb.dir; -#endif - -#if defined(PORTC) || defined(__DOXYGEN__) - PORTC = config->portc.out; - DDRC = config->portc.dir; -#endif - -#if defined(PORTD) || defined(__DOXYGEN__) - PORTD = config->portd.out; - DDRD = config->portd.dir; -#endif - -#if defined(PORTE) || defined(__DOXYGEN__) - PORTE = config->porte.out; - DDRE = config->porte.dir; -#endif - -#if defined(PORTF) || defined(__DOXYGEN__) - PORTF = config->portf.out; - DDRF = config->portf.dir; -#endif - -#if defined(PORTG) || defined(__DOXYGEN__) - PORTG = config->portg.out; - DDRG = config->portg.dir; -#endif - -#if defined(PORTH) || defined(__DOXYGEN__) - PORTH = config->porth.out; - DDRH = config->porth.dir; -#endif - -#if defined(PORTJ) || defined(__DOXYGEN__) - PORTJ = config->portj.out; - DDRJ = config->portj.dir; -#endif - -#if defined(PORTK) || defined(__DOXYGEN__) - PORTK = config->portk.out; - DDRK = config->portk.dir; -#endif - -#if defined(PORTL) || defined(__DOXYGEN__) - PORTL = config->portl.out; - DDRL = config->portl.dir; -#endif -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @note This function is not meant to be invoked directly by the application - * code. - * @note @p PAL_MODE_UNCONNECTED is implemented as output as recommended by - * the AVR Family User's Guide. Unconnected pads are set to input - * with pull-up by default. - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - case PAL_MODE_INPUT_ANALOG: - port->dir &= ~mask; - port->out &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - case PAL_MODE_INPUT_PULLUP: - port->dir &= ~mask; - port->out |= mask; - break; - case PAL_MODE_OUTPUT_PUSHPULL: - port->dir |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/AVR/pal_lld.h b/os/hal/platforms/AVR/pal_lld.h deleted file mode 100644 index e07e2ccc39..0000000000 --- a/os/hal/platforms/AVR/pal_lld.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/pal_lld.h - * @brief AVR GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 8 - -/** - * @brief Whole port mask. - * @details This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFF) - -/** - * @brief AVR setup registers. - */ -typedef struct { - uint8_t out; - uint8_t dir; -} avr_gpio_setup_t; - -/** - * @brief AVR registers block. - * @note On some devices registers do not follow this layout on some - * ports, the ports with abnormal layout cannot be used through - * PAL driver. Example: PORT F on Mega128. - */ -typedef struct { - volatile uint8_t in; - volatile uint8_t dir; - volatile uint8_t out; -} avr_gpio_registers_t; - -/** - * @brief Generic I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { -#if defined(PORTA) || defined(__DOXYGEN__) - avr_gpio_setup_t porta; -#endif -#if defined(PORTB) || defined(__DOXYGEN__) - avr_gpio_setup_t portb; -#endif -#if defined(PORTC) || defined(__DOXYGEN__) - avr_gpio_setup_t portc; -#endif -#if defined(PORTD) || defined(__DOXYGEN__) - avr_gpio_setup_t portd; -#endif -#if defined(PORTE) || defined(__DOXYGEN__) - avr_gpio_setup_t porte; -#endif -#if defined(PORTF) || defined(__DOXYGEN__) - avr_gpio_setup_t portf; -#endif -#if defined(PORTG) || defined(__DOXYGEN__) - avr_gpio_setup_t portg; -#endif -#if defined(PORTH) || defined(__DOXYGEN__) - avr_gpio_setup_t porth; -#endif -#if defined(PORTJ) || defined(__DOXYGEN__) - avr_gpio_setup_t portj; -#endif -#if defined(PORTK) || defined(__DOXYGEN__) - avr_gpio_setup_t portk; -#endif -#if defined(PORTL) || defined(__DOXYGEN__) - avr_gpio_setup_t portl; -#endif -} PALConfig; - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint8_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint8_t iomode_t; - -/** - * @brief Port Identifier. - * @details This type can be a scalar or some kind of pointer, do not make - * any assumption about it, use the provided macros when populating - * variables of this type. - */ -typedef avr_gpio_registers_t *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -#if defined(PORTA) || defined(__DOXYGEN__) -/** - * @brief GPIO port A identifier. - */ -#define IOPORT1 ((volatile avr_gpio_registers_t *)&PINA) -#endif - -#if defined(PORTB) || defined(__DOXYGEN__) -/** - * @brief GPIO port B identifier. - */ -#define IOPORT2 ((volatile avr_gpio_registers_t *)&PINB) -#endif - -#if defined(PORTC) || defined(__DOXYGEN__) -/** - * @brief GPIO port C identifier. - */ -#define IOPORT3 ((volatile avr_gpio_registers_t *)&PINC) -#endif - -#if defined(PORTD) || defined(__DOXYGEN__) -/** - * @brief GPIO port D identifier. - */ -#define IOPORT4 ((volatile avr_gpio_registers_t *)&PIND) -#endif - -#if defined(PORTE) || defined(__DOXYGEN__) -/** - * @brief GPIO port E identifier. - */ -#define IOPORT5 ((volatile avr_gpio_registers_t *)&PINE) -#endif - -#if defined(PORTF) || defined(__DOXYGEN__) -/** - * @brief GPIO port F identifier. - */ -#define IOPORT6 ((volatile avr_gpio_registers_t *)&PINF) -#endif - -#if defined(PORTG) || defined(__DOXYGEN__) -/** - * @brief GPIO port G identifier. - */ -#define IOPORT7 ((volatile avr_gpio_registers_t *)&PING) -#endif - -#if defined(PORTH) || defined(__DOXYGEN__) -/** - * @brief GPIO port H identifier. - */ -#define IOPORT8 ((volatile avr_gpio_registers_t *)&PINH) -#endif - -#if defined(PORTJ) || defined(__DOXYGEN__) -/** - * @brief GPIO port J identifier. - */ -#define IOPORT9 ((volatile avr_gpio_registers_t *)&PINJ) -#endif - -#if defined(PORTK) || defined(__DOXYGEN__) -/** - * @brief GPIO port K identifier. - */ -#define IOPORT10 ((volatile avr_gpio_registers_t *)&PINK) -#endif - -#if defined(PORTL) || defined(__DOXYGEN__) -/** - * @brief GPIO port L identifier. - */ -#define IOPORT11 ((volatile avr_gpio_registers_t *)&PINL) -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config the architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->in) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->out) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->out = bits) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note Programming an unknown or unsupported mode is silently ignored. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Sets a pad logical state to @p PAL_HIGH. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_setpad(port, pad) \ -__asm__ __volatile__ \ -( \ - "sbi %0,%1\n\t" \ - : \ - : "I" (_SFR_IO_ADDR(port->out)), \ - "I" (pad) \ - \ -) - -/** - * @brief Clears a pad logical state to @p PAL_LOW. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_clearpad(port, pad) \ -__asm__ __volatile__ \ -( \ - "cbi %0,%1\n\t" \ - : \ - : "I" (_SFR_IO_ADDR(port->out)), \ - "I" (pad) \ - \ -) - -extern ROMCONST PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/AVR/platform.dox b/os/hal/platforms/AVR/platform.dox deleted file mode 100644 index a9bb09c042..0000000000 --- a/os/hal/platforms/AVR/platform.dox +++ /dev/null @@ -1,114 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup AVR_DRIVERS AVR Drivers - * @details This section describes all the supported drivers on the AVR - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup AVR_HAL AVR Initialization Support - * @details On the AVR platform the HAL driver is a stub and does not perform - * any platform-specific initialization, it still performs the - * initialization of the other drivers. - * - * @ingroup AVR_DRIVERS - */ - -/** - * @defgroup AVR_PAL AVR PAL Support - * @details The AVR PAL driver uses the PORT peripherals. - * - * @section avr_pal_1 Supported HW resources - * - PORTA. - * - PORTB. - * - PORTC. - * - PORTD. - * - PORTE. - * - PORTF. - * - PORTG. - * . - * @section avr_pal_2 AVR PAL driver implementation features - * The AVR PAL driver implementation fully supports the following hardware - * capabilities: - * - 8 bits wide ports. - * - Atomic set/reset functions. - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section avr_pal_3 Supported PAL setup modes - * The AVR PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_INPUT_ANALOG. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section avr_pal_4 Suboptimal behavior - * The AVR PORT is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * - Group set+reset function is not atomic. - * - Writing on pads/groups/ports programmed as input with pull-up - * resistor changes the resistor setting because the output latch is - * used for resistor selection. - * - The PORT registers layout on some devices is not regular (it does - * not have contiguous PIN, DDR, PORT registers in this order), such - * ports cannot be accessed using the PAL driver. For example, PORT F - * on ATmega128. Verify the user manual of your device. - * . - * @ingroup AVR_DRIVERS - */ - -/** - * @defgroup AVR_SERIAL AVR Serial Support - * @details The AVR Serial driver uses the USART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section avr_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART0. - * - USART1. - * . - * @section avr_serial_2 AVR Serial driver implementation features - * - Each USART can be independently enabled and programmed. - * - Fully interrupt driven. - * . - * @ingroup AVR_DRIVERS - */ - -/** - * @defgroup AVR_I2C AVR I2C Support - * @details The AVR I2C driver uses the TWI peripheral in an interrupt - * driven, implementation. - * - * @section avr_i2c Supported HW resources - * The i2c driver can support the following hardware resource: - * - I2C. - * . - * @ingroup AVR_DRIVERS - */ diff --git a/os/hal/platforms/AVR/platform.mk b/os/hal/platforms/AVR/platform.mk deleted file mode 100644 index 86a2c2ebad..0000000000 --- a/os/hal/platforms/AVR/platform.mk +++ /dev/null @@ -1,8 +0,0 @@ -# List of all the AVR platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/AVR/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/AVR/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/AVR/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/AVR/i2c_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/AVR diff --git a/os/hal/platforms/AVR/serial_lld.c b/os/hal/platforms/AVR/serial_lld.c deleted file mode 100644 index ce7a928f03..0000000000 --- a/os/hal/platforms/AVR/serial_lld.c +++ /dev/null @@ -1,364 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/serial_lld.c - * @brief AVR low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief USART0 serial driver identifier. - * @note The name does not follow the convention used in the other ports - * (COMn) because a name conflict with the AVR headers. - */ -#if USE_AVR_USART0 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif - -/** - * @brief USART1 serial driver identifier. - * @note The name does not follow the convention used in the other ports - * (COMn) because a name conflict with the AVR headers. - */ -#if USE_AVR_USART1 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief Driver default configuration. - */ -static const SerialConfig default_config = { - UBRR(SERIAL_DEFAULT_BITRATE), - USART_CHAR_SIZE_8 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void set_error(uint8_t sra, SerialDriver *sdp) { - flagsmask_t sts = 0; - uint8_t dor = 0; - uint8_t upe = 0; - uint8_t fe = 0; - -#if USE_AVR_USART0 - if (&SD1 == sdp) { - dor = (1 << DOR0); - upe = (1 << UPE0); - fe = (1 << FE0); - } -#endif - -#if USE_AVR_USART1 - if (&SD2 == sdp) { - dor = (1 << DOR1); - upe = (1 << UPE1); - fe = (1 << FE1); - } -#endif - - if (sra & dor) - sts |= SD_OVERRUN_ERROR; - if (sra & upe) - sts |= SD_PARITY_ERROR; - if (sra & fe) - sts |= SD_FRAMING_ERROR; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -#if USE_AVR_USART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - UCSR0B |= (1 << UDRIE0); -} - -/** - * @brief USART0 initialization. - * - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart0_init(const SerialConfig *config) { - - UBRR0L = config->sc_brr; - UBRR0H = config->sc_brr >> 8; - UCSR0A = 0; - UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); - switch (config->sc_bits_per_char) { - case USART_CHAR_SIZE_5: - UCSR0C = 0; - break; - case USART_CHAR_SIZE_6: - UCSR0C = (1 << UCSZ00); - break; - case USART_CHAR_SIZE_7: - UCSR0C = (1 << UCSZ01); - break; - case USART_CHAR_SIZE_9: - UCSR0B |= (1 << UCSZ02); - UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); - break; - case USART_CHAR_SIZE_8: - default: - UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); - } -} - -/** - * @brief USART0 de-initialization. - */ -static void usart0_deinit(void) { - - UCSR0A = 0; - UCSR0B = 0; - UCSR0C = 0; -} -#endif - -#if USE_AVR_USART1 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - UCSR1B |= (1 << UDRIE1); -} - -/** - * @brief USART1 initialization. - * - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart1_init(const SerialConfig *config) { - - UBRR1L = config->sc_brr; - UBRR1H = config->sc_brr >> 8; - UCSR1A = 0; - UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1); - switch (config->sc_bits_per_char) { - case USART_CHAR_SIZE_5: - UCSR1C = 0; - break; - case USART_CHAR_SIZE_6: - UCSR1C = (1 << UCSZ10); - break; - case USART_CHAR_SIZE_7: - UCSR1C = (1 << UCSZ11); - break; - case USART_CHAR_SIZE_9: - UCSR1B |= (1 << UCSZ12); - UCSR1C = (1 << UCSZ10) | (1 << UCSZ11); - break; - case USART_CHAR_SIZE_8: - default: - UCSR1C = (1 << UCSZ10) | (1 << UCSZ11); - } -} - -/** - * @brief USART1 de-initialization. - */ -static void usart1_deinit(void) { - - UCSR1A = 0; - UCSR1B = 0; - UCSR1C = 0; -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if USE_AVR_USART0 || defined(__DOXYGEN__) -/** - * @brief USART0 RX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART0_RX_vect) { - uint8_t sra; - - CH_IRQ_PROLOGUE(); - - sra = UCSR0A; - if (sra & ((1 << DOR0) | (1 << UPE0) | (1 << FE0))) - set_error(sra, &SD1); - chSysLockFromIsr(); - sdIncomingDataI(&SD1, UDR0); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief USART0 TX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART0_UDRE_vect) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD1); - chSysUnlockFromIsr(); - if (b < Q_OK) - UCSR0B &= ~(1 << UDRIE0); - else - UDR0 = b; - - CH_IRQ_EPILOGUE(); -} -#endif /* USE_AVR_USART0 */ - -#if USE_AVR_USART1 || defined(__DOXYGEN__) -/** - * @brief USART1 RX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART1_RX_vect) { - uint8_t sra; - - CH_IRQ_PROLOGUE(); - - sra = UCSR1A; - if (sra & ((1 << DOR1) | (1 << UPE1) | (1 << FE1))) - set_error(sra, &SD2); - chSysLockFromIsr(); - sdIncomingDataI(&SD2, UDR1); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief USART1 TX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART1_UDRE_vect) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD2); - chSysUnlockFromIsr(); - if (b < Q_OK) - UCSR1B &= ~(1 << UDRIE1); - else - UDR1 = b; - - CH_IRQ_EPILOGUE(); -} -#endif /* USE_AVR_USART1 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if USE_AVR_USART0 - sdObjectInit(&SD1, NULL, notify1); -#endif -#if USE_AVR_USART1 - sdObjectInit(&SD2, NULL, notify2); -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - -#if USE_AVR_USART0 - if (&SD1 == sdp) { - usart0_init(config); - return; - } -#endif -#if USE_AVR_USART1 - if (&SD2 == sdp) { - usart1_init(config); - return; - } -#endif -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - -#if USE_AVR_USART0 - if (&SD1 == sdp) - usart0_deinit(); -#endif -#if USE_AVR_USART1 - if (&SD2 == sdp) - usart1_deinit(); -#endif -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/AVR/serial_lld.h b/os/hal/platforms/AVR/serial_lld.h deleted file mode 100644 index d6f893e74a..0000000000 --- a/os/hal/platforms/AVR/serial_lld.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/serial_lld.h - * @brief AVR low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief USART0 driver enable switch. - * @details If set to @p TRUE the support for USART0 is included. - * @note The default is @p FALSE. - */ -#if !defined(USE_AVR_USART0) || defined(__DOXYGEN__) -#define USE_AVR_USART0 TRUE -#endif - -/** - * @brief USART1 driver enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_AVR_USART1) || defined(__DOXYGEN__) -#define USE_AVR_USART1 TRUE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief AVR Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Initialization value for the BRR register. - */ - uint16_t sc_brr; - /** - * @brief Number of bits per character (USART_CHAR_SIZE_5 to USART_CHAR_SIZE_9). - */ - uint8_t sc_bits_per_char; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Macro for baud rate computation. - * @note Make sure the final baud rate is within tolerance. - */ -#define UBRR(b) (((F_CPU / b) >> 4) - 1) - -/** - * @brief Macro for baud rate computation when U2Xn == 1. - * @note Make sure the final baud rate is within tolerance. - */ -#define UBRR2x(b) (((F_CPU / b) >> 3) - 1) - -/** -* @brief Macro for baud rate computation. -* @note Make sure the final baud rate is within tolerance. -* @note This version uses floating point math for greater accuracy. -*/ -#define UBRR_F(b) ((((double) F_CPU / (double) b) / 16.0) - 0.5) - -/** -* @brief Macro for baud rate computation when U2Xn == 1. -* @note Make sure the final baud rate is within tolerance. -* @note This version uses floating point math for greater accuracy. -*/ -#define UBRR2x_F(b) ((((double) F_CPU / (double) b) / 8.0) - 0.5) - -#define USART_CHAR_SIZE_5 0 -#define USART_CHAR_SIZE_6 1 -#define USART_CHAR_SIZE_7 2 -#define USART_CHAR_SIZE_8 3 -#define USART_CHAR_SIZE_9 4 - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_AVR_USART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_AVR_USART1 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/BCM2835/serial_lld.c b/os/hal/platforms/BCM2835/serial_lld.c index 4826515c48..810271d423 100644 --- a/os/hal/platforms/BCM2835/serial_lld.c +++ b/os/hal/platforms/BCM2835/serial_lld.c @@ -57,9 +57,9 @@ static const SerialConfig default_config = { /*===========================================================================*/ static void output_notify(GenericQueue *qp) { - UNUSED(qp); + UNUSED(qp); /* Enable tx interrupts.*/ - AUX_MU_IER_REG |= AUX_MU_IER_TX_IRQEN; + AUX_MU_IER_REG |= AUX_MU_IER_TX_IRQEN; } /*===========================================================================*/ @@ -70,7 +70,7 @@ void sd_lld_serve_interrupt( SerialDriver *sdp ) { if (AUX_MU_IIR_RX_IRQ) { chSysLockFromIsr(); while(!AUX_MU_LSR_RX_RDY); - do { + do { sdIncomingDataI(sdp, AUX_MU_IO_REG & 0xFF); } while (AUX_MU_LSR_RX_RDY); chSysUnlockFromIsr(); @@ -82,7 +82,7 @@ void sd_lld_serve_interrupt( SerialDriver *sdp ) { msg_t data = sdRequestDataI(sdp); if (data < Q_OK) { /* Disable tx interrupts.*/ - AUX_MU_IER_REG &= ~AUX_MU_IER_TX_IRQEN; + AUX_MU_IER_REG &= ~AUX_MU_IER_TX_IRQEN; } else { mini_uart_send((uint32_t)data); @@ -121,15 +121,15 @@ void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { config = &default_config; IRQ_DISABLE1 = BIT(29); - + AUX_ENABLES = 1; - + AUX_MU_IER_REG = 0x00; AUX_MU_CNTL_REG = 0x00; AUX_MU_LCR_REG = 0x03; // Bit 1 must be set AUX_MU_MCR_REG = 0x00; AUX_MU_IER_REG = 0x05; - AUX_MU_IIR_REG = 0xC6; + AUX_MU_IIR_REG = 0xC6; AUX_MU_BAUD_REG = BAUD_RATE_COUNT(config->baud_rate); bcm2835_gpio_fnsel(14, GPFN_ALT5); @@ -140,10 +140,11 @@ void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { GPPUDCLK0 = (1<<14)|(1<<15); bcm2835_delay(150); GPPUDCLK0 = 0; - + AUX_MU_CNTL_REG = 0x03; IRQ_ENABLE1 = BIT(29); + bcm2835_delay(150); } /** @@ -192,8 +193,8 @@ void mini_uart_sendhex ( uint32_t d, bool_t newline ) rb-=4; rc=(d>>rb)&0xF; if(rc>9) - rc+=0x37; - else + rc+=0x37; + else rc+=0x30; mini_uart_send(rc); if(rb==0) break; diff --git a/os/hal/platforms/LPC11Uxx/LPC11Uxx.h b/os/hal/platforms/LPC11Uxx/LPC11Uxx.h deleted file mode 100644 index 81d37a7042..0000000000 --- a/os/hal/platforms/LPC11Uxx/LPC11Uxx.h +++ /dev/null @@ -1,668 +0,0 @@ - -/****************************************************************************************************//** - * @file LPC11Uxx.h - * - * - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File for - * default LPC11Uxx Device Series - * - * @version V0.1 - * @date 21. March 2011 - * - * @note Generated with SFDGen V2.6 Build 3j (beta) on Thursday, 17.03.2011 13:19:45 - * - * from CMSIS SVD File 'LPC11U1x_svd.xml' Version 0.1, - * created on Wednesday, 16.03.2011 20:30:42, last modified on Thursday, 17.03.2011 20:19:40 - * - *******************************************************************************************************/ - - - -/** @addtogroup NXP - * @{ - */ - -/** @addtogroup LPC11Uxx - * @{ - */ - -#ifndef __LPC11UXX_H__ -#define __LPC11UXX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#if defined ( __CC_ARM ) - #pragma anon_unions -#endif - - /* Interrupt Number Definition */ - -typedef enum { -// ------------------------- Cortex-M0 Processor Exceptions Numbers ----------------------------- - Reset_IRQn = -15, /*!< 1 Reset Vector, invoked on Power up and warm reset */ - NonMaskableInt_IRQn = -14, /*!< 2 Non maskable Interrupt, cannot be stopped or preempted */ - HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault */ - SVCall_IRQn = -5, /*!< 11 System Service Call via SVC instruction */ - DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor */ - PendSV_IRQn = -2, /*!< 14 Pendable request for system service */ - SysTick_IRQn = -1, /*!< 15 System Tick Timer */ -// --------------------------- LPC11Uxx Specific Interrupt Numbers ------------------------------ -FLEX_INT0_IRQn = 0, /*!< All I/O pins can be routed to below 8 interrupts. */ - FLEX_INT1_IRQn = 1, - FLEX_INT2_IRQn = 2, - FLEX_INT3_IRQn = 3, - FLEX_INT4_IRQn = 4, - FLEX_INT5_IRQn = 5, - FLEX_INT6_IRQn = 6, - FLEX_INT7_IRQn = 7, - GINT0_IRQn = 8, /*!< Grouped Interrupt 0 */ - GINT1_IRQn = 9, /*!< Grouped Interrupt 1 */ - Reserved0_IRQn = 10, /*!< Reserved Interrupt */ - Reserved1_IRQn = 11, - Reserved2_IRQn = 12, - Reserved3_IRQn = 13, - SSP1_IRQn = 14, /*!< SSP1 Interrupt */ - I2C_IRQn = 15, /*!< I2C Interrupt */ - TIMER_16_0_IRQn = 16, /*!< 16-bit Timer0 Interrupt */ - TIMER_16_1_IRQn = 17, /*!< 16-bit Timer1 Interrupt */ - TIMER_32_0_IRQn = 18, /*!< 32-bit Timer0 Interrupt */ - TIMER_32_1_IRQn = 19, /*!< 32-bit Timer1 Interrupt */ - SSP0_IRQn = 20, /*!< SSP0 Interrupt */ - UART_IRQn = 21, /*!< UART Interrupt */ - USB_IRQn = 22, /*!< USB IRQ Interrupt */ - USB_FIQn = 23, /*!< USB FIQ Interrupt */ - ADC_IRQn = 24, /*!< A/D Converter Interrupt */ - WDT_IRQn = 25, /*!< Watchdog timer Interrupt */ - BOD_IRQn = 26, /*!< Brown Out Detect(BOD) Interrupt */ - FMC_IRQn = 27, /*!< Flash Memory Controller Interrupt */ - Reserved4_IRQn = 28, /*!< Reserved Interrupt */ - Reserved5_IRQn = 29, /*!< Reserved Interrupt */ - USBWakeup_IRQn = 30, /*!< USB wakeup Interrupt */ - Reserved6_IRQn = 31, /*!< Reserved Interrupt */ -} IRQn_Type; - - -/** @addtogroup Configuration_of_CMSIS - * @{ - */ - -/* Processor and Core Peripheral Section */ /* Configuration of the Cortex-M0 Processor and Core Peripherals */ - -#define __MPU_PRESENT 0 /*!< MPU present or not */ -#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ -/** @} */ /* End of group Configuration_of_CMSIS */ - -#include "core_cm0.h" /*!< Cortex-M0 processor and core peripherals */ -#include "system_LPC11Uxx.h" /*!< LPC11Uxx System */ - -/** @addtogroup Device_Peripheral_Registers - * @{ - */ - - -// ------------------------------------------------------------------------------------------------ -// ----- I2C ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x I2C-bus controller Modification date=3/16/2011 Major revision=0 Minor revision=3 (I2C) - */ - -typedef struct { /*!< (@ 0x40000000) I2C Structure */ - __IO uint32_t CONSET; /*!< (@ 0x40000000) I2C Control Set Register */ - __I uint32_t STAT; /*!< (@ 0x40000004) I2C Status Register */ - __IO uint32_t DAT; /*!< (@ 0x40000008) I2C Data Register. */ - __IO uint32_t ADR0; /*!< (@ 0x4000000C) I2C Slave Address Register 0 */ - __IO uint32_t SCLH; /*!< (@ 0x40000010) SCH Duty Cycle Register High Half Word */ - __IO uint32_t SCLL; /*!< (@ 0x40000014) SCL Duty Cycle Register Low Half Word */ - __IO uint32_t CONCLR; /*!< (@ 0x40000018) I2C Control Clear Register*/ - __IO uint32_t MMCTRL; /*!< (@ 0x4000001C) Monitor mode control register*/ - __IO uint32_t ADR1; /*!< (@ 0x40000020) I2C Slave Address Register 1*/ - __IO uint32_t ADR2; /*!< (@ 0x40000024) I2C Slave Address Register 2*/ - __IO uint32_t ADR3; /*!< (@ 0x40000028) I2C Slave Address Register 3*/ - __I uint32_t DATA_BUFFER; /*!< (@ 0x4000002C) Data buffer register */ -union{ - __IO uint32_t MASK[4]; /*!< (@ 0x40000030) I2C Slave address mask register */ - struct{ - __IO uint32_t MASK0; - __IO uint32_t MASK1; - __IO uint32_t MASK2; - __IO uint32_t MASK3; - }; - }; -} LPC_I2C_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- WWDT ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x Windowed Watchdog Timer (WWDT) Modification date=3/16/2011 Major revision=0 Minor revision=3 (WWDT) - */ - -typedef struct { /*!< (@ 0x40004000) WWDT Structure */ - __IO uint32_t MOD; /*!< (@ 0x40004000) Watchdog mode register*/ - __IO uint32_t TC; /*!< (@ 0x40004004) Watchdog timer constant register */ - __IO uint32_t FEED; /*!< (@ 0x40004008) Watchdog feed sequence register */ - __I uint32_t TV; /*!< (@ 0x4000400C) Watchdog timer value register */ - __IO uint32_t CLKSEL; /*!< (@ 0x40004010) Watchdog clock select register. */ - __IO uint32_t WARNINT; /*!< (@ 0x40004014) Watchdog Warning Interrupt compare value. */ - __IO uint32_t WINDOW; /*!< (@ 0x40004018) Watchdog Window compare value. */ -} LPC_WWDT_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- USART ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x USART Modification date=3/16/2011 Major revision=0 Minor revision=3 (USART) - */ - -typedef struct { /*!< (@ 0x40008000) USART Structure */ - - union { - __IO uint32_t DLL; /*!< (@ 0x40008000) Divisor Latch LSB. Least significant byte of the baud rate divisor value. The full divisor is used to generate a baud rate from the fractional rate divider. (DLAB=1) */ - __O uint32_t THR; /*!< (@ 0x40008000) Transmit Holding Register. The next character to be transmitted is written here. (DLAB=0) */ - __I uint32_t RBR; /*!< (@ 0x40008000) Receiver Buffer Register. Contains the next received character to be read. (DLAB=0) */ - }; - - union { - __IO uint32_t IER; /*!< (@ 0x40008004) Interrupt Enable Register. Contains individual interrupt enable bits for the 7 potential USART interrupts. (DLAB=0) */ - __IO uint32_t DLM; /*!< (@ 0x40008004) Divisor Latch MSB. Most significant byte of the baud rate divisor value. The full divisor is used to generate a baud rate from the fractional rate divider. (DLAB=1) */ - }; - - union { - __O uint32_t FCR; /*!< (@ 0x40008008) FIFO Control Register. Controls USART FIFO usage and modes. */ - __I uint32_t IIR; /*!< (@ 0x40008008) Interrupt ID Register. Identifies which interrupt(s) are pending. */ - }; - __IO uint32_t LCR; /*!< (@ 0x4000800C) Line Control Register. Contains controls for frame formatting and break generation. */ - __IO uint32_t MCR; /*!< (@ 0x40008010) Modem Control Register. */ - __I uint32_t LSR; /*!< (@ 0x40008014) Line Status Register. Contains flags for transmit and receive status, including line errors. */ - __I uint32_t MSR; /*!< (@ 0x40008018) Modem Status Register. */ - __IO uint32_t SCR; /*!< (@ 0x4000801C) Scratch Pad Register. Eight-bit temporary storage for software. */ - __IO uint32_t ACR; /*!< (@ 0x40008020) Auto-baud Control Register. Contains controls for the auto-baud feature. */ - __IO uint32_t ICR; /*!< (@ 0x40008024) IrDA Control Register. Enables and configures the IrDA (remote control) mode. */ - __IO uint32_t FDR; /*!< (@ 0x40008028) Fractional Divider Register. Generates a clock input for the baud rate divider. */ - __IO uint32_t OSR; /*!< (@ 0x4000802C) Oversampling Register. Controls the degree of oversampling during each bit time. */ - __IO uint32_t TER; /*!< (@ 0x40008030) Transmit Enable Register. Turns off USART transmitter for use with software flow control. */ - __I uint32_t RESERVED0[3]; - __IO uint32_t HDEN; /*!< (@ 0x40008040) Half duplex enable register. */ - __I uint32_t RESERVED1; - __IO uint32_t SCICTRL; /*!< (@ 0x40008048) Smart Card Interface Control register. Enables and configures the Smart Card Interface feature. */ - __IO uint32_t RS485CTRL; /*!< (@ 0x4000804C) RS-485/EIA-485 Control. Contains controls to configure various aspects of RS-485/EIA-485 modes. */ - __IO uint32_t RS485ADRMATCH; /*!< (@ 0x40008050) RS-485/EIA-485 address match. Contains the address match value for RS-485/EIA-485 mode. */ - __IO uint32_t RS485DLY; /*!< (@ 0x40008054) RS-485/EIA-485 direction control delay. */ - __IO uint32_t SYNCCTRL; -} LPC_USART_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- Timer ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x 32-bitcounter/timers CT32B0/1 Modification date=3/16/2011 Major revision=0 Minor revision=3 - */ - -typedef struct { /*!< (@ 0x40014000) CT32B0 Structure */ - __IO uint32_t IR; /*!< (@ 0x40014000) Interrupt Register */ - __IO uint32_t TCR; /*!< (@ 0x40014004) Timer Control Register */ - __IO uint32_t TC; /*!< (@ 0x40014008) Timer Counter */ - __IO uint32_t PR; /*!< (@ 0x4001400C) Prescale Register */ - __IO uint32_t PC; /*!< (@ 0x40014010) Prescale Counter */ - __IO uint32_t MCR; /*!< (@ 0x40014014) Match Control Register */ - union { - __IO uint32_t MR[4]; /*!< (@ 0x40014018) Match Register */ - struct{ - __IO uint32_t MR0; /*!< (@ 0x40018018) Match Register. MR0 */ - __IO uint32_t MR1; /*!< (@ 0x4001801C) Match Register. MR1 */ - __IO uint32_t MR2; /*!< (@ 0x40018020) Match Register. MR2 */ - __IO uint32_t MR3; /*!< (@ 0x40018024) Match Register. MR3 */ - }; - }; - __IO uint32_t CCR; /*!< (@ 0x40014028) Capture Control Register */ - union{ - __I uint32_t CR[4]; /*!< (@ 0x4001402C) Capture Register */ - struct{ - __I uint32_t CR0; /*!< (@ 0x4001802C) Capture Register. CR 0 */ - __I uint32_t CR1; /*!< (@ 0x40018030) Capture Register. CR 1 */ - __I uint32_t CR2; /*!< (@ 0x40018034) Capture Register. CR 2 */ - __I uint32_t CR3; /*!< (@ 0x40018038) Capture Register. CR 3 */ - }; - }; -__IO uint32_t EMR; /*!< (@ 0x4001403C) External Match Register */ - __I uint32_t RESERVED0[12]; - __IO uint32_t CTCR; /*!< (@ 0x40014070) Count Control Register */ - __IO uint32_t PWMC; /*!< (@ 0x40014074) PWM Control Register */ -} LPC_CTxxBx_Type; - - - -// ------------------------------------------------------------------------------------------------ -// ----- ADC ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x ADC Modification date=3/16/2011 Major revision=0 Minor revision=3 (ADC) - */ - -typedef struct { /*!< (@ 0x4001C000) ADC Structure */ - __IO uint32_t CR; /*!< (@ 0x4001C000) A/D Control Register */ - __IO uint32_t GDR; /*!< (@ 0x4001C004) A/D Global Data Register */ - __I uint32_t RESERVED0[1]; - __IO uint32_t INTEN; /*!< (@ 0x4001C00C) A/D Interrupt Enable Register */ - union{ - __I uint32_t DR[8]; /*!< (@ 0x4001C010) A/D Channel Data Register*/ - struct{ - __IO uint32_t DR0; /*!< (@ 0x40020010) A/D Channel Data Register 0*/ - __IO uint32_t DR1; /*!< (@ 0x40020014) A/D Channel Data Register 1*/ - __IO uint32_t DR2; /*!< (@ 0x40020018) A/D Channel Data Register 2*/ - __IO uint32_t DR3; /*!< (@ 0x4002001C) A/D Channel Data Register 3*/ - __IO uint32_t DR4; /*!< (@ 0x40020020) A/D Channel Data Register 4*/ - __IO uint32_t DR5; /*!< (@ 0x40020024) A/D Channel Data Register 5*/ - __IO uint32_t DR6; /*!< (@ 0x40020028) A/D Channel Data Register 6*/ - __IO uint32_t DR7; /*!< (@ 0x4002002C) A/D Channel Data Register 7*/ - }; - }; - __I uint32_t STAT; /*!< (@ 0x4001C030) A/D Status Register. */ -} LPC_ADC_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- PMU ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x Power Management Unit (PMU) Modification date=3/16/2011 Major revision=0 Minor revision=3 (PMU) - */ - -typedef struct { /*!< (@ 0x40038000) PMU Structure */ - __IO uint32_t PCON; /*!< (@ 0x40038000) Power control register */ - union{ - __IO uint32_t GPREG[4]; /*!< (@ 0x40038004) General purpose register 0 */ - struct{ - __IO uint32_t GPREG0; /*!< (@ 0x40038004) General purpose register 0 */ - __IO uint32_t GPREG1; /*!< (@ 0x40038008) General purpose register 1 */ - __IO uint32_t GPREG2; /*!< (@ 0x4003800C) General purpose register 2 */ - __IO uint32_t GPREG3; /*!< (@ 0x40038010) General purpose register 3 */ - }; - }; -} LPC_PMU_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- FLASHCTRL ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x Flash programming firmware Modification date=3/17/2011 Major revision=0 Minor revision=3 (FLASHCTRL) - */ - -typedef struct { /*!< (@ 0x4003C000) FLASHCTRL Structure */ - __I uint32_t RESERVED0[4]; - __IO uint32_t FLASHCFG; /*!< (@ 0x4003C010) Flash memory access time configuration register */ - __I uint32_t RESERVED1[3]; - __IO uint32_t FMSSTART; /*!< (@ 0x4003C020) Signature start address register */ - __IO uint32_t FMSSTOP; /*!< (@ 0x4003C024) Signature stop-address register */ - __I uint32_t RESERVED2[1]; - __I uint32_t FMSW0; /*!< (@ 0x4003C02C) Word 0 [31:0] */ - __I uint32_t FMSW1; /*!< (@ 0x4003C030) Word 1 [63:32] */ - __I uint32_t FMSW2; /*!< (@ 0x4003C034) Word 2 [95:64] */ - __I uint32_t FMSW3; /*!< (@ 0x4003C038) Word 3 [127:96] */ - __I uint32_t RESERVED3[1001]; - __I uint32_t FMSTAT; /*!< (@ 0x4003CFE0) Signature generation status register */ - __I uint32_t RESERVED4[1]; - __IO uint32_t FMSTATCLR; /*!< (@ 0x4003CFE8) Signature generation status clear register */ -} LPC_FLASHCTRL_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- SSP0/1 ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x SSP/SPI Modification date=3/16/2011 Major revision=0 Minor revision=3 (SSP0) - */ - -typedef struct { /*!< (@ 0x40040000) SSP0 Structure */ - __IO uint32_t CR0; /*!< (@ 0x40040000) Control Register 0. Selects the serial clock rate, bus type, and data size. */ - __IO uint32_t CR1; /*!< (@ 0x40040004) Control Register 1. Selects master/slave and other modes. */ - __IO uint32_t DR; /*!< (@ 0x40040008) Data Register. Writes fill the transmit FIFO, and reads empty the receive FIFO. */ - __I uint32_t SR; /*!< (@ 0x4004000C) Status Register */ - __IO uint32_t CPSR; /*!< (@ 0x40040010) Clock Prescale Register */ - __IO uint32_t IMSC; /*!< (@ 0x40040014) Interrupt Mask Set and Clear Register */ - __I uint32_t RIS; /*!< (@ 0x40040018) Raw Interrupt Status Register */ - __I uint32_t MIS; /*!< (@ 0x4004001C) Masked Interrupt Status Register */ - __IO uint32_t ICR; /*!< (@ 0x40040020) SSPICR Interrupt Clear Register */ -} LPC_SSPx_Type; - - - -// ------------------------------------------------------------------------------------------------ -// ----- IOCONFIG ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x I/O configuration Modification date=3/16/2011 Major revision=0 Minor revision=3 (IOCONFIG) - */ - -typedef struct { /*!< (@ 0x40044000) IOCONFIG Structure */ - __IO uint32_t RESET_PIO0_0; /*!< (@ 0x40044000) I/O configuration for pin RESET/PIO0_0 */ - __IO uint32_t PIO0_1; /*!< (@ 0x40044004) I/O configuration for pin PIO0_1/CLKOUT/CT32B0_MAT2/USB_FTOGGLE */ - __IO uint32_t PIO0_2; /*!< (@ 0x40044008) I/O configuration for pin PIO0_2/SSEL0/CT16B0_CAP0 */ - __IO uint32_t PIO0_3; /*!< (@ 0x4004400C) I/O configuration for pin PIO0_3/USB_VBUS */ - __IO uint32_t PIO0_4; /*!< (@ 0x40044010) I/O configuration for pin PIO0_4/SCL */ - __IO uint32_t PIO0_5; /*!< (@ 0x40044014) I/O configuration for pin PIO0_5/SDA */ - __IO uint32_t PIO0_6; /*!< (@ 0x40044018) I/O configuration for pin PIO0_6/USB_CONNECT/SCK0 */ - __IO uint32_t PIO0_7; /*!< (@ 0x4004401C) I/O configuration for pin PIO0_7/CTS */ - __IO uint32_t PIO0_8; /*!< (@ 0x40044020) I/O configuration for pin PIO0_8/MISO0/CT16B0_MAT0 */ - __IO uint32_t PIO0_9; /*!< (@ 0x40044024) I/O configuration for pin PIO0_9/MOSI0/CT16B0_MAT1 */ - __IO uint32_t SWCLK_PIO0_10; /*!< (@ 0x40044028) I/O configuration for pin SWCLK/PIO0_10/ SCK0/CT16B0_MAT2 */ - __IO uint32_t TDI_PIO0_11; /*!< (@ 0x4004402C) I/O configuration for pin TDI/PIO0_11/AD0/CT32B0_MAT3 */ - __IO uint32_t TMS_PIO0_12; /*!< (@ 0x40044030) I/O configuration for pin TMS/PIO0_12/AD1/CT32B1_CAP0 */ - __IO uint32_t TDO_PIO0_13; /*!< (@ 0x40044034) I/O configuration for pin TDO/PIO0_13/AD2/CT32B1_MAT0 */ - __IO uint32_t TRST_PIO0_14; /*!< (@ 0x40044038) I/O configuration for pin TRST/PIO0_14/AD3/CT32B1_MAT1 */ - __IO uint32_t SWDIO_PIO0_15; /*!< (@ 0x4004403C) I/O configuration for pin SWDIO/PIO0_15/AD4/CT32B1_MAT2 */ - __IO uint32_t PIO0_16; /*!< (@ 0x40044040) I/O configuration for pin PIO0_16/AD5/CT32B1_MAT3/ WAKEUP */ - __IO uint32_t PIO0_17; /*!< (@ 0x40044044) I/O configuration for pin PIO0_17/RTS/CT32B0_CAP0/SCLK */ - __IO uint32_t PIO0_18; /*!< (@ 0x40044048) I/O configuration for pin PIO0_18/RXD/CT32B0_MAT0 */ - __IO uint32_t PIO0_19; /*!< (@ 0x4004404C) I/O configuration for pin PIO0_19/TXD/CT32B0_MAT1 */ - __IO uint32_t PIO0_20; /*!< (@ 0x40044050) I/O configuration for pin PIO0_20/CT16B1_CAP0 */ - __IO uint32_t PIO0_21; /*!< (@ 0x40044054) I/O configuration for pin PIO0_21/CT16B1_MAT0/MOSI1 */ - __IO uint32_t PIO0_22; /*!< (@ 0x40044058) I/O configuration for pin PIO0_22/AD6/CT16B1_MAT1/MISO1 */ - __IO uint32_t PIO0_23; /*!< (@ 0x4004405C) I/O configuration for pin PIO0_23/AD7 */ - __IO uint32_t PIO1_0; /*!< Offset: 0x060 */ - __IO uint32_t PIO1_1; - __IO uint32_t PIO1_2; - __IO uint32_t PIO1_3; - __IO uint32_t PIO1_4; /*!< Offset: 0x070 */ - __IO uint32_t PIO1_5; /*!< (@ 0x40044074) I/O configuration for pin PIO1_5/CT32B1_CAP1 */ - __IO uint32_t PIO1_6; - __IO uint32_t PIO1_7; - __IO uint32_t PIO1_8; /*!< Offset: 0x080 */ - __IO uint32_t PIO1_9; - __IO uint32_t PIO1_10; - __IO uint32_t PIO1_11; - __IO uint32_t PIO1_12; /*!< Offset: 0x090 */ - __IO uint32_t PIO1_13; /*!< (@ 0x40044094) I/O configuration for pin PIO1_13/DTR/CT16B0_MAT0/TXD */ - __IO uint32_t PIO1_14; /*!< (@ 0x40044098) I/O configuration for pin PIO1_14/DSR/CT16B0_MAT1/RXD */ - __IO uint32_t PIO1_15; /*!< (@ 0x4004409C) I/O configuration for pin PIO1_15/DCD/ CT16B0_MAT2/SCK1 */ - __IO uint32_t PIO1_16; /*!< (@ 0x400440A0) I/O configuration for pin PIO1_16/RI/CT16B0_CAP0 */ - __IO uint32_t PIO1_17; - __IO uint32_t PIO1_18; - __IO uint32_t PIO1_19; /*!< (@ 0x400440AC) I/O configuration for pin PIO1_19/DTR/SSEL1 */ - __IO uint32_t PIO1_20; /*!< (@ 0x400440B0) I/O configuration for pin PIO1_20/DSR/SCK1 */ - __IO uint32_t PIO1_21; /*!< (@ 0x400440B4) I/O configuration for pin PIO1_21/DCD/MISO1 */ - __IO uint32_t PIO1_22; /*!< (@ 0x400440B8) I/O configuration for pin PIO1_22/RI/MOSI1 */ - __IO uint32_t PIO1_23; /*!< (@ 0x400440BC) I/O configuration for pin PIO1_23/CT16B1_MAT1/SSEL1 */ - __IO uint32_t PIO1_24; /*!< (@ 0x400440C0) I/O configuration for pin PIO1_24/ CT32B0_MAT0 */ - __IO uint32_t PIO1_25; /*!< (@ 0x400440C4) I/O configuration for pin PIO1_25/CT32B0_MAT1 */ - __IO uint32_t PIO1_26; /*!< (@ 0x400440C8) I/O configuration for pin PIO1_26/CT32B0_MAT2/ RXD */ - __IO uint32_t PIO1_27; /*!< (@ 0x400440CC) I/O configuration for pin PIO1_27/CT32B0_MAT3/ TXD */ - __IO uint32_t PIO1_28; /*!< (@ 0x400440D0) I/O configuration for pin PIO1_28/CT32B0_CAP0/ SCLK */ - __IO uint32_t PIO1_29; /*!< (@ 0x400440D4) I/O configuration for pin PIO1_29/SCK0/ CT32B0_CAP1 */ - __IO uint32_t PIO1_30; - __IO uint32_t PIO1_31; /*!< (@ 0x400440DC) I/O configuration for pin PIO1_31 */ -} LPC_IOCON_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- SYSCON ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x System control block Modification date=3/16/2011 Major revision=0 Minor revision=3 (SYSCON) - */ - -typedef struct { /*!< (@ 0x40048000) SYSCON Structure */ - __IO uint32_t SYSMEMREMAP; /*!< (@ 0x40048000) System memory remap */ - __IO uint32_t PRESETCTRL; /*!< (@ 0x40048004) Peripheral reset control */ - __IO uint32_t SYSPLLCTRL; /*!< (@ 0x40048008) System PLL control */ - __I uint32_t SYSPLLSTAT; /*!< (@ 0x4004800C) System PLL status */ - __IO uint32_t USBPLLCTRL; /*!< (@ 0x40048010) USB PLL control */ - __I uint32_t USBPLLSTAT; /*!< (@ 0x40048014) USB PLL status */ - __I uint32_t RESERVED0[2]; - __IO uint32_t SYSOSCCTRL; /*!< (@ 0x40048020) System oscillator control */ - __IO uint32_t WDTOSCCTRL; /*!< (@ 0x40048024) Watchdog oscillator control */ - __I uint32_t RESERVED1[2]; - __IO uint32_t SYSRSTSTAT; /*!< (@ 0x40048030) System reset status register */ - __I uint32_t RESERVED2[3]; - __IO uint32_t SYSPLLCLKSEL; /*!< (@ 0x40048040) System PLL clock source select */ - __IO uint32_t SYSPLLCLKUEN; /*!< (@ 0x40048044) System PLL clock source update enable */ - __IO uint32_t USBPLLCLKSEL; /*!< (@ 0x40048048) USB PLL clock source select */ - __IO uint32_t USBPLLCLKUEN; /*!< (@ 0x4004804C) USB PLL clock source update enable */ - __I uint32_t RESERVED3[8]; - __IO uint32_t MAINCLKSEL; /*!< (@ 0x40048070) Main clock source select */ - __IO uint32_t MAINCLKUEN; /*!< (@ 0x40048074) Main clock source update enable */ - __IO uint32_t SYSAHBCLKDIV; /*!< (@ 0x40048078) System clock divider */ - __I uint32_t RESERVED4[1]; - __IO uint32_t SYSAHBCLKCTRL; /*!< (@ 0x40048080) System clock control */ - __I uint32_t RESERVED5[4]; - __IO uint32_t SSP0CLKDIV; /*!< (@ 0x40048094) SSP0 clock divider */ - __IO uint32_t UARTCLKDIV; /*!< (@ 0x40048098) UART clock divider */ - __IO uint32_t SSP1CLKDIV; /*!< (@ 0x4004809C) SSP1 clock divider */ - __I uint32_t RESERVED6[8]; - __IO uint32_t USBCLKSEL; /*!< (@ 0x400480C0) USB clock source select */ - __IO uint32_t USBCLKUEN; /*!< (@ 0x400480C4) USB clock source update enable */ - __IO uint32_t USBCLKDIV; /*!< (@ 0x400480C8) USB clock source divider */ - __I uint32_t RESERVED7[5]; - __IO uint32_t CLKOUTSEL; /*!< (@ 0x400480E0) CLKOUT clock source select */ - __IO uint32_t CLKOUTUEN; /*!< (@ 0x400480E4) CLKOUT clock source update enable */ - __IO uint32_t CLKOUTDIV; /*!< (@ 0x400480E8) CLKOUT clock divider */ - __I uint32_t RESERVED8[5]; - __I uint32_t PIOPORCAP0; /*!< (@ 0x40048100) POR captured PIO status 0 */ - __I uint32_t PIOPORCAP1; /*!< (@ 0x40048104) POR captured PIO status 1 */ - __I uint32_t RESERVED9[18]; - __IO uint32_t BODCTRL; /*!< (@ 0x40048150) Brown-Out Detect */ - __IO uint32_t SYSTCKCAL; /*!< (@ 0x40048154) System tick counter calibration */ - __I uint32_t RESERVED10[6]; - __IO uint32_t IRQLATENCY; /*!< (@ 0x40048170) IQR delay */ - __IO uint32_t NMISRC; /*!< (@ 0x40048174) NMI Source Control */ - __IO uint32_t PINTSEL[8]; /*!< (@ 0x40048178) GPIO Pin Interrupt Select register 0 */ - __IO uint32_t USBCLKCTRL; /*!< (@ 0x40048198) USB clock control */ - __I uint32_t USBCLKST; /*!< (@ 0x4004819C) USB clock status */ - __I uint32_t RESERVED11[25]; - __IO uint32_t STARTERP0; /*!< (@ 0x40048204) Start logic 0 interrupt wake-up enable register 0 */ - __I uint32_t RESERVED12[3]; - __IO uint32_t STARTERP1; /*!< (@ 0x40048214) Start logic 1 interrupt wake-up enable register 1 */ - __I uint32_t RESERVED13[6]; - __IO uint32_t PDSLEEPCFG; /*!< (@ 0x40048230) Power-down states in deep-sleep mode */ - __IO uint32_t PDAWAKECFG; /*!< (@ 0x40048234) Power-down states for wake-up from deep-sleep */ - __IO uint32_t PDRUNCFG; /*!< (@ 0x40048238) Power configuration register */ - __I uint32_t RESERVED14[110]; - __I uint32_t DEVICE_ID; /*!< (@ 0x400483F4) Device ID */ -} LPC_SYSCON_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- GPIO_PIN_INT ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x GPIO Modification date=3/17/2011 Major revision=0 Minor revision=3 (GPIO_PIN_INT) - */ - -typedef struct { /*!< (@ 0x4004C000) GPIO_PIN_INT Structure */ - __IO uint32_t ISEL; /*!< (@ 0x4004C000) Pin Interrupt Mode register */ - __IO uint32_t IENR; /*!< (@ 0x4004C004) Pin Interrupt Enable (Rising) register */ - __IO uint32_t SIENR; /*!< (@ 0x4004C008) Set Pin Interrupt Enable (Rising) register */ - __IO uint32_t CIENR; /*!< (@ 0x4004C00C) Clear Pin Interrupt Enable (Rising) register */ - __IO uint32_t IENF; /*!< (@ 0x4004C010) Pin Interrupt Enable Falling Edge / Active Level register */ - __IO uint32_t SIENF; /*!< (@ 0x4004C014) Set Pin Interrupt Enable Falling Edge / Active Level register */ - __IO uint32_t CIENF; /*!< (@ 0x4004C018) Clear Pin Interrupt Enable Falling Edge / Active Level address */ - __IO uint32_t RISE; /*!< (@ 0x4004C01C) Pin Interrupt Rising Edge register */ - __IO uint32_t FALL; /*!< (@ 0x4004C020) Pin Interrupt Falling Edge register */ - __IO uint32_t IST; /*!< (@ 0x4004C024) Pin Interrupt Status register */ -} LPC_GPIO_PIN_INT_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- GPIO_GROUP_INT0/1 ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x GPIO Modification date=3/17/2011 Major revision=0 Minor revision=3 (GPIO_GROUP_INT0) - */ - -typedef struct { /*!< (@ 0x4005C000) GPIO_GROUP_INT0 Structure */ - __IO uint32_t CTRL; /*!< (@ 0x4005C000) GPIO grouped interrupt control register */ - __I uint32_t RESERVED0[7]; - __IO uint32_t PORT_POL[2]; /*!< (@ 0x4005C020) GPIO grouped interrupt port 0 polarity register */ - __I uint32_t RESERVED1[6]; - __IO uint32_t PORT_ENA[2]; /*!< (@ 0x4005C040) GPIO grouped interrupt port 0/1 enable register */ -} LPC_GPIO_GROUP_INTx_Type; - - - -// ------------------------------------------------------------------------------------------------ -// ----- USB ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x USB2.0device controller Modification date=3/16/2011 Major revision=0 Minor revision=3 (USB) - */ - -typedef struct { /*!< (@ 0x40080000) USB Structure */ - __IO uint32_t DEVCMDSTAT; /*!< (@ 0x40080000) USB Device Command/Status register */ - __IO uint32_t INFO; /*!< (@ 0x40080004) USB Info register */ - __IO uint32_t EPLISTSTART; /*!< (@ 0x40080008) USB EP Command/Status List start address */ - __IO uint32_t DATABUFSTART; /*!< (@ 0x4008000C) USB Data buffer start address */ - __IO uint32_t LPM; /*!< (@ 0x40080010) Link Power Management register */ - __IO uint32_t EPSKIP; /*!< (@ 0x40080014) USB Endpoint skip */ - __IO uint32_t EPINUSE; /*!< (@ 0x40080018) USB Endpoint Buffer in use */ - __IO uint32_t EPBUFCFG; /*!< (@ 0x4008001C) USB Endpoint Buffer Configuration register */ - __IO uint32_t INTSTAT; /*!< (@ 0x40080020) USB interrupt status register */ - __IO uint32_t INTEN; /*!< (@ 0x40080024) USB interrupt enable register */ - __IO uint32_t INTSETSTAT; /*!< (@ 0x40080028) USB set interrupt status register */ - __IO uint32_t INTROUTING; /*!< (@ 0x4008002C) USB interrupt routing register */ - __I uint32_t RESERVED0[1]; - __I uint32_t EPTOGGLE; /*!< (@ 0x40080034) USB Endpoint toggle register */ -} LPC_USB_Type; - - -// ------------------------------------------------------------------------------------------------ -// ----- GPIO_PORT ----- -// ------------------------------------------------------------------------------------------------ - - -/** - * @brief Product name title=UM10462 Chapter title=LPC11U1x GPIO Modification date=3/17/2011 Major revision=0 Minor revision=3 (GPIO_PORT) - */ - -typedef struct { - union { - struct { - __IO uint8_t B0[32]; /*!< (@ 0x50000000) Byte pin registers port 0; pins PIO0_0 to PIO0_31 */ - __IO uint8_t B1[32]; /*!< (@ 0x50000020) Byte pin registers port 1 */ - }; - __IO uint8_t B[64]; /*!< (@ 0x50000000) Byte pin registers port 0/1 */ - }; - __I uint32_t RESERVED0[1008]; - union { - struct { - __IO uint32_t W0[32]; /*!< (@ 0x50001000) Word pin registers port 0 */ - __IO uint32_t W1[32]; /*!< (@ 0x50001080) Word pin registers port 1 */ - }; - __IO uint32_t W[64]; /*!< (@ 0x50001000) Word pin registers port 0/1 */ - }; - uint32_t RESERVED1[960]; - __IO uint32_t DIR[2]; /* 0x2000 */ - uint32_t RESERVED2[30]; - __IO uint32_t MASK[2]; /* 0x2080 */ - uint32_t RESERVED3[30]; - __IO uint32_t PIN[2]; /* 0x2100 */ - uint32_t RESERVED4[30]; - __IO uint32_t MPIN[2]; /* 0x2180 */ - uint32_t RESERVED5[30]; - __IO uint32_t SET[2]; /* 0x2200 */ - uint32_t RESERVED6[30]; - __O uint32_t CLR[2]; /* 0x2280 */ - uint32_t RESERVED7[30]; - __O uint32_t NOT[2]; /* 0x2300 */ -} LPC_GPIO_Type; - - -#if defined ( __CC_ARM ) - #pragma no_anon_unions -#endif - - -// ------------------------------------------------------------------------------------------------ -// ----- Peripheral memory map ----- -// ------------------------------------------------------------------------------------------------ - -#define LPC_I2C_BASE (0x40000000) -#define LPC_WWDT_BASE (0x40004000) -#define LPC_USART_BASE (0x40008000) -#define LPC_CT16B0_BASE (0x4000C000) -#define LPC_CT16B1_BASE (0x40010000) -#define LPC_CT32B0_BASE (0x40014000) -#define LPC_CT32B1_BASE (0x40018000) -#define LPC_ADC_BASE (0x4001C000) -#define LPC_PMU_BASE (0x40038000) -#define LPC_FLASHCTRL_BASE (0x4003C000) -#define LPC_SSP0_BASE (0x40040000) -#define LPC_SSP1_BASE (0x40058000) -#define LPC_IOCON_BASE (0x40044000) -#define LPC_SYSCON_BASE (0x40048000) -#define LPC_GPIO_PIN_INT_BASE (0x4004C000) -#define LPC_GPIO_GROUP_INT0_BASE (0x4005C000) -#define LPC_GPIO_GROUP_INT1_BASE (0x40060000) -#define LPC_USB_BASE (0x40080000) -#define LPC_GPIO_BASE (0x50000000) - - -// ------------------------------------------------------------------------------------------------ -// ----- Peripheral declaration ----- -// ------------------------------------------------------------------------------------------------ - -#define LPC_I2C ((LPC_I2C_Type *) LPC_I2C_BASE) -#define LPC_WWDT ((LPC_WWDT_Type *) LPC_WWDT_BASE) -#define LPC_USART ((LPC_USART_Type *) LPC_USART_BASE) -#define LPC_CT16B0 ((LPC_CTxxBx_Type *) LPC_CT16B0_BASE) -#define LPC_CT16B1 ((LPC_CTxxBx_Type *) LPC_CT16B1_BASE) -#define LPC_CT32B0 ((LPC_CTxxBx_Type *) LPC_CT32B0_BASE) -#define LPC_CT32B1 ((LPC_CTxxBx_Type *) LPC_CT32B1_BASE) -#define LPC_ADC ((LPC_ADC_Type *) LPC_ADC_BASE) -#define LPC_PMU ((LPC_PMU_Type *) LPC_PMU_BASE) -#define LPC_FLASHCTRL ((LPC_FLASHCTRL_Type *) LPC_FLASHCTRL_BASE) -#define LPC_SSP0 ((LPC_SSPx_Type *) LPC_SSP0_BASE) -#define LPC_SSP1 ((LPC_SSPx_Type *) LPC_SSP1_BASE) -#define LPC_IOCON ((LPC_IOCON_Type *) LPC_IOCON_BASE) -#define LPC_SYSCON ((LPC_SYSCON_Type *) LPC_SYSCON_BASE) -#define LPC_GPIO_PIN_INT ((LPC_GPIO_PIN_INT_Type *) LPC_GPIO_PIN_INT_BASE) -#define LPC_GPIO_GROUP_INT0 ((LPC_GPIO_GROUP_INTx_Type*) LPC_GPIO_GROUP_INT0_BASE) -#define LPC_GPIO_GROUP_INT1 ((LPC_GPIO_GROUP_INTx_Type*) LPC_GPIO_GROUP_INT1_BASE) -#define LPC_USB ((LPC_USB_Type *) LPC_USB_BASE) -#define LPC_GPIO ((LPC_GPIO_Type *) LPC_GPIO_BASE) - - -/** @} */ /* End of group Device_Peripheral_Registers */ -/** @} */ /* End of group (null) */ -/** @} */ /* End of group LPC11Uxx */ - -#ifdef __cplusplus -} -#endif - - -#endif // __LPC11UXX_H__ diff --git a/os/hal/platforms/LPC11Uxx/gpt_lld.c b/os/hal/platforms/LPC11Uxx/gpt_lld.c deleted file mode 100644 index 0d3963f784..0000000000 --- a/os/hal/platforms/LPC11Uxx/gpt_lld.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/gpt_lld.c - * @brief LPC11Uxx GPT subsystem low level driver source. - * - * @addtogroup GPT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief GPT1 driver identifier. - * @note The driver GPT1 allocates the complex timer CT16B0 when enabled. - */ -#if LPC_GPT_USE_CT16B0 || defined(__DOXYGEN__) -GPTDriver GPTD1; -#endif - -/** - * @brief GPT2 driver identifier. - * @note The driver GPT2 allocates the timer CT16B1 when enabled. - */ -#if LPC_GPT_USE_CT16B1 || defined(__DOXYGEN__) -GPTDriver GPTD2; -#endif - -/** - * @brief GPT3 driver identifier. - * @note The driver GPT3 allocates the timer CT32B0 when enabled. - */ -#if LPC_GPT_USE_CT32B0 || defined(__DOXYGEN__) -GPTDriver GPTD3; -#endif - -/** - * @brief GPT4 driver identifier. - * @note The driver GPT4 allocates the timer CT32B1 when enabled. - */ -#if LPC_GPT_USE_CT32B1 || defined(__DOXYGEN__) -GPTDriver GPTD4; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared IRQ handler. - * - * @param[in] gptp pointer to a @p GPTDriver object - */ -static void gpt_lld_serve_interrupt(GPTDriver *gptp) { - - gptp->tmr->IR = 1; /* Clear interrupt on match MR0.*/ - if (gptp->state == GPT_ONESHOT) { - gptp->state = GPT_READY; /* Back in GPT_READY state. */ - gpt_lld_stop_timer(gptp); /* Timer automatically stopped. */ - } - gptp->config->callback(gptp); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC_GPT_USE_CT16B0 -/** - * @brief CT16B0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector80) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC_GPT_USE_CT16B0 */ - -#if LPC_GPT_USE_CT16B1 -/** - * @brief CT16B1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector84) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC_GPT_USE_CT16B0 */ - -#if LPC_GPT_USE_CT32B0 -/** - * @brief CT32B0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector88) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC_GPT_USE_CT32B0 */ - -#if LPC_GPT_USE_CT32B1 -/** - * @brief CT32B1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector8C) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD4); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC_GPT_USE_CT32B1 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level GPT driver initialization. - * - * @notapi - */ -void gpt_lld_init(void) { - -#if LPC_GPT_USE_CT16B0 - /* Driver initialization.*/ - GPTD1.tmr = LPC_CT16B0; - gptObjectInit(&GPTD1); -#endif - -#if LPC_GPT_USE_CT16B1 - /* Driver initialization.*/ - GPTD2.tmr = LPC_CT16B1; - gptObjectInit(&GPTD2); -#endif - -#if LPC_GPT_USE_CT32B0 - /* Driver initialization.*/ - GPTD3.tmr = LPC_CT32B0; - gptObjectInit(&GPTD3); -#endif - -#if LPC_GPT_USE_CT32B1 - /* Driver initialization.*/ - GPTD4.tmr = LPC_CT32B1; - gptObjectInit(&GPTD4); -#endif -} - -/** - * @brief Configures and activates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_start(GPTDriver *gptp) { - uint32_t pr; - - if (gptp->state == GPT_STOP) { - /* Clock activation.*/ -#if LPC_GPT_USE_CT16B0 - if (&GPTD1 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 7); - nvicEnableVector(TIMER_16_0_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif -#if LPC_GPT_USE_CT16B1 - if (&GPTD2 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8); - nvicEnableVector(TIMER_16_1_IRQn, CORTEX_PRIORITY_MASK(3)); - } -#endif -#if LPC_GPT_USE_CT32B0 - if (&GPTD3 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9); - nvicEnableVector(TIMER_32_0_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif -#if LPC_GPT_USE_CT32B1 - if (&GPTD4 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 10); - nvicEnableVector(TIMER_32_1_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif - } - - /* Prescaler value calculation.*/ - pr = (uint16_t)((LPC_SYSCLK / gptp->config->frequency) - 1); - chDbgAssert(((uint32_t)(pr + 1) * gptp->config->frequency) == LPC_SYSCLK, - "gpt_lld_start(), #1", "invalid frequency"); - - /* Timer configuration.*/ - gptp->tmr->PR = pr; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; -} - -/** - * @brief Deactivates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop(GPTDriver *gptp) { - - if (gptp->state == GPT_READY) { - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; - -#if LPC_GPT_USE_CT16B0 - if (&GPTD1 == gptp) { - nvicDisableVector(TIMER_16_0_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 7); - } -#endif -#if LPC_GPT_USE_CT16B1 - if (&GPTD2 == gptp) { - nvicDisableVector(TIMER_16_1_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 8); - } -#endif -#if LPC_GPT_USE_CT32B0 - if (&GPTD3 == gptp) { - nvicDisableVector(TIMER_32_0_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 9); - } -#endif -#if LPC_GPT_USE_CT32B1 - if (&GPTD4 == gptp) { - nvicDisableVector(TIMER_32_1_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 10); - } -#endif - } -} - -/** - * @brief Starts the timer in continuous mode. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval period in ticks - * - * @notapi - */ -void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tmr->MR0 = interval - 1; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 3; /* IRQ and clr TC on match MR0. */ - gptp->tmr->TCR = 2; /* Reset counter and prescaler. */ - gptp->tmr->TCR = 1; /* Timer enabled. */ -} - -/** - * @brief Stops the timer. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop_timer(GPTDriver *gptp) { - - gptp->tmr->IR = 1; - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; -} - -/** - * @brief Starts the timer in one shot mode and waits for completion. - * @details This function specifically polls the timer waiting for completion - * in order to not have extra delays caused by interrupt servicing, - * this function is only recommended for short delays. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval time interval in ticks - * - * @notapi - */ -void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tmr->MR0 = interval - 1; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 4; /* Stop TC on match MR0. */ - gptp->tmr->TCR = 2; /* Reset counter and prescaler. */ - gptp->tmr->TCR = 1; /* Timer enabled. */ - while (gptp->tmr->TCR & 1) - ; -} - -#endif /* HAL_USE_GPT */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/gpt_lld.h b/os/hal/platforms/LPC11Uxx/gpt_lld.h deleted file mode 100644 index e8d347b095..0000000000 --- a/os/hal/platforms/LPC11Uxx/gpt_lld.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/gpt_lld.h - * @brief LPC11Uxx GPT subsystem low level driver header. - * - * @addtogroup GPT - * @{ - */ - -#ifndef _GPT_LLD_H_ -#define _GPT_LLD_H_ - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief GPT1 driver enable switch. - * @details If set to @p TRUE the support for GPT1 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC_GPT_USE_CT16B0) || defined(__DOXYGEN__) -#define LPC_GPT_USE_CT16B0 TRUE -#endif - -/** - * @brief GPT2 driver enable switch. - * @details If set to @p TRUE the support for GPT2 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC_GPT_USE_CT16B1) || defined(__DOXYGEN__) -#define LPC_GPT_USE_CT16B1 TRUE -#endif - -/** - * @brief GPT3 driver enable switch. - * @details If set to @p TRUE the support for GPT3 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC_GPT_USE_CT32B0) || defined(__DOXYGEN__) -#define LPC_GPT_USE_CT32B0 TRUE -#endif - -/** - * @brief GPT4 driver enable switch. - * @details If set to @p TRUE the support for GPT4 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC_GPT_USE_CT32B1) || defined(__DOXYGEN__) -#define LPC_GPT_USE_CT32B1 TRUE -#endif - -/** - * @brief GPT1 interrupt priority level setting. - */ -#if !defined(LPC_GPT_CT16B0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_GPT_CT16B0_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT2 interrupt priority level setting. - */ -#if !defined(LPC_GPT_CT16B1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_GPT_CT16B1_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT3 interrupt priority level setting. - */ -#if !defined(LPC_GPT_CT32B0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_GPT_CT32B0_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT4 interrupt priority level setting. - */ -#if !defined(LPC_GPT_CT32B1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_GPT_CT32B1_IRQ_PRIORITY 2 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !LPC_GPT_USE_CT16B0 && !LPC_GPT_USE_CT16B1 && \ - !LPC_GPT_USE_CT32B0 && !LPC_GPT_USE_CT32B1 -#error "GPT driver activated but no CT peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief GPT frequency type. - */ -typedef uint32_t gptfreq_t; - -/** - * @brief GPT counter type. - */ -typedef uint32_t gptcnt_t; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Timer clock in Hz. - * @note The low level can use assertions in order to catch invalid - * frequency specifications. - */ - gptfreq_t frequency; - /** - * @brief Timer callback pointer. - * @note This callback is invoked on GPT counter events. - */ - gptcallback_t callback; - /* End of the mandatory fields.*/ -} GPTConfig; - -/** - * @brief Structure representing a GPT driver. - */ -struct GPTDriver { - /** - * @brief Driver state. - */ - gptstate_t state; - /** - * @brief Current configuration data. - */ - const GPTConfig *config; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the CTxxBy registers block. - */ - LPC_CTxxBx_Type *tmr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC_GPT_USE_CT16B0 && !defined(__DOXYGEN__) -extern GPTDriver GPTD1; -#endif - -#if LPC_GPT_USE_CT16B1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD2; -#endif - -#if LPC_GPT_USE_CT32B0 && !defined(__DOXYGEN__) -extern GPTDriver GPTD3; -#endif - -#if LPC_GPT_USE_CT32B1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD4; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void gpt_lld_init(void); - void gpt_lld_start(GPTDriver *gptp); - void gpt_lld_stop(GPTDriver *gptp); - void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t period); - void gpt_lld_stop_timer(GPTDriver *gptp); - void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GPT */ - -#endif /* _GPT_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/hal_lld.c b/os/hal/platforms/LPC11Uxx/hal_lld.c deleted file mode 100644 index fa33511fec..0000000000 --- a/os/hal/platforms/LPC11Uxx/hal_lld.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/hal_lld.c - * @brief LPC11Uxx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* SysTick initialization using the system clock.*/ - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, CORTEX_PRIORITY_SYSTICK); - SysTick->LOAD = LPC_SYSCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief LPC11Uxx clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function must be invoked only after the system reset. - * - * @special - */ -void lpc_clock_init(void) { - unsigned i; - - /* Flash wait states setting, the code takes care to not touch TBD bits.*/ - LPC_FLASHCTRL->FLASHCFG = (LPC_FLASHCTRL->FLASHCFG & ~3) | - LPC_FLASHCFG_FLASHTIM; - - /* System oscillator initialization if required.*/ -#if LPC_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT -#if LPC_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC - LPC_SYSCON->SYSOSCCTRL = LPC_SYSOSCCTRL; - LPC_SYSCON->PDRUNCFG &= ~(1 << 5); /* System oscillator ON. */ - for (i = 0; i < 200; i++) - __NOP(); /* Stabilization delay. */ -#endif /* LPC_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC */ - - /* PLL initialization if required.*/ - LPC_SYSCON->SYSPLLCLKSEL = LPC_PLLCLK_SOURCE; - LPC_SYSCON->SYSPLLCLKUEN = 1; /* Really required? */ - LPC_SYSCON->SYSPLLCLKUEN = 0; - LPC_SYSCON->SYSPLLCLKUEN = 1; - LPC_SYSCON->SYSPLLCTRL = LPC_SYSPLLCTRL_MSEL | LPC_SYSPLLCTRL_PSEL; - LPC_SYSCON->PDRUNCFG &= ~(1 << 7); /* System PLL ON. */ - while ((LPC_SYSCON->SYSPLLSTAT & 1) == 0) /* Wait PLL lock. */ - ; -#endif /* LPC_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT */ - - /* Main clock source selection.*/ - LPC_SYSCON->MAINCLKSEL = LPC_MAINCLK_SOURCE; - LPC_SYSCON->MAINCLKUEN = 1; /* Really required? */ - LPC_SYSCON->MAINCLKUEN = 0; - LPC_SYSCON->MAINCLKUEN = 1; - while ((LPC_SYSCON->MAINCLKUEN & 1) == 0) /* Wait switch completion. */ - ; - - /* ABH divider initialization, peripheral clocks are initially disabled, - the various device drivers will handle their own setup except GPIO and - IOCON that are left enabled.*/ - LPC_SYSCON->SYSAHBCLKDIV = LPC_SYSABHCLK_DIV; - LPC_SYSCON->SYSAHBCLKCTRL = 0x0001005F; - - /* Memory remapping, vectors always in ROM.*/ - LPC_SYSCON->SYSMEMREMAP = 2; -} - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/hal_lld.h b/os/hal/platforms/LPC11Uxx/hal_lld.h deleted file mode 100644 index 2f2347ef29..0000000000 --- a/os/hal/platforms/LPC11Uxx/hal_lld.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/hal_lld.h - * @brief HAL subsystem low level driver header template. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "LPC11Uxx.h" -#include "nvic.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "LPC11Uxx" - -#define IRCOSCCLK 12000000 /**< High speed internal clock. */ -#define WDGOSCCLK 1600000 /**< Watchdog internal clock. */ - -#define SYSPLLCLKSEL_IRCOSC 0 /**< Internal RC oscillator - clock source. */ -#define SYSPLLCLKSEL_SYSOSC 1 /**< System oscillator clock - source. */ - -#define SYSMAINCLKSEL_IRCOSC 0 /**< Clock source is IRC. */ -#define SYSMAINCLKSEL_PLLIN 1 /**< Clock source is PLLIN. */ -#define SYSMAINCLKSEL_WDGOSC 2 /**< Clock source is WDGOSC. */ -#define SYSMAINCLKSEL_PLLOUT 3 /**< Clock source is PLLOUT. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief System PLL clock source. - */ -#if !defined(LPC_PLLCLK_SOURCE) || defined(__DOXYGEN__) -#define LPC_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#endif - -/** - * @brief System PLL multiplier. - * @note The value must be in the 1..32 range and the final frequency - * must not exceed the CCO ratings. - */ -#if !defined(LPC_SYSPLL_MUL) || defined(__DOXYGEN__) -#define LPC_SYSPLL_MUL 4 -#endif - -/** - * @brief System PLL divider. - * @note The value must be chosen between (2, 4, 8, 16). - */ -#if !defined(LPC_SYSPLL_DIV) || defined(__DOXYGEN__) -#define LPC_SYSPLL_DIV 4 -#endif - -/** - * @brief System main clock source. - */ -#if !defined(LPC_MAINCLK_SOURCE) || defined(__DOXYGEN__) -#define LPC_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#endif - -/** - * @brief AHB clock divider. - * @note The value must be chosen between (1...255). - */ -#if !defined(LPC_SYSCLK_DIV) || defined(__DOXYGEN__) -#define LPC_SYSABHCLK_DIV 1 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** - * @brief Calculated SYSOSCCTRL setting. - */ -#if (SYSOSCCLK < 20000000) || defined(__DOXYGEN__) -#define LPC_SYSOSCCTRL 0 -#else -#define LPC_SYSOSCCTRL 1 -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (LPC_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC) || defined(__DOXYGEN__) -#define LPC_SYSPLLCLKIN SYSOSCCLK -#elif LPC_PLLCLK_SOURCE == SYSPLLCLKSEL_IRCOSC -#define LPC_SYSPLLCLKIN IRCOSCCLK -#else -#error "invalid LPC_PLLCLK_SOURCE clock source specified" -#endif - -/** - * @brief MSEL mask in SYSPLLCTRL register. - */ -#if (LPC_SYSPLL_MUL >= 1) && (LPC_SYSPLL_MUL <= 32) || defined(__DOXYGEN__) -#define LPC_SYSPLLCTRL_MSEL (LPC_SYSPLL_MUL - 1) -#else -#error "LPC_SYSPLL_MUL out of range (1...32)" -#endif - -/** - * @brief PSEL mask in SYSPLLCTRL register. - */ -#if (LPC_SYSPLL_DIV == 2) || defined(__DOXYGEN__) -#define LPC_SYSPLLCTRL_PSEL (0 << 5) -#elif LPC_SYSPLL_DIV == 4 -#define LPC_SYSPLLCTRL_PSEL (1 << 5) -#elif LPC_SYSPLL_DIV == 8 -#define LPC_SYSPLLCTRL_PSEL (2 << 5) -#elif LPC_SYSPLL_DIV == 16 -#define LPC_SYSPLLCTRL_PSEL (3 << 5) -#else -#error "invalid LPC_SYSPLL_DIV value (2,4,8,16)" -#endif - -/** - * @brief CCP frequency. - */ -#define LPC_SYSPLLCCO (LPC_SYSPLLCLKIN * LPC_SYSPLL_MUL * \ - LPC_SYSPLL_DIV) - -#if (LPC_SYSPLLCCO < 156000000) || (LPC_SYSPLLCCO > 320000000) -#error "CCO frequency out of the acceptable range (156...320)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define LPC_SYSPLLCLKOUT (LPC_SYSPLLCCO / LPC_SYSPLL_DIV) - -#if (LPC_MAINCLK_SOURCE == SYSMAINCLKSEL_IRCOSC) || defined(__DOXYGEN__) -#define LPC_MAINCLK IRCOSCCLK -#elif LPC_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLIN -#define LPC_MAINCLK LPC_SYSPLLCLKIN -#elif LPC_MAINCLK_SOURCE == SYSMAINCLKSEL_WDGOSC -#define LPC_MAINCLK WDGOSCCLK -#elif LPC_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT -#define LPC_MAINCLK LPC_SYSPLLCLKOUT -#else -#error "invalid LPC_MAINCLK_SOURCE clock source specified" -#endif - -/** - * @brief AHB clock. - */ -#define LPC_SYSCLK (LPC_MAINCLK / LPC_SYSABHCLK_DIV) -#if LPC_SYSCLK > 50000000 -#error "AHB clock frequency out of the acceptable range (50MHz max)" -#endif - -/** - * @brief Flash wait states. - */ -#if (LPC_SYSCLK <= 20000000) || defined(__DOXYGEN__) -#define LPC_FLASHCFG_FLASHTIM 0 -#elif LPC_SYSCLK <= 40000000 -#define LPC_FLASHCFG_FLASHTIM 1 -#else -#define LPC_FLASHCFG_FLASHTIM 2 -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void lpc_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/pal_lld.c b/os/hal/platforms/LPC11Uxx/pal_lld.c deleted file mode 100644 index 9e6a305857..0000000000 --- a/os/hal/platforms/LPC11Uxx/pal_lld.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/pal_lld.c - * @brief LPC11Uxx GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ -/** - * @brief LPC11Uxx I/O ports configuration. - * @details GPIO unit registers initialization. - * - * @param[in] config the LPC11Uxx ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - LPC_GPIO->DIR[0] = config->P0.dir; - LPC_GPIO->DIR[1] = config->P1.dir; - LPC_GPIO->PIN[0] = config->P0.data; - LPC_GPIO->PIN[1] = config->P1.data; -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - LPC_GPIO->DIR[port] &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - palSetPort(port, PAL_WHOLE_PORT); - case PAL_MODE_OUTPUT_PUSHPULL: - LPC_GPIO->DIR[port] |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/pal_lld.h b/os/hal/platforms/LPC11Uxx/pal_lld.h deleted file mode 100644 index 8303ab337a..0000000000 --- a/os/hal/platforms/LPC11Uxx/pal_lld.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/pal_lld.h - * @brief LPC11Uxx GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_INPUT_ANALOG -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief GPIO port setup info. - */ -typedef struct { - /** Initial value for FIO_PIN register.*/ - uint32_t data; - /** Initial value for FIO_DIR register.*/ - uint32_t dir; -} gpio_setup_t; - -/** - * @brief GPIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - * @note The @p IOCON block is not configured, initially all pins have - * enabled pullups and are programmed as GPIO. It is responsibility - * of the various drivers to reprogram the pins in the proper mode. - * Pins that are not handled by any driver may be programmed in - * @p board.c. - */ -typedef struct { - /** @brief GPIO 0 setup data.*/ - gpio_setup_t P0; - /** @brief GPIO 1 setup data.*/ - gpio_setup_t P1; -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef uint32_t ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief GPIO0 port identifier. - */ -#define IOPORT1 0 -#define GPIO0 0 - -/** - * @brief GPIO1 port identifier. - */ -#define IOPORT2 1 -#define GPIO1 1 - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) (LPC_GPIO->PIN[(port)]) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) (LPC_GPIO->SET[(port)]) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) (LPC_GPIO->PIN[(port)] = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) (LPC_GPIO->SET[(port)] = (bits)) - -/** - * @brief Clears a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) (LPC_GPIO->CLR[(port)] = (bits)) - -/** - * @brief Toggles a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be XORed on the specified port - * - * @notapi - */ -#define pal_lld_toggleport(port, bits) (LPC_GPIO->NOT[(port)] = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note Programming an unknown or unsupported mode is silently ignored. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Reads a logical state from an I/O pad. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @return The logical state. - * @retval PAL_LOW low logical state. - * @retval PAL_HIGH high logical state. - * - * @notapi - */ -#define pal_lld_readpad(port, pad) \ - (LPC_GPIO->B[((port) * 32) + (pad)]) - -/** - * @brief Writes a logical state on an output pad. - * @note This function is not meant to be invoked directly by the - * application code. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) \ - ((LPC_GPIO->B[((port) * 32) + (pad)]) = (bit)) - -/** - * @brief Sets a pad logical state to @p PAL_HIGH. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_setpad(port, pad) \ - (LPC_GPIO->SET[(port)] = 1 << (pad)) - -/** - * @brief Clears a pad logical state to @p PAL_LOW. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_clearpad(port, pad) \ - (LPC_GPIO->CLR[(port)] = 1 << (pad)) - -/** - * @brief Toggles a pad logical state. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_togglepad(port, pad) \ - (LPC_GPIO->NOT[(port)] = 1 << (pad)) - -#if !defined(__DOXYGEN__) -extern const PALConfig pal_default_config; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/platform.mk b/os/hal/platforms/LPC11Uxx/platform.mk deleted file mode 100644 index 45495ec46b..0000000000 --- a/os/hal/platforms/LPC11Uxx/platform.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the LPC11Uxx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/LPC11Uxx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11Uxx/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11Uxx/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11Uxx/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11Uxx/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/LPC11Uxx diff --git a/os/hal/platforms/LPC11Uxx/serial_lld.c b/os/hal/platforms/LPC11Uxx/serial_lld.c deleted file mode 100644 index d3faa7572e..0000000000 --- a/os/hal/platforms/LPC11Uxx/serial_lld.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/serial_lld.c - * @brief LPC11Uxx low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC_SERIAL_USE_UART0 || defined(__DOXYGEN__) -/** @brief UART0 serial driver identifier.*/ -SerialDriver SD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - LCR_WL8 | LCR_STOP1 | LCR_NOPARITY, - FCR_TRIGGER0 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief USART initialization. - * - * @param[in] sdp communication channel associated to the USART - * @param[in] config the architecture-dependent serial driver configuration - */ -static void uart_init(SerialDriver *sdp, const SerialConfig *config) { - LPC_USART_Type *u = sdp->uart; - - uint32_t div = LPC_SERIAL_UART0_PCLK / (config->sc_speed << 4); - u->LCR = config->sc_lcr | LCR_DLAB; - u->DLL = div; - u->DLM = div >> 8; - u->LCR = config->sc_lcr; - u->FCR = FCR_ENABLE | FCR_RXRESET | FCR_TXRESET | config->sc_fcr; - u->ACR = 0; - u->FDR = 0x10; - u->TER = TER_ENABLE; - u->IER = IER_RBR | IER_STATUS; -} - -/** - * @brief USART de-initialization. - * - * @param[in] u pointer to an USART I/O block - */ -static void uart_deinit(LPC_USART_Type *u) { - - u->LCR = LCR_DLAB; - u->DLL = 1; - u->DLM = 0; - u->LCR = 0; - u->FDR = 0x10; - u->IER = 0; - u->FCR = FCR_RXRESET | FCR_TXRESET; - u->ACR = 0; - u->TER = TER_ENABLE; -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] err UART LSR register value - */ -static void set_error(SerialDriver *sdp, IOREG32 err) { - flagsmask_t sts = 0; - - if (err & LSR_OVERRUN) - sts |= SD_OVERRUN_ERROR; - if (err & LSR_PARITY) - sts |= SD_PARITY_ERROR; - if (err & LSR_FRAMING) - sts |= SD_FRAMING_ERROR; - if (err & LSR_BREAK) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Common IRQ handler. - * @note Tries hard to clear all the pending interrupt sources, we don't - * want to go through the whole ISR and have another interrupt soon - * after. - * - * @param[in] u pointer to an UART I/O block - * @param[in] sdp communication channel associated to the UART - */ -static void serve_interrupt(SerialDriver *sdp) { - LPC_USART_Type *u = sdp->uart; - - while (TRUE) { - switch (u->IIR & IIR_SRC_MASK) { - case IIR_SRC_NONE: - return; - case IIR_SRC_ERROR: - set_error(sdp, u->LSR); - break; - case IIR_SRC_TIMEOUT: - case IIR_SRC_RX: - chSysLockFromIsr(); - if (chIQIsEmptyI(&sdp->iqueue)) - chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE); - chSysUnlockFromIsr(); - while (u->LSR & LSR_RBR_FULL) { - chSysLockFromIsr(); - if (chIQPutI(&sdp->iqueue, u->RBR) < Q_OK) - chnAddFlagsI(sdp, SD_OVERRUN_ERROR); - chSysUnlockFromIsr(); - } - break; - case IIR_SRC_TX: - { - int i = LPC_SERIAL_FIFO_PRELOAD; - do { - msg_t b; - - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - chSysUnlockFromIsr(); - if (b < Q_OK) { - u->IER &= ~IER_THRE; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - chSysUnlockFromIsr(); - break; - } - u->THR = b; - } while (--i); - } - break; - default: - (void) u->THR; - (void) u->RBR; - } - } -} - -/** - * @brief Attempts a TX FIFO preload. - */ -static void preload(SerialDriver *sdp) { - LPC_USART_Type *u = sdp->uart; - - if (u->LSR & LSR_THRE) { - int i = LPC_SERIAL_FIFO_PRELOAD; - do { - msg_t b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - return; - } - u->THR = b; - } while (--i); - } - u->IER |= IER_THRE; -} - -/** - * @brief Driver SD1 output notification. - */ -#if LPC_SERIAL_USE_UART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - preload(&SD1); -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief UART0 IRQ handler. - * - * @isr - */ -#if LPC_SERIAL_USE_UART0 || defined(__DOXYGEN__) -CH_IRQ_HANDLER(Vector94) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if LPC_SERIAL_USE_UART0 - sdObjectInit(&SD1, NULL, notify1); - SD1.uart = LPC_USART; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if LPC_SERIAL_USE_UART0 - if (&SD1 == sdp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 12); - LPC_SYSCON->UARTCLKDIV = LPC_SERIAL_UART0CLKDIV; - nvicEnableVector(UART_IRQn, - CORTEX_PRIORITY_MASK(LPC_SERIAL_UART0_IRQ_PRIORITY)); - } -#endif - } - uart_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the UART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - uart_deinit(sdp->uart); -#if LPC_SERIAL_USE_UART0 - if (&SD1 == sdp) { - LPC_SYSCON->UARTCLKDIV = 0; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 12); - nvicDisableVector(UART_IRQn); - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/serial_lld.h b/os/hal/platforms/LPC11Uxx/serial_lld.h deleted file mode 100644 index 124ce418f4..0000000000 --- a/os/hal/platforms/LPC11Uxx/serial_lld.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/serial_lld.h - * @brief LPC11Uxx low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define IIR_SRC_MASK 0x0F -#define IIR_SRC_NONE 0x01 -#define IIR_SRC_MODEM 0x00 -#define IIR_SRC_TX 0x02 -#define IIR_SRC_RX 0x04 -#define IIR_SRC_ERROR 0x06 -#define IIR_SRC_TIMEOUT 0x0C - -#define IER_RBR 1 -#define IER_THRE 2 -#define IER_STATUS 4 - -#define LCR_WL5 0 -#define LCR_WL6 1 -#define LCR_WL7 2 -#define LCR_WL8 3 -#define LCR_STOP1 0 -#define LCR_STOP2 4 -#define LCR_NOPARITY 0 -#define LCR_PARITYODD 0x08 -#define LCR_PARITYEVEN 0x18 -#define LCR_PARITYONE 0x28 -#define LCR_PARITYZERO 0x38 -#define LCR_BREAK_ON 0x40 -#define LCR_DLAB 0x80 - -#define FCR_ENABLE 1 -#define FCR_RXRESET 2 -#define FCR_TXRESET 4 -#define FCR_TRIGGER0 0 -#define FCR_TRIGGER1 0x40 -#define FCR_TRIGGER2 0x80 -#define FCR_TRIGGER3 0xC0 - -#define LSR_RBR_FULL 1 -#define LSR_OVERRUN 2 -#define LSR_PARITY 4 -#define LSR_FRAMING 8 -#define LSR_BREAK 0x10 -#define LSR_THRE 0x20 -#define LSR_TEMT 0x40 -#define LSR_RXFE 0x80 - -#define TER_ENABLE 0x80 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief UART0 driver enable switch. - * @details If set to @p TRUE the support for UART0 is included. - * @note The default is @p TRUE . - */ -#if !defined(LPC_SERIAL_USE_UART0) || defined(__DOXYGEN__) -#define LPC_SERIAL_USE_UART0 TRUE -#endif - -/** - * @brief FIFO preload parameter. - * @details Configuration parameter, this values defines how many bytes are - * preloaded in the HW transmit FIFO for each interrupt, the maximum - * value is 16 the minimum is 1. - * @note An high value reduces the number of interrupts generated but can - * also increase the worst case interrupt response time because the - * preload loops. - */ -#if !defined(LPC_SERIAL_FIFO_PRELOAD) || defined(__DOXYGEN__) -#define LPC_SERIAL_FIFO_PRELOAD 16 -#endif - -/** - * @brief UART0 PCLK divider. - */ -#if !defined(LPC_SERIAL_UART0CLKDIV) || defined(__DOXYGEN__) -#define LPC_SERIAL_UART0CLKDIV 1 -#endif - -/** - * @brief UART0 interrupt priority level setting. - */ -#if !defined(LPC_SERIAL_UART0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_SERIAL_UART0_IRQ_PRIORITY 3 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC_SERIAL_UART0CLKDIV < 1) || (LPC_SERIAL_UART0CLKDIV > 255) -#error "invalid LPC_SERIAL_UART0CLKDIV setting" -#endif - -#if (LPC_SERIAL_FIFO_PRELOAD < 1) || (LPC_SERIAL_FIFO_PRELOAD > 16) -#error "invalid LPC_SERIAL_FIFO_PRELOAD setting" -#endif - -/** - * @brief UART0 clock. - */ -#define LPC_SERIAL_UART0_PCLK \ - (LPC_MAINCLK / LPC_SERIAL_UART0CLKDIV) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief LPC11xx Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t sc_speed; - /** - * @brief Initialization value for the LCR register. - */ - uint32_t sc_lcr; - /** - * @brief Initialization value for the FCR register. - */ - uint32_t sc_fcr; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the USART registers block.*/ \ - LPC_USART_Type *uart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC_SERIAL_USE_UART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/spi_lld.c b/os/hal/platforms/LPC11Uxx/spi_lld.c deleted file mode 100644 index 49fcf19139..0000000000 --- a/os/hal/platforms/LPC11Uxx/spi_lld.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/spi_lld.c - * @brief LPC11Uxx low level SPI driver code. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC_SPI_USE_SSP0 || defined(__DOXYGEN__) -/** @brief SPI1 driver identifier.*/ -SPIDriver SPID1; -#endif - -#if LPC_SPI_USE_SSP1 || defined(__DOXYGEN__) -/** @brief SPI2 driver identifier.*/ -SPIDriver SPID2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Preloads the transmit FIFO. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void ssp_fifo_preload(SPIDriver *spip) { - LPC_SSPx_Type *ssp = spip->ssp; - uint32_t n = spip->txcnt > LPC_SSP_FIFO_DEPTH ? - LPC_SSP_FIFO_DEPTH : spip->txcnt; - - while(((ssp->SR & SR_TNF) != 0) && (n > 0)) { - if (spip->txptr != NULL) { - if ((ssp->CR0 & CR0_DSSMASK) > CR0_DSS8BIT) { - const uint16_t *p = spip->txptr; - ssp->DR = *p++; - spip->txptr = p; - } - else { - const uint8_t *p = spip->txptr; - ssp->DR = *p++; - spip->txptr = p; - } - } - else - ssp->DR = 0xFFFFFFFF; - n--; - spip->txcnt--; - } -} - -/** - * @brief Common IRQ handler. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void spi_serve_interrupt(SPIDriver *spip) { - LPC_SSPx_Type *ssp = spip->ssp; - - if ((ssp->MIS & MIS_ROR) != 0) { - /* The overflow condition should never happen because priority is given - to receive but a hook macro is provided anyway...*/ - LPC_SPI_SSP_ERROR_HOOK(spip); - } - ssp->ICR = ICR_RT | ICR_ROR; - while ((ssp->SR & SR_RNE) != 0) { - if (spip->rxptr != NULL) { - if ((ssp->CR0 & CR0_DSSMASK) > CR0_DSS8BIT) { - uint16_t *p = spip->rxptr; - *p++ = ssp->DR; - spip->rxptr = p; - } - else { - uint8_t *p = spip->rxptr; - *p++ = ssp->DR; - spip->rxptr = p; - } - } - else - (void)ssp->DR; - if (--spip->rxcnt == 0) { - chDbgAssert(spip->txcnt == 0, - "spi_serve_interrupt(), #1", "counter out of synch"); - /* Stops the IRQ sources.*/ - ssp->IMSC = 0; - /* Portable SPI ISR code defined in the high level driver, note, it is - a macro.*/ - _spi_isr_code(spip); - return; - } - } - ssp_fifo_preload(spip); - if (spip->txcnt == 0) - ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_RX; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC_SPI_USE_SSP0 || defined(__DOXYGEN__) -/** - * @brief SSP0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector90) { - - CH_IRQ_PROLOGUE(); - - spi_serve_interrupt(&SPID1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if LPC_SPI_USE_SSP1 || defined(__DOXYGEN__) -/** - * @brief SSP1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector78) { - - CH_IRQ_PROLOGUE(); - - spi_serve_interrupt(&SPID2); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - -#if LPC_SPI_USE_SSP0 - spiObjectInit(&SPID1); - SPID1.ssp = LPC_SSP0; -#endif /* LPC_SPI_USE_SSP0 */ - -#if LPC_SPI_USE_SSP1 - spiObjectInit(&SPID2); - SPID2.ssp = LPC_SSP1; -#endif /* LPC_SPI_USE_SSP0 */ -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - if (spip->state == SPI_STOP) { - /* Clock activation.*/ -#if LPC_SPI_USE_SSP0 - if (&SPID1 == spip) { - LPC_SYSCON->SSP0CLKDIV = LPC_SPI_SSP0CLKDIV; - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11); - LPC_SYSCON->PRESETCTRL |= 1; - nvicEnableVector(SSP0_IRQn, - CORTEX_PRIORITY_MASK(LPC_SPI_SSP0_IRQ_PRIORITY)); - } -#endif -#if LPC_SPI_USE_SSP1 - if (&SPID2 == spip) { - LPC_SYSCON->SSP1CLKDIV = LPC_SPI_SSP1CLKDIV; - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18); - LPC_SYSCON->PRESETCTRL |= 4; - nvicEnableVector(SSP1_IRQn, - CORTEX_PRIORITY_MASK(LPC_SPI_SSP1_IRQ_PRIORITY)); - } -#endif - } - /* Configuration.*/ - spip->ssp->CR1 = 0; - spip->ssp->ICR = ICR_RT | ICR_ROR; - spip->ssp->CR0 = spip->config->cr0; - spip->ssp->CPSR = spip->config->cpsr; - spip->ssp->CR1 = CR1_SSE; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - if (spip->state != SPI_STOP) { - spip->ssp->CR1 = 0; - spip->ssp->CR0 = 0; - spip->ssp->CPSR = 0; -#if LPC_SPI_USE_SSP0 - if (&SPID1 == spip) { - LPC_SYSCON->PRESETCTRL &= ~1; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 11); - LPC_SYSCON->SSP0CLKDIV = 0; - nvicDisableVector(SSP0_IRQn); - } -#endif -#if LPC_SPI_USE_SSP1 - if (&SPID2 == spip) { - LPC_SYSCON->PRESETCTRL &= ~4; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 18); - LPC_SYSCON->SSP1CLKDIV = 0; - nvicDisableVector(SSP1_IRQn); - } -#endif - } -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This function transmits a series of idle words on the SPI bus and - * ignores the received data. This function can be invoked even - * when a slave select signal has not been yet asserted. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - spip->rxptr = NULL; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This asynchronous function starts a simultaneous transmit/receive - * operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Sends data over the SPI bus. - * @details This asynchronous function starts a transmit operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - spip->rxptr = NULL; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Receives data from the SPI bus. - * @details This asynchronous function starts a receive operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) { - - spip->ssp->DR = (uint32_t)frame; - while ((spip->ssp->SR & SR_RNE) == 0) - ; - return (uint16_t)spip->ssp->DR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/spi_lld.h b/os/hal/platforms/LPC11Uxx/spi_lld.h deleted file mode 100644 index 2cd0184062..0000000000 --- a/os/hal/platforms/LPC11Uxx/spi_lld.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11Uxx/spi_lld.h - * @brief LPC11Uxx low level SPI driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Hardware FIFO depth. - */ -#define LPC_SSP_FIFO_DEPTH 8 - -#define CR0_DSSMASK 0x0F -#define CR0_DSS4BIT 3 -#define CR0_DSS5BIT 4 -#define CR0_DSS6BIT 5 -#define CR0_DSS7BIT 6 -#define CR0_DSS8BIT 7 -#define CR0_DSS9BIT 8 -#define CR0_DSS10BIT 9 -#define CR0_DSS11BIT 0xA -#define CR0_DSS12BIT 0xB -#define CR0_DSS13BIT 0xC -#define CR0_DSS14BIT 0xD -#define CR0_DSS15BIT 0xE -#define CR0_DSS16BIT 0xF -#define CR0_FRFSPI 0 -#define CR0_FRFSSI 0x10 -#define CR0_FRFMW 0x20 -#define CR0_CPOL 0x40 -#define CR0_CPHA 0x80 -#define CR0_CLOCKRATE(n) ((n) << 8) - -#define CR1_LBM 1 -#define CR1_SSE 2 -#define CR1_MS 4 -#define CR1_SOD 8 - -#define SR_TFE 1 -#define SR_TNF 2 -#define SR_RNE 4 -#define SR_RFF 8 -#define SR_BSY 16 - -#define IMSC_ROR 1 -#define IMSC_RT 2 -#define IMSC_RX 4 -#define IMSC_TX 8 - -#define RIS_ROR 1 -#define RIS_RT 2 -#define RIS_RX 4 -#define RIS_TX 8 - -#define MIS_ROR 1 -#define MIS_RT 2 -#define MIS_RX 4 -#define MIS_TX 8 - -#define ICR_ROR 1 -#define ICR_RT 2 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief SPI1 driver enable switch. - * @details If set to @p TRUE the support for device SSP0 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC_SPI_USE_SSP0) || defined(__DOXYGEN__) -#define LPC_SPI_USE_SSP0 TRUE -#endif - -/** - * @brief SPI2 driver enable switch. - * @details If set to @p TRUE the support for device SSP1 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC_SPI_USE_SSP1) || defined(__DOXYGEN__) -#define LPC_SPI_USE_SSP1 TRUE -#endif - -/** - * @brief SSP0 PCLK divider. - */ -#if !defined(LPC_SPI_SSP0CLKDIV) || defined(__DOXYGEN__) -#define LPC_SPI_SSP0CLKDIV 1 -#endif - -/** - * @brief SSP1 PCLK divider. - */ -#if !defined(LPC_SPI_SSP1CLKDIV) || defined(__DOXYGEN__) -#define LPC_SPI_SSP1CLKDIV 1 -#endif - -/** - * @brief SPI0 interrupt priority level setting. - */ -#if !defined(LPC_SPI_SSP0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_SPI_SSP0_IRQ_PRIORITY 1 -#endif - -/** - * @brief SPI1 interrupt priority level setting. - */ -#if !defined(LPC_SPI_SSP1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC_SPI_SSP1_IRQ_PRIORITY 1 -#endif - -/** - * @brief Overflow error hook. - * @details The default action is to stop the system. - */ -#if !defined(LPC_SPI_SSP_ERROR_HOOK) || defined(__DOXYGEN__) -#define LPC_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC_SPI_SSP0CLKDIV < 1) || (LPC_SPI_SSP0CLKDIV > 255) -#error "invalid LPC_SPI_SSP0CLKDIV setting" -#endif - -#if (LPC_SPI_SSP1CLKDIV < 1) || (LPC_SPI_SSP1CLKDIV > 255) -#error "invalid LPC_SPI_SSP1CLKDIV setting" -#endif - -#if !LPC_SPI_USE_SSP0 && !LPC_SPI_USE_SSP1 -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -/** - * @brief SSP0 clock. - */ -#define LPC_SPI_SSP0_PCLK \ - (LPC_MAINCLK / LPC_SPI_SSP0CLKDIV) - -/** - * @brief SSP1 clock. - */ -#define LPC_SPI_SSP1_PCLK \ - (LPC_MAINCLK / LPC_SPI_SSP1CLKDIV) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SSP CR0 initialization data. - */ - uint16_t cr0; - /** - * @brief SSP CPSR initialization data. - */ - uint32_t cpsr; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SSP registers block. - */ - LPC_SSPx_Type *ssp; - /** - * @brief Number of bytes yet to be received. - */ - uint32_t rxcnt; - /** - * @brief Receive pointer or @p NULL. - */ - void *rxptr; - /** - * @brief Number of bytes yet to be transmitted. - */ - uint32_t txcnt; - /** - * @brief Transmit pointer or @p NULL. - */ - const void *txptr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC_SPI_USE_SSP0 && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#if LPC_SPI_USE_SSP1 && !defined(__DOXYGEN__) -extern SPIDriver SPID2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11Uxx/system_LPC11Uxx.h b/os/hal/platforms/LPC11Uxx/system_LPC11Uxx.h deleted file mode 100644 index e490d17dc4..0000000000 --- a/os/hal/platforms/LPC11Uxx/system_LPC11Uxx.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************//** - * @file system_LPC11Uxx.h - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Header File - * for the NXP LPC11Uxx Device Series - * @version V1.10 - * @date 24. November 2010 - * - * @note - * Copyright (C) 2009-2010 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - - -#ifndef __SYSTEM_LPC11Uxx_H -#define __SYSTEM_LPC11Uxx_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - - -/** - * Initialize the system - * - * @param none - * @return none - * - * @brief Setup the microcontroller system. - * Initialize the System and update the SystemCoreClock variable. - */ -extern void SystemInit (void); - -/** - * Update SystemCoreClock variable - * - * @param none - * @return none - * - * @brief Updates the SystemCoreClock with current core Clock - * retrieved from cpu registers. - */ -extern void SystemCoreClockUpdate (void); - -#ifdef __cplusplus -} -#endif - -#endif /* __SYSTEM_LPC11Uxx_H */ diff --git a/os/hal/platforms/LPC11xx/LPC11xx.h b/os/hal/platforms/LPC11xx/LPC11xx.h deleted file mode 100644 index 3f96459c79..0000000000 --- a/os/hal/platforms/LPC11xx/LPC11xx.h +++ /dev/null @@ -1,561 +0,0 @@ -/**************************************************************************** - * $Id:: LPC11xx.h 4070 2010-07-30 03:16:37Z usb00423 $ - * Project: NXP LPC11xx software example - * - * Description: - * CMSIS Cortex-M0 Core Peripheral Access Layer Header File for - * NXP LPC11xx Device Series - * - **************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * NXP Semiconductors assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. NXP Semiconductors - * reserves the right to make changes in the software without - * notification. NXP Semiconductors also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. -****************************************************************************/ -#ifndef __LPC11xx_H__ -#define __LPC11xx_H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup LPC11xx_Definitions LPC11xx Definitions - This file defines all structures and symbols for LPC11xx: - - Registers and bitfields - - peripheral base address - - peripheral ID - - PIO definitions - @{ -*/ - - -/******************************************************************************/ -/* Processor and Core Peripherals */ -/******************************************************************************/ -/** @addtogroup LPC11xx_CMSIS LPC11xx CMSIS Definitions - Configuration of the Cortex-M0 Processor and Core Peripherals - @{ -*/ - -/* - * ========================================================================== - * ---------- Interrupt Number Definition ----------------------------------- - * ========================================================================== - */ -typedef enum IRQn -{ -/****** Cortex-M0 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - HardFault_IRQn = -13, /*!< 3 Cortex-M0 Hard Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M0 SV Call Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M0 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M0 System Tick Interrupt */ - -/****** LPC11Cxx or LPC11xx Specific Interrupt Numbers *******************************************************/ - WAKEUP0_IRQn = 0, /*!< All I/O pins can be used as wakeup source. */ - WAKEUP1_IRQn = 1, /*!< There are 13 pins in total for LPC11xx */ - WAKEUP2_IRQn = 2, - WAKEUP3_IRQn = 3, - WAKEUP4_IRQn = 4, - WAKEUP5_IRQn = 5, - WAKEUP6_IRQn = 6, - WAKEUP7_IRQn = 7, - WAKEUP8_IRQn = 8, - WAKEUP9_IRQn = 9, - WAKEUP10_IRQn = 10, - WAKEUP11_IRQn = 11, - WAKEUP12_IRQn = 12, - CAN_IRQn = 13, /*!< CAN Interrupt */ - SSP1_IRQn = 14, /*!< SSP1 Interrupt */ - I2C_IRQn = 15, /*!< I2C Interrupt */ - TIMER_16_0_IRQn = 16, /*!< 16-bit Timer0 Interrupt */ - TIMER_16_1_IRQn = 17, /*!< 16-bit Timer1 Interrupt */ - TIMER_32_0_IRQn = 18, /*!< 32-bit Timer0 Interrupt */ - TIMER_32_1_IRQn = 19, /*!< 32-bit Timer1 Interrupt */ - SSP0_IRQn = 20, /*!< SSP0 Interrupt */ - UART_IRQn = 21, /*!< UART Interrupt */ - Reserved0_IRQn = 22, /*!< Reserved Interrupt */ - Reserved1_IRQn = 23, - ADC_IRQn = 24, /*!< A/D Converter Interrupt */ - WDT_IRQn = 25, /*!< Watchdog timer Interrupt */ - BOD_IRQn = 26, /*!< Brown Out Detect(BOD) Interrupt */ - FMC_IRQn = 27, /*!< Flash Memory Controller Interrupt */ - EINT3_IRQn = 28, /*!< External Interrupt 3 Interrupt */ - EINT2_IRQn = 29, /*!< External Interrupt 2 Interrupt */ - EINT1_IRQn = 30, /*!< External Interrupt 1 Interrupt */ - EINT0_IRQn = 31, /*!< External Interrupt 0 Interrupt */ -} IRQn_Type; - -/* - * ========================================================================== - * ----------- Processor and Core Peripheral Section ------------------------ - * ========================================================================== - */ - -/* Configuration of the Cortex-M3 Processor and Core Peripherals */ -#define __MPU_PRESENT 0 /*!< MPU present or not */ -#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/*@}*/ /* end of group LPC11xx_CMSIS */ - - -#include "core_cm0.h" /* Cortex-M0 processor and core peripherals */ -#include "system_LPC11xx.h" /* System Header */ - - -/******************************************************************************/ -/* Device Specific Peripheral Registers structures */ -/******************************************************************************/ - -#if defined ( __CC_ARM ) -#pragma anon_unions -#endif - -/*------------- System Control (SYSCON) --------------------------------------*/ -/** @addtogroup LPC11xx_SYSCON LPC11xx System Control Block - @{ -*/ -typedef struct -{ - __IO uint32_t SYSMEMREMAP; /*!< Offset: 0x000 System memory remap (R/W) */ - __IO uint32_t PRESETCTRL; /*!< Offset: 0x004 Peripheral reset control (R/W) */ - __IO uint32_t SYSPLLCTRL; /*!< Offset: 0x008 System PLL control (R/W) */ - __IO uint32_t SYSPLLSTAT; /*!< Offset: 0x00C System PLL status (R/W ) */ - uint32_t RESERVED0[4]; - - __IO uint32_t SYSOSCCTRL; /*!< Offset: 0x020 System oscillator control (R/W) */ - __IO uint32_t WDTOSCCTRL; /*!< Offset: 0x024 Watchdog oscillator control (R/W) */ - __IO uint32_t IRCCTRL; /*!< Offset: 0x028 IRC control (R/W) */ - uint32_t RESERVED1[1]; - __IO uint32_t SYSRESSTAT; /*!< Offset: 0x030 System reset status Register (R/ ) */ - uint32_t RESERVED2[3]; - __IO uint32_t SYSPLLCLKSEL; /*!< Offset: 0x040 System PLL clock source select (R/W) */ - __IO uint32_t SYSPLLCLKUEN; /*!< Offset: 0x044 System PLL clock source update enable (R/W) */ - uint32_t RESERVED3[10]; - - __IO uint32_t MAINCLKSEL; /*!< Offset: 0x070 Main clock source select (R/W) */ - __IO uint32_t MAINCLKUEN; /*!< Offset: 0x074 Main clock source update enable (R/W) */ - __IO uint32_t SYSAHBCLKDIV; /*!< Offset: 0x078 System AHB clock divider (R/W) */ - uint32_t RESERVED4[1]; - - __IO uint32_t SYSAHBCLKCTRL; /*!< Offset: 0x080 System AHB clock control (R/W) */ - uint32_t RESERVED5[4]; - __IO uint32_t SSP0CLKDIV; /*!< Offset: 0x094 SSP0 clock divider (R/W) */ - __IO uint32_t UARTCLKDIV; /*!< Offset: 0x098 UART clock divider (R/W) */ - __IO uint32_t SSP1CLKDIV; /*!< Offset: 0x09C SSP1 clock divider (R/W) */ - uint32_t RESERVED6[4]; - - __IO uint32_t SYSTICKCLKDIV; /*!< Offset: 0x0B0 SYSTICK clock divider (R/W) */ - uint32_t RESERVED7[7]; - - __IO uint32_t WDTCLKSEL; /*!< Offset: 0x0D0 WDT clock source select (R/W) */ - __IO uint32_t WDTCLKUEN; /*!< Offset: 0x0D4 WDT clock source update enable (R/W) */ - __IO uint32_t WDTCLKDIV; /*!< Offset: 0x0D8 WDT clock divider (R/W) */ - uint32_t RESERVED8[1]; - __IO uint32_t CLKOUTCLKSEL; /*!< Offset: 0x0E0 CLKOUT clock source select (R/W) */ - __IO uint32_t CLKOUTUEN; /*!< Offset: 0x0E4 CLKOUT clock source update enable (R/W) */ - __IO uint32_t CLKOUTDIV; /*!< Offset: 0x0E8 CLKOUT clock divider (R/W) */ - uint32_t RESERVED9[5]; - - __IO uint32_t PIOPORCAP0; /*!< Offset: 0x100 POR captured PIO status 0 (R/ ) */ - __IO uint32_t PIOPORCAP1; /*!< Offset: 0x104 POR captured PIO status 1 (R/ ) */ - uint32_t RESERVED10[18]; - __IO uint32_t BODCTRL; /*!< Offset: 0x150 BOD control (R/W) */ - uint32_t RESERVED11[1]; - __IO uint32_t SYSTCKCAL; /*!< Offset: 0x158 System tick counter calibration (R/W) */ - uint32_t RESERVED12; - __IO uint32_t MAINREGVOUT0CFG; /*!< Offset: 0x160 Main Regulator Voltage 0 Configuration */ - __IO uint32_t MAINREGVOUT1CFG; /*!< Offset: 0x164 Main Regulator Voltage 1 Configuration */ - uint32_t RESERVED13[38]; - - __IO uint32_t STARTAPRP0; /*!< Offset: 0x200 Start logic edge control Register 0 (R/W) */ - __IO uint32_t STARTERP0; /*!< Offset: 0x204 Start logic signal enable Register 0 (R/W) */ - __O uint32_t STARTRSRP0CLR; /*!< Offset: 0x208 Start logic reset Register 0 ( /W) */ - __IO uint32_t STARTSRP0; /*!< Offset: 0x20C Start logic status Register 0 (R/W) */ - __IO uint32_t STARTAPRP1; /*!< Offset: 0x210 Start logic edge control Register 0 (R/W). (LPC11UXX only) */ - __IO uint32_t STARTERP1; /*!< Offset: 0x214 Start logic signal enable Register 0 (R/W). (LPC11UXX only) */ - __O uint32_t STARTRSRP1CLR; /*!< Offset: 0x218 Start logic reset Register 0 ( /W). (LPC11UXX only) */ - __IO uint32_t STARTSRP1; /*!< Offset: 0x21C Start logic status Register 0 (R/W). (LPC11UXX only) */ - uint32_t RESERVED17[4]; - - __IO uint32_t PDSLEEPCFG; /*!< Offset: 0x230 Power-down states in Deep-sleep mode (R/W) */ - __IO uint32_t PDAWAKECFG; /*!< Offset: 0x234 Power-down states after wake-up (R/W) */ - __IO uint32_t PDRUNCFG; /*!< Offset: 0x238 Power-down configuration Register (R/W) */ - uint32_t RESERVED15[101]; - __O uint32_t VOUTCFGPROT; /*!< Offset: 0x3D0 Voltage Output Configuration Protection Register (W) */ - uint32_t RESERVED16[8]; - __I uint32_t DEVICE_ID; /*!< Offset: 0x3F4 Device ID (R/ ) */ -} LPC_SYSCON_TypeDef; -/*@}*/ /* end of group LPC11xx_SYSCON */ - - -/*------------- Pin Connect Block (IOCON) --------------------------------*/ -/** @addtogroup LPC11xx_IOCON LPC11xx I/O Configuration Block - @{ -*/ -typedef struct -{ - __IO uint32_t PIO2_6; /*!< Offset: 0x000 I/O configuration for pin PIO2_6 (R/W) */ - uint32_t RESERVED0[1]; - __IO uint32_t PIO2_0; /*!< Offset: 0x008 I/O configuration for pin PIO2_0/DTR/SSEL1 (R/W) */ - __IO uint32_t RESET_PIO0_0; /*!< Offset: 0x00C I/O configuration for pin RESET/PIO0_0 (R/W) */ - __IO uint32_t PIO0_1; /*!< Offset: 0x010 I/O configuration for pin PIO0_1/CLKOUT/CT32B0_MAT2 (R/W) */ - __IO uint32_t PIO1_8; /*!< Offset: 0x014 I/O configuration for pin PIO1_8/CT16B1_CAP0 (R/W) */ - uint32_t RESERVED1[1]; - __IO uint32_t PIO0_2; /*!< Offset: 0x01C I/O configuration for pin PIO0_2/SSEL0/CT16B0_CAP0 (R/W) */ - - __IO uint32_t PIO2_7; /*!< Offset: 0x020 I/O configuration for pin PIO2_7 (R/W) */ - __IO uint32_t PIO2_8; /*!< Offset: 0x024 I/O configuration for pin PIO2_8 (R/W) */ - __IO uint32_t PIO2_1; /*!< Offset: 0x028 I/O configuration for pin PIO2_1/nDSR/SCK1 (R/W) */ - __IO uint32_t PIO0_3; /*!< Offset: 0x02C I/O configuration for pin PIO0_3 (R/W) */ - __IO uint32_t PIO0_4; /*!< Offset: 0x030 I/O configuration for pin PIO0_4/SCL (R/W) */ - __IO uint32_t PIO0_5; /*!< Offset: 0x034 I/O configuration for pin PIO0_5/SDA (R/W) */ - __IO uint32_t PIO1_9; /*!< Offset: 0x038 I/O configuration for pin PIO1_9/CT16B1_MAT0 (R/W) */ - __IO uint32_t PIO3_4; /*!< Offset: 0x03C I/O configuration for pin PIO3_4 (R/W) */ - - __IO uint32_t PIO2_4; /*!< Offset: 0x040 I/O configuration for pin PIO2_4 (R/W) */ - __IO uint32_t PIO2_5; /*!< Offset: 0x044 I/O configuration for pin PIO2_5 (R/W) */ - __IO uint32_t PIO3_5; /*!< Offset: 0x048 I/O configuration for pin PIO3_5 (R/W) */ - __IO uint32_t PIO0_6; /*!< Offset: 0x04C I/O configuration for pin PIO0_6/SCK0 (R/W) */ - __IO uint32_t PIO0_7; /*!< Offset: 0x050 I/O configuration for pin PIO0_7/nCTS (R/W) */ - __IO uint32_t PIO2_9; /*!< Offset: 0x054 I/O configuration for pin PIO2_9 (R/W) */ - __IO uint32_t PIO2_10; /*!< Offset: 0x058 I/O configuration for pin PIO2_10 (R/W) */ - __IO uint32_t PIO2_2; /*!< Offset: 0x05C I/O configuration for pin PIO2_2/DCD/MISO1 (R/W) */ - - __IO uint32_t PIO0_8; /*!< Offset: 0x060 I/O configuration for pin PIO0_8/MISO0/CT16B0_MAT0 (R/W) */ - __IO uint32_t PIO0_9; /*!< Offset: 0x064 I/O configuration for pin PIO0_9/MOSI0/CT16B0_MAT1 (R/W) */ - __IO uint32_t SWCLK_PIO0_10; /*!< Offset: 0x068 I/O configuration for pin SWCLK/PIO0_10/SCK0/CT16B0_MAT2 (R/W) */ - __IO uint32_t PIO1_10; /*!< Offset: 0x06C I/O configuration for pin PIO1_10/AD6/CT16B1_MAT1 (R/W) */ - __IO uint32_t PIO2_11; /*!< Offset: 0x070 I/O configuration for pin PIO2_11/SCK0 (R/W) */ - __IO uint32_t R_PIO0_11; /*!< Offset: 0x074 I/O configuration for pin TDI/PIO0_11/AD0/CT32B0_MAT3 (R/W) */ - __IO uint32_t R_PIO1_0; /*!< Offset: 0x078 I/O configuration for pin TMS/PIO1_0/AD1/CT32B1_CAP0 (R/W) */ - __IO uint32_t R_PIO1_1; /*!< Offset: 0x07C I/O configuration for pin TDO/PIO1_1/AD2/CT32B1_MAT0 (R/W) */ - - __IO uint32_t R_PIO1_2; /*!< Offset: 0x080 I/O configuration for pin nTRST/PIO1_2/AD3/CT32B1_MAT1 (R/W) */ - __IO uint32_t PIO3_0; /*!< Offset: 0x084 I/O configuration for pin PIO3_0/nDTR (R/W) */ - __IO uint32_t PIO3_1; /*!< Offset: 0x088 I/O configuration for pin PIO3_1/nDSR (R/W) */ - __IO uint32_t PIO2_3; /*!< Offset: 0x08C I/O configuration for pin PIO2_3/RI/MOSI1 (R/W) */ - __IO uint32_t SWDIO_PIO1_3; /*!< Offset: 0x090 I/O configuration for pin SWDIO/PIO1_3/AD4/CT32B1_MAT2 (R/W) */ - __IO uint32_t PIO1_4; /*!< Offset: 0x094 I/O configuration for pin PIO1_4/AD5/CT32B1_MAT3 (R/W) */ - __IO uint32_t PIO1_11; /*!< Offset: 0x098 I/O configuration for pin PIO1_11/AD7 (R/W) */ - __IO uint32_t PIO3_2; /*!< Offset: 0x09C I/O configuration for pin PIO3_2/nDCD (R/W) */ - - __IO uint32_t PIO1_5; /*!< Offset: 0x0A0 I/O configuration for pin PIO1_5/nRTS/CT32B0_CAP0 (R/W) */ - __IO uint32_t PIO1_6; /*!< Offset: 0x0A4 I/O configuration for pin PIO1_6/RXD/CT32B0_MAT0 (R/W) */ - __IO uint32_t PIO1_7; /*!< Offset: 0x0A8 I/O configuration for pin PIO1_7/TXD/CT32B0_MAT1 (R/W) */ - __IO uint32_t PIO3_3; /*!< Offset: 0x0AC I/O configuration for pin PIO3_3/nRI (R/W) */ - __IO uint32_t SCK_LOC; /*!< Offset: 0x0B0 SCK pin location select Register (R/W) */ - __IO uint32_t DSR_LOC; /*!< Offset: 0x0B4 DSR pin location select Register (R/W) */ - __IO uint32_t DCD_LOC; /*!< Offset: 0x0B8 DCD pin location select Register (R/W) */ - __IO uint32_t RI_LOC; /*!< Offset: 0x0BC RI pin location Register (R/W) */ -} LPC_IOCON_TypeDef; -/*@}*/ /* end of group LPC11xx_IOCON */ - - -/*------------- Power Management Unit (PMU) --------------------------*/ -/** @addtogroup LPC11xx_PMU LPC11xx Power Management Unit - @{ -*/ -typedef struct -{ - __IO uint32_t PCON; /*!< Offset: 0x000 Power control Register (R/W) */ - __IO uint32_t GPREG0; /*!< Offset: 0x004 General purpose Register 0 (R/W) */ - __IO uint32_t GPREG1; /*!< Offset: 0x008 General purpose Register 1 (R/W) */ - __IO uint32_t GPREG2; /*!< Offset: 0x00C General purpose Register 2 (R/W) */ - __IO uint32_t GPREG3; /*!< Offset: 0x010 General purpose Register 3 (R/W) */ - __IO uint32_t GPREG4; /*!< Offset: 0x014 General purpose Register 4 (R/W) */ -} LPC_PMU_TypeDef; -/*@}*/ /* end of group LPC11xx_PMU */ - -/*------------- General Purpose Input/Output (GPIO) --------------------------*/ -/** @addtogroup LPC11xx_GPIO LPC11xx General Purpose Input/Output - @{ -*/ -typedef struct -{ - union { - __IO uint32_t MASKED_ACCESS[4096]; /*!< Offset: 0x0000 to 0x3FFC Port data Register for pins PIOn_0 to PIOn_11 (R/W) */ - struct { - uint32_t RESERVED0[4095]; - __IO uint32_t DATA; /*!< Offset: 0x3FFC Port data Register (R/W) */ - }; - }; - uint32_t RESERVED1[4096]; - __IO uint32_t DIR; /*!< Offset: 0x8000 Data direction Register (R/W) */ - __IO uint32_t IS; /*!< Offset: 0x8004 Interrupt sense Register (R/W) */ - __IO uint32_t IBE; /*!< Offset: 0x8008 Interrupt both edges Register (R/W) */ - __IO uint32_t IEV; /*!< Offset: 0x800C Interrupt event Register (R/W) */ - __IO uint32_t IE; /*!< Offset: 0x8010 Interrupt mask Register (R/W) */ - __IO uint32_t RIS; /*!< Offset: 0x8014 Raw interrupt status Register (R/ ) */ - __IO uint32_t MIS; /*!< Offset: 0x8018 Masked interrupt status Register (R/ ) */ - __IO uint32_t IC; /*!< Offset: 0x801C Interrupt clear Register (R/W) */ -} LPC_GPIO_TypeDef; -/*@}*/ /* end of group LPC11xx_GPIO */ - -/*------------- Timer (TMR) --------------------------------------------------*/ -/** @addtogroup LPC11xx_TMR LPC11xx 16/32-bit Counter/Timer - @{ -*/ -typedef struct -{ - __IO uint32_t IR; /*!< Offset: 0x000 Interrupt Register (R/W) */ - __IO uint32_t TCR; /*!< Offset: 0x004 Timer Control Register (R/W) */ - __IO uint32_t TC; /*!< Offset: 0x008 Timer Counter Register (R/W) */ - __IO uint32_t PR; /*!< Offset: 0x00C Prescale Register (R/W) */ - __IO uint32_t PC; /*!< Offset: 0x010 Prescale Counter Register (R/W) */ - __IO uint32_t MCR; /*!< Offset: 0x014 Match Control Register (R/W) */ - __IO uint32_t MR0; /*!< Offset: 0x018 Match Register 0 (R/W) */ - __IO uint32_t MR1; /*!< Offset: 0x01C Match Register 1 (R/W) */ - __IO uint32_t MR2; /*!< Offset: 0x020 Match Register 2 (R/W) */ - __IO uint32_t MR3; /*!< Offset: 0x024 Match Register 3 (R/W) */ - __IO uint32_t CCR; /*!< Offset: 0x028 Capture Control Register (R/W) */ - __I uint32_t CR0; /*!< Offset: 0x02C Capture Register 0 (R/ ) */ - uint32_t RESERVED1[3]; - __IO uint32_t EMR; /*!< Offset: 0x03C External Match Register (R/W) */ - uint32_t RESERVED2[12]; - __IO uint32_t CTCR; /*!< Offset: 0x070 Count Control Register (R/W) */ - __IO uint32_t PWMC; /*!< Offset: 0x074 PWM Control Register (R/W) */ -} LPC_TMR_TypeDef; -/*@}*/ /* end of group LPC11xx_TMR */ - - -/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ -/** @addtogroup LPC11xx_UART LPC11xx Universal Asynchronous Receiver/Transmitter - @{ -*/ -typedef struct -{ - union { - __I uint32_t RBR; /*!< Offset: 0x000 Receiver Buffer Register (R/ ) */ - __O uint32_t THR; /*!< Offset: 0x000 Transmit Holding Register ( /W) */ - __IO uint32_t DLL; /*!< Offset: 0x000 Divisor Latch LSB (R/W) */ - }; - union { - __IO uint32_t DLM; /*!< Offset: 0x004 Divisor Latch MSB (R/W) */ - __IO uint32_t IER; /*!< Offset: 0x000 Interrupt Enable Register (R/W) */ - }; - union { - __I uint32_t IIR; /*!< Offset: 0x008 Interrupt ID Register (R/ ) */ - __O uint32_t FCR; /*!< Offset: 0x008 FIFO Control Register ( /W) */ - }; - __IO uint32_t LCR; /*!< Offset: 0x00C Line Control Register (R/W) */ - __IO uint32_t MCR; /*!< Offset: 0x010 Modem control Register (R/W) */ - __I uint32_t LSR; /*!< Offset: 0x014 Line Status Register (R/ ) */ - __I uint32_t MSR; /*!< Offset: 0x018 Modem status Register (R/ ) */ - __IO uint32_t SCR; /*!< Offset: 0x01C Scratch Pad Register (R/W) */ - __IO uint32_t ACR; /*!< Offset: 0x020 Auto-baud Control Register (R/W) */ - uint32_t RESERVED0; - __IO uint32_t FDR; /*!< Offset: 0x028 Fractional Divider Register (R/W) */ - uint32_t RESERVED1; - __IO uint32_t TER; /*!< Offset: 0x030 Transmit Enable Register (R/W) */ - uint32_t RESERVED2[6]; - __IO uint32_t RS485CTRL; /*!< Offset: 0x04C RS-485/EIA-485 Control Register (R/W) */ - __IO uint32_t ADRMATCH; /*!< Offset: 0x050 RS-485/EIA-485 address match Register (R/W) */ - __IO uint32_t RS485DLY; /*!< Offset: 0x054 RS-485/EIA-485 direction control delay Register (R/W) */ - __I uint32_t FIFOLVL; /*!< Offset: 0x058 FIFO Level Register (R) */ -} LPC_UART_TypeDef; -/*@}*/ /* end of group LPC11xx_UART */ - - -/*------------- Synchronous Serial Communication (SSP) -----------------------*/ -/** @addtogroup LPC11xx_SSP LPC11xx Synchronous Serial Port - @{ -*/ -typedef struct -{ - __IO uint32_t CR0; /*!< Offset: 0x000 Control Register 0 (R/W) */ - __IO uint32_t CR1; /*!< Offset: 0x004 Control Register 1 (R/W) */ - __IO uint32_t DR; /*!< Offset: 0x008 Data Register (R/W) */ - __I uint32_t SR; /*!< Offset: 0x00C Status Registe (R/ ) */ - __IO uint32_t CPSR; /*!< Offset: 0x010 Clock Prescale Register (R/W) */ - __IO uint32_t IMSC; /*!< Offset: 0x014 Interrupt Mask Set and Clear Register (R/W) */ - __IO uint32_t RIS; /*!< Offset: 0x018 Raw Interrupt Status Register (R/W) */ - __IO uint32_t MIS; /*!< Offset: 0x01C Masked Interrupt Status Register (R/W) */ - __IO uint32_t ICR; /*!< Offset: 0x020 SSPICR Interrupt Clear Register (R/W) */ -} LPC_SSP_TypeDef; -/*@}*/ /* end of group LPC11xx_SSP */ - - -/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/ -/** @addtogroup LPC11xx_I2C LPC11xx I2C-Bus Interface - @{ -*/ -typedef struct -{ - __IO uint32_t CONSET; /*!< Offset: 0x000 I2C Control Set Register (R/W) */ - __I uint32_t STAT; /*!< Offset: 0x004 I2C Status Register (R/ ) */ - __IO uint32_t DAT; /*!< Offset: 0x008 I2C Data Register (R/W) */ - __IO uint32_t ADR0; /*!< Offset: 0x00C I2C Slave Address Register 0 (R/W) */ - __IO uint32_t SCLH; /*!< Offset: 0x010 SCH Duty Cycle Register High Half Word (R/W) */ - __IO uint32_t SCLL; /*!< Offset: 0x014 SCL Duty Cycle Register Low Half Word (R/W) */ - __O uint32_t CONCLR; /*!< Offset: 0x018 I2C Control Clear Register ( /W) */ - __IO uint32_t MMCTRL; /*!< Offset: 0x01C Monitor mode control register (R/W) */ - __IO uint32_t ADR1; /*!< Offset: 0x020 I2C Slave Address Register 1 (R/W) */ - __IO uint32_t ADR2; /*!< Offset: 0x024 I2C Slave Address Register 2 (R/W) */ - __IO uint32_t ADR3; /*!< Offset: 0x028 I2C Slave Address Register 3 (R/W) */ - __I uint32_t DATA_BUFFER; /*!< Offset: 0x02C Data buffer register ( /W) */ - __IO uint32_t MASK0; /*!< Offset: 0x030 I2C Slave address mask register 0 (R/W) */ - __IO uint32_t MASK1; /*!< Offset: 0x034 I2C Slave address mask register 1 (R/W) */ - __IO uint32_t MASK2; /*!< Offset: 0x038 I2C Slave address mask register 2 (R/W) */ - __IO uint32_t MASK3; /*!< Offset: 0x03C I2C Slave address mask register 3 (R/W) */ -} LPC_I2C_TypeDef; -/*@}*/ /* end of group LPC11xx_I2C */ - - -/*------------- Watchdog Timer (WDT) -----------------------------------------*/ -/** @addtogroup LPC11xx_WDT LPC11xx WatchDog Timer - @{ -*/ -typedef struct -{ - __IO uint32_t MOD; /*!< Offset: 0x000 Watchdog mode register (R/W) */ - __IO uint32_t TC; /*!< Offset: 0x004 Watchdog timer constant register (R/W) */ - __O uint32_t FEED; /*!< Offset: 0x008 Watchdog feed sequence register (W) */ - __I uint32_t TV; /*!< Offset: 0x00C Watchdog timer value register (R) */ - uint32_t RESERVED0; - __IO uint32_t WARNINT; /*!< Offset: 0x014 Watchdog timer warning int. register (R/W) */ - __IO uint32_t WINDOW; /*!< Offset: 0x018 Watchdog timer window value register (R/W) */ -} LPC_WDT_TypeDef; -/*@}*/ /* end of group LPC11xx_WDT */ - - -/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/ -/** @addtogroup LPC11xx_ADC LPC11xx Analog-to-Digital Converter - @{ -*/ -typedef struct -{ - __IO uint32_t CR; /*!< Offset: 0x000 A/D Control Register (R/W) */ - __IO uint32_t GDR; /*!< Offset: 0x004 A/D Global Data Register (R/W) */ - uint32_t RESERVED0; - __IO uint32_t INTEN; /*!< Offset: 0x00C A/D Interrupt Enable Register (R/W) */ - __IO uint32_t DR[8]; /*!< Offset: 0x010-0x02C A/D Channel 0..7 Data Register (R/W) */ - __I uint32_t STAT; /*!< Offset: 0x030 A/D Status Register (R/ ) */ -} LPC_ADC_TypeDef; -/*@}*/ /* end of group LPC11xx_ADC */ - - -/*------------- CAN Controller (CAN) ----------------------------*/ -/** @addtogroup LPC11xx_CAN LPC11xx Controller Area Network(CAN) - @{ -*/ -typedef struct -{ - __IO uint32_t CNTL; /* 0x000 */ - __IO uint32_t STAT; - __IO uint32_t EC; - __IO uint32_t BT; - __IO uint32_t INT; - __IO uint32_t TEST; - __IO uint32_t BRPE; - uint32_t RESERVED0; - __IO uint32_t IF1_CMDREQ; /* 0x020 */ - __IO uint32_t IF1_CMDMSK; - __IO uint32_t IF1_MSK1; - __IO uint32_t IF1_MSK2; - __IO uint32_t IF1_ARB1; - __IO uint32_t IF1_ARB2; - __IO uint32_t IF1_MCTRL; - __IO uint32_t IF1_DA1; - __IO uint32_t IF1_DA2; - __IO uint32_t IF1_DB1; - __IO uint32_t IF1_DB2; - uint32_t RESERVED1[13]; - __IO uint32_t IF2_CMDREQ; /* 0x080 */ - __IO uint32_t IF2_CMDMSK; - __IO uint32_t IF2_MSK1; - __IO uint32_t IF2_MSK2; - __IO uint32_t IF2_ARB1; - __IO uint32_t IF2_ARB2; - __IO uint32_t IF2_MCTRL; - __IO uint32_t IF2_DA1; - __IO uint32_t IF2_DA2; - __IO uint32_t IF2_DB1; - __IO uint32_t IF2_DB2; - uint32_t RESERVED2[21]; - __I uint32_t TXREQ1; /* 0x100 */ - __I uint32_t TXREQ2; - uint32_t RESERVED3[6]; - __I uint32_t ND1; /* 0x120 */ - __I uint32_t ND2; - uint32_t RESERVED4[6]; - __I uint32_t IR1; /* 0x140 */ - __I uint32_t IR2; - uint32_t RESERVED5[6]; - __I uint32_t MSGV1; /* 0x160 */ - __I uint32_t MSGV2; - uint32_t RESERVED6[6]; - __IO uint32_t CLKDIV; /* 0x180 */ -} LPC_CAN_TypeDef; -/*@}*/ /* end of group LPC11xx_CAN */ - -#if defined ( __CC_ARM ) -#pragma no_anon_unions -#endif - -/******************************************************************************/ -/* Peripheral memory map */ -/******************************************************************************/ -/* Base addresses */ -#define LPC_FLASH_BASE (0x00000000UL) -#define LPC_RAM_BASE (0x10000000UL) -#define LPC_APB0_BASE (0x40000000UL) -#define LPC_AHB_BASE (0x50000000UL) - -/* APB0 peripherals */ -#define LPC_I2C_BASE (LPC_APB0_BASE + 0x00000) -#define LPC_WDT_BASE (LPC_APB0_BASE + 0x04000) -#define LPC_UART_BASE (LPC_APB0_BASE + 0x08000) -#define LPC_CT16B0_BASE (LPC_APB0_BASE + 0x0C000) -#define LPC_CT16B1_BASE (LPC_APB0_BASE + 0x10000) -#define LPC_CT32B0_BASE (LPC_APB0_BASE + 0x14000) -#define LPC_CT32B1_BASE (LPC_APB0_BASE + 0x18000) -#define LPC_ADC_BASE (LPC_APB0_BASE + 0x1C000) -#define LPC_PMU_BASE (LPC_APB0_BASE + 0x38000) -#define LPC_SSP0_BASE (LPC_APB0_BASE + 0x40000) -#define LPC_IOCON_BASE (LPC_APB0_BASE + 0x44000) -#define LPC_SYSCON_BASE (LPC_APB0_BASE + 0x48000) -#define LPC_CAN_BASE (LPC_APB0_BASE + 0x50000) -#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x58000) - -/* AHB peripherals */ -#define LPC_GPIO_BASE (LPC_AHB_BASE + 0x00000) -#define LPC_GPIO0_BASE (LPC_AHB_BASE + 0x00000) -#define LPC_GPIO1_BASE (LPC_AHB_BASE + 0x10000) -#define LPC_GPIO2_BASE (LPC_AHB_BASE + 0x20000) -#define LPC_GPIO3_BASE (LPC_AHB_BASE + 0x30000) - -/******************************************************************************/ -/* Peripheral declaration */ -/******************************************************************************/ -#define LPC_I2C ((LPC_I2C_TypeDef *) LPC_I2C_BASE ) -#define LPC_WDT ((LPC_WDT_TypeDef *) LPC_WDT_BASE ) -#define LPC_UART ((LPC_UART_TypeDef *) LPC_UART_BASE ) -#define LPC_TMR16B0 ((LPC_TMR_TypeDef *) LPC_CT16B0_BASE) -#define LPC_TMR16B1 ((LPC_TMR_TypeDef *) LPC_CT16B1_BASE) -#define LPC_TMR32B0 ((LPC_TMR_TypeDef *) LPC_CT32B0_BASE) -#define LPC_TMR32B1 ((LPC_TMR_TypeDef *) LPC_CT32B1_BASE) -#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE ) -#define LPC_PMU ((LPC_PMU_TypeDef *) LPC_PMU_BASE ) -#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE ) -#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE ) -#define LPC_CAN ((LPC_CAN_TypeDef *) LPC_CAN_BASE ) -#define LPC_IOCON ((LPC_IOCON_TypeDef *) LPC_IOCON_BASE ) -#define LPC_SYSCON ((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE) -#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE ) -#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE ) -#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE ) -#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE ) - -#ifdef __cplusplus -} -#endif - -#endif /* __LPC11xx_H__ */ diff --git a/os/hal/platforms/LPC11xx/gpt_lld.c b/os/hal/platforms/LPC11xx/gpt_lld.c deleted file mode 100644 index 97d480c7ff..0000000000 --- a/os/hal/platforms/LPC11xx/gpt_lld.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/gpt_lld.c - * @brief LPC11xx GPT subsystem low level driver source. - * - * @addtogroup GPT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief GPT1 driver identifier. - * @note The driver GPT1 allocates the complex timer CT16B0 when enabled. - */ -#if LPC11xx_GPT_USE_CT16B0 || defined(__DOXYGEN__) -GPTDriver GPTD1; -#endif - -/** - * @brief GPT2 driver identifier. - * @note The driver GPT2 allocates the timer CT16B1 when enabled. - */ -#if LPC11xx_GPT_USE_CT16B1 || defined(__DOXYGEN__) -GPTDriver GPTD2; -#endif - -/** - * @brief GPT3 driver identifier. - * @note The driver GPT3 allocates the timer CT32B0 when enabled. - */ -#if LPC11xx_GPT_USE_CT32B0 || defined(__DOXYGEN__) -GPTDriver GPTD3; -#endif - -/** - * @brief GPT4 driver identifier. - * @note The driver GPT4 allocates the timer CT32B1 when enabled. - */ -#if LPC11xx_GPT_USE_CT32B1 || defined(__DOXYGEN__) -GPTDriver GPTD4; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared IRQ handler. - * - * @param[in] gptp pointer to a @p GPTDriver object - */ -static void gpt_lld_serve_interrupt(GPTDriver *gptp) { - - gptp->tmr->IR = 1; /* Clear interrupt on match MR0.*/ - if (gptp->state == GPT_ONESHOT) { - gptp->state = GPT_READY; /* Back in GPT_READY state. */ - gpt_lld_stop_timer(gptp); /* Timer automatically stopped. */ - } - gptp->config->callback(gptp); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC11xx_GPT_USE_CT16B0 -/** - * @brief CT16B0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector80) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC11xx_GPT_USE_CT16B0 */ - -#if LPC11xx_GPT_USE_CT16B1 -/** - * @brief CT16B1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector84) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC11xx_GPT_USE_CT16B0 */ - -#if LPC11xx_GPT_USE_CT32B0 -/** - * @brief CT32B0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector88) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC11xx_GPT_USE_CT32B0 */ - -#if LPC11xx_GPT_USE_CT32B1 -/** - * @brief CT32B1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector8C) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD4); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC11xx_GPT_USE_CT32B1 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level GPT driver initialization. - * - * @notapi - */ -void gpt_lld_init(void) { - -#if LPC11xx_GPT_USE_CT16B0 - /* Driver initialization.*/ - GPTD1.tmr = LPC_TMR16B0; - gptObjectInit(&GPTD1); -#endif - -#if LPC11xx_GPT_USE_CT16B1 - /* Driver initialization.*/ - GPTD2.tmr = LPC_TMR16B1; - gptObjectInit(&GPTD2); -#endif - -#if LPC11xx_GPT_USE_CT32B0 - /* Driver initialization.*/ - GPTD3.tmr = LPC_TMR32B0; - gptObjectInit(&GPTD3); -#endif - -#if LPC11xx_GPT_USE_CT32B1 - /* Driver initialization.*/ - GPTD4.tmr = LPC_TMR32B1; - gptObjectInit(&GPTD4); -#endif -} - -/** - * @brief Configures and activates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_start(GPTDriver *gptp) { - uint32_t pr; - - if (gptp->state == GPT_STOP) { - /* Clock activation.*/ -#if LPC11xx_GPT_USE_CT16B0 - if (&GPTD1 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 7); - nvicEnableVector(TIMER_16_0_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif -#if LPC11xx_GPT_USE_CT16B1 - if (&GPTD2 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8); - nvicEnableVector(TIMER_16_1_IRQn, CORTEX_PRIORITY_MASK(3)); - } -#endif -#if LPC11xx_GPT_USE_CT32B0 - if (&GPTD3 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9); - nvicEnableVector(TIMER_32_0_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif -#if LPC11xx_GPT_USE_CT32B1 - if (&GPTD4 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 10); - nvicEnableVector(TIMER_32_1_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif - } - - /* Prescaler value calculation.*/ - pr = (uint16_t)((LPC11xx_SYSCLK / gptp->config->frequency) - 1); - chDbgAssert(((uint32_t)(pr + 1) * gptp->config->frequency) == LPC11xx_SYSCLK, - "gpt_lld_start(), #1", "invalid frequency"); - - /* Timer configuration.*/ - gptp->tmr->PR = pr; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; -} - -/** - * @brief Deactivates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop(GPTDriver *gptp) { - - if (gptp->state == GPT_READY) { - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; - -#if LPC11xx_GPT_USE_CT16B0 - if (&GPTD1 == gptp) { - nvicDisableVector(TIMER_16_0_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 7); - } -#endif -#if LPC11xx_GPT_USE_CT16B1 - if (&GPTD2 == gptp) { - nvicDisableVector(TIMER_16_1_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 8); - } -#endif -#if LPC11xx_GPT_USE_CT32B0 - if (&GPTD3 == gptp) { - nvicDisableVector(TIMER_32_0_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 9); - } -#endif -#if LPC11xx_GPT_USE_CT32B1 - if (&GPTD4 == gptp) { - nvicDisableVector(TIMER_32_1_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 10); - } -#endif - } -} - -/** - * @brief Starts the timer in continuous mode. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval period in ticks - * - * @notapi - */ -void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tmr->MR0 = interval - 1; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 3; /* IRQ and clr TC on match MR0. */ - gptp->tmr->TCR = 2; /* Reset counter and prescaler. */ - gptp->tmr->TCR = 1; /* Timer enabled. */ -} - -/** - * @brief Stops the timer. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop_timer(GPTDriver *gptp) { - - gptp->tmr->IR = 1; - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; -} - -/** - * @brief Starts the timer in one shot mode and waits for completion. - * @details This function specifically polls the timer waiting for completion - * in order to not have extra delays caused by interrupt servicing, - * this function is only recommended for short delays. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval time interval in ticks - * - * @notapi - */ -void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tmr->MR0 = interval - 1; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 4; /* Stop TC on match MR0. */ - gptp->tmr->TCR = 2; /* Reset counter and prescaler. */ - gptp->tmr->TCR = 1; /* Timer enabled. */ - while (gptp->tmr->TCR & 1) - ; -} - -#endif /* HAL_USE_GPT */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/gpt_lld.h b/os/hal/platforms/LPC11xx/gpt_lld.h deleted file mode 100644 index 9c8dc12102..0000000000 --- a/os/hal/platforms/LPC11xx/gpt_lld.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/gpt_lld.h - * @brief LPC11xx GPT subsystem low level driver header. - * - * @addtogroup GPT - * @{ - */ - -#ifndef _GPT_LLD_H_ -#define _GPT_LLD_H_ - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief GPT1 driver enable switch. - * @details If set to @p TRUE the support for GPT1 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC11xx_GPT_USE_CT16B0) || defined(__DOXYGEN__) -#define LPC11xx_GPT_USE_CT16B0 TRUE -#endif - -/** - * @brief GPT2 driver enable switch. - * @details If set to @p TRUE the support for GPT2 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC11xx_GPT_USE_CT16B1) || defined(__DOXYGEN__) -#define LPC11xx_GPT_USE_CT16B1 TRUE -#endif - -/** - * @brief GPT3 driver enable switch. - * @details If set to @p TRUE the support for GPT3 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC11xx_GPT_USE_CT32B0) || defined(__DOXYGEN__) -#define LPC11xx_GPT_USE_CT32B0 TRUE -#endif - -/** - * @brief GPT4 driver enable switch. - * @details If set to @p TRUE the support for GPT4 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC11xx_GPT_USE_CT32B1) || defined(__DOXYGEN__) -#define LPC11xx_GPT_USE_CT32B1 TRUE -#endif - -/** - * @brief GPT1 interrupt priority level setting. - */ -#if !defined(LPC11xx_GPT_CT16B0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_GPT_CT16B0_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT2 interrupt priority level setting. - */ -#if !defined(LPC11xx_GPT_CT16B1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_GPT_CT16B1_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT3 interrupt priority level setting. - */ -#if !defined(LPC11xx_GPT_CT32B0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_GPT_CT32B0_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT4 interrupt priority level setting. - */ -#if !defined(LPC11xx_GPT_CT32B1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_GPT_CT32B1_IRQ_PRIORITY 2 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !LPC11xx_GPT_USE_CT16B0 && !LPC11xx_GPT_USE_CT16B1 && \ - !LPC11xx_GPT_USE_CT32B0 && !LPC11xx_GPT_USE_CT32B1 -#error "GPT driver activated but no CT peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief GPT frequency type. - */ -typedef uint32_t gptfreq_t; - -/** - * @brief GPT counter type. - */ -typedef uint32_t gptcnt_t; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Timer clock in Hz. - * @note The low level can use assertions in order to catch invalid - * frequency specifications. - */ - gptfreq_t frequency; - /** - * @brief Timer callback pointer. - * @note This callback is invoked on GPT counter events. - */ - gptcallback_t callback; - /* End of the mandatory fields.*/ -} GPTConfig; - -/** - * @brief Structure representing a GPT driver. - */ -struct GPTDriver { - /** - * @brief Driver state. - */ - gptstate_t state; - /** - * @brief Current configuration data. - */ - const GPTConfig *config; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the CTxxBy registers block. - */ - LPC_TMR_TypeDef *tmr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC11xx_GPT_USE_CT16B0 && !defined(__DOXYGEN__) -extern GPTDriver GPTD1; -#endif - -#if LPC11xx_GPT_USE_CT16B1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD2; -#endif - -#if LPC11xx_GPT_USE_CT32B0 && !defined(__DOXYGEN__) -extern GPTDriver GPTD3; -#endif - -#if LPC11xx_GPT_USE_CT32B1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD4; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void gpt_lld_init(void); - void gpt_lld_start(GPTDriver *gptp); - void gpt_lld_stop(GPTDriver *gptp); - void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t period); - void gpt_lld_stop_timer(GPTDriver *gptp); - void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GPT */ - -#endif /* _GPT_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/hal_lld.c b/os/hal/platforms/LPC11xx/hal_lld.c deleted file mode 100644 index 4b77b558c8..0000000000 --- a/os/hal/platforms/LPC11xx/hal_lld.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/hal_lld.c - * @brief LPC11xx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/** - * @brief Register missing in NXP header file. - */ -#define FLASHCFG (*((volatile uint32_t *)0x4003C010)) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* SysTick initialization using the system clock.*/ - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, CORTEX_PRIORITY_SYSTICK); - SysTick->LOAD = LPC11xx_SYSCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief LPC11xx clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function must be invoked only after the system reset. - * - * @special - */ -void lpc111x_clock_init(void) { - unsigned i; - - /* Flash wait states setting, the code takes care to not touch TBD bits.*/ - FLASHCFG = (FLASHCFG & ~3) | LPC11xx_FLASHCFG_FLASHTIM; - - /* System oscillator initialization if required.*/ -#if LPC11xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT -#if LPC11xx_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC - LPC_SYSCON->SYSOSCCTRL = LPC11xx_SYSOSCCTRL; - LPC_SYSCON->PDRUNCFG &= ~(1 << 5); /* System oscillator ON. */ - for (i = 0; i < 200; i++) - __NOP(); /* Stabilization delay. */ -#endif /* LPC11xx_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC */ - - /* PLL initialization if required.*/ - LPC_SYSCON->SYSPLLCLKSEL = LPC11xx_PLLCLK_SOURCE; - LPC_SYSCON->SYSPLLCLKUEN = 1; /* Really required? */ - LPC_SYSCON->SYSPLLCLKUEN = 0; - LPC_SYSCON->SYSPLLCLKUEN = 1; - LPC_SYSCON->SYSPLLCTRL = LPC11xx_SYSPLLCTRL_MSEL | LPC11xx_SYSPLLCTRL_PSEL; - LPC_SYSCON->PDRUNCFG &= ~(1 << 7); /* System PLL ON. */ - while ((LPC_SYSCON->SYSPLLSTAT & 1) == 0) /* Wait PLL lock. */ - ; -#endif /* LPC11xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT */ - - /* Main clock source selection.*/ - LPC_SYSCON->MAINCLKSEL = LPC11xx_MAINCLK_SOURCE; - LPC_SYSCON->MAINCLKUEN = 1; /* Really required? */ - LPC_SYSCON->MAINCLKUEN = 0; - LPC_SYSCON->MAINCLKUEN = 1; - while ((LPC_SYSCON->MAINCLKUEN & 1) == 0) /* Wait switch completion. */ - ; - - /* ABH divider initialization, peripheral clocks are initially disabled, - the various device drivers will handle their own setup except GPIO and - IOCON that are left enabled.*/ - LPC_SYSCON->SYSAHBCLKDIV = LPC11xx_SYSABHCLK_DIV; - LPC_SYSCON->SYSAHBCLKCTRL = 0x0001005F; - - /* Memory remapping, vectors always in ROM.*/ - LPC_SYSCON->SYSMEMREMAP = 2; -} - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/hal_lld.h b/os/hal/platforms/LPC11xx/hal_lld.h deleted file mode 100644 index e0c4af7f6b..0000000000 --- a/os/hal/platforms/LPC11xx/hal_lld.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/hal_lld.h - * @brief HAL subsystem low level driver header template. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "LPC11xx.h" -#include "nvic.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "LPC11xx" - -#define IRCOSCCLK 12000000 /**< High speed internal clock. */ -#define WDGOSCCLK 1600000 /**< Watchdog internal clock. */ - -#define SYSPLLCLKSEL_IRCOSC 0 /**< Internal RC oscillator - clock source. */ -#define SYSPLLCLKSEL_SYSOSC 1 /**< System oscillator clock - source. */ - -#define SYSMAINCLKSEL_IRCOSC 0 /**< Clock source is IRC. */ -#define SYSMAINCLKSEL_PLLIN 1 /**< Clock source is PLLIN. */ -#define SYSMAINCLKSEL_WDGOSC 2 /**< Clock source is WDGOSC. */ -#define SYSMAINCLKSEL_PLLOUT 3 /**< Clock source is PLLOUT. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief System PLL clock source. - */ -#if !defined(LPC11xx_PLLCLK_SOURCE) || defined(__DOXYGEN__) -#define LPC11xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#endif - -/** - * @brief System PLL multiplier. - * @note The value must be in the 1..32 range and the final frequency - * must not exceed the CCO ratings. - */ -#if !defined(LPC11xx_SYSPLL_MUL) || defined(__DOXYGEN__) -#define LPC11xx_SYSPLL_MUL 4 -#endif - -/** - * @brief System PLL divider. - * @note The value must be chosen between (2, 4, 8, 16). - */ -#if !defined(LPC11xx_SYSPLL_DIV) || defined(__DOXYGEN__) -#define LPC11xx_SYSPLL_DIV 4 -#endif - -/** - * @brief System main clock source. - */ -#if !defined(LPC11xx_MAINCLK_SOURCE) || defined(__DOXYGEN__) -#define LPC11xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#endif - -/** - * @brief AHB clock divider. - * @note The value must be chosen between (1...255). - */ -#if !defined(LPC11xx_SYSCLK_DIV) || defined(__DOXYGEN__) -#define LPC11xx_SYSABHCLK_DIV 1 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** - * @brief Calculated SYSOSCCTRL setting. - */ -#if (SYSOSCCLK < 18000000) || defined(__DOXYGEN__) -#define LPC11xx_SYSOSCCTRL 0 -#else -#define LPC11xx_SYSOSCCTRL 1 -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (LPC11xx_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC) || defined(__DOXYGEN__) -#define LPC11xx_SYSPLLCLKIN SYSOSCCLK -#elif LPC11xx_PLLCLK_SOURCE == SYSPLLCLKSEL_IRCOSC -#define LPC11xx_SYSPLLCLKIN IRCOSCCLK -#else -#error "invalid LPC11xx_PLLCLK_SOURCE clock source specified" -#endif - -/** - * @brief MSEL mask in SYSPLLCTRL register. - */ -#if (LPC11xx_SYSPLL_MUL >= 1) && (LPC11xx_SYSPLL_MUL <= 32) || \ - defined(__DOXYGEN__) -#define LPC11xx_SYSPLLCTRL_MSEL (LPC11xx_SYSPLL_MUL - 1) -#else -#error "LPC11xx_SYSPLL_MUL out of range (1...32)" -#endif - -/** - * @brief PSEL mask in SYSPLLCTRL register. - */ -#if (LPC11xx_SYSPLL_DIV == 2) || defined(__DOXYGEN__) -#define LPC11xx_SYSPLLCTRL_PSEL (0 << 5) -#elif LPC11xx_SYSPLL_DIV == 4 -#define LPC11xx_SYSPLLCTRL_PSEL (1 << 5) -#elif LPC11xx_SYSPLL_DIV == 8 -#define LPC11xx_SYSPLLCTRL_PSEL (2 << 5) -#elif LPC11xx_SYSPLL_DIV == 16 -#define LPC11xx_SYSPLLCTRL_PSEL (3 << 5) -#else -#error "invalid LPC11xx_SYSPLL_DIV value (2,4,8,16)" -#endif - -/** - * @brief CCP frequency. - */ -#define LPC11xx_SYSPLLCCO (LPC11xx_SYSPLLCLKIN * LPC11xx_SYSPLL_MUL * \ - LPC11xx_SYSPLL_DIV) - -#if (LPC11xx_SYSPLLCCO < 156000000) || (LPC11xx_SYSPLLCCO > 320000000) -#error "CCO frequency out of the acceptable range (156...320)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define LPC11xx_SYSPLLCLKOUT (LPC11xx_SYSPLLCCO / LPC11xx_SYSPLL_DIV) - -#if (LPC11xx_MAINCLK_SOURCE == SYSMAINCLKSEL_IRCOSC) || defined(__DOXYGEN__) -#define LPC11xx_MAINCLK IRCOSCCLK -#elif LPC11xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLIN -#define LPC11xx_MAINCLK LPC11xx_SYSPLLCLKIN -#elif LPC11xx_MAINCLK_SOURCE == SYSMAINCLKSEL_WDGOSC -#define LPC11xx_MAINCLK WDGOSCCLK -#elif LPC11xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT -#define LPC11xx_MAINCLK LPC11xx_SYSPLLCLKOUT -#else -#error "invalid LPC11xx_MAINCLK_SOURCE clock source specified" -#endif - -/** - * @brief AHB clock. - */ -#define LPC11xx_SYSCLK (LPC11xx_MAINCLK / LPC11xx_SYSABHCLK_DIV) -#if LPC11xx_SYSCLK > 50000000 -#error "AHB clock frequency out of the acceptable range (50MHz max)" -#endif - -/** - * @brief Flash wait states. - */ -#if (LPC11xx_SYSCLK <= 20000000) || defined(__DOXYGEN__) -#define LPC11xx_FLASHCFG_FLASHTIM 0 -#elif LPC11xx_SYSCLK <= 40000000 -#define LPC11xx_FLASHCFG_FLASHTIM 1 -#else -#define LPC11xx_FLASHCFG_FLASHTIM 2 -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void lpc111x_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/pal_lld.c b/os/hal/platforms/LPC11xx/pal_lld.c deleted file mode 100644 index afa7d9b204..0000000000 --- a/os/hal/platforms/LPC11xx/pal_lld.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/pal_lld.c - * @brief LPC11xx GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ -/** - * @brief LPC11xx I/O ports configuration. - * @details GPIO unit registers initialization. - * - * @param[in] config the LPC11xx ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - LPC_GPIO0->DIR = config->P0.dir; - LPC_GPIO1->DIR = config->P1.dir; - LPC_GPIO2->DIR = config->P2.dir; - LPC_GPIO3->DIR = config->P3.dir; - LPC_GPIO0->DATA = config->P0.data; - LPC_GPIO1->DATA = config->P1.data; - LPC_GPIO2->DATA = config->P2.data; - LPC_GPIO3->DATA = config->P3.data; -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - port->DIR &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - palSetPort(port, PAL_WHOLE_PORT); - case PAL_MODE_OUTPUT_PUSHPULL: - port->DIR |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/pal_lld.h b/os/hal/platforms/LPC11xx/pal_lld.h deleted file mode 100644 index d1a7118687..0000000000 --- a/os/hal/platforms/LPC11xx/pal_lld.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/pal_lld.h - * @brief LPC11xx GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_INPUT_ANALOG -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief GPIO port setup info. - */ -typedef struct { - /** Initial value for FIO_PIN register.*/ - uint32_t data; - /** Initial value for FIO_DIR register.*/ - uint32_t dir; -} lpc111x_gpio_setup_t; - -/** - * @brief GPIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - * @note The @p IOCON block is not configured, initially all pins have - * enabled pullups and are programmed as GPIO. It is responsibility - * of the various drivers to reprogram the pins in the proper mode. - * Pins that are not handled by any driver may be programmed in - * @p board.c. - */ -typedef struct { - /** @brief GPIO 0 setup data.*/ - lpc111x_gpio_setup_t P0; - /** @brief GPIO 1 setup data.*/ - lpc111x_gpio_setup_t P1; - /** @brief GPIO 2 setup data.*/ - lpc111x_gpio_setup_t P2; - /** @brief GPIO 3 setup data.*/ - lpc111x_gpio_setup_t P3; -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef LPC_GPIO_TypeDef *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief GPIO0 port identifier. - */ -#define IOPORT1 LPC_GPIO0 -#define GPIO0 LPC_GPIO0 - -/** - * @brief GPIO1 port identifier. - */ -#define IOPORT2 LPC_GPIO1 -#define GPIO1 LPC_GPIO1 - -/** - * @brief GPIO2 port identifier. - */ -#define IOPORT3 LPC_GPIO2 -#define GPIO2 LPC_GPIO2 - -/** - * @brief GPIO3 port identifier. - */ -#define IOPORT4 LPC_GPIO3 -#define GPIO3 LPC_GPIO3 - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->DATA) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->DATA) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->DATA = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) ((port)->MASKED_ACCESS[bits] = 0xFFFFFFFF) - -/** - * @brief Clears a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) ((port)->MASKED_ACCESS[bits] = 0) - -/** - * @brief Reads a group of bits. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @return The group logical states. - * - * @notapi - */ -#define pal_lld_readgroup(port, mask, offset) \ - ((port)->MASKED_ACCESS[(mask) << (offset)]) - -/** - * @brief Writes a group of bits. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group width - * are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - ((port)->MASKED_ACCESS[(mask) << (offset)] = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note Programming an unknown or unsupported mode is silently ignored. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Writes a logical state on an output pad. - * @note This function is not meant to be invoked directly by the - * application code. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) \ - ((port)->MASKED_ACCESS[(mask) << (pad)] = (bit) << (pad)) - -/** - * @brief Sets a pad logical state to @p PAL_HIGH. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_setpad(port, pad) \ - ((port)->MASKED_ACCESS[1 << (pad)] = 1 << (pad)) - -/** - * @brief Clears a pad logical state to @p PAL_LOW. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_clearpad(port, pad) \ - ((port)->MASKED_ACCESS[1 << (pad)] = 0) - -#if !defined(__DOXYGEN__) -extern const PALConfig pal_default_config; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/platform.dox b/os/hal/platforms/LPC11xx/platform.dox deleted file mode 100644 index 4712ce8765..0000000000 --- a/os/hal/platforms/LPC11xx/platform.dox +++ /dev/null @@ -1,140 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup LPC11xx LPC11xx Drivers - * @details This section describes all the supported drivers on the LPC11xx - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup LPC11xx_HAL LPC11xx Initialization Support - * @details The LPC11xx HAL support is responsible for system initialization. - * - * @section lpc11xx_hal_1 Supported HW resources - * - SYSCON. - * - Flash. - * . - * @section lpc11xx_hal_2 LPC11xx HAL driver implementation features - * - Clock tree initialization. - * - Clock source selection. - * - Flash controller initialization. - * - SYSTICK initialization based on current clock and kernel required rate. - * . - * @ingroup LPC11xx - */ - -/** - * @defgroup LPC11xx_GPT LPC11xx GPT Support - * @details The LPC11xx GPT driver uses the CTxxBy peripherals. - * - * @section lpc11xx_gpt_1 Supported HW resources - * - CT16B0. - * - CT16B1. - * - CT32B0. - * - CT32B1. - * . - * @section lpc11xx_gpt_2 LPC11xx GPT driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable CTxxBy interrupts priority level. - * . - * @ingroup LPC11xx - */ - -/** - * @defgroup LPC11xx_PAL LPC11xx PAL Support - * @details The LPC11xx PAL driver uses the GPIO peripherals. - * - * @section lpc11xx_pal_1 Supported HW resources - * - GPIO0. - * - GPIO1. - * - GPIO2. - * - GPIO3. - * . - * @section lpc11xx_pal_2 LPC11xx PAL driver implementation features - * - 12 bits wide ports. - * - Atomic set/reset functions. - * - Atomic set+reset function (atomic bus operations). - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section lpc11xx_pal_3 Supported PAL setup modes - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section lpc11xx_pal_4 Suboptimal behavior - * Some GPIO features are less than optimal: - * - Pad/port toggling operations are not atomic. - * - Pull-up and Pull-down resistors cannot be programmed through the PAL - * driver and must be programmed separately using the IOCON peripheral. - * - Reading of the output latch for pads programmed as input is not possible, - * the input pin value is returned instead. - * . - * @ingroup LPC11xx - */ - -/** - * @defgroup LPC11xx_SERIAL LPC11xx Serial Support - * @details The LPC11xx Serial driver uses the UART peripheral in a - * buffered, interrupt driven, implementation. The serial driver - * also takes advantage of the LPC11xx UARTs deep hardware buffers. - * - * @section lpc11xx_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - UART. - * . - * @section lpc11xx_serial_2 LPC11xx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Fully interrupt driven. - * - Programmable priority level. - * - Takes advantage of the input and output FIFOs. - * . - * @ingroup LPC11xx - */ - -/** - * @defgroup LPC11xx_SPI LPC11xx SPI Support - * @details The SPI driver supports the LPC11xx SSP peripherals in an interrupt - * driven implementation. - * @note Being the SPI a fast peripheral, much care must be taken to - * not saturate the CPU bandwidth with an excessive IRQ rate. The - * maximum transfer bit rate is likely limited by the IRQ - * handling. - * - * @section lpc11xx_spi_1 Supported HW resources - * - SSP0. - * - SSP1 (where present). - * . - * @section lpc11xx_spi_2 LPC11xx SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SSP can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable interrupt priority levels for each SSP. - * . - * @ingroup LPC11xx - */ diff --git a/os/hal/platforms/LPC11xx/platform.mk b/os/hal/platforms/LPC11xx/platform.mk deleted file mode 100644 index 4f0d195473..0000000000 --- a/os/hal/platforms/LPC11xx/platform.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the LPC11xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/LPC11xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11xx/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11xx/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11xx/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC11xx/spi_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/LPC11xx diff --git a/os/hal/platforms/LPC11xx/serial_lld.c b/os/hal/platforms/LPC11xx/serial_lld.c deleted file mode 100644 index f0c5a9c1ad..0000000000 --- a/os/hal/platforms/LPC11xx/serial_lld.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/serial_lld.c - * @brief LPC11xx low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC11xx_SERIAL_USE_UART0 || defined(__DOXYGEN__) -/** @brief UART0 serial driver identifier.*/ -SerialDriver SD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - LCR_WL8 | LCR_STOP1 | LCR_NOPARITY, - FCR_TRIGGER0 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief UART initialization. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] config the architecture-dependent serial driver configuration - */ -static void uart_init(SerialDriver *sdp, const SerialConfig *config) { - LPC_UART_TypeDef *u = sdp->uart; - - uint32_t div = LPC11xx_SERIAL_UART0_PCLK / (config->sc_speed << 4); - u->LCR = config->sc_lcr | LCR_DLAB; - u->DLL = div; - u->DLM = div >> 8; - u->LCR = config->sc_lcr; - u->FCR = FCR_ENABLE | FCR_RXRESET | FCR_TXRESET | config->sc_fcr; - u->ACR = 0; - u->FDR = 0x10; - u->TER = TER_ENABLE; - u->IER = IER_RBR | IER_STATUS; -} - -/** - * @brief UART de-initialization. - * - * @param[in] u pointer to an UART I/O block - */ -static void uart_deinit(LPC_UART_TypeDef *u) { - - u->LCR = LCR_DLAB; - u->DLL = 1; - u->DLM = 0; - u->LCR = 0; - u->FDR = 0x10; - u->IER = 0; - u->FCR = FCR_RXRESET | FCR_TXRESET; - u->ACR = 0; - u->TER = TER_ENABLE; -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] err UART LSR register value - */ -static void set_error(SerialDriver *sdp, IOREG32 err) { - flagsmask_t sts = 0; - - if (err & LSR_OVERRUN) - sts |= SD_OVERRUN_ERROR; - if (err & LSR_PARITY) - sts |= SD_PARITY_ERROR; - if (err & LSR_FRAMING) - sts |= SD_FRAMING_ERROR; - if (err & LSR_BREAK) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Common IRQ handler. - * @note Tries hard to clear all the pending interrupt sources, we don't - * want to go through the whole ISR and have another interrupt soon - * after. - * - * @param[in] u pointer to an UART I/O block - * @param[in] sdp communication channel associated to the UART - */ -static void serve_interrupt(SerialDriver *sdp) { - LPC_UART_TypeDef *u = sdp->uart; - - while (TRUE) { - switch (u->IIR & IIR_SRC_MASK) { - case IIR_SRC_NONE: - return; - case IIR_SRC_ERROR: - set_error(sdp, u->LSR); - break; - case IIR_SRC_TIMEOUT: - case IIR_SRC_RX: - chSysLockFromIsr(); - if (chIQIsEmptyI(&sdp->iqueue)) - chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE); - chSysUnlockFromIsr(); - while (u->LSR & LSR_RBR_FULL) { - chSysLockFromIsr(); - if (chIQPutI(&sdp->iqueue, u->RBR) < Q_OK) - chnAddFlagsI(sdp, SD_OVERRUN_ERROR); - chSysUnlockFromIsr(); - } - break; - case IIR_SRC_TX: - { - int i = LPC11xx_SERIAL_FIFO_PRELOAD; - do { - msg_t b; - - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - chSysUnlockFromIsr(); - if (b < Q_OK) { - u->IER &= ~IER_THRE; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - chSysUnlockFromIsr(); - break; - } - u->THR = b; - } while (--i); - } - break; - default: - (void) u->THR; - (void) u->RBR; - } - } -} - -/** - * @brief Attempts a TX FIFO preload. - */ -static void preload(SerialDriver *sdp) { - LPC_UART_TypeDef *u = sdp->uart; - - if (u->LSR & LSR_THRE) { - int i = LPC11xx_SERIAL_FIFO_PRELOAD; - do { - msg_t b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - return; - } - u->THR = b; - } while (--i); - } - u->IER |= IER_THRE; -} - -/** - * @brief Driver SD1 output notification. - */ -#if LPC11xx_SERIAL_USE_UART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - preload(&SD1); -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief UART0 IRQ handler. - * - * @isr - */ -#if LPC11xx_SERIAL_USE_UART0 || defined(__DOXYGEN__) -CH_IRQ_HANDLER(Vector94) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if LPC11xx_SERIAL_USE_UART0 - sdObjectInit(&SD1, NULL, notify1); - SD1.uart = LPC_UART; - LPC_IOCON->PIO1_6 = 0xC1; /* RDX without resistors. */ - LPC_IOCON->PIO1_7 = 0xC1; /* TDX without resistors. */ -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if LPC11xx_SERIAL_USE_UART0 - if (&SD1 == sdp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 12); - LPC_SYSCON->UARTCLKDIV = LPC11xx_SERIAL_UART0CLKDIV; - nvicEnableVector(UART_IRQn, - CORTEX_PRIORITY_MASK(LPC11xx_SERIAL_UART0_IRQ_PRIORITY)); - } -#endif - } - uart_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the UART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - uart_deinit(sdp->uart); -#if LPC11xx_SERIAL_USE_UART0 - if (&SD1 == sdp) { - LPC_SYSCON->UARTCLKDIV = 0; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 12); - nvicDisableVector(UART_IRQn); - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/serial_lld.h b/os/hal/platforms/LPC11xx/serial_lld.h deleted file mode 100644 index 9839c15211..0000000000 --- a/os/hal/platforms/LPC11xx/serial_lld.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/serial_lld.h - * @brief LPC11xx low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define IIR_SRC_MASK 0x0F -#define IIR_SRC_NONE 0x01 -#define IIR_SRC_MODEM 0x00 -#define IIR_SRC_TX 0x02 -#define IIR_SRC_RX 0x04 -#define IIR_SRC_ERROR 0x06 -#define IIR_SRC_TIMEOUT 0x0C - -#define IER_RBR 1 -#define IER_THRE 2 -#define IER_STATUS 4 - -#define LCR_WL5 0 -#define LCR_WL6 1 -#define LCR_WL7 2 -#define LCR_WL8 3 -#define LCR_STOP1 0 -#define LCR_STOP2 4 -#define LCR_NOPARITY 0 -#define LCR_PARITYODD 0x08 -#define LCR_PARITYEVEN 0x18 -#define LCR_PARITYONE 0x28 -#define LCR_PARITYZERO 0x38 -#define LCR_BREAK_ON 0x40 -#define LCR_DLAB 0x80 - -#define FCR_ENABLE 1 -#define FCR_RXRESET 2 -#define FCR_TXRESET 4 -#define FCR_TRIGGER0 0 -#define FCR_TRIGGER1 0x40 -#define FCR_TRIGGER2 0x80 -#define FCR_TRIGGER3 0xC0 - -#define LSR_RBR_FULL 1 -#define LSR_OVERRUN 2 -#define LSR_PARITY 4 -#define LSR_FRAMING 8 -#define LSR_BREAK 0x10 -#define LSR_THRE 0x20 -#define LSR_TEMT 0x40 -#define LSR_RXFE 0x80 - -#define TER_ENABLE 0x80 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief UART0 driver enable switch. - * @details If set to @p TRUE the support for UART0 is included. - * @note The default is @p TRUE . - */ -#if !defined(LPC11xx_SERIAL_USE_UART0) || defined(__DOXYGEN__) -#define LPC11xx_SERIAL_USE_UART0 TRUE -#endif - -/** - * @brief FIFO preload parameter. - * @details Configuration parameter, this values defines how many bytes are - * preloaded in the HW transmit FIFO for each interrupt, the maximum - * value is 16 the minimum is 1. - * @note An high value reduces the number of interrupts generated but can - * also increase the worst case interrupt response time because the - * preload loops. - */ -#if !defined(LPC11xx_SERIAL_FIFO_PRELOAD) || defined(__DOXYGEN__) -#define LPC11xx_SERIAL_FIFO_PRELOAD 16 -#endif - -/** - * @brief UART0 PCLK divider. - */ -#if !defined(LPC11xx_SERIAL_UART0CLKDIV) || defined(__DOXYGEN__) -#define LPC11xx_SERIAL_UART0CLKDIV 1 -#endif - -/** - * @brief UART0 interrupt priority level setting. - */ -#if !defined(LPC11xx_SERIAL_UART0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_SERIAL_UART0_IRQ_PRIORITY 3 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC11xx_SERIAL_UART0CLKDIV < 1) || (LPC11xx_SERIAL_UART0CLKDIV > 255) -#error "invalid LPC11xx_SERIAL_UART0CLKDIV setting" -#endif - -#if (LPC11xx_SERIAL_FIFO_PRELOAD < 1) || (LPC11xx_SERIAL_FIFO_PRELOAD > 16) -#error "invalid LPC11xx_SERIAL_FIFO_PRELOAD setting" -#endif - -/** - * @brief UART0 clock. - */ -#define LPC11xx_SERIAL_UART0_PCLK \ - (LPC11xx_MAINCLK / LPC11xx_SERIAL_UART0CLKDIV) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief LPC11xx Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t sc_speed; - /** - * @brief Initialization value for the LCR register. - */ - uint32_t sc_lcr; - /** - * @brief Initialization value for the FCR register. - */ - uint32_t sc_fcr; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the USART registers block.*/ \ - LPC_UART_TypeDef *uart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC11xx_SERIAL_USE_UART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/spi_lld.c b/os/hal/platforms/LPC11xx/spi_lld.c deleted file mode 100644 index 9fe7a1a3c2..0000000000 --- a/os/hal/platforms/LPC11xx/spi_lld.c +++ /dev/null @@ -1,408 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/spi_lld.c - * @brief LPC11xx low level SPI driver code. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC11xx_SPI_USE_SSP0 || defined(__DOXYGEN__) -/** @brief SPI1 driver identifier.*/ -SPIDriver SPID1; -#endif - -#if LPC11xx_SPI_USE_SSP1 || defined(__DOXYGEN__) -/** @brief SPI2 driver identifier.*/ -SPIDriver SPID2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Preloads the transmit FIFO. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void ssp_fifo_preload(SPIDriver *spip) { - LPC_SSP_TypeDef *ssp = spip->ssp; - uint32_t n = spip->txcnt > LPC11xx_SSP_FIFO_DEPTH ? - LPC11xx_SSP_FIFO_DEPTH : spip->txcnt; - - while(((ssp->SR & SR_TNF) != 0) && (n > 0)) { - if (spip->txptr != NULL) { - if ((ssp->CR0 & CR0_DSSMASK) > CR0_DSS8BIT) { - const uint16_t *p = spip->txptr; - ssp->DR = *p++; - spip->txptr = p; - } - else { - const uint8_t *p = spip->txptr; - ssp->DR = *p++; - spip->txptr = p; - } - } - else - ssp->DR = 0xFFFFFFFF; - n--; - spip->txcnt--; - } -} - -/** - * @brief Common IRQ handler. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void spi_serve_interrupt(SPIDriver *spip) { - LPC_SSP_TypeDef *ssp = spip->ssp; - - if ((ssp->MIS & MIS_ROR) != 0) { - /* The overflow condition should never happen because priority is given - to receive but a hook macro is provided anyway...*/ - LPC11xx_SPI_SSP_ERROR_HOOK(spip); - } - ssp->ICR = ICR_RT | ICR_ROR; - while ((ssp->SR & SR_RNE) != 0) { - if (spip->rxptr != NULL) { - if ((ssp->CR0 & CR0_DSSMASK) > CR0_DSS8BIT) { - uint16_t *p = spip->rxptr; - *p++ = ssp->DR; - spip->rxptr = p; - } - else { - uint8_t *p = spip->rxptr; - *p++ = ssp->DR; - spip->rxptr = p; - } - } - else - (void)ssp->DR; - if (--spip->rxcnt == 0) { - chDbgAssert(spip->txcnt == 0, - "spi_serve_interrupt(), #1", "counter out of synch"); - /* Stops the IRQ sources.*/ - ssp->IMSC = 0; - /* Portable SPI ISR code defined in the high level driver, note, it is - a macro.*/ - _spi_isr_code(spip); - return; - } - } - ssp_fifo_preload(spip); - if (spip->txcnt == 0) - ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_RX; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC11xx_SPI_USE_SSP0 || defined(__DOXYGEN__) -/** - * @brief SSP0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector90) { - - CH_IRQ_PROLOGUE(); - - spi_serve_interrupt(&SPID1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if LPC11xx_SPI_USE_SSP1 || defined(__DOXYGEN__) -/** - * @brief SSP1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector78) { - - CH_IRQ_PROLOGUE(); - - spi_serve_interrupt(&SPID2); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - -#if LPC11xx_SPI_USE_SSP0 - spiObjectInit(&SPID1); - SPID1.ssp = LPC_SSP0; - LPC_IOCON->SCK_LOC = LPC11xx_SPI_SCK0_SELECTOR; -#if LPC11xx_SPI_SCK0_SELECTOR == SCK0_IS_PIO0_10 - LPC_IOCON->SWCLK_PIO0_10 = 0xC2; /* SCK0 without resistors. */ -#elif LPC11xx_SPI_SCK0_SELECTOR == SCK0_IS_PIO2_11 - LPC_IOCON->PIO2_11 = 0xC1; /* SCK0 without resistors. */ -#else /* LPC11xx_SPI_SCK0_SELECTOR == SCK0_IS_PIO0_6 */ - LPC_IOCON->PIO0_6 = 0xC2; /* SCK0 without resistors. */ -#endif - LPC_IOCON->PIO0_8 = 0xC1; /* MISO0 without resistors. */ - LPC_IOCON->PIO0_9 = 0xC1; /* MOSI0 without resistors. */ -#endif /* LPC11xx_SPI_USE_SSP0 */ - -#if LPC11xx_SPI_USE_SSP1 - spiObjectInit(&SPID2); - SPID2.ssp = LPC_SSP1; - LPC_IOCON->PIO2_1 = 0xC2; /* SCK1 without resistors. */ - LPC_IOCON->PIO2_2 = 0xC2; /* MISO1 without resistors. */ - LPC_IOCON->PIO2_3 = 0xC2; /* MOSI1 without resistors. */ -#endif /* LPC11xx_SPI_USE_SSP0 */ -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - if (spip->state == SPI_STOP) { - /* Clock activation.*/ -#if LPC11xx_SPI_USE_SSP0 - if (&SPID1 == spip) { - LPC_SYSCON->SSP0CLKDIV = LPC11xx_SPI_SSP0CLKDIV; - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11); - LPC_SYSCON->PRESETCTRL |= 1; - nvicEnableVector(SSP0_IRQn, - CORTEX_PRIORITY_MASK(LPC11xx_SPI_SSP0_IRQ_PRIORITY)); - } -#endif -#if LPC11xx_SPI_USE_SSP1 - if (&SPID2 == spip) { - LPC_SYSCON->SSP1CLKDIV = LPC11xx_SPI_SSP1CLKDIV; - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18); - LPC_SYSCON->PRESETCTRL |= 4; - nvicEnableVector(SSP1_IRQn, - CORTEX_PRIORITY_MASK(LPC11xx_SPI_SSP1_IRQ_PRIORITY)); - } -#endif - } - /* Configuration.*/ - spip->ssp->CR1 = 0; - spip->ssp->ICR = ICR_RT | ICR_ROR; - spip->ssp->CR0 = spip->config->cr0; - spip->ssp->CPSR = spip->config->cpsr; - spip->ssp->CR1 = CR1_SSE; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - if (spip->state != SPI_STOP) { - spip->ssp->CR1 = 0; - spip->ssp->CR0 = 0; - spip->ssp->CPSR = 0; -#if LPC11xx_SPI_USE_SSP0 - if (&SPID1 == spip) { - LPC_SYSCON->PRESETCTRL &= ~1; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 11); - LPC_SYSCON->SSP0CLKDIV = 0; - nvicDisableVector(SSP0_IRQn); - } -#endif -#if LPC11xx_SPI_USE_SSP1 - if (&SPID2 == spip) { - LPC_SYSCON->PRESETCTRL &= ~4; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 18); - LPC_SYSCON->SSP1CLKDIV = 0; - nvicDisableVector(SSP1_IRQn); - } -#endif - } -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This function transmits a series of idle words on the SPI bus and - * ignores the received data. This function can be invoked even - * when a slave select signal has not been yet asserted. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - spip->rxptr = NULL; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This asynchronous function starts a simultaneous transmit/receive - * operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Sends data over the SPI bus. - * @details This asynchronous function starts a transmit operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - spip->rxptr = NULL; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Receives data from the SPI bus. - * @details This asynchronous function starts a receive operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) { - - spip->ssp->DR = (uint32_t)frame; - while ((spip->ssp->SR & SR_RNE) == 0) - ; - return (uint16_t)spip->ssp->DR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/spi_lld.h b/os/hal/platforms/LPC11xx/spi_lld.h deleted file mode 100644 index 5f2cf0561d..0000000000 --- a/os/hal/platforms/LPC11xx/spi_lld.h +++ /dev/null @@ -1,343 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC11xx/spi_lld.h - * @brief LPC11xx low level SPI driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Hardware FIFO depth. - */ -#define LPC11xx_SSP_FIFO_DEPTH 8 - -#define CR0_DSSMASK 0x0F -#define CR0_DSS4BIT 3 -#define CR0_DSS5BIT 4 -#define CR0_DSS6BIT 5 -#define CR0_DSS7BIT 6 -#define CR0_DSS8BIT 7 -#define CR0_DSS9BIT 8 -#define CR0_DSS10BIT 9 -#define CR0_DSS11BIT 0xA -#define CR0_DSS12BIT 0xB -#define CR0_DSS13BIT 0xC -#define CR0_DSS14BIT 0xD -#define CR0_DSS15BIT 0xE -#define CR0_DSS16BIT 0xF -#define CR0_FRFSPI 0 -#define CR0_FRFSSI 0x10 -#define CR0_FRFMW 0x20 -#define CR0_CPOL 0x40 -#define CR0_CPHA 0x80 -#define CR0_CLOCKRATE(n) ((n) << 8) - -#define CR1_LBM 1 -#define CR1_SSE 2 -#define CR1_MS 4 -#define CR1_SOD 8 - -#define SR_TFE 1 -#define SR_TNF 2 -#define SR_RNE 4 -#define SR_RFF 8 -#define SR_BSY 16 - -#define IMSC_ROR 1 -#define IMSC_RT 2 -#define IMSC_RX 4 -#define IMSC_TX 8 - -#define RIS_ROR 1 -#define RIS_RT 2 -#define RIS_RX 4 -#define RIS_TX 8 - -#define MIS_ROR 1 -#define MIS_RT 2 -#define MIS_RX 4 -#define MIS_TX 8 - -#define ICR_ROR 1 -#define ICR_RT 2 - -/** - * @brief SCK0 signal assigned to pin PIO0_10. - */ -#define SCK0_IS_PIO0_10 0 - -/** - * @brief SCK0 signal assigned to pin PIO2_11. - */ -#define SCK0_IS_PIO2_11 1 - -/** - * @brief SCK0 signal assigned to pin PIO0_6. - */ -#define SCK0_IS_PIO0_6 2 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief SPI1 driver enable switch. - * @details If set to @p TRUE the support for device SSP0 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC11xx_SPI_USE_SSP0) || defined(__DOXYGEN__) -#define LPC11xx_SPI_USE_SSP0 TRUE -#endif - -/** - * @brief SPI2 driver enable switch. - * @details If set to @p TRUE the support for device SSP1 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC11xx_SPI_USE_SSP1) || defined(__DOXYGEN__) -#define LPC11xx_SPI_USE_SSP1 TRUE -#endif - -/** - * @brief SSP0 PCLK divider. - */ -#if !defined(LPC11xx_SPI_SSP0CLKDIV) || defined(__DOXYGEN__) -#define LPC11xx_SPI_SSP0CLKDIV 1 -#endif - -/** - * @brief SSP1 PCLK divider. - */ -#if !defined(LPC11xx_SPI_SSP1CLKDIV) || defined(__DOXYGEN__) -#define LPC11xx_SPI_SSP1CLKDIV 1 -#endif - -/** - * @brief SPI0 interrupt priority level setting. - */ -#if !defined(LPC11xx_SPI_SSP0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_SPI_SSP0_IRQ_PRIORITY 1 -#endif - -/** - * @brief SPI1 interrupt priority level setting. - */ -#if !defined(LPC11xx_SPI_SSP1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC11xx_SPI_SSP1_IRQ_PRIORITY 1 -#endif - -/** - * @brief Overflow error hook. - * @details The default action is to stop the system. - */ -#if !defined(LPC11xx_SPI_SSP_ERROR_HOOK) || defined(__DOXYGEN__) -#define LPC11xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#endif - -/** - * @brief SCK0 signal selector. - */ -#if !defined(LPC11xx_SPI_SCK0_SELECTOR) || defined(__DOXYGEN__) -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC11xx_SPI_SSP0CLKDIV < 1) || (LPC11xx_SPI_SSP0CLKDIV > 255) -#error "invalid LPC11xx_SPI_SSP0CLKDIV setting" -#endif - -#if (LPC11xx_SPI_SSP1CLKDIV < 1) || (LPC11xx_SPI_SSP1CLKDIV > 255) -#error "invalid LPC11xx_SPI_SSP1CLKDIV setting" -#endif - -#if !LPC11xx_SPI_USE_SSP0 && !LPC11xx_SPI_USE_SSP1 -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -#if (LPC11xx_SPI_SCK0_SELECTOR != SCK0_IS_PIO0_10) && \ - (LPC11xx_SPI_SCK0_SELECTOR != SCK0_IS_PIO2_11) && \ - (LPC11xx_SPI_SCK0_SELECTOR != SCK0_IS_PIO0_6) -#error "invalid pin assigned to SCK0 signal" -#endif - -/** - * @brief SSP0 clock. - */ -#define LPC11xx_SPI_SSP0_PCLK \ - (LPC11xx_MAINCLK / LPC11xx_SPI_SSP0CLKDIV) - -/** - * @brief SSP1 clock. - */ -#define LPC11xx_SPI_SSP1_PCLK \ - (LPC11xx_MAINCLK / LPC11xx_SPI_SSP1CLKDIV) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SSP CR0 initialization data. - */ - uint16_t cr0; - /** - * @brief SSP CPSR initialization data. - */ - uint32_t cpsr; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SSP registers block. - */ - LPC_SSP_TypeDef *ssp; - /** - * @brief Number of bytes yet to be received. - */ - uint32_t rxcnt; - /** - * @brief Receive pointer or @p NULL. - */ - void *rxptr; - /** - * @brief Number of bytes yet to be transmitted. - */ - uint32_t txcnt; - /** - * @brief Transmit pointer or @p NULL. - */ - const void *txptr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC11xx_SPI_USE_SSP0 && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#if LPC11xx_SPI_USE_SSP1 && !defined(__DOXYGEN__) -extern SPIDriver SPID2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC11xx/system_LPC11xx.h b/os/hal/platforms/LPC11xx/system_LPC11xx.h deleted file mode 100644 index e4536b8a55..0000000000 --- a/os/hal/platforms/LPC11xx/system_LPC11xx.h +++ /dev/null @@ -1,45 +0,0 @@ -/****************************************************************************** - * @file: system_LPC11xx.h - * @purpose: CMSIS Cortex-M0 Device Peripheral Access Layer Header File - * for the NXP LPC11xx Device Series - * @version: V1.0 - * @date: 25. Nov. 2008 - *---------------------------------------------------------------------------- - * - * Copyright (C) 2008 ARM Limited. All rights reserved. - * - * ARM Limited (ARM) is supplying this software for use with Cortex-M0 - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - - -#ifndef __SYSTEM_LPC11xx_H -#define __SYSTEM_LPC11xx_H - -/* Vector Table Base ---------------------------------------------------------*/ -#define NVIC_VectTab_RAM (0x10000000) -#define NVIC_VectTab_FLASH (0x00000000) - -extern uint32_t ClockSource; -extern uint32_t SystemFrequency; /*!< System Clock Frequency (Core Clock) */ -extern uint32_t SystemAHBFrequency; - -/** - * Initialize the system - * - * @param none - * @return none - * - * @brief Setup the microcontroller system. - * Initialize the System and update the SystemFrequency variable. - */ -extern void SystemInit (void); -#endif diff --git a/os/hal/platforms/LPC13xx/LPC13xx.h b/os/hal/platforms/LPC13xx/LPC13xx.h deleted file mode 100644 index 89f937e220..0000000000 --- a/os/hal/platforms/LPC13xx/LPC13xx.h +++ /dev/null @@ -1,570 +0,0 @@ -/**************************************************************************** -* $Id:: LPC13xx.h 7402 2011-05-25 18:48:12Z usb00175 $ -* Project: NXP LPC13xx software example - * -* Description: -* CMSIS Cortex-M0 Core Peripheral Access Layer Header File for - * NXP LPC13xx Device Series - * -**************************************************************************** -* Software that is described herein is for illustrative purposes only -* which provides customers with programming information regarding the -* products. This software is supplied "AS IS" without any warranties. -* NXP Semiconductors assumes no responsibility or liability for the -* use of the software, conveys no license or title under any patent, -* copyright, or mask work right to the product. NXP Semiconductors -* reserves the right to make changes in the software without -* notification. NXP Semiconductors also make no representation or -* warranty that such application will be suitable for the specified -* use without further testing or modification. -****************************************************************************/ - - - -#ifndef __LPC13xx_H__ -#define __LPC13xx_H__ - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup LPC13xx_Definitions LPC13xx Definitions - This file defines all structures and symbols for LPC13xx: - - Registers and bitfields - - peripheral base address - - peripheral ID - - PIO definitions - @{ -*/ - - -/******************************************************************************/ -/* Processor and Core Peripherals */ -/******************************************************************************/ -/** @addtogroup LPC13xx_CMSIS LPC13xx CMSIS Definitions - Configuration of the Cortex-M3 Processor and Core Peripherals - @{ -*/ - -/* - * ========================================================================== - * ---------- Interrupt Number Definition ----------------------------------- - * ========================================================================== - */ -typedef enum IRQn -{ -/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ - -/****** LPC13xx Specific Interrupt Numbers *******************************************************/ - WAKEUP0_IRQn = 0, /*!< All I/O pins can be used as wakeup source. */ - WAKEUP1_IRQn = 1, /*!< There are 40 pins in total for LPC17xx */ - WAKEUP2_IRQn = 2, - WAKEUP3_IRQn = 3, - WAKEUP4_IRQn = 4, - WAKEUP5_IRQn = 5, - WAKEUP6_IRQn = 6, - WAKEUP7_IRQn = 7, - WAKEUP8_IRQn = 8, - WAKEUP9_IRQn = 9, - WAKEUP10_IRQn = 10, - WAKEUP11_IRQn = 11, - WAKEUP12_IRQn = 12, - WAKEUP13_IRQn = 13, - WAKEUP14_IRQn = 14, - WAKEUP15_IRQn = 15, - WAKEUP16_IRQn = 16, - WAKEUP17_IRQn = 17, - WAKEUP18_IRQn = 18, - WAKEUP19_IRQn = 19, - WAKEUP20_IRQn = 20, - WAKEUP21_IRQn = 21, - WAKEUP22_IRQn = 22, - WAKEUP23_IRQn = 23, - WAKEUP24_IRQn = 24, - WAKEUP25_IRQn = 25, - WAKEUP26_IRQn = 26, - WAKEUP27_IRQn = 27, - WAKEUP28_IRQn = 28, - WAKEUP29_IRQn = 29, - WAKEUP30_IRQn = 30, - WAKEUP31_IRQn = 31, - WAKEUP32_IRQn = 32, - WAKEUP33_IRQn = 33, - WAKEUP34_IRQn = 34, - WAKEUP35_IRQn = 35, - WAKEUP36_IRQn = 36, - WAKEUP37_IRQn = 37, - WAKEUP38_IRQn = 38, - WAKEUP39_IRQn = 39, - I2C_IRQn = 40, /*!< I2C Interrupt */ - TIMER_16_0_IRQn = 41, /*!< 16-bit Timer0 Interrupt */ - TIMER_16_1_IRQn = 42, /*!< 16-bit Timer1 Interrupt */ - TIMER_32_0_IRQn = 43, /*!< 32-bit Timer0 Interrupt */ - TIMER_32_1_IRQn = 44, /*!< 32-bit Timer1 Interrupt */ - SSP0_IRQn = 45, /*!< SSP Interrupt */ - UART_IRQn = 46, /*!< UART Interrupt */ - USB_IRQn = 47, /*!< USB Regular Interrupt */ - USB_FIQn = 48, /*!< USB Fast Interrupt */ - ADC_IRQn = 49, /*!< A/D Converter Interrupt */ - WDT_IRQn = 50, /*!< Watchdog timer Interrupt */ - BOD_IRQn = 51, /*!< Brown Out Detect(BOD) Interrupt */ - EINT3_IRQn = 53, /*!< External Interrupt 3 Interrupt */ - EINT2_IRQn = 54, /*!< External Interrupt 2 Interrupt */ - EINT1_IRQn = 55, /*!< External Interrupt 1 Interrupt */ - EINT0_IRQn = 56, /*!< External Interrupt 0 Interrupt */ - SSP1_IRQn = 57, /*!< SSP1 Interrupt */ -} IRQn_Type; - -/* - * ========================================================================== - * ----------- Processor and Core Peripheral Section ------------------------ - * ========================================================================== - */ - -/* Configuration of the Cortex-M3 Processor and Core Peripherals */ -#define __MPU_PRESENT 1 /*!< MPU present or not */ -#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/*@}*/ /* end of group LPC13xx_CMSIS */ - - -#include "core_cm3.h" /* Cortex-M3 processor and core peripherals */ -#include "system_LPC13xx.h" /* System Header */ - - -/******************************************************************************/ -/* Device Specific Peripheral Registers structures */ -/******************************************************************************/ - -#if defined ( __CC_ARM ) -#pragma anon_unions -#endif - -/*------------- System Control (SYSCON) --------------------------------------*/ -/** @addtogroup LPC13xx_SYSCON LPC13xx System Control Block - @{ -*/ -typedef struct -{ - __IO uint32_t SYSMEMREMAP; /*!< Offset: 0x000 (R/W) System memory remap Register */ - __IO uint32_t PRESETCTRL; /*!< Offset: 0x004 (R/W) Peripheral reset control Register */ - __IO uint32_t SYSPLLCTRL; /*!< Offset: 0x008 (R/W) System PLL control Register */ - __I uint32_t SYSPLLSTAT; /*!< Offset: 0x00C (R/ ) System PLL status Register */ - __IO uint32_t USBPLLCTRL; /* USB PLL control, offset 0x10 */ - __IO uint32_t USBPLLSTAT; - uint32_t RESERVED0[2]; - - __IO uint32_t SYSOSCCTRL; /*!< Offset: 0x020 (R/W) System oscillator control Register */ - __IO uint32_t WDTOSCCTRL; /*!< Offset: 0x024 (R/W) Watchdog oscillator control Register */ - __IO uint32_t IRCCTRL; /*!< Offset: 0x028 (R/W) IRC control Register */ - uint32_t RESERVED1[1]; - __IO uint32_t SYSRSTSTAT; /*!< Offset: 0x030 (R/W) System reset status Register */ - uint32_t RESERVED2[3]; - __IO uint32_t SYSPLLCLKSEL; /*!< Offset: 0x040 (R/W) System PLL clock source select Register */ - __IO uint32_t SYSPLLCLKUEN; /*!< Offset: 0x044 (R/W) System PLL clock source update enable Register */ - __IO uint32_t USBPLLCLKSEL; - __IO uint32_t USBPLLCLKUEN; - uint32_t RESERVED3[8]; - - __IO uint32_t MAINCLKSEL; /*!< Offset: 0x070 (R/W) Main clock source select Register */ - __IO uint32_t MAINCLKUEN; /*!< Offset: 0x074 (R/W) Main clock source update enable Register */ - __IO uint32_t SYSAHBCLKDIV; /*!< Offset: 0x078 (R/W) System AHB clock divider Register */ - uint32_t RESERVED4[1]; - - __IO uint32_t SYSAHBCLKCTRL; /*!< Offset: 0x080 (R/W) System AHB clock control Register */ - uint32_t RESERVED5[4]; - __IO uint32_t SSP0CLKDIV; - __IO uint32_t UARTCLKDIV; - __IO uint32_t SSP1CLKDIV; /*!< Offset: 0x09C SSP1 clock divider (R/W) */ - uint32_t RESERVED6[3]; - - __IO uint32_t TRACECLKDIV; - - __IO uint32_t SYSTICKCLKDIV; /* Offset 0xB0 */ - uint32_t RESERVED7[3]; - - __IO uint32_t USBCLKSEL; /* Offset 0xC0 */ - __IO uint32_t USBCLKUEN; - __IO uint32_t USBCLKDIV; - uint32_t RESERVED8[1]; - __IO uint32_t WDTCLKSEL; /*!< Offset: 0x0D0 (R/W) WDT clock source select Register */ - __IO uint32_t WDTCLKUEN; /*!< Offset: 0x0D4 (R/W) WDT clock source update enable Register */ - __IO uint32_t WDTCLKDIV; /*!< Offset: 0x0D8 (R/W) WDT clock divider Register */ - uint32_t RESERVED9[1]; - - __IO uint32_t CLKOUTCLKSEL; /*!< Offset: 0x0E0 (R/W) CLKOUT clock source select Register */ - __IO uint32_t CLKOUTUEN; /*!< Offset: 0x0E4 (R/W) CLKOUT clock source update enable Register */ - __IO uint32_t CLKOUTDIV; /*!< Offset: 0x0E8 (R/W) CLKOUT clock divider Register */ - uint32_t RESERVED10[5]; - - __I uint32_t PIOPORCAP0; /*!< Offset: 0x100 (R/ ) POR captured PIO status 0 Register */ - __I uint32_t PIOPORCAP1; /*!< Offset: 0x104 (R/ ) POR captured PIO status 1 Register */ - uint32_t RESERVED11[11]; - uint32_t RESERVED12[7]; - __IO uint32_t BODCTRL; /*!< Offset: 0x150 (R/W) BOD control Register */ - uint32_t RESERVED13[1]; - __IO uint32_t SYSTCKCAL; /*!< Offset: 0x158 (R/W) System tick counter calibration Register */ - uint32_t RESERVED14[41]; - - __IO uint32_t STARTAPRP0; /*!< Offset: 0x200 (R/W) Start logic edge control Register 0 */ - __IO uint32_t STARTERP0; /*!< Offset: 0x204 (R/W) Start logic signal enable Register 0 */ - __O uint32_t STARTRSRP0CLR; /*!< Offset: 0x208 ( /W) Start logic reset Register 0 */ - __I uint32_t STARTSRP0; /*!< Offset: 0x20C (R/ ) Start logic status Register 0 */ - __IO uint32_t STARTAPRP1; /*!< Offset: 0x210 (R/W) Start logic edge control Register 1 (LPC11UXX only) */ - __IO uint32_t STARTERP1; /*!< Offset: 0x214 (R/W) Start logic signal enable Register 1 (LPC11UXX only) */ - __O uint32_t STARTRSRP1CLR; /*!< Offset: 0x218 ( /W) Start logic reset Register 1 (LPC11UXX only) */ - __I uint32_t STARTSRP1; /*!< Offset: 0x21C (R/ ) Start logic status Register 1 (LPC11UXX only) */ - uint32_t RESERVED17[4]; - - __IO uint32_t PDSLEEPCFG; /*!< Offset: 0x230 (R/W) Power-down states in Deep-sleep mode Register */ - __IO uint32_t PDAWAKECFG; /*!< Offset: 0x234 (R/W) Power-down states after wake-up from Deep-sleep mode Register*/ - __IO uint32_t PDRUNCFG; /*!< Offset: 0x238 (R/W) Power-down configuration Register*/ - uint32_t RESERVED18[110]; - __I uint32_t DEVICE_ID; /*!< Offset: 0x3F4 (R/ ) Device ID Register */ -} LPC_SYSCON_TypeDef; -/*@}*/ /* end of group LPC13xx_SYSCON */ - - -/*------------- Pin Connect Block (IOCON) --------------------------------*/ -/** @addtogroup LPC13xx_IOCON LPC13xx I/O Configuration Block - @{ -*/ -typedef struct -{ - __IO uint32_t PIO2_6; /*!< Offset: 0x000 (R/W) I/O configuration for pin PIO2_6 */ - uint32_t RESERVED0[1]; - __IO uint32_t PIO2_0; /*!< Offset: 0x008 (R/W) I/O configuration for pin PIO2_0/DTR/SSEL1 */ - __IO uint32_t RESET_PIO0_0; /*!< Offset: 0x00C (R/W) I/O configuration for pin RESET/PIO0_0 */ - __IO uint32_t PIO0_1; /*!< Offset: 0x010 (R/W) I/O configuration for pin PIO0_1/CLKOUT/CT32B0_MAT2 */ - __IO uint32_t PIO1_8; /*!< Offset: 0x014 (R/W) I/O configuration for pin PIO1_8/CT16B1_CAP0 */ - uint32_t RESERVED1[1]; - __IO uint32_t PIO0_2; /*!< Offset: 0x01C (R/W) I/O configuration for pin PIO0_2/SSEL0/CT16B0_CAP0 */ - - __IO uint32_t PIO2_7; /*!< Offset: 0x020 (R/W) I/O configuration for pin PIO2_7 */ - __IO uint32_t PIO2_8; /*!< Offset: 0x024 (R/W) I/O configuration for pin PIO2_8 */ - __IO uint32_t PIO2_1; /*!< Offset: 0x028 (R/W) I/O configuration for pin PIO2_1/nDSR/SCK1 */ - __IO uint32_t PIO0_3; /*!< Offset: 0x02C (R/W) I/O configuration for pin PIO0_3 */ - __IO uint32_t PIO0_4; /*!< Offset: 0x030 (R/W) I/O configuration for pin PIO0_4/SCL */ - __IO uint32_t PIO0_5; /*!< Offset: 0x034 (R/W) I/O configuration for pin PIO0_5/SDA */ - __IO uint32_t PIO1_9; /*!< Offset: 0x038 (R/W) I/O configuration for pin PIO1_9/CT16B1_MAT0 */ - __IO uint32_t PIO3_4; /*!< Offset: 0x03C (R/W) I/O configuration for pin PIO3_4 */ - - __IO uint32_t PIO2_4; /*!< Offset: 0x040 (R/W) I/O configuration for pin PIO2_4 */ - __IO uint32_t PIO2_5; /*!< Offset: 0x044 (R/W) I/O configuration for pin PIO2_5 */ - __IO uint32_t PIO3_5; /*!< Offset: 0x048 (R/W) I/O configuration for pin PIO3_5 */ - __IO uint32_t PIO0_6; /*!< Offset: 0x04C (R/W) I/O configuration for pin PIO0_6/SCK0 */ - __IO uint32_t PIO0_7; /*!< Offset: 0x050 (R/W) I/O configuration for pin PIO0_7/nCTS */ - __IO uint32_t PIO2_9; /*!< Offset: 0x054 (R/W) I/O configuration for pin PIO2_9 */ - __IO uint32_t PIO2_10; /*!< Offset: 0x058 (R/W) I/O configuration for pin PIO2_10 */ - __IO uint32_t PIO2_2; /*!< Offset: 0x05C (R/W) I/O configuration for pin PIO2_2/DCD/MISO1 */ - - __IO uint32_t PIO0_8; /*!< Offset: 0x060 (R/W) I/O configuration for pin PIO0_8/MISO0/CT16B0_MAT0 */ - __IO uint32_t PIO0_9; /*!< Offset: 0x064 (R/W) I/O configuration for pin PIO0_9/MOSI0/CT16B0_MAT1 */ - __IO uint32_t SWCLK_PIO0_10; /*!< Offset: 0x068 (R/W) I/O configuration for pin SWCLK/PIO0_10/SCK0/CT16B0_MAT2 */ - __IO uint32_t PIO1_10; /*!< Offset: 0x06C (R/W) I/O configuration for pin PIO1_10/AD6/CT16B1_MAT1 */ - __IO uint32_t PIO2_11; /*!< Offset: 0x070 (R/W) I/O configuration for pin PIO2_11/SCK0 */ - __IO uint32_t R_PIO0_11; /*!< Offset: 0x074 (R/W) I/O configuration for pin TDI/PIO0_11/AD0/CT32B0_MAT3 */ - __IO uint32_t R_PIO1_0; /*!< Offset: 0x078 (R/W) I/O configuration for pin TMS/PIO1_0/AD1/CT32B1_CAP0 */ - __IO uint32_t R_PIO1_1; /*!< Offset: 0x07C (R/W) I/O configuration for pin TDO/PIO1_1/AD2/CT32B1_MAT0 */ - - __IO uint32_t R_PIO1_2; /*!< Offset: 0x080 (R/W) I/O configuration for pin nTRST/PIO1_2/AD3/CT32B1_MAT1 */ - __IO uint32_t PIO3_0; /*!< Offset: 0x084 (R/W) I/O configuration for pin PIO3_0/nDTR */ - __IO uint32_t PIO3_1; /*!< Offset: 0x088 (R/W) I/O configuration for pin PIO3_1/nDSR */ - __IO uint32_t PIO2_3; /*!< Offset: 0x08C (R/W) I/O configuration for pin PIO2_3/RI/MOSI1 */ - __IO uint32_t SWDIO_PIO1_3; /*!< Offset: 0x090 (R/W) I/O configuration for pin SWDIO/PIO1_3/AD4/CT32B1_MAT2 */ - __IO uint32_t PIO1_4; /*!< Offset: 0x094 (R/W) I/O configuration for pin PIO1_4/AD5/CT32B1_MAT3 */ - __IO uint32_t PIO1_11; /*!< Offset: 0x098 (R/W) I/O configuration for pin PIO1_11/AD7 */ - __IO uint32_t PIO3_2; /*!< Offset: 0x09C (R/W) I/O configuration for pin PIO3_2/nDCD */ - - __IO uint32_t PIO1_5; - __IO uint32_t PIO1_6; - __IO uint32_t PIO1_7; - __IO uint32_t PIO3_3; - __IO uint32_t SCK_LOC; /*!< Offset: 0x0B0 SCK pin location select Register (R/W) */ - __IO uint32_t DSR_LOC; /*!< Offset: 0x0B4 DSR pin location select Register (R/W) */ - __IO uint32_t DCD_LOC; /*!< Offset: 0x0B8 DCD pin location select Register (R/W) */ - __IO uint32_t RI_LOC; /*!< Offset: 0x0BC RI pin location Register (R/W) */ -} LPC_IOCON_TypeDef; -/*@}*/ /* end of group LPC13xx_IOCON */ - - -/*------------- Power Management Unit (PMU) --------------------------*/ -/** @addtogroup LPC13xx_PMU LPC13xx Power Management Unit - @{ -*/ -typedef struct -{ - __IO uint32_t PCON; /*!< Offset: 0x000 (R/W) Power control Register */ - __IO uint32_t GPREG0; /*!< Offset: 0x004 (R/W) General purpose Register 0 */ - __IO uint32_t GPREG1; /*!< Offset: 0x008 (R/W) General purpose Register 1 */ - __IO uint32_t GPREG2; /*!< Offset: 0x00C (R/W) General purpose Register 2 */ - __IO uint32_t GPREG3; /*!< Offset: 0x010 (R/W) General purpose Register 3 */ - __IO uint32_t GPREG4; /*!< Offset: 0x014 (R/W) General purpose Register 4 */ -} LPC_PMU_TypeDef; -/*@}*/ /* end of group LPC13xx_PMU */ - - -/*------------- General Purpose Input/Output (GPIO) --------------------------*/ -/** @addtogroup LPC13xx_GPIO LPC13xx General Purpose Input/Output - @{ -*/ -typedef struct -{ - union { - __IO uint32_t MASKED_ACCESS[4096]; /*!< Offset: 0x0000 (R/W) Port data Register for pins PIOn_0 to PIOn_11 */ - struct { - uint32_t RESERVED0[4095]; - __IO uint32_t DATA; /*!< Offset: 0x3FFC (R/W) Port data Register */ - }; - }; - uint32_t RESERVED1[4096]; - __IO uint32_t DIR; /*!< Offset: 0x8000 (R/W) Data direction Register */ - __IO uint32_t IS; /*!< Offset: 0x8004 (R/W) Interrupt sense Register */ - __IO uint32_t IBE; /*!< Offset: 0x8008 (R/W) Interrupt both edges Register */ - __IO uint32_t IEV; /*!< Offset: 0x800C (R/W) Interrupt event Register */ - __IO uint32_t IE; /*!< Offset: 0x8010 (R/W) Interrupt mask Register */ - __I uint32_t RIS; /*!< Offset: 0x8014 (R/ ) Raw interrupt status Register */ - __I uint32_t MIS; /*!< Offset: 0x8018 (R/ ) Masked interrupt status Register */ - __O uint32_t IC; /*!< Offset: 0x801C ( /W) Interrupt clear Register */ -} LPC_GPIO_TypeDef; -/*@}*/ /* end of group LPC13xx_GPIO */ - - -/*------------- Timer (TMR) --------------------------------------------------*/ -/** @addtogroup LPC13xx_TMR LPC13xx 16/32-bit Counter/Timer - @{ -*/ -typedef struct -{ - __IO uint32_t IR; /*!< Offset: 0x000 (R/W) Interrupt Register */ - __IO uint32_t TCR; /*!< Offset: 0x004 (R/W) Timer Control Register */ - __IO uint32_t TC; /*!< Offset: 0x008 (R/W) Timer Counter Register */ - __IO uint32_t PR; /*!< Offset: 0x00C (R/W) Prescale Register */ - __IO uint32_t PC; /*!< Offset: 0x010 (R/W) Prescale Counter Register */ - __IO uint32_t MCR; /*!< Offset: 0x014 (R/W) Match Control Register */ - __IO uint32_t MR0; /*!< Offset: 0x018 (R/W) Match Register 0 */ - __IO uint32_t MR1; /*!< Offset: 0x01C (R/W) Match Register 1 */ - __IO uint32_t MR2; /*!< Offset: 0x020 (R/W) Match Register 2 */ - __IO uint32_t MR3; /*!< Offset: 0x024 (R/W) Match Register 3 */ - __IO uint32_t CCR; /*!< Offset: 0x028 (R/W) Capture Control Register */ - __I uint32_t CR0; /*!< Offset: 0x02C (R/ ) Capture Register 0 */ - uint32_t RESERVED1[3]; - __IO uint32_t EMR; /*!< Offset: 0x03C (R/W) External Match Register */ - uint32_t RESERVED2[12]; - __IO uint32_t CTCR; /*!< Offset: 0x070 (R/W) Count Control Register */ - __IO uint32_t PWMC; /*!< Offset: 0x074 (R/W) PWM Control Register */ -} LPC_TMR_TypeDef; -/*@}*/ /* end of group LPC13xx_TMR */ - - -/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ -/** @addtogroup LPC13xx_UART LPC13xx Universal Asynchronous Receiver/Transmitter - @{ -*/ -typedef struct -{ - union { - __I uint32_t RBR; /*!< Offset: 0x000 (R/ ) Receiver Buffer Register */ - __O uint32_t THR; /*!< Offset: 0x000 ( /W) Transmit Holding Register */ - __IO uint32_t DLL; /*!< Offset: 0x000 (R/W) Divisor Latch LSB */ - }; - union { - __IO uint32_t DLM; /*!< Offset: 0x004 (R/W) Divisor Latch MSB */ - __IO uint32_t IER; /*!< Offset: 0x000 (R/W) Interrupt Enable Register */ - }; - union { - __I uint32_t IIR; /*!< Offset: 0x008 (R/ ) Interrupt ID Register */ - __O uint32_t FCR; /*!< Offset: 0x008 ( /W) FIFO Control Register */ - }; - __IO uint32_t LCR; /*!< Offset: 0x00C (R/W) Line Control Register */ - __IO uint32_t MCR; /*!< Offset: 0x010 (R/W) Modem control Register */ - __I uint32_t LSR; /*!< Offset: 0x014 (R/ ) Line Status Register */ - __I uint32_t MSR; /*!< Offset: 0x018 (R/ ) Modem status Register */ - __IO uint32_t SCR; /*!< Offset: 0x01C (R/W) Scratch Pad Register */ - __IO uint32_t ACR; /*!< Offset: 0x020 (R/W) Auto-baud Control Register */ - uint32_t RESERVED0[1]; - __IO uint32_t FDR; /*!< Offset: 0x028 (R/W) Fractional Divider Register */ - uint32_t RESERVED1[1]; - __IO uint32_t TER; /*!< Offset: 0x030 (R/W) Transmit Enable Register */ - uint32_t RESERVED2[6]; - __IO uint32_t RS485CTRL; /*!< Offset: 0x04C (R/W) RS-485/EIA-485 Control Register */ - __IO uint32_t ADRMATCH; /*!< Offset: 0x050 (R/W) RS-485/EIA-485 address match Register */ - __IO uint32_t RS485DLY; /*!< Offset: 0x054 (R/W) RS-485/EIA-485 direction control delay Register */ - -} LPC_UART_TypeDef; -/*@}*/ /* end of group LPC13xx_UART */ - - -/*------------- Synchronous Serial Communication (SSP) -----------------------*/ -/** @addtogroup LPC13xx_SSP LPC13xx Synchronous Serial Port - @{ -*/ -typedef struct -{ - __IO uint32_t CR0; /*!< Offset: 0x000 (R/W) Control Register 0 */ - __IO uint32_t CR1; /*!< Offset: 0x004 (R/W) Control Register 1 */ - __IO uint32_t DR; /*!< Offset: 0x008 (R/W) Data Register */ - __I uint32_t SR; /*!< Offset: 0x00C (R/ ) Status Register */ - __IO uint32_t CPSR; /*!< Offset: 0x010 (R/W) Clock Prescale Register */ - __IO uint32_t IMSC; /*!< Offset: 0x014 (R/W) Interrupt Mask Set and Clear Register */ - __I uint32_t RIS; /*!< Offset: 0x018 (R/ ) Raw Interrupt Status Register */ - __I uint32_t MIS; /*!< Offset: 0x01C (R/ ) Masked Interrupt Status Register */ - __O uint32_t ICR; /*!< Offset: 0x020 ( /W) SSPICR Interrupt Clear Register */ -} LPC_SSP_TypeDef; -/*@}*/ /* end of group LPC13xx_SSP */ - - -/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/ -/** @addtogroup LPC13xx_I2C LPC13xx I2C-Bus Interface - @{ -*/ -typedef struct -{ - __IO uint32_t CONSET; /*!< Offset: 0x000 (R/W) I2C Control Set Register */ - __I uint32_t STAT; /*!< Offset: 0x004 (R/ ) I2C Status Register */ - __IO uint32_t DAT; /*!< Offset: 0x008 (R/W) I2C Data Register */ - __IO uint32_t ADR0; /*!< Offset: 0x00C (R/W) I2C Slave Address Register 0 */ - __IO uint32_t SCLH; /*!< Offset: 0x010 (R/W) SCH Duty Cycle Register High Half Word */ - __IO uint32_t SCLL; /*!< Offset: 0x014 (R/W) SCL Duty Cycle Register Low Half Word */ - __O uint32_t CONCLR; /*!< Offset: 0x018 ( /W) I2C Control Clear Register */ - __IO uint32_t MMCTRL; /*!< Offset: 0x01C (R/W) Monitor mode control register */ - __IO uint32_t ADR1; /*!< Offset: 0x020 (R/W) I2C Slave Address Register 1 */ - __IO uint32_t ADR2; /*!< Offset: 0x024 (R/W) I2C Slave Address Register 2 */ - __IO uint32_t ADR3; /*!< Offset: 0x028 (R/W) I2C Slave Address Register 3 */ - __I uint32_t DATA_BUFFER; /*!< Offset: 0x02C (R/ ) Data buffer Register */ - __IO uint32_t MASK0; /*!< Offset: 0x030 (R/W) I2C Slave address mask register 0 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) I2C Slave address mask register 1 */ - __IO uint32_t MASK2; /*!< Offset: 0x038 (R/W) I2C Slave address mask register 2 */ - __IO uint32_t MASK3; /*!< Offset: 0x03C (R/W) I2C Slave address mask register 3 */ -} LPC_I2C_TypeDef; -/*@}*/ /* end of group LPC13xx_I2C */ - - -/*------------- Windowed Watchdog Timer (WWDT) -----------------------------------------*/ -/** @addtogroup LPC13xx_WWDT LPC13xx Windowed WatchDog Timer - @{ -*/ -typedef struct -{ - __IO uint32_t MOD; - __IO uint32_t TC; - __O uint32_t FEED; - __I uint32_t TV; - uint32_t RESERVED0; - __IO uint32_t WARNINT; /*!< Offset: 0x014 Watchdog timer warning int. register (R/W) */ - __IO uint32_t WINDOW; /*!< Offset: 0x018 Watchdog timer window value register (R/W) */ -} LPC_WWDT_TypeDef; -/*@}*/ /* end of group LPC13xx_WWDT */ - - -/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/ -/** @addtogroup LPC13xx_ADC LPC13xx Analog-to-Digital Converter - @{ -*/ -typedef struct -{ - __IO uint32_t CR; /*!< Offset: 0x000 (R/W) A/D Control Register */ - __IO uint32_t GDR; /*!< Offset: 0x004 (R/W) A/D Global Data Register */ - uint32_t RESERVED0[1]; - __IO uint32_t INTEN; /*!< Offset: 0x00C (R/W) A/D Interrupt Enable Register */ - __IO uint32_t DR[8]; /*!< Offset: 0x010 (R/W) A/D Channel 0..7 Data Register */ - __I uint32_t STAT; /*!< Offset: 0x030 (R/ ) A/D Status Register */ -} LPC_ADC_TypeDef; -/*@}*/ /* end of group LPC13xx_ADC */ - - -/*------------- Universal Serial Bus (USB) -----------------------------------*/ -/** @addtogroup LPC13xx_USB LPC13xx Universal Serial Bus - @{ -*/ -typedef struct -{ - __I uint32_t DevIntSt; /*!< Offset: 0x000 (R/ ) USB Device Interrupt Status Register */ - __IO uint32_t DevIntEn; /*!< Offset: 0x004 (R/W) USB Device Interrupt Enable Register */ - __O uint32_t DevIntClr; /*!< Offset: 0x008 ( /W) USB Device Interrupt Clear Register */ - __O uint32_t DevIntSet; /*!< Offset: 0x00C ( /W) USB Device Interrupt Set Register */ - - __O uint32_t CmdCode; /*!< Offset: 0x010 ( /W) USB Command Code Register */ - __I uint32_t CmdData; /*!< Offset: 0x014 (R/ ) USB Command Data Register */ - - __I uint32_t RxData; /*!< Offset: 0x018 (R/ ) USB Receive Data Register */ - __O uint32_t TxData; /*!< Offset: 0x01C ( /W) USB Transmit Data Register */ - __I uint32_t RxPLen; /*!< Offset: 0x020 (R/ ) USB Receive Packet Length Register */ - __O uint32_t TxPLen; /*!< Offset: 0x024 ( /W) USB Transmit Packet Length Register */ - __IO uint32_t Ctrl; /*!< Offset: 0x028 (R/ ) USB Control Register */ - __O uint32_t DevFIQSel; /*!< Offset: 0x02C ( /W) USB Device FIQ select Register */ -} LPC_USB_TypeDef; -/*@}*/ /* end of group LPC13xx_USB */ - -#if defined ( __CC_ARM ) -#pragma no_anon_unions -#endif - -/******************************************************************************/ -/* Peripheral memory map */ -/******************************************************************************/ -/* Base addresses */ -#define LPC_FLASH_BASE (0x00000000UL) -#define LPC_RAM_BASE (0x10000000UL) -#define LPC_APB0_BASE (0x40000000UL) -#define LPC_AHB_BASE (0x50000000UL) - -/* APB0 peripherals */ -#define LPC_I2C_BASE (LPC_APB0_BASE + 0x00000) -#define LPC_WWDT_BASE (LPC_APB0_BASE + 0x04000) -#define LPC_UART_BASE (LPC_APB0_BASE + 0x08000) -#define LPC_CT16B0_BASE (LPC_APB0_BASE + 0x0C000) -#define LPC_CT16B1_BASE (LPC_APB0_BASE + 0x10000) -#define LPC_CT32B0_BASE (LPC_APB0_BASE + 0x14000) -#define LPC_CT32B1_BASE (LPC_APB0_BASE + 0x18000) -#define LPC_ADC_BASE (LPC_APB0_BASE + 0x1C000) -#define LPC_USB_BASE (LPC_APB0_BASE + 0x20000) -#define LPC_PMU_BASE (LPC_APB0_BASE + 0x38000) -#define LPC_SSP0_BASE (LPC_APB0_BASE + 0x40000) -#define LPC_IOCON_BASE (LPC_APB0_BASE + 0x44000) -#define LPC_SYSCON_BASE (LPC_APB0_BASE + 0x48000) -#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x58000) - -/* AHB peripherals */ -#define LPC_GPIO_BASE (LPC_AHB_BASE + 0x00000) -#define LPC_GPIO0_BASE (LPC_AHB_BASE + 0x00000) -#define LPC_GPIO1_BASE (LPC_AHB_BASE + 0x10000) -#define LPC_GPIO2_BASE (LPC_AHB_BASE + 0x20000) -#define LPC_GPIO3_BASE (LPC_AHB_BASE + 0x30000) - -/******************************************************************************/ -/* Peripheral declaration */ -/******************************************************************************/ -#define LPC_I2C ((LPC_I2C_TypeDef *) LPC_I2C_BASE ) -#define LPC_WWDT ((LPC_WWDT_TypeDef *) LPC_WWDT_BASE ) -#define LPC_UART ((LPC_UART_TypeDef *) LPC_UART_BASE ) -#define LPC_TMR16B0 ((LPC_TMR_TypeDef *) LPC_CT16B0_BASE) -#define LPC_TMR16B1 ((LPC_TMR_TypeDef *) LPC_CT16B1_BASE) -#define LPC_TMR32B0 ((LPC_TMR_TypeDef *) LPC_CT32B0_BASE) -#define LPC_TMR32B1 ((LPC_TMR_TypeDef *) LPC_CT32B1_BASE) -#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE ) -#define LPC_PMU ((LPC_PMU_TypeDef *) LPC_PMU_BASE ) -#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE ) -#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE ) -#define LPC_IOCON ((LPC_IOCON_TypeDef *) LPC_IOCON_BASE ) -#define LPC_SYSCON ((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE) -#define LPC_USB ((LPC_USB_TypeDef *) LPC_USB_BASE ) -#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE ) -#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE ) -#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE ) -#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE ) - -#ifdef __cplusplus -} -#endif - -#endif /* __LPC13xx_H__ */ diff --git a/os/hal/platforms/LPC13xx/gpt_lld.c b/os/hal/platforms/LPC13xx/gpt_lld.c deleted file mode 100644 index a1a8c717cb..0000000000 --- a/os/hal/platforms/LPC13xx/gpt_lld.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/gpt_lld.c - * @brief LPC13xx GPT subsystem low level driver source. - * - * @addtogroup GPT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief GPT1 driver identifier. - * @note The driver GPT1 allocates the complex timer CT16B0 when enabled. - */ -#if LPC13xx_GPT_USE_CT16B0 || defined(__DOXYGEN__) -GPTDriver GPTD1; -#endif - -/** - * @brief GPT2 driver identifier. - * @note The driver GPT2 allocates the timer CT16B1 when enabled. - */ -#if LPC13xx_GPT_USE_CT16B1 || defined(__DOXYGEN__) -GPTDriver GPTD2; -#endif - -/** - * @brief GPT3 driver identifier. - * @note The driver GPT3 allocates the timer CT32B0 when enabled. - */ -#if LPC13xx_GPT_USE_CT32B0 || defined(__DOXYGEN__) -GPTDriver GPTD3; -#endif - -/** - * @brief GPT4 driver identifier. - * @note The driver GPT4 allocates the timer CT32B1 when enabled. - */ -#if LPC13xx_GPT_USE_CT32B1 || defined(__DOXYGEN__) -GPTDriver GPTD4; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared IRQ handler. - * - * @param[in] gptp pointer to a @p GPTDriver object - */ -static void gpt_lld_serve_interrupt(GPTDriver *gptp) { - - gptp->tmr->IR = 1; /* Clear interrupt on match MR0.*/ - if (gptp->state == GPT_ONESHOT) { - gptp->state = GPT_READY; /* Back in GPT_READY state. */ - gpt_lld_stop_timer(gptp); /* Timer automatically stopped. */ - } - gptp->config->callback(gptp); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC13xx_GPT_USE_CT16B0 -/** - * @brief CT16B0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(VectorE4) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC13xx_GPT_USE_CT16B0 */ - -#if LPC13xx_GPT_USE_CT16B1 -/** - * @brief CT16B1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(VectorE8) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC13xx_GPT_USE_CT16B0 */ - -#if LPC13xx_GPT_USE_CT32B0 -/** - * @brief CT32B0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(VectorEC) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC13xx_GPT_USE_CT32B0 */ - -#if LPC13xx_GPT_USE_CT32B1 -/** - * @brief CT32B1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(VectorF0) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD4); - - CH_IRQ_EPILOGUE(); -} -#endif /* LPC13xx_GPT_USE_CT32B1 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level GPT driver initialization. - * - * @notapi - */ -void gpt_lld_init(void) { - -#if LPC13xx_GPT_USE_CT16B0 - /* Driver initialization.*/ - GPTD1.tmr = LPC_TMR16B0; - gptObjectInit(&GPTD1); -#endif - -#if LPC13xx_GPT_USE_CT16B1 - /* Driver initialization.*/ - GPTD2.tmr = LPC_TMR16B1; - gptObjectInit(&GPTD2); -#endif - -#if LPC13xx_GPT_USE_CT32B0 - /* Driver initialization.*/ - GPTD3.tmr = LPC_TMR32B0; - gptObjectInit(&GPTD3); -#endif - -#if LPC13xx_GPT_USE_CT32B1 - /* Driver initialization.*/ - GPTD4.tmr = LPC_TMR32B1; - gptObjectInit(&GPTD4); -#endif -} - -/** - * @brief Configures and activates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_start(GPTDriver *gptp) { - uint32_t pr; - - if (gptp->state == GPT_STOP) { - /* Clock activation.*/ -#if LPC13xx_GPT_USE_CT16B0 - if (&GPTD1 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 7); - nvicEnableVector(TIMER_16_0_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif -#if LPC13xx_GPT_USE_CT16B1 - if (&GPTD2 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8); - nvicEnableVector(TIMER_16_1_IRQn, CORTEX_PRIORITY_MASK(3)); - } -#endif -#if LPC13xx_GPT_USE_CT32B0 - if (&GPTD3 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9); - nvicEnableVector(TIMER_32_0_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif -#if LPC13xx_GPT_USE_CT32B1 - if (&GPTD4 == gptp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 10); - nvicEnableVector(TIMER_32_1_IRQn, CORTEX_PRIORITY_MASK(2)); - } -#endif - } - - /* Prescaler value calculation.*/ - pr = (uint16_t)((LPC13xx_SYSCLK / gptp->config->frequency) - 1); - chDbgAssert(((uint32_t)(pr + 1) * gptp->config->frequency) == LPC13xx_SYSCLK, - "gpt_lld_start(), #1", "invalid frequency"); - - /* Timer configuration.*/ - gptp->tmr->PR = pr; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; -} - -/** - * @brief Deactivates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop(GPTDriver *gptp) { - - if (gptp->state == GPT_READY) { - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; - -#if LPC13xx_GPT_USE_CT16B0 - if (&GPTD1 == gptp) { - nvicDisableVector(TIMER_16_0_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 7); - } -#endif -#if LPC13xx_GPT_USE_CT16B1 - if (&GPTD2 == gptp) { - nvicDisableVector(TIMER_16_1_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 8); - } -#endif -#if LPC13xx_GPT_USE_CT32B0 - if (&GPTD3 == gptp) { - nvicDisableVector(TIMER_32_0_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 9); - } -#endif -#if LPC13xx_GPT_USE_CT32B1 - if (&GPTD4 == gptp) { - nvicDisableVector(TIMER_32_1_IRQn); - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 10); - } -#endif - } -} - -/** - * @brief Starts the timer in continuous mode. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval period in ticks - * - * @notapi - */ -void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tmr->MR0 = interval - 1; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 3; /* IRQ and clr TC on match MR0. */ - gptp->tmr->TCR = 2; /* Reset counter and prescaler. */ - gptp->tmr->TCR = 1; /* Timer enabled. */ -} - -/** - * @brief Stops the timer. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop_timer(GPTDriver *gptp) { - - gptp->tmr->IR = 1; - gptp->tmr->MCR = 0; - gptp->tmr->TCR = 0; -} - -/** - * @brief Starts the timer in one shot mode and waits for completion. - * @details This function specifically polls the timer waiting for completion - * in order to not have extra delays caused by interrupt servicing, - * this function is only recommended for short delays. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval time interval in ticks - * - * @notapi - */ -void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tmr->MR0 = interval - 1; - gptp->tmr->IR = 1; - gptp->tmr->MCR = 4; /* Stop TC on match MR0. */ - gptp->tmr->TCR = 2; /* Reset counter and prescaler. */ - gptp->tmr->TCR = 1; /* Timer enabled. */ - while (gptp->tmr->TCR & 1) - ; -} - -#endif /* HAL_USE_GPT */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/gpt_lld.h b/os/hal/platforms/LPC13xx/gpt_lld.h deleted file mode 100644 index d3b1ab75b8..0000000000 --- a/os/hal/platforms/LPC13xx/gpt_lld.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/gpt_lld.h - * @brief LPC13xx GPT subsystem low level driver header. - * - * @addtogroup GPT - * @{ - */ - -#ifndef _GPT_LLD_H_ -#define _GPT_LLD_H_ - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief GPT1 driver enable switch. - * @details If set to @p TRUE the support for GPT1 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC13xx_GPT_USE_CT16B0) || defined(__DOXYGEN__) -#define LPC13xx_GPT_USE_CT16B0 TRUE -#endif - -/** - * @brief GPT2 driver enable switch. - * @details If set to @p TRUE the support for GPT2 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC13xx_GPT_USE_CT16B1) || defined(__DOXYGEN__) -#define LPC13xx_GPT_USE_CT16B1 TRUE -#endif - -/** - * @brief GPT3 driver enable switch. - * @details If set to @p TRUE the support for GPT3 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC13xx_GPT_USE_CT32B0) || defined(__DOXYGEN__) -#define LPC13xx_GPT_USE_CT32B0 TRUE -#endif - -/** - * @brief GPT4 driver enable switch. - * @details If set to @p TRUE the support for GPT4 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC13xx_GPT_USE_CT32B1) || defined(__DOXYGEN__) -#define LPC13xx_GPT_USE_CT32B1 TRUE -#endif - -/** - * @brief GPT1 interrupt priority level setting. - */ -#if !defined(LPC13xx_GPT_CT16B0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_GPT_CT16B0_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT2 interrupt priority level setting. - */ -#if !defined(LPC13xx_GPT_CT16B1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_GPT_CT16B1_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT3 interrupt priority level setting. - */ -#if !defined(LPC13xx_GPT_CT32B0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_GPT_CT32B0_IRQ_PRIORITY 2 -#endif - -/** - * @brief GPT4 interrupt priority level setting. - */ -#if !defined(LPC13xx_GPT_CT32B1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_GPT_CT32B1_IRQ_PRIORITY 2 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !LPC13xx_GPT_USE_CT16B0 && !LPC13xx_GPT_USE_CT16B1 && \ - !LPC13xx_GPT_USE_CT32B0 && !LPC13xx_GPT_USE_CT32B1 -#error "GPT driver activated but no CT peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief GPT frequency type. - */ -typedef uint32_t gptfreq_t; - -/** - * @brief GPT counter type. - */ -typedef uint32_t gptcnt_t; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Timer clock in Hz. - * @note The low level can use assertions in order to catch invalid - * frequency specifications. - */ - gptfreq_t frequency; - /** - * @brief Timer callback pointer. - * @note This callback is invoked on GPT counter events. - */ - gptcallback_t callback; - /* End of the mandatory fields.*/ -} GPTConfig; - -/** - * @brief Structure representing a GPT driver. - */ -struct GPTDriver { - /** - * @brief Driver state. - */ - gptstate_t state; - /** - * @brief Current configuration data. - */ - const GPTConfig *config; - /* End of the mandatory fields.*/ - /** - * @brief Timer base clock. - */ - uint32_t clock; - /** - * @brief Pointer to the CTxxBy registers block. - */ - LPC_TMR_TypeDef *tmr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC13xx_GPT_USE_CT16B0 && !defined(__DOXYGEN__) -extern GPTDriver GPTD1; -#endif - -#if LPC13xx_GPT_USE_CT16B1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD2; -#endif - -#if LPC13xx_GPT_USE_CT32B0 && !defined(__DOXYGEN__) -extern GPTDriver GPTD3; -#endif - -#if LPC13xx_GPT_USE_CT32B1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD4; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void gpt_lld_init(void); - void gpt_lld_start(GPTDriver *gptp); - void gpt_lld_stop(GPTDriver *gptp); - void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t period); - void gpt_lld_stop_timer(GPTDriver *gptp); - void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GPT */ - -#endif /* _GPT_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/hal_lld.c b/os/hal/platforms/LPC13xx/hal_lld.c deleted file mode 100644 index 0ad021bf6b..0000000000 --- a/os/hal/platforms/LPC13xx/hal_lld.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/hal_lld.c - * @brief LPC13xx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/** - * @brief Register missing in NXP header file. - */ -#define FLASHCFG (*((volatile uint32_t *)0x4003C010)) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* SysTick initialization using the system clock.*/ - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, CORTEX_PRIORITY_SYSTICK); - SysTick->LOAD = LPC13xx_SYSCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief LPC13xx clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function must be invoked only after the system reset. - * - * @special - */ -void LPC13xx_clock_init(void) { - unsigned i; - - /* Flash wait states setting, the code takes care to not touch TBD bits.*/ - FLASHCFG = (FLASHCFG & ~3) | LPC13xx_FLASHCFG_FLASHTIM; - - /* System oscillator initialization if required.*/ -#if LPC13xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT -#if LPC13xx_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC - LPC_SYSCON->SYSOSCCTRL = LPC13xx_SYSOSCCTRL; - LPC_SYSCON->PDRUNCFG &= ~(1 << 5); /* System oscillator ON. */ - for (i = 0; i < 200; i++) - __NOP(); /* Stabilization delay. */ -#endif /* LPC13xx_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC */ - - /* PLL initialization if required.*/ - LPC_SYSCON->SYSPLLCLKSEL = LPC13xx_PLLCLK_SOURCE; - LPC_SYSCON->SYSPLLCLKUEN = 1; /* Really required? */ - LPC_SYSCON->SYSPLLCLKUEN = 0; - LPC_SYSCON->SYSPLLCLKUEN = 1; - LPC_SYSCON->SYSPLLCTRL = LPC13xx_SYSPLLCTRL_MSEL | LPC13xx_SYSPLLCTRL_PSEL; - LPC_SYSCON->PDRUNCFG &= ~(1 << 7); /* System PLL ON. */ - while ((LPC_SYSCON->SYSPLLSTAT & 1) == 0) /* Wait PLL lock. */ - ; -#endif /* LPC13xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT */ - - /* Main clock source selection.*/ - LPC_SYSCON->MAINCLKSEL = LPC13xx_MAINCLK_SOURCE; - LPC_SYSCON->MAINCLKUEN = 1; /* Really required? */ - LPC_SYSCON->MAINCLKUEN = 0; - LPC_SYSCON->MAINCLKUEN = 1; - while ((LPC_SYSCON->MAINCLKUEN & 1) == 0) /* Wait switch completion. */ - ; - - /* ABH divider initialization, peripheral clocks are initially disabled, - the various device drivers will handle their own setup except GPIO and - IOCON that are left enabled.*/ - LPC_SYSCON->SYSAHBCLKDIV = LPC13xx_SYSABHCLK_DIV; - LPC_SYSCON->SYSAHBCLKCTRL = 0x0001005F; - - /* Memory remapping, vectors always in ROM.*/ - LPC_SYSCON->SYSMEMREMAP = 2; -} - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/hal_lld.h b/os/hal/platforms/LPC13xx/hal_lld.h deleted file mode 100644 index 67903b081f..0000000000 --- a/os/hal/platforms/LPC13xx/hal_lld.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/hal_lld.h - * @brief HAL subsystem low level driver header template. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "LPC13xx.h" -#include "nvic.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "LPC13xx" - -#define IRCOSCCLK 12000000 /**< High speed internal clock. */ -#define WDGOSCCLK 1600000 /**< Watchdog internal clock. */ - -#define SYSPLLCLKSEL_IRCOSC 0 /**< Internal RC oscillator - clock source. */ -#define SYSPLLCLKSEL_SYSOSC 1 /**< System oscillator clock - source. */ - -#define SYSMAINCLKSEL_IRCOSC 0 /**< Clock source is IRC. */ -#define SYSMAINCLKSEL_PLLIN 1 /**< Clock source is PLLIN. */ -#define SYSMAINCLKSEL_WDGOSC 2 /**< Clock source is WDGOSC. */ -#define SYSMAINCLKSEL_PLLOUT 3 /**< Clock source is PLLOUT. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief System PLL clock source. - */ -#if !defined(LPC13xx_PLLCLK_SOURCE) || defined(__DOXYGEN__) -#define LPC13xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#endif - -/** - * @brief System PLL multiplier. - * @note The value must be in the 1..32 range and the final frequency - * must not exceed the CCO ratings. - */ -#if !defined(LPC13xx_SYSPLL_MUL) || defined(__DOXYGEN__) -#define LPC13xx_SYSPLL_MUL 6 -#endif - -/** - * @brief System PLL divider. - * @note The value must be chosen between (2, 4, 8, 16). - */ -#if !defined(LPC13xx_SYSPLL_DIV) || defined(__DOXYGEN__) -#define LPC13xx_SYSPLL_DIV 4 -#endif - -/** - * @brief System main clock source. - */ -#if !defined(LPC13xx_MAINCLK_SOURCE) || defined(__DOXYGEN__) -#define LPC13xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#endif - -/** - * @brief AHB clock divider. - * @note The value must be chosen between (1...255). - */ -#if !defined(LPC13xx_SYSCLK_DIV) || defined(__DOXYGEN__) -#define LPC13xx_SYSABHCLK_DIV 1 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** - * @brief Calculated SYSOSCCTRL setting. - */ -#if (SYSOSCCLK < 18000000) || defined(__DOXYGEN__) -#define LPC13xx_SYSOSCCTRL 0 -#else -#define LPC13xx_SYSOSCCTRL 1 -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (LPC13xx_PLLCLK_SOURCE == SYSPLLCLKSEL_SYSOSC) || defined(__DOXYGEN__) -#define LPC13xx_SYSPLLCLKIN SYSOSCCLK -#elif LPC13xx_PLLCLK_SOURCE == SYSPLLCLKSEL_IRCOSC -#define LPC13xx_SYSPLLCLKIN IRCOSCCLK -#else -#error "invalid LPC13xx_PLLCLK_SOURCE clock source specified" -#endif - -/** - * @brief MSEL mask in SYSPLLCTRL register. - */ -#if (LPC13xx_SYSPLL_MUL >= 1) && (LPC13xx_SYSPLL_MUL <= 32) || \ - defined(__DOXYGEN__) -#define LPC13xx_SYSPLLCTRL_MSEL (LPC13xx_SYSPLL_MUL - 1) -#else -#error "LPC13xx_SYSPLL_MUL out of range (1...32)" -#endif - -/** - * @brief PSEL mask in SYSPLLCTRL register. - */ -#if (LPC13xx_SYSPLL_DIV == 2) || defined(__DOXYGEN__) -#define LPC13xx_SYSPLLCTRL_PSEL (0 << 5) -#elif LPC13xx_SYSPLL_DIV == 4 -#define LPC13xx_SYSPLLCTRL_PSEL (1 << 5) -#elif LPC13xx_SYSPLL_DIV == 8 -#define LPC13xx_SYSPLLCTRL_PSEL (2 << 5) -#elif LPC13xx_SYSPLL_DIV == 16 -#define LPC13xx_SYSPLLCTRL_PSEL (3 << 5) -#else -#error "invalid LPC13xx_SYSPLL_DIV value (2,4,8,16)" -#endif - -/** - * @brief CCP frequency. - */ -#define LPC13xx_SYSPLLCCO (LPC13xx_SYSPLLCLKIN * LPC13xx_SYSPLL_MUL * \ - LPC13xx_SYSPLL_DIV) - -#if (LPC13xx_SYSPLLCCO < 156000000) || (LPC13xx_SYSPLLCCO > 320000000) -#error "CCO frequency out of the acceptable range (156...320)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define LPC13xx_SYSPLLCLKOUT (LPC13xx_SYSPLLCCO / LPC13xx_SYSPLL_DIV) - -#if (LPC13xx_MAINCLK_SOURCE == SYSMAINCLKSEL_IRCOSC) || defined(__DOXYGEN__) -#define LPC13xx_MAINCLK IRCOSCCLK -#elif LPC13xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLIN -#define LPC13xx_MAINCLK LPC13xx_SYSPLLCLKIN -#elif LPC13xx_MAINCLK_SOURCE == SYSMAINCLKSEL_WDGOSC -#define LPC13xx_MAINCLK WDGOSCCLK -#elif LPC13xx_MAINCLK_SOURCE == SYSMAINCLKSEL_PLLOUT -#define LPC13xx_MAINCLK LPC13xx_SYSPLLCLKOUT -#else -#error "invalid LPC13xx_MAINCLK_SOURCE clock source specified" -#endif - -/** - * @brief AHB clock. - */ -#define LPC13xx_SYSCLK (LPC13xx_MAINCLK / LPC13xx_SYSABHCLK_DIV) -#if LPC13xx_SYSCLK > 72000000 -#error "AHB clock frequency out of the acceptable range (72MHz max)" -#endif - -/** - * @brief Flash wait states. - */ -#if (LPC13xx_SYSCLK <= 20000000) || defined(__DOXYGEN__) -#define LPC13xx_FLASHCFG_FLASHTIM 0 -#elif LPC13xx_SYSCLK <= 40000000 -#define LPC13xx_FLASHCFG_FLASHTIM 1 -#else -#define LPC13xx_FLASHCFG_FLASHTIM 2 -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void LPC13xx_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/pal_lld.c b/os/hal/platforms/LPC13xx/pal_lld.c deleted file mode 100644 index eb9012fd63..0000000000 --- a/os/hal/platforms/LPC13xx/pal_lld.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/pal_lld.c - * @brief LPC13xx GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ -/** - * @brief LPC13xx I/O ports configuration. - * @details GPIO unit registers initialization. - * - * @param[in] config the LPC13xx ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - LPC_GPIO0->DIR = config->P0.dir; - LPC_GPIO1->DIR = config->P1.dir; - LPC_GPIO2->DIR = config->P2.dir; - LPC_GPIO3->DIR = config->P3.dir; - LPC_GPIO0->DATA = config->P0.data; - LPC_GPIO1->DATA = config->P1.data; - LPC_GPIO2->DATA = config->P2.data; - LPC_GPIO3->DATA = config->P3.data; -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - port->DIR &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - palSetPort(port, PAL_WHOLE_PORT); - case PAL_MODE_OUTPUT_PUSHPULL: - port->DIR |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/pal_lld.h b/os/hal/platforms/LPC13xx/pal_lld.h deleted file mode 100644 index 3b64a0c385..0000000000 --- a/os/hal/platforms/LPC13xx/pal_lld.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/pal_lld.h - * @brief LPC13xx GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_INPUT_ANALOG -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief GPIO port setup info. - */ -typedef struct { - /** Initial value for FIO_PIN register.*/ - uint32_t data; - /** Initial value for FIO_DIR register.*/ - uint32_t dir; -} lpc13xx_gpio_setup_t; - -/** - * @brief GPIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - * @note The @p IOCON block is not configured, initially all pins have - * enabled pullups and are programmed as GPIO. It is responsibility - * of the various drivers to reprogram the pins in the proper mode. - * Pins that are not handled by any driver may be programmed in - * @p board.c. - */ -typedef struct { - /** @brief GPIO 0 setup data.*/ - lpc13xx_gpio_setup_t P0; - /** @brief GPIO 1 setup data.*/ - lpc13xx_gpio_setup_t P1; - /** @brief GPIO 2 setup data.*/ - lpc13xx_gpio_setup_t P2; - /** @brief GPIO 3 setup data.*/ - lpc13xx_gpio_setup_t P3; -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef LPC_GPIO_TypeDef *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief GPIO0 port identifier. - */ -#define IOPORT1 LPC_GPIO0 -#define GPIO0 LPC_GPIO0 - -/** - * @brief GPIO1 port identifier. - */ -#define IOPORT2 LPC_GPIO1 -#define GPIO1 LPC_GPIO1 - -/** - * @brief GPIO2 port identifier. - */ -#define IOPORT3 LPC_GPIO2 -#define GPIO2 LPC_GPIO2 - -/** - * @brief GPIO3 port identifier. - */ -#define IOPORT4 LPC_GPIO3 -#define GPIO3 LPC_GPIO3 - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->DATA) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->DATA) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->DATA = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) ((port)->MASKED_ACCESS[bits] = 0xFFFFFFFF) - -/** - * @brief Clears a bits mask on a I/O port. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) ((port)->MASKED_ACCESS[bits] = 0) - -/** - * @brief Reads a group of bits. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @return The group logical states. - * - * @notapi - */ -#define pal_lld_readgroup(port, mask, offset) \ - ((port)->MASKED_ACCESS[(mask) << (offset)]) - -/** - * @brief Writes a group of bits. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group width - * are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - ((port)->MASKED_ACCESS[(mask) << (offset)] = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note Programming an unknown or unsupported mode is silently ignored. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Writes a logical state on an output pad. - * @note This function is not meant to be invoked directly by the - * application code. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) \ - ((port)->MASKED_ACCESS[(mask) << (pad)] = (bit) << (pad)) - -/** - * @brief Sets a pad logical state to @p PAL_HIGH. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_setpad(port, pad) \ - ((port)->MASKED_ACCESS[1 << (pad)] = 1 << (pad)) - -/** - * @brief Clears a pad logical state to @p PAL_LOW. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_clearpad(port, pad) \ - ((port)->MASKED_ACCESS[1 << (pad)] = 0) - -#if !defined(__DOXYGEN__) -extern const PALConfig pal_default_config; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/platform.dox b/os/hal/platforms/LPC13xx/platform.dox deleted file mode 100644 index ff97fb0e07..0000000000 --- a/os/hal/platforms/LPC13xx/platform.dox +++ /dev/null @@ -1,140 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup LPC13xx LPC13xx Drivers - * @details This section describes all the supported drivers on the LPC13xx - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup LPC13xx_HAL LPC13xx Initialization Support - * @details The LPC13xx HAL support is responsible for system initialization. - * - * @section lpc13xx_hal_1 Supported HW resources - * - SYSCON. - * - Flash. - * . - * @section lpc13xx_hal_2 LPC13xx HAL driver implementation features - * - Clock tree initialization. - * - Clock source selection. - * - Flash controller initialization. - * - SYSTICK initialization based on current clock and kernel required rate. - * . - * @ingroup LPC13xx - */ - -/** - * @defgroup LPC13xx_GPT LPC13xx GPT Support - * @details The LPC13xx GPT driver uses the CTxxBy peripherals. - * - * @section lpc13xx_gpt_1 Supported HW resources - * - CT16B0. - * - CT16B1. - * - CT32B0. - * - CT32B1. - * . - * @section lpc13xx_gpt_2 LPC13xx GPT driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable CTxxBy interrupts priority level. - * . - * @ingroup LPC13xx - */ - -/** - * @defgroup LPC13xx_PAL LPC13xx PAL Support - * @details The LPC13xx PAL driver uses the GPIO peripherals. - * - * @section lpc13xx_pal_1 Supported HW resources - * - GPIO0. - * - GPIO1. - * - GPIO2. - * - GPIO3. - * . - * @section lpc13xx_pal_2 LPC13xx PAL driver implementation features - * - 12 bits wide ports. - * - Atomic set/reset functions. - * - Atomic set+reset function (atomic bus operations). - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section lpc13xx_pal_3 Supported PAL setup modes - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section lpc13xx_pal_4 Suboptimal behavior - * Some GPIO features are less than optimal: - * - Pad/port toggling operations are not atomic. - * - Pull-up and Pull-down resistors cannot be programmed through the PAL - * driver and must be programmed separately using the IOCON peripheral. - * - Reading of the output latch for pads programmed as input is not possible, - * the input pin value is returned instead. - * . - * @ingroup LPC13xx - */ - -/** - * @defgroup LPC13xx_SERIAL LPC13xx Serial Support - * @details The LPC13xx Serial driver uses the UART peripheral in a - * buffered, interrupt driven, implementation. The serial driver - * also takes advantage of the LPC13xx UARTs deep hardware buffers. - * - * @section lpc13xx_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - UART. - * . - * @section lpc13xx_serial_2 LPC13xx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Fully interrupt driven. - * - Programmable priority level. - * - Takes advantage of the input and output FIFOs. - * . - * @ingroup LPC13xx - */ - -/** - * @defgroup LPC13xx_SPI LPC13xx SPI Support - * @details The SPI driver supports the LPC13xx SSP peripherals in an interrupt - * driven implementation. - * @note Being the SPI a fast peripheral, much care must be taken to - * not saturate the CPU bandwidth with an excessive IRQ rate. The - * maximum transfer bit rate is likely limited by the IRQ - * handling. - * - * @section lpc13xx_spi_1 Supported HW resources - * - SSP0. - * - SSP1 (where present). - * . - * @section lpc13xx_spi_2 LPC13xx SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SSP can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable interrupt priority levels for each SSP. - * . - * @ingroup LPC13xx - */ diff --git a/os/hal/platforms/LPC13xx/platform.mk b/os/hal/platforms/LPC13xx/platform.mk deleted file mode 100644 index 1171af7d7b..0000000000 --- a/os/hal/platforms/LPC13xx/platform.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the LPC13xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/LPC13xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC13xx/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC13xx/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC13xx/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC13xx/spi_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/LPC13xx diff --git a/os/hal/platforms/LPC13xx/serial_lld.c b/os/hal/platforms/LPC13xx/serial_lld.c deleted file mode 100644 index d5849cfd29..0000000000 --- a/os/hal/platforms/LPC13xx/serial_lld.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/serial_lld.c - * @brief LPC13xx low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC13xx_SERIAL_USE_UART0 || defined(__DOXYGEN__) -/** @brief UART0 serial driver identifier.*/ -SerialDriver SD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - LCR_WL8 | LCR_STOP1 | LCR_NOPARITY, - FCR_TRIGGER0 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief UART initialization. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] config the architecture-dependent serial driver configuration - */ -static void uart_init(SerialDriver *sdp, const SerialConfig *config) { - LPC_UART_TypeDef *u = sdp->uart; - - uint32_t div = LPC13xx_SERIAL_UART0_PCLK / (config->sc_speed << 4); - u->LCR = config->sc_lcr | LCR_DLAB; - u->DLL = div; - u->DLM = div >> 8; - u->LCR = config->sc_lcr; - u->FCR = FCR_ENABLE | FCR_RXRESET | FCR_TXRESET | config->sc_fcr; - u->ACR = 0; - u->FDR = 0x10; - u->TER = TER_ENABLE; - u->IER = IER_RBR | IER_STATUS; -} - -/** - * @brief UART de-initialization. - * - * @param[in] u pointer to an UART I/O block - */ -static void uart_deinit(LPC_UART_TypeDef *u) { - - u->LCR = LCR_DLAB; - u->DLL = 1; - u->DLM = 0; - u->LCR = 0; - u->FDR = 0x10; - u->IER = 0; - u->FCR = FCR_RXRESET | FCR_TXRESET; - u->ACR = 0; - u->TER = TER_ENABLE; -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] err UART LSR register value - */ -static void set_error(SerialDriver *sdp, IOREG32 err) { - flagsmask_t sts = 0; - - if (err & LSR_OVERRUN) - sts |= SD_OVERRUN_ERROR; - if (err & LSR_PARITY) - sts |= SD_PARITY_ERROR; - if (err & LSR_FRAMING) - sts |= SD_FRAMING_ERROR; - if (err & LSR_BREAK) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Common IRQ handler. - * @note Tries hard to clear all the pending interrupt sources, we don't - * want to go through the whole ISR and have another interrupt soon - * after. - * - * @param[in] u pointer to an UART I/O block - * @param[in] sdp communication channel associated to the UART - */ -static void serve_interrupt(SerialDriver *sdp) { - LPC_UART_TypeDef *u = sdp->uart; - - while (TRUE) { - switch (u->IIR & IIR_SRC_MASK) { - case IIR_SRC_NONE: - return; - case IIR_SRC_ERROR: - set_error(sdp, u->LSR); - break; - case IIR_SRC_TIMEOUT: - case IIR_SRC_RX: - chSysLockFromIsr(); - if (chIQIsEmptyI(&sdp->iqueue)) - chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE); - chSysUnlockFromIsr(); - while (u->LSR & LSR_RBR_FULL) { - chSysLockFromIsr(); - if (chIQPutI(&sdp->iqueue, u->RBR) < Q_OK) - chnAddFlagsI(sdp, SD_OVERRUN_ERROR); - chSysUnlockFromIsr(); - } - break; - case IIR_SRC_TX: - { - int i = LPC13xx_SERIAL_FIFO_PRELOAD; - do { - msg_t b; - - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - chSysUnlockFromIsr(); - if (b < Q_OK) { - u->IER &= ~IER_THRE; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - chSysUnlockFromIsr(); - break; - } - u->THR = b; - } while (--i); - } - break; - default: - (void) u->THR; - (void) u->RBR; - } - } -} - -/** - * @brief Attempts a TX FIFO preload. - */ -static void preload(SerialDriver *sdp) { - LPC_UART_TypeDef *u = sdp->uart; - - if (u->LSR & LSR_THRE) { - int i = LPC13xx_SERIAL_FIFO_PRELOAD; - do { - msg_t b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - return; - } - u->THR = b; - } while (--i); - } - u->IER |= IER_THRE; -} - -/** - * @brief Driver SD1 output notification. - */ -#if LPC13xx_SERIAL_USE_UART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - preload(&SD1); -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief UART0 IRQ handler. - * - * @isr - */ -#if LPC13xx_SERIAL_USE_UART0 || defined(__DOXYGEN__) -CH_IRQ_HANDLER(VectorF8) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if LPC13xx_SERIAL_USE_UART0 - sdObjectInit(&SD1, NULL, notify1); - SD1.uart = LPC_UART; - LPC_IOCON->PIO1_6 = 0xC1; /* RDX without resistors. */ - LPC_IOCON->PIO1_7 = 0xC1; /* TDX without resistors. */ -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if LPC13xx_SERIAL_USE_UART0 - if (&SD1 == sdp) { - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 12); - LPC_SYSCON->UARTCLKDIV = LPC13xx_SERIAL_UART0CLKDIV; - nvicEnableVector(UART_IRQn, - CORTEX_PRIORITY_MASK(LPC13xx_SERIAL_UART0_IRQ_PRIORITY)); - } -#endif - } - uart_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the UART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - uart_deinit(sdp->uart); -#if LPC13xx_SERIAL_USE_UART0 - if (&SD1 == sdp) { - LPC_SYSCON->UARTCLKDIV = 0; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 12); - nvicDisableVector(UART_IRQn); - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/serial_lld.h b/os/hal/platforms/LPC13xx/serial_lld.h deleted file mode 100644 index d1daf4d58d..0000000000 --- a/os/hal/platforms/LPC13xx/serial_lld.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/serial_lld.h - * @brief LPC13xx low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define IIR_SRC_MASK 0x0F -#define IIR_SRC_NONE 0x01 -#define IIR_SRC_MODEM 0x00 -#define IIR_SRC_TX 0x02 -#define IIR_SRC_RX 0x04 -#define IIR_SRC_ERROR 0x06 -#define IIR_SRC_TIMEOUT 0x0C - -#define IER_RBR 1 -#define IER_THRE 2 -#define IER_STATUS 4 - -#define LCR_WL5 0 -#define LCR_WL6 1 -#define LCR_WL7 2 -#define LCR_WL8 3 -#define LCR_STOP1 0 -#define LCR_STOP2 4 -#define LCR_NOPARITY 0 -#define LCR_PARITYODD 0x08 -#define LCR_PARITYEVEN 0x18 -#define LCR_PARITYONE 0x28 -#define LCR_PARITYZERO 0x38 -#define LCR_BREAK_ON 0x40 -#define LCR_DLAB 0x80 - -#define FCR_ENABLE 1 -#define FCR_RXRESET 2 -#define FCR_TXRESET 4 -#define FCR_TRIGGER0 0 -#define FCR_TRIGGER1 0x40 -#define FCR_TRIGGER2 0x80 -#define FCR_TRIGGER3 0xC0 - -#define LSR_RBR_FULL 1 -#define LSR_OVERRUN 2 -#define LSR_PARITY 4 -#define LSR_FRAMING 8 -#define LSR_BREAK 0x10 -#define LSR_THRE 0x20 -#define LSR_TEMT 0x40 -#define LSR_RXFE 0x80 - -#define TER_ENABLE 0x80 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief UART0 driver enable switch. - * @details If set to @p TRUE the support for UART0 is included. - * @note The default is @p TRUE . - */ -#if !defined(LPC13xx_SERIAL_USE_UART0) || defined(__DOXYGEN__) -#define LPC13xx_SERIAL_USE_UART0 TRUE -#endif - -/** - * @brief FIFO preload parameter. - * @details Configuration parameter, this values defines how many bytes are - * preloaded in the HW transmit FIFO for each interrupt, the maximum - * value is 16 the minimum is 1. - * @note An high value reduces the number of interrupts generated but can - * also increase the worst case interrupt response time because the - * preload loops. - */ -#if !defined(LPC13xx_SERIAL_FIFO_PRELOAD) || defined(__DOXYGEN__) -#define LPC13xx_SERIAL_FIFO_PRELOAD 16 -#endif - -/** - * @brief UART0 PCLK divider. - */ -#if !defined(LPC13xx_SERIAL_UART0CLKDIV) || defined(__DOXYGEN__) -#define LPC13xx_SERIAL_UART0CLKDIV 1 -#endif - -/** - * @brief UART0 interrupt priority level setting. - */ -#if !defined(LPC13xx_SERIAL_UART0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_SERIAL_UART0_IRQ_PRIORITY 3 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC13xx_SERIAL_UART0CLKDIV < 1) || (LPC11xx_SERIAL_UART0CLKDIV > 255) -#error "invalid LPC13xx_SERIAL_UART0CLKDIV setting" -#endif - -#if (LPC13xx_SERIAL_FIFO_PRELOAD < 1) || (LPC13xx_SERIAL_FIFO_PRELOAD > 16) -#error "invalid LPC13xx_SERIAL_FIFO_PRELOAD setting" -#endif - -/** - * @brief UART0 clock. - */ -#define LPC13xx_SERIAL_UART0_PCLK \ - (LPC13xx_MAINCLK / LPC13xx_SERIAL_UART0CLKDIV) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief LPC13xx Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t sc_speed; - /** - * @brief Initialization value for the LCR register. - */ - uint32_t sc_lcr; - /** - * @brief Initialization value for the FCR register. - */ - uint32_t sc_fcr; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the USART registers block.*/ \ - LPC_UART_TypeDef *uart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC13xx_SERIAL_USE_UART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/spi_lld.c b/os/hal/platforms/LPC13xx/spi_lld.c deleted file mode 100644 index b6950ff398..0000000000 --- a/os/hal/platforms/LPC13xx/spi_lld.c +++ /dev/null @@ -1,408 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/spi_lld.c - * @brief LPC13xx low level SPI driver code. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC13xx_SPI_USE_SSP0 || defined(__DOXYGEN__) -/** @brief SPI1 driver identifier.*/ -SPIDriver SPID1; -#endif - -#if LPC13xx_SPI_USE_SSP1 || defined(__DOXYGEN__) -/** @brief SPI2 driver identifier.*/ -SPIDriver SPID2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Preloads the transmit FIFO. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void ssp_fifo_preload(SPIDriver *spip) { - LPC_SSP_TypeDef *ssp = spip->ssp; - uint32_t n = spip->txcnt > LPC13xx_SSP_FIFO_DEPTH ? - LPC13xx_SSP_FIFO_DEPTH : spip->txcnt; - - while(((ssp->SR & SR_TNF) != 0) && (n > 0)) { - if (spip->txptr != NULL) { - if ((ssp->CR0 & CR0_DSSMASK) > CR0_DSS8BIT) { - const uint16_t *p = spip->txptr; - ssp->DR = *p++; - spip->txptr = p; - } - else { - const uint8_t *p = spip->txptr; - ssp->DR = *p++; - spip->txptr = p; - } - } - else - ssp->DR = 0xFFFFFFFF; - n--; - spip->txcnt--; - } -} - -/** - * @brief Common IRQ handler. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void spi_serve_interrupt(SPIDriver *spip) { - LPC_SSP_TypeDef *ssp = spip->ssp; - - if ((ssp->MIS & MIS_ROR) != 0) { - /* The overflow condition should never happen because priority is given - to receive but a hook macro is provided anyway...*/ - LPC13xx_SPI_SSP_ERROR_HOOK(spip); - } - ssp->ICR = ICR_RT | ICR_ROR; - while ((ssp->SR & SR_RNE) != 0) { - if (spip->rxptr != NULL) { - if ((ssp->CR0 & CR0_DSSMASK) > CR0_DSS8BIT) { - uint16_t *p = spip->rxptr; - *p++ = ssp->DR; - spip->rxptr = p; - } - else { - uint8_t *p = spip->rxptr; - *p++ = ssp->DR; - spip->rxptr = p; - } - } - else - (void)ssp->DR; - if (--spip->rxcnt == 0) { - chDbgAssert(spip->txcnt == 0, - "spi_serve_interrupt(), #1", "counter out of synch"); - /* Stops the IRQ sources.*/ - ssp->IMSC = 0; - /* Portable SPI ISR code defined in the high level driver, note, it is - a macro.*/ - _spi_isr_code(spip); - return; - } - } - ssp_fifo_preload(spip); - if (spip->txcnt == 0) - ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_RX; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC13xx_SPI_USE_SSP0 || defined(__DOXYGEN__) -/** - * @brief SSP0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(VectorF4) { - - CH_IRQ_PROLOGUE(); - - spi_serve_interrupt(&SPID1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if LPC13xx_SPI_USE_SSP1 || defined(__DOXYGEN__) -/** - * @brief SSP1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(Vector124) { - - CH_IRQ_PROLOGUE(); - - spi_serve_interrupt(&SPID2); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - -#if LPC13xx_SPI_USE_SSP0 - spiObjectInit(&SPID1); - SPID1.ssp = LPC_SSP0; - LPC_IOCON->SCK_LOC = LPC13xx_SPI_SCK0_SELECTOR; -#if LPC13xx_SPI_SCK0_SELECTOR == SCK0_IS_PIO0_10 - LPC_IOCON->SWCLK_PIO0_10 = 0xC2; /* SCK0 without resistors. */ -#elif LPC13xx_SPI_SCK0_SELECTOR == SCK0_IS_PIO2_11 - LPC_IOCON->PIO2_11 = 0xC1; /* SCK0 without resistors. */ -#else /* LPC13xx_SPI_SCK0_SELECTOR == SCK0_IS_PIO0_6 */ - LPC_IOCON->PIO0_6 = 0xC2; /* SCK0 without resistors. */ -#endif - LPC_IOCON->PIO0_8 = 0xC1; /* MISO0 without resistors. */ - LPC_IOCON->PIO0_9 = 0xC1; /* MOSI0 without resistors. */ -#endif /* LPC13xx_SPI_USE_SSP0 */ - -#if LPC13xx_SPI_USE_SSP1 - spiObjectInit(&SPID2); - SPID2.ssp = LPC_SSP1; - LPC_IOCON->PIO2_1 = 0xC2; /* SCK1 without resistors. */ - LPC_IOCON->PIO2_2 = 0xC2; /* MISO1 without resistors. */ - LPC_IOCON->PIO2_3 = 0xC2; /* MOSI1 without resistors. */ -#endif /* LPC13xx_SPI_USE_SSP0 */ -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - if (spip->state == SPI_STOP) { - /* Clock activation.*/ -#if LPC13xx_SPI_USE_SSP0 - if (&SPID1 == spip) { - LPC_SYSCON->SSP0CLKDIV = LPC13xx_SPI_SSP0CLKDIV; - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11); - LPC_SYSCON->PRESETCTRL |= 1; - nvicEnableVector(SSP0_IRQn, - CORTEX_PRIORITY_MASK(LPC13xx_SPI_SSP0_IRQ_PRIORITY)); - } -#endif -#if LPC13xx_SPI_USE_SSP1 - if (&SPID2 == spip) { - LPC_SYSCON->SSP1CLKDIV = LPC13xx_SPI_SSP1CLKDIV; - LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18); - LPC_SYSCON->PRESETCTRL |= 4; - nvicEnableVector(SSP1_IRQn, - CORTEX_PRIORITY_MASK(LPC13xx_SPI_SSP1_IRQ_PRIORITY)); - } -#endif - } - /* Configuration.*/ - spip->ssp->CR1 = 0; - spip->ssp->ICR = ICR_RT | ICR_ROR; - spip->ssp->CR0 = spip->config->cr0; - spip->ssp->CPSR = spip->config->cpsr; - spip->ssp->CR1 = CR1_SSE; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - if (spip->state != SPI_STOP) { - spip->ssp->CR1 = 0; - spip->ssp->CR0 = 0; - spip->ssp->CPSR = 0; -#if LPC13xx_SPI_USE_SSP0 - if (&SPID1 == spip) { - LPC_SYSCON->PRESETCTRL &= ~1; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 11); - LPC_SYSCON->SSP0CLKDIV = 0; - nvicDisableVector(SSP0_IRQn); - } -#endif -#if LPC13xx_SPI_USE_SSP1 - if (&SPID2 == spip) { - LPC_SYSCON->PRESETCTRL &= ~4; - LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 18); - LPC_SYSCON->SSP1CLKDIV = 0; - nvicDisableVector(SSP1_IRQn); - } -#endif - } -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This function transmits a series of idle words on the SPI bus and - * ignores the received data. This function can be invoked even - * when a slave select signal has not been yet asserted. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - spip->rxptr = NULL; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This asynchronous function starts a simultaneous transmit/receive - * operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Sends data over the SPI bus. - * @details This asynchronous function starts a transmit operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - spip->rxptr = NULL; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Receives data from the SPI bus. - * @details This asynchronous function starts a receive operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) { - - spip->ssp->DR = (uint32_t)frame; - while ((spip->ssp->SR & SR_RNE) == 0) - ; - return (uint16_t)spip->ssp->DR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/spi_lld.h b/os/hal/platforms/LPC13xx/spi_lld.h deleted file mode 100644 index 2d54b83acc..0000000000 --- a/os/hal/platforms/LPC13xx/spi_lld.h +++ /dev/null @@ -1,343 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC13xx/spi_lld.h - * @brief LPC13xx low level SPI driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Hardware FIFO depth. - */ -#define LPC13xx_SSP_FIFO_DEPTH 8 - -#define CR0_DSSMASK 0x0F -#define CR0_DSS4BIT 3 -#define CR0_DSS5BIT 4 -#define CR0_DSS6BIT 5 -#define CR0_DSS7BIT 6 -#define CR0_DSS8BIT 7 -#define CR0_DSS9BIT 8 -#define CR0_DSS10BIT 9 -#define CR0_DSS11BIT 0xA -#define CR0_DSS12BIT 0xB -#define CR0_DSS13BIT 0xC -#define CR0_DSS14BIT 0xD -#define CR0_DSS15BIT 0xE -#define CR0_DSS16BIT 0xF -#define CR0_FRFSPI 0 -#define CR0_FRFSSI 0x10 -#define CR0_FRFMW 0x20 -#define CR0_CPOL 0x40 -#define CR0_CPHA 0x80 -#define CR0_CLOCKRATE(n) ((n) << 8) - -#define CR1_LBM 1 -#define CR1_SSE 2 -#define CR1_MS 4 -#define CR1_SOD 8 - -#define SR_TFE 1 -#define SR_TNF 2 -#define SR_RNE 4 -#define SR_RFF 8 -#define SR_BSY 16 - -#define IMSC_ROR 1 -#define IMSC_RT 2 -#define IMSC_RX 4 -#define IMSC_TX 8 - -#define RIS_ROR 1 -#define RIS_RT 2 -#define RIS_RX 4 -#define RIS_TX 8 - -#define MIS_ROR 1 -#define MIS_RT 2 -#define MIS_RX 4 -#define MIS_TX 8 - -#define ICR_ROR 1 -#define ICR_RT 2 - -/** - * @brief SCK0 signal assigned to pin PIO0_10. - */ -#define SCK0_IS_PIO0_10 0 - -/** - * @brief SCK0 signal assigned to pin PIO2_11. - */ -#define SCK0_IS_PIO2_11 1 - -/** - * @brief SCK0 signal assigned to pin PIO0_6. - */ -#define SCK0_IS_PIO0_6 2 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief SPI1 driver enable switch. - * @details If set to @p TRUE the support for device SSP0 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC13xx_SPI_USE_SSP0) || defined(__DOXYGEN__) -#define LPC13xx_SPI_USE_SSP0 TRUE -#endif - -/** - * @brief SPI2 driver enable switch. - * @details If set to @p TRUE the support for device SSP1 is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC13xx_SPI_USE_SSP1) || defined(__DOXYGEN__) -#define LPC13xx_SPI_USE_SSP1 FALSE -#endif - -/** - * @brief SSP0 PCLK divider. - */ -#if !defined(LPC13xx_SPI_SSP0CLKDIV) || defined(__DOXYGEN__) -#define LPC13xx_SPI_SSP0CLKDIV 1 -#endif - -/** - * @brief SSP1 PCLK divider. - */ -#if !defined(LPC13xx_SPI_SSP1CLKDIV) || defined(__DOXYGEN__) -#define LPC13xx_SPI_SSP1CLKDIV 1 -#endif - -/** - * @brief SPI0 interrupt priority level setting. - */ -#if !defined(LPC13xx_SPI_SSP0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_SPI_SSP0_IRQ_PRIORITY 5 -#endif - -/** - * @brief SPI1 interrupt priority level setting. - */ -#if !defined(LPC13xx_SPI_SSP1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC13xx_SPI_SSP1_IRQ_PRIORITY 5 -#endif - -/** - * @brief Overflow error hook. - * @details The default action is to stop the system. - */ -#if !defined(LPC13xx_SPI_SSP_ERROR_HOOK) || defined(__DOXYGEN__) -#define LPC13xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#endif - -/** - * @brief SCK0 signal selector. - */ -#if !defined(LPC13xx_SPI_SCK0_SELECTOR) || defined(__DOXYGEN__) -#define LPC13xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC13xx_SPI_SSP0CLKDIV < 1) || (LPC13xx_SPI_SSP0CLKDIV > 255) -#error "invalid LPC13xx_SPI_SSP0CLKDIV setting" -#endif - -#if (LPC13xx_SPI_SSP1CLKDIV < 1) || (LPC13xx_SPI_SSP1CLKDIV > 255) -#error "invalid LPC13xx_SPI_SSP1CLKDIV setting" -#endif - -#if !LPC13xx_SPI_USE_SSP0 && !LPC13xx_SPI_USE_SSP1 -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -#if (LPC13xx_SPI_SCK0_SELECTOR != SCK0_IS_PIO0_10) && \ - (LPC13xx_SPI_SCK0_SELECTOR != SCK0_IS_PIO2_11) && \ - (LPC13xx_SPI_SCK0_SELECTOR != SCK0_IS_PIO0_6) -#error "invalid pin assigned to SCK0 signal" -#endif - -/** - * @brief SSP0 clock. - */ -#define LPC13xx_SPI_SSP0_PCLK \ - (LPC13xx_MAINCLK / LPC13xx_SPI_SSP0CLKDIV) - -/** - * @brief SSP1 clock. - */ -#define LPC13xx_SPI_SSP1_PCLK \ - (LPC13xx_MAINCLK / LPC13xx_SPI_SSP1CLKDIV) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SSP CR0 initialization data. - */ - uint16_t cr0; - /** - * @brief SSP CPSR initialization data. - */ - uint32_t cpsr; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SSP registers block. - */ - LPC_SSP_TypeDef *ssp; - /** - * @brief Number of bytes yet to be received. - */ - uint32_t rxcnt; - /** - * @brief Receive pointer or @p NULL. - */ - void *rxptr; - /** - * @brief Number of bytes yet to be transmitted. - */ - uint32_t txcnt; - /** - * @brief Transmit pointer or @p NULL. - */ - const void *txptr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC13xx_SPI_USE_SSP0 && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#if LPC13xx_SPI_USE_SSP1 && !defined(__DOXYGEN__) -extern SPIDriver SPID2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC13xx/system_LPC13xx.h b/os/hal/platforms/LPC13xx/system_LPC13xx.h deleted file mode 100644 index 812f12365e..0000000000 --- a/os/hal/platforms/LPC13xx/system_LPC13xx.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************//** - * @file system_LPC13xx.h - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File - * for the NXP LPC13xx Device Series - * @version V1.10 - * @date 24. November 2010 - * - * @note - * Copyright (C) 2009-2010 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - - -#ifndef __SYSTEM_LPC13xx_H -#define __SYSTEM_LPC13xx_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - - -/** - * Initialize the system - * - * @param none - * @return none - * - * @brief Setup the microcontroller system. - * Initialize the System and update the SystemCoreClock variable. - */ -extern void SystemInit (void); - -/** - * Update SystemCoreClock variable - * - * @param none - * @return none - * - * @brief Updates the SystemCoreClock with current core Clock - * retrieved from cpu registers. - */ -extern void SystemCoreClockUpdate (void); - -#ifdef __cplusplus -} -#endif - -#endif /* __SYSTEM_LPC13xx_H */ diff --git a/os/hal/platforms/LPC214x/hal_lld.c b/os/hal/platforms/LPC214x/hal_lld.c deleted file mode 100644 index d967c3fc09..0000000000 --- a/os/hal/platforms/LPC214x/hal_lld.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/hal_lld.c - * @brief LPC214x HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/* - * Non-vectored IRQs handler, the default action can be overridden by - * redefining the @p LPC214x_NON_VECTORED_IRQ_HOOK() hook macro. - */ -static CH_IRQ_HANDLER(irq_handler) { - - CH_IRQ_PROLOGUE(); - - LPC214x_NON_VECTORED_IRQ_HOOK(); - - VICVectAddr = 0; - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - vic_init(); - VICDefVectAddr = (IOREG32)irq_handler; - -} - -/** - * @brief LPC214x clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function must be invoked only after the system reset. - * - * @special - */ -void lpc214x_clock_init(void) { - - /* - * All peripherals clock disabled by default in order to save power. - */ - PCONP = PCRTC | PCTIM0; - - /* - * MAM setup. - */ - MAMTIM = 0x3; /* 3 cycles for flash accesses. */ - MAMCR = 0x2; /* MAM fully enabled. */ - - /* - * PLL setup for Fosc=12MHz and CCLK=48MHz. - * P=2 M=3. - */ - PLL *pll = PLL0Base; - pll->PLL_CFG = 0x23; /* P and M values. */ - pll->PLL_CON = 0x1; /* Enables the PLL 0. */ - pll->PLL_FEED = 0xAA; - pll->PLL_FEED = 0x55; - while (!(pll->PLL_STAT & 0x400)) - ; /* Wait for PLL lock. */ - - pll->PLL_CON = 0x3; /* Connects the PLL. */ - pll->PLL_FEED = 0xAA; - pll->PLL_FEED = 0x55; - - /* - * VPB setup. - * PCLK = CCLK / 4. - */ - VPBDIV = VPD_D4; -} - -/** @} */ diff --git a/os/hal/platforms/LPC214x/hal_lld.h b/os/hal/platforms/LPC214x/hal_lld.h deleted file mode 100644 index ed1c8c05c6..0000000000 --- a/os/hal/platforms/LPC214x/hal_lld.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/hal_lld.h - * @brief LPC214x HAL subsystem low level driver header. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "lpc214x.h" -#include "vic.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "LPC214x" - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Default action for the non vectored IRQ handler, nothing. - */ -#if !defined(LPC214x_NON_VECTORED_IRQ_HOOK) || defined(__DOXYGEN__) -#define LPC214x_NON_VECTORED_IRQ_HOOK() -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void lpc214x_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/lpc214x.h b/os/hal/platforms/LPC214x/lpc214x.h deleted file mode 100644 index 9855c0bcb5..0000000000 --- a/os/hal/platforms/LPC214x/lpc214x.h +++ /dev/null @@ -1,527 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file lpc214x.h - * @brief LPC214x register definitions. - */ - -#ifndef _LPC214X_H_ -#define _LPC214X_H_ - -typedef volatile uint8_t IOREG8; -typedef volatile uint16_t IOREG16; -typedef volatile uint32_t IOREG32; - -/* - * System. - */ -#define MEMMAP (*((IOREG32 *)0xE01FC040)) -#define PCON (*((IOREG32 *)0xE01FC0C0)) -#define PCONP (*((IOREG32 *)0xE01FC0C4)) -#define VPBDIV (*((IOREG32 *)0xE01FC100)) -#define EXTINT (*((IOREG32 *)0xE01FC140)) -#define INTWAKE (*((IOREG32 *)0xE01FC144)) -#define EXTMODE (*((IOREG32 *)0xE01FC148)) -#define EXTPOLAR (*((IOREG32 *)0xE01FC14C)) -#define RSID (*((IOREG32 *)0xE01FC180)) -#define CSPR (*((IOREG32 *)0xE01FC184)) -#define SCS (*((IOREG32 *)0xE01FC1A0)) - -#define VPD_D4 0 -#define VPD_D1 1 -#define VPD_D2 2 -#define VPD_RESERVED 3 - -#define PCTIM0 (1 << 1) -#define PCTIM1 (1 << 2) -#define PCUART0 (1 << 3) -#define PCUART1 (1 << 4) -#define PCPWM0 (1 << 5) -#define PCI2C0 (1 << 7) -#define PCSPI0 (1 << 8) -#define PCRTC (1 << 9) -#define PCSPI1 (1 << 10) -#define PCAD0 (1 << 12) -#define PCI2C1 (1 << 19) -#define PCAD1 (1 << 20) -#define PCUSB (1 << 31) -#define PCALL (PCTIM0 | PCTIM1 | PCUART0 | PCUART1 | \ - PCPWM0 | PCI2C0 | PCSPI0 | PCRTC | PCSPI1 | \ - PCAD0 | PCI2C1 | PCAD1 | PCUSB) - -#define EINT0 1 -#define EINT1 2 -#define EINT2 4 -#define EINT3 8 - -#define EXTWAKE0 1 -#define EXTWAKE1 2 -#define EXTWAKE2 4 -#define EXTWAKE3 8 -#define USBWAKE 0x20 -#define BODWAKE 0x4000 -#define RTCWAKE 0x8000 - -#define EXTMODE0 1 -#define EXTMODE1 2 -#define EXTMODE2 4 -#define EXTMODE3 8 - -#define EXTPOLAR0 1 -#define EXTPOLAR1 2 -#define EXTPOLAR2 4 -#define EXTPOLAR3 8 - -typedef struct { - IOREG32 PLL_CON; - IOREG32 PLL_CFG; - IOREG32 PLL_STAT; - IOREG32 PLL_FEED; -} PLL; - -#define PLL0Base ((PLL *)0xE01FC080) -#define PLL1Base ((PLL *)0xE01FC0A0) -#define PLL0CON (PLL0Base->PLL_CON) -#define PLL0CFG (PLL0Base->PLL_CFG) -#define PLL0STAT (PLL0Base->PLL_STAT) -#define PLL0FEED (PLL0Base->PLL_FEED) -#define PLL1CON (PLL1Base->PLL_CON) -#define PLL1CFG (PLL1Base->PLL_CFG) -#define PLL1STAT (PLL1Base->PLL_STAT) -#define PLL1FEED (PLL1Base->PLL_FEED) - -/* - * Pins. - */ -typedef struct { - IOREG32 PS_SEL0; - IOREG32 PS_SEL1; - IOREG32 _dummy[3]; - IOREG32 PS_SEL2; -} PS; - -#define PSBase ((PS *)0xE002C000) -#define PINSEL0 (PSBase->PS_SEL0) -#define PINSEL1 (PSBase->PS_SEL1) -#define PINSEL2 (PSBase->PS_SEL2) - -/* - * VIC - */ -#define SOURCE_WDT 0 -#define SOURCE_ARMCore0 2 -#define SOURCE_ARMCore1 3 -#define SOURCE_Timer0 4 -#define SOURCE_Timer1 5 -#define SOURCE_UART0 6 -#define SOURCE_UART1 7 -#define SOURCE_PWM0 8 -#define SOURCE_I2C0 9 -#define SOURCE_SPI0 10 -#define SOURCE_SPI1 11 -#define SOURCE_PLL 12 -#define SOURCE_RTC 13 -#define SOURCE_EINT0 14 -#define SOURCE_EINT1 15 -#define SOURCE_EINT2 16 -#define SOURCE_EINT3 17 -#define SOURCE_ADC0 18 -#define SOURCE_I2C1 19 -#define SOURCE_BOD 20 -#define SOURCE_ADC1 21 -#define SOURCE_USB 22 - -#define INTMASK(n) (1 << (n)) -#define ALLINTMASK (INTMASK(SOURCE_WDT) | INTMASK(SOURCE_ARMCore0) | \ - INTMASK(SOURCE_ARMCore1) | INTMASK(SOURCE_Timer0) | \ - INTMASK(SOURCE_Timer1) | INTMASK(SOURCE_UART0) | \ - INTMASK(SOURCE_UART1) | INTMASK(SOURCE_PWM0) | \ - INTMASK(SOURCE_I2C0) | INTMASK(SOURCE_SPI0) | \ - INTMASK(SOURCE_SPI1) | INTMASK(SOURCE_PLL) | \ - INTMASK(SOURCE_RTC) | INTMASK(SOURCE_EINT0) | \ - INTMASK(SOURCE_EINT1) | INTMASK(SOURCE_EINT2) | \ - INTMASK(SOURCE_EINT3) | INTMASK(SOURCE_ADC0) | \ - INTMASK(SOURCE_I2C1) | INTMASK(SOURCE_BOD) | \ - INTMASK(SOURCE_ADC1) | INTMASK(SOURCE_USB)) - -typedef struct { - IOREG32 VIC_IRQStatus; - IOREG32 VIC_FIQStatus; - IOREG32 VIC_RawIntr; - IOREG32 VIC_IntSelect; - IOREG32 VIC_IntEnable; - IOREG32 VIC_IntEnClear; - IOREG32 VIC_SoftInt; - IOREG32 VIC_SoftIntClear; - IOREG32 VIC_Protection; - IOREG32 unused1[3]; - IOREG32 VIC_VectAddr; - IOREG32 VIC_DefVectAddr; - IOREG32 unused2[50]; - IOREG32 VIC_VectAddrs[16]; - IOREG32 unused3[48]; - IOREG32 VIC_VectCntls[16]; -} VIC; - -#define VICBase ((VIC *)0xFFFFF000) -#define VICVectorsBase ((IOREG32 *)0xFFFFF100) -#define VICControlsBase ((IOREG32 *)0xFFFFF200) - -#define VICIRQStatus (VICBase->VIC_IRQStatus) -#define VICFIQStatus (VICBase->VIC_FIQStatus) -#define VICRawIntr (VICBase->VIC_RawIntr) -#define VICIntSelect (VICBase->VIC_IntSelect) -#define VICIntEnable (VICBase->VIC_IntEnable) -#define VICIntEnClear (VICBase->VIC_IntEnClear) -#define VICSoftInt (VICBase->VIC_SoftInt) -#define VICSoftIntClear (VICBase->VIC_SoftIntClear) -#define VICProtection (VICBase->VIC_Protection) -#define VICVectAddr (VICBase->VIC_VectAddr) -#define VICDefVectAddr (VICBase->VIC_DefVectAddr) - -#define VICVectAddrs(n) (VICBase->VIC_VectAddrs[n]) -#define VICVectCntls(n) (VICBase->VIC_VectCntls[n]) - -/* - * MAM. - */ -typedef struct { - IOREG32 MAM_Control; - IOREG32 MAM_Timing; -} MAM; - -#define MAMBase ((MAM *)0xE01FC000) -#define MAMCR (MAMBase->MAM_Control) -#define MAMTIM (MAMBase->MAM_Timing) - -/* - * GPIO - FIO. - */ -typedef struct { - IOREG32 IO_PIN; - IOREG32 IO_SET; - IOREG32 IO_DIR; - IOREG32 IO_CLR; -} GPIO; - -#define GPIO0Base ((GPIO *)0xE0028000) -#define IO0PIN (GPIO0Base->IO_PIN) -#define IO0SET (GPIO0Base->IO_SET) -#define IO0DIR (GPIO0Base->IO_DIR) -#define IO0CLR (GPIO0Base->IO_CLR) - -#define GPIO1Base ((GPIO *)0xE0028010) -#define IO1PIN (GPIO1Base->IO_PIN) -#define IO1SET (GPIO1Base->IO_SET) -#define IO1DIR (GPIO1Base->IO_DIR) -#define IO1CLR (GPIO1Base->IO_CLR) - -typedef struct { - IOREG32 FIO_DIR; - IOREG32 unused1; - IOREG32 unused2; - IOREG32 unused3; - IOREG32 FIO_MASK; - IOREG32 FIO_PIN; - IOREG32 FIO_SET; - IOREG32 FIO_CLR; -} FIO; - -#define FIO0Base ((FIO *)0x3FFFC000) -#define FIO0DIR (FIO0Base->FIO_DIR) -#define FIO0MASK (FIO0Base->FIO_MASK) -#define FIO0PIN (FIO0Base->FIO_PIN) -#define FIO0SET (FIO0Base->FIO_SET) -#define FIO0CLR (FIO0Base->FIO_CLR) - -#define FIO1Base ((FIO *)0x3FFFC020) -#define FIO1DIR (FIO1Base->FIO_DIR) -#define FIO1MASK (FIO1Base->FIO_MASK) -#define FIO1PIN (FIO1Base->FIO_PIN) -#define FIO1SET (FIO1Base->FIO_SET) -#define FIO1CLR (FIO1Base->FIO_CLR) - -/* - * UART. - */ -typedef struct { - union { - IOREG32 UART_RBR; - IOREG32 UART_THR; - IOREG32 UART_DLL; - }; - union { - IOREG32 UART_IER; - IOREG32 UART_DLM; - }; - union { - IOREG32 UART_IIR; - IOREG32 UART_FCR; - }; - IOREG32 UART_LCR; - IOREG32 UART_MCR; - IOREG32 UART_LSR; - IOREG32 unused18; - IOREG32 UART_SCR; - IOREG32 UART_ACR; - IOREG32 unused24; - IOREG32 UART_FDR; - IOREG32 unused2C; - IOREG32 UART_TER; -} UART; - -#define U0Base ((UART *)0xE000C000) -#define U0RBR (U0Base->UART_RBR) -#define U0THR (U0Base->UART_THR) -#define U0DLL (U0Base->UART_DLL) -#define U0IER (U0Base->UART_IER) -#define U0DLM (U0Base->UART_DLM) -#define U0IIR (U0Base->UART_IIR) -#define U0FCR (U0Base->UART_FCR) -#define U0LCR (U0Base->UART_LCR) -#define U0LSR (U0Base->UART_LSR) -#define U0SCR (U0Base->UART_SCR) -#define U0ACR (U0Base->UART_ACR) -#define U0FDR (U0Base->UART_FDR) -#define U0TER (U0Base->UART_TER) - -#define U1Base ((UART *)0xE0010000) -#define U1RBR (U1Base->UART_RBR) -#define U1THR (U1Base->UART_THR) -#define U1DLL (U1Base->UART_DLL) -#define U1IER (U1Base->UART_IER) -#define U1DLM (U1Base->UART_DLM) -#define U1IIR (U1Base->UART_IIR) -#define U1FCR (U1Base->UART_FCR) -#define U1MCR (U1Base->UART_MCR) -#define U1LCR (U1Base->UART_LCR) -#define U1LSR (U1Base->UART_LSR) -#define U1SCR (U1Base->UART_SCR) -#define U1ACR (U1Base->UART_ACR) -#define U1FDR (U1Base->UART_FDR) -#define U1TER (U1Base->UART_TER) - -#define IIR_SRC_MASK 0x0F -#define IIR_SRC_NONE 0x01 -#define IIR_SRC_TX 0x02 -#define IIR_SRC_RX 0x04 -#define IIR_SRC_ERROR 0x06 -#define IIR_SRC_TIMEOUT 0x0C - -#define IER_RBR 1 -#define IER_THRE 2 -#define IER_STATUS 4 - -#define IIR_INT_PENDING 1 - -#define LCR_WL5 0 -#define LCR_WL6 1 -#define LCR_WL7 2 -#define LCR_WL8 3 -#define LCR_STOP1 0 -#define LCR_STOP2 4 -#define LCR_NOPARITY 0 -#define LCR_PARITYODD 0x08 -#define LCR_PARITYEVEN 0x18 -#define LCR_PARITYONE 0x28 -#define LCR_PARITYZERO 0x38 -#define LCR_BREAK_ON 0x40 -#define LCR_DLAB 0x80 - -#define FCR_ENABLE 1 -#define FCR_RXRESET 2 -#define FCR_TXRESET 4 -#define FCR_TRIGGER0 0 -#define FCR_TRIGGER1 0x40 -#define FCR_TRIGGER2 0x80 -#define FCR_TRIGGER3 0xC0 - -#define LSR_RBR_FULL 1 -#define LSR_OVERRUN 2 -#define LSR_PARITY 4 -#define LSR_FRAMING 8 -#define LSR_BREAK 0x10 -#define LSR_THRE 0x20 -#define LSR_TEMT 0x40 -#define LSR_RXFE 0x80 - -#define TER_ENABLE 0x80 - -/* - * SSP. - */ -typedef struct { - IOREG32 SSP_CR0; - IOREG32 SSP_CR1; - IOREG32 SSP_DR; - IOREG32 SSP_SR; - IOREG32 SSP_CPSR; - IOREG32 SSP_IMSC; - IOREG32 SSP_RIS; - IOREG32 SSP_MIS; - IOREG32 SSP_ICR; -} SSP; - -#define SSPBase ((SSP *)0xE0068000) -#define SSPCR0 (SSPBase->SSP_CR0) -#define SSPCR1 (SSPBase->SSP_CR1) -#define SSPDR (SSPBase->SSP_DR) -#define SSPSR (SSPBase->SSP_SR) -#define SSPCPSR (SSPBase->SSP_CPSR) -#define SSPIMSC (SSPBase->SSP_IMSC) -#define SSPRIS (SSPBase->SSP_RIS) -#define SSPMIS (SSPBase->SSP_MIS) -#define SSPICR (SSPBase->SSP_ICR) - -#define CR0_DSSMASK 0x0F -#define CR0_DSS4BIT 3 -#define CR0_DSS5BIT 4 -#define CR0_DSS6BIT 5 -#define CR0_DSS7BIT 6 -#define CR0_DSS8BIT 7 -#define CR0_DSS9BIT 8 -#define CR0_DSS10BIT 9 -#define CR0_DSS11BIT 0xA -#define CR0_DSS12BIT 0xB -#define CR0_DSS13BIT 0xC -#define CR0_DSS14BIT 0xD -#define CR0_DSS15BIT 0xE -#define CR0_DSS16BIT 0xF -#define CR0_FRFSPI 0 -#define CR0_FRFSSI 0x10 -#define CR0_FRFMW 0x20 -#define CR0_CPOL 0x40 -#define CR0_CPHA 0x80 -#define CR0_CLOCKRATE(n) ((n) << 8) - -#define CR1_LBM 1 -#define CR1_SSE 2 -#define CR1_MS 4 -#define CR1_SOD 8 - -#define SR_TFE 1 -#define SR_TNF 2 -#define SR_RNE 4 -#define SR_RFF 8 -#define SR_BSY 0x10 - -#define IMSC_ROR 1 -#define IMSC_RT 2 -#define IMSC_RX 4 -#define IMSC_TX 8 - -#define RIS_ROR 1 -#define RIS_RT 2 -#define RIS_RX 4 -#define RIS_TX 8 - -#define MIS_ROR 1 -#define MIS_RT 2 -#define MIS_RX 4 -#define MIS_TX 8 - -#define ICR_ROR 1 -#define ICR_RT 2 - -/* - * Timers/Counters. - */ -typedef struct { - IOREG32 TC_IR; - IOREG32 TC_TCR; - IOREG32 TC_TC; - IOREG32 TC_PR; - IOREG32 TC_PC; - IOREG32 TC_MCR; - IOREG32 TC_MR0; - IOREG32 TC_MR1; - IOREG32 TC_MR2; - IOREG32 TC_MR3; - IOREG32 TC_CCR; - IOREG32 TC_CR0; - IOREG32 TC_CR1; - IOREG32 TC_CR2; - IOREG32 TC_CR3; - IOREG32 TC_EMR; - IOREG32 TC_CTCR; -} TC; - -#define T0Base ((TC *)0xE0004000) -#define T0IR (T0Base->TC_IR) -#define T0TCR (T0Base->TC_TCR) -#define T0TC (T0Base->TC_TC) -#define T0PR (T0Base->TC_PR) -#define T0PC (T0Base->TC_PC) -#define T0MCR (T0Base->TC_MCR) -#define T0MR0 (T0Base->TC_MR0) -#define T0MR1 (T0Base->TC_MR1) -#define T0MR2 (T0Base->TC_MR2) -#define T0MR3 (T0Base->TC_MR3) -#define T0CCR (T0Base->TC_CCR) -#define T0CR0 (T0Base->TC_CR0) -#define T0CR1 (T0Base->TC_CR1) -#define T0CR2 (T0Base->TC_CR2) -#define T0CR3 (T0Base->TC_CR3) -#define T0EMR (T0Base->TC_EMR) -#define T0CTCR (T0Base->TC_CTCR) - -#define T1Base ((TC *)0xE0008000) -#define T1IR (T1Base->TC_IR) -#define T1TCR (T1Base->TC_TCR) -#define T1TC (T1Base->TC_TC) -#define T1PR (T1Base->TC_PR) -#define T1PC (T1Base->TC_PC) -#define T1MCR (T1Base->TC_MCR) -#define T1MR0 (T1Base->TC_MR0) -#define T1MR1 (T1Base->TC_MR1) -#define T1MR2 (T1Base->TC_MR2) -#define T1MR3 (T1Base->TC_MR3) -#define T1CCR (T1Base->TC_CCR) -#define T1CR0 (T1Base->TC_CR0) -#define T1CR1 (T1Base->TC_CR1) -#define T1CR2 (T1Base->TC_CR2) -#define T1CR3 (T1Base->TC_CR3) -#define T1EMR (T1Base->TC_EMR) -#define T1CTCR (T1Base->TC_CTCR) - -/* - * Watchdog. - */ -typedef struct { - IOREG32 WD_MOD; - IOREG32 WD_TC; - IOREG32 WD_FEED; - IOREG32 WD_TV; -} WD; - -#define WDBase ((WD *)0xE0000000) -#define WDMOD (WDBase->WD_MOD) -#define WDTC (WDBase->WD_TC) -#define WDFEED (WDBase->WD_FEED) -#define WDTV (WDBase->WD_TV) - -/* - * DAC. - */ -#define DACR (*((IOREG32 *)0xE006C000)) - -#endif /* _LPC214X_H_ */ - diff --git a/os/hal/platforms/LPC214x/pal_lld.c b/os/hal/platforms/LPC214x/pal_lld.c deleted file mode 100644 index 672303535c..0000000000 --- a/os/hal/platforms/LPC214x/pal_lld.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/pal_lld.c - * @brief LPC214x FIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief LPC214x I/O ports configuration. - * @details FIO units and PINSEL registers initialization. - * - * @param[in] config the LPC214x ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - /* Enables the access through the fast registers.*/ - SCS = 3; - - /* I/O pads initial assignment, device drivers may change this setup at a - * later time.*/ - PINSEL0 = config->pinsel0; - PINSEL1 = config->pinsel1; - PINSEL2 = config->pinsel2; - - /* I/O pads direction initial setting.*/ - FIO0Base->FIO_MASK = 0; - FIO0Base->FIO_PIN = config->P0Data.pin; - FIO0Base->FIO_DIR = config->P0Data.dir; - FIO1Base->FIO_MASK = 0; - FIO1Base->FIO_PIN = config->P1Data.pin; - FIO1Base->FIO_DIR = config->P1Data.dir; -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - port->FIO_DIR &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - port->FIO_PIN |= mask; - case PAL_MODE_OUTPUT_PUSHPULL: - port->FIO_DIR |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/pal_lld.h b/os/hal/platforms/LPC214x/pal_lld.h deleted file mode 100644 index bb0fb0d614..0000000000 --- a/os/hal/platforms/LPC214x/pal_lld.h +++ /dev/null @@ -1,265 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/pal_lld.h - * @brief LPC214x FIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief FIO port setup info. - */ -typedef struct { - /** Initial value for FIO_PIN register.*/ - uint32_t pin; - /** Initial value for FIO_DIR register.*/ - uint32_t dir; -} lpc214x_fio_setup_t; - -/** - * @brief LPC214x FIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialize the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { - /** @brief PINSEL0 initial value.*/ - uint32_t pinsel0; - /** @brief PINSEL1 initial value.*/ - uint32_t pinsel1; - /** @brief PINSEL2 initial value.*/ - uint32_t pinsel2; - /** @brief Port 0 setup data.*/ - lpc214x_fio_setup_t P0Data; - /** @brief Port 1 setup data.*/ - lpc214x_fio_setup_t P1Data; -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @details This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef FIO * ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief FIO port 0 identifier. - */ -#define IOPORT1 FIO0Base - -/** - * @brief FIO port 1 identifier. - */ -#define IOPORT2 FIO1Base - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief FIO subsystem initialization. - * @details Enables the access through the fast registers. - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads an I/O port. - * @details This function is implemented by reading the FIO PIN register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->FIO_PIN) - -/** - * @brief Reads the output latch. - * @details This function is implemented by reading the FIO SET register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->FIO_SET) - -/** - * @brief Writes a bits mask on a I/O port. - * @details This function is implemented by writing the FIO PIN register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->FIO_PIN = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @details This function is implemented by writing the FIO SET register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) ((port)->FIO_SET = (bits)) - -/** - * @brief Clears a bits mask on a I/O port. - * @details This function is implemented by writing the FIO CLR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) ((port)->FIO_CLR = (bits)) - -/** - * @brief Writes a value on an I/O bus. - * @details This function is implemented by writing the FIO PIN and MASK - * registers, the implementation is not atomic because the multiple - * accesses. - * - * @param[in] port port identifier - * @param[in] mask group mask, a logical AND is performed on the - * output data - * @param[in] offset the group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group - * width are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - ((port)->FIO_MASK = ~((mask) << (offset)), \ - (port)->FIO_PIN = (bits) << (offset), \ - (port)->FIO_MASK = 0) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with - * high state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Writes a logical state on an output pad. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) pal_lld_writegroup(port, 1, pad, bit) - -/** - * @brief FIO port setup. - * @details This function programs the pins direction within a port. - * - * @notapi - */ -#define pal_lld_lpc214x_set_direction(port, dir) ((port)->FIO_DIR = (dir)) - -extern const PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/platform.dox b/os/hal/platforms/LPC214x/platform.dox deleted file mode 100644 index 405ef0d428..0000000000 --- a/os/hal/platforms/LPC214x/platform.dox +++ /dev/null @@ -1,122 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup LPC214x LPC214x Drivers - * @details This section describes all the supported drivers on the LPC214x - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup LPC214x_HAL LPC214x Initialization Support - * @details The LPC214x HAL support is responsible for system initialization. - * - * @section lpc214x_hal_1 Supported HW resources - * - PLL0. - * - MAM. - * - VPBDIV. - * . - * @section lpc214x_hal_2 LPC214x HAL driver implementation features - * - Clock tree initialization. - * - Clock source selection. - * - MAM initialization. - * . - * @ingroup LPC214x - */ - -/** - * @defgroup LPC214x_PAL LPC214x PAL Support - * @details The LPC214x PAL driver uses the FIO peripherals. - * - * @section lpc214x_pal_1 Supported HW resources - * - FIO0. - * - FIO1. - * . - * @section lpc214x_pal_2 LPC214x PAL driver implementation features - * - 32 bits wide ports. - * - Atomic set/reset functions. - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section lpc214x_pal_3 Supported PAL setup modes - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_ANALOG (same as @p PAL_MODE_INPUT). - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section lpc214x_pal_4 Suboptimal behavior - * Some FIO features are less than optimal: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup LPC214x - */ - -/** - * @defgroup LPC214x_SERIAL LPC214x Serial Support - * @details The LPC214x Serial driver uses the UART peripherals in a - * buffered, interrupt driven, implementation. The serial driver - * also takes advantage of the LPC214x UARTs deep hardware buffers. - * - * @section lpc214x_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - UART0. - * - UART1. - * . - * @section lpc214x_serial_2 LPC214x Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Fully interrupt driven. - * - Programmable interrupt priority levels for each UART. - * - Takes advantage of the input and output FIFOs. - * . - * @ingroup LPC214x - */ - -/** - * @defgroup LPC214x_SPI LPC214x SPI Support - * @details The SPI driver supports the LPC214x SSP peripheral in an interrupt - * driven implementation. - * @note Being the SPI a fast peripheral, much care must be taken to - * not saturate the CPU bandwidth with an excessive IRQ rate. The - * maximum transfer bit rate is likely limited by the IRQ - * handling. - * - * @section lpc214x_spi_1 Supported HW resources - * - SSP (SPI0). - * . - * @section lpc214x_spi_2 LPC214x SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Programmable interrupt priority level. - * . - * @ingroup LPC214x - */ - -/** - * @defgroup LPC214x_VIC LPC214x VIC Support - * @details This VIC helper driver is used by the other drivers in order to - * access the shared VIC resources in a consistent way. - * - * @ingroup LPC214x - */ diff --git a/os/hal/platforms/LPC214x/platform.mk b/os/hal/platforms/LPC214x/platform.mk deleted file mode 100644 index 0253e47f7a..0000000000 --- a/os/hal/platforms/LPC214x/platform.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the LPC214x platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/LPC214x/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC214x/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC214x/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC214x/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/LPC214x/vic.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/LPC214x diff --git a/os/hal/platforms/LPC214x/serial_lld.c b/os/hal/platforms/LPC214x/serial_lld.c deleted file mode 100644 index a25c9ebcc0..0000000000 --- a/os/hal/platforms/LPC214x/serial_lld.c +++ /dev/null @@ -1,351 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/serial_lld.c - * @brief LPC214x low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if USE_LPC214x_UART0 || defined(__DOXYGEN__) -/** @brief UART0 serial driver identifier.*/ -SerialDriver SD1; -#endif - -#if USE_LPC214x_UART1 || defined(__DOXYGEN__) -/** @brief UART1 serial driver identifier.*/ -SerialDriver SD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - LCR_WL8 | LCR_STOP1 | LCR_NOPARITY, - FCR_TRIGGER0 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief UART initialization. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] config the architecture-dependent serial driver configuration - */ -static void uart_init(SerialDriver *sdp, const SerialConfig *config) { - UART *u = sdp->uart; - - uint32_t div = PCLK / (config->sc_speed << 4); - u->UART_LCR = config->sc_lcr | LCR_DLAB; - u->UART_DLL = div; - u->UART_DLM = div >> 8; - u->UART_LCR = config->sc_lcr; - u->UART_FCR = FCR_ENABLE | FCR_RXRESET | FCR_TXRESET | config->sc_fcr; - u->UART_ACR = 0; - u->UART_FDR = 0x10; - u->UART_TER = TER_ENABLE; - u->UART_IER = IER_RBR | IER_STATUS; -} - -/** - * @brief UART de-initialization. - * - * @param[in] u pointer to an UART I/O block - */ -static void uart_deinit(UART *u) { - - u->UART_LCR = LCR_DLAB; - u->UART_DLL = 1; - u->UART_DLM = 0; - u->UART_LCR = 0; - u->UART_FDR = 0x10; - u->UART_IER = 0; - u->UART_FCR = FCR_RXRESET | FCR_TXRESET; - u->UART_ACR = 0; - u->UART_TER = TER_ENABLE; -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp communication channel associated to the UART - * @param[in] err UART LSR register value - */ -static void set_error(SerialDriver *sdp, IOREG32 err) { - flagsmask_t sts = 0; - - if (err & LSR_OVERRUN) - sts |= SD_OVERRUN_ERROR; - if (err & LSR_PARITY) - sts |= SD_PARITY_ERROR; - if (err & LSR_FRAMING) - sts |= SD_FRAMING_ERROR; - if (err & LSR_BREAK) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -#if defined(__GNUC__) -__attribute__((noinline)) -#endif -/** - * @brief Common IRQ handler. - * @note Tries hard to clear all the pending interrupt sources, we dont want - * to go through the whole ISR and have another interrupt soon after. - * - * @param[in] sdp communication channel associated to the UART - */ -static void serve_interrupt(SerialDriver *sdp) { - UART *u = sdp->uart; - - while (TRUE) { - switch (u->UART_IIR & IIR_SRC_MASK) { - case IIR_SRC_NONE: - return; - case IIR_SRC_ERROR: - set_error(sdp, u->UART_LSR); - break; - case IIR_SRC_TIMEOUT: - case IIR_SRC_RX: - chSysLockFromIsr(); - if (chIQIsEmptyI(&sdp->iqueue)) - chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE); - chSysUnlockFromIsr(); - while (u->UART_LSR & LSR_RBR_FULL) { - chSysLockFromIsr(); - if (chIQPutI(&sdp->iqueue, u->UART_RBR) < Q_OK) - chnAddFlagsI(sdp, SD_OVERRUN_ERROR); - chSysUnlockFromIsr(); - } - break; - case IIR_SRC_TX: - { - int i = LPC214x_UART_FIFO_PRELOAD; - do { - msg_t b; - - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - chSysUnlockFromIsr(); - if (b < Q_OK) { - u->UART_IER &= ~IER_THRE; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - chSysUnlockFromIsr(); - break; - } - u->UART_THR = b; - } while (--i); - } - break; - default: - (void) u->UART_THR; - (void) u->UART_RBR; - } - } -} - -/** - * @brief Attempts a TX FIFO preload. - */ -static void preload(SerialDriver *sdp) { - UART *u = sdp->uart; - - if (u->UART_LSR & LSR_THRE) { - int i = LPC214x_UART_FIFO_PRELOAD; - do { - msg_t b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - return; - } - u->UART_THR = b; - } while (--i); - } - u->UART_IER |= IER_THRE; -} - -/** - * @brief Driver SD1 output notification. - */ -#if USE_LPC214x_UART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - preload(&SD1); -} -#endif - -/** - * @brief Driver SD2 output notification. - */ -#if USE_LPC214x_UART1 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - preload(&SD2); -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief UART0 IRQ handler. - * - * @isr - */ -#if USE_LPC214x_UART0 || defined(__DOXYGEN__) -CH_IRQ_HANDLER(UART0IrqHandler) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD1); - VICVectAddr = 0; - - CH_IRQ_EPILOGUE(); -} -#endif - -/** - * @brief UART1 IRQ handler. - * - * @isr - */ -#if USE_LPC214x_UART1 || defined(__DOXYGEN__) -CH_IRQ_HANDLER(UART1IrqHandler) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD2); - VICVectAddr = 0; - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if USE_LPC214x_UART0 - sdObjectInit(&SD1, NULL, notify1); - SD1.uart = U0Base; - SetVICVector(UART0IrqHandler, LPC214x_UART0_PRIORITY, SOURCE_UART0); -#endif -#if USE_LPC214x_UART1 - sdObjectInit(&SD2, NULL, notify2); - SD2.uart = U1Base; - SetVICVector(UART1IrqHandler, LPC214x_UART1_PRIORITY, SOURCE_UART1); -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if USE_LPC214x_UART0 - if (&SD1 == sdp) { - PCONP = (PCONP & PCALL) | PCUART0; - VICIntEnable = INTMASK(SOURCE_UART0); - } -#endif -#if USE_LPC214x_UART1 - if (&SD2 == sdp) { - PCONP = (PCONP & PCALL) | PCUART1; - VICIntEnable = INTMASK(SOURCE_UART1); - } -#endif - } - uart_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the UART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - uart_deinit(sdp->uart); -#if USE_LPC214x_UART0 - if (&SD1 == sdp) { - PCONP = (PCONP & PCALL) & ~PCUART0; - VICIntEnClear = INTMASK(SOURCE_UART0); - return; - } -#endif -#if USE_LPC214x_UART1 - if (&SD2 == sdp) { - PCONP = (PCONP & PCALL) & ~PCUART1; - VICIntEnClear = INTMASK(SOURCE_UART1); - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/serial_lld.h b/os/hal/platforms/LPC214x/serial_lld.h deleted file mode 100644 index 56abf73252..0000000000 --- a/os/hal/platforms/LPC214x/serial_lld.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/serial_lld.h - * @brief LPC214x low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief UART0 driver enable switch. - * @details If set to @p TRUE the support for UART0 is included. - * @note The default is @p TRUE . - */ -#if !defined(USE_LPC214x_UART0) || defined(__DOXYGEN__) -#define USE_LPC214x_UART0 TRUE -#endif - -/** - * @brief UART1 driver enable switch. - * @details If set to @p TRUE the support for UART1 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_LPC214x_UART1) || defined(__DOXYGEN__) -#define USE_LPC214x_UART1 TRUE -#endif - -/** - * @brief FIFO preload parameter. - * @details Configuration parameter, this values defines how many bytes are - * preloaded in the HW transmit FIFO for each interrupt, the maximum - * value is 16 the minimum is 1. - * @note An high value reduces the number of interrupts generated but can - * also increase the worst case interrupt response time because the - * preload loops. - */ -#if !defined(LPC214x_UART_FIFO_PRELOAD) || defined(__DOXYGEN__) -#define LPC214x_UART_FIFO_PRELOAD 16 -#endif - -/** - * @brief UART0 interrupt priority level setting. - */ -#if !defined(LPC214x_UART0_PRIORITY) || defined(__DOXYGEN__) -#define LPC214x_UART0_PRIORITY 1 -#endif - -/** - * @brief UART1 interrupt priority level setting. - */ -#if !defined(LPC214x_UART1_PRIORITY) || defined(__DOXYGEN__) -#define LPC214x_UART1_PRIORITY 2 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (LPC214x_UART_FIFO_PRELOAD < 1) || (LPC214x_UART_FIFO_PRELOAD > 16) -#error "invalid LPC214x_UART_FIFO_PRELOAD setting" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief LPC214x Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t sc_speed; - /** - * @brief Initialization value for the LCR register. - */ - uint32_t sc_lcr; - /** - * @brief Initialization value for the FCR register. - */ - uint32_t sc_fcr; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the USART registers block.*/ \ - UART *uart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_LPC214x_UART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_LPC214x_UART1 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/spi_lld.c b/os/hal/platforms/LPC214x/spi_lld.c deleted file mode 100644 index 3c61d7302b..0000000000 --- a/os/hal/platforms/LPC214x/spi_lld.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/spi_lld.c - * @brief LPC214x low level SPI driver code. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if LPC214x_SPI_USE_SSP || defined(__DOXYGEN__) -/** @brief SPI1 driver identifier.*/ -SPIDriver SPID1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Preloads the transmit FIFO. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void ssp_fifo_preload(SPIDriver *spip) { - SSP *ssp = spip->ssp; - uint32_t n = spip->txcnt > LPC214x_SSP_FIFO_DEPTH ? - LPC214x_SSP_FIFO_DEPTH : spip->txcnt; - - while(((ssp->SSP_SR & SR_TNF) != 0) && (n > 0)) { - if (spip->txptr != NULL) { - if ((ssp->SSP_CR0 & CR0_DSSMASK) > CR0_DSS8BIT) - ssp->SSP_DR = *(uint16_t *)spip->txptr++; - else - ssp->SSP_DR = *(uint8_t *)spip->txptr++; - } - else - ssp->SSP_DR = 0xFFFFFFFF; - n--; - spip->txcnt--; - } -} - -#if defined(__GNUC__) -__attribute__((noinline)) -#endif -/** - * @brief Common IRQ handler. - * - * @param[in] spip pointer to the @p SPIDriver object - */ -static void serve_interrupt(SPIDriver *spip) { - SSP *ssp = spip->ssp; - - if ((ssp->SSP_MIS & MIS_ROR) != 0) { - /* The overflow condition should never happen because priority is given - to receive but a hook macro is provided anyway...*/ - LPC214x_SPI_SSP_ERROR_HOOK(); - } - ssp->SSP_ICR = ICR_RT | ICR_ROR; - while ((ssp->SSP_SR & SR_RNE) != 0) { - if (spip->rxptr != NULL) { - if ((ssp->SSP_CR0 & CR0_DSSMASK) > CR0_DSS8BIT) - *(uint16_t *)spip->rxptr++ = ssp->SSP_DR; - else - *(uint8_t *)spip->rxptr++ = ssp->SSP_DR; - } - else - (void)ssp->SSP_DR; - if (--spip->rxcnt == 0) { - chDbgAssert(spip->txcnt == 0, - "spi_serve_interrupt(), #1", "counter out of synch"); - /* Stops the IRQ sources.*/ - ssp->SSP_IMSC = 0; - /* Portable SPI ISR code defined in the high level driver, note, it is - a macro.*/ - _spi_isr_code(spip); - return; - } - } - ssp_fifo_preload(spip); - if (spip->txcnt == 0) - ssp->SSP_IMSC = IMSC_ROR | IMSC_RT | IMSC_RX; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if LPC214x_SPI_USE_SSP || defined(__DOXYGEN__) -/** - * @brief SPI1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPI1IrqHandler) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SPID1); - VICVectAddr = 0; - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - -#if LPC214x_SPI_USE_SSP - spiObjectInit(&SPID1); - SPID1.ssp = SSPBase; - SetVICVector(SPI1IrqHandler, LPC214x_SPI_SSP_IRQ_PRIORITY, SOURCE_SPI1); -#endif -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - if (spip->state == SPI_STOP) { - /* Clock activation.*/ -#if LPC214x_SPI_USE_SSP - if (&SPID1 == spip) { - PCONP = (PCONP & PCALL) | PCSPI1; - VICIntEnable = INTMASK(SOURCE_SPI1); - } -#endif - } - /* Configuration.*/ - spip->ssp->SSP_CR1 = 0; - /* Emptying the receive FIFO, it happens to not be empty while debugging.*/ - while (spip->ssp->SSP_SR & SR_RNE) - (void) spip->ssp->SSP_DR; - spip->ssp->SSP_ICR = ICR_RT | ICR_ROR; - spip->ssp->SSP_CR0 = spip->config->cr0; - spip->ssp->SSP_CPSR = spip->config->cpsr; - spip->ssp->SSP_CR1 = CR1_SSE; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - if (spip->state != SPI_STOP) { - spip->ssp->SSP_CR1 = 0; - spip->ssp->SSP_CR0 = 0; - spip->ssp->SSP_CPSR = 0; -#if LPC214x_SPI_USE_SSP - if (&SPID1 == spip) { - PCONP = (PCONP & PCALL) & ~PCSPI1; - VICIntEnClear = INTMASK(SOURCE_SPI1); - } -#endif - } -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This function transmits a series of idle words on the SPI bus and - * ignores the received data. This function can be invoked even - * when a slave select signal has not been yet asserted. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - spip->rxptr = NULL; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->SSP_IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This asynchronous function starts a simultaneous transmit/receive - * operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->SSP_IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Sends data over the SPI bus. - * @details This asynchronous function starts a transmit operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - spip->rxptr = NULL; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->SSP_IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Receives data from the SPI bus. - * @details This asynchronous function starts a receive operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - ssp_fifo_preload(spip); - spip->ssp->SSP_IMSC = IMSC_ROR | IMSC_RT | IMSC_TX | IMSC_RX; -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) { - - spip->ssp->SSP_DR = (uint32_t)frame; - while ((spip->ssp->SSP_SR & SR_RNE) == 0) - ; - return (uint16_t)spip->ssp->SSP_DR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/spi_lld.h b/os/hal/platforms/LPC214x/spi_lld.h deleted file mode 100644 index aa6f939daf..0000000000 --- a/os/hal/platforms/LPC214x/spi_lld.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/spi_lld.h - * @brief LPC214x low level SPI driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Hardware FIFO depth. - */ -#define LPC214x_SSP_FIFO_DEPTH 8 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief SPI1 driver enable switch. - * @details If set to @p TRUE the support for SSP is included. - * @note The default is @p TRUE. - */ -#if !defined(LPC214x_SPI_USE_SSP) || defined(__DOXYGEN__) -#define LPC214x_SPI_USE_SSP TRUE -#endif - -/** - * @brief SSP interrupt priority level setting. - */ -#if !defined(LPC214x_SPI_SSP_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define LPC214x_SPI_SSP_IRQ_PRIORITY 4 -#endif - -/** - * @brief Overflow error hook. - * @details The default action is to stop the system. - */ -#if !defined(LPC214x_SPI_SSP_ERROR_HOOK) || defined(__DOXYGEN__) -#define LPC214x_SPI_SSP_ERROR_HOOK() chSysHalt() -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !LPC214x_SPI_USE_SSP -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SSP CR0 initialization data. - */ - uint16_t cr0; - /** - * @brief SSP CPSR initialization data. - */ - uint32_t cpsr; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SSP registers block. - */ - SSP *ssp; - /** - * @brief Number of bytes yet to be received. - */ - uint32_t rxcnt; - /** - * @brief Receive pointer or @p NULL. - */ - void *rxptr; - /** - * @brief Number of bytes yet to be transmitted. - */ - uint32_t txcnt; - /** - * @brief Transmit pointer or @p NULL. - */ - const void *txptr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if LPC214x_SPI_USE_SSP && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/LPC214x/vic.c b/os/hal/platforms/LPC214x/vic.c deleted file mode 100644 index b97d0c13b2..0000000000 --- a/os/hal/platforms/LPC214x/vic.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/vic.c - * @brief LPC214x VIC peripheral support code. - * - * @addtogroup LPC214x_VIC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/** - * @brief VIC Initialization. - * @note Better reset everything in the VIC, it is a HUGE source of trouble. - * - * @notapi - */ -void vic_init(void) { - int i; - - VIC *vic = VICBase; - vic->VIC_IntSelect = 0; /* All sources assigned to IRQ. */ - vic->VIC_SoftIntClear = ALLINTMASK; /* No interrupts enforced */ - vic->VIC_IntEnClear = ALLINTMASK; /* All sources disabled. */ - for (i = 0; i < 16; i++) { - vic->VIC_VectCntls[i] = 0; - vic->VIC_VectAddrs[i] = 0; - vic->VIC_VectAddr = 0; - } -} - -/** - * @brief Initializes a VIC vector. - * @details Set a vector for an interrupt source and enables it. - * - * @param[in] handler the pointer to the IRQ service routine - * @param[in] vector the vector number - * @param[in] source the IRQ source to be associated to the vector - * - * @api - */ -void SetVICVector(void *handler, int vector, int source) { - - VIC *vicp = VICBase; - vicp->VIC_VectAddrs[vector] = (IOREG32)handler; - vicp->VIC_VectCntls[vector] = (IOREG32)(source | 0x20); -} - -/** @} */ diff --git a/os/hal/platforms/LPC214x/vic.h b/os/hal/platforms/LPC214x/vic.h deleted file mode 100644 index fed6613d4b..0000000000 --- a/os/hal/platforms/LPC214x/vic.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file LPC214x/vic.h - * @brief LPC214x VIC peripheral support header. - * - * @addtogroup LPC214x_VIC - * @{ - */ - -#ifndef _VIC_H_ -#define _VIC_H_ - -#ifdef __cplusplus -extern "C" { -#endif - void vic_init(void); - void SetVICVector(void *handler, int vector, int source); -#ifdef __cplusplus -} -#endif - -#endif /* _VIC_H_ */ - -/** @} */ diff --git a/os/hal/platforms/MSP430/hal_lld.c b/os/hal/platforms/MSP430/hal_lld.c deleted file mode 100644 index 0e8ac71dc2..0000000000 --- a/os/hal/platforms/MSP430/hal_lld.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/hal_lld.c - * @brief MSP430 HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* RTC initially stopped.*/ - WDTCTL = 0x5A80; - - /* Clock sources setup.*/ - DCOCTL = VAL_DCOCTL; - BCSCTL1 = VAL_BCSCTL1; -#if MSP430_USE_CLOCK == MSP430_CLOCK_SOURCE_XT2CLK - do { - int i; - IFG1 &= ~OFIFG; - for (i = 255; i > 0; i--) - asm("nop"); - } while (IFG1 & OFIFG); -#endif - BCSCTL2 = VAL_BCSCTL2; -} - -/** @} */ diff --git a/os/hal/platforms/MSP430/hal_lld.h b/os/hal/platforms/MSP430/hal_lld.h deleted file mode 100644 index ea04b45ff9..0000000000 --- a/os/hal/platforms/MSP430/hal_lld.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/hal_lld.h - * @brief MSP430 HAL subsystem low level driver header. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "msp430.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "MSP430" - -#define MSP430_CLOCK_SOURCE_XT2CLK 0 /**< @brief XT2CLK clock selector. */ -#define MSP430_CLOCK_SOURCE_DCOCLK 1 /**< @brief DCOCLK clock selector. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Clock source. - * @details The clock source can be selected from: - * - @p MSP430_CLOCK_SOURCE_XT2CLK. - * - @p MSP430_CLOCK_SOURCE_DCOCLK. - * . - */ -#if !defined(MSP430_USE_CLOCK) || defined(__DOXYGEN__) -#define MSP430_USE_CLOCK MSP430_CLOCK_SOURCE_XT2CLK -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Calculating the derived clock constants. - */ -#define ACLK LFXT1CLK -#if MSP430_USE_CLOCK == MSP430_CLOCK_SOURCE_XT2CLK -#define MCLK XT2CLK -#define SMCLK (XT2CLK / 8) -#elif MSP430_USE_CLOCK == MSP430_CLOCK_SOURCE_DCOCLK -#define MCLK DCOCLK -#define SMCLK DCOCLK -#else -#error "unknown clock source specified" -#endif - -/* - * Calculating the initialization values. - */ -#define VAL_DCOCTL (DCO0 | DCO1) -#if MSP430_USE_CLOCK == MSP430_CLOCK_SOURCE_XT2CLK -#define VAL_BCSCTL1 (RSEL2) -#define VAL_BCSCTL2 (SELM_2 | DIVM_0 | DIVS_3 | SELS) -#endif -#if MSP430_USE_CLOCK == MSP430_CLOCK_SOURCE_DCOCLK -#define VAL_BCSCTL1 (XT2OFF | RSEL2) -#define VAL_BCSCTL2 (SELM_0 | DIVM_0 | DIVS_0) -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/MSP430/pal_lld.c b/os/hal/platforms/MSP430/pal_lld.c deleted file mode 100644 index 562b0efb74..0000000000 --- a/os/hal/platforms/MSP430/pal_lld.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/pal_lld.c - * @brief MSP430 Digital I/O low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief MSP430 I/O ports configuration. - * @note The @p PxIFG, @p PxIE and @p PxSEL registers are cleared. @p PxOUT - * and @p PxDIR are configured as specified. - * - * @param[in] config the MSP430 ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - -#if defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) - IOPORT1->iop_full.ie = 0; - IOPORT1->iop_full.ifg = 0; - IOPORT1->iop_full.sel = 0; - IOPORT1->iop_common.out = config->P1Data.out; - IOPORT1->iop_common.dir = config->P1Data.dir; -#endif - -#if defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) - IOPORT2->iop_full.ie = 0; - IOPORT2->iop_full.ifg = 0; - IOPORT2->iop_full.sel = 0; - IOPORT2->iop_common.out = config->P2Data.out; - IOPORT2->iop_common.dir = config->P2Data.dir; -#endif - -#if defined(__MSP430_HAS_PORT3__) || defined(__MSP430_HAS_PORT3_R__) - IOPORT3->iop_simple.sel = 0; - IOPORT3->iop_common.out = config->P3Data.out; - IOPORT3->iop_common.dir = config->P3Data.dir; -#endif - -#if defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__) - IOPORT4->iop_simple.sel = 0; - IOPORT4->iop_common.out = config->P4Data.out; - IOPORT4->iop_common.dir = config->P4Data.dir; -#endif - -#if defined(__MSP430_HAS_PORT5__) || defined(__MSP430_HAS_PORT5_R__) - IOPORT5->iop_simple.sel = 0; - IOPORT5->iop_common.out = config->P5Data.out; - IOPORT5->iop_common.dir = config->P5Data.dir; -#endif - -#if defined(__MSP430_HAS_PORT6__) || defined(__MSP430_HAS_PORT6_R__) - IOPORT6->iop_simple.sel = 0; - IOPORT6->iop_common.out = config->P6Data.out; - IOPORT6->iop_common.dir = config->P6Data.dir; -#endif -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as output as recommended by - * the MSP430x1xx Family User's Guide. Unconnected pads are set to - * high logic state by default. - * @note This function does not alter the @p PxSEL registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - port->iop_common.dir &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - port->iop_common.out |= mask; - case PAL_MODE_OUTPUT_PUSHPULL: - port->iop_common.dir |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/MSP430/pal_lld.h b/os/hal/platforms/MSP430/pal_lld.h deleted file mode 100644 index c0bf28ff0c..0000000000 --- a/os/hal/platforms/MSP430/pal_lld.h +++ /dev/null @@ -1,327 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/pal_lld.h - * @brief MSP430 Digital I/O low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_INPUT_ANALOG -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief Simple MSP430 I/O port. - */ -struct msp430_port_simple_t { - volatile uint8_t in; - volatile uint8_t out; - volatile uint8_t dir; - volatile uint8_t sel; -}; - -/** - * @brief Full MSP430 I/O port. - */ -struct msp430_port_full_t { - volatile uint8_t in; - volatile uint8_t out; - volatile uint8_t dir; - volatile uint8_t ifg; - volatile uint8_t ies; - volatile uint8_t ie; - volatile uint8_t sel; -#if defined(__MSP430_HAS_PORT1_R__) || defined(__MSP430_HAS_PORT2_R__) - volatile uint8_t ren; -#endif -}; - -/** - * @brief Simplified MSP430 I/O port representation. - * @details This structure represents the common part of all the MSP430 I/O - * ports. - */ -struct msp430_port_common { - volatile uint8_t in; - volatile uint8_t out; - volatile uint8_t dir; -}; - -/** - * @brief Generic MSP430 I/O port. - */ -typedef union { - struct msp430_port_common iop_common; - struct msp430_port_simple_t iop_simple; - struct msp430_port_full_t iop_full; -} msp430_ioport_t; - -/** - * @brief Setup registers common to all the MSP430 ports. - */ -typedef struct { - volatile uint8_t out; - volatile uint8_t dir; -} msp430_dio_setup_t; - -/** - * @brief MSP430 I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialize the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { -#if defined(__MSP430_HAS_PORT1__) || \ - defined(__MSP430_HAS_PORT1_R__) || \ - defined(__DOXYGEN__) - /** @brief Port 1 setup data.*/ - msp430_dio_setup_t P1Data; -#endif -#if defined(__MSP430_HAS_PORT2__) || \ - defined(__MSP430_HAS_PORT2_R__) || \ - defined(__DOXYGEN__) - /** @brief Port 2 setup data.*/ - msp430_dio_setup_t P2Data; -#endif -#if defined(__MSP430_HAS_PORT3__) || \ - defined(__MSP430_HAS_PORT3_R__) || \ - defined(__DOXYGEN__) - /** @brief Port 3 setup data.*/ - msp430_dio_setup_t P3Data; -#endif -#if defined(__MSP430_HAS_PORT4__) || \ - defined(__MSP430_HAS_PORT4_R__) || \ - defined(__DOXYGEN__) - /** @brief Port 4 setup data.*/ - msp430_dio_setup_t P4Data; -#endif -#if defined(__MSP430_HAS_PORT5__) || \ - defined(__MSP430_HAS_PORT5_R__) || \ - defined(__DOXYGEN__) - /** @brief Port 5 setup data.*/ - msp430_dio_setup_t P5Data; -#endif -#if defined(__MSP430_HAS_PORT6__) || \ - defined(__MSP430_HAS_PORT6_R__) || \ - defined(__DOXYGEN__) - /** @brief Port 6 setup data.*/ - msp430_dio_setup_t P6Data; -#endif -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 8 - -/** - * @brief Whole port mask. - * @details This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint8_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint16_t iomode_t; - -/** - * @brief Port Identifier. - * @details This type can be a scalar or some kind of pointer, do not make - * any assumption about it, use the provided macros when populating - * variables of this type. - */ -typedef msp430_ioport_t *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief I/O port A identifier. - * @details This port identifier is mapped on the MSP430 port 1 (P1). - */ -#if defined(__MSP430_HAS_PORT1__) || \ - defined(__MSP430_HAS_PORT1_R__) || \ - defined(__DOXYGEN__) -#define IOPORT1 ((ioportid_t)P1IN_) -#endif - -/** - * @brief I/O port B identifier. - * @details This port identifier is mapped on the MSP430 port 2 (P2). - */ -#if defined(__MSP430_HAS_PORT2__) || \ - defined(__MSP430_HAS_PORT2_R__) || \ - defined(__DOXYGEN__) -#define IOPORT2 ((ioportid_t)P2IN_) -#endif - -/** - * @brief I/O port C identifier. - * @details This port identifier is mapped on the MSP430 port 3 (P3). - */ -#if defined(__MSP430_HAS_PORT3__) || \ - defined(__MSP430_HAS_PORT3_R__) || \ - defined(__DOXYGEN__) -#define IOPORT3 ((ioportid_t)P3IN_) -#endif - -/** - * @brief I/O port D identifier. - * @details This port identifier is mapped on the MSP430 port 4 (P4). - */ -#if defined(__MSP430_HAS_PORT4__) || \ - defined(__MSP430_HAS_PORT4_R__) || \ - defined(__DOXYGEN__) -#define IOPORT4 ((ioportid_t)P4IN_) -#endif - -/** - * @brief I/O port E identifier. - * @details This port identifier is mapped on the MSP430 port 5 (P5). - */ -#if defined(__MSP430_HAS_PORT5__) || \ - defined(__MSP430_HAS_PORT5_R__) || \ - defined(__DOXYGEN__) -#define IOPORT5 ((ioportid_t)P5IN_) -#endif - -/** - * @brief I/O port F identifier. - * @details This port identifier is mapped on the MSP430 port 6 (P6). - */ -#if defined(__MSP430_HAS_PORT6__) || \ - defined(__MSP430_HAS_PORT6_R__) || \ - defined(__DOXYGEN__) -#define IOPORT6 ((ioportid_t)P6IN_) -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * @details In MSP430 programs all the ports as input. - * - * @param[in] config the MSP430 ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads the physical I/O port states. - * @details This function is implemented by reading the PxIN register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->iop_common.in) - -/** - * @brief Reads the output latch. - * @details This function is implemented by reading the PxOUT register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->iop_common.out) - -/** - * @brief Writes a bits mask on a I/O port. - * @details This function is implemented by writing the PxOUT register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->iop_common.out = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as output as recommended by - * the MSP430x1xx Family User's Guide. - * @note This function does not alter the @p PxSEL registers. Alternate - * functions setup must be handled by device-specific code. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -extern const PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* _PAL_LLD_H_ */ - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/MSP430/platform.dox b/os/hal/platforms/MSP430/platform.dox deleted file mode 100644 index 2435f5b229..0000000000 --- a/os/hal/platforms/MSP430/platform.dox +++ /dev/null @@ -1,97 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup MSP430_DRIVERS MSP430 Drivers - * @details This section describes all the supported drivers on the MSP430 - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup MSP430_HAL MSP430 Initialization Support - * @details The MSP430 HAL support is responsible for system initialization. - * - * @section msp430_hal_1 Supported HW resources - * - DCOCTL. - * - BCSCTL1. - * - BCSCTL2. - * . - * @section msp430_hal_2 MSP430 HAL driver implementation features - * - Clock source selection. - * . - * @ingroup MSP430_DRIVERS - */ - -/** - * @defgroup MSP430_PAL MSP430 PAL Support - * @details The MSP430 PAL driver uses the PORT peripherals. - * - * @section msp430_pal_1 Supported HW resources - * - PORT1 (where present). - * - PORT2 (where present). - * - PORT3 (where present). - * - PORT4 (where present). - * - PORT5 (where present). - * - PORT6 (where present). - * . - * @section msp430_pal_2 MSP430 PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 8 bits wide ports. - * - Atomic set/reset/toggle functions because special MSP430 instruction set. - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section msp430_pal_3 Supported PAL setup modes - * The MSP430 PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section msp430_pal_4 Suboptimal behavior - * The MSP430 PORT is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Bus/group writes is not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup MSP430_DRIVERS - */ - -/** - * @defgroup MSP430_SERIAL MSP430 Serial Support - * @details The MSP430 Serial driver uses the USART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section msp430_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART0. - * - USART1. - * . - * @section msp430_serial_2 MSP430 Serial driver implementation features - * - Each USART can be independently enabled and programmed. - * - Fully interrupt driven. - * . - * @ingroup MSP430_DRIVERS - */ diff --git a/os/hal/platforms/MSP430/platform.mk b/os/hal/platforms/MSP430/platform.mk deleted file mode 100644 index d0175c1dfb..0000000000 --- a/os/hal/platforms/MSP430/platform.mk +++ /dev/null @@ -1,7 +0,0 @@ -# List of all the MSP430 platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/MSP430/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/MSP430/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/MSP430/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/MSP430 diff --git a/os/hal/platforms/MSP430/serial_lld.c b/os/hal/platforms/MSP430/serial_lld.c deleted file mode 100644 index 8002434214..0000000000 --- a/os/hal/platforms/MSP430/serial_lld.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/serial_lld.c - * @brief MSP430 low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if USE_MSP430_USART0 || defined(__DOXYGEN__) -/** @brief USART0 serial driver identifier.*/ -SerialDriver SD1; -#endif -#if USE_MSP430_USART1 || defined(__DOXYGEN__) -/** @brief USART1 serial driver identifier.*/ -SerialDriver SD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { - UBR(SERIAL_DEFAULT_BITRATE), - 0, - CHAR -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void set_error(SerialDriver *sdp, uint8_t urctl) { - flagsmask_t sts = 0; - - if (urctl & OE) - sts |= SD_OVERRUN_ERROR; - if (urctl & PE) - sts |= SD_PARITY_ERROR; - if (urctl & FE) - sts |= SD_FRAMING_ERROR; - if (urctl & BRK) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -#if USE_MSP430_USART0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - if (!(U0IE & UTXIE0)) { - msg_t b = sdRequestDataI(&SD1); - if (b != Q_EMPTY) { - U0IE |= UTXIE0; - U0TXBUF = (uint8_t)b; - } - } -} - -/** - * @brief USART0 initialization. - * - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart0_init(const SerialConfig *config) { - - U0CTL = SWRST; /* Resets the USART. */ - /* USART init */ - U0TCTL = SSEL0 | SSEL1; /* SMCLK as clock source. */ - U0MCTL = config->sc_mod; /* Modulator. */ - U0BR1 = (uint8_t)(config->sc_div >> 8); /* Divider high. */ - U0BR0 = (uint8_t)(config->sc_div >> 0); /* Divider low. */ - /* Clear USART status.*/ - (void)U0RXBUF; - U0RCTL = 0; - /* USART enable.*/ - U0ME |= UTXE0 + URXE0; /* Enables the USART. */ - U0CTL = config->sc_ctl & ~SWRST; /* Various settings. */ - U0IE |= URXIE0; /* Enables RX interrupt. */ -} - -/** - * @brief USART0 de-initialization. - */ -static void usart0_deinit(void) { - - U0IE &= ~URXIE0; - U0CTL = SWRST; -} -#endif /* USE_MSP430_USART0 */ - -#if USE_MSP430_USART1 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - if (!(U1IE & UTXIE1)) { - msg_t b = sdRequestDataI(&SD2); - if (b != Q_EMPTY) { - U1IE |= UTXIE1; - U1TXBUF = (uint8_t)b; - } - } -} - -/** - * @brief USART1 initialization. - * - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart1_init(const SerialConfig *config) { - - U1CTL = SWRST; /* Resets the USART. */ - /* USART init.*/ - U1TCTL = SSEL0 | SSEL1; /* SMCLK as clock source. */ - U1MCTL = config->sc_mod; /* Modulator. */ - U1BR1 = (uint8_t)(config->sc_div >> 8); /* Divider high. */ - U1BR0 = (uint8_t)(config->sc_div >> 0); /* Divider low. */ - /* Clear USART status.*/ - (void)U0RXBUF; - U1RCTL = 0; - /* USART enable.*/ - U1ME |= UTXE0 + URXE0; /* Enables the USART. */ - U1CTL = config->sc_ctl & ~SWRST; /* Various settings. */ - U1IE |= URXIE0; /* Enables RX interrupt. */ -} - -/** - * @brief USART1 de-initialization. - */ -static void usart1_deinit(void) { - - U1IE &= ~URXIE0; - U1CTL = SWRST; -} -#endif /* USE_MSP430_USART1 */ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if USE_MSP430_USART0 || defined(__DOXYGEN__) -/** - * @brief USART0 TX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART0TX) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD1); - chSysUnlockFromIsr(); - if (b < Q_OK) - U0IE &= ~UTXIE0; - else - U0TXBUF = b; - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief USART0 RX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART0RX) { - uint8_t urctl; - - CH_IRQ_PROLOGUE(); - - if ((urctl = U0RCTL) & RXERR) - set_error(&SD1, urctl); - chSysLockFromIsr(); - sdIncomingDataI(&SD1, U0RXBUF); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} -#endif /* USE_MSP430_USART0 */ - -#if USE_MSP430_USART1 || defined(__DOXYGEN__) -/** - * @brief USART1 TX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART1TX_VECTOR) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD2); - chSysUnlockFromIsr(); - if (b < Q_OK) - U1IE &= ~UTXIE1; - else - U1TXBUF = b; - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief USART1 RX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(USART1RX_VECTOR) { - uint8_t urctl; - - CH_IRQ_PROLOGUE(); - - if ((urctl = U1RCTL) & RXERR) - set_error(&SD2, urctl); - chSysLockFromIsr(); - sdIncomingDataI(&SD2, U1RXBUF); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} -#endif /* USE_MSP430_USART1 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if USE_MSP430_USART0 - sdObjectInit(&SD1, NULL, notify1); -#endif - -#if USE_MSP430_USART1 - sdObjectInit(&SD2, NULL, notify2); -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - -#if USE_MSP430_USART0 - if (&SD1 == sdp) { - usart0_init(config); - return; - } -#endif -#if USE_MSP430_USART1 - if (&SD2 == sdp) { - usart1_init(config); - return; - } -#endif -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - -#if USE_MSP430_USART0 - if (&SD1 == sdp) { - usart0_deinit(); - return; - } -#endif -#if USE_MSP430_USART1 - if (&SD2 == sdp) { - usart1_deinit(); - return; - } -#endif -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/MSP430/serial_lld.h b/os/hal/platforms/MSP430/serial_lld.h deleted file mode 100644 index 06c0ece510..0000000000 --- a/os/hal/platforms/MSP430/serial_lld.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/serial_lld.h - * @brief MSP430 low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief USART0 driver enable switch. - * @details If set to @p TRUE the support for USART0 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_MSP430_USART0) || defined(__DOXYGEN__) -#define USE_MSP430_USART0 TRUE -#endif - -/** - * @brief USART1 driver enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p FALSE. - */ -#if !defined(USE_MSP430_USART1) || defined(__DOXYGEN__) -#define USE_MSP430_USART1 TRUE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief MSP430 Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - */ -typedef struct { - /** - * @brief Initialization value for the UBRx registers. - */ - uint16_t sc_div; - /** - * @brief Initialization value for the MOD register. - */ - uint8_t sc_mod; - /** - * @brief Initialization value for the CTL register. - */ - uint8_t sc_ctl; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Macro for baud rate computation. - * @note Make sure the final baud rate is within tolerance. - */ -#define UBR(b) (SMCLK / (b)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_MSP430_USART0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_MSP430_USART1 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Posix/console.c b/os/hal/platforms/Posix/console.c deleted file mode 100644 index ed62545fbd..0000000000 --- a/os/hal/platforms/Posix/console.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file console.c - * @brief Simulator console driver code. - * @{ - */ - -#include - -#include "ch.h" -#include "console.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief Console driver 1. - */ -BaseChannel CD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - - -static size_t writes(void *ip, const uint8_t *bp, size_t n) { - size_t ret; - - (void)ip; - ret = fwrite(bp, 1, n, stdout); - fflush(stdout); - return ret; -} - -static size_t reads(void *ip, uint8_t *bp, size_t n) { - - (void)ip; - return fread(bp, 1, n, stdin); -} - -static bool_t putwouldblock(void *ip) { - - (void)ip; - return FALSE; -} - -static bool_t getwouldblock(void *ip) { - - (void)ip; - return TRUE; -} - -static msg_t putt(void *ip, uint8_t b, systime_t time) { - - (void)ip; - (void)time; - fputc(b, stdout); - fflush(stdout); - return RDY_OK; -} - -static msg_t gett(void *ip, systime_t time) { - - (void)ip; - (void)time; - return fgetc(stdin); -} - -static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) { - size_t ret; - - (void)ip; - (void)time; - ret = fwrite(bp, 1, n, stdout); - fflush(stdout); - return ret; -} - -static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) { - - (void)ip; - (void)time; - return fread(bp, 1, n, stdin); -} - -static const struct BaseChannelVMT vmt = { - writes, reads, putwouldblock, getwouldblock, putt, gett, writet, readt -}; - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -void conInit(void) { - - CD1.vmt = &vmt; -} - -/** @} */ diff --git a/os/hal/platforms/Posix/console.h b/os/hal/platforms/Posix/console.h deleted file mode 100644 index 557d9189a8..0000000000 --- a/os/hal/platforms/Posix/console.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file console.h - * @brief Simulator console driver header. - * @{ - */ - -#ifndef _CONSOLE_H_ -#define _CONSOLE_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -extern BaseChannel CD1; - -#ifdef __cplusplus -extern "C" { -#endif - void conInit(void); -#ifdef __cplusplus -} -#endif - -#endif /* _CONSOLE_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Posix/hal_lld.c b/os/hal/platforms/Posix/hal_lld.c deleted file mode 100644 index 13d7e8b2d5..0000000000 --- a/os/hal/platforms/Posix/hal_lld.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Posix/hal_lld.c - * @brief Posix HAL subsystem low level driver code. - * - * @addtogroup POSIX_HAL - * @{ - */ - -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -static struct timeval nextcnt; -static struct timeval tick = {0, 1000000 / CH_FREQUENCY}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - */ -void hal_lld_init(void) { - -#if defined(__APPLE__) - puts("ChibiOS/RT simulator (OS X)\n"); -#else - puts("ChibiOS/RT simulator (Linux)\n"); -#endif - gettimeofday(&nextcnt, NULL); - timeradd(&nextcnt, &tick, &nextcnt); -} - -/** - * @brief Interrupt simulation. - */ -void ChkIntSources(void) { - struct timeval tv; - -#if HAL_USE_SERIAL - if (sd_lld_interrupt_pending()) { - dbg_check_lock(); - if (chSchIsPreemptionRequired()) - chSchDoReschedule(); - dbg_check_unlock(); - return; - } -#endif - - gettimeofday(&tv, NULL); - if (timercmp(&tv, &nextcnt, >=)) { - timeradd(&nextcnt, &tick, &nextcnt); - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); - - dbg_check_lock(); - if (chSchIsPreemptionRequired()) - chSchDoReschedule(); - dbg_check_unlock(); - } -} - -/** @} */ diff --git a/os/hal/platforms/Posix/hal_lld.h b/os/hal/platforms/Posix/hal_lld.h deleted file mode 100644 index 5bce2aa134..0000000000 --- a/os/hal/platforms/Posix/hal_lld.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Posix/hal_lld.h - * @brief Posix simulator HAL subsystem low level driver header. - * - * @addtogroup POSIX_HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include -#include -#include - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "Linux" - -#define SOCKET int -#define INVALID_SOCKET -1 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void ChkIntSources(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Posix/pal_lld.c b/os/hal/platforms/Posix/pal_lld.c deleted file mode 100644 index 2c60461b7f..0000000000 --- a/os/hal/platforms/Posix/pal_lld.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Posix/pal_lld.c - * @brief Posix low level simulated PAL driver code. - * - * @addtogroup POSIX_PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief VIO1 simulated port. - */ -sim_vio_port_t vio_port_1; - -/** - * @brief VIO2 simulated port. - */ -sim_vio_port_t vio_port_2; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @note This function is not meant to be invoked directly by the application - * code. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with high - * state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - port->dir &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - port->latch |= mask; - case PAL_MODE_OUTPUT_PUSHPULL: - port->dir |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/Posix/pal_lld.h b/os/hal/platforms/Posix/pal_lld.h deleted file mode 100644 index e840a41ab3..0000000000 --- a/os/hal/platforms/Posix/pal_lld.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Posix/pal_lld.h - * @brief Posix low level simulated PAL driver header. - * - * @addtogroup POSIX_PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_OUTPUT_OPENDRAIN -#undef PAL_MODE_INPUT_ANALOG - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief VIO port structure. - */ -typedef struct { - /** - * @brief VIO_LATCH register. - * @details This register represents the output latch of the VIO port. - */ - uint32_t latch; - /** - * @brief VIO_PIN register. - * @details This register represents the logical level at the VIO port - * pin level. - */ - uint32_t pin; - /** - * @brief VIO_DIR register. - * @details Direction of the VIO port bits, 0=input, 1=output. - */ - uint32_t dir; -} sim_vio_port_t; - -/** - * @brief Virtual I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { - /** - * @brief Virtual port 1 setup data. - */ - sim_vio_port_t VP1Data; - /** - * @brief Virtual port 2 setup data. - */ - sim_vio_port_t VP2Data; -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef sim_vio_port_t *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief VIO port 1 identifier. - */ -#define IOPORT1 (&vio_port_1) - -/** - * @brief VIO port 2 identifier. - */ -#define IOPORT2 (&vio_port_2) - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) \ - (vio_port_1 = (config)->VP1Data, \ - vio_port_2 = (config)->VP2Data) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->pin) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->latch) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->latch = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -#if !defined(__DOXYGEN__) -extern sim_vio_port_t vio_port_1; -extern sim_vio_port_t vio_port_2; -extern const PALConfig pal_default_config; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Posix/platform.mk b/os/hal/platforms/Posix/platform.mk deleted file mode 100644 index e2e3da8219..0000000000 --- a/os/hal/platforms/Posix/platform.mk +++ /dev/null @@ -1,7 +0,0 @@ -# List of all the Posix platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/Posix/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/Posix/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/Posix/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/Posix diff --git a/os/hal/platforms/Posix/serial_lld.c b/os/hal/platforms/Posix/serial_lld.c deleted file mode 100644 index d8c62a0d7a..0000000000 --- a/os/hal/platforms/Posix/serial_lld.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Posix/serial_lld.c - * @brief Posix low level simulated serial driver code. - * - * @addtogroup POSIX_SERIAL - * @{ - */ - -#include -#include -#include -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief Serial driver 1 identifier.*/ -#if USE_SIM_SERIAL1 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif -/** @brief Serial driver 2 identifier.*/ -#if USE_SIM_SERIAL2 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { -}; - -static u_long nb = 1; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void init(SerialDriver *sdp, uint16_t port) { - struct sockaddr_in sad; - struct protoent *prtp; - - if ((prtp = getprotobyname("tcp")) == NULL) { - printf("%s: Error mapping protocol name to protocol number\n", sdp->com_name); - goto abort; - } - - sdp->com_listen = socket(PF_INET, SOCK_STREAM, prtp->p_proto); - if (sdp->com_listen == INVALID_SOCKET) { - printf("%s: Error creating simulator socket\n", sdp->com_name); - goto abort; - } - - if (ioctl(sdp->com_listen, FIONBIO, &nb) != 0) { - printf("%s: Unable to setup non blocking mode on socket\n", sdp->com_name); - goto abort; - } - - memset(&sad, 0, sizeof(sad)); - sad.sin_family = AF_INET; - sad.sin_addr.s_addr = INADDR_ANY; - sad.sin_port = htons(port); - if (bind(sdp->com_listen, (struct sockaddr *)&sad, sizeof(sad))) { - printf("%s: Error binding socket\n", sdp->com_name); - goto abort; - } - - if (listen(sdp->com_listen, 1) != 0) { - printf("%s: Error listening socket\n", sdp->com_name); - goto abort; - } - printf("Full Duplex Channel %s listening on port %d\n", sdp->com_name, port); - return; - -abort: - if (sdp->com_listen != INVALID_SOCKET) - close(sdp->com_listen); - exit(1); -} - -static bool_t connint(SerialDriver *sdp) { - - if (sdp->com_data == INVALID_SOCKET) { - struct sockaddr addr; - socklen_t addrlen = sizeof(addr); - - if ((sdp->com_data = accept(sdp->com_listen, &addr, &addrlen)) == INVALID_SOCKET) - return FALSE; - - if (ioctl(sdp->com_data, FIONBIO, &nb) != 0) { - printf("%s: Unable to setup non blocking mode on data socket\n", sdp->com_name); - goto abort; - } - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_CONNECTED); - chSysUnlockFromIsr(); - return TRUE; - } - return FALSE; -abort: - if (sdp->com_listen != INVALID_SOCKET) - close(sdp->com_listen); - if (sdp->com_data != INVALID_SOCKET) - close(sdp->com_data); - exit(1); -} - -static bool_t inint(SerialDriver *sdp) { - - if (sdp->com_data != INVALID_SOCKET) { - int i; - uint8_t data[32]; - - /* - * Input. - */ - int n = recv(sdp->com_data, data, sizeof(data), 0); - switch (n) { - case 0: - close(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_DISCONNECTED); - chSysUnlockFromIsr(); - return FALSE; - case INVALID_SOCKET: - if (errno == EWOULDBLOCK) - return FALSE; - close(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - return FALSE; - } - for (i = 0; i < n; i++) { - chSysLockFromIsr(); - sdIncomingDataI(sdp, data[i]); - chSysUnlockFromIsr(); - } - return TRUE; - } - return FALSE; -} - -static bool_t outint(SerialDriver *sdp) { - - if (sdp->com_data != INVALID_SOCKET) { - int n; - uint8_t data[1]; - - /* - * Input. - */ - chSysLockFromIsr(); - n = sdRequestDataI(sdp); - chSysUnlockFromIsr(); - if (n < 0) - return FALSE; - data[0] = (uint8_t)n; - n = send(sdp->com_data, data, sizeof(data), 0); - switch (n) { - case 0: - close(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_DISCONNECTED); - chSysUnlockFromIsr(); - return FALSE; - case INVALID_SOCKET: - if (errno == EWOULDBLOCK) - return FALSE; - close(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - return FALSE; - } - return TRUE; - } - return FALSE; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - */ -void sd_lld_init(void) { - -#if USE_SIM_SERIAL1 - sdObjectInit(&SD1, NULL, NULL); - SD1.com_listen = INVALID_SOCKET; - SD1.com_data = INVALID_SOCKET; - SD1.com_name = "SD1"; -#endif - -#if USE_SIM_SERIAL2 - sdObjectInit(&SD2, NULL, NULL); - SD2.com_listen = INVALID_SOCKET; - SD2.com_data = INVALID_SOCKET; - SD2.com_name = "SD2"; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - -#if USE_SIM_SERIAL1 - if (sdp == &SD1) - init(&SD1, SIM_SD1_PORT); -#endif - -#if USE_SIM_SERIAL2 - if (sdp == &SD2) - init(&SD2, SIM_SD2_PORT); -#endif -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -void sd_lld_stop(SerialDriver *sdp) { - - (void)sdp; -} - -bool_t sd_lld_interrupt_pending(void) { - bool_t b; - - CH_IRQ_PROLOGUE(); - - b = connint(&SD1) || connint(&SD2) || - inint(&SD1) || inint(&SD2) || - outint(&SD1) || outint(&SD2); - - CH_IRQ_EPILOGUE(); - - return b; -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/Posix/serial_lld.h b/os/hal/platforms/Posix/serial_lld.h deleted file mode 100644 index 3b1a5bf292..0000000000 --- a/os/hal/platforms/Posix/serial_lld.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Posix/serial_lld.h - * @brief Posix low level simulated serial driver header. - * - * @addtogroup POSIX_SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 1024 -#endif - -/** - * @brief SD1 driver enable switch. - * @details If set to @p TRUE the support for SD1 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SIM_SERIAL1) || defined(__DOXYGEN__) -#define USE_SIM_SERIAL1 TRUE -#endif - -/** - * @brief SD2 driver enable switch. - * @details If set to @p TRUE the support for SD2 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SIM_SERIAL2) || defined(__DOXYGEN__) -#define USE_SIM_SERIAL2 TRUE -#endif - -/** - * @brief Listen port for SD1. - */ -#if !defined(SD1_PORT) || defined(__DOXYGEN__) -#define SIM_SD1_PORT 29001 -#endif - -/** - * @brief Listen port for SD2. - */ -#if !defined(SD2_PORT) || defined(__DOXYGEN__) -#define SIM_SD2_PORT 29002 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Generic Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Listen socket for simulated serial port.*/ \ - SOCKET com_listen; \ - /* Data socket for simulated serial port.*/ \ - SOCKET com_data; \ - /* Port readable name.*/ \ - const char *com_name; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_SIM_SERIAL1 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_SIM_SERIAL2 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); - bool_t sd_lld_interrupt_pending(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/SPC560Pxx/hal_lld.c b/os/hal/platforms/SPC560Pxx/hal_lld.c deleted file mode 100644 index de1467e97b..0000000000 --- a/os/hal/platforms/SPC560Pxx/hal_lld.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/hal_lld.c - * @brief SPC560Pxx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief PIT channel 3 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(vector127) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - /* Resets the PIT channel 3 IRQ flag.*/ - PIT.CH[3].TFLG.R = 1; - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - extern void _vectors(void); - uint32_t reg; - - /* The system is switched to the RUN0 mode, the default for normal - operations.*/ - if (halSPC560PSetRunMode(SPC5_RUNMODE_RUN0) == CH_FAILED) - chSysHalt(); - - /* INTC initialization, software vector mode, 4 bytes vectors, starting - at priority 0.*/ - INTC.MCR.R = 0; - INTC.CPR.R = 0; - INTC.IACKR.R = (uint32_t)_vectors; - - /* PIT channel 3 initialization for Kernel ticks, the PIT is configured - to run in DRUN,RUN0...RUN3 and HALT0 modes, the clock is gated in other - modes.*/ - INTC.PSR[127].R = SPC5_PIT3_IRQ_PRIORITY; - halSPC560PSetPeripheralClockMode(92, - SPC5_ME_PCTL_RUN(2) | SPC5_ME_PCTL_LP(2)); - reg = halSPC560PGetSystemClock() / CH_FREQUENCY - 1; - PIT.PITMCR.R = 1; /* PIT clock enabled, stop while debugging. */ - PIT.CH[3].LDVAL.R = reg; - PIT.CH[3].CVAL.R = reg; - PIT.CH[3].TFLG.R = 1; /* Interrupt flag cleared. */ - PIT.CH[3].TCTRL.R = 3; /* Timer active, interrupt enabled. */ -} - -/** - * @brief SPC560Pxx clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h and - * @p hal_lld.h - * @note This function must be invoked only after the system reset. - * - * @special - */ -void spc560p_clock_init(void) { - - /* Waiting for IRC stabilization before attempting anything else.*/ - while (!ME.GS.B.S_RC) - ; - -#if !SPC5_NO_INIT - -#if defined(SPC5_OSC_BYPASS) - /* If the board is equipped with an oscillator instead of a xtal then the - bypass must be activated.*/ - CGM.OSC_CTL.B.OSCBYP = TRUE; -#endif /* SPC5_ENABLE_XOSC */ - - /* Initialization of the FMPLLs settings.*/ - CGM.FMPLL[0].CR.R = SPC5_FMPLL0_ODF | - ((SPC5_FMPLL0_IDF_VALUE - 1) << 26) | - (SPC5_FMPLL0_NDIV_VALUE << 16); - CGM.FMPLL[0].MR.R = 0; /* TODO: Add a setting. */ - CGM.FMPLL[1].CR.R = SPC5_FMPLL1_ODF | - (SPC5_FMPLL1_IDF_VALUE << 26) | - (SPC5_FMPLL1_NDIV_VALUE << 16); - CGM.FMPLL[1].MR.R = 0; /* TODO: Add a setting. */ - - /* Run modes initialization.*/ - ME.MER.R = SPC5_ME_ME_BITS; /* Enabled run modes. */ - ME.TEST.R = SPC5_ME_TEST_MC_BITS; /* TEST run mode. */ - ME.SAFE.R = SPC5_ME_SAFE_MC_BITS; /* SAFE run mode. */ - ME.DRUN.R = SPC5_ME_DRUN_MC_BITS; /* DRUN run mode. */ - ME.RUN[0].R = SPC5_ME_RUN0_MC_BITS; /* RUN0 run mode. */ - ME.RUN[1].R = SPC5_ME_RUN1_MC_BITS; /* RUN1 run mode. */ - ME.RUN[2].R = SPC5_ME_RUN2_MC_BITS; /* RUN2 run mode. */ - ME.RUN[3].R = SPC5_ME_RUN3_MC_BITS; /* RUN0 run mode. */ - ME.HALT0.R = SPC5_ME_HALT0_MC_BITS; /* HALT0 run mode. */ - ME.STOP0.R = SPC5_ME_STOP0_MC_BITS; /* STOP0 run mode. */ - - /* Peripherals run and low power modes initialization.*/ - ME.RUNPC[0].R = SPC5_ME_RUN_PC0_BITS; - ME.RUNPC[1].R = SPC5_ME_RUN_PC1_BITS; - ME.RUNPC[2].R = SPC5_ME_RUN_PC2_BITS; - ME.RUNPC[3].R = SPC5_ME_RUN_PC3_BITS; - ME.RUNPC[4].R = SPC5_ME_RUN_PC4_BITS; - ME.RUNPC[5].R = SPC5_ME_RUN_PC5_BITS; - ME.RUNPC[6].R = SPC5_ME_RUN_PC6_BITS; - ME.RUNPC[7].R = SPC5_ME_RUN_PC7_BITS; - ME.LPPC[0].R = SPC5_ME_LP_PC0_BITS; - ME.LPPC[1].R = SPC5_ME_LP_PC1_BITS; - ME.LPPC[2].R = SPC5_ME_LP_PC2_BITS; - ME.LPPC[3].R = SPC5_ME_LP_PC3_BITS; - ME.LPPC[4].R = SPC5_ME_LP_PC4_BITS; - ME.LPPC[5].R = SPC5_ME_LP_PC5_BITS; - ME.LPPC[6].R = SPC5_ME_LP_PC6_BITS; - ME.LPPC[7].R = SPC5_ME_LP_PC7_BITS; - - /* Switches again to DRUN mode (current mode) in order to update the - settings.*/ - if (halSPC560PSetRunMode(SPC5_RUNMODE_DRUN) == CH_FAILED) - chSysHalt(); - - /* CFLASH settings calculated for a maximum clock of 64MHz.*/ - CFLASH.PFCR0.B.BK0_APC = 2; - CFLASH.PFCR0.B.BK0_RWSC = 2; - CFLASH.PFCR1.B.BK1_APC = 2; - CFLASH.PFCR1.B.BK1_RWSC = 2; - -#endif /* !SPC5_NO_INIT */ -} - -/** - * @brief Switches the system to the specified run mode. - * - * @param[in] mode one of the possible run modes - * - * @return The operation status. - * @retval CH_SUCCESS if the switch operation has been completed. - * @retval CH_FAILED if the switch operation failed. - */ -bool_t halSPC560PSetRunMode(spc560prunmode_t mode) { - - /* Starts a transition process.*/ - ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY; - ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY_INV; - - /* Waits the transition process to start.*/ - while (!ME.GS.B.S_MTRANS) - ; - - /* Waits the transition process to end.*/ - while (ME.GS.B.S_MTRANS) - ; - - /* Verifies that the mode has been effectively switched.*/ - if (ME.GS.B.S_CURRENTMODE != mode) - return CH_FAILED; - - return CH_SUCCESS; -} - -/** - * @brief Changes the clock mode of a peripheral. - * - * @param[in] n index of the @p PCTL register - * @param[in] pctl new value for the @p PCTL register - * - * @notapi - */ -void halSPC560PSetPeripheralClockMode(uint32_t n, uint32_t pctl) { - uint32_t mode; - - ME.PCTL[n].R = pctl; - mode = ME.MCTL.B.TARGET_MODE; - ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY; - ME.MCTL.R = SPC5_ME_MCTL_MODE(mode) | SPC5_ME_MCTL_KEY_INV; -} - -#if !SPC5_NO_INIT || defined(__DOXYGEN__) -/** - * @brief Returns the system clock under the current run mode. - * - * @return The system clock in Hertz. - */ -uint32_t halSPC560PGetSystemClock(void) { - uint32_t sysclk; - - sysclk = ME.GS.B.S_SYSCLK; - switch (sysclk) { - case SPC5_ME_GS_SYSCLK_IRC: - return SPC5_IRC_CLK; - case SPC5_ME_GS_SYSCLK_XOSC: - return SPC5_XOSC_CLK; - case SPC5_ME_GS_SYSCLK_FMPLL0: - return SPC5_FMPLL0_CLK; - case SPC5_ME_GS_SYSCLK_FMPLL1: - return SPC5_FMPLL1_CLK; - default: - return 0; - } -} -#endif /* !SPC5_NO_INIT */ - -/** @} */ diff --git a/os/hal/platforms/SPC560Pxx/hal_lld.h b/os/hal/platforms/SPC560Pxx/hal_lld.h deleted file mode 100644 index a4e439fe90..0000000000 --- a/os/hal/platforms/SPC560Pxx/hal_lld.h +++ /dev/null @@ -1,735 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/hal_lld.h - * @brief SPC560Pxx HAL subsystem low level driver header. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - SPC5_XOSC_CLK. - * - SPC5_OSC_BYPASS (optionally). - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "xpc560p.h" -#include "spc560p_registry.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @name Platform identification - * @{ - */ -#define PLATFORM_NAME "SPC560Pxx Chassis and Safety" -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Maximum XOSC clock frequency. - */ -#define SPC5_XOSC_CLK_MAX 40000000 - -/** - * @brief Minimum XOSC clock frequency. - */ -#define SPC5_XOSC_CLK_MIN 4000000 - -/** - * @brief Maximum FMPLLs input clock frequency. - */ -#define SPC5_FMPLLIN_MIN 4000000 - -/** - * @brief Maximum FMPLLs input clock frequency. - */ -#define SPC5_FMPLLIN_MAX 16000000 - -/** - * @brief Maximum FMPLLs VCO clock frequency. - */ -#define SPC5_FMPLLVCO_MAX 512000000 - -/** - * @brief Maximum FMPLLs VCO clock frequency. - */ -#define SPC5_FMPLLVCO_MIN 256000000 - -/** - * @brief Maximum FMPLL0 output clock frequency. - */ -#define SPC5_FMPLL0_CLK_MAX 64000000 - -/** - * @brief Maximum FMPLL1 output clock frequency. - */ -#define SPC5_FMPLL1_CLK_MAX 120000000 - -/** - * @brief Maximum FMPLL1 1D1 output clock frequency. - */ -#define SPC5_FMPLL1_1D1_CLK_MAX 80000000 -/** @} */ - -/** - * @name Internal clock sources - * @{ - */ -#define SPC5_IRC_CLK 16000000 /**< Internal RC oscillator.*/ -/** @} */ - -/** - * @name FMPLL_CR register bits definitions - * @{ - */ -#define SPC5_FMPLL_ODF_DIV2 (0U << 24) -#define SPC5_FMPLL_ODF_DIV4 (1U << 24) -#define SPC5_FMPLL_ODF_DIV8 (2U << 24) -#define SPC5_FMPLL_ODF_DIV16 (3U << 24) -/** @} */ - -/** - * @name ME_GS register bits definitions - * @{ - */ -#define SPC5_ME_GS_SYSCLK_MASK (15U << 0) -#define SPC5_ME_GS_SYSCLK_IRC (0U << 0) -#define SPC5_ME_GS_SYSCLK_XOSC (2U << 0) -#define SPC5_ME_GS_SYSCLK_FMPLL0 (4U << 0) -#define SPC5_ME_GS_SYSCLK_FMPLL1 (5U << 0) -/** @} */ - -/** - * @name ME_ME register bits definitions - * @{ - */ -#define SPC5_ME_ME_RESET (1U << 0) -#define SPC5_ME_ME_TEST (2U << 0) -#define SPC5_ME_ME_SAFE (4U << 0) -#define SPC5_ME_ME_DRUN (8U << 0) -#define SPC5_ME_ME_RUN0 (16U << 0) -#define SPC5_ME_ME_RUN1 (32U << 0) -#define SPC5_ME_ME_RUN2 (64U << 0) -#define SPC5_ME_ME_RUN3 (128U << 0) -#define SPC5_ME_ME_HALT0 (256U << 0) -#define SPC5_ME_ME_STOP0 (1024U << 0) -/** @} */ - -/** - * @name ME_xxx_MC registers bits definitions - * @{ - */ -#define SPC5_ME_MC_SYSCLK_MASK (15U << 0) -#define SPC5_ME_MC_SYSCLK(n) ((n) << 0) -#define SPC5_ME_MC_SYSCLK_IRC SPC5_ME_MC_SYSCLK(0) -#define SPC5_ME_MC_SYSCLK_XOSC SPC5_ME_MC_SYSCLK(2) -#define SPC5_ME_MC_SYSCLK_FMPLL0 SPC5_ME_MC_SYSCLK(4) -#define SPC5_ME_MC_SYSCLK_FMPLL1 SPC5_ME_MC_SYSCLK(5) -#define SPC5_ME_MC_SYSCLK_DISABLED SPC5_ME_MC_SYSCLK(15) -#define SPC5_ME_MC_IRCON (1U << 4) -#define SPC5_ME_MC_XOSC0ON (1U << 5) -#define SPC5_ME_MC_PLL0ON (1U << 6) -#define SPC5_ME_MC_PLL1ON (1U << 7) -#define SPC5_ME_MC_CFLAON_MASK (3U << 16) -#define SPC5_ME_MC_CFLAON(n) ((n) << 16) -#define SPC5_ME_MC_CFLAON_PD (1U << 16) -#define SPC5_ME_MC_CFLAON_LP (2U << 16) -#define SPC5_ME_MC_CFLAON_NORMAL (3U << 16) -#define SPC5_ME_MC_DFLAON_MASK (3U << 18) -#define SPC5_ME_MC_DFLAON(n) ((n) << 18) -#define SPC5_ME_MC_DFLAON_PD (1U << 18) -#define SPC5_ME_MC_DFLAON_LP (2U << 18) -#define SPC5_ME_MC_DFLAON_NORMAL (3U << 18) -#define SPC5_ME_MC_MVRON (1U << 20) -#define SPC5_ME_MC_PDO (1U << 23) -/** @} */ - -/** - * @name ME_MCTL register bits definitions - * @{ - */ -#define SPC5_ME_MCTL_KEY 0x5AF0U -#define SPC5_ME_MCTL_KEY_INV 0xA50FU -#define SPC5_ME_MCTL_MODE_MASK (15U << 28) -#define SPC5_ME_MCTL_MODE(n) ((n) << 28) -/** @} */ - -/** - * @name ME_RUN_PCx registers bits definitions - * @{ - */ -#define SPC5_ME_RUN_PC_TEST (1U << 1) -#define SPC5_ME_RUN_PC_SAFE (1U << 2) -#define SPC5_ME_RUN_PC_DRUN (1U << 3) -#define SPC5_ME_RUN_PC_RUN0 (1U << 4) -#define SPC5_ME_RUN_PC_RUN1 (1U << 5) -#define SPC5_ME_RUN_PC_RUN2 (1U << 6) -#define SPC5_ME_RUN_PC_RUN3 (1U << 7) -/** @} */ - -/** - * @name ME_LP_PCx registers bits definitions - * @{ - */ -#define SPC5_ME_LP_PC_HALT0 (1U << 8) -#define SPC5_ME_LP_PC_STOP0 (1U << 10) -/** @} */ - -/** - * @name ME_PCTL registers bits definitions - * @{ - */ -#define SPC5_ME_PCTL_RUN_MASK (7U << 0) -#define SPC5_ME_PCTL_RUN(n) ((n) << 0) -#define SPC5_ME_PCTL_LP_MASK (7U << 3) -#define SPC5_ME_PCTL_LP(n) ((n) << 3) -#define SPC5_ME_PCTL_DBG (1U << 6) -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Disables the clocks initialization in the HAL. - */ -#if !defined(SPC5_NO_INIT) || defined(__DOXYGEN__) -#define SPC5_NO_INIT FALSE -#endif - -/** - * @brief Disables the overclock checks. - */ -#if !defined(SPC5_ALLOW_OVERCLOCK) || defined(__DOXYGEN__) -#define SPC5_ALLOW_OVERCLOCK FALSE -#endif - -/** - * @brief FMPLL0 IDF divider value. - * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. - */ -#if !defined(SPC5_FMPLL0_IDF_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL0_IDF_VALUE 5 -#endif - -/** - * @brief FMPLL0 NDIV divider value. - * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. - */ -#if !defined(SPC5_FMPLL0_NDIV_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL0_NDIV_VALUE 32 -#endif - -/** - * @brief FMPLL0 ODF divider value. - * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. - */ -#if !defined(SPC5_FMPLL0_ODF) || defined(__DOXYGEN__) -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#endif - -/** - * @brief FMPLL1 IDF divider value. - * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. - */ -#if !defined(SPC5_FMPLL1_IDF_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL1_IDF_VALUE 5 -#endif - -/** - * @brief FMPLL1 NDIV divider value. - * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. - */ -#if !defined(SPC5_FMPLL1_NDIV_VALUE) || defined(__DOXYGEN__) -#define SPC5_FMPLL1_NDIV_VALUE 60 -#endif - -/** - * @brief FMPLL1 ODF divider value. - * @note The default value is calculated for XOSC=40MHz and PHI=64MHz. - */ -#if !defined(SPC5_FMPLL1_ODF) || defined(__DOXYGEN__) -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#endif - -/** - * @brief Active run modes in ME_ME register. - * @note Modes RESET, SAFE, DRUN, and RUN0 modes are always enabled, there - * is no need to specify them. - */ -#if !defined(SPC5_ME_ME_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#endif - -/** - * @brief TEST mode settings. - */ -#if !defined(SPC5_ME_TEST_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief SAFE mode settings. - */ -#if !defined(SPC5_ME_SAFE_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#endif - -/** - * @brief DRUN mode settings. - */ -#if !defined(SPC5_ME_DRUN_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief RUN0 mode settings. - */ -#if !defined(SPC5_ME_RUN0_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief RUN1 mode settings. - */ -#if !defined(SPC5_ME_RUN1_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief RUN2 mode settings. - */ -#if !defined(SPC5_ME_RUN2_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief RUN3 mode settings. - */ -#if !defined(SPC5_ME_RUN3_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief HALT0 mode settings. - */ -#if !defined(SPC5_ME_HALT0_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief STOP0 mode settings. - */ -#if !defined(SPC5_ME_STOP0_MC_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#endif - -/** - * @brief Peripheral mode 0 (run mode). - * @note Do not change this setting, it is expected to be the "never run" - * mode. - */ -#if !defined(SPC5_ME_RUN_PC0_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC0_BITS 0 -#endif - -/** - * @brief Peripheral mode 1 (run mode). - * @note Do not change this setting, it is expected to be the "always run" - * mode. - */ -#if !defined(SPC5_ME_RUN_PC1_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC1_BITS (SPC5_ME_RUN_PC_TEST | \ - SPC5_ME_RUN_PC_SAFE | \ - SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 2 (run mode). - * @note Do not change this setting, it is expected to be the "only during - * normal run" mode. - */ -#if !defined(SPC5_ME_RUN_PC2_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC2_BITS (SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 3 (run mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_RUN_PC3_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 4 (run mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_RUN_PC4_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 5 (run mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_RUN_PC5_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 6 (run mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_RUN_PC6_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 7 (run mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_RUN_PC7_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#endif - -/** - * @brief Peripheral mode 0 (low power mode). - * @note Do not change this setting, it is expected to be the "never run" - * mode. - */ -#if !defined(SPC5_ME_LP_PC0_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC0_BITS 0 -#endif - -/** - * @brief Peripheral mode 1 (low power mode). - * @note Do not change this setting, it is expected to be the "always run" - * mode. - */ -#if !defined(SPC5_ME_LP_PC1_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC1_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#endif - -/** - * @brief Peripheral mode 2 (low power mode). - * @note Do not change this setting, it is expected to be the "halt only" - * mode. - */ -#if !defined(SPC5_ME_LP_PC2_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC2_BITS (SPC5_ME_LP_PC_HALT0) -#endif - -/** - * @brief Peripheral mode 3 (low power mode). - * @note Do not change this setting, it is expected to be the "stop only" - * mode. - */ -#if !defined(SPC5_ME_LP_PC3_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC3_BITS (SPC5_ME_LP_PC_STOP0) -#endif - -/** - * @brief Peripheral mode 4 (low power mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_LP_PC4_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#endif - -/** - * @brief Peripheral mode 5 (low power mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_LP_PC5_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#endif - -/** - * @brief Peripheral mode 6 (low power mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_LP_PC6_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#endif - -/** - * @brief Peripheral mode 7 (low power mode). - * @note Not defined, available to application-specific modes. - */ -#if !defined(SPC5_ME_LP_PC7_BITS) || defined(__DOXYGEN__) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#endif - -/** - * @brief PIT channel 3 IRQ priority. - * @note This PIT channel is allocated permanently for system tick - * generation. - */ -#if !defined(SPC5_PIT3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define SPC5_PIT3_IRQ_PRIORITY 4 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* Check on the XOSC frequency.*/ -#if (SPC5_XOSC_CLK < SPC5_XOSC_CLK_MIN) || \ - (SPC5_XOSC_CLK > SPC5_XOSC_CLK_MAX) -#error "invalid SPC5_XOSC_CLK value specified" -#endif - -/* Check on SPC5_FMPLL0_IDF_VALUE.*/ -#if (SPC5_FMPLL0_IDF_VALUE < 1) || (SPC5_FMPLL0_IDF_VALUE > 15) -#error "invalid SPC5_FMPLL0_IDF_VALUE value specified" -#endif - -/* Check on SPC5_FMPLL0_NDIV_VALUE.*/ -#if (SPC5_FMPLL0_NDIV_VALUE < 32) || (SPC5_FMPLL0_NDIV_VALUE > 96) -#error "invalid SPC5_FMPLL0_NDIV_VALUE value specified" -#endif - -/* Check on SPC5_FMPLL0_ODF.*/ -#if (SPC5_FMPLL0_ODF == SPC5_FMPLL_ODF_DIV2) -#define SPC5_FMPLL0_ODF_VALUE 2 -#elif (SPC5_FMPLL0_ODF == SPC5_FMPLL_ODF_DIV4) -#define SPC5_FMPLL0_ODF_VALUE 4 -#elif (SPC5_FMPLL0_ODF == SPC5_FMPLL_ODF_DIV8) -#define SPC5_FMPLL0_ODF_VALUE 8 -#elif (SPC5_FMPLL0_ODF == SPC5_FMPLL_ODF_DIV16) -#define SPC5_FMPLL0_ODF_VALUE 16 -#else -#error "invalid SPC5_FMPLL0_ODF value specified" -#endif - -/** - * @brief SPC5_FMPLL0_VCO_CLK clock point. - */ -#define SPC5_FMPLL0_VCO_CLK \ - ((SPC5_XOSC_CLK / SPC5_FMPLL0_IDF_VALUE) * SPC5_FMPLL0_NDIV_VALUE) - -/* Check on FMPLL0 VCO output.*/ -#if (SPC5_FMPLL0_VCO_CLK < SPC5_FMPLLVCO_MIN) || \ - (SPC5_FMPLL0_VCO_CLK > SPC5_FMPLLVCO_MAX) -#error "SPC5_FMPLL0_CLK outside acceptable range (SPC5_FMPLLVCO_MIN...SPC5_FMPLLVCO_MAX)" -#endif - -/** - * @brief SPC5_FMPLL0_CLK clock point. - */ -#define SPC5_FMPLL0_CLK \ - (SPC5_FMPLL0_VCO_CLK / SPC5_FMPLL0_ODF_VALUE) - -/* Check on SPC5_FMPLL0_CLK.*/ -#if (SPC5_FMPLL0_CLK > SPC5_FMPLL0_CLK_MAX) && !SPC5_ALLOW_OVERCLOCK -#error "SPC5_FMPLL0_CLK outside acceptable range (0...SPC5_FMPLL0_CLK_MAX)" -#endif - -/* Check on SPC5_FMPLL1_IDF_VALUE.*/ -#if (SPC5_FMPLL1_IDF_VALUE < 1) || (SPC5_FMPLL1_IDF_VALUE > 15) -#error "invalid SPC5_FMPLL1_IDF_VALUE value specified" -#endif - -/* Check on SPC5_FMPLL1_NDIV_VALUE.*/ -#if (SPC5_FMPLL1_NDIV_VALUE < 32) || (SPC5_FMPLL1_NDIV_VALUE > 96) -#error "invalid SPC5_FMPLL1_NDIV_VALUE value specified" -#endif - -/* Check on SPC5_FMPLL1_ODF.*/ -#if (SPC5_FMPLL1_ODF == SPC5_FMPLL_ODF_DIV2) -#define SPC5_FMPLL1_ODF_VALUE 2 -#elif (SPC5_FMPLL1_ODF == SPC5_FMPLL_ODF_DIV4) -#define SPC5_FMPLL1_ODF_VALUE 4 -#elif (SPC5_FMPLL1_ODF == SPC5_FMPLL_ODF_DIV8) -#define SPC5_FMPLL1_ODF_VALUE 8 -#elif (SPC5_FMPLL1_ODF == SPC5_FMPLL_ODF_DIV16) -#define SPC5_FMPLL1_ODF_VALUE 16 -#else -#error "invalid SPC5_FMPLL1_ODF value specified" -#endif - -/** - * @brief SPC5_FMPLL1_VCO_CLK clock point. - */ -#define SPC5_FMPLL1_VCO_CLK \ - ((SPC5_XOSC_CLK / SPC5_FMPLL1_IDF_VALUE) * SPC5_FMPLL1_NDIV_VALUE) - -/* Check on FMPLL1 VCO output.*/ -#if (SPC5_FMPLL1_VCO_CLK < SPC5_FMPLLVCO_MIN) || \ - (SPC5_FMPLL1_VCO_CLK > SPC5_FMPLLVCO_MAX) -#error "SPC5_FMPLL1_CLK outside acceptable range (SPC5_FMPLLVCO_MIN...SPC5_FMPLLVCO_MAX)" -#endif - -/** - * @brief SPC5_FMPLL1_CLK clock point. - */ -#define SPC5_FMPLL1_CLK \ - (SPC5_FMPLL1_VCO_CLK / SPC5_FMPLL1_ODF_VALUE) - -/* Check on SPC5_FMPLL1_CLK.*/ -#if (SPC5_FMPLL1_CLK > SPC5_FMPLL1_CLK_MAX) && !SPC5_ALLOW_OVERCLOCK -#error "SPC5_FMPLL1_CLK outside acceptable range (0...SPC5_FMPLL1_CLK_MAX)" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -typedef enum { - SPC5_RUNMODE_TEST = 1, - SPC5_RUNMODE_SAFE = 2, - SPC5_RUNMODE_DRUN = 3, - SPC5_RUNMODE_RUN0 = 4, - SPC5_RUNMODE_RUN1 = 5, - SPC5_RUNMODE_RUN2 = 6, - SPC5_RUNMODE_RUN3 = 7, - SPC5_RUNMODE_HALT0 = 8, - SPC5_RUNMODE_STOP0 = 10 -} spc560prunmode_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void spc560p_clock_init(void); - bool_t halSPC560PSetRunMode(spc560prunmode_t mode); - void halSPC560PSetPeripheralClockMode(uint32_t n, uint32_t pctl); -#if !SPC5_NO_INIT - uint32_t halSPC560PGetSystemClock(void); -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/SPC560Pxx/platform.mk b/os/hal/platforms/SPC560Pxx/platform.mk deleted file mode 100644 index 53b94c39dc..0000000000 --- a/os/hal/platforms/SPC560Pxx/platform.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the SPC560Pxx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/SPC560Pxx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/SPC560Pxx \ - ${CHIBIOS}/os/hal/platforms/SPC5xx/SIUL_v1 \ - ${CHIBIOS}/os/hal/platforms/SPC5xx/LINFlex_v1 diff --git a/os/hal/platforms/SPC560Pxx/spc560p_registry.h b/os/hal/platforms/SPC560Pxx/spc560p_registry.h deleted file mode 100644 index 46b7785faf..0000000000 --- a/os/hal/platforms/SPC560Pxx/spc560p_registry.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/spc560p_registry.h - * @brief SPC560Pxx capabilities registry. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _SPC560P_REGISTRY_H_ -#define _SPC560P_REGISTRY_H_ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name SPC560Pxx capabilities - * @{ - */ -/* LINFlex attributes.*/ -#define SPC5_HAS_LINFLEX0 TRUE -#define SPC5_LINFLEX0_PCTL 48 -#define SPC5_LINFLEX0_RXI_HANDLER vector79 -#define SPC5_LINFLEX0_TXI_HANDLER vector80 -#define SPC5_LINFLEX0_ERR_HANDLER vector81 -#define SPC5_LINFLEX0_RXI_NUMBER 79 -#define SPC5_LINFLEX0_TXI_NUMBER 80 -#define SPC5_LINFLEX0_ERR_NUMBER 81 - -#define SPC5_HAS_LINFLEX1 TRUE -#define SPC5_LINFLEX1_PCTL 49 -#define SPC5_LINFLEX1_RXI_HANDLER vector99 -#define SPC5_LINFLEX1_TXI_HANDLER vector100 -#define SPC5_LINFLEX1_ERR_HANDLER vector101 -#define SPC5_LINFLEX1_RXI_NUMBER 99 -#define SPC5_LINFLEX1_TXI_NUMBER 100 -#define SPC5_LINFLEX1_ERR_NUMBER 101 - -#define SPC5_HAS_LINFLEX2 FALSE - -#define SPC5_HAS_LINFLEX3 FALSE - -/* SIU/SIUL attributes.*/ -#define SPC5_HAS_SIU FALSE -#define SPC5_SIU_SUPPORTS_PORTS TRUE -#define SPC5_SIU_NUM_PORTS 4 -#define SPC5_SIU_NUM_PCRS 108 -#define SPC5_SIU_NUM_PADSELS 36 -/** @} */ - -#endif /* _SPC560P_REGISTRY_H_ */ - -/** @} */ diff --git a/os/hal/platforms/SPC560Pxx/typedefs.h b/os/hal/platforms/SPC560Pxx/typedefs.h deleted file mode 100644 index a447699123..0000000000 --- a/os/hal/platforms/SPC560Pxx/typedefs.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/typedefs.h - * @brief Dummy typedefs file. - */ - -#ifndef _TYPEDEFS_H_ -#define _TYPEDEFS_H_ - -#include "chtypes.h" - -#endif /* _TYPEDEFS_H_ */ diff --git a/os/hal/platforms/SPC560Pxx/xpc560p.h b/os/hal/platforms/SPC560Pxx/xpc560p.h deleted file mode 100644 index 2703b3c91c..0000000000 --- a/os/hal/platforms/SPC560Pxx/xpc560p.h +++ /dev/null @@ -1,7802 +0,0 @@ -/***************************************************************** - * PROJECT : MPC5604P - * FILE : 5604P_Header_v1_10.h - * - * DESCRIPTION : This is the header file describing the register - * set for the named projects. - * - * COPYRIGHT :(c) 2012, Freescale - * - * VERSION : 01.10 - * DATE : 12.06.2012 - * AUTHOR : B16991 - * HISTORY : Changes: typo fixed in PSR1 register:SCP -> CSP, MCR: PRESCALE->BITRATE (b16991) - * HISTORY : Changes: typo fixed in ME register MTC bit, SSCM fix, CMU changes(b16991) - * HISTORY : Changes to CTU Module: CR register (LC->FC), CLR changed to 24 bits (b16991) - - * HISTORY : Modified to add reserved space in CTU (b16991) - * HISTORY : Modified to support ADC on Pictus cut 2 - do not distribute! (ttz778) - * HISTORY : Modified to support CRC on Pictus cut 2 - do not distribute! (r60321) - * HISTORY : Modified to support DSPI0 CS7&8 and new FlexPWM naming on Pictus cut 2 (r60321) - * HISTORY : Modified to update MIDR1&2 registers and LINCR1-SFTM and LINESR-BDEF bit on Pictus (r60321) - * HISTORY : Modified to update RGM, CFLASH & DFLASH registers and FlexCAN & CTU Registers on Pictus (r60321) - * HISTORY : Modified to update DSPI Registers (FIFO deep) on Pictus (b16991) - * - ***************************************************************** - * Copyright: - * Freescale Semiconductor, INC. All Rights Reserved. - * You are hereby granted a copyright license to use, modify, and - * distribute the SOFTWARE so long as this entire notice is - * retained without alteration in any modified and/or redistributed - * versions, and that such modified versions are clearly identified - * as such. No licenses are granted by implication, estoppel or - * otherwise under any patents or trademarks of Freescale - * Semiconductor, Inc. This software is provided on an "AS IS" - * basis and without warranty. - * - * To the maximum extent permitted by applicable law, Freescale - * Semiconductor DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, - * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A - * PARTICULAR PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH - * REGARD TO THE SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) - * AND ANY ACCOMPANYING WRITTEN MATERIALS. - * - * To the maximum extent permitted by applicable law, IN NO EVENT - * SHALL Freescale Semiconductor BE LIABLE FOR ANY DAMAGES WHATSOEVER - * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, - * BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER - * PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. - * - * Freescale Semiconductor assumes no responsibility for the - * maintenance and support of this software - * - ******************************************************************/ -/***************************************************************** -* Example instantiation and use: -* -* ..B. = 1; -* ..R = 0x10000000; -* -******************************************************************/ - -#ifndef _JDP_H_ -#define _JDP_H_ - -#include "typedefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __MWERKS__ -#pragma push -#pragma ANSI_strict off -#endif -/****************************************************************************/ -/* MODULE : ADC */ -/****************************************************************************/ - struct ADC_tag { - - union { - vuint32_t R; - struct { - vuint32_t OWREN:1; - vuint32_t WLSIDE:1; - vuint32_t MODE:1; - vuint32_t EDGLEV:1; - vuint32_t TRGEN:1; - vuint32_t EDGE:1; - vuint32_t XSTRTEN:1; - vuint32_t NSTART:1; - vuint32_t:1; - vuint32_t JTRGEN:1; - vuint32_t JEDGE:1; - vuint32_t JSTART:1; - vuint32_t:2; - vuint32_t CTUEN:1; - vuint32_t:8; - vuint32_t ADCLKSEL:1; - vuint32_t ABORTCHAIN:1; - vuint32_t ABORT:1; - vuint32_t ACK0:1; - vuint32_t OFFREFRESH:1; - vuint32_t OFFCANC:1; - vuint32_t:2; - vuint32_t PWDN:1; - } B; - } MCR; /* MAIN CONFIGURATION REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t:7; - vuint32_t NSTART:1; - vuint32_t JABORT:1; - vuint32_t:2; - vuint32_t JSTART:1; - vuint32_t:3; - vuint32_t CTUSTART:1; - vuint32_t CHADDR:7; - vuint32_t:3; - vuint32_t ACK0:1; - vuint32_t OFFREFRESH:1; - vuint32_t OFFCANC:1; - vuint32_t ADCSTATUS:3; - } B; - } MSR; /* MAIN STATUS REGISTER */ - - int32_t ADC_reserved1[2]; /* (0x008 - 0x00F)/4 = 0x02 */ - - union { - vuint32_t R; - struct { - vuint32_t:25; - vuint32_t OFFCANCOVR:1; - vuint32_t EOFFSET:1; - vuint32_t EOCTU:1; - vuint32_t JEOC:1; - vuint32_t JECH:1; - vuint32_t EOC:1; - vuint32_t ECH:1; - } B; - } ISR; /* INTERRUPT STATUS REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t EOC31:1; - vuint32_t EOC30:1; - vuint32_t EOC29:1; - vuint32_t EOC28:1; - vuint32_t EOC27:1; - vuint32_t EOC26:1; - vuint32_t EOC25:1; - vuint32_t EOC24:1; - vuint32_t EOC23:1; - vuint32_t EOC22:1; - vuint32_t EOC21:1; - vuint32_t EOC20:1; - vuint32_t EOC19:1; - vuint32_t EOC18:1; - vuint32_t EOC17:1; - vuint32_t EOC16:1; - vuint32_t EOC15:1; - vuint32_t EOC14:1; - vuint32_t EOC13:1; - vuint32_t EOC12:1; - vuint32_t EOC11:1; - vuint32_t EOC10:1; - vuint32_t EOC9:1; - vuint32_t EOC8:1; - vuint32_t EOC7:1; - vuint32_t EOC6:1; - vuint32_t EOC5:1; - vuint32_t EOC4:1; - vuint32_t EOC3:1; - vuint32_t EOC2:1; - vuint32_t EOC1:1; - vuint32_t EOC0:1; - } B; - } CEOCFR[3]; /* Channel Pending Register 0 */ - - union { - vuint32_t R; - struct { - vuint32_t:25; //One bit added - vuint32_t MSKOFFCANCOVR:1; //Moved up - vuint32_t MSKEOFFSET:1; //Moved up - vuint32_t MSKEOCTU:1; //New for cut 2 - vuint32_t MSKJEOC:1; - vuint32_t MSKJECH:1; - vuint32_t MSKEOC:1; - vuint32_t MSKECH:1; - } B; - } IMR; /* INTERRUPT MASK REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t CIM31:1; - vuint32_t CIM30:1; - vuint32_t CIM29:1; - vuint32_t CIM28:1; - vuint32_t CIM27:1; - vuint32_t CIM26:1; - vuint32_t CIM25:1; - vuint32_t CIM24:1; - vuint32_t CIM23:1; - vuint32_t CIM22:1; - vuint32_t CIM21:1; - vuint32_t CIM20:1; - vuint32_t CIM19:1; - vuint32_t CIM18:1; - vuint32_t CIM17:1; - vuint32_t CIM16:1; - vuint32_t CIM15:1; - vuint32_t CIM14:1; - vuint32_t CIM13:1; - vuint32_t CIM12:1; - vuint32_t CIM11:1; - vuint32_t CIM10:1; - vuint32_t CIM9:1; - vuint32_t CIM8:1; - vuint32_t CIM7:1; - vuint32_t CIM6:1; - vuint32_t CIM5:1; - vuint32_t CIM4:1; - vuint32_t CIM3:1; - vuint32_t CIM2:1; - vuint32_t CIM1:1; - vuint32_t CIM0:1; - } B; - } CIMR[3]; /* Channel Interrupt Mask Register 0 */ - - union { - vuint32_t R; - struct { - vuint32_t:24; - vuint32_t WDG3H:1; - vuint32_t WDG2H:1; - vuint32_t WDG1H:1; - vuint32_t WDG0H:1; - vuint32_t WDG3L:1; - vuint32_t WDG2L:1; - vuint32_t WDG1L:1; - vuint32_t WDG0L:1; - } B; - } WTISR; /* WATCHDOG INTERRUPT THRESHOLD REGISTER was WDGTHR */ - - union { - vuint32_t R; - struct { - vuint32_t:24; - vuint32_t MSKWDG3H:1; - vuint32_t MSKWDG2H:1; - vuint32_t MSKWDG1H:1; - vuint32_t MSKWDG0H:1; - vuint32_t MSKWDG3L:1; - vuint32_t MSKWDG2L:1; - vuint32_t MSKWDG1L:1; - vuint32_t MSKWDG0L:1; - } B; - } WTIMR; /* WATCHDOG INTERRUPT MASK REGISTER was IMWDGTHR */ - - int32_t ADC_reserved2[2]; /* (0x038 - 0x03F)/4 = 0x02 */ - - union { - vuint32_t R; - struct { - vuint32_t:30; //was 16 - vuint32_t DCLR:1; //moved - vuint32_t DMAEN:1; //moved - } B; - } DMAE; /* DMAE REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t DMA31:1; //was unused [16] - vuint32_t DMA30:1; - vuint32_t DMA29:1; - vuint32_t DMA28:1; - vuint32_t DMA27:1; - vuint32_t DMA26:1; - vuint32_t DMA25:1; - vuint32_t DMA24:1; - vuint32_t DMA23:1; - vuint32_t DMA22:1; - vuint32_t DMA21:1; - vuint32_t DMA20:1; - vuint32_t DMA19:1; - vuint32_t DMA18:1; - vuint32_t DMA17:1; - vuint32_t DMA16:1; - vuint32_t DMA15:1; - vuint32_t DMA14:1; - vuint32_t DMA13:1; - vuint32_t DMA12:1; - vuint32_t DMA11:1; - vuint32_t DMA10:1; - vuint32_t DMA9:1; - vuint32_t DMA8:1; - vuint32_t DMA7:1; - vuint32_t DMA6:1; - vuint32_t DMA5:1; - vuint32_t DMA4:1; - vuint32_t DMA3:1; - vuint32_t DMA2:1; - vuint32_t DMA1:1; - vuint32_t DMA0:1; - } B; - } DMAR[3]; /* DMA REGISTER was [6] */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t THREN:1; - vuint32_t THRINV:1; - vuint32_t THROP:1; - vuint32_t:6; - vuint32_t THRCH:7; - } B; - } TRC[4]; /* ADC THRESHOLD REGISTER REGISTER */ - - union { - vuint32_t R; - struct { //were in TRA & TRB - vuint32_t:4; - vuint32_t THRH:12; - vuint32_t:4; - vuint32_t THRL:12; - } B; - } THRHLR[4]; /* THRESHOLD REGISTER */ - - union { - vuint32_t R; - struct { //were in TRAALT & TRBALT - vuint32_t:4; - vuint32_t THRH:12; - vuint32_t:4; - vuint32_t THRL:12; - } B; - } THRALT[4]; /* ADC THRESHOLD REGISTER REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t:25; //was 26 - vuint32_t PREVAL2:2; - vuint32_t PREVAL1:2; - vuint32_t PREVAL0:2; - vuint32_t PREONCE:1; - } B; - } PSCR; /* PRESAMPLING CONTROL REGISTER was PREREG */ - - union { - vuint32_t R; - struct { - vuint32_t PRES31:1; //was reserved 16 - vuint32_t PRES30:1; - vuint32_t PRES29:1; - vuint32_t PRES28:1; - vuint32_t PRES27:1; - vuint32_t PRES26:1; - vuint32_t PRES25:1; - vuint32_t PRES24:1; - vuint32_t PRES23:1; - vuint32_t PRES22:1; - vuint32_t PRES21:1; - vuint32_t PRES20:1; - vuint32_t PRES19:1; - vuint32_t PRES18:1; - vuint32_t PRES17:1; - vuint32_t PRES16:1; - vuint32_t PRES15:1; - vuint32_t PRES14:1; - vuint32_t PRES13:1; - vuint32_t PRES12:1; - vuint32_t PRES11:1; - vuint32_t PRES10:1; - vuint32_t PRES9:1; - vuint32_t PRES8:1; - vuint32_t PRES7:1; - vuint32_t PRES6:1; - vuint32_t PRES5:1; - vuint32_t PRES4:1; - vuint32_t PRES3:1; - vuint32_t PRES2:1; - vuint32_t PRES1:1; - vuint32_t PRES0:1; - } B; - } PSR[3]; /* PRESAMPLING REGISTER was PRER[6]*/ - - int32_t ADC_reserved3[1]; /* (0x090 - 0x093)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t INPLATCH:1; - vuint32_t:1; - vuint32_t OFFSHIFT:2; //!!! This field only in CTR[0] - vuint32_t:1; - vuint32_t INPCMP:2; - vuint32_t:1; - vuint32_t INPSAMP:8; - } B; - } CTR[3]; /* CONVERSION TIMING REGISTER was CT[3] */ - - int32_t ADC_reserved4[1]; /* (0x0A0 - 0x0A3)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t CH31:1; //was reserved 16 - vuint32_t CH30:1; - vuint32_t CH29:1; - vuint32_t CH28:1; - vuint32_t CH27:1; - vuint32_t CH26:1; - vuint32_t CH25:1; - vuint32_t CH24:1; - vuint32_t CH23:1; - vuint32_t CH22:1; - vuint32_t CH21:1; - vuint32_t CH20:1; - vuint32_t CH19:1; - vuint32_t CH18:1; - vuint32_t CH17:1; - vuint32_t CH16:1; - vuint32_t CH15:1; - vuint32_t CH14:1; - vuint32_t CH13:1; - vuint32_t CH12:1; - vuint32_t CH11:1; - vuint32_t CH10:1; - vuint32_t CH9:1; - vuint32_t CH8:1; - vuint32_t CH7:1; - vuint32_t CH6:1; - vuint32_t CH5:1; - vuint32_t CH4:1; - vuint32_t CH3:1; - vuint32_t CH2:1; - vuint32_t CH1:1; - vuint32_t CH0:1; - } B; - } NCMR[3]; /* NORMAL CONVERSION MASK REGISTER was [6] */ - - int32_t ADC_reserved5[1]; /* (0x0B0 - 0x0B3)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t CH31:1; //was reserved 16 - vuint32_t CH30:1; - vuint32_t CH29:1; - vuint32_t CH28:1; - vuint32_t CH27:1; - vuint32_t CH26:1; - vuint32_t CH25:1; - vuint32_t CH24:1; - vuint32_t CH23:1; - vuint32_t CH22:1; - vuint32_t CH21:1; - vuint32_t CH20:1; - vuint32_t CH19:1; - vuint32_t CH18:1; - vuint32_t CH17:1; - vuint32_t CH16:1; - vuint32_t CH15:1; - vuint32_t CH14:1; - vuint32_t CH13:1; - vuint32_t CH12:1; - vuint32_t CH11:1; - vuint32_t CH10:1; - vuint32_t CH9:1; - vuint32_t CH8:1; - vuint32_t CH7:1; - vuint32_t CH6:1; - vuint32_t CH5:1; - vuint32_t CH4:1; - vuint32_t CH3:1; - vuint32_t CH2:1; - vuint32_t CH1:1; - vuint32_t CH0:1; - } B; - } JCMR[3]; /* Injected CONVERSION MASK REGISTER was ICMR[6] */ - - union { - vuint32_t R; - struct { - vuint32_t:15; - vuint32_t OFFSETLOAD:1; //new - vuint32_t:8; - vuint32_t OFFSETWORD:8; - } B; - } OFFWR; /* OFFSET WORD REGISTER was OFFREG*/ - - union { - vuint32_t R; - struct { - vuint32_t:24; - vuint32_t DSD:8; - } B; - } DSDR; /* DECODE SIGNALS DELAY REGISTER was DSD */ - - union { - vuint32_t R; - struct { - vuint32_t:24; - vuint32_t PDED:8; //was PDD - } B; - } PDEDR; /* POWER DOWN DELAY REGISTER was PDD */ - - int32_t ADC_reserved6[9]; /* (0x0CC - 0x0EF)/4 = 0x09 */ - - union { - vuint32_t R; - struct { - vuint32_t TEST_CTL:32; - } B; - } TCTLR; /* Test control REGISTER */ - - int32_t ADC_reserved7[3]; /* (0x0F4 - 0x0FF)/4 = 0x03 */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t VALID:1; - vuint32_t OVERW:1; - vuint32_t RESULT:2; - vuint32_t:4; - vuint32_t CDATA:12; - } B; - } CDR[96]; /* Channel 0-95 Data REGISTER */ - - }; /* end of ADC_tag */ -/****************************************************************************/ -/* MODULE : CANSP */ -/****************************************************************************/ - struct CANSP_tag { - union { - vuint16_t R; - struct { - vuint16_t RX_COMPLETE:1; - vuint16_t BUSY:1; - vuint16_t ACTIVE_CK:1; - vuint16_t:3; - vuint16_t MODE:1; - vuint16_t CAN_RX_SEL:3; - vuint16_t BRP:5; - vuint16_t CAN_SMPLR_EN:1; - } B; - } CR; /* CANSP Control Register */ - - int16_t CANSP_reserved; - - union { - vuint32_t R; - } SR[12]; /* CANSP Sample Register 0 to 11 */ - - }; /* end of CANSP_tag */ -/****************************************************************************/ -/* MODULE : MCM */ -/****************************************************************************/ - struct MCM_tag { - - union { - vuint16_t R; - } PCT; /* MCM Processor Core Type Register */ - - union { - vuint16_t R; - } REV; /* MCM Revision Register */ - - int32_t MCM_reserved; - - union { - vuint32_t R; - } MC; /* MCM Configuration Register */ - - int8_t MCM_reserved1[3]; - - union { - vuint8_t R; - struct { - vuint8_t POR:1; - vuint8_t DIR:1; - vuint8_t:6; - } B; - } MRSR; /* MCM Miscellaneous Reset Status Register */ - - int8_t MCM_reserved2[3]; - - union { - vuint8_t R; - struct { - vuint8_t ENBWCR:1; - vuint8_t:3; - vuint8_t PRILVL:4; - } B; - } MWCR; /* MCM Miscellaneous Wakeup Control Register */ - - int32_t MCM_reserved3[2]; - int8_t MCM_reserved4[3]; - - union { - vuint8_t R; - struct { - vuint8_t FB0AI:1; - vuint8_t FB0SI:1; - vuint8_t FB1AI:1; - vuint8_t FB1SI:1; - vuint8_t:4; - } B; - } MIR; /* MCM Miscellaneous Interrupt Register */ - - int32_t MCM_reserved5; - - union { - vuint32_t R; - } MUDCR; /* MCM Miscellaneous User-Defined Control Register */ - - int32_t MCM_reserved6[6]; /* (0x040- 0x028)/4 = 0x06 */ - int8_t MCM_reserved7[3]; - - union { - vuint8_t R; - struct { - vuint8_t:2; - vuint8_t ER1BR:1; - vuint8_t EF1BR:1; - vuint8_t:2; - vuint8_t ERNCR:1; - vuint8_t EFNCR:1; - } B; - } ECR; /* MCM ECC Configuration Register */ - - int8_t MCM_reserved8[3]; - - union { - vuint8_t R; - struct { - vuint8_t:2; - vuint8_t R1BC:1; - vuint8_t F1BC:1; - vuint8_t:2; - vuint8_t RNCE:1; - vuint8_t FNCE:1; - } B; - } ESR; /* MCM ECC Status Register */ - - int16_t MCM_reserved9; - - union { - vuint16_t R; - struct { - vuint16_t:2; - vuint16_t FRC1BI:1; - vuint16_t FR11BI:1; - vuint16_t:2; - vuint16_t FRCNCI:1; - vuint16_t FR1NCI:1; - vuint16_t:1; - vuint16_t ERRBIT:7; - } B; - } EEGR; /* MCM ECC Error Generation Register */ - - int32_t MCM_reserved10; - - union { - vuint32_t R; - } FEAR; /* MCM Flash ECC Address Register */ - - int16_t MCM_reserved11; - - union { - vuint8_t R; - struct { - vuint8_t:4; - vuint8_t FEMR:4; - } B; - } FEMR; /* MCM Flash ECC Master Number Register */ - - union { - vuint8_t R; - struct { - vuint8_t WRITE:1; - vuint8_t SIZE:3; - vuint8_t PROTECTION:4; - } B; - } FEAT; /* MCM Flash ECC Attributes Register */ - - int32_t MCM_reserved12; - - union { - vuint32_t R; - } FEDR; /* MCM Flash ECC Data Register */ - - union { - vuint32_t R; - } REAR; /* MCM RAM ECC Address Register */ - - int8_t MCM_reserved13; - - union { - vuint8_t R; - } RESR; /* MCM RAM ECC Address Register */ - - union { - vuint8_t R; - struct { - vuint8_t:4; - vuint8_t REMR:4; - } B; - } REMR; /* MCM RAM ECC Master Number Register */ - - union { - vuint8_t R; - struct { - vuint8_t WRITE:1; - vuint8_t SIZE:3; - vuint8_t PROTECTION:4; - } B; - } REAT; /* MCM RAM ECC Attributes Register */ - - int32_t MCM_reserved14; - - union { - vuint32_t R; - } REDR; /* MCM RAM ECC Data Register */ - - }; /* end of MCM_tag */ -/****************************************************************************/ -/* MODULE : RTC */ -/****************************************************************************/ - struct RTC_tag { - union { - vuint32_t R; - struct { - vuint32_t SUPV:1; - vuint32_t:31; - } B; - } RTCSUPV; /* RTC Supervisor Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t CNTEN:1; - vuint32_t RTCIE:1; - vuint32_t FRZEN:1; - vuint32_t ROVREN:1; - vuint32_t RTCVAL:12; - vuint32_t APIEN:1; - vuint32_t APIE:1; - vuint32_t CLKSEL:2; - vuint32_t DIV512EN:1; - vuint32_t DIV32EN:1; - vuint32_t APIVAL:10; - } B; - } RTCC; /* RTC Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t:2; - vuint32_t RTCF:1; - vuint32_t:15; - vuint32_t APIF:1; - vuint32_t:2; - vuint32_t ROVRF:1; - vuint32_t:10; - } B; - } RTCS; /* RTC Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t RTCCNT:32; - } B; - } RTCCNT; /* RTC Counter Register */ - - }; /* end of RTC_tag */ -/****************************************************************************/ -/* MODULE : SIU */ -/****************************************************************************/ - struct SIU_tag { - - int32_t SIU_reserved0; - - union { /* MCU ID Register 1 */ - vuint32_t R; - struct { - vuint32_t PARTNUM:16; - vuint32_t CSP:1; - vuint32_t PKG:5; - vuint32_t:2; - vuint32_t MAJORMASK:4; - vuint32_t MINORMASK:4; - } B; - } MIDR; - - union { /* MCU ID Register 2 */ - vuint32_t R; - struct { - vuint32_t SF:1; - vuint32_t FLASH_SIZE_1:4; - vuint32_t FLASH_SIZE_2:4; - vuint32_t:7; - vuint32_t PARTNUM:8; - vuint32_t:3; - vuint32_t EE:1; - vuint32_t:3; - vuint32_t FR:1; - } B; - } MIDR2; - - int32_t SIU_reserved1[2]; - - union { /* Interrupt Status Flag Register */ - vuint32_t R; - struct { - vuint32_t EIF31:1; - vuint32_t EIF30:1; - vuint32_t EIF29:1; - vuint32_t EIF28:1; - vuint32_t EIF27:1; - vuint32_t EIF26:1; - vuint32_t EIF25:1; - vuint32_t EIF24:1; - vuint32_t EIF23:1; - vuint32_t EIF22:1; - vuint32_t EIF21:1; - vuint32_t EIF20:1; - vuint32_t EIF19:1; - vuint32_t EIF18:1; - vuint32_t EIF17:1; - vuint32_t EIF16:1; - vuint32_t EIF15:1; - vuint32_t EIF14:1; - vuint32_t EIF13:1; - vuint32_t EIF12:1; - vuint32_t EIF11:1; - vuint32_t EIF10:1; - vuint32_t EIF9:1; - vuint32_t EIF8:1; - vuint32_t EIF7:1; - vuint32_t EIF6:1; - vuint32_t EIF5:1; - vuint32_t EIF4:1; - vuint32_t EIF3:1; - vuint32_t EIF2:1; - vuint32_t EIF1:1; - vuint32_t EIF0:1; - } B; - } ISR; - - union { /* Interrupt Request Enable Register */ - vuint32_t R; - struct { - vuint32_t EIRE31:1; - vuint32_t EIRE30:1; - vuint32_t EIRE29:1; - vuint32_t EIRE28:1; - vuint32_t EIRE27:1; - vuint32_t EIRE26:1; - vuint32_t EIRE25:1; - vuint32_t EIRE24:1; - vuint32_t EIRE23:1; - vuint32_t EIRE22:1; - vuint32_t EIRE21:1; - vuint32_t EIRE20:1; - vuint32_t EIRE19:1; - vuint32_t EIRE18:1; - vuint32_t EIRE17:1; - vuint32_t EIRE16:1; - vuint32_t EIRE15:1; - vuint32_t EIRE14:1; - vuint32_t EIRE13:1; - vuint32_t EIRE12:1; - vuint32_t EIRE11:1; - vuint32_t EIRE10:1; - vuint32_t EIRE9:1; - vuint32_t EIRE8:1; - vuint32_t EIRE7:1; - vuint32_t EIRE6:1; - vuint32_t EIRE5:1; - vuint32_t EIRE4:1; - vuint32_t EIRE3:1; - vuint32_t EIRE2:1; - vuint32_t EIRE1:1; - vuint32_t EIRE0:1; - } B; - } IRER; - - int32_t SIU_reserved2[3]; - - union { /* Interrupt Rising-Edge Event Enable Register */ - vuint32_t R; - struct { - vuint32_t IREE31:1; - vuint32_t IREE30:1; - vuint32_t IREE29:1; - vuint32_t IREE28:1; - vuint32_t IREE27:1; - vuint32_t IREE26:1; - vuint32_t IREE25:1; - vuint32_t IREE24:1; - vuint32_t IREE23:1; - vuint32_t IREE22:1; - vuint32_t IREE21:1; - vuint32_t IREE20:1; - vuint32_t IREE19:1; - vuint32_t IREE18:1; - vuint32_t IREE17:1; - vuint32_t IREE16:1; - vuint32_t IREE15:1; - vuint32_t IREE14:1; - vuint32_t IREE13:1; - vuint32_t IREE12:1; - vuint32_t IREE11:1; - vuint32_t IREE10:1; - vuint32_t IREE9:1; - vuint32_t IREE8:1; - vuint32_t IREE7:1; - vuint32_t IREE6:1; - vuint32_t IREE5:1; - vuint32_t IREE4:1; - vuint32_t IREE3:1; - vuint32_t IREE2:1; - vuint32_t IREE1:1; - vuint32_t IREE0:1; - } B; - } IREER; - - union { /* Interrupt Falling-Edge Event Enable Register */ - vuint32_t R; - struct { - vuint32_t IFEE31:1; - vuint32_t IFEE30:1; - vuint32_t IFEE29:1; - vuint32_t IFEE28:1; - vuint32_t IFEE27:1; - vuint32_t IFEE26:1; - vuint32_t IFEE25:1; - vuint32_t IFEE24:1; - vuint32_t IFEE23:1; - vuint32_t IFEE22:1; - vuint32_t IFEE21:1; - vuint32_t IFEE20:1; - vuint32_t IFEE19:1; - vuint32_t IFEE18:1; - vuint32_t IFEE17:1; - vuint32_t IFEE16:1; - vuint32_t IFEE15:1; - vuint32_t IFEE14:1; - vuint32_t IFEE13:1; - vuint32_t IFEE12:1; - vuint32_t IFEE11:1; - vuint32_t IFEE10:1; - vuint32_t IFEE9:1; - vuint32_t IFEE8:1; - vuint32_t IFEE7:1; - vuint32_t IFEE6:1; - vuint32_t IFEE5:1; - vuint32_t IFEE4:1; - vuint32_t IFEE3:1; - vuint32_t IFEE2:1; - vuint32_t IFEE1:1; - vuint32_t IFEE0:1; - } B; - } IFEER; - - union { /* Interrupt Filter Enable Register */ - vuint32_t R; - struct { - vuint32_t IFE31:1; - vuint32_t IFE30:1; - vuint32_t IFE29:1; - vuint32_t IFE28:1; - vuint32_t IFE27:1; - vuint32_t IFE26:1; - vuint32_t IFE25:1; - vuint32_t IFE24:1; - vuint32_t IFE23:1; - vuint32_t IFE22:1; - vuint32_t IFE21:1; - vuint32_t IFE20:1; - vuint32_t IFE19:1; - vuint32_t IFE18:1; - vuint32_t IFE17:1; - vuint32_t IFE16:1; - vuint32_t IFE15:1; - vuint32_t IFE14:1; - vuint32_t IFE13:1; - vuint32_t IFE12:1; - vuint32_t IFE11:1; - vuint32_t IFE10:1; - vuint32_t IFE9:1; - vuint32_t IFE8:1; - vuint32_t IFE7:1; - vuint32_t IFE6:1; - vuint32_t IFE5:1; - vuint32_t IFE4:1; - vuint32_t IFE3:1; - vuint32_t IFE2:1; - vuint32_t IFE1:1; - vuint32_t IFE0:1; - } B; - } IFER; - - int32_t SIU_reserved3[3]; - - union { /* Pad Configuration Registers */ - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t SME:1; - vuint16_t APC:1; - vuint16_t:1; - vuint16_t PA:2; - vuint16_t OBE:1; - vuint16_t IBE:1; - vuint16_t DCS:2; - vuint16_t ODE:1; - vuint16_t HYS:1; - vuint16_t SRC:2; - vuint16_t WPE:1; - vuint16_t WPS:1; - } B; - } PCR[512]; - - int32_t SIU_reserved4[48]; /* {0x500-0x440}/0x4 */ - - union { /* Pad Selection for Multiplexed Input Register */ - vuint8_t R; - struct { - vuint8_t:4; - vuint8_t PADSEL:4; - } B; - } PSMI[256]; - - union { /* GPIO Pin Data Output Registers */ - vuint8_t R; - struct { - vuint8_t:7; - vuint8_t PDO:1; - } B; - } GPDO[512]; - - union { /* GPIO Pin Data Input Registers */ - vuint8_t R; - struct { - vuint8_t:7; - vuint8_t PDI:1; - } B; - } GPDI[512]; - - int32_t SIU_reserved5[128]; /* {0xC00-0xA00}/0x4 */ - - union { /* Parallel GPIO Pin Data Output Register */ - vuint32_t R; - struct { - vuint32_t PPD0:32; - } B; - } PGPDO[16]; - - union { /* Parallel GPIO Pin Data Input Register */ - vuint32_t R; - struct { - vuint32_t PPDI:32; - } B; - } PGPDI[16]; - - union { /* Masked Parallel GPIO Pin Data Out Register */ - vuint32_t R; - struct { - vuint32_t MASK:16; - vuint32_t MPPDO:16; - } B; - } MPGPDO[32]; - - int32_t SIU_reserved6[192]; /* {0x1000-0x0D00}/0x4 */ - - union { /* Interrupt Filter Maximum Counter Register */ - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t MAXCNT:4; - } B; - } IFMC[32]; - - union { /* Interrupt Filter Clock Prescaler Register */ - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t IFCP:4; - } B; - } IFCPR; - - }; /* end of SIU_tag */ -/****************************************************************************/ -/* MODULE : SSCM */ -/****************************************************************************/ - struct SSCM_tag { - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t NXEN:1; - vuint16_t PUB:1; - vuint16_t SEC:1; - vuint16_t:1; - vuint16_t BMODE:3; - vuint16_t:1; - vuint16_t ABD:1; - vuint16_t:3; - } B; - } STATUS; /* Status Register */ - - union { - vuint16_t R; - struct { - vuint16_t SRAMSIZE:5; - vuint16_t IFLASHSIZE:5; - vuint16_t IVLD:1; - vuint16_t DFLASHSIZE:4; - vuint16_t DVLD:1; - } B; - } MEMCONFIG; /* System Memory Configuration Register */ - - int16_t SSCM_reserved; - - union { - vuint16_t R; - struct { - vuint16_t:14; - vuint16_t PAE:1; - vuint16_t RAE:1; - } B; - } ERROR; /* Error Configuration Register */ - - union { - vuint16_t R; - struct { - vuint16_t:13; - vuint16_t DEBUG_MODE:3; - } B; - } DEBUGPORT; /* Debug Status Port Register */ - - int16_t SSCM_reserved1; - - union { - vuint32_t R; - struct { - vuint32_t PWD_HI:32; - } B; - } PWCMPH; /* Password Comparison Register High Word */ - - union { - vuint32_t R; - struct { - vuint32_t PWD_LO:32; - } B; - } PWCMPL; /* Password Comparison Register Low Word */ - - }; /* end of SSCM_tag */ -/****************************************************************************/ -/* MODULE : STM */ -/****************************************************************************/ - struct STM_tag { - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t CPS:8; - vuint32_t:6; - vuint32_t FRZ:1; - vuint32_t TEN:1; - } B; - } CR0; /* STM Control Register */ - - union { - vuint32_t R; - } CNT0; /* STM Count Register */ - - int32_t STM_reserved[2]; - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR0; /* STM Channel Control Register 0 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR0; /* STM Channel Interrupt Register 0 */ - - union { - vuint32_t R; - } CMP0; /* STM Channel Compare Register 0 */ - - int32_t STM_reserved1; - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR1; /* STM Channel Control Register 1 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR1; /* STM Channel Interrupt Register 1 */ - - union { - vuint32_t R; - } CMP1; /* STM Channel Compare Register 1 */ - - int32_t STM_reserved2; - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR2; /* STM Channel Control Register 2 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR2; /* STM Channel Interrupt Register 2 */ - - union { - vuint32_t R; - } CMP2; /* STM Channel Compare Register 2 */ - - int32_t STM_reserved3; - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR3; /* STM Channel Control Register 3 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR3; /* STM Channel Interrupt Register 3 */ - - union { - vuint32_t R; - } CMP3; /* STM Channel Compare Register 3 */ - - }; /* end of STM_tag */ -/****************************************************************************/ -/* MODULE : SWT */ -/****************************************************************************/ - struct SWT_tag { - union { - vuint32_t R; - struct { - vuint32_t MAP0:1; - vuint32_t MAP1:1; - vuint32_t MAP2:1; - vuint32_t MAP3:1; - vuint32_t MAP4:1; - vuint32_t MAP5:1; - vuint32_t MAP6:1; - vuint32_t MAP7:1; - vuint32_t:15; - vuint32_t RIA:1; - vuint32_t WND:1; - vuint32_t ITR:1; - vuint32_t HLK:1; - vuint32_t SLK:1; - vuint32_t CSL:1; - vuint32_t STP:1; - vuint32_t FRZ:1; - vuint32_t WEN:1; - } B; - } CR; /* SWT Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t TIF:1; - } B; - } IR; /* SWT Interrupt Register */ - - union { - vuint32_t R; - struct { - vuint32_t WTO:32; - } B; - } TO; /* SWT Time-Out Register */ - - union { - vuint32_t R; - struct { - vuint32_t WST:32; - } B; - } WN; /* SWT Window Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t WSC:16; - } B; - } SR; /* SWT Service Register */ - - union { - vuint32_t R; - struct { - vuint32_t CNT:32; - } B; - } CO; /* SWT Counter Output Register */ - - }; /* end of SWT_tag */ -/****************************************************************************/ -/* MODULE : WKUP */ -/****************************************************************************/ - struct WKUP_tag { - union { - vuint32_t R; - struct { - vuint32_t NIF0:1; - vuint32_t NOVF0:1; - vuint32_t:6; - vuint32_t NIF1:1; - vuint32_t NOVF1:1; - vuint32_t:6; - vuint32_t NIF2:1; - vuint32_t NOVF2:1; - vuint32_t:6; - vuint32_t NIF3:1; - vuint32_t NOVF3:1; - vuint32_t:6; - } B; - } NSR; /* NMI Status Register */ - - int32_t WKUP_reserved; - - union { - vuint32_t R; - struct { - vuint32_t NLOCK0:1; - vuint32_t NDSS0:2; - vuint32_t NWRE0:1; - vuint32_t:1; - vuint32_t NREE0:1; - vuint32_t NFEE0:1; - vuint32_t NFE0:1; - vuint32_t NLOCK1:1; - vuint32_t NDSS1:2; - vuint32_t NWRE1:1; - vuint32_t:1; - vuint32_t NREE1:1; - vuint32_t NFEE1:1; - vuint32_t NFE1:1; - vuint32_t NLOCK2:1; - vuint32_t NDSS2:2; - vuint32_t NWRE2:1; - vuint32_t:1; - vuint32_t NREE2:1; - vuint32_t NFEE2:1; - vuint32_t NFE2:1; - vuint32_t NLOCK3:1; - vuint32_t NDSS3:2; - vuint32_t NWRE3:1; - vuint32_t:1; - vuint32_t NREE3:1; - vuint32_t NFEE3:1; - vuint32_t NFE3:1; - } B; - } NCR; /* NMI Configuration Register */ - - int32_t WKUP_reserved1[2]; - - union { - vuint32_t R; - struct { - vuint32_t EIF:32; - } B; - } WISR; /* Wakeup/Interrupt Status Flag Register */ - - union { - vuint32_t R; - struct { - vuint32_t EIRE:32; - } B; - } IRER; /* Interrupt Request Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t WRE:32; - } B; - } WRER; /* Wakeup Request Enable Register */ - - int32_t WKUP_reserved2[2]; - - union { - vuint32_t R; - struct { - vuint32_t IREE:32; - } B; - } WIREER; /* Wakeup/Interrupt Rising-Edge Event Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t IFEE:32; - } B; - } WIFEER; /* Wakeup/Interrupt Falling-Edge Event Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t IFE:32; - } B; - } WIFER; /* Wakeup/Interrupt Filter Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t IPUE:32; - } B; - } WIPUER; /* Wakeup/Interrupt Pullup Enable Register */ - - }; /* end of WKUP_tag */ -/****************************************************************************/ -/* MODULE : LINFLEX */ -/****************************************************************************/ - - struct LINFLEX_tag { - - int16_t LINFLEX_reserved1; - - union { - vuint16_t R; - struct { - vuint16_t CCD:1; - vuint16_t CFD:1; - vuint16_t LASE:1; - vuint16_t AWUM:1; // LCH vuint16_t AUTOWU:1; - vuint16_t MBL:4; - vuint16_t BF:1; - vuint16_t SFTM:1; - vuint16_t LBKM:1; - vuint16_t MME:1; - vuint16_t SBDT:1; // LCH vuint16_t SSBL:1; - vuint16_t RBLM:1; - vuint16_t SLEEP:1; - vuint16_t INIT:1; - } B; - } LINCR1; /* LINFLEX LIN Control Register 1 */ - - int16_t LINFLEX_reserved2; - - union { - vuint16_t R; - struct { - vuint16_t SZIE:1; - vuint16_t OCIE:1; - vuint16_t BEIE:1; - vuint16_t CEIE:1; - vuint16_t HEIE:1; - vuint16_t:2; - vuint16_t FEIE:1; - vuint16_t BOIE:1; - vuint16_t LSIE:1; - vuint16_t WUIE:1; - vuint16_t DBFIE:1; - vuint16_t DBEIE:1; - vuint16_t DRIE:1; - vuint16_t DTIE:1; - vuint16_t HRIE:1; - } B; - } LINIER; /* LINFLEX LIN Interrupt Enable Register */ - - int16_t LINFLEX_reserved3; - - union { - vuint16_t R; - struct { - vuint16_t LINS:4; - vuint16_t:2; - vuint16_t RMB:1; - vuint16_t:1; - vuint16_t RBSY:1; // LCH vuint16_t RXBUSY:1; - vuint16_t RPS:1; // LCH vuint16_t RDI:1; - vuint16_t WUF:1; - vuint16_t DBFF:1; - vuint16_t DBEF:1; - vuint16_t DRF:1; - vuint16_t DTF:1; - vuint16_t HRF:1; - } B; - } LINSR; /* LINFLEX LIN Status Register */ - - int16_t LINFLEX_reserved4; - - union { - vuint16_t R; - struct { - vuint16_t SZF:1; - vuint16_t OCF:1; - vuint16_t BEF:1; - vuint16_t CEF:1; - vuint16_t SFEF:1; - vuint16_t BDEF:1; - vuint16_t IDPEF:1; - vuint16_t FEF:1; - vuint16_t BOF:1; - vuint16_t:6; - vuint16_t NF:1; - } B; - } LINESR; /* LINFLEX LIN Error Status Register */ - - int16_t LINFLEX_reserved5; - - union { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t TDFL:2; - vuint16_t:1; - vuint16_t RDFL:2; - vuint16_t:4; - vuint16_t RXEN:1; - vuint16_t TXEN:1; - vuint16_t OP:1; //LCH vuint16_t PARITYODD:1; - vuint16_t PCE:1; - vuint16_t WL:1; - vuint16_t UART:1; - } B; - } UARTCR; /* LINFLEX UART Mode Control Register */ - - int16_t LINFLEX_reserved6; - - union { - vuint16_t R; - struct { - vuint16_t SZF:1; - vuint16_t OCF:1; - vuint16_t PE:4; - vuint16_t RMB:1; - vuint16_t FEF:1; - vuint16_t BOF:1; - vuint16_t RPS:1; // LCH vuint16_t RDI:1; - vuint16_t WUF:1; - vuint16_t:2; - vuint16_t DRF:1; - vuint16_t DTF:1; - vuint16_t NF:1; - } B; - } UARTSR; /* LINFLEX UART Mode Status Register */ - - int16_t LINFLEX_reserved7; - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t LTOM:1; //LCH vuint16_t MODE:1; - vuint16_t IOT:1; - vuint16_t TOCE:1; - vuint16_t CNT:8; - } B; - } LINTCSR; /* LINFLEX LIN Time-Out Control Status Register */ - - int16_t LINFLEX_reserved8; - - union { - vuint16_t R; - struct { - vuint16_t OC2:8; - vuint16_t OC1:8; - } B; - } LINOCR; /* LINFLEX LIN Output Compare Register */ - - int16_t LINFLEX_reserved9; - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t RTO:4; // LCH vuint16_t RTC:4; - vuint16_t:1; - vuint16_t HTO:7; // LCH vuint16_t HTC:7; - } B; - } LINTOCR; /* LINFLEX LIN Output Compare Register */ - - int16_t LINFLEX_reserved10; - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t DIV_F:4; // LCH vuint16_t FBR:4; - } B; - } LINFBRR; /* LINFLEX LIN Fractional Baud Rate Register */ - - int16_t LINFLEX_reserved11; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DIV_M:13; // LCH vuint16_t IBR:13; - } B; - } LINIBRR; /* LINFLEX LIN Integer Baud Rate Register */ - - int16_t LINFLEX_reserved12; - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t CF:8; - } B; - } LINCFR; /* LINFLEX LIN Checksum Field Register */ - - int16_t LINFLEX_reserved13; - - union { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t IOBE:1; - vuint16_t IOPE:1; - vuint16_t WURQ:1; - vuint16_t DDRQ:1; - vuint16_t DTRQ:1; - vuint16_t ABRQ:1; - vuint16_t HTRQ:1; - vuint16_t:8; - } B; - } LINCR2; /* LINFLEX LIN Control Register 2 */ - - int16_t LINFLEX_reserved14; - - union { - vuint16_t R; - struct { - vuint16_t DFL:6; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; // LCH vuint16_t:1; - vuint16_t ID:6; - } B; - } BIDR; /* LINFLEX Buffer Identifier Register */ - - union { - vuint32_t R; - struct { - vuint32_t DATA3:8; - vuint32_t DATA2:8; - vuint32_t DATA1:8; - vuint32_t DATA0:8; - } B; - } BDRL; /* LINFLEX Buffer Data Register Least Significant */ - - union { - vuint32_t R; - struct { - vuint32_t DATA7:8; - vuint32_t DATA6:8; - vuint32_t DATA5:8; - vuint32_t DATA4:8; - } B; - } BDRM; /* LINFLEX Buffer Data Register Most Significant */ - - int16_t LINFLEX_reserved15; - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t FACT:8; - } B; - } IFER; /* LINFLEX Identifier Filter Enable Register */ - - int16_t LINFLEX_reserved16; - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t IFMI:4; - } B; - } IFMI; /* LINFLEX Identifier Filter Match Index Register */ - - int16_t LINFLEX_reserved17; - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t IFM:4; - } B; - } IFMR; /* LINFLEX Identifier Filter Mode Register */ - - int16_t LINFLEX_reserved18; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR0; /* LINFLEX Identifier Filter Control Register 0 */ - - int16_t LINFLEX_reserved19; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR1; /* LINFLEX Identifier Filter Control Register 1 */ - - int16_t LINFLEX_reserved20; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR2; /* LINFLEX Identifier Filter Control Register 2 */ - - int16_t LINFLEX_reserved21; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR3; /* LINFLEX Identifier Filter Control Register 3 */ - - int16_t LINFLEX_reserved22; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR4; /* LINFLEX Identifier Filter Control Register 4 */ - - int16_t LINFLEX_reserved23; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR5; /* LINFLEX Identifier Filter Control Register 5 */ - - int16_t LINFLEX_reserved24; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR6; /* LINFLEX Identifier Filter Control Register 6 */ - - int16_t LINFLEX_reserved25; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t DFL:3; - vuint16_t DIR:1; - vuint16_t CCS:1; - vuint16_t:2; - vuint16_t ID:6; - } B; - } IFCR7; /* LINFLEX Identifier Filter Control Register 7 */ - - }; /* end of LINFLEX_tag */ -/****************************************************************************/ -/* MODULE : ME */ -/****************************************************************************/ - struct ME_tag { - - union { - vuint32_t R; - struct { - vuint32_t S_CURRENTMODE:4; - vuint32_t S_MTRANS:1; - vuint32_t S_DC:1; - vuint32_t:2; - vuint32_t S_PDO:1; - vuint32_t:2; - vuint32_t S_MVR:1; - vuint32_t S_DFLA:2; - vuint32_t S_CFLA:2; - vuint32_t:8; - vuint32_t S_PLL1:1; - vuint32_t S_PLL0:1; - vuint32_t S_OSC:1; - vuint32_t S_RC:1; - vuint32_t S_SYSCLK:4; - } B; - } GS; /* Global Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t TARGET_MODE:4; - vuint32_t:12; - vuint32_t KEY:16; - } B; - } MCTL; /* Mode Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t:18; - vuint32_t STANDBY0:1; - vuint32_t:2; - vuint32_t STOP0:1; - vuint32_t:1; - vuint32_t HALT0:1; - vuint32_t RUN3:1; - vuint32_t RUN2:1; - vuint32_t RUN1:1; - vuint32_t RUN0:1; - vuint32_t DRUN:1; - vuint32_t SAFE:1; - vuint32_t TEST:1; - vuint32_t RESET:1; - } B; - } MER; /* Mode Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t I_CONF:1; - vuint32_t I_MODE:1; - vuint32_t I_SAFE:1; - vuint32_t I_MTC:1; - } B; - } IS; /* Interrupt Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t M_CONF:1; - vuint32_t M_MODE:1; - vuint32_t M_SAFE:1; - vuint32_t M_TC:1; - } B; - } IM; /* Interrupt Mask Register */ - - union { - vuint32_t R; - struct { - vuint32_t:27; - vuint32_t S_MTI:1; - vuint32_t S_MRI:1; - vuint32_t S_DMA:1; - vuint32_t S_NMA:1; - vuint32_t S_SEA:1; - } B; - } IMTS; /* Invalid Mode Transition Status Register */ - - int32_t ME_reserved0[2]; - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } RESET; /* Reset Mode Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } TEST; /* Test Mode Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } SAFE; /* Safe Mode Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } DRUN; /* DRUN Mode Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } RUN[4]; /* RUN 0->4 Mode Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } HALT0; /* HALT0 Mode Configuration Register */ - - int32_t ME_reserved1; - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } STOP0; /* STOP0 Mode Configuration Register */ - - int32_t ME_reserved2[2]; - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t PDO:1; - vuint32_t:2; - vuint32_t MVRON:1; - vuint32_t DFLAON:2; - vuint32_t CFLAON:2; - vuint32_t:8; - vuint32_t PLL2ON:1; - vuint32_t PLL1ON:1; - vuint32_t XOSC0ON:1; - vuint32_t IRCON:1; - vuint32_t SYSCLK:4; - } B; - } STANDBY0; /* STANDBY0 Mode Configuration Register */ - - int32_t ME_reserved3[2]; - - union { - vuint32_t R; - struct { - vuint32_t PERIPH:32; - } B; - } PS[4]; /* Peripheral Status 0->4 Register */ - - int32_t ME_reserved4[4]; - - union { - vuint32_t R; - struct { - vuint32_t:24; - vuint32_t RUN3:1; - vuint32_t RUN2:1; - vuint32_t RUN1:1; - vuint32_t RUN0:1; - vuint32_t DRUN:1; - vuint32_t SAFE:1; - vuint32_t TEST:1; - vuint32_t RESET:1; - } B; - } RUNPC[8]; /* RUN Peripheral Configuration 0->7 Register */ - - union { - vuint32_t R; - struct { - vuint32_t:18; - vuint32_t STANDBY0:1; - vuint32_t:2; - vuint32_t STOP0:1; - vuint32_t:1; - vuint32_t HALT0:1; - vuint32_t:8; - } B; - } LPPC[8]; /* Low Power Peripheral Configuration 0->7 Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t DBG_F:1; - vuint8_t LP_CFG:3; - vuint8_t RUN_CFG:3; - } B; - } PCTL[144]; /* Peripheral Control 0->143 Register */ - - }; /* end of ME_tag */ -/****************************************************************************/ -/* MODULE : CGM */ -/****************************************************************************/ - struct CGM_tag { - - /* The CGM provides a unified register interface, enabling access to - all clock sources: - - Clock Type | Starting Address Map | Associated Clock Sources - ------------------------------------------------------------ - System | C3FE0000 | OSC_CTL - " | - | Reserved - " | C3FE0040 | LPOSC_CTL - " | C3FE0060 | RC_CTL - " | C3FE0080 | LPRC_CTL - " | C3FE00A0 | FMPLL_0 - " | C3FE00C0 | FMPLL_1 - " | - | Reserved - MISC | C3FE0100 | CMU_0 & CMU_1 - - */ - - /************************************/ - /* OSC_CTL @ CGM base address + 0x0000 */ - /************************************/ - union { - vuint32_t R; - struct { - vuint32_t OSCBYP:1; - vuint32_t:7; - vuint32_t EOCV:8; - vuint32_t M_OSC:1; - vuint32_t:2; - vuint32_t OSCDIV:5; - vuint32_t I_OSC:1; - vuint32_t:5; - vuint32_t S_OSC:1; - vuint32_t OSCON:1; - } B; - } OSC_CTL; /* Main OSC Control Register */ - - /************************************/ - /* LPOSC_CTL @ CGM base address + 0x0040 */ - /************************************/ - int32_t CGM_reserved0[15]; /* (0x040 - 0x004)/4 = 0x0F */ - /*int32_t $RESERVED[15]; */ - - union { - vuint32_t R; - struct { - vuint32_t OSCBYP:1; - vuint32_t:7; - vuint32_t EOCV:8; - vuint32_t M_OSC:1; - vuint32_t:2; - vuint32_t OSCDIV:5; - vuint32_t I_OSC:1; - vuint32_t:5; - vuint32_t S_OSC:1; - vuint32_t OSCON:1; - } B; - } LPOSC_CTL; /* Low Power OSC Control Register */ - - /************************************/ - /* RC_CTL @ CGM base address + 0x0060 */ - /************************************/ - int32_t CGM_reserved1[7]; /* (0x060 - 0x044)/4 = 0x07 */ - - union { - vuint32_t R; - struct { - vuint32_t:10; - vuint32_t RCTRIM:6; - vuint32_t:3; - vuint32_t RCDIV:5; - vuint32_t:2; - vuint32_t S_RC_STDBY:1; - vuint32_t:5; - } B; - } RC_CTL; /* RC OSC Control Register */ - - /*************************************/ - /* LPRC_CTL @ CGM base address + 0x0080 */ - /*************************************/ - int32_t CGM_reserved2[7]; /* (0x080 - 0x064)/4 = 0x07 */ - - union { - vuint32_t R; - struct { - vuint32_t:11; - vuint32_t LRCTRIM:5; - vuint32_t:3; - vuint32_t LPRCDIV:5; - vuint32_t:3; - vuint32_t S_LPRC:1; - vuint32_t:3; - vuint32_t LPRCON_STDBY:1; - } B; - } LPRC_CTL; /* Low Power RC OSC Control Register */ - - /************************************/ - /* FMPLL_0 @ CGM base address + 0x00A0 */ - /* FMPLL_1 @ CGM base address + 0x0100 */ - /************************************/ - int32_t CGM_reserved3[7]; /* (0x0A0 - 0x084)/4 = 0x07 */ - - struct { - union { - vuint32_t R; - struct { - vuint32_t:2; - vuint32_t IDF:4; - vuint32_t ODF:2; - vuint32_t:1; - vuint32_t NDIV:7; - vuint32_t:7; - vuint32_t EN_PLL_SW:1; - vuint32_t MODE:1; - vuint32_t UNLOCK_ONCE:1; - vuint32_t:1; - vuint32_t I_LOCK:1; - vuint32_t S_LOCK:1; - vuint32_t PLL_FAIL_MASK:1; - vuint32_t PLL_FAIL_FLAG:1; - vuint32_t:1; - } B; - } CR; /* FMPLL Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t STRB_BYPASS:1; - vuint32_t:1; - vuint32_t SPRD_SEL:1; - vuint32_t MOD_PERIOD:13; - vuint32_t FM_EN:1; - vuint32_t INC_STEP:15; - } B; - } MR; /* FMPLL Modulation Register */ - - int32_t CGM_reserved4[6]; /* (0x0C0 - 0x0A8)/4 = 0x06 */ - /* (0x0E0 - 0x0C8)/4 = 0x06 */ - - } FMPLL[2]; - - /************************************/ - /* CMU @ CGM base address + 0x0100 */ - /************************************/ - int32_t CGM_reserved5[8]; /* (0x100 - 0x0E0)/4 = 0x08 */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t SFM:1; - vuint32_t:13; - vuint32_t CLKSEL1:2; - vuint32_t:5; - vuint32_t RCDIV:2; - vuint32_t CME_A:1; - } B; - } CMU_0_CSR; /* Control Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t FD:20; - } B; - } CMU_0_FDR; /* Frequency Display Register */ - - union { - vuint32_t R; - struct { - vuint32_t:20; - vuint32_t HFREF_A:12; - } B; - } CMU_0_HFREFR_A; /* High Frequency Reference Register PLL_A Register */ - - union { - vuint32_t R; - struct { - vuint32_t:20; - vuint32_t LFREF_A:12; - } B; - } CMU_0_LFREFR_A; /* Low Frequency Reference Register PLL_A Register */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t FLCI_0:1; - vuint32_t FHHI_0:1; - vuint32_t FLLI_0:1; - vuint32_t OLRI:1; - } B; - } CMU_0_ISR; /* Interrupt Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t:32; - } B; - } CMU_0_IMR; /* Interrupt Mask Register */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t MD:20; - } B; - } CMU_0_MDR; /* Measurement Duration Register */ - - int32_t CGM_reserved5A; /* (0x020 - 0x01C)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t SFM:1; - vuint32_t:13; - vuint32_t CLKSEL1:2; - vuint32_t:5; - vuint32_t RCDIV:2; - vuint32_t CME_A:1; - } B; - } CMU_1_CSR; /* Control Status Register */ - - int32_t CGM_reserved6; /* (0x028 - 0x024)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t:20; - vuint32_t HFREF_A:12; - } B; - } CMU_1_HFREFR_A; /* High Frequency Reference Register PLL_A Register */ - - union { - vuint32_t R; - struct { - vuint32_t:20; - vuint32_t LFREF_A:12; - } B; - } CMU_1_LFREFR_A; /* Low Frequency Reference Register PLL_A Register */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t FLCI_1:1; - vuint32_t FHHI_1:1; - vuint32_t FLLI_1:1; - vuint32_t:1; - } B; - } CMU_1_ISR; /* Interrupt Status Register */ - - /************************************/ - /* CGM General Registers @ CGM base address + 0x0370 */ - /************************************/ - int32_t CGM_reserved7[143]; /* (0x370 - 0x134)/4 = 0x8F */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t EN:1; - } B; - } OCEN; /* Output Clock Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t:2; - vuint32_t SELDIV:2; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } OCDSSC; /* Output Clock Division Select Register */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELSTAT:4; - vuint32_t:24; - } B; - } SCSS; /* System Clock Select Status */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } SCDC; /* GSystem Clock Divider Configuration 0->4 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC0SC; /* Aux Clock 0 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC0DC; /* Aux Clock 0 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC1SC; /* Aux Clock 1 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC1DC; /* Aux Clock 1 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC2SC; /* Aux Clock 2 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC2DC; /* Aux Clock 2 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC3SC; /* Aux Clock 3 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC3DC; /* Aux Clock 3 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC4SC; /* Aux Clock 4 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC4DC; /* Aux Clock 4 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC5SC; /* Aux Clock 5 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC5DC; /* Aux Clock 5 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC6SC; /* Aux Clock 6 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC6DC; /* Aux Clock 6 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC7SC; /* Aux Clock 7 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC7DC; /* Aux Clock 7 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC8SC; /* Aux Clock 8 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC8DC; /* Aux Clock 8 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC9SC; /* Aux Clock 9 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC9DC; /* Aux Clock 9 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC10SC; /* Aux Clock 10 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC10DC; /* Aux Clock 10 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC11SC; /* Aux Clock 11 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC11DC; /* Aux Clock 11 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC12SC; /* Aux Clock 12 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC12DC; /* Aux Clock 12 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC13SC; /* Aux Clock 13 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC13DC; /* Aux Clock 13 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC14SC; /* Aux Clock 14 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC14DC; /* Aux Clock 14 Divider Configuration 0->3 */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t SELCTL:4; - vuint32_t:24; - } B; - } AC15SC; /* Aux Clock 15 Select Control */ - - union { - vuint32_t R; - struct { - vuint32_t DE0:1; - vuint32_t:3; - vuint32_t DIV0:4; - vuint32_t DE1:1; - vuint32_t:3; - vuint32_t DIV1:4; - vuint32_t DE2:1; - vuint32_t:3; - vuint32_t DIV2:4; - vuint32_t DE3:1; - vuint32_t:3; - vuint32_t DIV3:4; - } B; - } AC15DC; /* Aux Clock 15 Divider Configuration 0->3 */ - - }; /* end of CGM_tag */ -/****************************************************************************/ -/* MODULE : RGM */ -/****************************************************************************/ - struct RGM_tag { - - union { - vuint16_t R; - struct { - vuint16_t F_EXR:1; - vuint16_t:3; - vuint16_t F_CMU1_FHL:1; - vuint16_t:1; - vuint16_t F_PLL1:1; - vuint16_t F_FLASH:1; - vuint16_t F_LVD45:1; - vuint16_t F_CMU0_FHL:1; - vuint16_t F_CMU0_OLR:1; - vuint16_t F_PLL0:1; - vuint16_t F_CHKSTOP:1; - vuint16_t F_SOFT:1; - vuint16_t F_CORE:1; - vuint16_t F_JTAG:1; - } B; - } FES; /* Functional Event Status */ - - union { - vuint16_t R; - struct { - vuint16_t POR:1; - vuint16_t:7; - vuint16_t F_COMP:1; - vuint16_t F_LVD27_IO:1; - vuint16_t F_LVD27_FLASH:1; - vuint16_t F_LVD27_VREG:1; - vuint16_t F_LVD27:1; - vuint16_t F_SWT:1; - vuint16_t F_LVD12_PD1:1; - vuint16_t F_LVD12_PD0:1; - } B; - } DES; /* Destructive Event Status */ - - union { - vuint16_t R; - struct { - vuint16_t D_EXR:1; - vuint16_t:3; - vuint16_t D_CMU1_FHL:1; - vuint16_t:1; - vuint16_t D_PLL1:1; - vuint16_t D_FLASH:1; - vuint16_t D_LVD45:1; - vuint16_t D_CMU0_FHL:1; - vuint16_t D_CMU0_OLR:1; - vuint16_t D_PLL0:1; - vuint16_t D_CHKSTOP:1; - vuint16_t D_SOFT:1; - vuint16_t D_CORE:1; - vuint16_t D_JTAG:1; - } B; - } FERD; /* Functional Event Reset Disable */ - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t D_COMP:1; - vuint16_t D_LVD27_IO:1; - vuint16_t D_LVD27_FLASH:1; - vuint16_t D_LVD27_VREG:1; - vuint16_t D_LVD27:1; - vuint16_t D_SWT:1; - vuint16_t D_LVD12_PD1:1; - vuint16_t D_LVD12_PD0:1; - } B; - } DERD; /* Destructive Event Reset Disable */ - - int16_t RGM_reserved0[4]; - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t AR_CMU1_FHL:1; - vuint16_t:1; - vuint16_t AR_PLL1:1; - vuint16_t AR_FLASH:1; - vuint16_t AR_LVD45:1; - vuint16_t AR_CMU0_FHL:1; - vuint16_t AR_CMU0_OLR:1; - vuint16_t AR_PLL0:1; - vuint16_t AR_CHKSTOP:1; - vuint16_t AR_SOFT:1; - vuint16_t AR_CORE:1; - vuint16_t AR_JTAG:1; - } B; - } FEAR; /* Functional Event Alternate Request */ - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t AR_COMP:1; - vuint16_t AR_LVD27_IO:1; - vuint16_t AR_LVD27_FLASH:1; - vuint16_t AR_LVD27_VREG:1; - vuint16_t AR_LVD27:1; - vuint16_t AR_SWT:1; - vuint16_t AR_LVD12_PD1:1; - vuint16_t AR_LVD12_PD0:1; - } B; - } DEAR; /* Destructive Event Alternate Request */ - - int16_t RGM_reserved1[2]; - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t SS_CMU1_FHL:1; - vuint16_t:1; - vuint16_t SS_PLL1:1; - vuint16_t SS_FLASH:1; - vuint16_t SS_LVD45:1; - vuint16_t SS_CMU0_FHL:1; - vuint16_t SS_CMU0_OLR:1; - vuint16_t SS_PLL0:1; - vuint16_t SS_CHKSTOP:1; - vuint16_t SS_SOFT:1; - vuint16_t SS_CORE:1; - vuint16_t SS_JTAG:1; - } B; - } FESS; /* Functional Event Short Sequence */ - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t BOOT:1; - vuint16_t:4; - vuint16_t DRUND_FLA:1; - vuint16_t:1; - vuint16_t DRUNC_FLA:1; - } B; - } STDBY; /* STANDBY reset sequence */ - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t BE_CMU1_FHL:1; - vuint16_t:1; - vuint16_t BE_PLL1:1; - vuint16_t BE_FLASH:1; - vuint16_t BE_LVD45:1; - vuint16_t BE_CMU0_FHL:1; - vuint16_t BE_CMU0_OLR:1; - vuint16_t BE_PLL0:1; - vuint16_t BE_CHKSTOP:1; - vuint16_t BE_SOFT:1; - vuint16_t BE_CORE:1; - vuint16_t BE_JTAG:1; - } B; - } FBRE; /* Functional Bidirectional Reset Enable */ - - }; /* end of RGM_tag */ -/****************************************************************************/ -/* MODULE : PCU */ -/****************************************************************************/ - struct PCU_tag { - - union { - vuint32_t R; - struct { - vuint32_t:18; - vuint32_t STBY0:1; - vuint32_t:2; - vuint32_t STOP0:1; - vuint32_t:1; - vuint32_t HALT0:1; - vuint32_t RUN3:1; - vuint32_t RUN2:1; - vuint32_t RUN1:1; - vuint32_t RUN0:1; - vuint32_t DRUN:1; - vuint32_t SAFE:1; - vuint32_t TEST:1; - vuint32_t RST:1; - } B; - } PCONF[16]; /* Power domain 0-15 configuration register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t PD15:1; - vuint32_t PD14:1; - vuint32_t PD13:1; - vuint32_t PD12:1; - vuint32_t PD11:1; - vuint32_t PD10:1; - vuint32_t PD9:1; - vuint32_t PD8:1; - vuint32_t PD7:1; - vuint32_t PD6:1; - vuint32_t PD5:1; - vuint32_t PD4:1; - vuint32_t PD3:1; - vuint32_t PD2:1; - vuint32_t PD1:1; - vuint32_t PD0:1; - } B; - } PSTAT; /* Power Domain Status Register */ - - int32_t PCU_reserved0[15]; /* {0x0080-0x0044}/0x4 = 0xF */ - - union { - vuint32_t R; - struct { - vuint32_t:15; - vuint32_t MASK_LVDHV5:1; - } B; - } VCTL; /* Voltage Regulator Control Register */ - - }; /* end of PCU_tag */ -/****************************************************************************/ -/* MODULE : FLEXPWM */ -/****************************************************************************/ - struct FLEXPWM_SUB_tag { - - union { - vuint16_t R; - } CNT; /* Counter Register */ - - union { - vuint16_t R; - } INIT; /* Initial Count Register */ - - union { - vuint16_t R; - struct { - vuint16_t DBGEN:1; - vuint16_t WAITEN:1; - vuint16_t INDEP:1; - vuint16_t PWMA_INIT:1; - vuint16_t PWMB_INIT:1; - vuint16_t PWMX_INIT:1; - vuint16_t INIT_SEL:2; - vuint16_t FRCEN:1; - vuint16_t FORCE:1; - vuint16_t FORCE_SEL:3; - vuint16_t RELOAD_SEL:1; - vuint16_t CLK_SEL:2; - } B; - } CTRL2; /* Control 2 Register */ - - union { - vuint16_t R; - struct { - vuint16_t LDFQ:4; - vuint16_t HALF:1; - vuint16_t FULL:1; - vuint16_t DT:2; - vuint16_t:1; - vuint16_t PRSC:3; - vuint16_t:3; - vuint16_t DBLEN:1; - } B; - } CTRL; /* Control Register */ - - union { - vuint16_t R; - } VAL[6]; /* Value Register 0->5 */ - - union { - vuint16_t R; - struct { - vuint16_t FRACAEN:1; - vuint16_t:10; - vuint16_t FRACADLY:5; - } B; - } FRACA; /* Fractional Delay Register A */ - - union { - vuint16_t R; - struct { - vuint16_t FRACBEN:1; - vuint16_t:10; - vuint16_t FRACBDLY:5; - } B; - } FRACB; /* Fractional Delay Register B */ - - union { - vuint16_t R; - struct { - vuint16_t PWMA_IN:1; - vuint16_t PWMB_IN:1; - vuint16_t PWMX_IN:1; - vuint16_t:2; - vuint16_t POLA:1; - vuint16_t POLB:1; - vuint16_t POLX:1; - vuint16_t:2; - vuint16_t PWMAFS:2; - vuint16_t PWMBFS:2; - vuint16_t PWMXFS:2; - } B; - } OCTRL; /* Output Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t RUF:1; - vuint16_t REF:1; - vuint16_t RF:1; - vuint16_t CFA1:1; - vuint16_t CFA0:1; - vuint16_t CFB1:1; - vuint16_t CFB0:1; - vuint16_t CFX1:1; - vuint16_t CFX0:1; - vuint16_t CMPF:6; - } B; - } STS; /* Status Register */ - - union { - vuint16_t R; - struct { - vuint16_t:2; - vuint16_t REIE:1; - vuint16_t RIE:1; - vuint16_t:4; - vuint16_t CX1IE:1; - vuint16_t CX0IE:1; - vuint16_t CMPIE:6; - } B; - } INTEN; /* Interrupt Enable Register */ - - union { - vuint16_t R; - struct { - vuint16_t:6; - vuint16_t VALDE:1; - vuint16_t FAND:1; - vuint16_t CAPTDE:2; - vuint16_t CA1DE:1; - vuint16_t CA0DE:1; - vuint16_t CB1DE:1; - vuint16_t CB0DE:1; - vuint16_t CX1DE:1; - vuint16_t CX0DE:1; - } B; - } DMAEN; /* DMA Enable Register */ - - union { - vuint16_t R; - struct { - vuint16_t:10; - vuint16_t OUT_TRIG_EN:6; - } B; - } TCTRL; /* Output Trigger Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t DISX:4; - vuint16_t DISB:4; - vuint16_t DISA:4; - } B; - } DISMAP; /* Fault Disable Mapping Register */ - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t DTCNT0:11; - } B; - } DTCNT0; /* Deadtime Count Register 0 */ - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t DTCNT1:11; - } B; - } DTCNT1; /* Deadtime Count Register 1 */ - - union { - vuint16_t R; - struct { - vuint16_t CA1CNT:3; - vuint16_t CA0CNT:3; - vuint16_t CFAWM:2; - vuint16_t EDGCNTAEN:1; - vuint16_t INPSELA:1; - vuint16_t EDGA1:2; - vuint16_t EDGA0:2; - vuint16_t ONESHOTA:1; - vuint16_t ARMA:1; - } B; - } CAPTCTRLA; /* Capture Control Register A */ - - union { - vuint16_t R; - struct { - vuint16_t EDGCNTA:8; - vuint16_t EDGCMPA:8; - } B; - } CAPTCOMPA; /* Capture Compare Register A */ - - union { - vuint16_t R; - struct { - vuint16_t CB1CNT:3; - vuint16_t CB0CNT:3; - vuint16_t CFBWM:2; - vuint16_t EDGCNTBEN:1; - vuint16_t INPSELB:1; - vuint16_t EDGB1:2; - vuint16_t EDGB0:2; - vuint16_t ONESHOTB:1; - vuint16_t ARMB:1; - } B; - } CAPTCTRLB; /* Capture Control Register B */ - - union { - vuint16_t R; - struct { - vuint16_t EDGCNTB:8; - vuint16_t EDGCMPB:8; - } B; - } CAPTCOMPB; /* Capture Compare Register B */ - - union { - vuint16_t R; - struct { - vuint16_t CX1CNT:3; - vuint16_t CX0CNT:3; - vuint16_t CFXWM:2; - vuint16_t EDGCNTX_EN:1; - vuint16_t INP_SELX:1; - vuint16_t EDGX1:2; - vuint16_t EDGX0:2; - vuint16_t ONESHOTX:1; - vuint16_t ARMX:1; - } B; - } CAPTCTRLX; /* Capture Control Register B */ - - union { - vuint16_t R; - struct { - vuint16_t EDGCNTX:8; - vuint16_t EDGCMPX:8; - } B; - } CAPTCOMPX; /* Capture Compare Register X */ - - union { - vuint16_t R; - struct { - vuint16_t CAPTVAL0:16; - } B; - } CVAL0; /* Capture Value 0 Register */ - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t CVAL0CYC:4; - } B; - } CVAL0C; /* Capture Value 0 Cycle Register */ - - union { - vuint16_t R; - struct { - vuint16_t CAPTVAL1:16; - } B; - } CVAL1; /* Capture Value 1 Register */ - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t CVAL1CYC:4; - } B; - } CVAL1C; /* Capture Value 1 Cycle Register */ - - union { - vuint16_t R; - struct { - vuint16_t CAPTVAL2:16; - } B; - } CVAL2; /* Capture Value 2 Register */ - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t CVAL2CYC:4; - } B; - } CVAL2C; /* Capture Value 2 Cycle Register */ - - union { - vuint16_t R; - struct { - vuint16_t CAPTVAL3:16; - } B; - } CVAL3; /* Capture Value 3 Register */ - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t CVAL3CYC:4; - } B; - } CVAL3C; /* Capture Value 3 Cycle Register */ - - union { - vuint16_t R; - struct { - vuint16_t CAPTVAL4:16; - } B; - } CVAL4; /* Capture Value 4 Register */ - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t CVAL4CYC:4; - } B; - } CVAL4C; /* Capture Value 4 Cycle Register */ - - union { - vuint16_t R; - struct { - vuint16_t CAPTVAL5:16; - } B; - } CVAL5; /* Capture Value 5 Register */ - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t CVAL5CYC:4; - } B; - } CVAL5C; /* Capture Value 5 Cycle Register */ - - uint32_t FLEXPWM_SUB_reserved0; /* (0x04A - 0x050)/4 = 0x01 */ - - }; /* end of FLEXPWM_SUB_tag */ - - struct FLEXPWM_tag { - - /* eg. FLEXPWM.SUB<[x]>.CNT.R {x = 0->3} */ - struct FLEXPWM_SUB_tag SUB[4]; - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t PWMA_EN:4; - vuint16_t PWMB_EN:4; - vuint16_t PWMX_EN:4; - } B; - } OUTEN; /* Output Enable Register */ - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t MASKA:4; - vuint16_t MASKB:4; - vuint16_t MASKX:4; - } B; - } MASK; /* Output Mask Register */ - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t OUTA_3:1; - vuint16_t OUTB_3:1; - vuint16_t OUTA_2:1; - vuint16_t OUTB_2:1; - vuint16_t OUTA_1:1; - vuint16_t OUTB_1:1; - vuint16_t OUTA_0:1; - vuint16_t OUTB_0:1; - } B; - } SWCOUT; /* Software Controlled Output Register */ - - union { - vuint16_t R; - struct { - vuint16_t SELA_3:2; - vuint16_t SELB_3:2; - vuint16_t SELA_2:2; - vuint16_t SELB_2:2; - vuint16_t SELA_1:2; - vuint16_t SELB_1:2; - vuint16_t SELA_0:2; - vuint16_t SELB_0:2; - } B; - } DTSRCSEL; /* Deadtime Source Select Register */ - - union { - vuint16_t R; - struct { - vuint16_t IPOL:4; - vuint16_t RUN:4; - vuint16_t CLDOK:4; - vuint16_t LDOK:4; - } B; - } MCTRL; /* Master Control Register */ - - int16_t FLEXPWM_reserved1; - - union { - vuint16_t R; - struct { - vuint16_t FLVL:4; - vuint16_t FAUTO:4; - vuint16_t FSAFE:4; - vuint16_t FIE:4; - } B; - } FCTRL; /* Fault Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t FTEST:1; - vuint16_t FFPIN:4; - vuint16_t:4; - vuint16_t FFLAG:4; - } B; - } FSTS; /* Fault Status Register */ - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t FILT_CNT:3; - vuint16_t FILT_PER:8; - } B; - } FFILT; /* Fault FilterRegister */ - - }; /* end of FLEXPWM_tag */ -/****************************************************************************/ -/* MODULE : ETIMER */ -/****************************************************************************/ - struct ETIMER_CHANNEL_tag { - - union { - vuint16_t R; - struct { - vuint16_t COMP1:16; - } B; - } COMP1; /* Compare Register 1 */ - - union { - vuint16_t R; - struct { - vuint16_t COMP2:16; - } B; - } COMP2; /* Compare Register 2 */ - - union { - vuint16_t R; - struct { - vuint16_t CAPT1:16; - } B; - } CAPT1; /* Capture Register 1 */ - - union { - vuint16_t R; - struct { - vuint16_t CAPT2:16; - } B; - } CAPT2; /* Capture Register 2 */ - - union { - vuint16_t R; - struct { - vuint16_t LOAD:16; - } B; - } LOAD; /* Load Register */ - - union { - vuint16_t R; - struct { - vuint16_t HOLD:16; - } B; - } HOLD; /* Hold Register */ - - union { - vuint16_t R; - struct { - vuint16_t CNTR:16; - } B; - } CNTR; /* Counter Register */ - - union { - vuint16_t R; - struct { - vuint16_t CNTMODE:3; - vuint16_t PRISRC:5; - vuint16_t ONCE:1; - vuint16_t LENGTH:1; - vuint16_t DIR:1; - vuint16_t SECSRC:5; - } B; - } CTRL; /* Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t OEN:1; - vuint16_t RDNT:1; - vuint16_t INPUT:1; - vuint16_t VAL:1; - vuint16_t FORCE:1; - vuint16_t COFRC:1; - vuint16_t COINIT:2; - vuint16_t SIPS:1; - vuint16_t PIPS:1; - vuint16_t OPS:1; - vuint16_t MSTR:1; - vuint16_t OUTMODE:4; - } B; - } CTRL2; /* Control Register 2 */ - - union { - vuint16_t R; - struct { - vuint16_t STPEN:1; - vuint16_t ROC:2; - vuint16_t FMODE:1; - vuint16_t FDIS:4; - vuint16_t C2FCNT:3; - vuint16_t C1FCNT:3; - vuint16_t DBGEN:2; - } B; - } CTRL3; /* Control Register 3 */ - - union { - vuint16_t R; - struct { - vuint16_t:6; - vuint16_t WDF:1; - vuint16_t RCF:1; - vuint16_t ICF2:1; - vuint16_t ICF1:1; - vuint16_t IEHF:1; - vuint16_t IELF:1; - vuint16_t TOF:1; - vuint16_t TCF2:1; - vuint16_t TCF1:1; - vuint16_t TCF:1; - } B; - } STS; /* Status Register */ - - union { - vuint16_t R; - struct { - vuint16_t ICF2DE:1; - vuint16_t ICF1DE:1; - vuint16_t CMPLD2DE:1; - vuint16_t CMPLD1DE:1; - vuint16_t:2; - vuint16_t WDFIE:1; - vuint16_t RCFIE:1; - vuint16_t ICF2IE:1; - vuint16_t ICF1IE:1; - vuint16_t IEHFIE:1; - vuint16_t IELFIE:1; - vuint16_t TOFIE:1; - vuint16_t TCF2IE:1; - vuint16_t TCF1IE:1; - vuint16_t TCFIE:1; - } B; - } INTDMA; /* Interrupt and DMA Register */ - - union { - vuint16_t R; - struct { - vuint16_t CMPLD1:16; - } B; - } CMPLD1; /* Compare Load Register 1 */ - - union { - vuint16_t R; - struct { - vuint16_t CMPLD2:16; - } B; - } CMPLD2; /* Compare Load Register 2 */ - - union { - vuint16_t R; - struct { - vuint16_t CLC2:3; - vuint16_t CLC1:3; - vuint16_t CMPMODE:2; - vuint16_t CPT2MODE:2; - vuint16_t CPT1MODE:2; - vuint16_t CFWM:2; - vuint16_t ONESHOT:1; - vuint16_t ARM:1; - } B; - } CCCTRL; /* Compare and Capture Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t FILTCNT:3; - vuint16_t FILTPER:8; - } B; - } FILT; /* Input Filter Register */ - - }; /* end of ETIMER_CHANNEL_tag */ - - struct ETIMER_tag { - - struct ETIMER_CHANNEL_tag CHANNEL[8]; - - union { - vuint16_t R; - struct { - vuint16_t WDTOL:16; - } B; - } WDTOL; /* Watchdog Time-out Low Register */ - - union { - vuint16_t R; - struct { - vuint16_t WDTOH:16; - } B; - } WDTOH; /* Watchdog Time-out High Register */ - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t FTEST:1; - vuint16_t FIE:4; - vuint16_t:4; - vuint16_t FLVL:4; - } B; - } FCTRL; /* Fault Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t FFPIN:4; - vuint16_t:4; - vuint16_t FFLAG:4; - } B; - } FSTS; /* Fault Status Register */ - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t FFILTCNT:3; - vuint16_t FFILTPER:8; - } B; - } FFILT; /* Fault Filter Register */ - - int16_t ETIMER_reserved1; - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t ENBL:8; - } B; - } ENBL; /* Channel Enable Register */ - - int16_t ETIMER_reserved2; - - union { - vuint16_t R; - struct { - vuint16_t:11; - vuint16_t DREQ:5; - } B; - } DREQ[4]; /* DMA Request 0->3 Select Register */ - - }; /* end of ETIMER_tag */ - -/****************************************************************************/ -/* MODULE : CTUL */ -/****************************************************************************/ - struct CTUL_tag { - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t PRESC_CONF:4; - vuint32_t:4; - vuint32_t TRGIEN:1; - vuint32_t TRGI:1; - vuint32_t:2; - vuint32_t CNT3_EN:1; - vuint32_t CNT2_EN:1; - vuint32_t CNT1_EN:1; - vuint32_t CNT0_EN:1; - } B; - } CSR; /* Control Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t:23; - vuint32_t SV:9; - } B; - } SVR[7]; /* Start Value Register */ - - union { - vuint32_t R; - struct { - vuint32_t:23; - vuint32_t CV:9; - } B; - } CVR[4]; /* Current Value Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t TM:1; - vuint32_t CNT:2; - vuint32_t DELAY:3; - vuint32_t:4; - vuint32_t CHANNELVALUE:6; - } B; - } EVTCFGR[64]; /* Event Configuration Register */ - - }; /* end of CTUL_tag */ -/****************************************************************************/ -/* MODULE : CTU */ -/****************************************************************************/ - struct CTU_tag { - - union { - vuint32_t R; - struct { - vuint32_t I15_FE:1; - vuint32_t I15_RE:1; - vuint32_t I14_FE:1; - vuint32_t I14_RE:1; - vuint32_t I13_FE:1; - vuint32_t I13_RE:1; - vuint32_t I12_FE:1; - vuint32_t I12_RE:1; - vuint32_t I11_FE:1; - vuint32_t I11_RE:1; - vuint32_t I10_FE:1; - vuint32_t I10_RE:1; - vuint32_t I9_FE:1; - vuint32_t I9_RE:1; - vuint32_t I8_FE:1; - vuint32_t I8_RE:1; - vuint32_t I7_FE:1; - vuint32_t I7_RE:1; - vuint32_t I6_FE:1; - vuint32_t I6_RE:1; - vuint32_t I5_FE:1; - vuint32_t I5_RE:1; - vuint32_t I4_FE:1; - vuint32_t I4_RE:1; - vuint32_t I3_FE:1; - vuint32_t I3_RE:1; - vuint32_t I2_FE:1; - vuint32_t I2_RE:1; - vuint32_t I1_FE:1; - vuint32_t I1_RE:1; - vuint32_t I0_FE:1; - vuint32_t I0_RE:1; - } B; - } TGSISR; /* -Trigger Generator Subunit Input Selection Register */ - - union { - vuint16_t R; - struct { - vuint16_t:7; - vuint16_t ETTM:1; - vuint16_t PRES:2; - vuint16_t MRSSM:5; - vuint16_t TGSM:1; - } B; - } TGSCR; /* Trigger Generator Subunit Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t TCRV:16; - } B; - } TCR[8]; /* Trigger 0->7 Compare Register */ - - union { - vuint16_t R; - struct { - vuint16_t TGSCCV:16; - } B; - } TGSCCR; /* TGS Counter Compare Register */ - - union { - vuint16_t R; - struct { - vuint16_t TGSCRV:16; - } B; - } TGSCRR; /* TGS Counter Reload Register */ - - uint16_t CTU_reserved0; - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t T3INDEX:5; - vuint32_t:3; - vuint32_t T2INDEX:5; - vuint32_t:3; - vuint32_t T1INDEX:5; - vuint32_t:3; - vuint32_t T0INDEX:5; - } B; - } CLCR1; /* Command List Control Register 1 */ - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t T7INDEX:5; - vuint32_t:3; - vuint32_t T6INDEX:5; - vuint32_t:3; - vuint32_t T5INDEX:5; - vuint32_t:3; - vuint32_t T4INDEX:5; - } B; - } CLCR2; /* Command List Control Register 2 */ - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t T3E:1; - vuint32_t T3ETE:1; - vuint32_t T3T1E:1; - vuint32_t T3T0E:1; - vuint32_t T3ADCE:1; - vuint32_t:3; - vuint32_t T2E:1; - vuint32_t T2ETE:1; - vuint32_t T2T1E:1; - vuint32_t T2T0E:1; - vuint32_t T2ADCE:1; - vuint32_t:3; - vuint32_t T1E:1; - vuint32_t T1ETE:1; - vuint32_t T1T1E:1; - vuint32_t T1T0E:1; - vuint32_t T1ADCE:1; - vuint32_t:3; - vuint32_t T0E:1; - vuint32_t T0ETE:1; - vuint32_t T0T1E:1; - vuint32_t T0T0E:1; - vuint32_t T0ADCE:1; - } B; - } THCR1; /* Trigger Handler Control Register 1 */ - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t T7E:1; - vuint32_t T7ETE:1; - vuint32_t T7T1E:1; - vuint32_t T7T0E:1; - vuint32_t T7ADCE:1; - vuint32_t:3; - vuint32_t T6E:1; - vuint32_t T6ETE:1; - vuint32_t T6T1E:1; - vuint32_t T6T0E:1; - vuint32_t T6ADCE:1; - vuint32_t:3; - vuint32_t T5E:1; - vuint32_t T5ETE:1; - vuint32_t T5T1E:1; - vuint32_t T5T0E:1; - vuint32_t T5ADCE:1; - vuint32_t:3; - vuint32_t T4E:1; - vuint32_t T4ETE:1; - vuint32_t T4T1E:1; - vuint32_t T4T0E:1; - vuint32_t T4ADCE:1; - } B; - } THCR2; /* Trigger Handler Control Register 2 */ - - /* Single Conversion Mode - Comment for Dual Conversion Mode */ - union { - vuint16_t R; - struct { - vuint16_t CIR:1; - vuint16_t FC:1; - vuint16_t CMS:1; - vuint16_t:1; - vuint16_t FIFO:2; - vuint16_t:4; - vuint16_t SU:1; - vuint16_t:1; - vuint16_t CH:4; - } B; - } CLR[24]; /* Commands List Register x (double-buffered) (x = 1,...,24) */ - - /* Uncomment for Dual Conversion Mode */ - /*union { - vuint16_t R; - struct { - vuint16_t CIR:1; - vuint16_t FC:1; - vuint16_t CMS:1; - vuint16_t:1; - vuint16_t FIFO:2; - vuint16_t:1; - vuint16_t CHB:4; - vuint16_t :1; - vuint16_t CHA:4; - } B; - } CLR[24]; */ - /* Commands List Register x (double-buffered) (x = 1,...,24) */ - - uint16_t CTU_reserved1[8]; - - - union { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t DMAEN3:1; - vuint16_t DMAEN2:1; - vuint16_t DMAEN1:1; - vuint16_t DMAEN0:1; - } B; - } CR; /* Control Register */ - - uint16_t CTU_reserved2; - - union { - vuint32_t R; - struct { - vuint32_t FIFO_OVERRUN_EN7:1; - vuint32_t FIFO_OVERFLOW_EN7:1; - vuint32_t FIFO_EMPTY_EN7:1; - vuint32_t FIFO_FULL_EN7:1; - vuint32_t FIFO_OVERRUN_EN6:1; - vuint32_t FIFO_OVERFLOW_EN6:1; - vuint32_t FIFO_EMPTY_EN6:1; - vuint32_t FIFO_FULL_EN6:1; - vuint32_t FIFO_OVERRUN_EN5:1; - vuint32_t FIFO_OVERFLOW_EN5:1; - vuint32_t FIFO_EMPTY_EN5:1; - vuint32_t FIFO_FULL_EN5:1; - vuint32_t FIFO_OVERRUN_EN4:1; - vuint32_t FIFO_OVERFLOW_EN4:1; - vuint32_t FIFO_EMPTY_EN4:1; - vuint32_t FIFO_FULL_EN4:1; - vuint32_t FIFO_OVERRUN_EN3:1; - vuint32_t FIFO_OVERFLOW_EN3:1; - vuint32_t FIFO_EMPTY_EN3:1; - vuint32_t FIFO_FULL_EN3:1; - vuint32_t FIFO_OVERRUN_EN2:1; - vuint32_t FIFO_OVERFLOW_EN2:1; - vuint32_t FIFO_EMPTY_EN2:1; - vuint32_t FIFO_FULL_EN2:1; - vuint32_t FIFO_OVERRUN_EN1:1; - vuint32_t FIFO_OVERFLOW_EN1:1; - vuint32_t FIFO_EMPTY_EN1:1; - vuint32_t FIFO_FULL_EN1:1; - vuint32_t FIFO_OVERRUN_EN0:1; - vuint32_t FIFO_OVERFLOW_EN0:1; - vuint32_t FIFO_EMPTY_EN0:1; - vuint32_t FIFO_FULL_EN0:1; - } B; - } FCR; /* CONTROL REGISTER FIFO */ - - union { - vuint32_t R; - struct { - vuint32_t THRESHOLD3:8; - vuint32_t THRESHOLD2:8; - vuint32_t THRESHOLD1:8; - vuint32_t THRESHOLD0:8; - } B; - } TH1; /* Threshold Register */ - - union { - vuint32_t R; - struct { - vuint32_t THRESHOLD7:8; - vuint32_t THRESHOLD6:8; - vuint32_t THRESHOLD5:8; - vuint32_t THRESHOLD4:8; - } B; - } TH2; /* Threshold Register */ - - union { - vuint32_t R; - struct { - vuint32_t FIFO_OVERRUN7:1; - vuint32_t FIFO_OVERFLOW7:1; - vuint32_t FIFO_EMPTY7:1; - vuint32_t FIFO_FULL7:1; - vuint32_t FIFO_OVERRUN6:1; - vuint32_t FIFO_OVERFLOW6:1; - vuint32_t FIFO_EMPTY6:1; - vuint32_t FIFO_FULL6:1; - vuint32_t FIFO_OVERRUN5:1; - vuint32_t FIFO_OVERFLOW5:1; - vuint32_t FIFO_EMPTY5:1; - vuint32_t FIFO_FULL5:1; - vuint32_t FIFO_OVERRUN4:1; - vuint32_t FIFO_OVERFLOW4:1; - vuint32_t FIFO_EMPTY4:1; - vuint32_t FIFO_FULL4:1; - vuint32_t FIFO_OVERRUN3:1; - vuint32_t FIFO_OVERFLOW3:1; - vuint32_t FIFO_EMPTY3:1; - vuint32_t FIFO_FULL3:1; - vuint32_t FIFO_OVERRUN2:1; - vuint32_t FIFO_OVERFLOW2:1; - vuint32_t FIFO_EMPTY2:1; - vuint32_t FIFO_FULL2:1; - vuint32_t FIFO_OVERRUN1:1; - vuint32_t FIFO_OVERFLOW1:1; - vuint32_t FIFO_EMPTY1:1; - vuint32_t FIFO_FULL1:1; - vuint32_t FIFO_OVERRUN0:1; - vuint32_t FIFO_OVERFLOW0:1; - vuint32_t FIFO_EMPTY0:1; - vuint32_t FIFO_FULL0:1; - } B; - } STATUS; /* STATUS REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t:11; - vuint32_t NCH:5; - vuint32_t:6; - vuint32_t DATA:10; - } B; - } FRA[8]; /* FIFO RIGHT aligned REGISTER */ - - union { - vuint32_t R; - struct { - vuint32_t:11; - vuint32_t NCH:5; - vuint32_t DATA:10; - vuint32_t:6; - } B; - } FLA[8]; /* FIFO LEFT aligned REGISTER */ - - union { - vuint16_t R; - struct { - vuint16_t:7; - vuint16_t ETOE:1; - vuint16_t T1OE:1; - vuint16_t T0OE:1; - vuint16_t ADCOE:1; - vuint16_t TGSOSM:1; - vuint16_t MRSO:1; - vuint16_t ICE:1; - vuint16_t SMTO:1; - vuint16_t MRSRE:1; - } B; - } CTUEFR; /* Cross Triggering Unit Error Flag Register */ - - union { - vuint16_t R; - struct { - vuint16_t:6; - vuint16_t ADC:1; - vuint16_t T7:1; - vuint16_t T6:1; - vuint16_t T5:1; - vuint16_t T4:1; - vuint16_t T3:1; - vuint16_t T2:1; - vuint16_t T1:1; - vuint16_t T0:1; - vuint16_t MRS:1; - } B; - } CTUIFR; /* Cross Triggering Unit Interrupt Flag Register */ - - union { - vuint16_t R; - struct { - vuint16_t T7IE:1; - vuint16_t T6IE:1; - vuint16_t T5IE:1; - vuint16_t T4IE:1; - vuint16_t T3IE:1; - vuint16_t T2IE:1; - vuint16_t T1IE:1; - vuint16_t T0IE:1; - vuint16_t:5; - vuint16_t MRSDMAE:1; - vuint16_t MRSIE:1; - vuint16_t IEE:1; - } B; - } CTUIR; /* Cross Triggering Unit Interrupt/DMA Register */ - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t COTR:8; - } B; - } COTR; /* Control On-Time Register */ - - union { - vuint16_t R; - struct { - vuint16_t T7SG:1; - vuint16_t T6SG:1; - vuint16_t T5SG:1; - vuint16_t T4SG:1; - vuint16_t T3SG:1; - vuint16_t T2SG:1; - vuint16_t T1SG:1; - vuint16_t T0SG:1; - vuint16_t CTUADCRESET:1; - vuint16_t CTUODIS:1; - vuint16_t FILTERENABLE:1; - vuint16_t CGRE:1; - vuint16_t FGRE:1; - vuint16_t MRSSG:1; - vuint16_t GRE:1; - vuint16_t TGSISRRE:1; - } B; - } CTUCR; /* Cross Triggering Unit Control Register */ - - union { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t FILTERVALUE:8; - } B; - } CTUFILTER; /* Cross Triggering Unit Digital Filter */ - - union { - vuint16_t R; - struct { - vuint16_t:15; - vuint16_t MDIS:1; - } B; - } CTUPCR; /* Cross Triggering Unit Power Control */ - - }; /* end of CTU_tag */ -/****************************************************************************/ -/* MODULE : FCU */ -/****************************************************************************/ - struct FCU_tag { - - union { - vuint32_t R; - struct { - vuint32_t MCL:1; - vuint32_t TM:2; - vuint32_t:19; - vuint32_t PS:2; - vuint32_t FOM:2; - vuint32_t FOP:6; - } B; - } MCR; /* Module Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t SRF0:1; - vuint32_t SRF1:1; - vuint32_t SRF2:1; - vuint32_t SRF3:1; - vuint32_t SRF4:1; - vuint32_t SRF5:1; - vuint32_t SRF6:1; - vuint32_t SRF7:1; - vuint32_t SRF8:1; - vuint32_t SRF9:1; - vuint32_t SRF10:1; - vuint32_t SRF11:1; - vuint32_t SRF12:1; - vuint32_t SRF13:1; - vuint32_t SRF14:1; - vuint32_t SRF15:1; - vuint32_t HRF15:1; - vuint32_t HRF14:1; - vuint32_t HRF13:1; - vuint32_t HRF12:1; - vuint32_t HRF11:1; - vuint32_t HRF10:1; - vuint32_t HRF9:1; - vuint32_t HRF8:1; - vuint32_t HRF7:1; - vuint32_t HRF6:1; - vuint32_t HRF5:1; - vuint32_t HRF4:1; - vuint32_t HRF3:1; - vuint32_t HRF2:1; - vuint32_t HRF1:1; - vuint32_t HRF0:1; - } B; - } FFR; /* Fault Flag Register */ - - union { - vuint32_t R; - struct { - vuint32_t FRSRF0:1; - vuint32_t FRSRF1:1; - vuint32_t FRSRF2:1; - vuint32_t FRSRF3:1; - vuint32_t FRSRF4:1; - vuint32_t FRSRF5:1; - vuint32_t FRSRF6:1; - vuint32_t FRSRF7:1; - vuint32_t FRSRF8:1; - vuint32_t FRSRF9:1; - vuint32_t FRSRF10:1; - vuint32_t FRSRF11:1; - vuint32_t FRSRF12:1; - vuint32_t FRSRF13:1; - vuint32_t FRSRF14:1; - vuint32_t FRSRF15:1; - vuint32_t FRHRF15:1; - vuint32_t FRHRF14:1; - vuint32_t FRHRF13:1; - vuint32_t FRHRF12:1; - vuint32_t FRHRF11:1; - vuint32_t FRHRF10:1; - vuint32_t FRHRF9:1; - vuint32_t FRHRF8:1; - vuint32_t FRHRF7:1; - vuint32_t FRHRF6:1; - vuint32_t FRHRF5:1; - vuint32_t FRHRF4:1; - vuint32_t FRHRF3:1; - vuint32_t FRHRF2:1; - vuint32_t FRHRF1:1; - vuint32_t FRHRF0:1; - } B; - } FFFR; /* Frozen Fault Flag Register */ - - union { - vuint32_t R; - struct { - vuint32_t:2; - vuint32_t FSRF2:1; - vuint32_t FSRF3:1; - vuint32_t FSRF4:1; - vuint32_t FSRF5:1; - vuint32_t FSRF6:1; - vuint32_t FSRF7:1; - vuint32_t FSRF8:1; - vuint32_t FSRF9:1; - vuint32_t FSRF10:1; - vuint32_t FSRF11:1; - vuint32_t FSRF12:1; - vuint32_t FSRF13:1; - vuint32_t FSRF14:1; - vuint32_t FSRF15:1; - vuint32_t FHRF15:1; - vuint32_t FHRF14:1; - vuint32_t FHRF13:1; - vuint32_t FHRF12:1; - vuint32_t FHRF11:1; - vuint32_t FHRF10:1; - vuint32_t FHRF9:1; - vuint32_t FHRF8:1; - vuint32_t FHRF7:1; - vuint32_t FHRF6:1; - vuint32_t FHRF5:1; - vuint32_t FHRF4:1; - vuint32_t FHRF3:1; - vuint32_t FHRF2:1; - vuint32_t FHRF1:1; - vuint32_t FHRF0:1; - } B; - } FFGR; /* Fake Fault Generation Register */ - - union { - vuint32_t R; - struct { - vuint32_t ESF0:1; - vuint32_t ESF1:1; - vuint32_t ESF2:1; - vuint32_t ESF3:1; - vuint32_t ESF4:1; - vuint32_t ESF5:1; - vuint32_t ESF6:1; - vuint32_t ESF7:1; - vuint32_t ESF8:1; - vuint32_t ESF9:1; - vuint32_t ESF10:1; - vuint32_t ESF11:1; - vuint32_t ESF12:1; - vuint32_t ESF13:1; - vuint32_t ESF14:1; - vuint32_t ESF15:1; - vuint32_t EHF15:1; - vuint32_t EHF14:1; - vuint32_t EHF13:1; - vuint32_t EHF12:1; - vuint32_t EHF11:1; - vuint32_t EHF10:1; - vuint32_t EHF9:1; - vuint32_t EHF8:1; - vuint32_t EHF7:1; - vuint32_t EHF6:1; - vuint32_t EHF5:1; - vuint32_t EHF4:1; - vuint32_t EHF3:1; - vuint32_t EHF2:1; - vuint32_t EHF1:1; - vuint32_t EHF0:1; - } B; - } FER; /* Fault Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t KR:32; - } B; - } KR; /* Fault Collection Unit Key Register */ - - union { - vuint32_t R; - struct { - vuint32_t TR:32; - } B; - } TR; /* Fault Collection Unit Timeout Register */ - - union { - vuint32_t R; - struct { - vuint32_t TESF0:1; - vuint32_t TESF1:1; - vuint32_t TESF2:1; - vuint32_t TESF3:1; - vuint32_t TESF4:1; - vuint32_t TESF5:1; - vuint32_t TESF6:1; - vuint32_t TESF7:1; - vuint32_t TESF8:1; - vuint32_t TESF9:1; - vuint32_t TESF10:1; - vuint32_t TESF11:1; - vuint32_t TESF12:1; - vuint32_t TESF13:1; - vuint32_t TESF14:1; - vuint32_t TESF15:1; - vuint32_t TEHF15:1; - vuint32_t TEHF14:1; - vuint32_t TEHF13:1; - vuint32_t TEHF12:1; - vuint32_t TEHF11:1; - vuint32_t TEHF10:1; - vuint32_t TEHF9:1; - vuint32_t TEHF8:1; - vuint32_t TEHF7:1; - vuint32_t TEHF6:1; - vuint32_t TEHF5:1; - vuint32_t TEHF4:1; - vuint32_t TEHF3:1; - vuint32_t TEHF2:1; - vuint32_t TEHF1:1; - vuint32_t TEHF0:1; - } B; - } TER; /* Fault Collection Unit Timeout Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t S0:1; - vuint32_t S1:1; - vuint32_t S2:1; - vuint32_t S3:1; - } B; - } MSR; /* Module state register */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t MCPS:4; - vuint32_t:12; - vuint32_t MCAS:4; - } B; - } MCSR; /* MC state register */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t FRMCPS:4; - vuint32_t:12; - vuint32_t FRMCAS:4; - } B; - } FMCSR; /* Frozen MC State Register */ - - }; /* end of FCU_tag */ -/****************************************************************************/ -/* MODULE : SMC - Stepper Motor Control */ -/****************************************************************************/ - struct SMC_tag { - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t MCPRE:2; - vuint8_t MCSWAI:1; - vuint8_t:1; - vuint8_t DITH:1; - vuint8_t:1; - vuint8_t MCTOIF:1; - } B; - } CTL0; /* Motor Controller Control Register 0 */ - - union { - vuint8_t R; - struct { - vuint8_t RECIRC:1; - vuint8_t:6; - vuint8_t MCTOIE:1; - } B; - } CTL1; /* Motor Controller Control Register 1 */ - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t P:11; - } B; - } PER; /* Motor Controller Period Register */ - - int32_t SMC_reserved0[3]; /* (0x010 - 0x004)/4 = 0x01 */ - - union { - vuint8_t R; - struct { - vuint8_t MCOM:2; - vuint8_t MCAM:2; - vuint8_t:2; - vuint8_t CD:2; - } B; - } CC[12]; /* Motor Controller Channel Control Register 0->11 */ - - int32_t SMC_reserved1; /* (0x020 - 0x01C)/4 = 0x01 */ - - union { - vuint16_t R; - struct { - vuint16_t S:5; - vuint16_t D:11; - } B; - } DC[12]; /* Motor Controller Duty Cycle Register 0->11 */ - - int8_t SMC_reserved2[8]; /* (0x040 - 0x038) = 0x08 */ - - union { - vuint8_t R; - struct { - vuint8_t TOUT:8; - } B; - } SDTO; /* Shortcut detector time-out register */ - - int8_t SMC_reserved3[3]; /* (0x044 - 0x041) = 0x03 */ - - union { - vuint8_t R; - struct { - vuint8_t EN:8; - } B; - } SDE[3]; /* Shortcut detector enable register 0->2 */ - - int8_t SMC_reserved4; /* (0x048 - 0x047) = 0x01 */ - - union { - vuint8_t R; - struct { - vuint8_t IRQ_EN:8; - } B; - } SDIEN[3]; /* Shortcut detector interrupt enable register 0->2 */ - - int8_t SMC_reserved5; /* (0x04C - 0x04B) = 0x01 */ - - union { - vuint8_t R; - struct { - vuint8_t IRQ:8; - } B; - } SDI[3]; /* Shortcut detector interrupt register 0->2 */ - - }; /* end of SMC_tag */ -/****************************************************************************/ -/* MODULE : SSD - Stepper Stall Detect */ -/****************************************************************************/ - struct SSD_tag { - - union { - vuint16_t R; - struct { - vuint16_t TRIG:1; - vuint16_t STEP:2; - vuint16_t RCIR:1; - vuint16_t ITGDIR:1; - vuint16_t BLNDCL:1; - vuint16_t ITGDCL:1; - vuint16_t RTZE:1; - vuint16_t:1; - vuint16_t BLNST:1; - vuint16_t ITGST:1; - vuint16_t:3; - vuint16_t SDCPU:1; - vuint16_t DZDIS:1; - } B; - } CONTROL; /* Control & Status Register */ - - union { - vuint16_t R; - struct { - vuint16_t BLNIF:1; - vuint16_t ITGIF:1; - vuint16_t:5; - vuint16_t ACOVIF:1; - vuint16_t BLNIE:1; - vuint16_t ITGIE:1; - vuint16_t:5; - vuint16_t ACOVIE:1; - } B; - } IRQ; /* Interrupt Flag and Enable Register */ - - union { - vuint16_t R; - struct { - vuint16_t ITGACC:16; - } B; - } ITGACC; /* Integrator Accumulator register */ - - union { - vuint16_t R; - struct { - vuint16_t DCNT:16; - } B; - } DCNT; /* Down Counter Count register */ - - union { - vuint16_t R; - struct { - vuint16_t BLNCNTLD:16; - } B; - } BLNCNTLD; /* Blanking Counter Load register */ - - union { - vuint16_t R; - struct { - vuint16_t ITGCNTLD:16; - } B; - } ITGCNTLD; /* Integration Counter Load register */ - - union { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t BLNDIV:3; - vuint16_t:1; - vuint16_t ITSSDIV:3; - vuint16_t:2; - vuint16_t OFFCNC:2; - vuint16_t:1; - vuint16_t ACDIV:3; - } B; - } PRESCALE; /* Prescaler register */ - - union { - vuint16_t R; - struct { - vuint16_t TMST:1; - vuint16_t ANLOUT:1; - vuint16_t ANLIN:1; - vuint16_t SSDEN:1; - vuint16_t STEP1:1; - vuint16_t POL:1; - vuint16_t ITG:1; - vuint16_t DACHIZ:1; - vuint16_t BUFHIZ:1; - vuint16_t AMPHIZ:1; - vuint16_t RESSHORT:1; - vuint16_t ITSSDRV:1; - vuint16_t ITSSDRVEN:1; - vuint16_t REFDRV:1; - vuint16_t REFDRVEN:1; - } B; - } FNTEST; /* Functional Test Mode register */ - - }; /* end of SSD_tag */ -/****************************************************************************/ -/* MODULE : EMIOS */ -/****************************************************************************/ - struct EMIOS_CHANNEL_tag { - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t CADR:24; - } B; - } CADR; /* Channel A Data Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t CBDR:24; - } B; - } CBDR; /* Channel B Data Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t CCNTR:24; - } B; - } CCNTR; /* Channel Counter Register */ - - union { - vuint32_t R; - struct { - vuint32_t FREN:1; - vuint32_t ODIS:1; - vuint32_t ODISSL:2; - vuint32_t UCPRE:2; - vuint32_t UCPEN:1; - vuint32_t DMA:1; - vuint32_t:1; - vuint32_t IF:4; - vuint32_t FCK:1; - vuint32_t FEN:1; - vuint32_t:3; - vuint32_t FORCMA:1; - vuint32_t FORCMB:1; - vuint32_t:1; - vuint32_t BSL:2; - vuint32_t EDSEL:1; - vuint32_t EDPOL:1; - vuint32_t MODE:7; - } B; - } CCR; /* Channel Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t OVR:1; - vuint32_t:15; - vuint32_t OVFL:1; - vuint32_t:12; - vuint32_t UCIN:1; - vuint32_t UCOUT:1; - vuint32_t FLAG:1; - } B; - } CSR; /* Channel Status Register */ - - union { - vuint32_t R; /* Alternate Channel A Data Register */ - } ALTCADR; - - uint32_t emios_channel_reserved[2]; - - }; /* end of EMIOS_CHANNEL_tag */ - - struct EMIOS_tag { - union { - vuint32_t R; - struct { - vuint32_t:1; - vuint32_t MDIS:1; - vuint32_t FRZ:1; - vuint32_t GTBE:1; - vuint32_t ETB:1; - vuint32_t GPREN:1; - vuint32_t:6; - vuint32_t SRV:4; - vuint32_t GPRE:8; - vuint32_t:8; - } B; - } MCR; /* Module Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t F23:1; - vuint32_t F22:1; - vuint32_t F21:1; - vuint32_t F20:1; - vuint32_t F19:1; - vuint32_t F18:1; - vuint32_t F17:1; - vuint32_t F16:1; - vuint32_t F15:1; - vuint32_t F14:1; - vuint32_t F13:1; - vuint32_t F12:1; - vuint32_t F11:1; - vuint32_t F10:1; - vuint32_t F9:1; - vuint32_t F8:1; - vuint32_t F7:1; - vuint32_t F6:1; - vuint32_t F5:1; - vuint32_t F4:1; - vuint32_t F3:1; - vuint32_t F2:1; - vuint32_t F1:1; - vuint32_t F0:1; - } B; - } GFR; /* Global FLAG Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t OU23:1; - vuint32_t OU22:1; - vuint32_t OU21:1; - vuint32_t OU20:1; - vuint32_t OU19:1; - vuint32_t OU18:1; - vuint32_t OU17:1; - vuint32_t OU16:1; - vuint32_t OU15:1; - vuint32_t OU14:1; - vuint32_t OU13:1; - vuint32_t OU12:1; - vuint32_t OU11:1; - vuint32_t OU10:1; - vuint32_t OU9:1; - vuint32_t OU8:1; - vuint32_t OU7:1; - vuint32_t OU6:1; - vuint32_t OU5:1; - vuint32_t OU4:1; - vuint32_t OU3:1; - vuint32_t OU2:1; - vuint32_t OU1:1; - vuint32_t OU0:1; - } B; - } OUDR; /* Output Update Disable Register */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t CHDIS23:1; - vuint32_t CHDIS22:1; - vuint32_t CHDIS21:1; - vuint32_t CHDIS20:1; - vuint32_t CHDIS19:1; - vuint32_t CHDIS18:1; - vuint32_t CHDIS17:1; - vuint32_t CHDIS16:1; - vuint32_t CHDIS15:1; - vuint32_t CHDIS14:1; - vuint32_t CHDIS13:1; - vuint32_t CHDIS12:1; - vuint32_t CHDIS11:1; - vuint32_t CHDIS10:1; - vuint32_t CHDIS9:1; - vuint32_t CHDIS8:1; - vuint32_t CHDIS7:1; - vuint32_t CHDIS6:1; - vuint32_t CHDIS5:1; - vuint32_t CHDIS4:1; - vuint32_t CHDIS3:1; - vuint32_t CHDIS2:1; - vuint32_t CHDIS1:1; - vuint32_t CHDIS0:1; - } B; - } UCDIS; /* Disable Channel Register */ - - uint32_t emios_reserved1[4]; - - struct EMIOS_CHANNEL_tag CH[28]; - - }; /* end of EMIOS_tag */ -/****************************************************************************/ -/* MODULE : pit */ -/****************************************************************************/ - struct PIT_tag { - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t FRZ:1; - } B; - } PITMCR; - - uint32_t pit_reserved1[63]; /* (0x0100 - 0x0004)/4 = 0x3F */ - - struct { - union { - vuint32_t R; - struct { - vuint32_t TSV:32; - } B; - } LDVAL; - - union { - vuint32_t R; - struct { - vuint32_t TVL:32; - } B; - } CVAL; - - union { - vuint32_t R; - struct { - vuint32_t:30; - vuint32_t TIE:1; - vuint32_t TEN:1; - } B; - } TCTRL; - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t TIF:1; - } B; - } TFLG; - } CH[6]; - - }; /* end of PIT_tag */ -/****************************************************************************/ -/* MODULE : i2c */ -/****************************************************************************/ - struct I2C_tag { - union { - vuint8_t R; - struct { - vuint8_t ADR:7; - vuint8_t:1; - } B; - } IBAD; /* Module Bus Address Register */ - - union { - vuint8_t R; - struct { - vuint8_t IBC:8; - } B; - } IBFD; /* Module Bus Frequency Register */ - - union { - vuint8_t R; - struct { - vuint8_t MDIS:1; - vuint8_t IBIE:1; - vuint8_t MS:1; - vuint8_t TX:1; - vuint8_t NOACK:1; - vuint8_t RSTA:1; - vuint8_t DMAEN:1; - vuint8_t IBDOZE:1; - } B; - } IBCR; /* Module Bus Control Register */ - - union { - vuint8_t R; - struct { - vuint8_t TCF:1; - vuint8_t IAAS:1; - vuint8_t IBB:1; - vuint8_t IBAL:1; - vuint8_t:1; - vuint8_t SRW:1; - vuint8_t IBIF:1; - vuint8_t RXAK:1; - } B; - } IBSR; /* Module Status Register */ - - union { - vuint8_t R; - struct { - vuint8_t DATA:8; - } B; - } IBDR; /* Module Data Register */ - - union { - vuint8_t R; - struct { - vuint8_t BIIE:1; - vuint8_t:7; - } B; - } IBIC; /* Module Interrupt Configuration Register */ - - }; /* end of I2C_tag */ -/****************************************************************************/ -/* MODULE : MPU */ -/****************************************************************************/ - struct MPU_tag { - union { - vuint32_t R; - struct { - vuint32_t SPERR:8; - vuint32_t:4; - vuint32_t HRL:4; - vuint32_t NSP:4; - vuint32_t NGRD:4; - vuint32_t:7; - vuint32_t VLD:1; - } B; - } CESR; /* Module Control/Error Status Register */ - - uint32_t mpu_reserved1[3]; /* (0x010 - 0x004)/4 = 0x03 */ - - union { - vuint32_t R; - struct { - vuint32_t EADDR:32; - } B; - } EAR0; - - union { - vuint32_t R; - struct { - vuint32_t EACD:16; - vuint32_t EPID:8; - vuint32_t EMN:4; - vuint32_t EATTR:3; - vuint32_t ERW:1; - } B; - } EDR0; - - union { - vuint32_t R; - struct { - vuint32_t EADDR:32; - } B; - } EAR1; - - union { - vuint32_t R; - struct { - vuint32_t EACD:16; - vuint32_t EPID:8; - vuint32_t EMN:4; - vuint32_t EATTR:3; - vuint32_t ERW:1; - } B; - } EDR1; - - union { - vuint32_t R; - struct { - vuint32_t EADDR:32; - } B; - } EAR2; - - union { - vuint32_t R; - struct { - vuint32_t EACD:16; - vuint32_t EPID:8; - vuint32_t EMN:4; - vuint32_t EATTR:3; - vuint32_t ERW:1; - } B; - } EDR2; - - union { - vuint32_t R; - struct { - vuint32_t EADDR:32; - } B; - } EAR3; - - union { - vuint32_t R; - struct { - vuint32_t EACD:16; - vuint32_t EPID:8; - vuint32_t EMN:4; - vuint32_t EATTR:3; - vuint32_t ERW:1; - } B; - } EDR3; - - uint32_t mpu_reserved2[244]; /* (0x0400 - 0x0030)/4 = 0x0F4 */ - - struct { - union { - vuint32_t R; - struct { - vuint32_t SRTADDR:27; - vuint32_t:5; - } B; - } WORD0; /* Region Descriptor n Word 0 */ - - union { - vuint32_t R; - struct { - vuint32_t ENDADDR:27; - vuint32_t:5; - } B; - } WORD1; /* Region Descriptor n Word 1 */ - - union { - vuint32_t R; - struct { - vuint32_t M7RE:1; - vuint32_t M7WE:1; - vuint32_t M6RE:1; - vuint32_t M6WE:1; - vuint32_t M5RE:1; - vuint32_t M5WE:1; - vuint32_t M4RE:1; - vuint32_t M4WE:1; - vuint32_t M3PE:1; - vuint32_t M3SM:2; - vuint32_t M3UM:3; - vuint32_t M2PE:1; - vuint32_t M2SM:2; - vuint32_t M2UM:3; - vuint32_t M1PE:1; - vuint32_t M1SM:2; - vuint32_t M1UM:3; - vuint32_t M0PE:1; - vuint32_t M0SM:2; - vuint32_t M0UM:3; - } B; - } WORD2; /* Region Descriptor n Word 2 */ - - union { - vuint32_t R; - struct { - vuint32_t PID:8; - vuint32_t PIDMASK:8; - vuint32_t:15; - vuint32_t VLD:1; - } B; - } WORD3; /* Region Descriptor n Word 3 */ - - } RGD[16]; - - uint32_t mpu_reserved3[192]; /* (0x0800 - 0x0500)/4 = 0x0C0 */ - - union { - vuint32_t R; - struct { - vuint32_t M7RE:1; - vuint32_t M7WE:1; - vuint32_t M6RE:1; - vuint32_t M6WE:1; - vuint32_t M5RE:1; - vuint32_t M5WE:1; - vuint32_t M4RE:1; - vuint32_t M4WE:1; - vuint32_t M3PE:1; - vuint32_t M3SM:2; - vuint32_t M3UM:3; - vuint32_t M2PE:1; - vuint32_t M2SM:2; - vuint32_t M2UM:3; - vuint32_t M1PE:1; - vuint32_t M1SM:2; - vuint32_t M1UM:3; - vuint32_t M0PE:1; - vuint32_t M0SM:2; - vuint32_t M0UM:3; - } B; - } RGDAAC[16]; /* Region Descriptor Alternate Access Control n */ - - }; /* end of MPU_tag */ -/****************************************************************************/ -/* MODULE : eDMA */ -/****************************************************************************/ - -/*for "standard" format TCD (when EDMA.TCD[x].CITER.E_LINK==BITER.E_LINK=0) */ - struct EDMA_TCD_STD_tag { - - vuint32_t SADDR; /* source address */ - - vuint16_t SMOD:5; /* source address modulo */ - vuint16_t SSIZE:3; /* source transfer size */ - vuint16_t DMOD:5; /* destination address modulo */ - vuint16_t DSIZE:3; /* destination transfer size */ - vint16_t SOFF; /* signed source address offset */ - - vuint32_t NBYTES; /* inner (“minor”) byte count */ - - vint32_t SLAST; /* last destination address adjustment, or - scatter/gather address (if e_sg = 1) */ - - vuint32_t DADDR; /* destination address */ - - vuint16_t CITERE_LINK:1; - vuint16_t CITER:15; - - vint16_t DOFF; /* signed destination address offset */ - - vint32_t DLAST_SGA; - - vuint16_t BITERE_LINK:1; /* beginning ("major") iteration count */ - vuint16_t BITER:15; - - vuint16_t BWC:2; /* bandwidth control */ - vuint16_t MAJORLINKCH:6; /* enable channel-to-channel link */ - vuint16_t DONE:1; /* channel done */ - vuint16_t ACTIVE:1; /* channel active */ - vuint16_t MAJORE_LINK:1; /* enable channel-to-channel link */ - vuint16_t E_SG:1; /* enable scatter/gather descriptor */ - vuint16_t D_REQ:1; /* disable ipd_req when done */ - vuint16_t INT_HALF:1; /* interrupt on citer = (biter >> 1) */ - vuint16_t INT_MAJ:1; /* interrupt on major loop completion */ - vuint16_t START:1; /* explicit channel start */ - - }; /* end of EDMA_TCD_STD_tag */ - -/*for "channel link" format TCD (when EDMA.TCD[x].CITER.E_LINK==BITER.E_LINK=1)*/ - struct EDMA_TCD_CHLINK_tag { - - vuint32_t SADDR; /* source address */ - - vuint16_t SMOD:5; /* source address modulo */ - vuint16_t SSIZE:3; /* source transfer size */ - vuint16_t DMOD:5; /* destination address modulo */ - vuint16_t DSIZE:3; /* destination transfer size */ - vint16_t SOFF; /* signed source address offset */ - - vuint32_t NBYTES; /* inner (“minor”) byte count */ - - vint32_t SLAST; /* last destination address adjustment, or - scatter/gather address (if e_sg = 1) */ - - vuint32_t DADDR; /* destination address */ - - vuint16_t CITERE_LINK:1; - vuint16_t CITERLINKCH:6; - vuint16_t CITER:9; - - vint16_t DOFF; /* signed destination address offset */ - - vint32_t DLAST_SGA; - - vuint16_t BITERE_LINK:1; /* beginning (“major”) iteration count */ - vuint16_t BITERLINKCH:6; - vuint16_t BITER:9; - - vuint16_t BWC:2; /* bandwidth control */ - vuint16_t MAJORLINKCH:6; /* enable channel-to-channel link */ - vuint16_t DONE:1; /* channel done */ - vuint16_t ACTIVE:1; /* channel active */ - vuint16_t MAJORE_LINK:1; /* enable channel-to-channel link */ - vuint16_t E_SG:1; /* enable scatter/gather descriptor */ - vuint16_t D_REQ:1; /* disable ipd_req when done */ - vuint16_t INT_HALF:1; /* interrupt on citer = (biter >> 1) */ - vuint16_t INT_MAJ:1; /* interrupt on major loop completion */ - vuint16_t START:1; /* explicit channel start */ - - }; /* end of EDMA_TCD_CHLINK_tag */ - - struct EDMA_tag { - union { - vuint32_t R; - struct { - vuint32_t:29; - vuint32_t ERCA:1; - vuint32_t EDBG:1; - vuint32_t:1; - } B; - } CR; /* Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t VLD:1; - vuint32_t:15; - vuint32_t GPE:1; - vuint32_t CPE:1; - vuint32_t ERRCHN:6; - vuint32_t SAE:1; - vuint32_t SOE:1; - vuint32_t DAE:1; - vuint32_t DOE:1; - vuint32_t NCE:1; - vuint32_t SGE:1; - vuint32_t SBE:1; - vuint32_t DBE:1; - } B; - } ESR; /* Error Status Register */ - - int16_t EDMA_reserved1[3]; /* (0x0E - 0x08)/2 = 0x03 */ - - union { - vuint16_t R; - struct { - vuint16_t ERQ15:1; - vuint16_t ERQ14:1; - vuint16_t ERQ13:1; - vuint16_t ERQ12:1; - vuint16_t ERQ11:1; - vuint16_t ERQ10:1; - vuint16_t ERQ09:1; - vuint16_t ERQ08:1; - vuint16_t ERQ07:1; - vuint16_t ERQ06:1; - vuint16_t ERQ05:1; - vuint16_t ERQ04:1; - vuint16_t ERQ03:1; - vuint16_t ERQ02:1; - vuint16_t ERQ01:1; - vuint16_t ERQ00:1; - } B; - } ERQRL; /* DMA Enable Request Register Low */ - - int16_t EDMA_reserved2[3]; /* (0x16 - 0x10)/2 = 0x03 */ - - union { - vuint16_t R; - struct { - vuint16_t EEI15:1; - vuint16_t EEI14:1; - vuint16_t EEI13:1; - vuint16_t EEI12:1; - vuint16_t EEI11:1; - vuint16_t EEI10:1; - vuint16_t EEI09:1; - vuint16_t EEI08:1; - vuint16_t EEI07:1; - vuint16_t EEI06:1; - vuint16_t EEI05:1; - vuint16_t EEI04:1; - vuint16_t EEI03:1; - vuint16_t EEI02:1; - vuint16_t EEI01:1; - vuint16_t EEI00:1; - } B; - } EEIRL; /* DMA Enable Error Interrupt Register Low */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t SERQ:7; - } B; - } SERQR; /* DMA Set Enable Request Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t CERQ:7; - } B; - } CERQR; /* DMA Clear Enable Request Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t SEEI:7; - } B; - } SEEIR; /* DMA Set Enable Error Interrupt Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t CEEI:7; - } B; - } CEEIR; /* DMA Clear Enable Error Interrupt Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t CINT:7; - } B; - } CIRQR; /* DMA Clear Interrupt Request Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t CER:7; - } B; - } CERR; /* DMA Clear error Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t SSB:7; - } B; - } SSBR; /* Set Start Bit Register */ - - union { - vuint8_t R; - struct { - vuint8_t:1; - vuint8_t CDSB:7; - } B; - } CDSBR; /* Clear Done Status Bit Register */ - - int16_t EDMA_reserved3[3]; /* (0x26 - 0x20)/2 = 0x03 */ - - union { - vuint16_t R; - struct { - vuint16_t INT15:1; - vuint16_t INT14:1; - vuint16_t INT13:1; - vuint16_t INT12:1; - vuint16_t INT11:1; - vuint16_t INT10:1; - vuint16_t INT09:1; - vuint16_t INT08:1; - vuint16_t INT07:1; - vuint16_t INT06:1; - vuint16_t INT05:1; - vuint16_t INT04:1; - vuint16_t INT03:1; - vuint16_t INT02:1; - vuint16_t INT01:1; - vuint16_t INT00:1; - } B; - } IRQRL; /* DMA Interrupt Request Low */ - - int16_t EDMA_reserved4[3]; /* (0x2E - 0x28)/2 = 0x03 */ - - union { - vuint16_t R; - struct { - vuint16_t ERR15:1; - vuint16_t ERR14:1; - vuint16_t ERR13:1; - vuint16_t ERR12:1; - vuint16_t ERR11:1; - vuint16_t ERR10:1; - vuint16_t ERR09:1; - vuint16_t ERR08:1; - vuint16_t ERR07:1; - vuint16_t ERR06:1; - vuint16_t ERR05:1; - vuint16_t ERR04:1; - vuint16_t ERR03:1; - vuint16_t ERR02:1; - vuint16_t ERR01:1; - vuint16_t ERR00:1; - } B; - } ERL; /* DMA Error Low */ - - int16_t EDMA_reserved5[3]; /* (0x36 - 0x30)/2 = 0x03 */ - - union { - vuint16_t R; - struct { - vuint16_t HRS15:1; - vuint16_t HRS14:1; - vuint16_t HRS13:1; - vuint16_t HRS12:1; - vuint16_t HRS11:1; - vuint16_t HRS10:1; - vuint16_t HRS09:1; - vuint16_t HRS08:1; - vuint16_t HRS07:1; - vuint16_t HRS06:1; - vuint16_t HRS05:1; - vuint16_t HRS04:1; - vuint16_t HRS03:1; - vuint16_t HRS02:1; - vuint16_t HRS01:1; - vuint16_t HRS00:1; - } B; - } HRSL; /* DMA Hardware Request Status Low */ - - uint32_t edma_reserved1[50]; /* (0x100 - 0x038)/4 = 0x32 */ - - union { - vuint8_t R; - struct { - vuint8_t ECP:1; - vuint8_t DPA:1; - vuint8_t GRPPRI:2; - vuint8_t CHPRI:4; - } B; - } CPR[16]; /* Channel n Priority */ - - uint32_t edma_reserved2[956]; /* (0x1000 - 0x0110)/4 = 0x3BC */ - - struct EDMA_TCD_STD_tag TCD[16]; - /* struct EDMA_TCD_CHLINK_tag TCD[16]; */ - - }; /* end of EDMA_tag */ -/****************************************************************************/ -/* MODULE : INTC */ -/****************************************************************************/ - struct INTC_tag { - union { - vuint32_t R; - struct { - vuint32_t:26; - vuint32_t VTES:1; - vuint32_t:4; - vuint32_t HVEN:1; - } B; - } MCR; /* Module Configuration Register */ - - int32_t INTC_reserved1; /* (0x008 - 0x004)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t PRI:4; - } B; - } CPR; /* Current Priority Register */ - - int32_t INTC_reserved2; /* (0x010 - 0x00C)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t VTBA:21; - vuint32_t INTVEC:9; - vuint32_t:2; - } B; - } IACKR; /* Interrupt Acknowledge Register */ - - int32_t INTC_reserved3; /* (0x018 - 0x014)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t:32; - } B; - } EOIR; /* End of Interrupt Register */ - - int32_t INTC_reserved4; /* (0x020 - 0x01C)/4 = 0x01 */ - - union { - vuint8_t R; - struct { - vuint8_t:6; - vuint8_t SET:1; - vuint8_t CLR:1; - } B; - } SSCIR[8]; /* Software Set/Clear Interruput Register */ - - uint32_t intc_reserved5[6]; /* (0x040 - 0x028)/4 = 0x06 */ - - union { - vuint8_t R; - struct { - vuint8_t:4; - vuint8_t PRI:4; - } B; - } PSR[512]; /* Software Set/Clear Interrupt Register */ - - }; /* end of INTC_tag */ -/****************************************************************************/ -/* MODULE : DSPI */ -/****************************************************************************/ - struct DSPI_tag { - union { - vuint32_t R; - struct { - vuint32_t MSTR:1; - vuint32_t CONT_SCKE:1; - vuint32_t DCONF:2; - vuint32_t FRZ:1; - vuint32_t MTFE:1; - vuint32_t PCSSE:1; - vuint32_t ROOE:1; - vuint32_t PCSIS7:1; - vuint32_t PCSIS6:1; - vuint32_t PCSIS5:1; - vuint32_t PCSIS4:1; - vuint32_t PCSIS3:1; - vuint32_t PCSIS2:1; - vuint32_t PCSIS1:1; - vuint32_t PCSIS0:1; - vuint32_t:1; - vuint32_t MDIS:1; - vuint32_t DIS_TXF:1; - vuint32_t DIS_RXF:1; - vuint32_t CLR_TXF:1; - vuint32_t CLR_RXF:1; - vuint32_t SMPL_PT:2; - vuint32_t:7; - vuint32_t HALT:1; - } B; - } MCR; /* Module Configuration Register */ - - uint32_t dspi_reserved1; - - union { - vuint32_t R; - struct { - vuint32_t TCNT:16; - vuint32_t:16; - } B; - } TCR; - - union { - vuint32_t R; - struct { - vuint32_t DBR:1; - vuint32_t FMSZ:4; - vuint32_t CPOL:1; - vuint32_t CPHA:1; - vuint32_t LSBFE:1; - vuint32_t PCSSCK:2; - vuint32_t PASC:2; - vuint32_t PDT:2; - vuint32_t PBR:2; - vuint32_t CSSCK:4; - vuint32_t ASC:4; - vuint32_t DT:4; - vuint32_t BR:4; - } B; - } CTAR[8]; /* Clock and Transfer Attributes Registers */ - - union { - vuint32_t R; - struct { - vuint32_t TCF:1; - vuint32_t TXRXS:1; - vuint32_t:1; - vuint32_t EOQF:1; - vuint32_t TFUF:1; - vuint32_t:1; - vuint32_t TFFF:1; - vuint32_t:5; - vuint32_t RFOF:1; - vuint32_t:1; - vuint32_t RFDF:1; - vuint32_t:1; - vuint32_t TXCTR:4; - vuint32_t TXNXTPTR:4; - vuint32_t RXCTR:4; - vuint32_t POPNXTPTR:4; - } B; - } SR; /* Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t TCFRE:1; - vuint32_t:2; - vuint32_t EOQFRE:1; - vuint32_t TFUFRE:1; - vuint32_t:1; - vuint32_t TFFFRE:1; - vuint32_t TFFFDIRS:1; - vuint32_t:4; - vuint32_t RFOFRE:1; - vuint32_t:1; - vuint32_t RFDFRE:1; - vuint32_t RFDFDIRS:1; - vuint32_t:16; - } B; - } RSER; /* DMA/Interrupt Request Select and Enable Register */ - - union { - vuint32_t R; - struct { - vuint32_t CONT:1; - vuint32_t CTAS:3; - vuint32_t EOQ:1; - vuint32_t CTCNT:1; - vuint32_t:2; - vuint32_t PCS7:1; - vuint32_t PCS6:1; - vuint32_t PCS5:1; - vuint32_t PCS4:1; - vuint32_t PCS3:1; - vuint32_t PCS2:1; - vuint32_t PCS1:1; - vuint32_t PCS0:1; - vuint32_t TXDATA:16; - } B; - } PUSHR; /* PUSH TX FIFO Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RXDATA:16; - } B; - } POPR; /* POP RX FIFO Register */ - - union { - vuint32_t R; - struct { - vuint32_t TXCMD:16; - vuint32_t TXDATA:16; - } B; - } TXFR[5]; /* Transmit FIFO Registers */ - - vuint32_t DSPI_reserved_txf[11]; - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RXDATA:16; - } B; - } RXFR[5]; /* Receive FIFO Registers */ - - vuint32_t DSPI_reserved_rxf[12]; - - union { - vuint32_t R; - struct { - vuint32_t MTOE:1; - vuint32_t:1; - vuint32_t MTOCNT:6; - vuint32_t:4; - vuint32_t TXSS:1; - vuint32_t TPOL:1; - vuint32_t TRRE:1; - vuint32_t CID:1; - vuint32_t DCONT:1; - vuint32_t DSICTAS:3; - vuint32_t:6; - vuint32_t DPCS5:1; - vuint32_t DPCS4:1; - vuint32_t DPCS3:1; - vuint32_t DPCS2:1; - vuint32_t DPCS1:1; - vuint32_t DPCS0:1; - } B; - } DSICR; /* DSI Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t SER_DATA:16; - } B; - } SDR; /* DSI Serialization Data Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t ASER_DATA:16; - } B; - } ASDR; /* DSI Alternate Serialization Data Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t COMP_DATA:16; - } B; - } COMPR; /* DSI Transmit Comparison Register */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t DESER_DATA:16; - } B; - } DDR; /* DSI deserialization Data Register */ - - }; /* end of DSPI_tag */ -/****************************************************************************/ -/* MODULE : FlexCAN */ -/****************************************************************************/ - struct FLEXCAN_BUF_t { - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t CODE:4; - vuint32_t:1; - vuint32_t SRR:1; - vuint32_t IDE:1; - vuint32_t RTR:1; - vuint32_t LENGTH:4; - vuint32_t TIMESTAMP:16; - } B; - } CS; - - union { - vuint32_t R; - struct { - vuint32_t PRIO:3; - vuint32_t STD_ID:11; - vuint32_t EXT_ID:18; - } B; - } ID; - - union { - /*vuint8_t B[8]; *//* Data buffer in Bytes (8 bits) */ - /*vuint16_t H[4]; *//* Data buffer in Half-words (16 bits) */ - vuint32_t W[2]; /* Data buffer in words (32 bits) */ - /*vuint32_t R[2]; *//* Data buffer in words (32 bits) */ - } DATA; - - }; /* end of FLEXCAN_BUF_t */ - - struct FLEXCAN_RXFIFO_t { - union { - vuint32_t R; - struct { - vuint32_t:9; - vuint32_t SRR:1; - vuint32_t IDE:1; - vuint32_t RTR:1; - vuint32_t LENGTH:4; - vuint32_t TIMESTAMP:16; - } B; - } CS; - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t STD_ID:11; - vuint32_t EXT_ID:18; - } B; - } ID; - - union { - /*vuint8_t B[8]; *//* Data buffer in Bytes (8 bits) */ - /*vuint16_t H[4]; *//* Data buffer in Half-words (16 bits) */ - vuint32_t W[2]; /* Data buffer in words (32 bits) */ - /*vuint32_t R[2]; *//* Data buffer in words (32 bits) */ - } DATA; - - uint32_t FLEXCAN_RXFIFO_reserved[20]; /* {0x00E0-0x0090}/0x4 = 0x14 */ - - union { - vuint32_t R; - } IDTABLE[8]; - - }; /* end of FLEXCAN_RXFIFO_t */ - - struct FLEXCAN_tag { - union { - vuint32_t R; - struct { - vuint32_t MDIS:1; - vuint32_t FRZ:1; - vuint32_t FEN:1; - vuint32_t HALT:1; - vuint32_t NOTRDY:1; - vuint32_t WAKMSK:1; - vuint32_t SOFTRST:1; - vuint32_t FRZACK:1; - vuint32_t SUPV:1; - vuint32_t SLFWAK:1; - vuint32_t WRNEN:1; - vuint32_t LPMACK:1; - vuint32_t WAKSRC:1; - vuint32_t:1; - vuint32_t SRXDIS:1; - vuint32_t BCC:1; - vuint32_t:2; - vuint32_t LPRIO_EN:1; - vuint32_t AEN:1; - vuint32_t:2; - vuint32_t IDAM:2; - vuint32_t:2; - vuint32_t MAXMB:6; - } B; - } MCR; /* Module Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t PRESDIV:8; - vuint32_t RJW:2; - vuint32_t PSEG1:3; - vuint32_t PSEG2:3; - vuint32_t BOFFMSK:1; - vuint32_t ERRMSK:1; - vuint32_t CLKSRC:1; - vuint32_t LPB:1; - vuint32_t TWRNMSK:1; - vuint32_t RWRNMSK:1; - vuint32_t:2; - vuint32_t SMP:1; - vuint32_t BOFFREC:1; - vuint32_t TSYN:1; - vuint32_t LBUF:1; - vuint32_t LOM:1; - vuint32_t PROPSEG:3; - } B; - } CR; /* Control Register */ - - union { - vuint32_t R; - } TIMER; /* Free Running Timer */ - - uint32_t FLEXCAN_reserved1; - - union { - vuint32_t R; - struct { - vuint32_t MI:32; - } B; - } RXGMASK; /* RX Global Mask */ - - union { - vuint32_t R; - struct { - vuint32_t MI:32; - } B; - } RX14MASK; /* RX 14 Mask */ - - union { - vuint32_t R; - struct { - vuint32_t MI:32; - } B; - } RX15MASK; /* RX 15 Mask */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RXECNT:8; - vuint32_t TXECNT:8; - } B; - } ECR; /* Error Counter Register */ - - union { - vuint32_t R; - struct { - vuint32_t:14; - vuint32_t TWRNINT:1; - vuint32_t RWRNINT:1; - vuint32_t BIT1ERR:1; - vuint32_t BIT0ERR:1; - vuint32_t ACKERR:1; - vuint32_t CRCERR:1; - vuint32_t FRMERR:1; - vuint32_t STFERR:1; - vuint32_t TXWRN:1; - vuint32_t RXWRN:1; - vuint32_t IDLE:1; - vuint32_t TXRX:1; - vuint32_t FLTCONF:2; - vuint32_t:1; - vuint32_t BOFFINT:1; - vuint32_t ERRINT:1; - vuint32_t WAKINT:1; - } B; - } ESR; /* Error and Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t BUF63M:1; - vuint32_t BUF62M:1; - vuint32_t BUF61M:1; - vuint32_t BUF60M:1; - vuint32_t BUF59M:1; - vuint32_t BUF58M:1; - vuint32_t BUF57M:1; - vuint32_t BUF56M:1; - vuint32_t BUF55M:1; - vuint32_t BUF54M:1; - vuint32_t BUF53M:1; - vuint32_t BUF52M:1; - vuint32_t BUF51M:1; - vuint32_t BUF50M:1; - vuint32_t BUF49M:1; - vuint32_t BUF48M:1; - vuint32_t BUF47M:1; - vuint32_t BUF46M:1; - vuint32_t BUF45M:1; - vuint32_t BUF44M:1; - vuint32_t BUF43M:1; - vuint32_t BUF42M:1; - vuint32_t BUF41M:1; - vuint32_t BUF40M:1; - vuint32_t BUF39M:1; - vuint32_t BUF38M:1; - vuint32_t BUF37M:1; - vuint32_t BUF36M:1; - vuint32_t BUF35M:1; - vuint32_t BUF34M:1; - vuint32_t BUF33M:1; - vuint32_t BUF32M:1; - } B; - } IMRH; /* Interruput Masks Register */ - - union { - vuint32_t R; - struct { - vuint32_t BUF31M:1; - vuint32_t BUF30M:1; - vuint32_t BUF29M:1; - vuint32_t BUF28M:1; - vuint32_t BUF27M:1; - vuint32_t BUF26M:1; - vuint32_t BUF25M:1; - vuint32_t BUF24M:1; - vuint32_t BUF23M:1; - vuint32_t BUF22M:1; - vuint32_t BUF21M:1; - vuint32_t BUF20M:1; - vuint32_t BUF19M:1; - vuint32_t BUF18M:1; - vuint32_t BUF17M:1; - vuint32_t BUF16M:1; - vuint32_t BUF15M:1; - vuint32_t BUF14M:1; - vuint32_t BUF13M:1; - vuint32_t BUF12M:1; - vuint32_t BUF11M:1; - vuint32_t BUF10M:1; - vuint32_t BUF09M:1; - vuint32_t BUF08M:1; - vuint32_t BUF07M:1; - vuint32_t BUF06M:1; - vuint32_t BUF05M:1; - vuint32_t BUF04M:1; - vuint32_t BUF03M:1; - vuint32_t BUF02M:1; - vuint32_t BUF01M:1; - vuint32_t BUF00M:1; - } B; - } IMRL; /* Interruput Masks Register */ - - union { - vuint32_t R; - struct { - vuint32_t BUF63I:1; - vuint32_t BUF62I:1; - vuint32_t BUF61I:1; - vuint32_t BUF60I:1; - vuint32_t BUF59I:1; - vuint32_t BUF58I:1; - vuint32_t BUF57I:1; - vuint32_t BUF56I:1; - vuint32_t BUF55I:1; - vuint32_t BUF54I:1; - vuint32_t BUF53I:1; - vuint32_t BUF52I:1; - vuint32_t BUF51I:1; - vuint32_t BUF50I:1; - vuint32_t BUF49I:1; - vuint32_t BUF48I:1; - vuint32_t BUF47I:1; - vuint32_t BUF46I:1; - vuint32_t BUF45I:1; - vuint32_t BUF44I:1; - vuint32_t BUF43I:1; - vuint32_t BUF42I:1; - vuint32_t BUF41I:1; - vuint32_t BUF40I:1; - vuint32_t BUF39I:1; - vuint32_t BUF38I:1; - vuint32_t BUF37I:1; - vuint32_t BUF36I:1; - vuint32_t BUF35I:1; - vuint32_t BUF34I:1; - vuint32_t BUF33I:1; - vuint32_t BUF32I:1; - } B; - } IFRH; /* Interruput Flag Register */ - - union { - vuint32_t R; - struct { - vuint32_t BUF31I:1; - vuint32_t BUF30I:1; - vuint32_t BUF29I:1; - vuint32_t BUF28I:1; - vuint32_t BUF27I:1; - vuint32_t BUF26I:1; - vuint32_t BUF25I:1; - vuint32_t BUF24I:1; - vuint32_t BUF23I:1; - vuint32_t BUF22I:1; - vuint32_t BUF21I:1; - vuint32_t BUF20I:1; - vuint32_t BUF19I:1; - vuint32_t BUF18I:1; - vuint32_t BUF17I:1; - vuint32_t BUF16I:1; - vuint32_t BUF15I:1; - vuint32_t BUF14I:1; - vuint32_t BUF13I:1; - vuint32_t BUF12I:1; - vuint32_t BUF11I:1; - vuint32_t BUF10I:1; - vuint32_t BUF09I:1; - vuint32_t BUF08I:1; - vuint32_t BUF07I:1; - vuint32_t BUF06I:1; - vuint32_t BUF05I:1; - vuint32_t BUF04I:1; - vuint32_t BUF03I:1; - vuint32_t BUF02I:1; - vuint32_t BUF01I:1; - vuint32_t BUF00I:1; - } B; - } IFRL; /* Interruput Flag Register */ - - uint32_t FLEXCAN_reserved2[19]; /* {0x0080-0x0034}/0x4 = 0x13 */ - -/****************************************************************************/ -/* Use either Standard Buffer Structure OR RX FIFO and Buffer Structure */ -/****************************************************************************/ - /* Standard Buffer Structure */ - struct FLEXCAN_BUF_t BUF[64]; - - /* RX FIFO and Buffer Structure */ - /*struct FLEXCAN_RXFIFO_t RXFIFO; */ - /*struct FLEXCAN_BUF_t BUF[56]; */ -/****************************************************************************/ - - uint32_t FLEXCAN_reserved3[256]; /* {0x0880-0x0480}/0x4 = 0x100 */ - - union { - vuint32_t R; - struct { - vuint32_t MI:32; - } B; - } RXIMR[64]; /* RX Individual Mask Registers */ - - }; /* end of FLEXCAN_tag */ -/****************************************************************************/ -/* MODULE : DMAMUX */ -/****************************************************************************/ - struct DMAMUX_tag { - union { - vuint8_t R; - struct { - vuint8_t ENBL:1; - vuint8_t TRIG:1; - vuint8_t SOURCE:6; - } B; - } CHCONFIG[16]; /* DMA Channel Configuration Register */ - - }; /* end of DMAMUX_tag */ -/****************************************************************************/ -/* MODULE : FlexRay */ -/****************************************************************************/ - - typedef union uMVR { - vuint16_t R; - struct { - vuint16_t CHIVER:8; /* CHI Version Number */ - vuint16_t PEVER:8; /* PE Version Number */ - } B; - } MVR_t; - - typedef union uMCR { - vuint16_t R; - struct { - vuint16_t MEN:1; /* module enable */ - vuint16_t:1; - vuint16_t SCMD:1; /* single channel mode */ - vuint16_t CHB:1; /* channel B enable */ - vuint16_t CHA:1; /* channel A enable */ - vuint16_t SFFE:1; /* synchronization frame filter enable */ - vuint16_t:5; - vuint16_t CLKSEL:1; /* protocol engine clock source select */ - vuint16_t BITRATE:3; /* protocol engine clock prescaler */ - vuint16_t:1; - } B; - } MCR_t; - typedef union uSTBSCR { - vuint16_t R; - struct { - vuint16_t WMD:1; /* write mode */ - vuint16_t STBSSEL:7; /* strobe signal select */ - vuint16_t:3; - vuint16_t ENB:1; /* strobe signal enable */ - vuint16_t:2; - vuint16_t STBPSEL:2; /* strobe port select */ - } B; - } STBSCR_t; - typedef union uSTBPCR { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t STB3EN:1; /* strobe port enable */ - vuint16_t STB2EN:1; /* strobe port enable */ - vuint16_t STB1EN:1; /* strobe port enable */ - vuint16_t STB0EN:1; /* strobe port enable */ - } B; - } STBPCR_t; - - typedef union uMBDSR { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t MBSEG2DS:7; /* message buffer segment 2 data size */ - vuint16_t:1; - vuint16_t MBSEG1DS:7; /* message buffer segment 1 data size */ - } B; - } MBDSR_t; - - typedef union uMBSSUTR { - vuint16_t R; - struct { - - vuint16_t:2; - vuint16_t LAST_MB_SEG1:6; /* last message buffer control register for message buffer segment 1 */ - vuint16_t:2; - vuint16_t LAST_MB_UTIL:6; /* last message buffer utilized */ - } B; - } MBSSUTR_t; - - typedef union uPOCR { - vuint16_t R; - vuint8_t byte[2]; - struct { - vuint16_t WME:1; /* write mode external correction command */ - vuint16_t:3; - vuint16_t EOC_AP:2; /* external offset correction application */ - vuint16_t ERC_AP:2; /* external rate correction application */ - vuint16_t BSY:1; /* command write busy / write mode command */ - vuint16_t:3; - vuint16_t POCCMD:4; /* protocol command */ - } B; - } POCR_t; -/* protocol commands */ - typedef union uGIFER { - vuint16_t R; - struct { - vuint16_t MIF:1; /* module interrupt flag */ - vuint16_t PRIF:1; /* protocol interrupt flag */ - vuint16_t CHIF:1; /* CHI interrupt flag */ - vuint16_t WKUPIF:1; /* wakeup interrupt flag */ - vuint16_t FNEBIF:1; /* receive FIFO channel B not empty interrupt flag */ - vuint16_t FNEAIF:1; /* receive FIFO channel A not empty interrupt flag */ - vuint16_t RBIF:1; /* receive message buffer interrupt flag */ - vuint16_t TBIF:1; /* transmit buffer interrupt flag */ - vuint16_t MIE:1; /* module interrupt enable */ - vuint16_t PRIE:1; /* protocol interrupt enable */ - vuint16_t CHIE:1; /* CHI interrupt enable */ - vuint16_t WKUPIE:1; /* wakeup interrupt enable */ - vuint16_t FNEBIE:1; /* receive FIFO channel B not empty interrupt enable */ - vuint16_t FNEAIE:1; /* receive FIFO channel A not empty interrupt enable */ - vuint16_t RBIE:1; /* receive message buffer interrupt enable */ - vuint16_t TBIE:1; /* transmit buffer interrupt enable */ - } B; - } GIFER_t; - typedef union uPIFR0 { - vuint16_t R; - struct { - vuint16_t FATLIF:1; /* fatal protocol error interrupt flag */ - vuint16_t INTLIF:1; /* internal protocol error interrupt flag */ - vuint16_t ILCFIF:1; /* illegal protocol configuration flag */ - vuint16_t CSAIF:1; /* cold start abort interrupt flag */ - vuint16_t MRCIF:1; /* missing rate correctio interrupt flag */ - vuint16_t MOCIF:1; /* missing offset correctio interrupt flag */ - vuint16_t CCLIF:1; /* clock correction limit reached interrupt flag */ - vuint16_t MXSIF:1; /* max sync frames detected interrupt flag */ - vuint16_t MTXIF:1; /* media access test symbol received flag */ - vuint16_t LTXBIF:1; /* pdLatestTx violation on channel B interrupt flag */ - vuint16_t LTXAIF:1; /* pdLatestTx violation on channel A interrupt flag */ - vuint16_t TBVBIF:1; /* Transmission across boundary on channel B Interrupt Flag */ - vuint16_t TBVAIF:1; /* Transmission across boundary on channel A Interrupt Flag */ - vuint16_t TI2IF:1; /* timer 2 expired interrupt flag */ - vuint16_t TI1IF:1; /* timer 1 expired interrupt flag */ - vuint16_t CYSIF:1; /* cycle start interrupt flag */ - } B; - } PIFR0_t; - typedef union uPIFR1 { - vuint16_t R; - struct { - vuint16_t EMCIF:1; /* error mode changed interrupt flag */ - vuint16_t IPCIF:1; /* illegal protocol command interrupt flag */ - vuint16_t PECFIF:1; /* protocol engine communication failure interrupt flag */ - vuint16_t PSCIF:1; /* Protocol State Changed Interrupt Flag */ - vuint16_t SSI3IF:1; /* slot status counter incremented interrupt flag */ - vuint16_t SSI2IF:1; /* slot status counter incremented interrupt flag */ - vuint16_t SSI1IF:1; /* slot status counter incremented interrupt flag */ - vuint16_t SSI0IF:1; /* slot status counter incremented interrupt flag */ - vuint16_t:2; - vuint16_t EVTIF:1; /* even cycle table written interrupt flag */ - vuint16_t ODTIF:1; /* odd cycle table written interrupt flag */ - vuint16_t:4; - } B; - } PIFR1_t; - typedef union uPIER0 { - vuint16_t R; - struct { - vuint16_t FATLIE:1; /* fatal protocol error interrupt enable */ - vuint16_t INTLIE:1; /* internal protocol error interrupt interrupt enable */ - vuint16_t ILCFIE:1; /* illegal protocol configuration interrupt enable */ - vuint16_t CSAIE:1; /* cold start abort interrupt enable */ - vuint16_t MRCIE:1; /* missing rate correctio interrupt enable */ - vuint16_t MOCIE:1; /* missing offset correctio interrupt enable */ - vuint16_t CCLIE:1; /* clock correction limit reached interrupt enable */ - vuint16_t MXSIE:1; /* max sync frames detected interrupt enable */ - vuint16_t MTXIE:1; /* media access test symbol received interrupt enable */ - vuint16_t LTXBIE:1; /* pdLatestTx violation on channel B interrupt enable */ - vuint16_t LTXAIE:1; /* pdLatestTx violation on channel A interrupt enable */ - vuint16_t TBVBIE:1; /* Transmission across boundary on channel B Interrupt enable */ - vuint16_t TBVAIE:1; /* Transmission across boundary on channel A Interrupt enable */ - vuint16_t TI2IE:1; /* timer 2 expired interrupt enable */ - vuint16_t TI1IE:1; /* timer 1 expired interrupt enable */ - vuint16_t CYSIE:1; /* cycle start interrupt enable */ - } B; - } PIER0_t; - typedef union uPIER1 { - vuint16_t R; - struct { - vuint16_t EMCIE:1; /* error mode changed interrupt enable */ - vuint16_t IPCIE:1; /* illegal protocol command interrupt enable */ - vuint16_t PECFIE:1; /* protocol engine communication failure interrupt enable */ - vuint16_t PSCIE:1; /* Protocol State Changed Interrupt enable */ - vuint16_t SSI3IE:1; /* slot status counter incremented interrupt enable */ - vuint16_t SSI2IE:1; /* slot status counter incremented interrupt enable */ - vuint16_t SSI1IE:1; /* slot status counter incremented interrupt enable */ - vuint16_t SSI0IE:1; /* slot status counter incremented interrupt enable */ - vuint16_t:2; - vuint16_t EVTIE:1; /* even cycle table written interrupt enable */ - vuint16_t ODTIE:1; /* odd cycle table written interrupt enable */ - vuint16_t:4; - } B; - } PIER1_t; - typedef union uCHIERFR { - vuint16_t R; - struct { - vuint16_t FRLBEF:1; /* flame lost channel B error flag */ - vuint16_t FRLAEF:1; /* frame lost channel A error flag */ - vuint16_t PCMIEF:1; /* command ignored error flag */ - vuint16_t FOVBEF:1; /* receive FIFO overrun channel B error flag */ - vuint16_t FOVAEF:1; /* receive FIFO overrun channel A error flag */ - vuint16_t MSBEF:1; /* message buffer search error flag */ - vuint16_t MBUEF:1; /* message buffer utilization error flag */ - vuint16_t LCKEF:1; /* lock error flag */ - vuint16_t DBLEF:1; /* double transmit message buffer lock error flag */ - vuint16_t SBCFEF:1; /* system bus communication failure error flag */ - vuint16_t FIDEF:1; /* frame ID error flag */ - vuint16_t DPLEF:1; /* dynamic payload length error flag */ - vuint16_t SPLEF:1; /* static payload length error flag */ - vuint16_t NMLEF:1; /* network management length error flag */ - vuint16_t NMFEF:1; /* network management frame error flag */ - vuint16_t ILSAEF:1; /* illegal access error flag */ - } B; - } CHIERFR_t; - typedef union uMBIVEC { - vuint16_t R; - struct { - - vuint16_t:2; - vuint16_t TBIVEC:6; /* transmit buffer interrupt vector */ - vuint16_t:2; - vuint16_t RBIVEC:6; /* receive buffer interrupt vector */ - } B; - } MBIVEC_t; - - typedef union uPSR0 { - vuint16_t R; - struct { - vuint16_t ERRMODE:2; /* error mode */ - vuint16_t SLOTMODE:2; /* slot mode */ - vuint16_t:1; - vuint16_t PROTSTATE:3; /* protocol state */ - vuint16_t SUBSTATE:4; /* protocol sub state */ - vuint16_t:1; - vuint16_t WAKEUPSTATUS:3; /* wakeup status */ - } B; - } PSR0_t; - -/* protocol states */ -/* protocol sub-states */ -/* wakeup status */ - typedef union uPSR1 { - vuint16_t R; - struct { - vuint16_t CSAA:1; /* cold start attempt abort flag */ - vuint16_t CSP:1; /* cold start path */ - vuint16_t:1; - vuint16_t REMCSAT:5; /* remanining coldstart attempts */ - vuint16_t CPN:1; /* cold start noise path */ - vuint16_t HHR:1; /* host halt request pending */ - vuint16_t FRZ:1; /* freeze occured */ - vuint16_t APTAC:5; /* allow passive to active counter */ - } B; - } PSR1_t; - typedef union uPSR2 { - vuint16_t R; - struct { - vuint16_t NBVB:1; /* NIT boundary violation on channel B */ - vuint16_t NSEB:1; /* NIT syntax error on channel B */ - vuint16_t STCB:1; /* symbol window transmit conflict on channel B */ - vuint16_t SBVB:1; /* symbol window boundary violation on channel B */ - vuint16_t SSEB:1; /* symbol window syntax error on channel B */ - vuint16_t MTB:1; /* media access test symbol MTS received on channel B */ - vuint16_t NBVA:1; /* NIT boundary violation on channel A */ - vuint16_t NSEA:1; /* NIT syntax error on channel A */ - vuint16_t STCA:1; /* symbol window transmit conflict on channel A */ - vuint16_t SBVA:1; /* symbol window boundary violation on channel A */ - vuint16_t SSEA:1; /* symbol window syntax error on channel A */ - vuint16_t MTA:1; /* media access test symbol MTS received on channel A */ - vuint16_t CLKCORRFAILCNT:4; /* clock correction failed counter */ - } B; - } PSR2_t; - typedef union uPSR3 { - vuint16_t R; - struct { - vuint16_t:2; - vuint16_t WUB:1; /* wakeup symbol received on channel B */ - vuint16_t ABVB:1; /* aggregated boundary violation on channel B */ - vuint16_t AACB:1; /* aggregated additional communication on channel B */ - vuint16_t ACEB:1; /* aggregated content error on channel B */ - vuint16_t ASEB:1; /* aggregated syntax error on channel B */ - vuint16_t AVFB:1; /* aggregated valid frame on channel B */ - vuint16_t:2; - vuint16_t WUA:1; /* wakeup symbol received on channel A */ - vuint16_t ABVA:1; /* aggregated boundary violation on channel A */ - vuint16_t AACA:1; /* aggregated additional communication on channel A */ - vuint16_t ACEA:1; /* aggregated content error on channel A */ - vuint16_t ASEA:1; /* aggregated syntax error on channel A */ - vuint16_t AVFA:1; /* aggregated valid frame on channel A */ - } B; - } PSR3_t; - typedef union uCIFRR { - vuint16_t R; - struct { - vuint16_t:8; - vuint16_t MIFR:1; /* module interrupt flag */ - vuint16_t PRIFR:1; /* protocol interrupt flag */ - vuint16_t CHIFR:1; /* CHI interrupt flag */ - vuint16_t WUPIFR:1; /* wakeup interrupt flag */ - vuint16_t FNEBIFR:1; /* receive fifo channel B no empty interrupt flag */ - vuint16_t FNEAIFR:1; /* receive fifo channel A no empty interrupt flag */ - vuint16_t RBIFR:1; /* receive message buffer interrupt flag */ - vuint16_t TBIFR:1; /* transmit buffer interrupt flag */ - } B; - } CIFRR_t; - typedef union uSFCNTR { - vuint16_t R; - struct { - vuint16_t SFEVB:4; /* sync frames channel B, even cycle */ - vuint16_t SFEVA:4; /* sync frames channel A, even cycle */ - vuint16_t SFODB:4; /* sync frames channel B, odd cycle */ - vuint16_t SFODA:4; /* sync frames channel A, odd cycle */ - } B; - } SFCNTR_t; - - typedef union uSFTCCSR { - vuint16_t R; - struct { - vuint16_t ELKT:1; /* even cycle tables lock and unlock trigger */ - vuint16_t OLKT:1; /* odd cycle tables lock and unlock trigger */ - vuint16_t CYCNUM:6; /* cycle number */ - vuint16_t ELKS:1; /* even cycle tables lock status */ - vuint16_t OLKS:1; /* odd cycle tables lock status */ - vuint16_t EVAL:1; /* even cycle tables valid */ - vuint16_t OVAL:1; /* odd cycle tables valid */ - vuint16_t:1; - vuint16_t OPT:1; /*one pair trigger */ - vuint16_t SDVEN:1; /* sync frame deviation table enable */ - vuint16_t SIDEN:1; /* sync frame ID table enable */ - } B; - } SFTCCSR_t; - typedef union uSFIDRFR { - vuint16_t R; - struct { - vuint16_t:6; - vuint16_t SYNFRID:10; /* sync frame rejection ID */ - } B; - } SFIDRFR_t; - - typedef union uTICCR { - vuint16_t R; - struct { - vuint16_t:2; - vuint16_t T2CFG:1; /* timer 2 configuration */ - vuint16_t T2REP:1; /* timer 2 repetitive mode */ - vuint16_t:1; - vuint16_t T2SP:1; /* timer 2 stop */ - vuint16_t T2TR:1; /* timer 2 trigger */ - vuint16_t T2ST:1; /* timer 2 state */ - vuint16_t:3; - vuint16_t T1REP:1; /* timer 1 repetitive mode */ - vuint16_t:1; - vuint16_t T1SP:1; /* timer 1 stop */ - vuint16_t T1TR:1; /* timer 1 trigger */ - vuint16_t T1ST:1; /* timer 1 state */ - - } B; - } TICCR_t; - typedef union uTI1CYSR { - vuint16_t R; - struct { - vuint16_t:2; - vuint16_t TI1CYCVAL:6; /* timer 1 cycle filter value */ - vuint16_t:2; - vuint16_t TI1CYCMSK:6; /* timer 1 cycle filter mask */ - - } B; - } TI1CYSR_t; - - typedef union uSSSR { - vuint16_t R; - struct { - vuint16_t WMD:1; /* write mode */ - vuint16_t:1; - vuint16_t SEL:2; /* static slot number */ - vuint16_t:1; - vuint16_t SLOTNUMBER:11; /* selector */ - } B; - } SSSR_t; - - typedef union uSSCCR { - vuint16_t R; - struct { - vuint16_t WMD:1; /* write mode */ - vuint16_t:1; - vuint16_t SEL:2; /* selector */ - vuint16_t:1; - vuint16_t CNTCFG:2; /* counter configuration */ - vuint16_t MCY:1; /* multi cycle selection */ - vuint16_t VFR:1; /* valid frame selection */ - vuint16_t SYF:1; /* sync frame selection */ - vuint16_t NUF:1; /* null frame selection */ - vuint16_t SUF:1; /* startup frame selection */ - vuint16_t STATUSMASK:4; /* slot status mask */ - } B; - } SSCCR_t; - typedef union uSSR { - vuint16_t R; - struct { - vuint16_t VFB:1; /* valid frame on channel B */ - vuint16_t SYB:1; /* valid sync frame on channel B */ - vuint16_t NFB:1; /* valid null frame on channel B */ - vuint16_t SUB:1; /* valid startup frame on channel B */ - vuint16_t SEB:1; /* syntax error on channel B */ - vuint16_t CEB:1; /* content error on channel B */ - vuint16_t BVB:1; /* boundary violation on channel B */ - vuint16_t TCB:1; /* tx conflict on channel B */ - vuint16_t VFA:1; /* valid frame on channel A */ - vuint16_t SYA:1; /* valid sync frame on channel A */ - vuint16_t NFA:1; /* valid null frame on channel A */ - vuint16_t SUA:1; /* valid startup frame on channel A */ - vuint16_t SEA:1; /* syntax error on channel A */ - vuint16_t CEA:1; /* content error on channel A */ - vuint16_t BVA:1; /* boundary violation on channel A */ - vuint16_t TCA:1; /* tx conflict on channel A */ - } B; - } SSR_t; - typedef union uMTSCFR { - vuint16_t R; - struct { - vuint16_t MTE:1; /* media access test symbol transmission enable */ - vuint16_t:1; - vuint16_t CYCCNTMSK:6; /* cycle counter mask */ - vuint16_t:2; - vuint16_t CYCCNTVAL:6; /* cycle counter value */ - } B; - } MTSCFR_t; - - typedef union uRSBIR { - vuint16_t R; - struct { - vuint16_t WMD:1; /* write mode */ - vuint16_t:1; - vuint16_t SEL:2; /* selector */ - vuint16_t:5; - vuint16_t RSBIDX:7; /* receive shadow buffer index */ - } B; - } RSBIR_t; - - typedef union uRFDSR { - vuint16_t R; - struct { - vuint16_t FIFODEPTH:8; /* fifo depth */ - vuint16_t:1; - vuint16_t ENTRYSIZE:7; /* entry size */ - } B; - } RFDSR_t; - - typedef union uRFRFCFR { - vuint16_t R; - struct { - vuint16_t WMD:1; /* write mode */ - vuint16_t IBD:1; /* interval boundary */ - vuint16_t SEL:2; /* filter number */ - vuint16_t:1; - vuint16_t SID:11; /* slot ID */ - } B; - } RFRFCFR_t; - - typedef union uRFRFCTR { - vuint16_t R; - struct { - vuint16_t:4; - vuint16_t F3MD:1; /* filter mode */ - vuint16_t F2MD:1; /* filter mode */ - vuint16_t F1MD:1; /* filter mode */ - vuint16_t F0MD:1; /* filter mode */ - vuint16_t:4; - vuint16_t F3EN:1; /* filter enable */ - vuint16_t F2EN:1; /* filter enable */ - vuint16_t F1EN:1; /* filter enable */ - vuint16_t F0EN:1; /* filter enable */ - } B; - } RFRFCTR_t; - typedef union uPCR0 { - vuint16_t R; - struct { - vuint16_t ACTION_POINT_OFFSET:6; - vuint16_t STATIC_SLOT_LENGTH:10; - } B; - } PCR0_t; - - typedef union uPCR1 { - vuint16_t R; - struct { - vuint16_t:2; - vuint16_t MACRO_AFTER_FIRST_STATIC_SLOT:14; - } B; - } PCR1_t; - - typedef union uPCR2 { - vuint16_t R; - struct { - vuint16_t MINISLOT_AFTER_ACTION_POINT:6; - vuint16_t NUMBER_OF_STATIC_SLOTS:10; - } B; - } PCR2_t; - - typedef union uPCR3 { - vuint16_t R; - struct { - vuint16_t WAKEUP_SYMBOL_RX_LOW:6; - vuint16_t MINISLOT_ACTION_POINT_OFFSET:5; - vuint16_t COLDSTART_ATTEMPTS:5; - } B; - } PCR3_t; - - typedef union uPCR4 { - vuint16_t R; - struct { - vuint16_t CAS_RX_LOW_MAX:7; - vuint16_t WAKEUP_SYMBOL_RX_WINDOW:9; - } B; - } PCR4_t; - - typedef union uPCR5 { - vuint16_t R; - struct { - vuint16_t TSS_TRANSMITTER:4; - vuint16_t WAKEUP_SYMBOL_TX_LOW:6; - vuint16_t WAKEUP_SYMBOL_RX_IDLE:6; - } B; - } PCR5_t; - - typedef union uPCR6 { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t SYMBOL_WINDOW_AFTER_ACTION_POINT:8; - vuint16_t MACRO_INITIAL_OFFSET_A:7; - } B; - } PCR6_t; - - typedef union uPCR7 { - vuint16_t R; - struct { - vuint16_t DECODING_CORRECTION_B:9; - vuint16_t MICRO_PER_MACRO_NOM_HALF:7; - } B; - } PCR7_t; - - typedef union uPCR8 { - vuint16_t R; - struct { - vuint16_t MAX_WITHOUT_CLOCK_CORRECTION_FATAL:4; - vuint16_t MAX_WITHOUT_CLOCK_CORRECTION_PASSIVE:4; - vuint16_t WAKEUP_SYMBOL_TX_IDLE:8; - } B; - } PCR8_t; - - typedef union uPCR9 { - vuint16_t R; - struct { - vuint16_t MINISLOT_EXISTS:1; - vuint16_t SYMBOL_WINDOW_EXISTS:1; - vuint16_t OFFSET_CORRECTION_OUT:14; - } B; - } PCR9_t; - - typedef union uPCR10 { - vuint16_t R; - struct { - vuint16_t SINGLE_SLOT_ENABLED:1; - vuint16_t WAKEUP_CHANNEL:1; - vuint16_t MACRO_PER_CYCLE:14; - } B; - } PCR10_t; - - typedef union uPCR11 { - vuint16_t R; - struct { - vuint16_t KEY_SLOT_USED_FOR_STARTUP:1; - vuint16_t KEY_SLOT_USED_FOR_SYNC:1; - vuint16_t OFFSET_CORRECTION_START:14; - } B; - } PCR11_t; - - typedef union uPCR12 { - vuint16_t R; - struct { - vuint16_t ALLOW_PASSIVE_TO_ACTIVE:5; - vuint16_t KEY_SLOT_HEADER_CRC:11; - } B; - } PCR12_t; - - typedef union uPCR13 { - vuint16_t R; - struct { - vuint16_t FIRST_MINISLOT_ACTION_POINT_OFFSET:6; - vuint16_t STATIC_SLOT_AFTER_ACTION_POINT:10; - } B; - } PCR13_t; - - typedef union uPCR14 { - vuint16_t R; - struct { - vuint16_t RATE_CORRECTION_OUT:11; - vuint16_t LISTEN_TIMEOUT_H:5; - } B; - } PCR14_t; - - typedef union uPCR15 { - vuint16_t R; - struct { - vuint16_t LISTEN_TIMEOUT_L:16; - } B; - } PCR15_t; - - typedef union uPCR16 { - vuint16_t R; - struct { - vuint16_t MACRO_INITIAL_OFFSET_B:7; - vuint16_t NOISE_LISTEN_TIMEOUT_H:9; - } B; - } PCR16_t; - - typedef union uPCR17 { - vuint16_t R; - struct { - vuint16_t NOISE_LISTEN_TIMEOUT_L:16; - } B; - } PCR17_t; - - typedef union uPCR18 { - vuint16_t R; - struct { - vuint16_t WAKEUP_PATTERN:6; - vuint16_t KEY_SLOT_ID:10; - } B; - } PCR18_t; - - typedef union uPCR19 { - vuint16_t R; - struct { - vuint16_t DECODING_CORRECTION_A:9; - vuint16_t PAYLOAD_LENGTH_STATIC:7; - } B; - } PCR19_t; - - typedef union uPCR20 { - vuint16_t R; - struct { - vuint16_t MICRO_INITIAL_OFFSET_B:8; - vuint16_t MICRO_INITIAL_OFFSET_A:8; - } B; - } PCR20_t; - - typedef union uPCR21 { - vuint16_t R; - struct { - vuint16_t EXTERN_RATE_CORRECTION:3; - vuint16_t LATEST_TX:13; - } B; - } PCR21_t; - - typedef union uPCR22 { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t COMP_ACCEPTED_STARTUP_RANGE_A:11; - vuint16_t MICRO_PER_CYCLE_H:4; - } B; - } PCR22_t; - - typedef union uPCR23 { - vuint16_t R; - struct { - vuint16_t micro_per_cycle_l:16; - } B; - } PCR23_t; - - typedef union uPCR24 { - vuint16_t R; - struct { - vuint16_t CLUSTER_DRIFT_DAMPING:5; - vuint16_t MAX_PAYLOAD_LENGTH_DYNAMIC:7; - vuint16_t MICRO_PER_CYCLE_MIN_H:4; - } B; - } PCR24_t; - - typedef union uPCR25 { - vuint16_t R; - struct { - vuint16_t MICRO_PER_CYCLE_MIN_L:16; - } B; - } PCR25_t; - - typedef union uPCR26 { - vuint16_t R; - struct { - vuint16_t ALLOW_HALT_DUE_TO_CLOCK:1; - vuint16_t COMP_ACCEPTED_STARTUP_RANGE_B:11; - vuint16_t MICRO_PER_CYCLE_MAX_H:4; - } B; - } PCR26_t; - - typedef union uPCR27 { - vuint16_t R; - struct { - vuint16_t MICRO_PER_CYCLE_MAX_L:16; - } B; - } PCR27_t; - - typedef union uPCR28 { - vuint16_t R; - struct { - vuint16_t DYNAMIC_SLOT_IDLE_PHASE:2; - vuint16_t MACRO_AFTER_OFFSET_CORRECTION:14; - } B; - } PCR28_t; - - typedef union uPCR29 { - vuint16_t R; - struct { - vuint16_t EXTERN_OFFSET_CORRECTION:3; - vuint16_t MINISLOTS_MAX:13; - } B; - } PCR29_t; - - typedef union uPCR30 { - vuint16_t R; - struct { - vuint16_t:12; - vuint16_t SYNC_NODE_MAX:4; - } B; - } PCR30_t; - - typedef struct uMSG_BUFF_CCS { - union { - vuint16_t R; - struct { - vuint16_t:1; - vuint16_t MCM:1; /* message buffer commit mode */ - vuint16_t MBT:1; /* message buffer type */ - vuint16_t MTD:1; /* message buffer direction */ - vuint16_t CMT:1; /* commit for transmission */ - vuint16_t EDT:1; /* enable / disable trigger */ - vuint16_t LCKT:1; /* lock request trigger */ - vuint16_t MBIE:1; /* message buffer interrupt enable */ - vuint16_t:3; - vuint16_t DUP:1; /* data updated */ - vuint16_t DVAL:1; /* data valid */ - vuint16_t EDS:1; /* lock status */ - vuint16_t LCKS:1; /* enable / disable status */ - vuint16_t MBIF:1; /* message buffer interrupt flag */ - } B; - } MBCCSR; - union { - vuint16_t R; - struct { - vuint16_t MTM:1; /* message buffer transmission mode */ - vuint16_t CHNLA:1; /* channel assignement */ - vuint16_t CHNLB:1; /* channel assignement */ - vuint16_t CCFE:1; /* cycle counter filter enable */ - vuint16_t CCFMSK:6; /* cycle counter filter mask */ - vuint16_t CCFVAL:6; /* cycle counter filter value */ - } B; - } MBCCFR; - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t FID:11; /* frame ID */ - } B; - } MBFIDR; - - union { - vuint16_t R; - struct { - vuint16_t:9; - vuint16_t MBIDX:7; /* message buffer index */ - } B; - } MBIDXR; - } MSG_BUFF_CCS_t; - typedef union uSYSBADHR { - vuint16_t R; - } SYSBADHR_t; - typedef union uSYSBADLR { - vuint16_t R; - } SYSBADLR_t; - typedef union uPADR { - vuint16_t R; - } PADR_t; - typedef union uPDAR { - vuint16_t R; - } PDAR_t; - typedef union uCASERCR { - vuint16_t R; - } CASERCR_t; - typedef union uCBSERCR { - vuint16_t R; - } CBSERCR_t; - typedef union uCYCTR { - vuint16_t R; - } CYCTR_t; - typedef union uMTCTR { - vuint16_t R; - } MTCTR_t; - typedef union uSLTCTAR { - vuint16_t R; - } SLTCTAR_t; - typedef union uSLTCTBR { - vuint16_t R; - } SLTCTBR_t; - typedef union uRTCORVR { - vuint16_t R; - } RTCORVR_t; - typedef union uOFCORVR { - vuint16_t R; - } OFCORVR_t; - typedef union uSFTOR { - vuint16_t R; - } SFTOR_t; - typedef union uSFIDAFVR { - vuint16_t R; - } SFIDAFVR_t; - typedef union uSFIDAFMR { - vuint16_t R; - } SFIDAFMR_t; - typedef union uNMVR { - vuint16_t R; - } NMVR_t; - typedef union uNMVLR { - vuint16_t R; - } NMVLR_t; - typedef union uT1MTOR { - vuint16_t R; - } T1MTOR_t; - typedef union uTI2CR0 { - vuint16_t R; - } TI2CR0_t; - typedef union uTI2CR1 { - vuint16_t R; - } TI2CR1_t; - typedef union uSSCR { - vuint16_t R; - } SSCR_t; - typedef union uRFSR { - vuint16_t R; - } RFSR_t; - typedef union uRFSIR { - vuint16_t R; - } RFSIR_t; - typedef union uRFARIR { - vuint16_t R; - } RFARIR_t; - typedef union uRFBRIR { - vuint16_t R; - } RFBRIR_t; - typedef union uRFMIDAFVR { - vuint16_t R; - } RFMIDAFVR_t; - typedef union uRFMIAFMR { - vuint16_t R; - } RFMIAFMR_t; - typedef union uRFFIDRFVR { - vuint16_t R; - } RFFIDRFVR_t; - typedef union uRFFIDRFMR { - vuint16_t R; - } RFFIDRFMR_t; - typedef union uLDTXSLAR { - vuint16_t R; - } LDTXSLAR_t; - typedef union uLDTXSLBR { - vuint16_t R; - } LDTXSLBR_t; - - typedef struct FR_tag { - volatile MVR_t MVR; /*module version register *//*0 */ - volatile MCR_t MCR; /*module configuration register *//*2 */ - volatile SYSBADHR_t SYSBADHR; /*system memory base address high register *//*4 */ - volatile SYSBADLR_t SYSBADLR; /*system memory base address low register *//*6 */ - volatile STBSCR_t STBSCR; /*strobe signal control register *//*8 */ - volatile STBPCR_t STBPCR; /*strobe port control register *//*A */ - volatile MBDSR_t MBDSR; /*message buffer data size register *//*C */ - volatile MBSSUTR_t MBSSUTR; /*message buffer segment size and utilization register *//*E */ - volatile PADR_t PADR; /*PE address register *//*10 */ - volatile PDAR_t PDAR; /*PE data register *//*12 */ - volatile POCR_t POCR; /*Protocol operation control register *//*14 */ - volatile GIFER_t GIFER; /*global interrupt flag and enable register *//*16 */ - volatile PIFR0_t PIFR0; /*protocol interrupt flag register 0 *//*18 */ - volatile PIFR1_t PIFR1; /*protocol interrupt flag register 1 *//*1A */ - volatile PIER0_t PIER0; /*protocol interrupt enable register 0 *//*1C */ - volatile PIER1_t PIER1; /*protocol interrupt enable register 1 *//*1E */ - volatile CHIERFR_t CHIERFR; /*CHI error flag register *//*20 */ - volatile MBIVEC_t MBIVEC; /*message buffer interrupt vector register *//*22 */ - volatile CASERCR_t CASERCR; /*channel A status error counter register *//*24 */ - volatile CBSERCR_t CBSERCR; /*channel B status error counter register *//*26 */ - volatile PSR0_t PSR0; /*protocol status register 0 *//*28 */ - volatile PSR1_t PSR1; /*protocol status register 1 *//*2A */ - volatile PSR2_t PSR2; /*protocol status register 2 *//*2C */ - volatile PSR3_t PSR3; /*protocol status register 3 *//*2E */ - volatile MTCTR_t MTCTR; /*macrotick counter register *//*30 */ - volatile CYCTR_t CYCTR; /*cycle counter register *//*32 */ - volatile SLTCTAR_t SLTCTAR; /*slot counter channel A register *//*34 */ - volatile SLTCTBR_t SLTCTBR; /*slot counter channel B register *//*36 */ - volatile RTCORVR_t RTCORVR; /*rate correction value register *//*38 */ - volatile OFCORVR_t OFCORVR; /*offset correction value register *//*3A */ - volatile CIFRR_t CIFRR; /*combined interrupt flag register *//*3C */ - vuint16_t reserved3[1]; /*3E */ - volatile SFCNTR_t SFCNTR; /*sync frame counter register *//*40 */ - volatile SFTOR_t SFTOR; /*sync frame table offset register *//*42 */ - volatile SFTCCSR_t SFTCCSR; /*sync frame table configuration, control, status register *//*44 */ - volatile SFIDRFR_t SFIDRFR; /*sync frame ID rejection filter register *//*46 */ - volatile SFIDAFVR_t SFIDAFVR; /*sync frame ID acceptance filter value regiater *//*48 */ - volatile SFIDAFMR_t SFIDAFMR; /*sync frame ID acceptance filter mask register *//*4A */ - volatile NMVR_t NMVR[6]; /*network management vector registers (12 bytes) *//*4C */ - volatile NMVLR_t NMVLR; /*network management vector length register *//*58 */ - volatile TICCR_t TICCR; /*timer configuration and control register *//*5A */ - volatile TI1CYSR_t TI1CYSR; /*timer 1 cycle set register *//*5C */ - volatile T1MTOR_t T1MTOR; /*timer 1 macrotick offset register *//*5E */ - volatile TI2CR0_t TI2CR0; /*timer 2 configuration register 0 *//*60 */ - volatile TI2CR1_t TI2CR1; /*timer 2 configuration register 1 *//*62 */ - volatile SSSR_t SSSR; /*slot status selection register *//*64 */ - volatile SSCCR_t SSCCR; /*slot status counter condition register *//*66 */ - volatile SSR_t SSR[8]; /*slot status registers 0-7 *//*68 */ - volatile SSCR_t SSCR[4]; /*slot status counter registers 0-3 *//*78 */ - volatile MTSCFR_t MTSACFR; /*mts a config register *//*80 */ - volatile MTSCFR_t MTSBCFR; /*mts b config register *//*82 */ - volatile RSBIR_t RSBIR; /*receive shadow buffer index register *//*84 */ - volatile RFSR_t RFSR; /*receive fifo selection register *//*86 */ - volatile RFSIR_t RFSIR; /*receive fifo start index register *//*88 */ - volatile RFDSR_t RFDSR; /*receive fifo depth and size register *//*8A */ - volatile RFARIR_t RFARIR; /*receive fifo a read index register *//*8C */ - volatile RFBRIR_t RFBRIR; /*receive fifo b read index register *//*8E */ - volatile RFMIDAFVR_t RFMIDAFVR; /*receive fifo message ID acceptance filter value register *//*90 */ - volatile RFMIAFMR_t RFMIAFMR; /*receive fifo message ID acceptance filter mask register *//*92 */ - volatile RFFIDRFVR_t RFFIDRFVR; /*receive fifo frame ID rejection filter value register *//*94 */ - volatile RFFIDRFMR_t RFFIDRFMR; /*receive fifo frame ID rejection filter mask register *//*96 */ - volatile RFRFCFR_t RFRFCFR; /*receive fifo range filter configuration register *//*98 */ - volatile RFRFCTR_t RFRFCTR; /*receive fifo range filter control register *//*9A */ - volatile LDTXSLAR_t LDTXSLAR; /*last dynamic transmit slot channel A register *//*9C */ - volatile LDTXSLBR_t LDTXSLBR; /*last dynamic transmit slot channel B register *//*9E */ - volatile PCR0_t PCR0; /*protocol configuration register 0 *//*A0 */ - volatile PCR1_t PCR1; /*protocol configuration register 1 *//*A2 */ - volatile PCR2_t PCR2; /*protocol configuration register 2 *//*A4 */ - volatile PCR3_t PCR3; /*protocol configuration register 3 *//*A6 */ - volatile PCR4_t PCR4; /*protocol configuration register 4 *//*A8 */ - volatile PCR5_t PCR5; /*protocol configuration register 5 *//*AA */ - volatile PCR6_t PCR6; /*protocol configuration register 6 *//*AC */ - volatile PCR7_t PCR7; /*protocol configuration register 7 *//*AE */ - volatile PCR8_t PCR8; /*protocol configuration register 8 *//*B0 */ - volatile PCR9_t PCR9; /*protocol configuration register 9 *//*B2 */ - volatile PCR10_t PCR10; /*protocol configuration register 10 *//*B4 */ - volatile PCR11_t PCR11; /*protocol configuration register 11 *//*B6 */ - volatile PCR12_t PCR12; /*protocol configuration register 12 *//*B8 */ - volatile PCR13_t PCR13; /*protocol configuration register 13 *//*BA */ - volatile PCR14_t PCR14; /*protocol configuration register 14 *//*BC */ - volatile PCR15_t PCR15; /*protocol configuration register 15 *//*BE */ - volatile PCR16_t PCR16; /*protocol configuration register 16 *//*C0 */ - volatile PCR17_t PCR17; /*protocol configuration register 17 *//*C2 */ - volatile PCR18_t PCR18; /*protocol configuration register 18 *//*C4 */ - volatile PCR19_t PCR19; /*protocol configuration register 19 *//*C6 */ - volatile PCR20_t PCR20; /*protocol configuration register 20 *//*C8 */ - volatile PCR21_t PCR21; /*protocol configuration register 21 *//*CA */ - volatile PCR22_t PCR22; /*protocol configuration register 22 *//*CC */ - volatile PCR23_t PCR23; /*protocol configuration register 23 *//*CE */ - volatile PCR24_t PCR24; /*protocol configuration register 24 *//*D0 */ - volatile PCR25_t PCR25; /*protocol configuration register 25 *//*D2 */ - volatile PCR26_t PCR26; /*protocol configuration register 26 *//*D4 */ - volatile PCR27_t PCR27; /*protocol configuration register 27 *//*D6 */ - volatile PCR28_t PCR28; /*protocol configuration register 28 *//*D8 */ - volatile PCR29_t PCR29; /*protocol configuration register 29 *//*DA */ - volatile PCR30_t PCR30; /*protocol configuration register 30 *//*DC */ - vuint16_t reserved2[17]; - volatile MSG_BUFF_CCS_t MBCCS[128]; /* message buffer configuration, control & status registers 0-31 *//*100 */ - } FR_tag_t; - - typedef union uF_HEADER /* frame header */ - { - struct { - vuint16_t:5; - vuint16_t HDCRC:11; /* Header CRC */ - vuint16_t:2; - vuint16_t CYCCNT:6; /* Cycle Count */ - vuint16_t:1; - vuint16_t PLDLEN:7; /* Payload Length */ - vuint16_t:1; - vuint16_t PPI:1; /* Payload Preamble Indicator */ - vuint16_t NUF:1; /* Null Frame Indicator */ - vuint16_t SYF:1; /* Sync Frame Indicator */ - vuint16_t SUF:1; /* Startup Frame Indicator */ - vuint16_t FID:11; /* Frame ID */ - } B; - vuint16_t WORDS[3]; - } F_HEADER_t; - typedef union uS_STSTUS /* slot status */ - { - struct { - vuint16_t VFB:1; /* Valid Frame on channel B */ - vuint16_t SYB:1; /* Sync Frame Indicator channel B */ - vuint16_t NFB:1; /* Null Frame Indicator channel B */ - vuint16_t SUB:1; /* Startup Frame Indicator channel B */ - vuint16_t SEB:1; /* Syntax Error on channel B */ - vuint16_t CEB:1; /* Content Error on channel B */ - vuint16_t BVB:1; /* Boundary Violation on channel B */ - vuint16_t CH:1; /* Channel */ - vuint16_t VFA:1; /* Valid Frame on channel A */ - vuint16_t SYA:1; /* Sync Frame Indicator channel A */ - vuint16_t NFA:1; /* Null Frame Indicator channel A */ - vuint16_t SUA:1; /* Startup Frame Indicator channel A */ - vuint16_t SEA:1; /* Syntax Error on channel A */ - vuint16_t CEA:1; /* Content Error on channel A */ - vuint16_t BVA:1; /* Boundary Violation on channel A */ - vuint16_t:1; - } RX; - struct { - vuint16_t VFB:1; /* Valid Frame on channel B */ - vuint16_t SYB:1; /* Sync Frame Indicator channel B */ - vuint16_t NFB:1; /* Null Frame Indicator channel B */ - vuint16_t SUB:1; /* Startup Frame Indicator channel B */ - vuint16_t SEB:1; /* Syntax Error on channel B */ - vuint16_t CEB:1; /* Content Error on channel B */ - vuint16_t BVB:1; /* Boundary Violation on channel B */ - vuint16_t TCB:1; /* Tx Conflict on channel B */ - vuint16_t VFA:1; /* Valid Frame on channel A */ - vuint16_t SYA:1; /* Sync Frame Indicator channel A */ - vuint16_t NFA:1; /* Null Frame Indicator channel A */ - vuint16_t SUA:1; /* Startup Frame Indicator channel A */ - vuint16_t SEA:1; /* Syntax Error on channel A */ - vuint16_t CEA:1; /* Content Error on channel A */ - vuint16_t BVA:1; /* Boundary Violation on channel A */ - vuint16_t TCA:1; /* Tx Conflict on channel A */ - } TX; - vuint16_t R; - } S_STATUS_t; - - typedef struct uMB_HEADER /* message buffer header */ - { - F_HEADER_t FRAME_HEADER; - vuint16_t DATA_OFFSET; - S_STATUS_t SLOT_STATUS; - } MB_HEADER_t; -/****************************************************************************/ -/* MODULE : LCD */ -/****************************************************************************/ - struct LCD_tag { - - union { - vuint32_t R; - struct { - vuint32_t LCDEN:1; - vuint32_t LCDRST:1; - vuint32_t LCDRCS:1; - vuint32_t DUTY:3; - vuint32_t BIAS:1; - vuint32_t VLCDS:1; - vuint32_t PWR:2; - vuint32_t BSTEN:1; - vuint32_t BSTSEL:1; - vuint32_t BSTAO:1; - vuint32_t:1; - vuint32_t LCDINT:1; - vuint32_t EOFF:1; - vuint32_t NOF:8; - vuint32_t:2; - vuint32_t LCDBPA:1; - vuint32_t:2; - vuint32_t LCDBPS:3; - } B; - } CR; /* LCD Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t LCLK:4; - vuint32_t:24; - } B; - } PCR; /* LCD Prescaler Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t CCEN:1; - vuint32_t:4; - vuint32_t LCC:11; - vuint32_t:16; - } B; - } CCR; /* LCD Contrast Control Register */ - - int32_t LCD_reserved1; /* (0x10 - 0x0C)/4 = 0x01 */ - - union { - vuint32_t R; - struct { - vuint32_t FP31EN:1; - vuint32_t FP30EN:1; - vuint32_t FP29EN:1; - vuint32_t FP28EN:1; - vuint32_t FP27EN:1; - vuint32_t FP26EN:1; - vuint32_t FP25EN:1; - vuint32_t FP24EN:1; - vuint32_t FP23EN:1; - vuint32_t FP22EN:1; - vuint32_t FP21EN:1; - vuint32_t FP20EN:1; - vuint32_t FP19EN:1; - vuint32_t FP18EN:1; - vuint32_t FP17EN:1; - vuint32_t FP16EN:1; - vuint32_t FP15EN:1; - vuint32_t FP14EN:1; - vuint32_t FP13EN:1; - vuint32_t FP12EN:1; - vuint32_t FP11EN:1; - vuint32_t FP10EN:1; - vuint32_t FP9EN:1; - vuint32_t FP8EN:1; - vuint32_t FP7EN:1; - vuint32_t FP6EN:1; - vuint32_t FP5EN:1; - vuint32_t FP4EN:1; - vuint32_t FP3EN:1; - vuint32_t FP2EN:1; - vuint32_t FP1EN:1; - vuint32_t FP0EN:1; - } B; - } FPENR0; /* LCD Frontplane Enable Register 0 */ - - union { - vuint32_t R; - struct { - vuint32_t FP63EN:1; - vuint32_t FP62EN:1; - vuint32_t FP61EN:1; - vuint32_t FP60EN:1; - vuint32_t FP59EN:1; - vuint32_t FP58EN:1; - vuint32_t FP57EN:1; - vuint32_t FP56EN:1; - vuint32_t FP55EN:1; - vuint32_t FP54EN:1; - vuint32_t FP53EN:1; - vuint32_t FP52EN:1; - vuint32_t FP51EN:1; - vuint32_t FP50EN:1; - vuint32_t FP49EN:1; - vuint32_t FP48EN:1; - vuint32_t FP47EN:1; - vuint32_t FP46EN:1; - vuint32_t FP45EN:1; - vuint32_t FP44EN:1; - vuint32_t FP43EN:1; - vuint32_t FP42EN:1; - vuint32_t FP41EN:1; - vuint32_t FP40EN:1; - vuint32_t FP39EN:1; - vuint32_t FP38EN:1; - vuint32_t FP37EN:1; - vuint32_t FP36EN:1; - vuint32_t FP35EN:1; - vuint32_t FP34EN:1; - vuint32_t FP33EN:1; - vuint32_t FP32EN:1; - } B; - } FPENR1; /* LCD Frontplane Enable Register 1 */ - - int32_t LCD_reserved2[2]; /* (0x20 - 0x18)/4 = 0x02 */ - - union { - vuint32_t R; - } RAM[16]; /* LCD RAM Register */ - - }; /* end of LCD_tag */ -/****************************************************************************/ -/* MODULE : External Bus Interface (EBI) */ -/****************************************************************************/ - struct EBI_CS_tag { - union { /* Base Register Bank */ - vuint32_t R; - struct { - vuint32_t BA:17; - vuint32_t:3; - vuint32_t PS:1; - vuint32_t:4; - vuint32_t BL:1; - vuint32_t WEBS:1; - vuint32_t TBDIP:1; - vuint32_t:2; - vuint32_t BI:1; - vuint32_t V:1; - } B; - } BR; - - union { /* Option Register Bank */ - vuint32_t R; - struct { - vuint32_t AM:17; - vuint32_t:7; - vuint32_t SCY:4; - vuint32_t:1; - vuint32_t BSCY:2; - vuint32_t:1; - } B; - } OR; - }; /* end of EBI_CS_tag */ - - struct EBI_tag { - union { /* Module Configuration Register */ - vuint32_t R; - struct { - vuint32_t:5; - vuint32_t SIZEN:1; - vuint32_t SIZE:2; - vuint32_t:8; - vuint32_t ACGE:1; - vuint32_t EXTM:1; - vuint32_t EARB:1; - vuint32_t EARP:2; - vuint32_t:4; - vuint32_t MDIS:1; - vuint32_t:4; - vuint32_t AD_MUX:1; - vuint32_t DBM:1; - } B; - } MCR; - - uint32_t EBI_reserved1; - - union { /* Transfer Error Status Register */ - vuint32_t R; - struct { - vuint32_t:30; - vuint32_t TEAF:1; - vuint32_t BMTF:1; - } B; - } TESR; - - union { /* Bus Monitor Control Register */ - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t BMT:8; - vuint32_t BME:1; - vuint32_t:7; - } B; - } BMCR; - - struct EBI_CS_tag CS[2]; - - }; /* end of EBI_tag */ -/****************************************************************************/ -/* MODULE : DFLASH */ -/****************************************************************************/ - struct DFLASH_tag { - union { /* Module Configuration Register */ - vuint32_t R; - struct { - vuint32_t EDC:1; - vuint32_t:4; - vuint32_t SIZE:3; - vuint32_t:1; - vuint32_t LAS:3; - vuint32_t:3; - vuint32_t MAS:1; - vuint32_t EER:1; - vuint32_t RWE:1; - vuint32_t:1; - vuint32_t:1; - vuint32_t PEAS:1; - vuint32_t DONE:1; - vuint32_t PEG:1; - vuint32_t:4; - vuint32_t PGM:1; - vuint32_t PSUS:1; - vuint32_t ERS:1; - vuint32_t ESUS:1; - vuint32_t EHV:1; - } B; - } MCR; - - union { /* LML Register */ - vuint32_t R; - struct { - vuint32_t LME:1; - vuint32_t:10; - vuint32_t TSLK:1; - vuint32_t:2; - vuint32_t MLK:2; - vuint32_t LLK:16; - } B; - } LML; - - union { /* HBL Register */ - vuint32_t R; - struct { - vuint32_t HBE:1; - vuint32_t:23; - vuint32_t HBLOCK:8; - } B; - } HBL; - - union { /* SLML Register */ - vuint32_t R; - struct { - vuint32_t SLE:1; - vuint32_t:10; - vuint32_t STSLK:1; - vuint32_t:2; - vuint32_t SMK:2; - vuint32_t SLK:16; - } B; - } SLL; - - union { /* LMS Register */ - vuint32_t R; - struct { - vuint32_t:14; - vuint32_t MSL:2; - vuint32_t LSL:16; - } B; - } LMS; - - union { /* High Address Space Block Select Register */ - vuint32_t R; - struct { - vuint32_t:26; - vuint32_t HSL:6; - } B; - } HBS; - - union { /* Address Register */ - vuint32_t R; - struct { - vuint32_t:9; - vuint32_t ADD:20; - vuint32_t:3; - } B; - } ADR; - - int32_t Dflash_reserved0[8]; /* {0x003C-0x001C}/0x4 = 0x08 */ - - union { /* User Test Register 0 */ - vuint32_t R; - struct { - vuint32_t UTE:1; - vuint32_t:7; - vuint32_t DSI:8; - vuint32_t:10; - vuint32_t MRE:1; - vuint32_t MRV:1; - vuint32_t EIE:1; - vuint32_t AIS:1; - vuint32_t AIE:1; - vuint32_t AID:1; - } B; - } UT0; - - union { /* User Test Register 1 */ - vuint32_t R; - struct { - vuint32_t DAI:32; - } B; - } UT1; - - union { /* User Test Register 2 */ - vuint32_t R; - struct { - vuint32_t DAI:32; - } B; - } UT2; - - union { /* User Multiple Input Signature Register 0-4 */ - vuint32_t R; - struct { - vuint32_t MS:32; - } B; - } UMISR[5]; - - }; /* end of Dflash_tag */ -/****************************************************************************/ -/* MODULE : CFLASH */ -/****************************************************************************/ - struct CFLASH_tag { - union { /* Module Configuration Register */ - vuint32_t R; - struct { - vuint32_t EDC:1; - vuint32_t:4; - vuint32_t SIZE:3; - vuint32_t:1; - vuint32_t LAS:3; - vuint32_t:3; - vuint32_t MAS:1; - vuint32_t EER:1; - vuint32_t RWE:1; - vuint32_t:1; - vuint32_t:1; - vuint32_t PEAS:1; - vuint32_t DONE:1; - vuint32_t PEG:1; - vuint32_t:4; - vuint32_t PGM:1; - vuint32_t PSUS:1; - vuint32_t ERS:1; - vuint32_t ESUS:1; - vuint32_t EHV:1; - } B; - } MCR; - - union { /* LML Register */ - vuint32_t R; - struct { - vuint32_t LME:1; - vuint32_t:10; - vuint32_t TSLK:1; - vuint32_t:2; - vuint32_t MLK:2; - vuint32_t LLK:16; - } B; - } LML; - - union { /* HBL Register */ - vuint32_t R; - struct { - vuint32_t HBE:1; - vuint32_t:23; - vuint32_t HBLOCK:8; - } B; - } HBL; - - union { /* SLML Register */ - vuint32_t R; - struct { - vuint32_t SLE:1; - vuint32_t:10; - vuint32_t STSLK:1; - vuint32_t:2; - vuint32_t SMK:2; - vuint32_t SLK:16; - } B; - } SLL; - - union { /* LMS Register */ - vuint32_t R; - struct { - vuint32_t:14; - vuint32_t MSL:2; - vuint32_t LSL:16; - } B; - } LMS; - - union { /* High Address Space Block Select Register */ - vuint32_t R; - struct { - vuint32_t:26; - vuint32_t HSL:6; - } B; - } HBS; - - union { /* Address Register */ - vuint32_t R; - struct { - vuint32_t:9; - vuint32_t ADD:20; - vuint32_t:3; - } B; - } ADR; - - union { /* CFLASH Configuration Register 0 */ - vuint32_t R; - struct { - vuint32_t BK0_APC:5; - vuint32_t BK0_WWSC:5; - vuint32_t BK0_RWSC:5; - vuint32_t BK0_RWWC2:1; - vuint32_t BK0_RWWC1:1; - vuint32_t B0_P1_BCFG:2; - vuint32_t B0_P1_DPFE:1; - vuint32_t B0_P1_IPFE:1; - vuint32_t B0_P1_PFLM:2; - vuint32_t B0_P1_BFE:1; - vuint32_t BK0_RWWC0:1; - vuint32_t B0_P0_BCFG:2; - vuint32_t B0_P0_DPFE:1; - vuint32_t B0_P0_IPFE:1; - vuint32_t B0_P0_PFLM:2; - vuint32_t B0_P0_BFE:1; - } B; - } PFCR0; - - union { /* CFLASH Configuration Register 1 */ - vuint32_t R; - struct { - vuint32_t BK1_APC:5; - vuint32_t BK1_WWSC:5; - vuint32_t BK1_RWSC:5; - vuint32_t BK1_RWWC2:1; - vuint32_t BK1_RWWC1:1; - vuint32_t:6; - vuint32_t B0_P1_BFE:1; - vuint32_t BK1_RWWC0:1; - vuint32_t:6; - vuint32_t B1_P0_BFE:1; - } B; - } PFCR1; - - union { /* cflash Access Protection Register */ - vuint32_t R; - struct { - vuint32_t:6; - vuint32_t ARBM:2; - vuint32_t M7PFD:1; - vuint32_t M6PFD:1; - vuint32_t M5PFD:1; - vuint32_t M4PFD:1; - vuint32_t M3PFD:1; - vuint32_t M2PFD:1; - vuint32_t M1PFD:1; - vuint32_t M0PFD:1; - vuint32_t M7AP:2; - vuint32_t M6AP:2; - vuint32_t M5AP:2; - vuint32_t M4AP:2; - vuint32_t M3AP:2; - vuint32_t M2AP:2; - vuint32_t M1AP:2; - vuint32_t M0AP:2; - } B; - } FAPR; - - int32_t CFLASH_reserved0[5]; /* {0x003C-0x0028}/0x4 = 0x05 */ - - union { /* User Test Register 0 */ - vuint32_t R; - struct { - vuint32_t UTE:1; - vuint32_t:7; - vuint32_t DSI:8; - vuint32_t:10; - vuint32_t MRE:1; - vuint32_t MRV:1; - vuint32_t EIE:1; - vuint32_t AIS:1; - vuint32_t AIE:1; - vuint32_t AID:1; - } B; - } UT0; - - union { /* User Test Register 1 */ - vuint32_t R; - struct { - vuint32_t DAI:32; - } B; - } UT1; - - union { /* User Test Register 2 */ - vuint32_t R; - struct { - vuint32_t DAI:32; - } B; - } UT2; - - union { /* User Multiple Input Signature Register 0-4 */ - vuint32_t R; - struct { - vuint32_t MS:32; - } B; - } UMISR[5]; - - }; /* end of CFLASH_tag */ - -/****************************************************************************/ -/* MODULE : CRC */ -/****************************************************************************/ - struct CRC_SUB_tag { - union { - vuint8_t B[4]; /* Data buffer in Bytes (8 bits) */ - vuint16_t H[2]; /* Data buffer in Half-words (16 bits) */ - vuint32_t W; /* Data buffer in words (32 bits) */ - struct { - vuint32_t INV:1; - vuint32_t SWAP:1; - vuint32_t POLYG:1; - vuint32_t:29; - }BIT; - } CRC_CFG; /* CRC Configuration Register */ - - union { - vuint8_t B[4]; /* Data buffer in Bytes (8 bits) */ - vuint16_t H[2]; /* Data buffer in Half-words (16 bits) */ - vuint32_t W; /* Data buffer in words (32 bits) */ - } CRC_INP; /* CRC Input Register */ - - union { - vuint8_t B[4]; /* Data buffer in Bytes (8 bits) */ - vuint16_t H[2]; /* Data buffer in Half-words (16 bits) */ - vuint32_t W; /* Data buffer in words (32 bits) */ - } CRC_CSTAT; /*CRC Current Status Register */ - - union { - vuint8_t B[4]; /* Data buffer in Bytes (8 bits) */ - vuint16_t H[2]; /* Data buffer in Half-words (16 bits) */ - vuint32_t W; /* Data buffer in words (32 bits) */ - } CRC_OUTP; /* CRC Output Register */ - - }; /* end of CRC_tag */ - - struct CRC_tag { - struct CRC_SUB_tag CNTX[2]; - }; - -/****************************************************************** -| defines and macros (scope: module-local) -|-----------------------------------------------------------------*/ -/* Define instances of modules */ -#define ADC_0 (*(volatile struct ADC_tag *) 0xFFE00000UL) -#define ADC_1 (*(volatile struct ADC_tag *) 0xFFE04000UL) -#define CAN_0 (*(volatile struct FLEXCAN_tag *) 0xFFFC0000UL) -#define CAN_1 (*(volatile struct FLEXCAN_tag *) 0xFFFC4000UL) -#define CAN_2 (*(volatile struct FLEXCAN_tag *) 0xFFFC8000UL) -#define CAN_3 (*(volatile struct FLEXCAN_tag *) 0xFFFCC000UL) -#define CAN_4 (*(volatile struct FLEXCAN_tag *) 0xFFFD0000UL) -#define CAN_5 (*(volatile struct FLEXCAN_tag *) 0xFFFD4000UL) -#define CANSP (*(volatile struct CANSP_tag *) 0xFFE70000UL) -#define CFLASH (*(volatile struct CFLASH_tag *) 0xC3F88000UL) -#define CGM (*(volatile struct CGM_tag *) 0xC3FE0000UL) -#define CTU_0 (*(volatile struct CTU_tag *) 0xFFE0C000UL) -#define CTU_1 (*(volatile struct CTU_tag *) 0xFFE10000UL) -#define CTUL (*(volatile struct CTUL_tag *) 0xFFE64000UL) -#define DCU (*(volatile struct DCU_tag *) 0xFFE7C000UL) -#define DFLASH (*(volatile struct DFLASH_tag *) 0xC3F8C000UL) -#define DMAMUX (*(volatile struct DMAMUX_tag *) 0xFFFDC000UL) -#define DSPI_0 (*(volatile struct DSPI_tag *) 0xFFF90000UL) -#define DSPI_1 (*(volatile struct DSPI_tag *) 0xFFF94000UL) -#define DSPI_2 (*(volatile struct DSPI_tag *) 0xFFF98000UL) -#define DSPI_3 (*(volatile struct DSPI_tag *) 0xFFF9C000UL) -#define EBI (*(volatile struct EBI_tag *) 0xC3F84000UL) -#define EDMA (*(volatile struct EDMA_tag *) 0xFFF44000UL) -#define EMIOS_0 (*(volatile struct EMIOS_tag *) 0xC3FA0000UL) -#define EMIOS_1 (*(volatile struct EMIOS_tag *) 0xC3FA4000UL) -#define ETIMER_0 (*(volatile struct ETIMER_tag *) 0xFFE18000UL) -#define ETIMER_1 (*(volatile struct ETIMER_tag *) 0xFFE1C000UL) -#define FCU (*(volatile struct FCU_tag *) 0xFFE6C000UL) -#define FLEXPWM_0 (*(volatile struct FLEXPWM_tag *) 0xFFE24000UL) -#define FLEXPWM_1 (*(volatile struct FLEXPWM_tag *) 0xFFE28000UL) -#define FR (*(volatile struct FR_tag *) 0xFFFE0000UL) -#define I2C_0 (*(volatile struct I2C_tag *) 0xFFE30000UL) -#define I2C_1 (*(volatile struct I2C_tag *) 0xFFE34000UL) -#define I2C_2 (*(volatile struct I2C_tag *) 0xFFE38000UL) -#define I2C_3 (*(volatile struct I2C_tag *) 0xFFE3C000UL) -#define INTC (*(volatile struct INTC_tag *) 0xFFF48000UL) -#define LCD (*(volatile struct LCD_tag *) 0xFFE74000UL) -#define LINFLEX_0 (*(volatile struct LINFLEX_tag *) 0xFFE40000UL) -#define LINFLEX_1 (*(volatile struct LINFLEX_tag *) 0xFFE44000UL) -#define LINFLEX_2 (*(volatile struct LINFLEX_tag *) 0xFFE48000UL) -#define LINFLEX_3 (*(volatile struct LINFLEX_tag *) 0xFFE4C000UL) -#define MCM (*(volatile struct MCM_tag *) 0xFFF40000UL) -#define ME (*(volatile struct ME_tag *) 0xC3FDC000UL) -#define MPU (*(volatile struct MPU_tag *) 0xFFF10000UL) -#define PCU (*(volatile struct PCU_tag *) 0xC3FE8000UL) -#define PIT (*(volatile struct PIT_tag *) 0xC3FF0000UL) -#define RGM (*(volatile struct RGM_tag *) 0xC3FE4000UL) -#define RTC (*(volatile struct RTC_tag *) 0xC3FEC000UL) -#define SAFEPORT (*(volatile struct FLEXCAN_tag *) 0xFFFE8000UL) -#define SIU (*(volatile struct SIU_tag *) 0xC3F90000UL) -#define SMC (*(volatile struct SMC_tag *) 0xFFE60000UL) -#define SSCM (*(volatile struct SSCM_tag *) 0xC3FD8000UL) -#define SSD_0 (*(volatile struct SSD_tag *) 0xFFE61000UL) -#define SSD_1 (*(volatile struct SSD_tag *) 0xFFE61800UL) -#define SSD_2 (*(volatile struct SSD_tag *) 0xFFE62000UL) -#define SSD_3 (*(volatile struct SSD_tag *) 0xFFE62800UL) -#define SSD_4 (*(volatile struct SSD_tag *) 0xFFE63000UL) -#define SSD_5 (*(volatile struct SSD_tag *) 0xFFE63800UL) -#define STM (*(volatile struct STM_tag *) 0xFFF3C000UL) -#define SWT (*(volatile struct SWT_tag *) 0xFFF38000UL) -#define WKUP (*(volatile struct WKUP_tag *) 0xC3F94000UL) -#define CRC (*(volatile struct CRC_tag *) 0xFFE68000UL) - -#ifdef __MWERKS__ -#pragma pop -#endif - -#ifdef __cplusplus -} -#endif -#endif /* ifdef _JDP_H */ -/* End of file */ diff --git a/os/hal/platforms/SPC56x/hal_lld.c b/os/hal/platforms/SPC56x/hal_lld.c deleted file mode 100644 index f5dec45168..0000000000 --- a/os/hal/platforms/SPC56x/hal_lld.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC56x/hal_lld.c - * @brief SPC563 HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - extern void _vectors(void); - uint32_t n; - - /* Enables the branch prediction, clears and enables the BTB into the - BUCSR special register (1013).*/ - asm volatile ("li %%r3, 0x0201 \t\n" - "mtspr 1013, %%r3": : : "r3"); - - /* FLASH wait states and prefetching setup.*/ - CFLASH0.BIUCR.R = SPC563_FLASH_BIUCR | SPC563_FLASH_WS; - CFLASH0.BIUCR2.R = 0; - CFLASH0.PFCR3.R = 0; - - /* Optimal crossbar settings. The DMA priority is placed above the CPU - priority in order to not starve I/O activities while the CPU is - executing tight loops (FLASH and SRAM slave ports only). - The SRAM is parked on the load/store port, for some unknown reason it - is defaulted on the instructions port and this kills performance.*/ - XBAR.SGPCR3.B.PARK = 4; /* RAM slave on load/store port.*/ - XBAR.MPR0.R = 0x00030201; /* Flash slave port priorities: - eDMA (1): 0 (highest) - Core Instructions (0): 1 - Undocumented (2): 2 - Core Data (4): 3 */ - XBAR.MPR3.R = 0x00030201; /* SRAM slave port priorities: - eDMA (1): 0 (highest) - Core Instructions (0): 1 - Undocumented (2): 2 - Core Data (4): 3 */ - - /* Downcounter timer initialized for system tick use, TB enabled for debug - and measurements.*/ - n = SPC563_SYSCLK / CH_FREQUENCY; - asm volatile ("li %%r3, 0 \t\n" - "mtspr 284, %%r3 \t\n" /* Clear TBL register. */ - "mtspr 285, %%r3 \t\n" /* Clear TBU register. */ - "mtspr 22, %[n] \t\n" /* Init. DEC register. */ - "mtspr 54, %[n] \t\n" /* Init. DECAR register.*/ - "li %%r3, 0x4000 \t\n" /* TBEN bit. */ - "mtspr 1008, %%r3 \t\n" /* HID0 register. */ - "lis %%r3, 0x0440 \t\n" /* DIE ARE bits. */ - "mtspr 340, %%r3" /* TCR register. */ - : : [n] "r" (n) : "r3"); - - /* INTC initialization, software vector mode, 4 bytes vectors, starting - at priority 0.*/ - INTC.MCR.R = 0; - INTC.CPR.R = 0; - INTC.IACKR.R = (uint32_t)_vectors; -} - -/** - * @brief SPC563 clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h and - * @p hal_lld.h - * @note This function must be invoked only after the system reset. - * - * @special - */ -void spc563_clock_init(void) { - - /* PLL activation.*/ - FMPLL.ESYNCR1.B.EMODE = 1; - FMPLL.ESYNCR1.B.CLKCFG &= 1; /* Bypass mode, PLL off.*/ - FMPLL.ESYNCR1.B.CLKCFG |= 2; /* PLL on. */ - FMPLL.ESYNCR1.B.EPREDIV = SPC563_CLK_PREDIV; - FMPLL.ESYNCR1.B.EMFD = SPC563_CLK_MFD; - FMPLL.ESYNCR2.B.ERFD = SPC563_CLK_RFD; - while (!FMPLL.SYNSR.B.LOCK) - ; - FMPLL.ESYNCR1.B.CLKCFG |= 4; /* Clock from the PLL. */ -} - -/** @} */ diff --git a/os/hal/platforms/SPC56x/hal_lld.h b/os/hal/platforms/SPC56x/hal_lld.h deleted file mode 100644 index 8a30113bab..0000000000 --- a/os/hal/platforms/SPC56x/hal_lld.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC56x/hal_lld.h - * @brief SPC563 HAL subsystem low level driver header. - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "mpc563m.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "SPC563M64" - -#define RFD_DIV2 0 /**< Divide VCO frequency by 2. */ -#define RFD_DIV4 1 /**< Divide VCO frequency by 4. */ -#define RFD_DIV8 2 /**< Divide VCO frequency by 8. */ -#define RFD_DIV16 3 /**< Divide VCO frequency by 16.*/ - -/* The following settings are related to the FLASH controller, performance - and stability depends on them, be careful.*/ -#define BIUCR_BANK1_TOO 0x01000000 /**< Use settings for bank1 too.*/ -#define BIUCR_MASTER7_PREFETCH 0x00800000 /**< Enable master 7 prefetch. */ -#define BIUCR_MASTER6_PREFETCH 0x00400000 /**< Enable master 6 prefetch. */ -#define BIUCR_MASTER5_PREFETCH 0x00200000 /**< Enable master 5 prefetch. */ -#define BIUCR_MASTER4_PREFETCH 0x00100000 /**< Enable master 4 prefetch. */ -#define BIUCR_MASTER3_PREFETCH 0x00080000 /**< Enable master 3 prefetch. */ -#define BIUCR_MASTER2_PREFETCH 0x00040000 /**< Enable master 2 prefetch. */ -#define BIUCR_MASTER1_PREFETCH 0x00020000 /**< Enable master 1 prefetch. */ -#define BIUCR_MASTER0_PREFETCH 0x00010000 /**< Enable master 0 prefetch. */ -#define BIUCR_APC_MASK 0x0000E000 /**< APC field mask. */ -#define BIUCR_APC_0 (0 << 13) /**< No additional hold cycles. */ -#define BIUCR_APC_1 (1 << 13) /**< 1 additional hold cycle. */ -#define BIUCR_APC_2 (2 << 13) /**< 2 additional hold cycles. */ -#define BIUCR_APC_3 (3 << 13) /**< 3 additional hold cycles. */ -#define BIUCR_APC_4 (4 << 13) /**< 4 additional hold cycles. */ -#define BIUCR_APC_5 (5 << 13) /**< 5 additional hold cycles. */ -#define BIUCR_APC_6 (6 << 13) /**< 6 additional hold cycles. */ -#define BIUCR_WWSC_MASK 0x00001800 /**< WWSC field mask. */ -#define BIUCR_WWSC_0 (0 << 11) /**< No write wait states. */ -#define BIUCR_WWSC_1 (1 << 11) /**< 1 write wait state. */ -#define BIUCR_WWSC_2 (2 << 11) /**< 2 write wait states. */ -#define BIUCR_WWSC_3 (3 << 11) /**< 3 write wait states. */ -#define BIUCR_RWSC_MASK 0x00001800 /**< RWSC field mask. */ -#define BIUCR_RWSC_0 (0 << 8) /**< No read wait states. */ -#define BIUCR_RWSC_1 (1 << 8) /**< 1 read wait state. */ -#define BIUCR_RWSC_2 (2 << 8) /**< 2 read wait states. */ -#define BIUCR_RWSC_3 (3 << 8) /**< 3 read wait states. */ -#define BIUCR_RWSC_4 (4 << 8) /**< 4 read wait states. */ -#define BIUCR_RWSC_5 (5 << 8) /**< 5 read wait states. */ -#define BIUCR_RWSC_6 (6 << 8) /**< 6 read wait states. */ -#define BIUCR_RWSC_7 (7 << 8) /**< 7 read wait states. */ -#define BIUCR_DPFEN 0x00000040 /**< Data prefetch enable. */ -#define BIUCR_IPFEN 0x00000010 /**< Instr. prefetch enable. */ -#define BIUCR_PFLIM_MASK 0x00000060 /**< PFLIM field mask. */ -#define BIUCR_PFLIM_NO (0 << 1) /**< No prefetching. */ -#define BIUCR_PFLIM_ON_MISS (1 << 1) /**< Prefetch on miss. */ -#define BIUCR_PFLIM_ON_HITMISS (2 << 1) /**< Prefetch on hit and miss. */ -#define BIUCR_BFEN 0x00000001 /**< Flash buffering enable. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Clock bypass. - * @note If set to @p TRUE then the PLL is not started and initialized, the - * external clock is used as-is and the other clock-related settings - * are ignored. - */ -#if !defined(SPC563_CLK_BYPASS) || defined(__DOXYGEN__) -#define SPC563_CLK_BYPASS FALSE -#endif - -/** - * @brief Disables the overclock checks. - */ -#if !defined(SPC563_ALLOW_OVERCLOCK) || defined(__DOXYGEN__) -#define SPC563_ALLOW_OVERCLOCK FALSE -#endif - -/** - * @brief External clock pre-divider. - * @note Must be in range 0...14. - * @note The effective divider factor is this value plus one. - */ -#if !defined(SPC563_CLK_PREDIV) || defined(__DOXYGEN__) -#define SPC563_CLK_PREDIV 1 -#endif - -/** - * @brief Multiplication factor divider. - * @note Must be in range 32...96. - */ -#if !defined(SPC563_CLK_MFD) || defined(__DOXYGEN__) -#define SPC563_CLK_MFD 80 -#endif - -/** - * @brief Reduced frequency divider. - */ -#if !defined(SPC563_CLK_RFD) || defined(__DOXYGEN__) -#define SPC563_CLK_RFD RFD_DIV4 -#endif - -/** - * @brief Flash buffer and prefetching settings. - * @note Please refer to the SPC563M64 reference manual about the meaning - * of the following bits, if in doubt DO NOT MODIFY IT. - * @note Do not specify the APC, WWSC, RWSC bits in this value because - * those are calculated from the system clock and ORed with this - * value. - */ -#if !defined(SPC563_FLASH_BIUCR) || defined(__DOXYGEN__) -#define SPC563_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (SPC563_CLK_PREDIV < 0) || (SPC563_CLK_PREDIV > 14) -#error "invalid SPC563_CLK_PREDIV value specified" -#endif - -#if (SPC563_CLK_MFD < 32) || (SPC563_CLK_MFD > 96) -#error "invalid SPC563_CLK_MFD value specified" -#endif - -#if (SPC563_CLK_RFD != RFD_DIV2) && (SPC563_CLK_RFD != RFD_DIV4) && \ - (SPC563_CLK_RFD != RFD_DIV8) && (SPC563_CLK_RFD != RFD_DIV16) -#error "invalid SPC563_CLK_RFD value specified" -#endif - -/** - * @brief PLL output clock. - */ -#define SPC563_PLLCLK ((EXTCLK / (SPC563_CLK_PREDIV + 1)) * SPC563_CLK_MFD) - -#if (SPC563_PLLCLK < 256000000) || (SPC563_PLLCLK > 512000000) -#error "VCO frequency out of the acceptable range (256...512)" -#endif - -/** - * @brief PLL output clock. - */ -#if !SPC563_CLK_BYPASS || defined(__DOXYGEN__) -#define SPC563_SYSCLK (SPC563_PLLCLK / (1 << (SPC563_CLK_RFD + 1))) -#else -#define SPC563_SYSCLK EXTCLK -#endif - -#if (SPC563_SYSCLK > 80000000) && !SPC563_ALLOW_OVERCLOCK -#error "System clock above maximum rated frequency (80MHz)" -#endif - -/** - * @brief Flash wait states are a function of the system clock. - */ -#if (SPC563_SYSCLK <= 30000000) || defined(__DOXYGEN__) -#define SPC563_FLASH_WS (BIUCR_APC_0 | BIUCR_RWSC_0 | BIUCR_WWSC_1) -#elif SPC563_SYSCLK <= 60000000 -#define SPC563_FLASH_WS (BIUCR_APC_1 | BIUCR_RWSC_1 | BIUCR_WWSC_1) -#else -#define SPC563_FLASH_WS (BIUCR_APC_2 | BIUCR_RWSC_2 | BIUCR_WWSC_1) -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void spc563_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/SPC56x/mpc563m.h b/os/hal/platforms/SPC56x/mpc563m.h deleted file mode 100644 index 8ee2b5787f..0000000000 --- a/os/hal/platforms/SPC56x/mpc563m.h +++ /dev/null @@ -1,4123 +0,0 @@ -/**************************************************************************/ - -/* FILE NAME: mpc563xm.h COPYRIGHT (c) Freescale 2008,2009 */ -/* VERSION: 2.0 All Rights Reserved */ -/* */ -/* DESCRIPTION: */ -/* This file contain all of the register and bit field definitions for */ -/* MPC563xM. This version supports revision 1.0 and later. */ -/*========================================================================*/ -/* UPDATE HISTORY */ -/* REV AUTHOR DATE DESCRIPTION OF CHANGE */ -/* --- ----------- --------- --------------------- */ -/* 1.0 G. Emerson 31/OCT/07 Initial version. */ -/* 1.1 G. Emerson 20/DEC/07 Added SYSDIV HLT HLTACK */ -/* Added ESYNCR1 ESYNCR2 SYNFMMR */ -/* 1.2 G. Emerson 31/JAN/08 Change eMIOS channels so there are 24. */ -/* 8 channels in the middle of the range */ -/* do not exist */ -/* 1.3 G. Emerson 30/JUL/08 FLEXCAN - Supports FIFO and Buffer. */ -/* RXIMR added */ -/* FMPLL - Added FMPLL.SYNFMMR.B.BSY */ -/* SIU - Added SIU.ISEL0-3 */ -/* EMIOS - Added EMIOS.CH[x].ALTCADR.R */ -/* MCM - Replaced ECSM with MCM */ -/* removing SWT registers as defined at */ -/* seperate memory location. PFLASH */ -/* registers pre-fixed with P*. Added PCT,*/ -/* PLREV, PLAMC, PLASC, IOPMC, MRSR, MWCR.*/ -/* PBRIDGE - Removed as no PBRIDGE */ -/* registers. */ -/* INTC - Updated number of PSR from */ -/* 358 to 360. */ -/* mpc5500_spr.h - Added RI to MSR and NMI*/ -/* to MSCR. */ -/* 1.4 G. Emerson 30/SEP/08 Add SIU.MIDR2 */ -/* Changes to SIU.MIDR as per RM. */ -/* 1.5 May 2009 Changes to match documentation, removed*/ -/* Not released */ -/* 1.6 K. Odenthal 03/June/09 Update for 1.5M version of the MPC563xM*/ -/* & R. Dees */ -/* INTC - All Processor 0 regs matched to previous */ -/* version */ -/* INTC - BCR renamed to MCR to match previous */ -/* version */ -/* INTC - VTES_PRC1 and HVEN_PRC1 added to MCR */ -/* INTC - CPR_PRC1, IACKR_PRC1 and EOIR_PRC1 */ -/* registers added */ -/* INTC - 512 PSR registers instead of 364 */ -/* ECSM - (Internal - mcm -> ecsm in the source files*/ -/* for generating the header file */ -/* ECSM - All bits and regs got an additional "p" in */ -/* the name in the user manual for "Platform" */ -/* -> deleted to match */ -/* ECSM - SWTCR, SWTSR and SWTIR don't exist in */ -/* MPC563xM -> deleted */ -/* ECSM - PROTECTION in the URM is one bitfield, */ -/* in mop5534 this are four: PROT1-4 -> */ -/* changed to match */ -/* EMCM - removed undocumented registers */ -/* ECSM - RAM ECC Syndrome is new in MPC563xM -> added */ -/* XBAR - removed AMPR and ASGPCR registers */ -/* XBAR - removed HPE bits for nonexistant masters */ -/* EBI - added: D16_31, AD_MUX and SETA bits */ -/* EBI - Added reserved register at address 0x4. */ -/* EBI - Corrected number of chip selects in for both*/ -/* the EBI_CS and the CAL_EBI_CS */ -/* SIU - corrected number of GPDO registers and */ -/* allowed for maximum PCR registers. */ -/* SWT - add KEY bit to CR, correct WND (from WNO) */ -/* SWT - add SK register */ -/* PMC - moved bits from CFGR to Status Register (SR)*/ -/* PMC - Added SR */ -/* DECFIL - Added new bits DSEL, IBIE, OBIE, EDME, */ -/* TORE, & TRFE to MCR. Added IBIC, OBIC, */ -/* DIVRC, IBIF, OBIF, DIVR to MSR. */ -/* changed OUTTEG to OUTTAG in OB */ -/* Change COEF to TAG in TAG register */ -/* EQADC - removed REDLCCR - not supported */ -/* FLASH - Aligned register and bit names with legacy*/ -/* 1.7 K. Odenthal 10/November/09 */ -/* SIU - changed PCR[n].PA from 3 bit to 4 bit */ -/* eTPU - changed WDTR_A.WDM from 1 bit to 2 bits */ -/* DECFIL - changed COEF.R and TAP.R from 16 bit to */ -/* 32 bit */ -/* 2.0 K. Odenthal 12/February/2010 */ -/* TSENS - Temperature Sensor Module added to */ -/* header file */ -/* ANSI C Compliance - Register structures have a */ -/* Bitfield Tag ('B') tag only if there is */ -/* at least one Bitfiels defined. Empty */ -/* tags like 'vuint32_t:32;' are not */ -/* allowed. */ -/* DECFIL - removed MXCR register. This register is */ -/* not supported on this part */ -/* SIU - SWT_SEL bit added in SIU DIRER register */ -/* EDMA - removed HRSL, HRSH and GPOR registers. */ -/* Those registers are not supported in */ -/* that part. */ -/* ESCI - removed LDBG and DSF bits from LCR */ -/* registers. Those bits are not supported */ -/* in that part. */ -/* Those registers are not supported in */ -/* that part. */ -/**************************************************************************/ -/*>>>>NOTE! this file is auto-generated please do not edit it!<<<<*/ - -#ifndef _MPC563M_H_ -#define _MPC563M_H_ - -#include "typedefs.h" - -#ifdef __cplusplus -extern "C" { - -#endif /* - */ - -#ifdef __MWERKS__ -#pragma push -#pragma ANSI_strict off -#endif /* - */ - -/****************************************************************************/ -/* MODULE : FMPLL */ -/****************************************************************************/ - struct FMPLL_tag { - union { - vuint32_t R; - struct { - vuint32_t:1; - vuint32_t PREDIV:3; - vuint32_t MFD:5; - vuint32_t:1; - vuint32_t RFD:3; - vuint32_t LOCEN:1; - vuint32_t LOLRE:1; - vuint32_t LOCRE:1; - vuint32_t:1; /* Reserved in MPC563xM - - Deleted for legacy header version [mpc5534.h]: - - */ - vuint32_t LOLIRQ:1; - vuint32_t LOCIRQ:1; - vuint32_t:13; /* Reserved in MPC563xM - - Deleted for legacy header version [mpc5534.h]: - - - - - - */ - } B; - } SYNCR; - union { - vuint32_t R; - struct { - vuint32_t:22; - vuint32_t LOLF:1; - vuint32_t LOC:1; - vuint32_t MODE:1; - vuint32_t PLLSEL:1; - vuint32_t PLLREF:1; - vuint32_t LOCKS:1; - vuint32_t LOCK:1; - vuint32_t LOCF:1; - vuint32_t:2; /* Reserved in MPC563xM - - Deleted for legacy header version [mpc5534.h]: - - - - */ - } B; - } SYNSR; - union { - vuint32_t R; - struct { - vuint32_t EMODE:1; - vuint32_t CLKCFG:3; - vuint32_t:8; - vuint32_t EPREDIV:4; - vuint32_t:9; - vuint32_t EMFD:7; - } B; - } ESYNCR1; /* Enhanced Synthesizer Control Register 1 (ESYNCR1) (new in MPC563xM) Offset 0x0008 */ - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t LOCEN:1; - vuint32_t LOLRE:1; - vuint32_t LOCRE:1; - vuint32_t LOLIRQ:1; - vuint32_t LOCIRQ:1; - vuint32_t:17; - vuint32_t ERFD:2; - } B; - } ESYNCR2; /* Enhanced Synthesizer Control Register 2 (ESYNCR2) (new in MPC563xM) Offset 0x000C */ - int32_t FMPLL_reserved0[2]; - union { - vuint32_t R; - struct { - vuint32_t BSY:1; - vuint32_t MODEN:1; - vuint32_t MODSEL:1; - vuint32_t MODPERIOD:13; - vuint32_t:1; - vuint32_t INCSTEP:15; - } B; - } SYNFMMR; /* Synthesizer FM Modulation Register (SYNFMMR) (new in MPC563xM) Offset 0x0018 */ - }; -/****************************************************************************/ -/* MODULE : EBI */ -/****************************************************************************/ - struct CS_tag { - union { - vuint32_t R; - struct { - vuint32_t BA:17; /* */ - vuint32_t:3; /* */ - vuint32_t PS:1; /* */ - vuint32_t:3; /* */ - vuint32_t AD_MUX:1; /* new in MPC563xM */ - vuint32_t BL:1; /* */ - vuint32_t WEBS:1; /* */ - vuint32_t TBDIP:1; /* */ - vuint32_t:1; /* */ - vuint32_t SETA:1; /* new in MPC563xM */ - vuint32_t BI:1; /* */ - vuint32_t V:1; /* */ - } B; - } BR; /* EBI_BR */ - union { - vuint32_t R; - struct { - vuint32_t AM:17; /* */ - vuint32_t:7; /* */ - vuint32_t SCY:4; /* */ - vuint32_t:1; /* */ - vuint32_t BSCY:2; /* */ - vuint32_t:1; /* */ - } B; - } OR; /* EBI_OR */ - }; - struct CAL_CS_tag { - union { - vuint32_t R; - struct { - vuint32_t BA:17; /* */ - vuint32_t:3; /* */ - vuint32_t PS:1; /* */ - vuint32_t:3; /* */ - vuint32_t AD_MUX:1; /* new in MPC563xM */ - vuint32_t BL:1; /* */ - vuint32_t WEBS:1; /* */ - vuint32_t TBDIP:1; /* */ - vuint32_t:1; /* */ - vuint32_t SETA:1; /* new in MPC563xM */ - vuint32_t BI:1; /* */ - vuint32_t V:1; /* */ - } B; - } BR; /* EBI_CAL_BR */ - - union { - vuint32_t R; - struct { - vuint32_t AM:17; /* */ - vuint32_t:7; /* */ - vuint32_t SCY:4; /* */ - vuint32_t:1; /* */ - vuint32_t BSCY:2; /* */ - vuint32_t:1; /* */ - } B; - } OR; /* EBI_CAL_OR */ - - }; - - struct EBI_tag { - union { - vuint32_t R; - struct { - vuint32_t:5; /* */ - vuint32_t SIZEEN:1; /* SIZEN */ - vuint32_t SIZE:2; /* */ - vuint32_t:8; /* */ - vuint32_t ACGE:1; /* */ - vuint32_t EXTM:1; /* */ - vuint32_t EARB:1; /* */ - vuint32_t EARP:2; /* */ - vuint32_t:4; /* */ - vuint32_t MDIS:1; /* */ - vuint32_t:3; /* */ - vuint32_t D16_31:1; /* new in MPC563xM */ - vuint32_t AD_MUX:1; /* new in MPC563xM */ - vuint32_t DBM:1; /* */ - } B; - } MCR; /* EBI Module Configuration Register (MCR) EBI_MCR @baseaddress + 0x00 */ - - uint32_t EBI_reserved1[1]; - - union { - vuint32_t R; - struct { - vuint32_t:30; /* */ - vuint32_t TEAF:1; /* */ - vuint32_t BMTF:1; /* */ - } B; - } TESR; /* EBI Transfer Error Status Register (TESR) EBI_TESR @baseaddress + 0x08 */ - - union { - vuint32_t R; - struct { - vuint32_t:16; /* */ - vuint32_t BMT:8; /* */ - vuint32_t BME:1; /* */ - vuint32_t:7; /* */ - } B; - } BMCR; /* EBI_BMCR @baseaddress + 0x0C */ - - struct CS_tag CS[4]; - - uint32_t EBI_reserved2[4]; - - /* Calibration registers */ - struct CAL_CS_tag CAL_CS[4]; - - }; /* end of EBI_tag */ -/****************************************************************************/ -/* MODULE : FLASH */ -/****************************************************************************/ -/* 3 flash modules implemented. */ -/* HBL and HBS not used in Bank 0 / Array 0 */ -/* LML, SLL, LMS, PFCR1, PFAPR, PFCR2, and PFCR3 not used in */ -/* Bank 1 / Array 1 or Bank 1 / Array 3 */ -/****************************************************************************/ - struct FLASH_tag { - union { /* Module Configuration Register (MCR)@baseaddress + 0x00 */ - vuint32_t R; - struct { - vuint32_t EDC:1; /* ECC Data Correction (Read/Clear) */ - vuint32_t:4; /* Reserved */ - vuint32_t SIZE:3; /* Array Size (Read Only) */ - vuint32_t:1; /* Reserved */ - vuint32_t LAS:3; /* Low Address Space (Read Only) */ - vuint32_t:3; /* Reserved */ - vuint32_t MAS:1; /* Mid Address Space (Read Only) */ - vuint32_t EER:1; /* ECC Event Error (Read/Clear) *//* BBEPE and EPE */ - vuint32_t RWE:1; /* Read While Write Event Error (Read/Clear) */ - vuint32_t:2; /* Reserved */ - vuint32_t PEAS:1; /* Program/Erase Access Space (Read Only) */ - vuint32_t DONE:1; /* Status (Read Only) */ - vuint32_t PEG:1; /* Program/Erase Good (Read Only) */ - vuint32_t:4; /* Reserved *//* RSD PEG STOP RSVD */ - vuint32_t PGM:1; /* Program (Read/Write) */ - vuint32_t PSUS:1; /* Program Suspend (Read/Write) */ - vuint32_t ERS:1; /* Erase (Read/Write) */ - vuint32_t ESUS:1; /* Erase Suspend (Read/Write) */ - vuint32_t EHV:1; /* Enable High Voltage (Read/Write) */ - } B; - } MCR; - - union { /* Low/Mid-Address Space Block Locking Register (LML)@baseaddress + 0x04 */ - vuint32_t R; - struct { - vuint32_t LME:1; /* Low/Mid address space block enable (Read Only) */ - vuint32_t:10; /* Reserved */ - vuint32_t SLOCK:1; /*SLK *//* Shadow address space block lock (Read/Write) */ - vuint32_t:2; /* Reserved */ - vuint32_t MLOCK:2; /*MLK *//* Mid address space block lock (Read/Write) */ - vuint32_t:8; /* Reserved */ - vuint32_t LLOCK:8; /*LLK *//* Low address space block lock (Read/Write) */ - } B; - } LMLR; /*LML */ - - union { /* High-Address Space Block Locking Register (HBL) - @baseaddress + 0x08 */ - vuint32_t R; - struct { - vuint32_t HBE:1; /* High address space Block Enable (Read Only) */ - vuint32_t:27; /* Reserved */ - vuint32_t HBLOCK:4; /* High address space block lock (Read/Write) */ - } B; - } HLR; /*HBL */ - - union { /* Secondary Low/Mid-Address Space Block Locking Register (SLL)@baseaddress + 0x0C */ - vuint32_t R; - struct { - vuint32_t SLE:1; /* Secondary low/mid address space block enable (Read Only) */ - vuint32_t:10; /* Reserved */ - vuint32_t SSLOCK:1; /*SSLK *//* Secondary shadow address space block lock (Read/Write) */ - vuint32_t:2; /* Reserved */ - vuint32_t SMLOCK:2; /*SMK *//* Secondary mid address space block lock (Read/Write) */ - vuint32_t:8; /* Reserved */ - vuint32_t SLLOCK:8; /*SLK *//* Secondary low address space block lock (Read/Write) */ - } B; - } SLMLR; /*SLL */ - - union { /* Low/Mid-Address Space Block Select Register (LMS)@baseaddress + 0x10 */ - vuint32_t R; - struct { - vuint32_t:14; /* Reserved */ - vuint32_t MSEL:2; /*MSL *//* Mid address space block select (Read/Write) */ - vuint32_t:8; /* Reserved */ - vuint32_t LSEL:8; /*LSL *//* Low address space block select (Read/Write) */ - } B; - } LMSR; /*LMS */ - - union { /* High-Address Space Block Select Register (HBS) - not used@baseaddress + 0x14 */ - vuint32_t R; - struct { - vuint32_t:28; /* Reserved */ - vuint32_t HBSEL:4; /*HSL *//* High address space block select (Read/Write) */ - } B; - } HSR; /*HBS */ - - union { /* Address Register (ADR)@baseaddress + 0x18 */ - vuint32_t R; - struct { - vuint32_t SAD:1; /* Shadow address (Read Only) */ - vuint32_t:10; /* Reserved */ - vuint32_t ADDR:18; /*AD *//* Address 20-3 (Read Only) */ - vuint32_t:3; /* Reserved */ - } B; - } AR; /*ADR */ - - union { /* @baseaddress + 0x1C */ - vuint32_t R; - struct { - vuint32_t:7; /* Reserved */ - vuint32_t GCE:1; /* Global Configuration Enable (Read/Write) */ - vuint32_t:4; /* Reserved */ - vuint32_t M3PFE:1; /* Master 3 Prefetch Enable (Read/Write) */ - vuint32_t M2PFE:1; /* Master 2 Prefetch Enable (Read/Write) */ - vuint32_t M1PFE:1; /* Master 1 Prefetch Enable (Read/Write) */ - vuint32_t M0PFE:1; /* Master 0 Prefetch Enable (Read/Write) */ - vuint32_t APC:3; /* Address Pipelining Control (Read/Write) */ - vuint32_t WWSC:2; /* Write Wait State Control (Read/Write) */ - vuint32_t RWSC:3; /* Read Wait State Control (Read/Write) */ - vuint32_t:1; /* Reserved */ - vuint32_t DPFEN:1; /*DPFE *//* Data Prefetch Enable (Read/Write) */ - vuint32_t:1; /* Reserved */ - vuint32_t IPFEN:1; /*IPFE *//* Instruction Prefetch Enable (Read/Write) */ - vuint32_t:1; /* Reserved */ - vuint32_t PFLIM:2; /* Prefetch Limit (Read/Write) */ - vuint32_t BFEN:1; /*BFE *//* Buffer Enable (Read/Write) */ - } B; - } BIUCR; /*PFCR1 */ - - union { /* @baseaddress + 0x20 */ - vuint32_t R; - struct { - vuint32_t:24; /* Reserved */ - vuint32_t M3AP:2; /* Master 3 Access Protection (Read/Write) */ - vuint32_t M2AP:2; /* Master 2 Access Protection (Read/Write) */ - vuint32_t M1AP:2; /* Master 1 Access Protection (Read/Write) */ - vuint32_t M0AP:2; /* Master 0 Access Protection (Read/Write) */ - } B; - } BIUAPR; /*PFAPR */ - - union { /* @baseaddress + 0x24 */ - vuint32_t R; - struct { - vuint32_t LBCFG:2; /* Line Buffer Configuration (Read/Write) */ - vuint32_t:30; /* Reserved */ - } B; - } BIUCR2; - - union { /* @baseaddress + 0x28 */ - vuint32_t R; - struct { - vuint32_t:25; /* Reserved */ - vuint32_t B1_DPFE:1; /* Bank1 Data Prefetch Enable (Read/Write) */ - vuint32_t:1; /* Reserved */ - vuint32_t B1_IPFE:1; /* Bank1 Instruction Prefetch Enable (Read/Write) */ - vuint32_t:1; /* Reserved */ - vuint32_t B1_PFLIM:2; /* Bank1 Prefetch Limit (Read/Write) */ - vuint32_t B1_BFE:1; /* Bank1 Buffer Enable (Read/Write) */ - } B; - } PFCR3; - - int32_t FLASH_reserverd_89[4]; - - union { /* User Test 0 (UT0) register@baseaddress + 0x3c */ - vuint32_t R; - struct { - vuint32_t UTE:1; /* User test enable (Read/Clear) */ - vuint32_t SBCE:1; /* Single bit correction enable (Read/Clear) */ - vuint32_t:6; /* Reserved */ - vuint32_t DSI:8; /* Data syndrome input (Read/Write) */ - vuint32_t:9; /* Reserved */ - vuint32_t:1; /* Reserved (Read/Write) */ - vuint32_t MRE:1; /* Margin Read Enable (Read/Write) */ - vuint32_t MRV:1; /* Margin Read Value (Read/Write) */ - vuint32_t EIE:1; /* ECC data Input Enable (Read/Write) */ - vuint32_t AIS:1; /* Array Integrity Sequence (Read/Write) */ - vuint32_t AIE:1; /* Array Integrity Enable (Read/Write) */ - vuint32_t AID:1; /* Array Integrity Done (Read Only) */ - } B; - } UT0; - - union { /* User Test 1 (UT1) register@baseaddress + 0x40 */ - vuint32_t R; - struct { - vuint32_t DAI:32; /* Data Array Input (Read/Write) */ - } B; - } UT1; - - union { /* User Test 2 (UT2) register@baseaddress + 0x44 */ - vuint32_t R; - struct { - vuint32_t DAI:32; /* Data Array Input (Read/Write) */ - } B; - } UT2; - - union { /* User Multiple Input Signature Register 0-5 (UMISR[5])@baseaddress + 0x48 */ - vuint32_t R; - struct { - vuint32_t MS:32; /* Multiple input Signature (Read/Write) */ - } B; - } UMISR[5]; - - }; /* end of FLASH_tag */ -/****************************************************************************/ -/* MODULE : SIU */ -/****************************************************************************/ - struct SIU_tag { - union { - vuint32_t R; - struct { - vuint32_t S_F:1; /* Identifies the Manufacturer S/F */ - vuint32_t FLASH_SIZE_1:4; /* Define major Flash memory size (see Table 15-4 for details) Flash Size 1 */ - vuint32_t FLASH_SIZE_2:4; /* Define Flash memory size, small granularity (see Table 15-5 for details) Flash Size 1 */ - vuint32_t TEMP_RANGE:2; /* Define maximum operating range Temp Range */ - vuint32_t:1; /* Reserved for future enhancements */ - vuint32_t MAX_FREQ:2; /* Define maximum device speed Max Freq */ - vuint32_t:1; /* Reserved for future enhancements */ - vuint32_t SUPPLY:1; /* Defines if the part is 5V or 3V Supply */ - vuint32_t PART_NUMBER:8; /* Contain the ASCII representation of the character that indicates the product Part Number */ - vuint32_t TBD:1; /* 1-bit field defined by SoC to describe optional feature, e.g., additional SPI */ - vuint32_t:2; /* Reserved for future enhancements */ - vuint32_t EE:1; /* Indicates if Data Flash is present */ - vuint32_t:3; /* Reserved for future enhancements */ - vuint32_t FR:1; /* Indicates if Data FlexRay is present */ - } B; - } MIDR2; /* MCU ID Register 2 SIU_MIDR2 @baseaddress + 0x4 */ - - union { - vuint32_t R; - struct { - vuint32_t PARTNUM:16; /* Device part number: 0x5633 */ - vuint32_t CSP:1; /* CSP configuration (new in MPC563xM) */ - vuint32_t PKG:5; /* Indicate the package the die is mounted in. (new in MPC563xM) */ - vuint32_t:2; /* Reserved */ - vuint32_t MASKNUM:8; /* MCU major mask number; updated for each complete resynthesis. MCU minor mask number; updated for each mask revision */ - } B; - } MIDR; /* MCU ID Register (MIDR) SIU_MIDR @baseaddress + 0x8 */ - - union { - vuint32_t R; - } TST; /* SIU Test Register (SIU_TST) SIU_TST @baseaddress + 0xC */ - - union { - vuint32_t R; - struct { - vuint32_t PORS:1; /* Power-On Reset Status */ - vuint32_t ERS:1; /* External Reset Status */ - vuint32_t LLRS:1; /* Loss of Lock Reset Status */ - vuint32_t LCRS:1; /* Loss of Clock Reset Status */ - vuint32_t WDRS:1; /* Watchdog Timer/Debug Reset Status */ - vuint32_t CRS:1; /* Checkstop Reset Status */ - vuint32_t SWTRS:1; /* Software Watchdog Timer Reset Status (new in MPC563xM) */ - vuint32_t:7; /* */ - vuint32_t SSRS:1; /* Software System Reset Status */ - vuint32_t SERF:1; /* Software External Reset Flag */ - vuint32_t WKPCFG:1; /* Weak Pull Configuration Pin Status */ - vuint32_t:11; /* */ - vuint32_t ABR:1; /* Auto Baud Rate (new in MPC563xM) */ - vuint32_t BOOTCFG:2; /* Reset Configuration Pin Status */ - vuint32_t RGF:1; /* RESET Glitch Flag */ - } B; - } RSR; /* Reset Status Register (SIU_RSR) SIU_RSR @baseaddress + 0x10 */ - - union { - vuint32_t R; - struct { - vuint32_t SSR:1; /* Software System Reset */ - vuint32_t SER:1; /* Software External Reset */ - vuint32_t:14; /* */ - vuint32_t CRE:1; /* Checkstop Reset Enable */ - vuint32_t:15; /* */ - } B; - } SRCR; /* System Reset Control Register (SRCR) SIU_SRCR @baseaddress + 0x14 */ - - union { - vuint32_t R; - struct { - vuint32_t NMI:1; /* Non-Maskable Interrupt Flag (new in MPC563xM) */ - vuint32_t:7; /* */ - vuint32_t SWT:1; /* Software Watch Dog Timer Interrupt Flag, from platform (new in MPC563xM) */ - vuint32_t:7; /* */ - vuint32_t EIF15:1; /* External Interrupt Request Flag x */ - vuint32_t EIF14:1; /* External Interrupt Request Flag x */ - vuint32_t EIF13:1; /* External Interrupt Request Flag x */ - vuint32_t EIF12:1; /* External Interrupt Request Flag x */ - vuint32_t EIF11:1; /* External Interrupt Request Flag x */ - vuint32_t EIF10:1; /* External Interrupt Request Flag x */ - vuint32_t EIF9:1; /* External Interrupt Request Flag x */ - vuint32_t EIF8:1; /* External Interrupt Request Flag x */ - vuint32_t:3; /* (reserved in MPC563xM) */ - vuint32_t EIF4:1; /* External Interrupt Request Flag x */ - vuint32_t EIF3:1; /* External Interrupt Request Flag x */ - vuint32_t:2; /* (reserved in MPC563xM) */ - vuint32_t EIF0:1; /* External Interrupt Request Flag x */ - } B; - } EISR; /* SIU External Interrupt Status Register (EISR) SIU_EISR @baseaddress + 0x18 */ - - union { - vuint32_t R; - struct { - vuint32_t NMI_SEL:1; /* NMI Interrupt Platform Input Selection (new in MPC563xM) */ - vuint32_t:7; /* */ - vuint32_t SWT_SEL:1; - vuint32_t:7; - vuint32_t EIRE15:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE14:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE13:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE12:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE11:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE10:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE9:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE8:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE7:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE6:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE5:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE4:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE3:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE2:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE1:1; /* External DMA/Interrupt Request Enable x */ - vuint32_t EIRE0:1; /* External DMA/Interrupt Request Enable x */ - } B; - } DIRER; /* DMA/Interrupt Request Enable Register (DIRER) SIU_DIRER @baseaddress + 0x1C */ - - union { - vuint32_t R; - struct { - vuint32_t:28; /* */ - vuint32_t DIRS3:1; /* DMA/Interrupt Request Select x */ - vuint32_t:2; /* reserved in MPC563xM */ - vuint32_t DIRS0:1; /* DMA/Interrupt Request Select x */ - } B; - } DIRSR; /* DMA/Interrupt Request Select Register (DIRSR) SIU_DIRSR @baseaddress + 0x20 */ - - union { - vuint32_t R; - struct { - vuint32_t:16; /* */ - vuint32_t OVF15:1; /* Overrun Flag x */ - vuint32_t OVF14:1; /* Overrun Flag x */ - vuint32_t OVF13:1; /* Overrun Flag x */ - vuint32_t OVF12:1; /* Overrun Flag x */ - vuint32_t OVF11:1; /* Overrun Flag x */ - vuint32_t OVF10:1; /* Overrun Flag x */ - vuint32_t OVF9:1; /* Overrun Flag x */ - vuint32_t OVF8:1; /* Overrun Flag x */ - vuint32_t:3; /* reserved in MPC563xM */ - vuint32_t OVF4:1; /* Overrun Flag x */ - vuint32_t OVF3:1; /* Overrun Flag x */ - vuint32_t:2; /* reserved in MPC563xM */ - vuint32_t OVF0:1; /* Overrun Flag x */ - } B; - } OSR; /* Overrun Status Register (OSR) SIU_OSR @baseaddress + 0x24 */ - - union { - vuint32_t R; - struct { - vuint32_t:16; /* */ - vuint32_t ORE15:1; /* Overrun Request Enable x */ - vuint32_t ORE14:1; /* Overrun Request Enable x */ - vuint32_t ORE13:1; /* Overrun Request Enable x */ - vuint32_t ORE12:1; /* Overrun Request Enable x */ - vuint32_t ORE11:1; /* Overrun Request Enable x */ - vuint32_t ORE10:1; /* Overrun Request Enable x */ - vuint32_t ORE9:1; /* Overrun Request Enable x */ - vuint32_t ORE8:1; /* Overrun Request Enable x */ - vuint32_t:3; /* reserved in MPC563xM */ - vuint32_t ORE4:1; /* Overrun Request Enable x */ - vuint32_t ORE3:1; /* Overrun Request Enable x */ - vuint32_t:2; /* reserved in MPC563xM */ - vuint32_t ORE0:1; /* Overrun Request Enable x */ - } B; - } ORER; /* Overrun Request Enable Register (ORER) SIU_ORER @baseaddress + 0x28 */ - - union { - vuint32_t R; - struct { - vuint32_t NMIRE:1; /* NMI Rising-Edge Event Enable x (new in MPC563xM) */ - vuint32_t:15; /* reserved in MPC563xM */ - vuint32_t IREE15:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE14:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE13:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE12:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE11:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE10:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE9:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE8:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t:3; /* reserved in MPC563xM */ - vuint32_t IREE4:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t IREE3:1; /* IRQ Rising-Edge Event Enable x */ - vuint32_t:2; /* reserved in MPC563xM */ - vuint32_t IREE0:1; /* IRQ Rising-Edge Event Enable x */ - } B; - } IREER; /* External IRQ Rising-Edge Event Enable Register (IREER) SIU_IREER @baseaddress + 0x2C */ - - union { - vuint32_t R; - struct { - vuint32_t NMIFE:1; /* NMI Falling-Edge Event Enable x (new in MPC563xM) */ - vuint32_t Reserverd:15; /* */ - vuint32_t IFEE15:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE14:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE13:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE12:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE11:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE10:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE9:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE8:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t:3; /* reserved in MPC563xM */ - vuint32_t IFEE4:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t IFEE3:1; /* IRQ Falling-Edge Event Enable x */ - vuint32_t:2; /* reserved in MPC563xM */ - vuint32_t IFEE0:1; /* IRQ Falling-Edge Event Enable x */ - } B; - } IFEER; /* External IRQ Falling-Edge Event Enable Regi (IFEER) SIU_IFEER @baseaddress + 0x30 */ - - union { - vuint32_t R; - struct { - vuint32_t:28; /* */ - vuint32_t DFL:4; /* Digital Filter Length */ - } B; - } IDFR; /* External IRQ Digital Filter Register (IDFR) SIU_IDFR @baseaddress + 0x40 */ - - int32_t SIU_reserverd_153[3]; - - union { - vuint16_t R; - struct { - vuint16_t:2; /* */ - vuint16_t PA:4; /* */ - vuint16_t OBE:1; /* */ - vuint16_t IBE:1; /* */ - vuint16_t DSC:2; /* */ - vuint16_t ODE:1; /* */ - vuint16_t HYS:1; /* */ - vuint16_t SRC:2; /* */ - vuint16_t WPE:1; /* */ - vuint16_t WPS:1; /* */ - } B; - } PCR[512]; /* Pad Configuration Register (PCR) SIU_PCR @baseaddress + 0x600 */ - - int32_t SIU_reserverd_164[112]; - - union { - vuint8_t R; - struct { - vuint8_t:7; /* */ - vuint8_t PDO:1; /* */ - } B; - } GPDO[512]; /* GPIO Pin Data Output Register (GPDO) SIU_GDPO @baseaddress + 0x800 */ - - union { - vuint8_t R; - struct { - vuint8_t:7; /* */ - vuint8_t PDI:1; /* */ - } B; - } GPDI[256]; /* GPIO Pin Data Input Register (GDPI) SIU_GDPI @baseaddress + 0x900 */ - - union { - vuint32_t R; - struct { - vuint32_t TSEL5:2; /* eQADC Trigger 5 Input */ - vuint32_t TSEL4:2; /* eQADC Trigger 4 Input */ - vuint32_t TSEL3:2; /* eQADC Trigger 3 Input */ - vuint32_t TSEL2:2; /* eQADC Trigger 4 Input */ - vuint32_t TSEL1:2; /* eQADC Trigger 1 Input */ - vuint32_t TSEL0:2; /* eQADC Trigger 0 Input */ - vuint32_t:20; /* */ - } B; - } ETISR; /* eQADC Trigger Input Select Register (ETISR) SIU_ETISR @baseaddress + 0x904 */ - - union { - vuint32_t R; - struct { - vuint32_t ESEL15:2; /* External IRQ Input Select x */ - vuint32_t ESEL14:2; /* External IRQ Input Select x */ - vuint32_t ESEL13:2; /* External IRQ Input Select x */ - vuint32_t ESEL12:2; /* External IRQ Input Select x */ - vuint32_t ESEL11:2; /* External IRQ Input Select x */ - vuint32_t ESEL10:2; /* External IRQ Input Select x */ - vuint32_t ESEL9:2; /* External IRQ Input Select x */ - vuint32_t ESEL8:2; /* External IRQ Input Select x */ - vuint32_t ESEL7:2; /* External IRQ Input Select x */ - vuint32_t ESEL6:2; /* External IRQ Input Select x */ - vuint32_t ESEL5:2; /* External IRQ Input Select x */ - vuint32_t ESEL4:2; /* External IRQ Input Select x */ - vuint32_t ESEL3:2; /* External IRQ Input Select x */ - vuint32_t ESEL2:2; /* External IRQ Input Select x */ - vuint32_t ESEL1:2; /* External IRQ Input Select x */ - vuint32_t ESEL0:2; /* External IRQ Input Select x */ - } B; - } EIISR; /* External IRQ Input Select Register (EIISR) SIU_EIISR @baseaddress + 0x908 */ - - union { - vuint32_t R; - struct { - vuint32_t:8; /* reserved in MPC563xM */ - vuint32_t SINSELB:2; /* DSPI_B Data Input Select SIN-SELB */ - vuint32_t SSSELB:2; /* DSPI_B Slave Select Input Select SS-SELB */ - vuint32_t SCKSELB:2; /* DSPI_B Clock Input Select SCK-SELB */ - vuint32_t TRIGSELB:2; /* DSPI_B Trigger Input Select TRIG-SELB */ - vuint32_t SINSELC:2; /* DSPI_C Data Input Select SIN-SELC */ - vuint32_t SSSELC:2; /* DSPI_C Slave Select Input Select SSSELC */ - vuint32_t SCKSELC:2; /* DSPI_C Clock Input Select SCK-SELC */ - vuint32_t TRIGSELC:2; /* DSPI_C Trigger Input Select TRIG-SELC */ - vuint32_t:8; /* reserved in MPC563xM */ - } B; - } DISR; /* DSPI Input Select Register (DISR) SIU_DISR @baseaddress + 0x90c */ - - union { - vuint32_t R; - struct { - vuint32_t:2; /* */ - vuint32_t ETSEL5:5; /* eQADC queue X Enhanced Trigger Selection eTSEL5 */ - vuint32_t ETSEL4:5; /* eQADC queue X Enhanced Trigger Selection eTSEL4 */ - vuint32_t ETSEL3:5; /* eQADC queue X Enhanced Trigger Selection eTSEL3 */ - vuint32_t ETSEL2:5; /* eQADC queue X Enhanced Trigger Selection eTSEL2 */ - vuint32_t ETSEL1:5; /* eQADC queue X Enhanced Trigger Selection eTSEL1 */ - vuint32_t ETSEL0:5; /* eQADC queue X Enhanced Trigger Selection eTSEL0 */ - } B; - } ISEL3; /* MUX Select Register 3 (ISEL3) (new in MPC563xM) SIU_ISEL3 @baseaddress + 0x920 */ - - int32_t SIU_reserverd_214[4]; - - union { - vuint32_t R; - struct { - vuint32_t:11; /* */ - vuint32_t ESEL5:1; /* eSEL5 */ - vuint32_t:3; /* */ - vuint32_t ESEL4:1; /* eSEL4 */ - vuint32_t:3; /* */ - vuint32_t ESEL3:1; /* eSEL3 */ - vuint32_t:3; /* */ - vuint32_t ESEL2:1; /* eSEL2 */ - vuint32_t:3; /* */ - vuint32_t ESEL1:1; /* eSEL1 */ - vuint32_t:3; /* */ - vuint32_t ESEL0:1; /* eSEL0 */ - } B; - } ISEL8; /* MUX Select Register 8 (ISEL8) (new in MPC563xM) SIU_ISEL8 @baseaddress + 0x924 */ - - union { - vuint32_t R; - struct { - vuint32_t:27; /* */ - vuint32_t ETSEL0A:5; /* eTSEL0A */ - } B; - } ISEL9; /* MUX Select Register 9(ISEL9) SIU_ISEL9 @baseaddress + 0x980 */ - - int32_t SIU_reserverd_230[22]; - - union { - vuint32_t R; - struct { - vuint32_t:14; /* */ - vuint32_t MATCH:1; /* Compare Register Match */ - vuint32_t DISNEX:1; /* Disable Nexus */ - vuint32_t:14; /* */ - vuint32_t CRSE:1; /* Calibration Reflection Suppression Enable (new in MPC563xM) */ - vuint32_t:1; /* */ - } B; - } CCR; /* Chip Configuration Register (CCR) SIU_CCR @baseaddress + 0x984 */ - - union { - vuint32_t R; - struct { - vuint32_t:28; /* The ENGDIV bit is reserved in MPC563xM */ - vuint32_t EBTS:1; /* External Bus Tap Select */ - vuint32_t:1; /* */ - vuint32_t EBDF:2; /* External Bus Division Factor */ - } B; - } ECCR; /* External Clock Control Register (ECCR) SIU_ECCR @baseaddress + 0x988 */ - - union { - vuint32_t R; - } CARH; /* Compare A High Register (CARH) SIU_CMPAH @baseaddress + 0x98C */ - - union { - vuint32_t R; - } CARL; /* Compare A Low Register (CARL) SIU_CMPAL @baseaddress + 0x990 */ - - union { - vuint32_t R; - } CBRH; /* Compare B High Register (CBRH) SIU_CMPBH @baseaddress + 0x994 */ - - union { - vuint32_t R; - } CBRL; /* Compare B Low Register (CBRL) SIU_CMPBL @baseaddress + 0x9A0 */ - - int32_t SIU_reserverd_250[2]; - - union { - vuint32_t R; - struct { - vuint32_t:27; /* Reserved */ - vuint32_t BYPASS:1; /* Bypass bit BY-PASS */ - vuint32_t SYSCLKDIV:2; /* System Clock Divide SYS-CLKDIV */ - vuint32_t:2; /* Reserved */ - } B; - } SYSDIV; /* System Clock Register (SYSDIV) (new in MPC563xM) SIU_SYSDIV @baseaddress + 0x9A4 */ - - union { - vuint32_t R; - struct { - vuint32_t CPUSTP:1; /* CPU stop request. When asserted, a stop request is sent to the following modules: */ - vuint32_t:2; /* Reserved */ - vuint32_t SWTSTP:1; /* SWT stop request. When asserted, a stop request is sent to the Software Watchdog */ - vuint32_t:1; /* Reserved */ - vuint32_t TPUSTP:1; /* eTPU stop request. When asserted, a stop request is sent to the eTPU module. */ - vuint32_t NPCSTP:1; /* Nexus stop request. When asserted, a stop request is sent to the Nexus Controller. */ - vuint32_t EBISTP:1; /* EBI stop request. When asserted, a stop request is sent to the external bus */ - vuint32_t ADCSTP:1; /* eQADC stop request. When asserted, a stop request is sent to the eQADC module. */ - vuint32_t:1; /* Reserved */ - vuint32_t MIOSSTP:1; /* Stop mode request */ - vuint32_t DFILSTP:1; /* Decimation filter stop request. When asserted, a stop request is sent to the */ - vuint32_t:1; /* Reserved */ - vuint32_t PITSTP:1; /* PIT stop request. When asserted, a stop request is sent to the periodical internal */ - vuint32_t:3; /* Reserved */ - vuint32_t CNCSTP:1; /* FlexCAN C stop request. When asserted, a stop request is sent to the FlexCAN C */ - vuint32_t:1; /* Reserved */ - vuint32_t CNASTP:1; /* FlexCAN A stop request. When asserted, a stop request is sent to the FlexCAN A */ - vuint32_t:1; /* Reserved */ - vuint32_t SPICSTP:1; /* DSPI C stop request. When asserted, a stop request is sent to the DSPI C. */ - vuint32_t SPIBSTP:1; /* DSPI B stop request. When asserted, a stop request is sent to the DSPI B. */ - vuint32_t:7; /* Reserved */ - vuint32_t SCIBSTP:1; /* eSCI B stop request. When asserted, a stop request is sent to the eSCI B module. */ - vuint32_t SCIASTP:1; /* eSCI A stop request. When asserted, a stop request is sent to the eSCIA module. */ - } B; - } HLT; /* Halt Register (HLT) (new in MPC563xM) SIU_HLT @baseaddress + 0x9A8 */ - - union { - vuint32_t R; - struct { - vuint32_t CPUACK:1; /* CPU stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t:2; /* Reserved */ - vuint32_t SWTACK:1; /* SWT stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t:1; /* Reserved */ - vuint32_t TPUACK:1; /* eTPU stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t NPCACK:1; /* Nexus stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t EBIACK:1; /* EBI stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t ADCACK:1; /* eQADC stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t:1; /* Reserved */ - vuint32_t MIOSACK:1; /* eMIOS stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t DFILACK:1; /* Decimation filter stop acknowledge. When asserted, indicates that a stop */ - vuint32_t:1; /* Reserved */ - vuint32_t PITACK:1; /* PIT stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t:3; /* Reserved */ - vuint32_t CNCACK:1; /* FlexCAN C stop acknowledge. When asserted, indicates that a stop acknowledge */ - vuint32_t:1; /* Reserved */ - vuint32_t CNAACK:1; /* FlexCAN A stop acknowledge. When asserted, indicates that a stop acknowledge */ - vuint32_t:1; /* Reserved */ - vuint32_t SPICACK:1; /* DSPI C stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t SPIBACK:1; /* DSPI B stop acknowledge. When asserted, indicates that a stop acknowledge was */ - vuint32_t:7; /* Reserved */ - vuint32_t SCIBACK:1; /* eSCI B stop acknowledge */ - vuint32_t SCIAACK:1; /* eSCI A stop acknowledge. */ - } B; - } HLTACK; /* Halt Acknowledge Register (HLTACK) (new in MPC563xM) SIU_HLTACK @baseaddress + 0x9ac */ - - int32_t SIU_reserved3[21]; - - }; /* end of SIU_tag */ -/****************************************************************************/ -/* MODULE : EMIOS */ -/****************************************************************************/ - struct EMIOS_tag { - union { - vuint32_t R; - struct { - vuint32_t DOZEEN:1; /* new in MPC563xM */ - vuint32_t MDIS:1; - vuint32_t FRZ:1; - vuint32_t GTBE:1; - vuint32_t ETB:1; - vuint32_t GPREN:1; - vuint32_t:6; - vuint32_t SRV:4; - vuint32_t GPRE:8; - vuint32_t:8; - } B; - } MCR; /* Module Configuration Register EMIOSMCR */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t F23:1; - vuint32_t F22:1; - vuint32_t F21:1; - vuint32_t F20:1; - vuint32_t F19:1; - vuint32_t F18:1; - vuint32_t F17:1; - vuint32_t F16:1; - vuint32_t F15:1; - vuint32_t F14:1; - vuint32_t F13:1; - vuint32_t F12:1; - vuint32_t F11:1; - vuint32_t F10:1; - vuint32_t F9:1; - vuint32_t F8:1; - vuint32_t F7:1; - vuint32_t F6:1; - vuint32_t F5:1; - vuint32_t F4:1; - vuint32_t F3:1; - vuint32_t F2:1; - vuint32_t F1:1; - vuint32_t F0:1; - } B; - } GFR; /* Global FLAG Register EMIOSGFLAG */ - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t OU23:1; - vuint32_t OU22:1; - vuint32_t OU21:1; - vuint32_t OU20:1; - vuint32_t OU19:1; - vuint32_t OU18:1; - vuint32_t OU17:1; - vuint32_t OU16:1; - vuint32_t OU15:1; - vuint32_t OU14:1; - vuint32_t OU13:1; - vuint32_t OU12:1; - vuint32_t OU11:1; - vuint32_t OU10:1; - vuint32_t OU9:1; - vuint32_t OU8:1; - vuint32_t OU7:1; - vuint32_t OU6:1; - vuint32_t OU5:1; - vuint32_t OU4:1; - vuint32_t OU3:1; - vuint32_t OU2:1; - vuint32_t OU1:1; - vuint32_t OU0:1; - } B; - } OUDR; /* Output Update Disable Register EMIOSOUDIS */ - - union { - vuint32_t R; - struct { - vuint32_t:8; /* */ - vuint32_t CHDIS23:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS22:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS21:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS20:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS19:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS18:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS17:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS16:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS15:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS14:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS13:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS12:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS11:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS10:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS9:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS8:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS7:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS6:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS5:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS4:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS3:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS2:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS1:1; /* Enable Channel [n] bit */ - vuint32_t CHDIS0:1; /* Enable Channel [n] bit */ - } B; - } UCDIS; /* Disable Channel (EMIOSUCDIS) EMIOSUCDIS (new in MPC563xM) @baseaddress + 0x0C */ - - int32_t EMIOS_reserverd_30[4]; - - struct { - union { - vuint32_t R; /* Channel A Data Register */ - } CADR; /* EMIOSA */ - - union { - vuint32_t R; /* Channel B Data Register */ - } CBDR; /* EMIOSB */ - - union { - vuint32_t R; /* Channel Counter Register */ - } CCNTR; /* EMIOSCNT */ - - union { - vuint32_t R; - struct { - vuint32_t FREN:1; - vuint32_t ODIS:1; - vuint32_t ODISSL:2; - vuint32_t UCPRE:2; - vuint32_t UCPREN:1; - vuint32_t DMA:1; - vuint32_t:1; - vuint32_t IF:4; - vuint32_t FCK:1; - vuint32_t FEN:1; - vuint32_t:3; - vuint32_t FORCMA:1; - vuint32_t FORCMB:1; - vuint32_t:1; - vuint32_t BSL:2; - vuint32_t EDSEL:1; - vuint32_t EDPOL:1; - vuint32_t MODE:7; - } B; - } CCR; /* Channel Control Register EMIOSC */ - - union { - vuint32_t R; - struct { - vuint32_t OVR:1; - vuint32_t:15; - vuint32_t OVFL:1; - vuint32_t:12; - vuint32_t UCIN:1; - vuint32_t UCOUT:1; - vuint32_t FLAG:1; - } B; - } CSR; /* Channel Status Register EMIOSS */ - - union { - vuint32_t R; /* Alternate Channel A Data Register */ - } ALTA; /* new in MPC563xM EMIOSALTA */ - - uint32_t emios_channel_reserved[2]; - - } CH[24]; - - }; /* end of EMIOS_tag */ -/****************************************************************************/ -/* MODULE : ETPU */ -/****************************************************************************/ - struct ETPU_tag { /* offset 0x0000 */ - union { /* eTPU module configuration register@baseaddress + 0x00 */ - vuint32_t R; - struct { - vuint32_t GEC:1; /* Global Exception Clear */ - vuint32_t SDMERR:1; /* */ - vuint32_t WDTOA:1; /* */ - vuint32_t WDTOB:1; /* */ - vuint32_t MGE1:1; /* MGEA */ - vuint32_t MGE2:1; /* MGEB */ - vuint32_t ILF1:1; /* Invalid instruction flag eTPU A. ILFFA */ - vuint32_t ILF2:1; /* Invalid instruction flag eTPU B. ILFFB */ - vuint32_t SCMERR:1; /* . */ - vuint32_t:2; /* */ - vuint32_t SCMSIZE:5; /* Shared Code Memory size */ - vuint32_t:4; /* */ - vuint32_t SCMMISC:1; /* SCM MISC Flag */ - vuint32_t SCMMISF:1; /* SCM MISC Flag */ - vuint32_t SCMMISEN:1; /* SCM MISC Enable */ - vuint32_t:2; /* */ - vuint32_t VIS:1; /* SCM Visability */ - vuint32_t:5; /* */ - vuint32_t GTBE:1; /* Global Time Base Enable */ - } B; - } MCR; /* ETPU_MCR */ - - /* offset 0x0004 */ - union { /* eTPU coherent dual-parameter controller register@baseaddress + 0x04 */ - vuint32_t R; - struct { - vuint32_t STS:1; /* Start Status bit */ - vuint32_t CTBASE:5; /* Channel Transfer Base */ - vuint32_t PBASE:10; /* Parameter Buffer Base Address PBBASE */ - vuint32_t PWIDTH:1; /* Parameter Width */ - vuint32_t PARAM0:7; /* Channel Parameter 0 PARM0 */ - vuint32_t WR:1; /* */ - vuint32_t PARAM1:7; /* Channel Parameter 1 PARM1 */ - } B; - } CDCR; /*ETPU_CDCR */ - - vuint32_t ETPU_reserved_0; - - /* offset 0x000C */ - union { /* eTPU MISC Compare Register@baseaddress + 0x0c */ - vuint32_t R; - struct { - vuint32_t ETPUMISCCMP:32; /* Expected multiple input signature calculator compare register value. EMISCCMP */ - } B; - } MISCCMPR /*ETPU_MISCCMPR */ ; - - /* offset 0x0010 */ - union { /* eTPU SCM Off-Range Data Register@baseaddress + 0x10 */ - vuint32_t R; - struct { - vuint32_t ETPUSCMOFFDATA:32; /* SCM Off-range read data value. */ - } B; - } SCMOFFDATAR; /*ETPU_SCMOFFDATAR */ - - /* offset 0x0014 */ - union { /* eTPU Engine Configuration Register (ETPUA_ECR)@baseaddress + 0x14 */ - vuint32_t R; - struct { - vuint32_t FEND:1; /* Force END */ - vuint32_t MDIS:1; /* Low power Stop */ - vuint32_t:1; /* */ - vuint32_t STF:1; /* Stop Flag */ - vuint32_t:4; /* */ - vuint32_t HLTF:1; /* Halt Mode Flag */ - vuint32_t:3; /* */ - vuint32_t FCSS:1; - vuint32_t FPSCK:3; /* Filter Prescaler Clock Control */ - vuint32_t CDFC:2; /* */ - vuint32_t:1; /* */ - vuint32_t ERBA:5; /* */ - vuint32_t SPPDIS:1; /* */ - vuint32_t:2; /* */ - vuint32_t ETB:5; /* Entry Table Base */ - } B; - } ECR_A; /*ETPU_ECR */ - - vuint32_t ETPU_reserved_1[2]; - - /* offset 0x0020 */ - union { /* eTPU Time Base Configuration Register (ETPU_TBCR)@baseaddress + 0x20 */ - vuint32_t R; - struct { - vuint32_t TCR2CTL:3; /* TCR2 Clock/Gate Control */ - vuint32_t TCRCF:2; /* TCRCLK Signal Filter Control */ - vuint32_t AM:2; /* Angle Mode */ - vuint32_t:3; /* */ - vuint32_t TCR2P:6; /* TCR2 Prescaler Control */ - vuint32_t TCR1CTL:2; /* TCR1 Clock/Gate Control */ - vuint32_t TCR1CS:1; /* */ - vuint32_t:5; /* */ - vuint32_t TCR1P:8; /* TCR1 Prescaler Control */ - } B; - } TBCR_A; /*ETPU_TBCR */ - - /* offset 0x0024 */ - union { /* eTPU Time Base 1 (TCR1) Visibility Register (ETPU_TB1R)@baseaddress + 0x24 */ - vuint32_t R; - struct { - vuint32_t:8; /* */ - vuint32_t TCR1:24; /* TCR1 value. Used on matches and captures. For more information, see the eTPU reference manual. */ - } B; - } TB1R_A; /*ETPU_TB1R */ - - /* offset 0x0028 */ - union { /* eTPU Time Base 2 (TCR2) Visibility Register (ETPU_TB2R)@baseaddress + 0x28 */ - vuint32_t R; - struct { - vuint32_t:8; /* */ - vuint32_t TCR2:24; /* TCR2 value. Used on matches and captures. For information on TCR2, see the eTPU reference manual. */ - } B; - } TB2R_A; /*ETPU_TB2R */ - - /* offset 0x002C */ - union { /* STAC Bus Configuration Register (ETPU_STACCR)@baseaddress + 0x2c */ - vuint32_t R; - struct { - vuint32_t REN1:1; /* Resource Enable TCR1 */ - vuint32_t RSC1:1; /* Resource Control TCR1 */ - vuint32_t:2; /* */ - vuint32_t SERVER_ID1:4; /* */ - vuint32_t:4; /* */ - vuint32_t SRV1:4; /* Resource Server Slot */ - vuint32_t REN2:1; /* Resource Enable TCR2 */ - vuint32_t RSC2:1; /* Resource Control TCR2 */ - vuint32_t:2; /* */ - vuint32_t SERVER_ID2:4; /* */ - vuint32_t:4; /* */ - vuint32_t SRV2:4; /* Resource Server Slot */ - } B; - } REDCR_A; /*ETPU_REDCR */ - - vuint32_t ETPU_reserved_2[12]; - - /* offset 0x0060 */ - union { /* ETPU1 WDTR Register */ - vuint32_t R; - struct { - vuint32_t WDM:2; - vuint32_t:14; - vuint32_t WDCNT:16; - } B; - } WDTR_A; - - vuint32_t ETPU1_reserved_3; - - /* offset 0x0068 */ - union { /* ETPU1 IDLE Register */ - vuint32_t R; - struct { - vuint32_t IDLE_CNT:31; - vuint32_t ICLR:1; - } B; - } IDLE_A; - - vuint32_t ETPU_reserved_4[101]; - - /* offset 0x0200 */ - union { /* eTPU Channel Interrupt Status Register (ETPU_CISR)@baseaddress + 0x200 */ - vuint32_t R; - struct { - vuint32_t CIS31:1; /* Channel 31 Interrut Status */ - vuint32_t CIS30:1; /* Channel 30 Interrut Status */ - vuint32_t CIS29:1; /* Channel 29 Interrut Status */ - vuint32_t CIS28:1; /* Channel 28 Interrut Status */ - vuint32_t CIS27:1; /* Channel 27 Interrut Status */ - vuint32_t CIS26:1; /* Channel 26 Interrut Status */ - vuint32_t CIS25:1; /* Channel 25 Interrut Status */ - vuint32_t CIS24:1; /* Channel 24 Interrut Status */ - vuint32_t CIS23:1; /* Channel 23 Interrut Status */ - vuint32_t CIS22:1; /* Channel 22 Interrut Status */ - vuint32_t CIS21:1; /* Channel 21 Interrut Status */ - vuint32_t CIS20:1; /* Channel 20 Interrut Status */ - vuint32_t CIS19:1; /* Channel 19 Interrut Status */ - vuint32_t CIS18:1; /* Channel 18 Interrut Status */ - vuint32_t CIS17:1; /* Channel 17 Interrut Status */ - vuint32_t CIS16:1; /* Channel 16 Interrut Status */ - vuint32_t CIS15:1; /* Channel 15 Interrut Status */ - vuint32_t CIS14:1; /* Channel 14 Interrut Status */ - vuint32_t CIS13:1; /* Channel 13 Interrut Status */ - vuint32_t CIS12:1; /* Channel 12 Interrut Status */ - vuint32_t CIS11:1; /* Channel 11 Interrut Status */ - vuint32_t CIS10:1; /* Channel 10 Interrut Status */ - vuint32_t CIS9:1; /* Channel 9 Interrut Status */ - vuint32_t CIS8:1; /* Channel 8 Interrut Status */ - vuint32_t CIS7:1; /* Channel 7 Interrut Status */ - vuint32_t CIS6:1; /* Channel 6 Interrut Status */ - vuint32_t CIS5:1; /* Channel 5 Interrut Status */ - vuint32_t CIS4:1; /* Channel 4 Interrut Status */ - vuint32_t CIS3:1; /* Channel 3 Interrut Status */ - vuint32_t CIS2:1; /* Channel 2 Interrut Status */ - vuint32_t CIS1:1; /* Channel 1 Interrut Status */ - vuint32_t CIS0:1; /* Channel 0 Interrut Status */ - } B; - } CISR_A; /* ETPU_CISR */ - - int32_t ETPU_reserved_5[3]; - - /* offset 0x0210 */ - union { /* @baseaddress + 0x210 */ - vuint32_t R; - struct { - vuint32_t DTRS31:1; /* Channel 31 Data Transfer Request Status */ - vuint32_t DTRS30:1; /* Channel 30 Data Transfer Request Status */ - vuint32_t DTRS29:1; /* Channel 29 Data Transfer Request Status */ - vuint32_t DTRS28:1; /* Channel 28 Data Transfer Request Status */ - vuint32_t DTRS27:1; /* Channel 27 Data Transfer Request Status */ - vuint32_t DTRS26:1; /* Channel 26 Data Transfer Request Status */ - vuint32_t DTRS25:1; /* Channel 25 Data Transfer Request Status */ - vuint32_t DTRS24:1; /* Channel 24 Data Transfer Request Status */ - vuint32_t DTRS23:1; /* Channel 23 Data Transfer Request Status */ - vuint32_t DTRS22:1; /* Channel 22 Data Transfer Request Status */ - vuint32_t DTRS21:1; /* Channel 21 Data Transfer Request Status */ - vuint32_t DTRS20:1; /* Channel 20 Data Transfer Request Status */ - vuint32_t DTRS19:1; /* Channel 19 Data Transfer Request Status */ - vuint32_t DTRS18:1; /* Channel 18 Data Transfer Request Status */ - vuint32_t DTRS17:1; /* Channel 17 Data Transfer Request Status */ - vuint32_t DTRS16:1; /* Channel 16 Data Transfer Request Status */ - vuint32_t DTRS15:1; /* Channel 15 Data Transfer Request Status */ - vuint32_t DTRS14:1; /* Channel 14 Data Transfer Request Status */ - vuint32_t DTRS13:1; /* Channel 13 Data Transfer Request Status */ - vuint32_t DTRS12:1; /* Channel 12 Data Transfer Request Status */ - vuint32_t DTRS11:1; /* Channel 11 Data Transfer Request Status */ - vuint32_t DTRS10:1; /* Channel 10 Data Transfer Request Status */ - vuint32_t DTRS9:1; /* Channel 9 Data Transfer Request Status */ - vuint32_t DTRS8:1; /* Channel 8 Data Transfer Request Status */ - vuint32_t DTRS7:1; /* Channel 7 Data Transfer Request Status */ - vuint32_t DTRS6:1; /* Channel 6 Data Transfer Request Status */ - vuint32_t DTRS5:1; /* Channel 5 Data Transfer Request Status */ - vuint32_t DTRS4:1; /* Channel 4 Data Transfer Request Status */ - vuint32_t DTRS3:1; /* Channel 3 Data Transfer Request Status */ - vuint32_t DTRS2:1; /* Channel 2 Data Transfer Request Status */ - vuint32_t DTRS1:1; /* Channel 1 Data Transfer Request Status */ - vuint32_t DTRS0:1; /* Channel 0 Data Transfer Request Status */ - } B; - } CDTRSR_A; /* ETPU_CDTRSR */ - - int32_t ETPU_reserved_6[3]; - - /* offset 0x0220 */ - union { /* eTPU Channel Interrupt Overflow Status Register (ETPU_CIOSR)@baseaddress + 0x220 */ - vuint32_t R; - struct { - vuint32_t CIOS31:1; /* Channel 31 Interruput Overflow Status */ - vuint32_t CIOS30:1; /* Channel 30 Interruput Overflow Status */ - vuint32_t CIOS29:1; /* Channel 29 Interruput Overflow Status */ - vuint32_t CIOS28:1; /* Channel 28 Interruput Overflow Status */ - vuint32_t CIOS27:1; /* Channel 27 Interruput Overflow Status */ - vuint32_t CIOS26:1; /* Channel 26 Interruput Overflow Status */ - vuint32_t CIOS25:1; /* Channel 25 Interruput Overflow Status */ - vuint32_t CIOS24:1; /* Channel 24 Interruput Overflow Status */ - vuint32_t CIOS23:1; /* Channel 23 Interruput Overflow Status */ - vuint32_t CIOS22:1; /* Channel 22 Interruput Overflow Status */ - vuint32_t CIOS21:1; /* Channel 21 Interruput Overflow Status */ - vuint32_t CIOS20:1; /* Channel 20 Interruput Overflow Status */ - vuint32_t CIOS19:1; /* Channel 19 Interruput Overflow Status */ - vuint32_t CIOS18:1; /* Channel 18 Interruput Overflow Status */ - vuint32_t CIOS17:1; /* Channel 17 Interruput Overflow Status */ - vuint32_t CIOS16:1; /* Channel 16 Interruput Overflow Status */ - vuint32_t CIOS15:1; /* Channel 15 Interruput Overflow Status */ - vuint32_t CIOS14:1; /* Channel 14 Interruput Overflow Status */ - vuint32_t CIOS13:1; /* Channel 13 Interruput Overflow Status */ - vuint32_t CIOS12:1; /* Channel 12 Interruput Overflow Status */ - vuint32_t CIOS11:1; /* Channel 11 Interruput Overflow Status */ - vuint32_t CIOS10:1; /* Channel 10 Interruput Overflow Status */ - vuint32_t CIOS9:1; /* Channel 9 Interruput Overflow Status */ - vuint32_t CIOS8:1; /* Channel 8 Interruput Overflow Status */ - vuint32_t CIOS7:1; /* Channel 7 Interruput Overflow Status */ - vuint32_t CIOS6:1; /* Channel 6 Interruput Overflow Status */ - vuint32_t CIOS5:1; /* Channel 5 Interruput Overflow Status */ - vuint32_t CIOS4:1; /* Channel 4 Interruput Overflow Status */ - vuint32_t CIOS3:1; /* Channel 3 Interruput Overflow Status */ - vuint32_t CIOS2:1; /* Channel 2 Interruput Overflow Status */ - vuint32_t CIOS1:1; /* Channel 1 Interruput Overflow Status */ - vuint32_t CIOS0:1; /* Channel 0 Interruput Overflow Status */ - } B; - } CIOSR_A; /* ETPU_CIOSR */ - - int32_t ETPU_reserved_7[3]; - - /* offset 0x0230 */ - union { /* eTPU Channel Data Transfer Request Overflow Status Register@baseaddress + 0x230 */ - vuint32_t R; - struct { - vuint32_t DTROS31:1; /* Channel 31 Data Transfer Overflow Status */ - vuint32_t DTROS30:1; /* Channel 30 Data Transfer Overflow Status */ - vuint32_t DTROS29:1; /* Channel 29 Data Transfer Overflow Status */ - vuint32_t DTROS28:1; /* Channel 28 Data Transfer Overflow Status */ - vuint32_t DTROS27:1; /* Channel 27 Data Transfer Overflow Status */ - vuint32_t DTROS26:1; /* Channel 26 Data Transfer Overflow Status */ - vuint32_t DTROS25:1; /* Channel 25 Data Transfer Overflow Status */ - vuint32_t DTROS24:1; /* Channel 24 Data Transfer Overflow Status */ - vuint32_t DTROS23:1; /* Channel 23 Data Transfer Overflow Status */ - vuint32_t DTROS22:1; /* Channel 22 Data Transfer Overflow Status */ - vuint32_t DTROS21:1; /* Channel 21 Data Transfer Overflow Status */ - vuint32_t DTROS20:1; /* Channel 20 Data Transfer Overflow Status */ - vuint32_t DTROS19:1; /* Channel 19 Data Transfer Overflow Status */ - vuint32_t DTROS18:1; /* Channel 18 Data Transfer Overflow Status */ - vuint32_t DTROS17:1; /* Channel 17 Data Transfer Overflow Status */ - vuint32_t DTROS16:1; /* Channel 16 Data Transfer Overflow Status */ - vuint32_t DTROS15:1; /* Channel 15 Data Transfer Overflow Status */ - vuint32_t DTROS14:1; /* Channel 14 Data Transfer Overflow Status */ - vuint32_t DTROS13:1; /* Channel 13 Data Transfer Overflow Status */ - vuint32_t DTROS12:1; /* Channel 12 Data Transfer Overflow Status */ - vuint32_t DTROS11:1; /* Channel 11 Data Transfer Overflow Status */ - vuint32_t DTROS10:1; /* Channel 10 Data Transfer Overflow Status */ - vuint32_t DTROS9:1; /* Channel 9 Data Transfer Overflow Status */ - vuint32_t DTROS8:1; /* Channel 8 Data Transfer Overflow Status */ - vuint32_t DTROS7:1; /* Channel 7 Data Transfer Overflow Status */ - vuint32_t DTROS6:1; /* Channel 6 Data Transfer Overflow Status */ - vuint32_t DTROS5:1; /* Channel 5 Data Transfer Overflow Status */ - vuint32_t DTROS4:1; /* Channel 4 Data Transfer Overflow Status */ - vuint32_t DTROS3:1; /* Channel 3 Data Transfer Overflow Status */ - vuint32_t DTROS2:1; /* Channel 2 Data Transfer Overflow Status */ - vuint32_t DTROS1:1; /* Channel 1 Data Transfer Overflow Status */ - vuint32_t DTROS0:1; /* Channel 0 Data Transfer Overflow Status */ - } B; - } CDTROSR_A; /* ETPU_CDTROSR */ - - int32_t ETPU_reserved_8[3]; - - /* offset 0x0240 */ - union { /* eTPU Channel Interrupt Enable Register (ETPU_CIER)@baseaddress + 0x240 */ - vuint32_t R; - struct { - vuint32_t CIE31:1; /* Channel 31 Interruput Enable */ - vuint32_t CIE30:1; /* Channel 30 Interruput Enable */ - vuint32_t CIE29:1; /* Channel 29 Interruput Enable */ - vuint32_t CIE28:1; /* Channel 28 Interruput Enable */ - vuint32_t CIE27:1; /* Channel 27 Interruput Enable */ - vuint32_t CIE26:1; /* Channel 26 Interruput Enable */ - vuint32_t CIE25:1; /* Channel 25 Interruput Enable */ - vuint32_t CIE24:1; /* Channel 24 Interruput Enable */ - vuint32_t CIE23:1; /* Channel 23 Interruput Enable */ - vuint32_t CIE22:1; /* Channel 22 Interruput Enable */ - vuint32_t CIE21:1; /* Channel 21 Interruput Enable */ - vuint32_t CIE20:1; /* Channel 20 Interruput Enable */ - vuint32_t CIE19:1; /* Channel 19 Interruput Enable */ - vuint32_t CIE18:1; /* Channel 18 Interruput Enable */ - vuint32_t CIE17:1; /* Channel 17 Interruput Enable */ - vuint32_t CIE16:1; /* Channel 16 Interruput Enable */ - vuint32_t CIE15:1; /* Channel 15 Interruput Enable */ - vuint32_t CIE14:1; /* Channel 14 Interruput Enable */ - vuint32_t CIE13:1; /* Channel 13 Interruput Enable */ - vuint32_t CIE12:1; /* Channel 12 Interruput Enable */ - vuint32_t CIE11:1; /* Channel 11 Interruput Enable */ - vuint32_t CIE10:1; /* Channel 10 Interruput Enable */ - vuint32_t CIE9:1; /* Channel 9 Interruput Enable */ - vuint32_t CIE8:1; /* Channel 8 Interruput Enable */ - vuint32_t CIE7:1; /* Channel 7 Interruput Enable */ - vuint32_t CIE6:1; /* Channel 6 Interruput Enable */ - vuint32_t CIE5:1; /* Channel 5 Interruput Enable */ - vuint32_t CIE4:1; /* Channel 4 Interruput Enable */ - vuint32_t CIE3:1; /* Channel 3 Interruput Enable */ - vuint32_t CIE2:1; /* Channel 2 Interruput Enable */ - vuint32_t CIE1:1; /* Channel 1 Interruput Enable */ - vuint32_t CIE0:1; /* Channel 0 Interruput Enable */ - } B; - } CIER_A; /* ETPU_CIER */ - - int32_t ETPU_reserved_9[3]; - - /* offset 0x0250 */ - union { /* eTPU Channel Data Transfer Request Enable Register (ETPU_CDTRER)@baseaddress + 0x250 */ - vuint32_t R; - struct { - vuint32_t DTRE31:1; /* Channel 31 Data Transfer Request Enable */ - vuint32_t DTRE30:1; /* Channel 30 Data Transfer Request Enable */ - vuint32_t DTRE29:1; /* Channel 29 Data Transfer Request Enable */ - vuint32_t DTRE28:1; /* Channel 28 Data Transfer Request Enable */ - vuint32_t DTRE27:1; /* Channel 27 Data Transfer Request Enable */ - vuint32_t DTRE26:1; /* Channel 26 Data Transfer Request Enable */ - vuint32_t DTRE25:1; /* Channel 25 Data Transfer Request Enable */ - vuint32_t DTRE24:1; /* Channel 24 Data Transfer Request Enable */ - vuint32_t DTRE23:1; /* Channel 23 Data Transfer Request Enable */ - vuint32_t DTRE22:1; /* Channel 22 Data Transfer Request Enable */ - vuint32_t DTRE21:1; /* Channel 21 Data Transfer Request Enable */ - vuint32_t DTRE20:1; /* Channel 20 Data Transfer Request Enable */ - vuint32_t DTRE19:1; /* Channel 19 Data Transfer Request Enable */ - vuint32_t DTRE18:1; /* Channel 18 Data Transfer Request Enable */ - vuint32_t DTRE17:1; /* Channel 17 Data Transfer Request Enable */ - vuint32_t DTRE16:1; /* Channel 16 Data Transfer Request Enable */ - vuint32_t DTRE15:1; /* Channel 15 Data Transfer Request Enable */ - vuint32_t DTRE14:1; /* Channel 14 Data Transfer Request Enable */ - vuint32_t DTRE13:1; /* Channel 13 Data Transfer Request Enable */ - vuint32_t DTRE12:1; /* Channel 12 Data Transfer Request Enable */ - vuint32_t DTRE11:1; /* Channel 11 Data Transfer Request Enable */ - vuint32_t DTRE10:1; /* Channel 10 Data Transfer Request Enable */ - vuint32_t DTRE9:1; /* Channel 9 Data Transfer Request Enable */ - vuint32_t DTRE8:1; /* Channel 8 Data Transfer Request Enable */ - vuint32_t DTRE7:1; /* Channel 7 Data Transfer Request Enable */ - vuint32_t DTRE6:1; /* Channel 6 Data Transfer Request Enable */ - vuint32_t DTRE5:1; /* Channel 5 Data Transfer Request Enable */ - vuint32_t DTRE4:1; /* Channel 4 Data Transfer Request Enable */ - vuint32_t DTRE3:1; /* Channel 3 Data Transfer Request Enable */ - vuint32_t DTRE2:1; /* Channel 2 Data Transfer Request Enable */ - vuint32_t DTRE1:1; /* Channel 1 Data Transfer Request Enable */ - vuint32_t DTRE0:1; /* Channel 0 Data Transfer Request Enable */ - } B; - } CDTRER_A; /* ETPU_CDTRER */ - - int32_t ETPU_reserved_10[3]; - - /* offset 0x0260 */ - union { /* ETPUWDSR - eTPU Watchdog Status Register */ - vuint32_t R; - struct { - vuint32_t WDS31:1; /* Channel 31 Data Transfer Request Enable */ - vuint32_t WDS30:1; /* Channel 30 Data Transfer Request Enable */ - vuint32_t WDS29:1; /* Channel 29 Data Transfer Request Enable */ - vuint32_t WDS28:1; /* Channel 28 Data Transfer Request Enable */ - vuint32_t WDS27:1; /* Channel 27 Data Transfer Request Enable */ - vuint32_t WDS26:1; /* Channel 26 Data Transfer Request Enable */ - vuint32_t WDS25:1; /* Channel 25 Data Transfer Request Enable */ - vuint32_t WDS24:1; /* Channel 24 Data Transfer Request Enable */ - vuint32_t WDS23:1; /* Channel 23 Data Transfer Request Enable */ - vuint32_t WDS22:1; /* Channel 22 Data Transfer Request Enable */ - vuint32_t WDS21:1; /* Channel 21 Data Transfer Request Enable */ - vuint32_t WDS20:1; /* Channel 20 Data Transfer Request Enable */ - vuint32_t WDS19:1; /* Channel 19 Data Transfer Request Enable */ - vuint32_t WDS18:1; /* Channel 18 Data Transfer Request Enable */ - vuint32_t WDS17:1; /* Channel 17 Data Transfer Request Enable */ - vuint32_t WDS16:1; /* Channel 16 Data Transfer Request Enable */ - vuint32_t WDS15:1; /* Channel 15 Data Transfer Request Enable */ - vuint32_t WDS14:1; /* Channel 14 Data Transfer Request Enable */ - vuint32_t WDS13:1; /* Channel 13 Data Transfer Request Enable */ - vuint32_t WDS12:1; /* Channel 12 Data Transfer Request Enable */ - vuint32_t WDS11:1; /* Channel 11 Data Transfer Request Enable */ - vuint32_t WDS10:1; /* Channel 10 Data Transfer Request Enable */ - vuint32_t WDS9:1; /* Channel 9 Data Transfer Request Enable */ - vuint32_t WDS8:1; /* Channel 8 Data Transfer Request Enable */ - vuint32_t WDS7:1; /* Channel 7 Data Transfer Request Enable */ - vuint32_t WDS6:1; /* Channel 6 Data Transfer Request Enable */ - vuint32_t WDS5:1; /* Channel 5 Data Transfer Request Enable */ - vuint32_t WDS4:1; /* Channel 4 Data Transfer Request Enable */ - vuint32_t WDS3:1; /* Channel 3 Data Transfer Request Enable */ - vuint32_t WDS2:1; /* Channel 2 Data Transfer Request Enable */ - vuint32_t WDS1:1; /* Channel 1 Data Transfer Request Enable */ - vuint32_t WDS0:1; /* Channel 0 Data Transfer Request Enable */ - } B; - } WDSR_A; - - int32_t ETPU_reserved_11[7]; - - /* offset 0x0280 */ - union { /* ETPUCPSSR - eTPU Channel Pending Service Status Register */ - vuint32_t R; - struct { - vuint32_t SR31:1; /* Channel 31 Data Transfer Request Enable */ - vuint32_t SR30:1; /* Channel 30 Data Transfer Request Enable */ - vuint32_t SR29:1; /* Channel 29 Data Transfer Request Enable */ - vuint32_t SR28:1; /* Channel 28 Data Transfer Request Enable */ - vuint32_t SR27:1; /* Channel 27 Data Transfer Request Enable */ - vuint32_t SR26:1; /* Channel 26 Data Transfer Request Enable */ - vuint32_t SR25:1; /* Channel 25 Data Transfer Request Enable */ - vuint32_t SR24:1; /* Channel 24 Data Transfer Request Enable */ - vuint32_t SR23:1; /* Channel 23 Data Transfer Request Enable */ - vuint32_t SR22:1; /* Channel 22 Data Transfer Request Enable */ - vuint32_t SR21:1; /* Channel 21 Data Transfer Request Enable */ - vuint32_t SR20:1; /* Channel 20 Data Transfer Request Enable */ - vuint32_t SR19:1; /* Channel 19 Data Transfer Request Enable */ - vuint32_t SR18:1; /* Channel 18 Data Transfer Request Enable */ - vuint32_t SR17:1; /* Channel 17 Data Transfer Request Enable */ - vuint32_t SR16:1; /* Channel 16 Data Transfer Request Enable */ - vuint32_t SR15:1; /* Channel 15 Data Transfer Request Enable */ - vuint32_t SR14:1; /* Channel 14 Data Transfer Request Enable */ - vuint32_t SR13:1; /* Channel 13 Data Transfer Request Enable */ - vuint32_t SR12:1; /* Channel 12 Data Transfer Request Enable */ - vuint32_t SR11:1; /* Channel 11 Data Transfer Request Enable */ - vuint32_t SR10:1; /* Channel 10 Data Transfer Request Enable */ - vuint32_t SR9:1; /* Channel 9 Data Transfer Request Enable */ - vuint32_t SR8:1; /* Channel 8 Data Transfer Request Enable */ - vuint32_t SR7:1; /* Channel 7 Data Transfer Request Enable */ - vuint32_t SR6:1; /* Channel 6 Data Transfer Request Enable */ - vuint32_t SR5:1; /* Channel 5 Data Transfer Request Enable */ - vuint32_t SR4:1; /* Channel 4 Data Transfer Request Enable */ - vuint32_t SR3:1; /* Channel 3 Data Transfer Request Enable */ - vuint32_t SR2:1; /* Channel 2 Data Transfer Request Enable */ - vuint32_t SR1:1; /* Channel 1 Data Transfer Request Enable */ - vuint32_t SR0:1; /* Channel 0 Data Transfer Request Enable */ - } B; - } CPSSR_A; /* ETPU_CPSSR */ - - int32_t ETPU_reserved_12[3]; - - /* offset 0x0290 */ - union { /* ETPUCSSR - eTPU Channel Service Status Register */ - vuint32_t R; - struct { - vuint32_t SS31:1; /* Channel 31 Data Transfer Request Enable */ - vuint32_t SS30:1; /* Channel 30 Data Transfer Request Enable */ - vuint32_t SS29:1; /* Channel 29 Data Transfer Request Enable */ - vuint32_t SS28:1; /* Channel 28 Data Transfer Request Enable */ - vuint32_t SS27:1; /* Channel 27 Data Transfer Request Enable */ - vuint32_t SS26:1; /* Channel 26 Data Transfer Request Enable */ - vuint32_t SS25:1; /* Channel 25 Data Transfer Request Enable */ - vuint32_t SS24:1; /* Channel 24 Data Transfer Request Enable */ - vuint32_t SS23:1; /* Channel 23 Data Transfer Request Enable */ - vuint32_t SS22:1; /* Channel 22 Data Transfer Request Enable */ - vuint32_t SS21:1; /* Channel 21 Data Transfer Request Enable */ - vuint32_t SS20:1; /* Channel 20 Data Transfer Request Enable */ - vuint32_t SS19:1; /* Channel 19 Data Transfer Request Enable */ - vuint32_t SS18:1; /* Channel 18 Data Transfer Request Enable */ - vuint32_t SS17:1; /* Channel 17 Data Transfer Request Enable */ - vuint32_t SS16:1; /* Channel 16 Data Transfer Request Enable */ - vuint32_t SS15:1; /* Channel 15 Data Transfer Request Enable */ - vuint32_t SS14:1; /* Channel 14 Data Transfer Request Enable */ - vuint32_t SS13:1; /* Channel 13 Data Transfer Request Enable */ - vuint32_t SS12:1; /* Channel 12 Data Transfer Request Enable */ - vuint32_t SS11:1; /* Channel 11 Data Transfer Request Enable */ - vuint32_t SS10:1; /* Channel 10 Data Transfer Request Enable */ - vuint32_t SS9:1; /* Channel 9 Data Transfer Request Enable */ - vuint32_t SS8:1; /* Channel 8 Data Transfer Request Enable */ - vuint32_t SS7:1; /* Channel 7 Data Transfer Request Enable */ - vuint32_t SS6:1; /* Channel 6 Data Transfer Request Enable */ - vuint32_t SS5:1; /* Channel 5 Data Transfer Request Enable */ - vuint32_t SS4:1; /* Channel 4 Data Transfer Request Enable */ - vuint32_t SS3:1; /* Channel 3 Data Transfer Request Enable */ - vuint32_t SS2:1; /* Channel 2 Data Transfer Request Enable */ - vuint32_t SS1:1; /* Channel 1 Data Transfer Request Enable */ - vuint32_t SS0:1; /* Channel 0 Data Transfer Request Enable */ - } B; - } CSSR_A; /* ETPU_CSSR */ - - int32_t ETPU_reserved_13[3]; - int32_t ETPU_reserved_14[88]; - -/***************************** Channels ********************************/ -/* Note not all devices implement all channels or even 2 engines */ -/* Each eTPU engine can implement 64 channels, however most devcies */ -/* only implemnet 32 channels. The eTPU block can implement 1 or 2 */ -/* engines per instantiation */ -/***********************************************************************/ - - struct { - union { /* eTPU Channel n Configuration Register (ETPU_CnCR)@baseaddress + 0x400 */ - vuint32_t R; - struct { - vuint32_t CIE:1; /* Channel Interruput Enable */ - vuint32_t DTRE:1; /* Data Transfer Request Enable */ - vuint32_t CPR:2; /* Channel Priority */ - vuint32_t:2; /* */ - vuint32_t ETPD:1; /* This bit selects which channel signal, input or output, is used in the entry point selection */ - vuint32_t ETCS:1; /* Entry Table Condition Select */ - vuint32_t:3; /* */ - vuint32_t CFS:5; /* Channel Function Select */ - vuint32_t ODIS:1; /* Output disable */ - vuint32_t OPOL:1; /* output polarity */ - vuint32_t:3; /* */ - vuint32_t CPBA:11; /* Channel Parameter Base Address */ - } B; - } CR; /* ETPU_CnCR */ - - union { /* eTPU Channel n Status Control Register (ETPU_CnSCR)@baseaddress + 0x404 */ - vuint32_t R; - struct { - vuint32_t CIS:1; /* Channel Interruput Status */ - vuint32_t CIOS:1; /* Channel Interruput Overflow Status */ - vuint32_t:6; /* */ - vuint32_t DTRS:1; /* Data Transfer Status */ - vuint32_t DTROS:1; /* Data Transfer Overflow Status */ - vuint32_t:6; /* */ - vuint32_t IPS:1; /* Input Pin State */ - vuint32_t OPS:1; /* Output Pin State */ - vuint32_t OBE:1; /* Output Pin State */ - vuint32_t:11; /* */ - vuint32_t FM1:1; /* Function mode */ - vuint32_t FM0:1; /* Function mode */ - } B; - } SCR; /* ETPU_CnSCR */ - - union { /* eTPU channel host service request register (ETPU_CnHSRR)@baseaddress + 0x408 */ - vuint32_t R; - struct { - vuint32_t:29; /* Host Service Request */ - vuint32_t HSR:3; /* */ - } B; - } HSRR; /* ETPU_CnHSRR */ - int32_t ETPU_reserved_18; - - } CHAN[127]; - /**** Note: Not all channels implemented on all devices. Up 64 can be implemented on */ - }; /* end of ETPU_tag */ -/****************************************************************************/ -/* MODULE : XBAR */ -/****************************************************************************/ - struct XBAR_tag { - union { - vuint32_t R; - struct { - vuint32_t:4; /* Master 7 Priority - Not implemented */ - vuint32_t:4; /* Master 6 Priority - Not implemented */ - vuint32_t:4; /* Master 5 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR4:3; /* Master 4 Priority - Core load/store & Nexus port */ - vuint32_t:4; /* Master 3 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR2:3; /* Master 2 Priority - Unused implemented master port */ - vuint32_t:1; /* */ - vuint32_t MSTR1:3; /* Master 1 Priority - eDMA */ - vuint32_t:1; /* */ - vuint32_t MSTR0:3; /* Master 0 Priority - e200z335 core Instruction */ - } B; - } MPR0; /* Master Priority Register for Slave port 0 @baseaddress + 0x00 - Flash */ - - int32_t XBAR_reserverd_35[3]; - - union { - vuint32_t R; - struct { - vuint32_t RO:1; /* Read Only */ - vuint32_t HLP:1; /* Halt Low Priority (new in MPC563xM) */ - vuint32_t:6; /* Slave General Purpose Control Register Reserved */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE4:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE2:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE1:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE0:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:6; /* */ - vuint32_t ARB:2; /* Arbitration Mode */ - vuint32_t:2; /* */ - vuint32_t PCTL:2; /* Parking Control */ - vuint32_t:1; /* */ - vuint32_t PARK:3; /* PARK */ - } B; - } SGPCR0; /* Slave General Purpose Control Register 0 @baseaddress + 0x10 */ - - int32_t XBAR_reserverd_71[59]; - - union { - vuint32_t R; - struct { - vuint32_t:4; /* Master 7 Priority - Not implemented */ - vuint32_t:4; /* Master 6 Priority - Not implemented */ - vuint32_t:4; /* Master 5 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR4:3; /* Master 4 Priority - Core load/store & Nexus port */ - vuint32_t:4; /* Master 3 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR2:3; /* Master 2 Priority - Unused implemented master port */ - vuint32_t:1; /* */ - vuint32_t MSTR1:3; /* Master 1 Priority - eDMA */ - vuint32_t:1; /* */ - vuint32_t MSTR0:3; /* Master 0 Priority - e200z335 core Instruction */ - } B; - } MPR1; /* Master Priority Register for Slave port 1 @baseaddress + 0x100 */ - - int32_t XBAR_reserverd_105[3]; - - union { - vuint32_t R; - struct { - vuint32_t RO:1; /* Read Only */ - vuint32_t HLP:1; /* Halt Low Priority (new in MPC563xM) */ - vuint32_t:6; /* Slave General Purpose Control Register Reserved */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE4:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE2:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE1:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE0:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:6; /* */ - vuint32_t ARB:2; /* Arbitration Mode */ - vuint32_t:2; /* */ - vuint32_t PCTL:2; /* Parking Control */ - vuint32_t:1; /* */ - vuint32_t PARK:3; /* PARK */ - } B; - } SGPCR1; /* Slave General Purpose Control Register 1 @baseaddress + 0x110 */ - - int32_t XBAR_reserverd_141[59]; - -/* Slave General Purpose Control Register 2 @baseaddress + 0x210 - not implemented */ - - int32_t XBAR_reserverd_211[64]; - - union { - vuint32_t R; - struct { - vuint32_t:4; /* Master 7 Priority - Not implemented */ - vuint32_t:4; /* Master 6 Priority - Not implemented */ - vuint32_t:4; /* Master 5 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR4:3; /* Master 4 Priority - Core load/store & Nexus port */ - vuint32_t:4; /* Master 3 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR2:3; /* Master 2 Priority - Unused implemented master port */ - vuint32_t:1; /* */ - vuint32_t MSTR1:3; /* Master 1 Priority - eDMA */ - vuint32_t:1; /* */ - vuint32_t MSTR0:3; /* Master 0 Priority - e200z335 core Instruction */ - } B; - } MPR3; /* Master Priority Register for Slave port 3 @baseaddress + 0x300 */ - - int32_t XBAR_reserverd_245[3]; - - union { - vuint32_t R; - struct { - vuint32_t RO:1; /* Read Only */ - vuint32_t HLP:1; /* Halt Low Priority (new in MPC563xM) */ - vuint32_t:6; /* Slave General Purpose Control Register Reserved */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE4:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE2:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE1:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE0:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:6; /* */ - vuint32_t ARB:2; /* Arbitration Mode */ - vuint32_t:2; /* */ - vuint32_t PCTL:2; /* Parking Control */ - vuint32_t:1; /* */ - vuint32_t PARK:3; /* PARK */ - } B; - } SGPCR3; /* Slave General Purpose Control Register 3 @baseaddress + 0x310 */ - - int32_t XBAR_reserverd_281[59]; - - /* Slave General Purpose Control Register 4 @baseaddress + 0x410 - not implemented */ - - int32_t XBAR_reserverd_351[64]; - - /* Slave XBAR Port 5 Not implemented @baseaddress + 0x510 */ - - int32_t XBAR_reserverd_421[64]; - - /* Slave Port 6 not implemented @baseaddress + 0x610 */ - - int32_t XBAR_reserverd_491[64]; - - union { - vuint32_t R; - struct { - vuint32_t:4; /* Master 7 Priority - Not implemented */ - vuint32_t:4; /* Master 6 Priority - Not implemented */ - vuint32_t:4; /* Master 5 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR4:3; /* Master 4 Priority - Core load/store & Nexus port */ - vuint32_t:4; /* Master 3 Priority - Not implemented */ - vuint32_t:1; /* */ - vuint32_t MSTR2:3; /* Master 2 Priority - Unused implemented master port */ - vuint32_t:1; /* */ - vuint32_t MSTR1:3; /* Master 1 Priority - eDMA */ - vuint32_t:1; /* */ - vuint32_t MSTR0:3; /* Master 0 Priority - e200z335 core Instruction */ - } B; - } MPR7; /* Master Priority Register for Slave port 7 @baseaddress + 0x700 */ - - int32_t XBAR_reserverd_525[3]; - - union { - vuint32_t R; - struct { - vuint32_t RO:1; /* Read Only */ - vuint32_t HLP:1; /* Halt Low Priority (new in MPC563xM) */ - vuint32_t:6; /* Slave General Purpose Control Register Reserved */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE4:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:1; /* High Priority Enable (new in MPC563xM - not implemented) */ - vuint32_t HPE2:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE1:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t HPE0:1; /* High Priority Enable (new in MPC563xM) */ - vuint32_t:6; /* */ - vuint32_t ARB:2; /* Arbitration Mode */ - vuint32_t:2; /* */ - vuint32_t PCTL:2; /* Parking Control */ - vuint32_t:1; /* */ - vuint32_t PARK:3; /* PARK */ - } B; - } SGPCR7; /* Slave General Purpose Control Register 7 @baseaddress + 0x710 */ - - int32_t XBAR_reserverd_561[59]; - - union { - vuint32_t R; - struct { - vuint32_t:29; /* */ - vuint32_t AULB:3; /* Arbitrate on Undefined Length Bursts */ - } B; - } MGPCR0; /* Master General Purpose Control Register 0 @baseaddress + 0x800 */ - - int32_t XBAR_reserverd_564[63]; - - union { - vuint32_t R; - struct { - vuint32_t:29; /* */ - vuint32_t AULB:3; /* Arbitrate on Undefined Length Bursts */ - } B; - } MGPCR1; /* Master General Purpose Control Register 1 @baseaddress + 0x900 */ - - int32_t XBAR_reserverd_567[63]; - - union { - vuint32_t R; - struct { - vuint32_t:29; /* */ - vuint32_t AULB:3; /* Arbitrate on Undefined Length Bursts */ - } B; - } MGPCR2; /* Master General Purpose Control Register 2 @baseaddress + 0xA00 */ - - int32_t XBAR_reserverd_570[63]; - - /* Master General Purpose Control Register 3 not implemented @baseaddress + 0xB00 */ - - int32_t XBAR_reserverd_573[64]; - - union { - vuint32_t R; - struct { - vuint32_t:29; /* */ - vuint32_t AULB:3; /* Arbitrate on Undefined Length Bursts */ - } B; - } MGPCR4; /* Master General Purpose Control Register 4 @baseaddress + 0xC00 */ - - int32_t XBAR_reserverd_576[64]; - - /* Master General Purpose Control Register 5 not implemented @baseaddress + 0xD00 */ - - int32_t XBAR_reserverd_579[64]; - - /* Master General Purpose Control Register 6 not implemented @baseaddress + 0xE00 */ - - int32_t XBAR_reserverd_582[64]; - - /* Master General Purpose Control Register 7 not implemented @baseaddress + 0xF00 */ - - }; /* end of XBAR_tag */ -/****************************************************************************/ -/* MODULE : ECSM */ -/****************************************************************************/ - struct ECSM_tag { - /* SWTCR, SWTSR and SWTIR don't exist in MPC563xM */ - uint32_t ecsm_reserved1[16]; - - uint8_t ecsm_reserved3[3]; /* base + 0x40 */ - - union { - vuint8_t R; - struct { - vuint8_t:6; - vuint8_t ERNCR:1; /* EPRNCR */ - vuint8_t EFNCR:1; /* EPFNCR */ - } B; - } ECR; /* ECC Configuration Register */ - - uint8_t ecsm_reserved4[3]; /* base + 0x44 */ - - union { - vuint8_t R; - struct { - vuint8_t:6; - vuint8_t RNCE:1; /* PRNCE */ - vuint8_t FNCE:1; /* PFNCE */ - } B; - } ESR; /* ECC Status Register */ - - /* EEGR don't exist in MPC563xM */ - uint32_t ecsm_reserved4a[2]; - - union { - vuint32_t R; - struct { - vuint32_t FEAR:32; /* PFEAR */ - } B; - } FEAR; /* Flash ECC Address Register PFEAR - 0x50 */ - - uint16_t ecsm_reserved4b; - - union { - vuint8_t R; - struct { - vuint8_t:4; - vuint8_t FEMR:4; /* PFEMR */ - } B; - } FEMR; /* Flash ECC Master Register PFEMR */ - - union { - vuint8_t R; - struct { - vuint8_t WRITE:1; - vuint8_t SIZE:3; - vuint8_t PROT0:1; /* PROTECTION */ - vuint8_t PROT1:1; /* PROTECTION */ - vuint8_t PROT2:1; /* PROTECTION */ - vuint8_t PROT3:1; /* PROTECTION */ - } B; - } FEAT; /* Flash ECC Attributes Register PFEAT */ - - union { - vuint32_t R; - struct { - vuint32_t FEDH:32; /* PFEDR */ - } B; - } FEDRH; /* Flash ECC Data High Register PFEDRH */ - - union { - vuint32_t R; - struct { - vuint32_t FEDL:32; /* PFEDR */ - } B; - } FEDRL; /* Flash ECC Data Low Register PFEDRL */ - - union { - vuint32_t R; - struct { - vuint32_t REAR:32; /* PREAR */ - } B; - } REAR; /* RAM ECC Address PREAR */ - - uint8_t ecsm_reserved5; - - union { - vuint8_t R; - struct { - vuint8_t PRESR:8; - } B; - } PRESR; /* RAM ECC Syndrome (new in MPC563xM) */ - - union { - vuint8_t R; - struct { - vuint8_t:4; - vuint8_t REMR:4; /* PREMR */ - } B; - } REMR; /* RAM ECC Master PREMR */ - - union { - vuint8_t R; - struct { - vuint8_t WRITE:1; - vuint8_t SIZE:3; - vuint8_t PROT0:1; /* PROTECTION */ - vuint8_t PROT1:1; /* PROTECTION */ - vuint8_t PROT2:1; /* PROTECTION */ - vuint8_t PROT3:1; /* PROTECTION */ - } B; - } REAT; /* RAM ECC Attributes Register PREAT */ - - union { - vuint32_t R; - struct { - vuint32_t REDH:32; /* PREDR */ - } B; - } REDRH; /* RAM ECC Data High Register PREDRH */ - - union { - vuint32_t R; - struct { - vuint32_t REDL:32; /* PREDR */ - } B; - } REDRL; /* RAMECC Data Low Register PREDRL */ - - }; -/****************************************************************************/ -/* MODULE : EDMA */ -/****************************************************************************/ - struct EDMA_tag { - union { - vuint32_t R; - struct { - vuint32_t:14; /* Reserved */ - vuint32_t CX:1; /* Cancel Transfer (new in MPC563xM) */ - vuint32_t ECX:1; /* Error Cancel Transfer (new in MPC563xM) */ - vuint32_t GRP3PRI:2; /* Channel Group 3 Priority (new in MPC563xM) */ - vuint32_t GRP2PRI:2; /* Channel Group 2 Priority (new in MPC563xM) */ - vuint32_t GRP1PRI:2; /* Channel Group 1 Priority */ - vuint32_t GRP0PRI:2; /* Channel Group 0 Priority */ - vuint32_t EMLM:1; /* Enable Minor Loop Mapping (new in MPC563xM) */ - vuint32_t CLM:1; /* Continuous Link Mode (new in MPC563xM) */ - vuint32_t HALT:1; /* Halt DMA Operations (new in MPC563xM) */ - vuint32_t HOE:1; /* Halt On Error (new in MPC563xM) */ - vuint32_t ERGA:1; /* Enable Round Robin Group Arbitration */ - vuint32_t ERCA:1; /* Enable Round Robin Channel Arbitration */ - vuint32_t EDBG:1; /* Enable Debug */ - vuint32_t EBW:1; /* Enable Buffered Writes */ - } B; - } CR; /* DMA Control Register DMACR @baseaddress + 0x0 */ - - union { - vuint32_t R; - struct { - vuint32_t VLD:1; /* Logical OR of all DMAERRH */ - - vuint32_t:14; /* Reserved */ - vuint32_t ECX:1; /* (new in MPC563xM) */ - vuint32_t GPE:1; /* Group Priority Error */ - vuint32_t CPE:1; /* Channel Priority Error */ - vuint32_t ERRCHN:6; /* ERRCHN[5:0] Error Channel Number or The channel number of the last recorded error */ - vuint32_t SAE:1; /* Source Address Error 0 */ - vuint32_t SOE:1; /* Source Offset Error */ - vuint32_t DAE:1; /* Destination Address Error */ - vuint32_t DOE:1; /* Destination Offset Error */ - vuint32_t NCE:1; /* Nbytes/Citer Configuration Error */ - vuint32_t SGE:1; /* Scatter/Gather Configuration Error */ - vuint32_t SBE:1; /* Source Bus Error */ - vuint32_t DBE:1; /* Destination Bus Error */ - - } B; - } ESR; /* DMAES Error Status Register */ - - uint32_t edma_reserved_erqrh; - - union { - vuint32_t R; - struct { - vuint32_t ERQ31:1; - vuint32_t ERQ30:1; - vuint32_t ERQ29:1; - vuint32_t ERQ28:1; - vuint32_t ERQ27:1; - vuint32_t ERQ26:1; - vuint32_t ERQ25:1; - vuint32_t ERQ24:1; - vuint32_t ERQ23:1; - vuint32_t ERQ22:1; - vuint32_t ERQ21:1; - vuint32_t ERQ20:1; - vuint32_t ERQ19:1; - vuint32_t ERQ18:1; - vuint32_t ERQ17:1; - vuint32_t ERQ16:1; - vuint32_t ERQ15:1; - vuint32_t ERQ14:1; - vuint32_t ERQ13:1; - vuint32_t ERQ12:1; - vuint32_t ERQ11:1; - vuint32_t ERQ10:1; - vuint32_t ERQ09:1; - vuint32_t ERQ08:1; - vuint32_t ERQ07:1; - vuint32_t ERQ06:1; - vuint32_t ERQ05:1; - vuint32_t ERQ04:1; - vuint32_t ERQ03:1; - vuint32_t ERQ02:1; - vuint32_t ERQ01:1; - vuint32_t ERQ00:1; - } B; - } ERQRL; /* DMAERQL ,DMA Enable Request Register Low */ - - uint32_t edma_reserved_eeirh; - - union { - vuint32_t R; - struct { - vuint32_t EEI31:1; - vuint32_t EEI30:1; - vuint32_t EEI29:1; - vuint32_t EEI28:1; - vuint32_t EEI27:1; - vuint32_t EEI26:1; - vuint32_t EEI25:1; - vuint32_t EEI24:1; - vuint32_t EEI23:1; - vuint32_t EEI22:1; - vuint32_t EEI21:1; - vuint32_t EEI20:1; - vuint32_t EEI19:1; - vuint32_t EEI18:1; - vuint32_t EEI17:1; - vuint32_t EEI16:1; - vuint32_t EEI15:1; - vuint32_t EEI14:1; - vuint32_t EEI13:1; - vuint32_t EEI12:1; - vuint32_t EEI11:1; - vuint32_t EEI10:1; - vuint32_t EEI09:1; - vuint32_t EEI08:1; - vuint32_t EEI07:1; - vuint32_t EEI06:1; - vuint32_t EEI05:1; - vuint32_t EEI04:1; - vuint32_t EEI03:1; - vuint32_t EEI02:1; - vuint32_t EEI01:1; - vuint32_t EEI00:1; - } B; - } EEIRL; /* DMAEEIL , DMA Enable Error Interrupt Register Low */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 SERQ:7 */ - } SERQR; /* DMASERQ , DMA Set Enable Request Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 CERQ:7 */ - } CERQR; /* DMACERQ , DMA Clear Enable Request Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 SEEI:7 */ - } SEEIR; /* DMASEEI , DMA Set Enable Error Interrupt Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 CEEI:7 */ - } CEEIR; /* DMACEEI , DMA Clear Enable Error Interrupt Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 CINT:7 */ - } CIRQR; /* DMACINT , DMA Clear Interrupt Request Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 CERR:7 */ - } CER; /* DMACERR , DMA Clear error Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 SSRT:7 */ - } SSBR; /* DMASSRT , Set Start Bit Register */ - - union { - vuint8_t R; - vuint8_t B; /* NOP:1 CDNE:7 */ - } CDSBR; /* DMACDNE , Clear Done Status Bit Register */ - - uint32_t edma_reserved_irqrh; - - union { - vuint32_t R; - struct { - vuint32_t INT31:1; - vuint32_t INT30:1; - vuint32_t INT29:1; - vuint32_t INT28:1; - vuint32_t INT27:1; - vuint32_t INT26:1; - vuint32_t INT25:1; - vuint32_t INT24:1; - vuint32_t INT23:1; - vuint32_t INT22:1; - vuint32_t INT21:1; - vuint32_t INT20:1; - vuint32_t INT19:1; - vuint32_t INT18:1; - vuint32_t INT17:1; - vuint32_t INT16:1; - vuint32_t INT15:1; - vuint32_t INT14:1; - vuint32_t INT13:1; - vuint32_t INT12:1; - vuint32_t INT11:1; - vuint32_t INT10:1; - vuint32_t INT09:1; - vuint32_t INT08:1; - vuint32_t INT07:1; - vuint32_t INT06:1; - vuint32_t INT05:1; - vuint32_t INT04:1; - vuint32_t INT03:1; - vuint32_t INT02:1; - vuint32_t INT01:1; - vuint32_t INT00:1; - } B; - } IRQRL; /* DMAINTL , DMA Interrupt Request Low */ - - uint32_t edma_reserved_erh; - - union { - vuint32_t R; - struct { - vuint32_t ERR31:1; - vuint32_t ERR30:1; - vuint32_t ERR29:1; - vuint32_t ERR28:1; - vuint32_t ERR27:1; - vuint32_t ERR26:1; - vuint32_t ERR25:1; - vuint32_t ERR24:1; - vuint32_t ERR23:1; - vuint32_t ERR22:1; - vuint32_t ERR21:1; - vuint32_t ERR20:1; - vuint32_t ERR19:1; - vuint32_t ERR18:1; - vuint32_t ERR17:1; - vuint32_t ERR16:1; - vuint32_t ERR15:1; - vuint32_t ERR14:1; - vuint32_t ERR13:1; - vuint32_t ERR12:1; - vuint32_t ERR11:1; - vuint32_t ERR10:1; - vuint32_t ERR09:1; - vuint32_t ERR08:1; - vuint32_t ERR07:1; - vuint32_t ERR06:1; - vuint32_t ERR05:1; - vuint32_t ERR04:1; - vuint32_t ERR03:1; - vuint32_t ERR02:1; - vuint32_t ERR01:1; - vuint32_t ERR00:1; - } B; - } ERL; /* DMAERRL , DMA Error Low */ - - int32_t edma_reserverd_hrsh[1]; - - int32_t edma_reserverd_hrsl[1]; - - int32_t edma_reserverd_gpor[1]; - - int32_t EDMA_reserverd_223[49]; - - union { - vuint8_t R; - struct { - vuint8_t ECP:1; - vuint8_t DPA:1; - vuint8_t GRPPRI:2; - vuint8_t CHPRI:4; - } B; - } CPR[64]; /* DCHPRI [32] , Channel n Priority */ - - uint32_t edma_reserved2[944]; - -/****************************************************************************/ -/* DMA2 Transfer Control Descriptor */ -/****************************************************************************/ - - struct tcd_t { /*for "standard" format TCDs (when EDMA.TCD[x].CITER.E_LINK==BITER.E_LINK=0 && EDMA.EMLM=0 ) */ - vuint32_t SADDR; /* source address */ - - vuint16_t SMOD:5; /* source address modulo */ - vuint16_t SSIZE:3; /* source transfer size */ - vuint16_t DMOD:5; /* destination address modulo */ - vuint16_t DSIZE:3; /* destination transfer size */ - vint16_t SOFF; /* signed source address offset */ - vuint32_t NBYTES; /* inner (“minor”) byte count */ - vint32_t SLAST; /* last destination address adjustment, or - - scatter/gather address (if e_sg = 1) */ - vuint32_t DADDR; /* destination address */ - vuint16_t CITERE_LINK:1; - vuint16_t CITER:15; - vint16_t DOFF; /* signed destination address offset */ - vint32_t DLAST_SGA; - vuint16_t BITERE_LINK:1; /* beginning ("major") iteration count */ - vuint16_t BITER:15; - vuint16_t BWC:2; /* bandwidth control */ - vuint16_t MAJORLINKCH:6; /* enable channel-to-channel link */ - vuint16_t DONE:1; /* channel done */ - vuint16_t ACTIVE:1; /* channel active */ - vuint16_t MAJORE_LINK:1; /* enable channel-to-channel link */ - vuint16_t E_SG:1; /* enable scatter/gather descriptor */ - vuint16_t D_REQ:1; /* disable ipd_req when done */ - vuint16_t INT_HALF:1; /* interrupt on citer = (biter >> 1) */ - vuint16_t INT_MAJ:1; /* interrupt on major loop completion */ - vuint16_t START:1; /* explicit channel start */ - } TCD[64]; /* TCD [32] , transfer_control_descriptor */ - }; - - struct EDMA_TCD_alt1_tag { /*for alternate format TCDs (when EDMA.TCD[x].CITER.E_LINK==BITER.E_LINK=1 ) */ - - struct tcd_alt1_t { - vuint32_t SADDR; /* source address */ - - vuint16_t SMOD:5; /* source address modulo */ - vuint16_t SSIZE:3; /* source transfer size */ - vuint16_t DMOD:5; /* destination address modulo */ - vuint16_t DSIZE:3; /* destination transfer size */ - vint16_t SOFF; /* signed source address offset */ - vuint32_t NBYTES; /* inner (“minor”) byte count */ - vint32_t SLAST; /* last destination address adjustment, or - - scatter/gather address (if e_sg = 1) */ - vuint32_t DADDR; /* destination address */ - vuint16_t CITERE_LINK:1; - vuint16_t CITERLINKCH:6; - vuint16_t CITER:9; - vint16_t DOFF; /* signed destination address offset */ - vint32_t DLAST_SGA; - vuint16_t BITERE_LINK:1; /* beginning (“major”) iteration count */ - vuint16_t BITERLINKCH:6; - vuint16_t BITER:9; - vuint16_t BWC:2; /* bandwidth control */ - vuint16_t MAJORLINKCH:6; /* enable channel-to-channel link */ - vuint16_t DONE:1; /* channel done */ - vuint16_t ACTIVE:1; /* channel active */ - vuint16_t MAJORE_LINK:1; /* enable channel-to-channel link */ - vuint16_t E_SG:1; /* enable scatter/gather descriptor */ - vuint16_t D_REQ:1; /* disable ipd_req when done */ - vuint16_t INT_HALF:1; /* interrupt on citer = (biter >> 1) */ - vuint16_t INT_MAJ:1; /* interrupt on major loop completion */ - vuint16_t START:1; /* explicit channel start */ - } TCD[64]; /* TCD [32] , transfer_control_descriptor */ - }; - -/****************************************************************************/ -/* MODULE : INTC */ -/****************************************************************************/ - struct INTC_tag { - union { - vuint32_t R; - struct { - vuint32_t:18; /* Reserved */ - vuint32_t VTES_PRC1:1; /* Vector Table Entry Size for PRC1 (new in MPC563xM) */ - vuint32_t:4; /* Reserved */ - vuint32_t HVEN_PRC1:1; /* Hardware Vector Enable for PRC1 (new in MPC563xM) */ - vuint32_t:2; /* Reserved */ - vuint32_t VTES:1; /* Vector Table Entry Size for PRC0 VTES_PRC0 */ - vuint32_t:4; /* Reserved */ - vuint32_t HVEN:1; /* Hardware Vector Enable for PRC0 HVEN_PRC0 */ - } B; - } MCR; /* INTC Module Configuration Register (MCR) INTC_BCR @baseaddress + 0x00 */ - int32_t INTC_reserverd_10[1]; - - union { - vuint32_t R; - struct { - vuint32_t:28; /* Reserved */ - vuint32_t PRI:4; /* Priority */ - } B; - } CPR; /* INTC Current Priority Register for Processor 0 (CPR) INTC_CPR_PRC0 @baseaddress + 0x08 */ - - int32_t INTC_reserved_1; /* CPR_PRC1 - INTC Current Priority Register for Processor 1 (CPR_PRC1) INTC_CPR_PRC1 @baseaddress + 0x0c */ - - union { - vuint32_t R; - struct { - vuint32_t VTBA:21; /* Vector Table Base Address VTBA_PRC0 */ - vuint32_t INTVEC:9; /* Interrupt Vector INTVEC_PRC0 */ - vuint32_t:2; /* Reserved */ - } B; - } IACKR; /* INTC Interrupt Acknowledge Register for Processor 0 (IACKR) INTC_IACKR_PRC0 @baseaddress + 0x10 */ - - int32_t INTC_reserverd_2; /* IACKR_PRC1 - INTC Interrupt Acknowledge Register for Processor 1 (IACKR_PRC1) INTC_IACKR_PRC1 @baseaddress + 0x14 */ - - union { - vuint32_t R; - } EOIR; /* INTC End of Interrupt Register for Processor 0 (EOIR) INTC_EOIR_PRC0 @baseaddress + 0x18 */ - - int32_t INTC_reserverd_3; /* EOIR_PRC1 - INTC End of Interrupt Register for Processor 1 (EOIR_PRC1) INTC_EOIR_PRC1 @baseaddress + 0x1C */ - - union { - vuint8_t R; - struct { - vuint8_t:6; /* Reserved */ - vuint8_t SET:1; /* Set Flag bits */ - vuint8_t CLR:1; /* Clear Flag bits */ - } B; - } SSCIR[8]; /* INTC Software Set/Clear Interrupt Registers (SSCIR) INTC_SSCIRn @baseaddress + 0x20 */ - - int32_t INTC_reserverd_32[6]; - - union { - vuint8_t R; - struct { - vuint8_t PRC_SEL:2; /* Processor Select (new in MPC563xM) */ - vuint8_t:2; /* Reserved */ - vuint8_t PRI:4; /* Priority Select */ - } B; - } PSR[512]; /* INTC Priority Select Registers (PSR) INTC_PSR @baseaddress + 0x40 */ - - }; /* end of INTC_tag */ -/****************************************************************************/ -/* MODULE : EQADC */ -/****************************************************************************/ - struct EQADC_tag { - union { - vuint32_t R; - struct { - vuint32_t:24; - vuint32_t ICEA0:1; - vuint32_t ICEA1:1; - vuint32_t:1; - vuint32_t ESSIE:2; - vuint32_t:1; - vuint32_t DBG:2; - } B; - } MCR; /* Module Configuration Register EQADC_MCR */ - - int32_t EQADC_reserved00; - - union { - vuint32_t R; - struct { - vuint32_t:6; - vuint32_t NMF:26; - } B; - } NMSFR; /* Null Message Send Format Register EQADC_NMSFR */ - - union { - vuint32_t R; - struct { - vuint32_t:28; - vuint32_t DFL:4; - } B; - } ETDFR; /* External Trigger Digital Filter Register EQADC_ETDFR */ - - union { - vuint32_t R; - struct { - vuint32_t CFPUSH:32; /* CF_PUSH */ - } B; - } CFPR[6]; /* CFIFO Push Registers EQADC_CFPR */ - - uint32_t eqadc_reserved1; - - uint32_t eqadc_reserved2; - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RFPOP:16; /* RF_POP */ - } B; - } RFPR[6]; /* Result FIFO Pop Registers EQADC_RFPR */ - - uint32_t eqadc_reserved3; - - uint32_t eqadc_reserved4; - - union { - vuint16_t R; - struct { - vuint16_t:3; - vuint16_t CFEE0:1; - vuint16_t STRME0:1; - vuint16_t SSE:1; - vuint16_t CFINV:1; - vuint16_t:1; - vuint16_t MODE:4; - vuint16_t AMODE0:4; /* CFIFO0 only */ - } B; - } CFCR[6]; /* CFIFO Control Registers EQADC_CFCR */ - - uint32_t eqadc_reserved5; - - union { - vuint16_t R; - struct { - vuint16_t NCIE:1; - vuint16_t TORIE:1; - vuint16_t PIE:1; - vuint16_t EOQIE:1; - vuint16_t CFUIE:1; - vuint16_t:1; - vuint16_t CFFE:1; - vuint16_t CFFS:1; - vuint16_t:4; - vuint16_t RFOIE:1; - vuint16_t:1; - vuint16_t RFDE:1; - vuint16_t RFDS:1; - } B; - } IDCR[6]; /* Interrupt and DMA Control Registers EQADC_IDCR */ - - uint32_t eqadc_reserved6; - - union { - vuint32_t R; - struct { - vuint32_t NCF:1; - vuint32_t TORF:1; - vuint32_t PF:1; - vuint32_t EOQF:1; - vuint32_t CFUF:1; - vuint32_t SSS:1; - vuint32_t CFFF:1; - vuint32_t:5; - vuint32_t RFOF:1; - vuint32_t:1; - vuint32_t RFDF:1; - vuint32_t:1; - vuint32_t CFCTR:4; - vuint32_t TNXTPTR:4; - vuint32_t RFCTR:4; - vuint32_t POPNXTPTR:4; - } B; - } FISR[6]; /* FIFO and Interrupt Status Registers EQADC_FISR */ - - uint32_t eqadc_reserved7; - - uint32_t eqadc_reserved8; - - union { - vuint16_t R; - struct { - vuint16_t:5; - vuint16_t TCCF:11; /* TC_CF */ - } B; - } CFTCR[6]; /* CFIFO Transfer Counter Registers EQADC_CFTCR */ - - uint32_t eqadc_reserved9; - - union { - vuint32_t R; - struct { - vuint32_t CFS0:2; /* CFS0_TCB0 */ - vuint32_t CFS1:2; /* CFS1_TCB0 */ - vuint32_t CFS2:2; /* CFS2_TCB0 */ - vuint32_t CFS3:2; /* CFS3_TCB0 */ - vuint32_t CFS4:2; /* CFS4_TCB0 */ - vuint32_t CFS5:2; /* CFS5_TCB0 */ - vuint32_t:5; - vuint32_t LCFTCB0:4; - vuint32_t TC_LCFTCB0:11; - } B; - } CFSSR0; /* CFIFO Status Register 0 EQADC_CFSSR0 */ - - union { - vuint32_t R; - struct { - vuint32_t CFS0:2; /* CFS0_TCB1 */ - vuint32_t CFS1:2; /* CFS1_TCB1 */ - vuint32_t CFS2:2; /* CFS2_TCB1 */ - vuint32_t CFS3:2; /* CFS3_TCB1 */ - vuint32_t CFS4:2; /* CFS4_TCB1 */ - vuint32_t CFS5:2; /* CFS5_TCB1 */ - vuint32_t:5; - vuint32_t LCFTCB1:4; - vuint32_t TC_LCFTCB1:11; - } B; - } CFSSR1; /* CFIFO Status Register 1 EQADC_CFSSR1 */ - - union { - vuint32_t R; - struct { - vuint32_t CFS0:2; /* CFS0_TSSI */ - vuint32_t CFS1:2; /* CFS1_TSSI */ - vuint32_t CFS2:2; /* CFS2_TSSI */ - vuint32_t CFS3:2; /* CFS3_TSSI */ - vuint32_t CFS4:2; /* CFS4_TSSI */ - vuint32_t CFS5:2; /* CFS5_TSSI */ - vuint32_t:4; - vuint32_t ECBNI:1; - vuint32_t LCFTSSI:4; - vuint32_t TC_LCFTSSI:11; - } B; - } CFSSR2; /* CFIFO Status Register 2 EQADC_CFSSR2 */ - - union { - vuint32_t R; - struct { - vuint32_t CFS0:2; - vuint32_t CFS1:2; - vuint32_t CFS2:2; - vuint32_t CFS3:2; - vuint32_t CFS4:2; - vuint32_t CFS5:2; - vuint32_t:20; - } B; - } CFSR; /* EQADC_CFSR */ - - uint32_t eqadc_reserved11; - - union { - vuint32_t R; - struct { - vuint32_t:21; - vuint32_t MDT:3; - vuint32_t:4; - vuint32_t BR:4; - } B; - } SSICR; /* SSI Control Register EQADC_SSICR */ - - union { - vuint32_t R; - struct { - vuint32_t RDV:1; - vuint32_t:5; - vuint32_t RDATA:26; - } B; - } SSIRDR; /* SSI Recieve Data Register EQADC_SSIRDR @ baseaddress + 0xB8 */ - - uint32_t eqadc_reserved11b[5]; - - uint32_t eqadc_reserved15; /* EQADC Red Line Client Configuration Register @ baseaddress + 0xD0 */ - /* REDLCCR is not implemented in the MPC563xM */ - - uint32_t eqadc_reserved12[11]; - - struct { - union { - vuint32_t R; - - /*B.CFIFOx_DATAw */ - - } R[4]; /*EQADC_CFxRw */ - - union { - vuint32_t R; - /*B.CFIFOx_EDATAw */ - } EDATA[4]; /*EQADC_CFxERw (new in MPC563xM) */ - - uint32_t eqadc_reserved13[8]; - - } CF[6]; - - uint32_t eqadc_reserved14[32]; - - struct { - union { - vuint32_t R; - /*RFIFOx_DATAw */ - } R[4]; /*EQADC_RFxRw */ - - uint32_t eqadc_reserved15[12]; - - } RF[6]; - - }; - /****************************************************************************/ -/* MODULE : DSPI */ -/****************************************************************************/ - struct DSPI_tag { - union { - vuint32_t R; - struct { - vuint32_t MSTR:1; - vuint32_t CONT_SCKE:1; - vuint32_t DCONF:2; - vuint32_t FRZ:1; - vuint32_t MTFE:1; - vuint32_t PCSSE:1; - vuint32_t ROOE:1; - vuint32_t PCSIS7:1; /* new in MPC563xM */ - vuint32_t PCSIS6:1; /* new in MPC563xM */ - vuint32_t PCSIS5:1; - vuint32_t PCSIS4:1; - vuint32_t PCSIS3:1; - vuint32_t PCSIS2:1; - vuint32_t PCSIS1:1; - vuint32_t PCSIS0:1; - vuint32_t DOZE:1; - vuint32_t MDIS:1; - vuint32_t DIS_TXF:1; - vuint32_t DIS_RXF:1; - vuint32_t CLR_TXF:1; - vuint32_t CLR_RXF:1; - vuint32_t SMPL_PT:2; - vuint32_t:7; - vuint32_t HALT:1; - } B; - } MCR; /* Module Configuration Register DSPI_MCR @baseaddress + 0x00 */ - - uint32_t dspi_reserved1; - - union { - vuint32_t R; - struct { - vuint32_t TCNT:16; /* SPI_TCNT */ - vuint32_t:16; - } B; - } TCR; /* DSPI Transfer Count Register DSPI_TCR @baseaddress + 0x08 */ - - union { - vuint32_t R; - struct { - vuint32_t DBR:1; - vuint32_t FMSZ:4; - vuint32_t CPOL:1; - vuint32_t CPHA:1; - vuint32_t LSBFE:1; - vuint32_t PCSSCK:2; - vuint32_t PASC:2; - vuint32_t PDT:2; - vuint32_t PBR:2; - vuint32_t CSSCK:4; - vuint32_t ASC:4; - vuint32_t DT:4; - vuint32_t BR:4; - } B; - } CTAR[8]; /* Clock and Transfer Attributes Registers DSPI_CTARx @baseaddress + 0x0C - 0x28 */ - - union { - vuint32_t R; - struct { - vuint32_t TCF:1; - vuint32_t TXRXS:1; - vuint32_t:1; - vuint32_t EOQF:1; - vuint32_t TFUF:1; - vuint32_t:1; - vuint32_t TFFF:1; - vuint32_t:5; - vuint32_t RFOF:1; - vuint32_t:1; - vuint32_t RFDF:1; - vuint32_t:1; - vuint32_t TXCTR:4; - vuint32_t TXNXTPTR:4; - vuint32_t RXCTR:4; - vuint32_t POPNXTPTR:4; - } B; - } SR; /* Status Register DSPI_SR @baseaddress + 0x2C */ - - union { - vuint32_t R; - struct { - vuint32_t TCFRE:1; /*TCF_RE */ - vuint32_t:2; - vuint32_t EOQFRE:1; /*EQQF_RE */ - vuint32_t TFUFRE:1; /*TFUF_RE */ - vuint32_t:1; - vuint32_t TFFFRE:1; /*TFFF_RE */ - vuint32_t TFFFDIRS:1; /*TFFF_DIRS */ - vuint32_t:4; - vuint32_t RFOFRE:1; /*RFOF_RE */ - vuint32_t:1; - vuint32_t RFDFRE:1; /*RFDF_RE */ - vuint32_t RFDFDIRS:1; /*RFDF_DIRS */ - vuint32_t:16; - } B; - } RSER; /* DMA/Interrupt Request Select and Enable Register DSPI_RSER @baseaddress + 0x30 */ - - union { - vuint32_t R; - struct { - vuint32_t CONT:1; - vuint32_t CTAS:3; - vuint32_t EOQ:1; - vuint32_t CTCNT:1; - vuint32_t:2; - vuint32_t PCS7:1; /* new in MPC563xM */ - vuint32_t PCS6:1; /* new in MPC563xM */ - vuint32_t PCS5:1; - vuint32_t PCS4:1; - vuint32_t PCS3:1; - vuint32_t PCS2:1; - vuint32_t PCS1:1; - vuint32_t PCS0:1; - vuint32_t TXDATA:16; - } B; - } PUSHR; /* PUSH TX FIFO Register DSPI_PUSHR @baseaddress + 0x34 */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RXDATA:16; - } B; - } POPR; /* POP RX FIFO Register DSPI_POPR @baseaddress + 0x38 */ - - union { - vuint32_t R; - struct { - vuint32_t TXCMD:16; - vuint32_t TXDATA:16; - } B; - } TXFR[4]; /* Transmit FIFO Registers DSPI_TXFRx @baseaddress + 0x3c - 0x78 */ - - vuint32_t DSPI_reserved_txf[12]; - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RXDATA:16; - } B; - } RXFR[4]; /* Transmit FIFO Registers DSPI_RXFRx @baseaddress + 0x7c - 0xB8 */ - - vuint32_t DSPI_reserved_rxf[12]; - - union { - vuint32_t R; - struct { - vuint32_t MTOE:1; - vuint32_t:1; - vuint32_t MTOCNT:6; - vuint32_t:3; - vuint32_t TSBC:1; - vuint32_t TXSS:1; - vuint32_t TPOL:1; - vuint32_t TRRE:1; - vuint32_t CID:1; - vuint32_t DCONT:1; - vuint32_t DSICTAS:3; - vuint32_t:4; - vuint32_t DPCS7:1; - vuint32_t DPCS6:1; - vuint32_t DPCS5:1; - vuint32_t DPCS4:1; - vuint32_t DPCS3:1; - vuint32_t DPCS2:1; - vuint32_t DPCS1:1; - vuint32_t DPCS0:1; - } B; - } DSICR; /* DSI Configuration Register DSPI_DSICR @baseaddress + 0xBC */ - - union { - vuint32_t R; - struct { - vuint32_t SER_DATA:32; /* 32bit instead of 16 in MPC563xM */ - } B; - } SDR; /* DSI Serialization Data Register DSPI_SDR @baseaddress + 0xC0 */ - - union { - vuint32_t R; - struct { - vuint32_t ASER_DATA:32; /* 32bit instead of 16 in MPC563xM */ - } B; - } ASDR; /* DSI Alternate Serialization Data Register DSPI_ASDR @baseaddress + 0xC4 */ - - union { - vuint32_t R; - struct { - vuint32_t COMP_DATA:32; /* 32bit instead of 16 in MPC563xM */ - } B; - } COMPR; /* DSI Transmit Comparison Register DSPI_COMPR @baseaddress + 0xC8 */ - - union { - vuint32_t R; - struct { - vuint32_t DESER_DATA:32; /* 32bit instead of 16 in MPC563xM */ - } B; - } DDR; /* DSI deserialization Data Register DSPI_DDR @baseaddress + 0xCC */ - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t TSBCNT:5; - vuint32_t:16; - vuint32_t DPCS1_7:1; - vuint32_t DPCS1_6:1; - vuint32_t DPCS1_5:1; - vuint32_t DPCS1_4:1; - vuint32_t DPCS1_3:1; - vuint32_t DPCS1_2:1; - vuint32_t DPCS1_1:1; - vuint32_t DPCS1_0:1; - } B; - } DSICR1; /* DSI Configuration Register 1 DSPI_DSICR1 @baseaddress + 0xD0 */ - - }; -/****************************************************************************/ -/* MODULE : eSCI */ -/****************************************************************************/ - struct ESCI_tag { - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t SBR:13; - vuint32_t LOOPS:1; - vuint32_t:1; /* Reserved in MPC563xM */ - vuint32_t RSRC:1; - vuint32_t M:1; - vuint32_t WAKE:1; - vuint32_t ILT:1; - vuint32_t PE:1; - vuint32_t PT:1; - vuint32_t TIE:1; - vuint32_t TCIE:1; - vuint32_t RIE:1; - vuint32_t ILIE:1; - vuint32_t TE:1; - vuint32_t RE:1; - vuint32_t RWU:1; - vuint32_t SBK:1; - } B; - } CR1; /* Control Register 1 SCIBDH, SCIBDL, SCICR1, SCICR2 @baseaddress + 0x00 */ - - union { - vuint16_t R; - struct { - vuint16_t MDIS:1; - vuint16_t FBR:1; - vuint16_t BSTP:1; - vuint16_t IEBERR:1; /* BERIE */ - vuint16_t RXDMA:1; - vuint16_t TXDMA:1; - vuint16_t BRK13:1; /* BRCL */ - vuint16_t TXDIR:1; - vuint16_t BESM13:1; /* BESM */ - vuint16_t SBSTP:1; /* BESTP */ - vuint16_t RXPOL:1; - vuint16_t PMSK:1; - vuint16_t ORIE:1; - vuint16_t NFIE:1; - vuint16_t FEIE:1; - vuint16_t PFIE:1; - } B; - } CR2; /* Control Register 2 SCICR3, SCICR4 @baseaddress + 0x04 */ - - union { - vuint16_t R; - struct { - vuint16_t R8:1; /* RN */ - vuint16_t T8:1; /* TN */ - vuint16_t ERR:1; - vuint16_t:1; - vuint16_t R:4; - vuint8_t D; - } B; - } DR; /* Data Register SCIDRH, SCIDRL @baseaddress + 0x06 */ - - union { - vuint32_t R; - struct { - vuint32_t TDRE:1; - vuint32_t TC:1; - vuint32_t RDRF:1; - vuint32_t IDLE:1; - vuint32_t OR:1; - vuint32_t NF:1; - vuint32_t FE:1; - vuint32_t PF:1; - vuint32_t:3; - vuint32_t BERR:1; - vuint32_t:2; - vuint32_t TACT:1; - vuint32_t RAF:1; /* RACT */ - vuint32_t RXRDY:1; - vuint32_t TXRDY:1; - vuint32_t LWAKE:1; - vuint32_t STO:1; - vuint32_t PBERR:1; - vuint32_t CERR:1; - vuint32_t CKERR:1; - vuint32_t FRC:1; - vuint32_t:6; - vuint32_t UREQ:1; - vuint32_t OVFL:1; - } B; - } SR; /* Status Register SCISR1, SCIRSR2, LINSTAT1, LINSTAT2 @baseaddress + 0x08 */ - - union { - vuint32_t R; - struct { - vuint32_t LRES:1; - vuint32_t WU:1; - vuint32_t WUD0:1; - vuint32_t WUD1:1; - vuint32_t:2; /* reserved: LDBG and DSF not longer supported */ - vuint32_t PRTY:1; - vuint32_t LIN:1; - vuint32_t RXIE:1; - vuint32_t TXIE:1; - vuint32_t WUIE:1; - vuint32_t STIE:1; - vuint32_t PBIE:1; - vuint32_t CIE:1; - vuint32_t CKIE:1; - vuint32_t FCIE:1; - vuint32_t:6; - vuint32_t UQIE:1; - vuint32_t OFIE:1; - vuint32_t:8; - } B; - } LCR; /* LIN Control Register LINCTRL1, LINCTRL2, LINCTRL3 @baseaddress + 0x0C */ - - union { - vuint32_t R; - } LTR; /* LIN Transmit Register LINTX @baseaddress + 0x10 */ - - union { - vuint32_t R; - } LRR; /* LIN Recieve Register LINRX @baseaddress + 0x14 */ - - union { - vuint32_t R; - struct { - vuint32_t P:16; - vuint32_t:3; - vuint32_t SYNM:1; - vuint32_t EROE:1; - vuint32_t ERFE:1; - vuint32_t ERPE:1; - vuint32_t M2:1; - vuint32_t:8; - } B; - } LPR; /* LIN CRC Polynom Register LINCRCP1, LINCRCP2, SCICR5 @baseaddress + 0x18 */ - - }; -/****************************************************************************/ -/* MODULE : eSCI */ -/****************************************************************************/ - struct ESCI_12_13_bit_tag { - union { - vuint16_t R; - struct { - vuint16_t R8:1; - vuint16_t T8:1; - vuint16_t ERR:1; - vuint16_t:1; - vuint16_t D:12; - } B; - } DR; /* Data Register */ - }; -/****************************************************************************/ -/* MODULE : FlexCAN */ -/****************************************************************************/ - struct FLEXCAN_BUF_t { - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t CODE:4; - vuint32_t:1; - vuint32_t SRR:1; - vuint32_t IDE:1; - vuint32_t RTR:1; - vuint32_t LENGTH:4; - vuint32_t TIMESTAMP:16; - } B; - } CS; - - union { - vuint32_t R; - struct { - vuint32_t PRIO:3; - vuint32_t STD_ID:11; - vuint32_t EXT_ID:18; - } B; - } ID; - - union { - /*vuint8_t B[8]; *//* Data buffer in Bytes (8 bits) *//* Not used in MPC563xM */ - /*vuint16_t H[4]; *//* Data buffer in Half-words (16 bits) *//* Not used in MPC563xM */ - vuint32_t W[2]; /* Data buffer in words (32 bits) */ - /*vuint32_t R[2]; *//* Data buffer in words (32 bits) *//* Not used in MPC563xM */ - } DATA; - - }; /* end of FLEXCAN_BUF_t */ - - struct FLEXCAN_RXFIFO_t { - union { - vuint32_t R; - struct { - vuint32_t:9; - vuint32_t SRR:1; - vuint32_t IDE:1; - vuint32_t RTR:1; - vuint32_t LENGTH:4; - vuint32_t TIMESTAMP:16; - } B; - } CS; - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t STD_ID:11; - vuint32_t EXT_ID:18; - } B; - } ID; - - union { - /*vuint8_t B[8]; *//* Data buffer in Bytes (8 bits) *//* Not used in MPC563xM */ - /*vuint16_t H[4]; *//* Data buffer in Half-words (16 bits) *//* Not used in MPC563xM */ - vuint32_t W[2]; /* Data buffer in words (32 bits) */ - /*vuint32_t R[2]; *//* Data buffer in words (32 bits) *//* Not used in MPC563xM */ - } DATA; - - uint32_t FLEXCAN_RXFIFO_reserved[20]; /* {0x00E0-0x0090}/0x4 = 0x14 */ - - union { - vuint32_t R; - } IDTABLE[8]; - - }; /* end of FLEXCAN_RXFIFO_t */ - - struct FLEXCAN2_tag { - union { - vuint32_t R; - struct { - vuint32_t MDIS:1; - vuint32_t FRZ:1; - vuint32_t FEN:1; /* new in MPC563xM */ - vuint32_t HALT:1; - vuint32_t NOTRDY:1; /* NOT_RDY */ - vuint32_t WAK_MSK:1; /* new in MPC563xM */ - vuint32_t SOFTRST:1; /* SOFT_RST */ - vuint32_t FRZACK:1; /* FRZ_ACK */ - vuint32_t SUPV:1; /* new in MPC563xM */ - vuint32_t SLF_WAK:1; /* new in MPC563xM */ - - vuint32_t WRNEN:1; /* WRN_EN */ - - vuint32_t MDISACK:1; /* LPM_ACK */ - vuint32_t WAK_SRC:1; /* new in MPC563xM */ - vuint32_t DOZE:1; /* new in MPC563xM */ - - vuint32_t SRXDIS:1; /* SRX_DIS */ - vuint32_t MBFEN:1; /* BCC */ - vuint32_t:2; - - vuint32_t LPRIO_EN:1; /* new in MPC563xM */ - vuint32_t AEN:1; /* new in MPC563xM */ - vuint32_t:2; - vuint32_t IDAM:2; /* new in MPC563xM */ - vuint32_t:2; - - vuint32_t MAXMB:6; - } B; - } MCR; /* Module Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t PRESDIV:8; - vuint32_t RJW:2; - vuint32_t PSEG1:3; - vuint32_t PSEG2:3; - vuint32_t BOFFMSK:1; /* BOFF_MSK */ - vuint32_t ERRMSK:1; /* ERR_MSK */ - vuint32_t CLKSRC:1; /* CLK_SRC */ - vuint32_t LPB:1; - vuint32_t TWRNMSK:1; /* TWRN_MSK */ - vuint32_t RWRNMSK:1; /* RWRN_MSK */ - vuint32_t:2; - vuint32_t SMP:1; - vuint32_t BOFFREC:1; /* BOFF_REC */ - vuint32_t TSYN:1; - vuint32_t LBUF:1; - vuint32_t LOM:1; - vuint32_t PROPSEG:3; - } B; /* Control Register */ - } CR; /* CTRL */ - - union { - vuint32_t R; - } TIMER; /* Free Running Timer */ - - int32_t FLEXCAN_reserved00; - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t MI:29; - } B; - } RXGMASK; /* RX Global Mask */ - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t MI:29; - } B; - } RX14MASK; /* RX 14 Mask */ - - union { - vuint32_t R; - struct { - vuint32_t:3; - vuint32_t MI:29; - } B; - } RX15MASK; /* RX 15 Mask */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t RXECNT:8; - vuint32_t TXECNT:8; - } B; - } ECR; /* Error Counter Register */ - - union { - vuint32_t R; - struct { - vuint32_t:14; - vuint32_t TWRNINT:1; /* TWRN_INT */ - vuint32_t RWRNINT:1; /* RWRN_INT */ - vuint32_t BIT1ERR:1; /* BIT1_ERR */ - vuint32_t BIT0ERR:1; /* BIT0_ERR */ - vuint32_t ACKERR:1; /* ACK_ERR */ - vuint32_t CRCERR:1; /* CRC_ERR */ - vuint32_t FRMERR:1; /* FRM_ERR */ - vuint32_t STFERR:1; /* STF_ERR */ - vuint32_t TXWRN:1; /* TX_WRN */ - vuint32_t RXWRN:1; /* RX_WRN */ - vuint32_t IDLE:1; - vuint32_t TXRX:1; - vuint32_t FLTCONF:2; /* FLT_CONF */ - vuint32_t:1; - vuint32_t BOFFINT:1; /* BOFF_INT */ - vuint32_t ERRINT:1; /* ERR_INT */ - vuint32_t WAK_INT:1; /* new in MPC563xM */ - } B; - } ESR; /* Error and Status Register */ - - union { - vuint32_t R; - struct { - vuint32_t BUF63M:1; - vuint32_t BUF62M:1; - vuint32_t BUF61M:1; - vuint32_t BUF60M:1; - vuint32_t BUF59M:1; - vuint32_t BUF58M:1; - vuint32_t BUF57M:1; - vuint32_t BUF56M:1; - vuint32_t BUF55M:1; - vuint32_t BUF54M:1; - vuint32_t BUF53M:1; - vuint32_t BUF52M:1; - vuint32_t BUF51M:1; - vuint32_t BUF50M:1; - vuint32_t BUF49M:1; - vuint32_t BUF48M:1; - vuint32_t BUF47M:1; - vuint32_t BUF46M:1; - vuint32_t BUF45M:1; - vuint32_t BUF44M:1; - vuint32_t BUF43M:1; - vuint32_t BUF42M:1; - vuint32_t BUF41M:1; - vuint32_t BUF40M:1; - vuint32_t BUF39M:1; - vuint32_t BUF38M:1; - vuint32_t BUF37M:1; - vuint32_t BUF36M:1; - vuint32_t BUF35M:1; - vuint32_t BUF34M:1; - vuint32_t BUF33M:1; - vuint32_t BUF32M:1; - } B; /* Interruput Masks Register */ - } IMRH; /* IMASK2 */ - - union { - vuint32_t R; - struct { - vuint32_t BUF31M:1; - vuint32_t BUF30M:1; - vuint32_t BUF29M:1; - vuint32_t BUF28M:1; - vuint32_t BUF27M:1; - vuint32_t BUF26M:1; - vuint32_t BUF25M:1; - vuint32_t BUF24M:1; - vuint32_t BUF23M:1; - vuint32_t BUF22M:1; - vuint32_t BUF21M:1; - vuint32_t BUF20M:1; - vuint32_t BUF19M:1; - vuint32_t BUF18M:1; - vuint32_t BUF17M:1; - vuint32_t BUF16M:1; - vuint32_t BUF15M:1; - vuint32_t BUF14M:1; - vuint32_t BUF13M:1; - vuint32_t BUF12M:1; - vuint32_t BUF11M:1; - vuint32_t BUF10M:1; - vuint32_t BUF09M:1; - vuint32_t BUF08M:1; - vuint32_t BUF07M:1; - vuint32_t BUF06M:1; - vuint32_t BUF05M:1; - vuint32_t BUF04M:1; - vuint32_t BUF03M:1; - vuint32_t BUF02M:1; - vuint32_t BUF01M:1; - vuint32_t BUF00M:1; - } B; /* Interruput Masks Register */ - } IMRL; /* IMASK1 */ - - union { - vuint32_t R; - struct { - vuint32_t BUF63I:1; - vuint32_t BUF62I:1; - vuint32_t BUF61I:1; - vuint32_t BUF60I:1; - vuint32_t BUF59I:1; - vuint32_t BUF58I:1; - vuint32_t BUF57I:1; - vuint32_t BUF56I:1; - vuint32_t BUF55I:1; - vuint32_t BUF54I:1; - vuint32_t BUF53I:1; - vuint32_t BUF52I:1; - vuint32_t BUF51I:1; - vuint32_t BUF50I:1; - vuint32_t BUF49I:1; - vuint32_t BUF48I:1; - vuint32_t BUF47I:1; - vuint32_t BUF46I:1; - vuint32_t BUF45I:1; - vuint32_t BUF44I:1; - vuint32_t BUF43I:1; - vuint32_t BUF42I:1; - vuint32_t BUF41I:1; - vuint32_t BUF40I:1; - vuint32_t BUF39I:1; - vuint32_t BUF38I:1; - vuint32_t BUF37I:1; - vuint32_t BUF36I:1; - vuint32_t BUF35I:1; - vuint32_t BUF34I:1; - vuint32_t BUF33I:1; - vuint32_t BUF32I:1; - } B; /* Interruput Flag Register */ - } IFRH; /* IFLAG2 */ - - union { - vuint32_t R; - struct { - vuint32_t BUF31I:1; - vuint32_t BUF30I:1; - vuint32_t BUF29I:1; - vuint32_t BUF28I:1; - vuint32_t BUF27I:1; - vuint32_t BUF26I:1; - vuint32_t BUF25I:1; - vuint32_t BUF24I:1; - vuint32_t BUF23I:1; - vuint32_t BUF22I:1; - vuint32_t BUF21I:1; - vuint32_t BUF20I:1; - vuint32_t BUF19I:1; - vuint32_t BUF18I:1; - vuint32_t BUF17I:1; - vuint32_t BUF16I:1; - vuint32_t BUF15I:1; - vuint32_t BUF14I:1; - vuint32_t BUF13I:1; - vuint32_t BUF12I:1; - vuint32_t BUF11I:1; - vuint32_t BUF10I:1; - vuint32_t BUF09I:1; - vuint32_t BUF08I:1; - vuint32_t BUF07I:1; - vuint32_t BUF06I:1; - vuint32_t BUF05I:1; - vuint32_t BUF04I:1; - vuint32_t BUF03I:1; - vuint32_t BUF02I:1; - vuint32_t BUF01I:1; - vuint32_t BUF00I:1; - } B; /* Interruput Flag Register */ - } IFRL; /* IFLAG1 */ - - uint32_t flexcan2_reserved2[19]; - -/****************************************************************************/ -/* Use either Standard Buffer Structure OR RX FIFO and Buffer Structure */ -/****************************************************************************/ - /* Standard Buffer Structure */ - struct FLEXCAN_BUF_t BUF[64]; - - /* RX FIFO and Buffer Structure *//* New options in MPC563xM */ - /*struct FLEXCAN_RXFIFO_t RXFIFO; */ - /*struct FLEXCAN_BUF_t BUF[56]; */ -/****************************************************************************/ - - uint32_t FLEXCAN_reserved3[256]; /* {0x0880-0x0480}/0x4 = 0x100 *//* (New in MPC563xM) Address Base + 0x0034 */ - - union { - vuint32_t R; - struct { - vuint32_t MI:32; - } B; /* RX Individual Mask Registers */ - } RXIMR[64]; /* (New in MPC563xM) Address Base + 0x0880 */ - - }; /* end of FLEXCAN_tag */ -/****************************************************************************/ -/* MODULE : Decimation Filter (DECFIL) */ -/****************************************************************************/ - struct DECFIL_tag { - union { - vuint32_t R; - struct { - vuint32_t MDIS:1; - vuint32_t FREN:1; - vuint32_t:1; - vuint32_t FRZ:1; - vuint32_t SRES:1; - vuint32_t:2; /* CASCD not supported in MPC563xM */ - vuint32_t IDEN:1; - vuint32_t ODEN:1; - vuint32_t ERREN:1; - vuint32_t:1; - vuint32_t FTYPE:2; - vuint32_t:1; - vuint32_t SCAL:2; - vuint32_t:1; - vuint32_t SAT:1; - vuint32_t ISEL:1; - vuint32_t:1; /* MIXM does not appear to be implemented on the MPC563xM */ - vuint32_t DEC_RATE:4; - vuint32_t:1; /* SDIE not supported in MPC563xM */ - vuint32_t DSEL:1; - vuint32_t IBIE:1; - vuint32_t OBIE:1; - vuint32_t EDME:1; - vuint32_t TORE:1; - vuint32_t TMODE:2; /* the LSB of TMODE is always 0 on the MPC563xM */ - } B; - } MCR; /* Configuration Register DECFILTER_MCR @baseaddress + 0x00 */ - - union { - vuint32_t R; - struct { - vuint32_t BSY:1; - vuint32_t:1; - vuint32_t DEC_COUNTER:4; - vuint32_t IDFC:1; - vuint32_t ODFC:1; - vuint32_t SDFC:1; /* SDFC not supported in MPC563xM */ - vuint32_t IBIC:1; - vuint32_t OBIC:1; - vuint32_t SVRC:1; /* SVRC not supported in MPC563xM */ - vuint32_t DIVRC:1; - vuint32_t OVFC:1; - vuint32_t OVRC:1; - vuint32_t IVRC:1; - vuint32_t:6; - vuint32_t IDF:1; - vuint32_t ODF:1; - vuint32_t SDF:1; /* SDF not supported in MPC563xM */ - vuint32_t IBIF:1; - vuint32_t OBIF:1; - vuint32_t SVR:1; /* SVR not supported in MPC563xM */ - vuint32_t DIVR:1; - vuint32_t OVF:1; - vuint32_t OVR:1; - vuint32_t IVR:1; - } B; - } MSR; /* Status Register DECFILTER_MSR @baseaddress + 0x04 */ - - /* Module Extended Config.Register - not siupported on the MPC563xM DECFILTER_MXCR @baseaddress + 0x08 */ - - uint32_t decfil_reserved1[2]; - - union { - vuint32_t R; - struct { - vuint32_t:4; - vuint32_t INTAG:4; - vuint32_t:6; - vuint32_t PREFILL:1; - vuint32_t FLUSH:1; - vuint32_t INPBUF:16; - } B; - } IB; /* Interface Input Buffer DECFILTER_IB @baseaddress + 0x10 */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t OUTTAG:4; - vuint32_t OUTBUF:16; - } B; - } OB; /* Interface Output Buffer DECFILTER_OB @baseaddress + 0x14 */ - - uint32_t decfil_reserved2[2]; - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t COEF:24; - } B; - } COEF[9]; /* Filter Coefficient Registers DECFILTER_COEFx @baseaddress + 0x20 - 0x40 */ - - uint32_t decfil_reserved3[13]; - - union { - vuint32_t R; - struct { - vuint32_t:8; - vuint32_t TAP:24; - } B; - } TAP[8]; /* Filter TAP Registers DECFILTER_TAPx @baseaddress + 0x78 - 0x94 */ - - uint32_t decfil_reserved4[14]; - - /* 0x0D0 */ - union { - vuint16_t R; - struct { - vuint32_t:16; - vuint32_t SAMP_DATA:16; - } B; - } EDID; /* Filter EDID Registers DECFILTER_EDID @baseaddress + 0xD0 */ - - uint32_t decfil_reserved5[3]; - - /* 0x0E0 */ - uint32_t decfil_reserved6; - /* Filter FINTVAL Registers - Not supported on MPC563xM DECFILTER_FINTVAL @baseaddress + 0xE0 */ - - /* 0x0E4 */ - uint32_t decfil_reserved7; - /* Filter FINTCNT Registers - Not supported on MPC563xM DECFILTER_FINTCNT @baseaddress + 0xE4 */ - - /* 0x0E8 */ - uint32_t decfil_reserved8; - /* Filter CINTVAL Registers - Not supported on MPC563xM DECFILTER_CINTVAL @baseaddress + 0xE8 */ - - /* 0x0EC */ - uint32_t decfil_reserved9; - /* Filter CINTCNT Registers - Not supported on MPC563xM DECFILTER_CINTCNT @baseaddress + 0xEC */ - - }; -/****************************************************************************/ -/* MODULE : Periodic Interval Timer (PIT) */ -/****************************************************************************/ - struct PIT_tag { - - union { - vuint32_t R; - struct { - vuint32_t:29; - vuint32_t MDIS_RTI:1; - vuint32_t MDIS:1; - vuint32_t FRZ:1; - } B; - } PITMCR; /* PIT Module Control Register */ - - uint32_t pit_reserved1[59]; - - struct { - union { - vuint32_t R; /* TSVn */ - } LDVAL; /* Timer Load Value Register */ - - union { - vuint32_t R; /* TVLn */ - } CVAL; /* Current Timer Value Register */ - - union { - vuint32_t R; - struct { - vuint32_t:30; - vuint32_t TIE:1; - vuint32_t TEN:1; - } B; - } TCTRL; /* Timer Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t TIF:1; - } B; - } TFLG; /* Timer Flag Register */ - } RTI; /* RTI Channel */ - - struct { - union { - vuint32_t R; - } LDVAL; /* Timer Load Value Register */ - - union { - vuint32_t R; - } CVAL; /* Current Timer Value Register */ - - union { - vuint32_t R; - struct { - vuint32_t:30; - vuint32_t TIE:1; - vuint32_t TEN:1; - } B; - } TCTRL; /* Timer Control Register */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t TIF:1; - } B; - } TFLG; /* Timer Flag Register */ - } TIMER[4]; /* Timer Channels */ - - }; -/****************************************************************************/ -/* MODULE : System Timer Module (STM) */ -/****************************************************************************/ - struct STM_tag { - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t CPS:8; - vuint32_t:6; - vuint32_t FRZ:1; - vuint32_t TEN:1; - } B; - } CR; /* STM Control Register STM_CR (new in MPC563xM) Offset 0x0000 */ - - union { - vuint32_t R; - } CNT; /* STM Count Register STM_CNT (new in MPC563xM) Offset Offset 0x0004 */ - - uint32_t stm_reserved1[2]; /* Reserved (new in MPC563xM) Offset Offset 0x0008 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR0; /* STM Channel Control Register STM_CCR0 (new in MPC563xM) Offset 0x0010 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR0; /* STM Channel Interrupt Register STM_CIR0 (new in MPC563xM) Offset 0x0014 */ - - union { - vuint32_t R; - } CMP0; /* STM Channel Compare Register STM_CMP0 (new in MPC563xM) Offset Offset 0x0018 */ - - uint32_t stm_reserved2; /* Reserved (new in MPC563xM) Offset Offset 0x001C */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR1; /* STM Channel Control Register STM_CCR1 (new in MPC563xM) Offset 0x0020 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR1; /* STM Channel Interrupt Register STM_CIR1 (new in MPC563xM) Offset 0x0024 */ - - union { - vuint32_t R; - } CMP1; /* STM Channel Compare Register STM_CMP1 (new in MPC563xM) Offset Offset 0x0028 */ - - uint32_t stm_reserved3; /* Reserved (new in MPC563xM) Offset Offset 0x002C */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR2; /* STM Channel Control Register STM_CCR2 (new in MPC563xM) Offset 0x0030 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR2; /* STM Channel Interrupt Register STM_CIR2 (new in MPC563xM) Offset 0x0034 */ - - union { - vuint32_t R; - } CMP2; /* STM Channel Compare Register STM_CMP2 (new in MPC563xM) Offset Offset 0x0038 */ - - uint32_t stm_reserved4; /* Reserved (new in MPC563xM) Offset Offset 0x003C */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CEN:1; - } B; - } CCR3; /* STM Channel Control Register STM_CCR3 (new in MPC563xM) Offset 0x0040 */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t CIF:1; - } B; - } CIR3; /* STM Channel Interrupt Register STM_CIR3 (new in MPC563xM) Offset 0x0044 */ - - union { - vuint32_t R; - } CMP3; /* STM Channel Compare Register STM_CMP3 (new in MPC563xM) Offset Offset 0x0048 */ - - uint32_t stm_reserved5; /* Reserved (new in MPC563xM) Offset Offset 0x004C */ - }; - -/****************************************************************************/ -/* MODULE : SWT */ -/****************************************************************************/ - - struct SWT_tag { - union { - vuint32_t R; - struct { - vuint32_t MAP0:1; - vuint32_t MAP1:1; - vuint32_t MAP2:1; - vuint32_t MAP3:1; - vuint32_t MAP4:1; - vuint32_t MAP5:1; - vuint32_t MAP6:1; - vuint32_t MAP7:1; - vuint32_t:14; - vuint32_t KEY:1; - vuint32_t RIA:1; - vuint32_t WND:1; - vuint32_t ITR:1; - vuint32_t HLK:1; - vuint32_t SLK:1; - vuint32_t CSL:1; - vuint32_t STP:1; - vuint32_t FRZ:1; - vuint32_t WEN:1; - } B; - } MCR; /*SWT_CR *//* Module Configuration Register */ - - union { - vuint32_t R; - struct { - vuint32_t:31; - vuint32_t TIF:1; - } B; - } IR; /* Interrupt register SWT_IR */ - - union { - vuint32_t R; - struct { - vuint32_t WTO:32; - } B; - } TO; /* Timeout register SWT_TO */ - - union { - vuint32_t R; - struct { - vuint32_t WST:32; - - } B; - } WN; /* Window register SWT_WN */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t WSC:16; - } B; - } SR; /* Service register SWT_SR */ - - union { - vuint32_t R; - struct { - vuint32_t CNT:32; - } B; - } CO; /* Counter output register SWT_CO */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t SK:16; - } B; - } SK; /* Service key register SWT_SK */ - }; -/****************************************************************************/ -/* MODULE : Power Management Controller (PMC) */ -/****************************************************************************/ - struct PMC_tag { - union { - vuint32_t R; - struct { - vuint32_t LVRER:1; /* LVIRR */ - vuint32_t LVREH:1; /* LVIHR */ - vuint32_t LVRE50:1; /* LVI5R */ - vuint32_t LVRE33:1; /* LVI3R */ - vuint32_t LVREC:1; /* LVI1R */ - vuint32_t:3; - vuint32_t LVIER:1; /* LVIRE */ - vuint32_t LVIEH:1; /* LVIHE */ - vuint32_t LVIE50:1; /* LVI5E */ - vuint32_t LVIE33:1; /* LVI3E */ - vuint32_t LVIC:1; /* LVI1E */ - vuint32_t:2; - vuint32_t TLK:1; - vuint32_t:16; - } B; - } MCR; /* Module Configuration register CFGR */ - - union { - vuint32_t R; - struct { - vuint32_t:12; - vuint32_t LVDREGTRIM:4; /* LVI50TRIM */ - vuint32_t VDD33TRIM:4; /* BV33TRIM */ - vuint32_t LVD33TRIM:4; /* LVI33TRIM */ - vuint32_t VDDCTRIM:4; /* V12TRIM */ - vuint32_t LVDCTRIM:4; /* LVI33TRIM */ - } B; - } TRIMR; /* Trimming register */ - - union { - vuint32_t R; - struct { - vuint32_t:5; - vuint32_t LVFVSTBY:1; - vuint32_t BGRDY:1; /* BGS1 */ - vuint32_t BGTS:1; /* BGS2 */ - vuint32_t:5; - vuint32_t LVFCSTBY:1; - vuint32_t:1; - vuint32_t V33DIS:1; /* 3.3V Regulator Disable V33S */ - vuint32_t LVFCR:1; /* Clear LVFR LVIRC */ - vuint32_t LVFCH:1; /* Clear LVFH LVIHC */ - vuint32_t LVFC50:1; /* Clear LVF5 LVI5 */ - vuint32_t LVFC33:1; /* Clear LVF3 LVI3 */ - vuint32_t LVFCC:1; /* Clear LVFC LVI1 */ - vuint32_t:3; - vuint32_t LVFR:1; /* Low Voltage Flag Reset Supply LVIRF */ - vuint32_t LVFH:1; /* Low Voltage Flag VDDEH Supply LVIHF */ - vuint32_t LVF50:1; /* Low Voltage Flag 5V Supply LVI5F */ - vuint32_t LVF33:1; /* Low Voltage Flag 3.3V Supply LVI3F */ - vuint32_t LVFC:1; /* Low Voltage Flag Core (1.2V) LVI1F */ - vuint32_t:3; - - } B; - } SR; /* status register */ - }; -/****************************************************************************/ -/* MODULE : TSENS (Temperature Sensor) */ -/****************************************************************************/ - - struct TSENS_tag { - - union { - vuint32_t R; - struct { - vuint32_t TSCV2:16; - vuint32_t TSCV1:16; - } B; - } TCCR0; /* Temperature Sensor Calibration B @baseaddress + 0x00 */ - - union { - vuint32_t R; - struct { - vuint32_t:16; - vuint32_t TSCV3:16; - } B; - } TCCR1; /* Temperature Sensor Calibration A @baseaddress + 0x04 */ - - uint32_t TSENS_reserved0008[16382]; /* 0x0008-0xFFFF */ - - }; - -/* Define memories */ -/* Comments need to be moved for different memory sizes */ - -#define SRAM_START 0x40000000 - /*#define SRAM_SIZE 0xC000 48K SRAM */ - /*#define SRAM_SIZE 0x10000 64K SRAM */ -#define SRAM_SIZE 0x17800 /* 94K SRAM */ - /*#define SRAM_END 0x4000BFFF 48K SRAM */ - /*#define SRAM_END 0x4000FFFF 64K SRAM */ -#define SRAM_END 0x400177FF /* 94K SRAM */ - -#define FLASH_START 0x0 - /*#define FLASH_SIZE 0x100000 1M Flash */ -#define FLASH_SIZE 0x180000 /* 1.5M Flash */ - /*#define FLASH_END 0xFFFFF 1M Flash */ -#define FLASH_END 0x17FFFF /* 1.5M Flash */ - -/* Shadow Flash start and end address */ -#define FLASH_SHADOW_START 0x00FFC000 -#define FLASH_SHADOW_SIZE 0x4000 -#define FLASH_SHADOW_END 0x00FFFFFF - -/* Define instances of modules */ -#define FMPLL (*( volatile struct FMPLL_tag *) 0xC3F80000) -#define EBI (*( volatile struct EBI_tag *) 0xC3F84000) -#define CFLASH0 (*( volatile struct FLASH_tag *) 0xC3F88000) -#define CFLASH1 (*( volatile struct FLASH_tag *) 0xC3FB0000) -#define CFLASH2 (*( volatile struct FLASH_tag *) 0xC3FB4000) -#define SIU (*( volatile struct SIU_tag *) 0xC3F90000) - -#define EMIOS (*( volatile struct EMIOS_tag *) 0xC3FA0000) -#define PMC (*( volatile struct PMC_tag *) 0xC3FBC000) -#define ETPU (*( volatile struct ETPU_tag *) 0xC3FC0000) -#define ETPU_DATA_RAM (*( uint32_t *) 0xC3FC8000) -#define ETPU_DATA_RAM_EXT (*( uint32_t *) 0xC3FCC000) -#define ETPU_DATA_RAM_END 0xC3FC8BFC -#define CODE_RAM (*( uint32_t *) 0xC3FD0000) -#define ETPU_CODE_RAM (*( uint32_t *) 0xC3FD0000) -#define PIT (*( volatile struct PIT_tag *) 0xC3FF0000) - -#define XBAR (*( volatile struct XBAR_tag *) 0xFFF04000) -#define SWT (*( volatile struct SWT_tag *) 0xFFF38000) -#define STM (*( volatile struct STM_tag *) 0xFFF3C000) -#define ECSM (*( volatile struct ECSM_tag *) 0xFFF40000) -#define EDMA (*( volatile struct EDMA_tag *) 0xFFF44000) -#define INTC (*( volatile struct INTC_tag *) 0xFFF48000) - -#define EQADC (*( volatile struct EQADC_tag *) 0xFFF80000) -#define DECFIL (*( volatile struct DECFIL_tag *) 0xFFF88000) - -#define DSPI_B (*( volatile struct DSPI_tag *) 0xFFF94000) -#define DSPI_C (*( volatile struct DSPI_tag *) 0xFFF98000) - -#define ESCI_A (*( volatile struct ESCI_tag *) 0xFFFB0000) -#define ESCI_A_12_13 (*( volatile struct ESCI_12_13_bit_tag *) 0xFFFB0006) -#define ESCI_B (*( volatile struct ESCI_tag *) 0xFFFB4000) -#define ESCI_B_12_13 (*( volatile struct ESCI_12_13_bit_tag *) 0xFFFB4006) - -#define CAN_A (*( volatile struct FLEXCAN2_tag *) 0xFFFC0000) -#define CAN_C (*( volatile struct FLEXCAN2_tag *) 0xFFFC8000) - -#define TSENS (*( volatile struct TSENS_tag *) 0xFFFEC000) - -#ifdef __MWERKS__ -#pragma pop -#endif /* - */ - -#ifdef __cplusplus -} -#endif /* - */ - -#endif /* ifdef _MPC563M_H */ -/********************************************************************* - * - * Copyright: - * Freescale Semiconductor, INC. All Rights Reserved. - * You are hereby granted a copyright license to use, modify, and - * distribute the SOFTWARE so long as this entire notice is - * retained without alteration in any modified and/or redistributed - * versions, and that such modified versions are clearly identified - * as such. No licenses are granted by implication, estoppel or - * otherwise under any patents or trademarks of Freescale - * Semiconductor, Inc. This software is provided on an "AS IS" - * basis and without warranty. - * - * To the maximum extent permitted by applicable law, Freescale - * Semiconductor DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, - * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A - * PARTICULAR PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH - * REGARD TO THE SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) - * AND ANY ACCOMPANYING WRITTEN MATERIALS. - * - * To the maximum extent permitted by applicable law, IN NO EVENT - * SHALL Freescale Semiconductor BE LIABLE FOR ANY DAMAGES WHATSOEVER - * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, - * BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER - * PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. - * - * Freescale Semiconductor assumes no responsibility for the - * maintenance and support of this software - * - ********************************************************************/ - diff --git a/os/hal/platforms/SPC56x/platform.dox b/os/hal/platforms/SPC56x/platform.dox deleted file mode 100644 index 9b8eec901b..0000000000 --- a/os/hal/platforms/SPC56x/platform.dox +++ /dev/null @@ -1,70 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup SPC563 SPC563Mx Drivers - * @details This section describes all the supported drivers on the - * SPC563Mx/MPC563xM platform and the implementation details - * of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup SPC563_HAL SPC563Mx Initialization Support - * @details The SPC563Mx/MPC563xM HAL support is responsible for system - * initialization. - * - * @section spc563_hal_1 Supported HW resources - * - FMPLL. - * - INTC. - * - XBAR. - * - CFLASH0. - * . - * @section spc563_hal_2 SPC563Mx HAL driver implementation features - * - FMPLL startup and stabilization. - * - Clock tree initialization. - * - Clock source selection. - * - Flash wait states initialization based on the selected clock options. - * - SYSTICK initialization based on current clock and kernel required rate. - * - DMA support initialization. - * . - * @ingroup SPC563 - */ - -/** - * @defgroup SPC563_SERIAL SPC563Mx Serial Support - * @details The SPC563Mx/MPC563xM Serial driver uses the ESCI peripherals - * in a buffered, interrupt driven, implementation. - * - * @section spc563_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - ESCIA. - * - ESCIB. - * . - * @section spc563_serial_2 SPC563Mx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each ESCI can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable priority levels for each ESCI. - * . - * @ingroup SPC563 - */ diff --git a/os/hal/platforms/SPC56x/platform.mk b/os/hal/platforms/SPC56x/platform.mk deleted file mode 100644 index 6069e7dc68..0000000000 --- a/os/hal/platforms/SPC56x/platform.mk +++ /dev/null @@ -1,6 +0,0 @@ -# List of all the SPC56x platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/SPC56x/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/SPC56x/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/SPC56x diff --git a/os/hal/platforms/SPC56x/serial_lld.c b/os/hal/platforms/SPC56x/serial_lld.c deleted file mode 100644 index e562b6c2da..0000000000 --- a/os/hal/platforms/SPC56x/serial_lld.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC56x/serial_lld.c - * @brief SPC563 low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief eSCI-A serial driver identifier. - */ -#if USE_SPC563_ESCIA || defined(__DOXYGEN__) -SerialDriver SD1; -#endif - -/** - * @brief eSCI-B serial driver identifier. - */ -#if USE_SPC563_ESCIB || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief Driver default configuration. - */ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - SD_MODE_NORMAL | SD_MODE_PARITY_NONE -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief eSCI initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration - */ -static void esci_init(SerialDriver *sdp, const SerialConfig *config) { - volatile struct ESCI_tag *escip = sdp->escip; - uint8_t mode = config->sc_mode; - - escip->CR2.R = 0; /* MDIS off. */ - escip->CR1.R = 0; - escip->LCR.R = 0; - escip->CR1.B.SBR = SPC563_SYSCLK / (16 * config->sc_speed); - if (mode & SD_MODE_LOOPBACK) - escip->CR1.B.LOOPS = 1; - switch (mode & SD_MODE_PARITY) { - case SD_MODE_PARITY_ODD: - escip->CR1.B.PT = 1; - case SD_MODE_PARITY_EVEN: - escip->CR1.B.PE = 1; - escip->CR1.B.M = 1; /* Makes it 8 bits data + 1 bit parity. */ - default: - ; - } - escip->LPR.R = 0; - escip->CR1.R |= 0x0000002C; /* RIE, TE, RE to 1. */ - escip->CR2.R |= 0x000F; /* ORIE, NFIE, FEIE, PFIE to 1. */ -} - -/** - * @brief eSCI de-initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] escip pointer to an eSCI I/O block - */ -static void esci_deinit(volatile struct ESCI_tag *escip) { - - escip->LPR.R = 0; - escip->SR.R = 0xFFFFFFFF; - escip->CR1.R = 0; - escip->CR2.R = 0x8000; /* MDIS on. */ -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] sr eSCI SR register value - */ -static void set_error(SerialDriver *sdp, uint32_t sr) { - flagsmask_t sts = 0; - - if (sr & 0x08000000) - sts |= SD_OVERRUN_ERROR; - if (sr & 0x04000000) - sts |= SD_NOISE_ERROR; - if (sr & 0x02000000) - sts |= SD_FRAMING_ERROR; - if (sr & 0x01000000) - sts |= SD_PARITY_ERROR; -/* if (sr & 0x00000000) - sts |= SD_BREAK_DETECTED;*/ - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Common IRQ handler. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -static void serve_interrupt(SerialDriver *sdp) { - volatile struct ESCI_tag *escip = sdp->escip; - - uint32_t sr = escip->SR.R; - escip->SR.R = 0x3FFFFFFF; /* Does not clear TDRE | TC.*/ - if (sr & 0x0F000000) /* OR | NF | FE | PF. */ - set_error(sdp, sr); - if (sr & 0x20000000) { /* RDRF. */ - chSysLockFromIsr(); - sdIncomingDataI(sdp, escip->DR.B.D); - chSysUnlockFromIsr(); - } - if (escip->CR1.B.TIE && (sr & 0x80000000)) { /* TDRE. */ - msg_t b; - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - escip->CR1.B.TIE = 0; - } - else { - ESCI_A.SR.B.TDRE = 1; - escip->DR.R = (uint16_t)b; - } - chSysUnlockFromIsr(); - } -} - -#if USE_SPC563_ESCIA || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - if (ESCI_A.SR.B.TDRE) { - msg_t b = sdRequestDataI(&SD1); - if (b != Q_EMPTY) { - ESCI_A.SR.B.TDRE = 1; - ESCI_A.CR1.B.TIE = 1; - ESCI_A.DR.R = (uint16_t)b; - } - } -} -#endif - -#if USE_SPC563_ESCIB || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - if (ESCI_B.SR.B.TDRE) { - msg_t b = sdRequestDataI(&SD2); - if (b != Q_EMPTY) { - ESCI_B.SR.B.TDRE = 1; - ESCI_B.CR1.B.TIE = 1; - ESCI_B.DR.R = (uint16_t)b; - } - } -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if USE_SPC563_ESCIA || defined(__DOXYGEN__) -/** - * @brief eSCI-A interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(vector146) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if USE_SPC563_ESCIB || defined(__DOXYGEN__) -/** - * @brief eSCI-B interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(vector149) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD2); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if USE_SPC563_ESCIA - sdObjectInit(&SD1, NULL, notify1); - SD1.escip = &ESCI_A; - ESCI_A.CR2.R = 0x8000; /* MDIS ON. */ - INTC.PSR[146].R = SPC563_ESCIA_PRIORITY; -#endif - -#if USE_SPC563_ESCIB - sdObjectInit(&SD2, NULL, notify2); - SD2.escip = &ESCI_B; - ESCI_B.CR2.R = 0x8000; /* MDIS ON. */ - INTC.PSR[149].R = SPC563_ESCIB_PRIORITY; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - esci_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) - esci_deinit(sdp->escip); -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/SPC56x/serial_lld.h b/os/hal/platforms/SPC56x/serial_lld.h deleted file mode 100644 index b02b160b17..0000000000 --- a/os/hal/platforms/SPC56x/serial_lld.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC56x/serial_lld.h - * @brief SPC563 low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define SD_MODE_PARITY_MASK 0x03 /**< @brief Parity field mask. */ -#define SD_MODE_PARITY_NONE 0x00 /**< @brief No parity. */ -#define SD_MODE_PARITY_EVEN 0x01 /**< @brief Even parity. */ -#define SD_MODE_PARITY_ODD 0x02 /**< @brief Odd parity. */ - -#define SD_MODE_NORMAL 0x00 /**< @brief Normal operations. */ -#define SD_MODE_LOOPBACK 0x80 /**< @brief Internal loopback. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief eSCI-A driver enable switch. - * @details If set to @p TRUE the support for eSCI-A is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SPC563_ESCIA) || defined(__DOXYGEN__) -#define USE_SPC563_ESCIA TRUE -#endif - -/** - * @brief eSCI-B driver enable switch. - * @details If set to @p TRUE the support for eSCI-B is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_SPC563_ESCIB) || defined(__DOXYGEN__) -#define USE_SPC563_ESCIB TRUE -#endif - -/** - * @brief eSCI-A interrupt priority level setting. - */ -#if !defined(SPC563_ESCIA_PRIORITY) || defined(__DOXYGEN__) -#define SPC563_ESCIA_PRIORITY 8 -#endif - -/** - * @brief eSCI-B interrupt priority level setting. - */ -#if !defined(SPC563_ESCIB_PRIORITY) || defined(__DOXYGEN__) -#define SPC563_ESCIB_PRIORITY 8 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Generic Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t sc_speed; - /** - * @brief Mode flags. - */ - uint8_t sc_mode; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the volatile eSCI registers block.*/ \ - volatile struct ESCI_tag *escip; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_SPC563_ESCIA && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_SPC563_ESCIB && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/SPC56x/typedefs.h b/os/hal/platforms/SPC56x/typedefs.h deleted file mode 100644 index 5947e0f377..0000000000 --- a/os/hal/platforms/SPC56x/typedefs.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC56x/typedefs.h - * @brief Dummy typedefs file. - */ - -#ifndef _TYPEDEFS_H_ -#define _TYPEDEFS_H_ - -#include "chtypes.h" - -#endif /* _TYPEDEFS_H_ */ diff --git a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c b/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c deleted file mode 100644 index 92c1c1a1d4..0000000000 --- a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.c +++ /dev/null @@ -1,411 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC5xx/serial_lld.c - * @brief SPC5xx low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief LIINFlex-0 serial driver identifier. - */ -#if SPC5_SERIAL_USE_LINFLEX0 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif - -/** - * @brief LIINFlex-1 serial driver identifier. - */ -#if SPC5_SERIAL_USE_LINFLEX1 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/** - * @brief LIINFlex-2 serial driver identifier. - */ -#if SPC5_SERIAL_USE_LINFLEX2 || defined(__DOXYGEN__) -SerialDriver SD3; -#endif - -/** - * @brief LIINFlex-3 serial driver identifier. - */ -#if SPC5_SERIAL_USE_LINFLEX3 || defined(__DOXYGEN__) -SerialDriver SD4; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief Driver default configuration. - */ -static const SerialConfig default_config = { - SERIAL_DEFAULT_BITRATE, - SD_MODE_8BITS_PARITY_NONE -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief LINFlex initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration - */ -static void spc5_linflex_init(SerialDriver *sdp, const SerialConfig *config) { - uint32_t div; - volatile struct LINFLEX_tag *linflexp = sdp->linflexp; - - /* Enters the configuration mode.*/ - linflexp->LINCR1.R = 1; /* INIT bit. */ - - /* Configures the LINFlex in UART mode with all the required - parameters.*/ - linflexp->UARTCR.R = SPC5_UARTCR_UART; /* UART mode FIRST. */ - linflexp->UARTCR.R = SPC5_UARTCR_UART | SPC5_UARTCR_RXEN | config->mode; - div = halSPC560PGetSystemClock() / config->speed; - linflexp->LINFBRR.R = (uint16_t)(div & 15); /* Fractional divider. */ - linflexp->LINIBRR.R = (uint16_t)(div >> 4); /* Integer divider. */ - linflexp->UARTSR.R = 0xFFFF; /* Clearing UARTSR register.*/ - linflexp->LINIER.R = SPC5_LINIER_DTIE | SPC5_LINIER_DRIE | - SPC5_LINIER_BOIE | SPC5_LINIER_FEIE | - SPC5_LINIER_SZIE; /* Interrupts enabled. */ - - /* Leaves the configuration mode.*/ - linflexp->LINCR1.R = 0; -} - -/** - * @brief LINFlex de-initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] linflexp pointer to a LINFlex I/O block - */ -static void spc5_linflex_deinit(volatile struct LINFLEX_tag *linflexp) { - - /* Enters the configuration mode.*/ - linflexp->LINCR1.R = 1; /* INIT bit. */ - - /* Resets the LINFlex registers.*/ - linflexp->LINFBRR.R = 0; /* Fractional divider. */ - linflexp->LINIBRR.R = 0; /* Integer divider. */ - linflexp->UARTSR.R = 0xFFFF; /* Clearing UARTSR register.*/ - linflexp->UARTCR.R = SPC5_UARTCR_UART; - linflexp->LINIER.R = 0; /* Interrupts disabled. */ - - /* Leaves the configuration mode.*/ - linflexp->LINCR1.R = 0; -} - -/** - * @brief Common RXI IRQ handler. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -static void spc5xx_serve_rxi_interrupt(SerialDriver *sdp) { - flagsmask_t sts = 0; - uint16_t sr = sdp->linflexp->UARTSR.R; - - sdp->linflexp->UARTSR.R = SPC5_UARTSR_NF | SPC5_UARTSR_DRF | - SPC5_UARTSR_PE0; - if (sr & SPC5_UARTSR_NF) - sts |= SD_NOISE_ERROR; - if (sr & SPC5_UARTSR_PE0) - sts |= SD_PARITY_ERROR; - if (sts) { - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); - } - if (sr & SPC5_UARTSR_DRF) { - sdIncomingDataI(sdp, sdp->linflexp->BDRM.B.DATA4); - sdp->linflexp->UARTSR.R = SPC5_UARTSR_RMB; - } -} - -/** - * @brief Common TXI IRQ handler. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -static void spc5xx_serve_txi_interrupt(SerialDriver *sdp) { - msg_t b; - - sdp->linflexp->UARTSR.R = SPC5_UARTSR_DTF; - b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - sdp->linflexp->UARTCR.B.TXEN = 0; - } - else - sdp->linflexp->BDRL.B.DATA0 = b; -} - -/** - * @brief Common ERR IRQ handler. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -static void spc5xx_serve_err_interrupt(SerialDriver *sdp) { - flagsmask_t sts = 0; - uint16_t sr = sdp->linflexp->UARTSR.R; - - sdp->linflexp->UARTSR.R = SPC5_UARTSR_BOF | SPC5_UARTSR_FEF | - SPC5_UARTSR_SZF; - if (sr & SPC5_UARTSR_BOF) - sts |= SD_OVERRUN_ERROR; - if (sr & SPC5_UARTSR_FEF) - sts |= SD_FRAMING_ERROR; - if (sr & SPC5_UARTSR_SZF) - sts |= SD_BREAK_DETECTED; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -#if SPC5_SERIAL_USE_LINFLEX0 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - if (!SD1.linflexp->UARTCR.B.TXEN) { - msg_t b = sdRequestDataI(&SD1); - if (b != Q_EMPTY) { - SD1.linflexp->UARTCR.B.TXEN = 1; - SD1.linflexp->BDRL.B.DATA0 = b; - } - } -} -#endif - -#if SPC5_SERIAL_USE_LINFLEX1 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - if (!SD2.linflexp->UARTCR.B.TXEN) { - msg_t b = sdRequestDataI(&SD2); - if (b != Q_EMPTY) { - SD2.linflexp->UARTCR.B.TXEN = 1; - SD2.linflexp->BDRL.B.DATA0 = b; - } - } -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if SPC5_SERIAL_USE_LINFLEX0 || defined(__DOXYGEN__) -/** - * @brief LINFlex-0 RXI interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPC5_LINFLEX0_RXI_HANDLER) { - - CH_IRQ_PROLOGUE(); - - spc5xx_serve_rxi_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief LINFlex-0 TXI interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPC5_LINFLEX0_TXI_HANDLER) { - - CH_IRQ_PROLOGUE(); - - spc5xx_serve_txi_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief LINFlex-0 ERR interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPC5_LINFLEX0_ERR_HANDLER) { - - CH_IRQ_PROLOGUE(); - - spc5xx_serve_err_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if SPC5_SERIAL_USE_LINFLEX1 || defined(__DOXYGEN__) -/** - * @brief LINFlex-1 RXI interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPC5_LINFLEX1_RXI_HANDLER) { - - CH_IRQ_PROLOGUE(); - - spc5xx_serve_rxi_interrupt(&SD2); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief LINFlex-1 TXI interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPC5_LINFLEX1_TXI_HANDLER) { - - CH_IRQ_PROLOGUE(); - - spc5xx_serve_txi_interrupt(&SD2); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief LINFlex-1 ERR interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(SPC5_LINFLEX1_ERR_HANDLER) { - - CH_IRQ_PROLOGUE(); - - spc5xx_serve_err_interrupt(&SD2); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if SPC5_SERIAL_USE_LINFLEX0 - sdObjectInit(&SD1, NULL, notify1); - SD1.linflexp = &LINFLEX_0; - INTC.PSR[SPC5_LINFLEX0_RXI_NUMBER].R = SPC5_SERIAL_LINFLEX0_PRIORITY; - INTC.PSR[SPC5_LINFLEX0_TXI_NUMBER].R = SPC5_SERIAL_LINFLEX0_PRIORITY; - INTC.PSR[SPC5_LINFLEX0_ERR_NUMBER].R = SPC5_SERIAL_LINFLEX0_PRIORITY; -#endif - -#if SPC5_SERIAL_USE_LINFLEX1 - sdObjectInit(&SD2, NULL, notify2); - SD2.linflexp = &LINFLEX_1; - INTC.PSR[SPC5_LINFLEX1_RXI_NUMBER].R = SPC5_SERIAL_LINFLEX1_PRIORITY; - INTC.PSR[SPC5_LINFLEX1_TXI_NUMBER].R = SPC5_SERIAL_LINFLEX1_PRIORITY; - INTC.PSR[SPC5_LINFLEX1_ERR_NUMBER].R = SPC5_SERIAL_LINFLEX1_PRIORITY; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if SPC5_SERIAL_USE_LINFLEX0 - if (&SD1 == sdp) { - halSPC560PSetPeripheralClockMode(SPC5_LINFLEX0_PCTL, - SPC5_SERIAL_LINFLEX0_START_PCTL); - } -#endif -#if SPC5_SERIAL_USE_LINFLEX1 - if (&SD2 == sdp) { - halSPC560PSetPeripheralClockMode(SPC5_LINFLEX1_PCTL, - SPC5_SERIAL_LINFLEX1_START_PCTL); - } -#endif - } - spc5_linflex_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - spc5_linflex_deinit(sdp->linflexp); - -#if SPC5_SERIAL_USE_LINFLEX0 - if (&SD1 == sdp) { - halSPC560PSetPeripheralClockMode(SPC5_LINFLEX0_PCTL, - SPC5_SERIAL_LINFLEX0_STOP_PCTL); - return; - } -#endif -#if SPC5_SERIAL_USE_LINFLEX1 - if (&SD2 == sdp) { - halSPC560PSetPeripheralClockMode(SPC5_LINFLEX1_PCTL, - SPC5_SERIAL_LINFLEX1_STOP_PCTL); - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h b/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h deleted file mode 100644 index 8982566a98..0000000000 --- a/os/hal/platforms/SPC5xx/LINFlex_v1/serial_lld.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC5xx/serial_lld.h - * @brief SPC5xx low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name LINIER register bits definitions - * @{ - */ -#define SPC5_LINIER_HRIE (1U << 0) -#define SPC5_LINIER_DTIE (1U << 1) -#define SPC5_LINIER_DRIE (1U << 2) -#define SPC5_LINIER_DBEIE (1U << 3) -#define SPC5_LINIER_DBFIE (1U << 4) -#define SPC5_LINIER_WUIE (1U << 5) -#define SPC5_LINIER_LSIE (1U << 6) -#define SPC5_LINIER_BOIE (1U << 7) -#define SPC5_LINIER_FEIE (1U << 8) -#define SPC5_LINIER_HEIE (1U << 11) -#define SPC5_LINIER_CEIE (1U << 12) -#define SPC5_LINIER_BEIE (1U << 13) -#define SPC5_LINIER_OCIE (1U << 14) -#define SPC5_LINIER_SZIE (1U << 15) -/** @} */ - -/** - * @name UARTSR register bits definitions - * @{ - */ -#define SPC5_UARTSR_NF (1U << 0) -#define SPC5_UARTSR_DTF (1U << 1) -#define SPC5_UARTSR_DRF (1U << 2) -#define SPC5_UARTSR_WUF (1U << 5) -#define SPC5_UARTSR_RPS (1U << 6) -#define SPC5_UARTSR_BOF (1U << 7) -#define SPC5_UARTSR_FEF (1U << 8) -#define SPC5_UARTSR_RMB (1U << 9) -#define SPC5_UARTSR_PE0 (1U << 10) -#define SPC5_UARTSR_PE1 (1U << 11) -#define SPC5_UARTSR_PE2 (1U << 12) -#define SPC5_UARTSR_PE3 (1U << 13) -#define SPC5_UARTSR_OCF (1U << 14) -#define SPC5_UARTSR_SZF (1U << 15) -/** @} */ - -/** - * @name UARTCR register bits definitions - * @{ - */ -#define SPC5_UARTCR_UART (1U << 0) -#define SPC5_UARTCR_WL (1U << 1) -#define SPC5_UARTCR_PCE (1U << 2) -#define SPC5_UARTCR_OP (1U << 3) -#define SPC5_UARTCR_TXEN (1U << 4) -#define SPC5_UARTCR_RXEN (1U << 5) -/** @} */ - -/** - * @name Serial driver allowable modes - * @{ - */ -#define SD_MODE_8BITS_PARITY_NONE (SPC5_UARTCR_WL) -#define SD_MODE_8BITS_PARITY_EVEN (SPC5_UARTCR_WL | \ - SPC5_UARTCR_PCE) -#define SD_MODE_8BITS_PARITY_ODD (SPC5_UARTCR_WL | \ - SPC5_UARTCR_PCE | \ - SPC5_UARTCR_OP) -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief LINFlex-0 driver enable switch. - * @details If set to @p TRUE the support for LINFlex-0 is included. - */ -#if !defined(SPC5_SERIAL_USE_LINFLEX0) || defined(__DOXYGEN__) -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#endif - -/** - * @brief LINFlex-1 driver enable switch. - * @details If set to @p TRUE the support for LINFlex-1 is included. - */ -#if !defined(SPC5_SERIAL_USE_LINFLEX1) || defined(__DOXYGEN__) -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#endif - -/** - * @brief LINFlex-0 interrupt priority level setting. - */ -#if !defined(SPC5_SERIAL_LINFLEX0_PRIORITY) || defined(__DOXYGEN__) -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#endif - -/** - * @brief LINFlex-1 interrupt priority level setting. - */ -#if !defined(SPC5_SERIAL_LINFLEX1_PRIORITY) || defined(__DOXYGEN__) -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#endif - -/** - * @brief LINFlex-0 peripheral configuration when started. - * @note The default configuration is 1 (always run) in run mode and - * 2 (only halt) in low power mode. The defaults of the run modes - * are defined in @p hal_lld.h. - */ -#if !defined(SPC5_SERIAL_LINFLEX0_START_PCTL) || defined(__DOXYGEN__) -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#endif - -/** - * @brief LINFlex-0 peripheral configuration when stopped. - * @note The default configuration is 0 (never run) in run mode and - * 0 (never run) in low power mode. The defaults of the run modes - * are defined in @p hal_lld.h. - */ -#if !defined(SPC5_SERIAL_LINFLEX0_STOP_PCTL) || defined(__DOXYGEN__) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#endif - -/** - * @brief LINFlex-1 peripheral configuration when started. - * @note The default configuration is 1 (always run) in run mode and - * 2 (only halt) in low power mode. The defaults of the run modes - * are defined in @p hal_lld.h. - */ -#if !defined(SPC5_SERIAL_LINFLEX1_START_PCTL) || defined(__DOXYGEN__) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#endif - -/** - * @brief LINFlex-1 peripheral configuration when stopped. - * @note The default configuration is 0 (never run) in run mode and - * 0 (never run) in low power mode. The defaults of the run modes - * are defined in @p hal_lld.h. - */ -#if !defined(SPC5_SERIAL_LINFLEX1_STOP_PCTL) || defined(__DOXYGEN__) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if SPC5_SERIAL_USE_LINFLEX0 && !SPC5_HAS_LINFLEX0 -#error "LINFlex-0 not present in the selected device" -#endif - -#if SPC5_SERIAL_USE_LINFLEX1 && !SPC5_HAS_LINFLEX1 -#error "LINFlex-1 not present in the selected device" -#endif - -#if SPC5_SERIAL_USE_LINFLEX2 && !SPC5_HAS_LINFLEX2 -#error "LINFlex-2 not present in the selected device" -#endif - -#if SPC5_SERIAL_USE_LINFLEX3 && !SPC5_HAS_LINFLEX3 -#error "LINFlex-3 not present in the selected device" -#endif - -#if !SPC5_SERIAL_USE_LINFLEX0 && !SPC5_SERIAL_USE_LINFLEX1 && \ - !SPC5_SERIAL_USE_LINFLEX2 && !SPC5_SERIAL_USE_LINFLEX3 -#error "SERIAL driver activated but no LINFlex peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Generic Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t speed; - /** - * @brief Mode flags. - */ - uint8_t mode; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the volatile LINFlex registers block.*/ \ - volatile struct LINFLEX_tag *linflexp; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if SPC5_SERIAL_USE_LINFLEX0 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if SPC5_SERIAL_USE_LINFLEX1 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif -#if SPC5_SERIAL_USE_LINFLEX2 && !defined(__DOXYGEN__) -extern SerialDriver SD3; -#endif -#if SPC5_SERIAL_USE_LINFLEX3 && !defined(__DOXYGEN__) -extern SerialDriver SD4; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c b/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c deleted file mode 100644 index edb4934ba8..0000000000 --- a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC5xx/SIU_v1/pal_lld.c - * @brief SPC5xx SIU/SIUL low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief SPC5xx I/O ports configuration. - * - * @param[in] config the STM32 ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - unsigned i; - - /* Initialize PCR registers for undefined pads.*/ - for (i = 0; i < SPC5_SIU_NUM_PCRS; i++) - SIU.PCR[i].R = config->default_mode; - - /* Initialize PADSEL registers.*/ - for (i = 0; i < SPC5_SIU_NUM_PADSELS; i++) - SIU.PSMI[i].R = config->padsels[i]; - - /* Initialize PCR registers for defined pads.*/ - i = 0; - while (config->inits[i].pcr_value != 0) { - SIU.GPDO[config->inits[i].pcr_index].R = config->inits[i].gpdo_value; - SIU.PCR[config->inits[i].pcr_index].R = config->inits[i].pcr_value; - i++; - } -} - -/** - * @brief Reads a group of bits. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @return The group logical states. - * - * @notapi - */ -ioportmask_t _pal_lld_readgroup(ioportid_t port, - ioportmask_t mask, - uint_fast8_t offset) { - - (void)port; - (void)mask; - (void)offset; - return 0; -} - -/** - * @brief Writes a group of bits. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group width - * are masked. - * - * @notapi - */ -void _pal_lld_writegroup(ioportid_t port, - ioportmask_t mask, - uint_fast8_t offset, - ioportmask_t bits) { - - (void)port; - (void)mask; - (void)offset; - (void)bits; -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - unsigned pcr_index = (unsigned)(port * PAL_IOPORTS_WIDTH); - ioportmask_t m1 = 0x8000; - while (m1) { - if (mask & m1) - SIU.PCR[pcr_index].R = mode; - m1 >>= 1; - ++pcr_index; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h b/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h deleted file mode 100644 index ecdb5b1148..0000000000 --- a/os/hal/platforms/SPC5xx/SIUL_v1/pal_lld.h +++ /dev/null @@ -1,397 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC5xx/SIU_v1//pal_lld.h - * @brief SPC5xx SIU/SIUL low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_RESET -#undef PAL_MODE_UNCONNECTED -#undef PAL_MODE_INPUT -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_INPUT_ANALOG -#undef PAL_MODE_OUTPUT_PUSHPULL -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/** - * @name SIU/SIUL-specific PAL modes - * @{ - */ -#define PAL_SPC5_SMC (1U << 14) -#define PAL_SPC5_APC (1U << 13) -#define PAL_SPC5_PA_MASK (3U << 10) -#define PAL_SPC5_PA(n) ((n) << 10) -#define PAL_SPC5_OBE (1U << 9) -#define PAL_SPC5_IBE (1U << 8) -#define PAL_SPC5_ODE (1U << 5) -#define PAL_SPC5_SRC (1U << 2) -#define PAL_SPC5_WPE (1U << 1) -#define PAL_SPC5_WPS (1U << 0) -/** @} */ - -/** - * @name Pads mode constants - * @{ - */ -/** - * @brief After reset state. - */ -#define PAL_MODE_RESET 0 - -/** - * @brief Safe state for unconnected pads. - */ -#define PAL_MODE_UNCONNECTED (PAL_SPC5_WPE | PAL_SPC5_WPS) - -/** - * @brief Regular input high-Z pad. - */ -#define PAL_MODE_INPUT (PAL_SPC5_IBE) - -/** - * @brief Input pad with weak pull up resistor. - */ -#define PAL_MODE_INPUT_PULLUP (PAL_SPC5_IBE |PAL_SPC5_WPE | \ - PAL_SPC5_WPS) - -/** - * @brief Input pad with weak pull down resistor. - */ -#define PAL_MODE_INPUT_PULLDOWN (PAL_SPC5_IBE |PAL_SPC5_WPE) - -/** - * @brief Analog input mode. - */ -#define PAL_MODE_INPUT_ANALOG PAL_SPC5_APC - -/** - * @brief Push-pull output pad. - */ -#define PAL_MODE_OUTPUT_PUSHPULL (PAL_SPC5_IBE | PAL_SPC5_OBE) - -/** - * @brief Open-drain output pad. - */ -#define PAL_MODE_OUTPUT_OPENDRAIN (PAL_SPC5_IBE | PAL_SPC5_OBE | \ - PAL_SPC5_ODE) - -/** - * @brief Alternate "n" output pad. - */ -#define PAL_MODE_OUTPUT_ALTERNATE(n) (PAL_SPC5_IBE | PAL_SPC5_OBE | \ - PAL_SPC5_PA(n)) -/** @} */ - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 16 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint16_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint16_t iomode_t; - -/** - * @brief Port Identifier. - * @details This type can be a scalar or some kind of pointer, do not make - * any assumption about it, use the provided macros when populating - * variables of this type. - */ -typedef uint32_t ioportid_t; - -/** - * @brief SIU/SIUL register initializer type. - */ -typedef struct { - uint8_t pcr_index; - uint8_t gpdo_value; - iomode_t pcr_value; -} spc560p_siu_init_t; - -/** - * @brief Generic I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -typedef struct { - iomode_t default_mode; - const spc560p_siu_init_t *inits; - const uint8_t *padsels; -} PALConfig; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief I/O port 1 identifier. - */ -#define PA 0 - -/** - * @brief I/O port 2 identifier. - */ -#define PB 1 - -/** - * @brief I/O port 3 identifier. - */ -#define PC 2 - -/** - * @brief I/O port 4 identifier. - */ -#define PD 3 - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Port bit helper macro. - * @note Overrides the one in @p pal.h. - * - * @param[in] n bit position within the port - * - * @return The bit mask. - */ -#define PAL_PORT_BIT(n) ((ioportmask_t)(0x8000U >> (n))) - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -#if SPC5_SIU_SUPPORTS_PORTS || defined(__DOXYGEN__) -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) (((volatile uint16_t *)SIU.PGPDI)[port]) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) (((volatile uint16_t *)SIU.PGPDO)[port]) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) \ - (((volatile uint16_t *)SIU.PGPDO)[port] = (bits)) - -/** - * @brief Reads a group of bits. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @return The group logical states. - * - * @notapi - */ -#define pal_lld_readgroup(port, mask, offset) \ - _pal_lld_readgroup(port, mask, offset) - -/** - * @brief Writes a group of bits. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group width - * are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - _pal_lld_writegroup(port, mask, offset, bits) - -#endif /* SPC5_SIU_SUPPORTS_PORTS */ - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note Programming an unknown or unsupported mode is silently ignored. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Reads a logical state from an I/O pad. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @return The logical state. - * @retval PAL_LOW low logical state. - * @retval PAL_HIGH high logical state. - * - * @notapi - */ -#define pal_lld_readpad(port, pad) \ - (SIU.GPDI[((port) * 16) + (pad)].R) - -/** - * @brief Writes a logical state on an output pad. - * @note This function is not meant to be invoked directly by the - * application code. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) \ - (SIU.GPDO[((port) * 16) + (pad)].R = (bit)) - -/** - * @brief Sets a pad logical state to @p PAL_HIGH. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_setpad(port, pad) \ - (SIU.GPDO[((port) * 16) + (pad)].R = 1) - -/** - * @brief Clears a pad logical state to @p PAL_LOW. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * - * @notapi - */ -#define pal_lld_clearpad(port, pad) \ - (SIU.GPDO[((port) * 16) + (pad)].R = 0) - -/** - * @brief Pad mode setup. - * @details This function programs a pad with the specified mode. - * @note The @ref PAL provides a default software implementation of this - * functionality, implement this function if can optimize it by using - * special hardware functionalities or special coding. - * @note Programming an unknown or unsupported mode is silently ignored. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] mode pad mode - * - * @notapi - */ -#define pal_lld_setpadmode(port, pad, mode) - -extern const PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - ioportmask_t _pal_lld_readgroup(ioportid_t port, - ioportmask_t mask, - uint_fast8_t offset); - void _pal_lld_writegroup(ioportid_t port, - ioportmask_t mask, - uint_fast8_t offset, - ioportmask_t bits); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/GPIOv1/pal_lld.c b/os/hal/platforms/STM32/GPIOv1/pal_lld.c deleted file mode 100644 index dd71ef18c8..0000000000 --- a/os/hal/platforms/STM32/GPIOv1/pal_lld.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/GPIOv1/pal_lld.c - * @brief STM32F1xx GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -#if STM32_HAS_GPIOG -#define APB2_EN_MASK (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | \ - RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | \ - RCC_APB2ENR_IOPEEN | RCC_APB2ENR_IOPFEN | \ - RCC_APB2ENR_IOPGEN | RCC_APB2ENR_AFIOEN) -#elif STM32_HAS_GPIOE -#define APB2_EN_MASK (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | \ - RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | \ - RCC_APB2ENR_IOPEEN | RCC_APB2ENR_AFIOEN) -#else -#define APB2_EN_MASK (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | \ - RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | \ - RCC_APB2ENR_AFIOEN) -#endif - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief STM32 I/O ports configuration. - * @details Ports A-D(E, F, G) clocks enabled, AFIO clock enabled. - * - * @param[in] config the STM32 ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - /* - * Enables the GPIO related clocks. - */ - rccEnableAPB2(APB2_EN_MASK, FALSE); - - /* - * Initial GPIO setup. - */ - GPIOA->ODR = config->PAData.odr; - GPIOA->CRH = config->PAData.crh; - GPIOA->CRL = config->PAData.crl; - GPIOB->ODR = config->PBData.odr; - GPIOB->CRH = config->PBData.crh; - GPIOB->CRL = config->PBData.crl; - GPIOC->ODR = config->PCData.odr; - GPIOC->CRH = config->PCData.crh; - GPIOC->CRL = config->PCData.crl; - GPIOD->ODR = config->PDData.odr; - GPIOD->CRH = config->PDData.crh; - GPIOD->CRL = config->PDData.crl; -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - GPIOE->ODR = config->PEData.odr; - GPIOE->CRH = config->PEData.crh; - GPIOE->CRL = config->PEData.crl; -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - GPIOF->ODR = config->PFData.odr; - GPIOF->CRH = config->PFData.crh; - GPIOF->CRL = config->PFData.crl; -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - GPIOG->ODR = config->PGData.odr; - GPIOG->CRH = config->PGData.crh; - GPIOG->CRL = config->PGData.crl; -#endif -#endif -#endif -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output at 2MHz. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - static const uint8_t cfgtab[] = { - 4, /* PAL_MODE_RESET, implemented as input.*/ - 2, /* PAL_MODE_UNCONNECTED, implemented as push pull output 2MHz.*/ - 4, /* PAL_MODE_INPUT */ - 8, /* PAL_MODE_INPUT_PULLUP */ - 8, /* PAL_MODE_INPUT_PULLDOWN */ - 0, /* PAL_MODE_INPUT_ANALOG */ - 3, /* PAL_MODE_OUTPUT_PUSHPULL, 50MHz.*/ - 7, /* PAL_MODE_OUTPUT_OPENDRAIN, 50MHz.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 8, /* Reserved.*/ - 0xB, /* PAL_MODE_STM32_ALTERNATE_PUSHPULL, 50MHz.*/ - 0xF, /* PAL_MODE_STM32_ALTERNATE_OPENDRAIN, 50MHz.*/ - }; - uint32_t mh, ml, crh, crl, cfg; - unsigned i; - - if (mode == PAL_MODE_INPUT_PULLUP) - port->BSRR = mask; - else if (mode == PAL_MODE_INPUT_PULLDOWN) - port->BRR = mask; - cfg = cfgtab[mode]; - mh = ml = crh = crl = 0; - for (i = 0; i < 8; i++) { - ml <<= 4; - mh <<= 4; - crl <<= 4; - crh <<= 4; - if ((mask & 0x0080) == 0) - ml |= 0xf; - else - crl |= cfg; - if ((mask & 0x8000) == 0) - mh |= 0xf; - else - crh |= cfg; - mask <<= 1; - } - port->CRH = (port->CRH & mh) | crh; - port->CRL = (port->CRL & ml) | crl; -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/STM32/GPIOv1/pal_lld.h b/os/hal/platforms/STM32/GPIOv1/pal_lld.h deleted file mode 100644 index 0aa9b862e0..0000000000 --- a/os/hal/platforms/STM32/GPIOv1/pal_lld.h +++ /dev/null @@ -1,338 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/GPIOv1/pal_lld.h - * @brief STM32F1xx GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -/** - * @name STM32-specific I/O mode flags - * @{ - */ -/** - * @brief STM32 specific alternate push-pull output mode. - */ -#define PAL_MODE_STM32_ALTERNATE_PUSHPULL 16 - -/** - * @brief STM32 specific alternate open-drain output mode. - */ -#define PAL_MODE_STM32_ALTERNATE_OPENDRAIN 17 -/** @} */ - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief GPIO port setup info. - */ -typedef struct { - /** Initial value for ODR register.*/ - uint32_t odr; - /** Initial value for CRL register.*/ - uint32_t crl; - /** Initial value for CRH register.*/ - uint32_t crh; -} stm32_gpio_setup_t; - -/** - * @brief STM32 GPIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialize the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { - /** @brief Port A setup data.*/ - stm32_gpio_setup_t PAData; - /** @brief Port B setup data.*/ - stm32_gpio_setup_t PBData; - /** @brief Port C setup data.*/ - stm32_gpio_setup_t PCData; - /** @brief Port D setup data.*/ - stm32_gpio_setup_t PDData; -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) - /** @brief Port E setup data.*/ - stm32_gpio_setup_t PEData; -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) - /** @brief Port F setup data.*/ - stm32_gpio_setup_t PFData; -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) - /** @brief Port G setup data.*/ - stm32_gpio_setup_t PGData; -#endif -#endif -#endif -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 16 - -/** - * @brief Whole port mask. - * @details This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - * @details This type can be a scalar or some kind of pointer, do not make - * any assumption about it, use the provided macros when populating - * variables of this type. - */ -typedef GPIO_TypeDef * ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/* The low level driver wraps the definitions already present in the STM32 */ -/* firmware library. */ -/*===========================================================================*/ - -/** - * @brief GPIO port A identifier. - */ -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) -#define IOPORT1 GPIOA -#endif - -/** - * @brief GPIO port B identifier. - */ -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) -#define IOPORT2 GPIOB -#endif - -/** - * @brief GPIO port C identifier. - */ -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) -#define IOPORT3 GPIOC -#endif - -/** - * @brief GPIO port D identifier. - */ -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) -#define IOPORT4 GPIOD -#endif - -/** - * @brief GPIO port E identifier. - */ -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) -#define IOPORT5 GPIOE -#endif - -/** - * @brief GPIO port F identifier. - */ -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) -#define IOPORT6 GPIOF -#endif - -/** - * @brief GPIO port G identifier. - */ -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) -#define IOPORT7 GPIOG -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief GPIO ports subsystem initialization. - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads an I/O port. - * @details This function is implemented by reading the GPIO IDR register, the - * implementation has no side effects. - * @note This function is not meant to be invoked directly by the application - * code. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->IDR) - -/** - * @brief Reads the output latch. - * @details This function is implemented by reading the GPIO ODR register, the - * implementation has no side effects. - * @note This function is not meant to be invoked directly by the application - * code. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->ODR) - -/** - * @brief Writes on a I/O port. - * @details This function is implemented by writing the GPIO ODR register, the - * implementation has no side effects. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->ODR = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @details This function is implemented by writing the GPIO BSRR register, the - * implementation has no side effects. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) ((port)->BSRR = (bits)) - -/** - * @brief Clears a bits mask on a I/O port. - * @details This function is implemented by writing the GPIO BRR register, the - * implementation has no side effects. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) ((port)->BRR = (bits)) - -/** - * @brief Writes a group of bits. - * @details This function is implemented by writing the GPIO BSRR register, the - * implementation has no side effects. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset the group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group - * width are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - ((port)->BSRR = ((~(bits) & (mask)) << (16 + (offset))) | \ - (((bits) & (mask)) << (offset))) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Writes a logical state on an output pad. - * @note Writing on pads programmed as pull-up or pull-down has the side - * effect to modify the resistor setting because the output latched - * data is used for the resistor selection. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) pal_lld_writegroup(port, 1, pad, bit) - -extern const PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/GPIOv2/pal_lld.c b/os/hal/platforms/STM32/GPIOv2/pal_lld.c deleted file mode 100644 index 4fa4a21943..0000000000 --- a/os/hal/platforms/STM32/GPIOv2/pal_lld.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/GPIOv2/pal_lld.c - * @brief STM32L1xx/STM32F2xx/STM32F4xx GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -#if defined(STM32L1XX_MD) -#define AHB_EN_MASK (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | \ - RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN | \ - RCC_AHBENR_GPIOEEN | RCC_AHBENR_GPIOHEN) -#define AHB_LPEN_MASK AHB_EN_MASK -#elif defined(STM32F0XX) -#define AHB_EN_MASK (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | \ - RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN | \ - RCC_AHBENR_GPIOFEN) -#elif defined(STM32F2XX) -#define AHB1_EN_MASK (RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | \ - RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN | \ - RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN | \ - RCC_AHB1ENR_GPIOGEN | RCC_AHB1ENR_GPIOHEN | \ - RCC_AHB1ENR_GPIOIEN) -#define AHB1_LPEN_MASK AHB1_EN_MASK -#elif defined(STM32F4XX) -#define AHB1_EN_MASK (RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | \ - RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN | \ - RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN | \ - RCC_AHB1ENR_GPIOGEN | RCC_AHB1ENR_GPIOHEN | \ - RCC_AHB1ENR_GPIOIEN) -#define AHB1_LPEN_MASK AHB1_EN_MASK -#else -#error "missing or unsupported platform for GPIOv2 PAL driver" -#endif - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void initgpio(GPIO_TypeDef *gpiop, const stm32_gpio_setup_t *config) { - - gpiop->OTYPER = config->otyper; - gpiop->OSPEEDR = config->ospeedr; - gpiop->PUPDR = config->pupdr; - gpiop->ODR = config->odr; - gpiop->AFRL = config->afrl; - gpiop->AFRH = config->afrh; - gpiop->MODER = config->moder; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief STM32 I/O ports configuration. - * @details Ports A-D(E, F, G, H) clocks enabled. - * - * @param[in] config the STM32 ports configuration - * - * @notapi - */ -void _pal_lld_init(const PALConfig *config) { - - /* - * Enables the GPIO related clocks. - */ -#if defined(STM32L1XX_MD) - rccEnableAHB(AHB_EN_MASK, TRUE); - RCC->AHBLPENR |= AHB_LPEN_MASK; -#elif defined(STM32F0XX) - rccEnableAHB(AHB_EN_MASK, TRUE); -#elif defined(STM32F2XX) || defined(STM32F4XX) - RCC->AHB1ENR |= AHB1_EN_MASK; - RCC->AHB1LPENR |= AHB1_LPEN_MASK; -#endif - - /* - * Initial GPIO setup. - */ - initgpio(GPIOA, &config->PAData); - initgpio(GPIOB, &config->PBData); - initgpio(GPIOC, &config->PCData); - initgpio(GPIOD, &config->PDData); -#if STM32_HAS_GPIOE - initgpio(GPIOE, &config->PEData); -#endif -#if STM32_HAS_GPIOF - initgpio(GPIOF, &config->PFData); -#endif -#if STM32_HAS_GPIOG - initgpio(GPIOG, &config->PGData); -#endif -#if STM32_HAS_GPIOH - initgpio(GPIOH, &config->PHData); -#endif -#if STM32_HAS_GPIOI - initgpio(GPIOI, &config->PIData); -#endif -} - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull at minimum - * speed. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -#if 1 -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - uint32_t moder = (mode & PAL_STM32_MODE_MASK) >> 0; - uint32_t otyper = (mode & PAL_STM32_OTYPE_MASK) >> 2; - uint32_t ospeedr = (mode & PAL_STM32_OSPEED_MASK) >> 3; - uint32_t pupdr = (mode & PAL_STM32_PUDR_MASK) >> 5; - uint32_t altr = (mode & PAL_STM32_ALTERNATE_MASK) >> 7; - uint32_t bit = 0; - while (TRUE) { - if ((mask & 1) != 0) { - uint32_t altrmask, m1, m2, m4; - - altrmask = altr << ((bit & 7) * 4); - m4 = 15 << ((bit & 7) * 4); - if (bit < 8) - port->AFRL = (port->AFRL & ~m4) | altrmask; - else - port->AFRH = (port->AFRH & ~m4) | altrmask; - m1 = 1 << bit; - port->OTYPER = (port->OTYPER & ~m1) | otyper; - m2 = 3 << (bit * 2); - port->OSPEEDR = (port->OSPEEDR & ~m2) | ospeedr; - port->PUPDR = (port->PUPDR & ~m2) | pupdr; - port->MODER = (port->MODER & ~m2) | moder; - } - mask >>= 1; - if (!mask) - return; - otyper <<= 1; - ospeedr <<= 2; - pupdr <<= 2; - moder <<= 2; - bit++; - } -} -#else -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - uint32_t afrm, moderm, pupdrm, otyperm, ospeedrm; - uint32_t m1 = (uint32_t)mask; - uint32_t m2 = 0; - uint32_t m4l = 0; - uint32_t m4h = 0; - uint32_t bit = 0; - do { - if ((mask & 1) != 0) { - m2 |= 3 << bit; - if (bit < 16) - m4l |= 15 << ((bit & 14) * 2); - else - m4h |= 15 << ((bit & 14) * 2); - } - bit += 2; - mask >>= 1; - } while (mask); - - afrm = ((mode & PAL_STM32_ALTERNATE_MASK) >> 7) * 0x1111; - port->AFRL = (port->AFRL & ~m4l) | (afrm & m4l); - port->AFRH = (port->AFRH & ~m4h) | (afrm & m4h); - - ospeedrm = ((mode & PAL_STM32_OSPEED_MASK) >> 3) * 0x5555; - port->OSPEEDR = (port->OSPEEDR & ~m2) | (ospeedrm & m2); - - otyperm = ((mode & PAL_STM32_OTYPE_MASK) >> 2) * 0xffff; - port->OTYPER = (port->OTYPER & ~m1) | (otyperm & m1); - - pupdrm = ((mode & PAL_STM32_PUDR_MASK) >> 5) * 0x5555; - port->PUPDR = (port->PUPDR & ~m2) | (pupdrm & m2); - - moderm = ((mode & PAL_STM32_MODE_MASK) >> 0) * 0x5555; - port->MODER = (port->MODER & ~m2) | (moderm & m2); -} -#endif - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/STM32/GPIOv2/pal_lld.h b/os/hal/platforms/STM32/GPIOv2/pal_lld.h deleted file mode 100644 index 4a1ffa5b57..0000000000 --- a/os/hal/platforms/STM32/GPIOv2/pal_lld.h +++ /dev/null @@ -1,453 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/GPIOv2/pal_lld.h - * @brief STM32L1xx/STM32F2xx/STM32F4xx GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_RESET -#undef PAL_MODE_UNCONNECTED -#undef PAL_MODE_INPUT -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_INPUT_ANALOG -#undef PAL_MODE_OUTPUT_PUSHPULL -#undef PAL_MODE_OUTPUT_OPENDRAIN - -/** - * @name STM32-specific I/O mode flags - * @{ - */ -#define PAL_STM32_MODE_MASK (3 << 0) -#define PAL_STM32_MODE_INPUT (0 << 0) -#define PAL_STM32_MODE_OUTPUT (1 << 0) -#define PAL_STM32_MODE_ALTERNATE (2 << 0) -#define PAL_STM32_MODE_ANALOG (3 << 0) - -#define PAL_STM32_OTYPE_MASK (1 << 2) -#define PAL_STM32_OTYPE_PUSHPULL (0 << 2) -#define PAL_STM32_OTYPE_OPENDRAIN (1 << 2) - -#define PAL_STM32_OSPEED_MASK (3 << 3) -#define PAL_STM32_OSPEED_LOWEST (0 << 3) -#define PAL_STM32_OSPEED_MID1 (1 << 3) -#define PAL_STM32_OSPEED_MID2 (2 << 3) -#define PAL_STM32_OSPEED_HIGHEST (3 << 3) - -#define PAL_STM32_PUDR_MASK (3 << 5) -#define PAL_STM32_PUDR_FLOATING (0 << 5) -#define PAL_STM32_PUDR_PULLUP (1 << 5) -#define PAL_STM32_PUDR_PULLDOWN (2 << 5) - -#define PAL_STM32_ALTERNATE_MASK (15 << 7) -#define PAL_STM32_ALTERNATE(n) ((n) << 7) - -/** - * @brief Alternate function. - * - * @param[in] n alternate function selector - */ -#define PAL_MODE_ALTERNATE(n) (PAL_STM32_MODE_ALTERNATE | \ - PAL_STM32_ALTERNATE(n)) -/** @} */ - -/** - * @name Standard I/O mode flags - * @{ - */ -/** - * @brief This mode is implemented as input. - */ -#define PAL_MODE_RESET PAL_STM32_MODE_INPUT - -/** - * @brief This mode is implemented as output. - */ -#define PAL_MODE_UNCONNECTED PAL_STM32_MODE_OUTPUT - -/** - * @brief Regular input high-Z pad. - */ -#define PAL_MODE_INPUT PAL_STM32_MODE_INPUT - -/** - * @brief Input pad with weak pull up resistor. - */ -#define PAL_MODE_INPUT_PULLUP (PAL_STM32_MODE_INPUT | \ - PAL_STM32_PUDR_PULLUP) - -/** - * @brief Input pad with weak pull down resistor. - */ -#define PAL_MODE_INPUT_PULLDOWN (PAL_STM32_MODE_INPUT | \ - PAL_STM32_PUDR_PULLDOWN) - -/** - * @brief Analog input mode. - */ -#define PAL_MODE_INPUT_ANALOG PAL_STM32_MODE_ANALOG - -/** - * @brief Push-pull output pad. - */ -#define PAL_MODE_OUTPUT_PUSHPULL (PAL_STM32_MODE_OUTPUT | \ - PAL_STM32_OTYPE_PUSHPULL) - -/** - * @brief Open-drain output pad. - */ -#define PAL_MODE_OUTPUT_OPENDRAIN (PAL_STM32_MODE_OUTPUT | \ - PAL_STM32_OTYPE_OPENDRAIN) -/** @} */ - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief STM32 GPIO registers block. - */ -typedef struct { - - volatile uint32_t MODER; - volatile uint32_t OTYPER; - volatile uint32_t OSPEEDR; - volatile uint32_t PUPDR; - volatile uint32_t IDR; - volatile uint32_t ODR; - volatile union { - uint32_t W; - struct { - uint16_t set; - uint16_t clear; - } H; - } BSRR; - volatile uint32_t LCKR; - volatile uint32_t AFRL; - volatile uint32_t AFRH; -} GPIO_TypeDef; - -/** - * @brief GPIO port setup info. - */ -typedef struct { - /** Initial value for MODER register.*/ - uint32_t moder; - /** Initial value for OTYPER register.*/ - uint32_t otyper; - /** Initial value for OSPEEDR register.*/ - uint32_t ospeedr; - /** Initial value for PUPDR register.*/ - uint32_t pupdr; - /** Initial value for ODR register.*/ - uint32_t odr; - /** Initial value for AFRL register.*/ - uint32_t afrl; - /** Initial value for AFRH register.*/ - uint32_t afrh; -} stm32_gpio_setup_t; - -/** - * @brief STM32 GPIO static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialize the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { - /** @brief Port A setup data.*/ - stm32_gpio_setup_t PAData; - /** @brief Port B setup data.*/ - stm32_gpio_setup_t PBData; - /** @brief Port C setup data.*/ - stm32_gpio_setup_t PCData; - /** @brief Port D setup data.*/ - stm32_gpio_setup_t PDData; -#if STM32_HAS_GPIOE - /** @brief Port E setup data.*/ - stm32_gpio_setup_t PEData; -#endif -#if STM32_HAS_GPIOF - /** @brief Port F setup data.*/ - stm32_gpio_setup_t PFData; -#endif -#if STM32_HAS_GPIOG - /** @brief Port G setup data.*/ - stm32_gpio_setup_t PGData; -#endif -#if STM32_HAS_GPIOH - /** @brief Port H setup data.*/ - stm32_gpio_setup_t PHData; -#endif -#if STM32_HAS_GPIOI - /** @brief Port I setup data.*/ - stm32_gpio_setup_t PIData; -#endif -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 16 - -/** - * @brief Whole port mask. - * @details This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - * @details This type can be a scalar or some kind of pointer, do not make - * any assumption about it, use the provided macros when populating - * variables of this type. - */ -typedef GPIO_TypeDef * ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/* The low level driver wraps the definitions already present in the STM32 */ -/* firmware library. */ -/*===========================================================================*/ - -/** - * @brief GPIO port A identifier. - */ -#if STM32_HAS_GPIOA || defined(__DOXYGEN__) -#define IOPORT1 GPIOA -#endif - -/** - * @brief GPIO port B identifier. - */ -#if STM32_HAS_GPIOB || defined(__DOXYGEN__) -#define IOPORT2 GPIOB -#endif - -/** - * @brief GPIO port C identifier. - */ -#if STM32_HAS_GPIOC || defined(__DOXYGEN__) -#define IOPORT3 GPIOC -#endif - -/** - * @brief GPIO port D identifier. - */ -#if STM32_HAS_GPIOD || defined(__DOXYGEN__) -#define IOPORT4 GPIOD -#endif - -/** - * @brief GPIO port E identifier. - */ -#if STM32_HAS_GPIOE || defined(__DOXYGEN__) -#define IOPORT5 GPIOE -#endif - -/** - * @brief GPIO port F identifier. - */ -#if STM32_HAS_GPIOF || defined(__DOXYGEN__) -#define IOPORT6 GPIOF -#endif - -/** - * @brief GPIO port G identifier. - */ -#if STM32_HAS_GPIOG || defined(__DOXYGEN__) -#define IOPORT7 GPIOG -#endif - -/** - * @brief GPIO port H identifier. - */ -#if STM32_HAS_GPIOH || defined(__DOXYGEN__) -#define IOPORT8 GPIOH -#endif - -/** - * @brief GPIO port I identifier. - */ -#if STM32_HAS_GPIOI || defined(__DOXYGEN__) -#define IOPORT9 GPIOI -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief GPIO ports subsystem initialization. - * - * @notapi - */ -#define pal_lld_init(config) _pal_lld_init(config) - -/** - * @brief Reads an I/O port. - * @details This function is implemented by reading the GPIO IDR register, the - * implementation has no side effects. - * @note This function is not meant to be invoked directly by the application - * code. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->IDR) - -/** - * @brief Reads the output latch. - * @details This function is implemented by reading the GPIO ODR register, the - * implementation has no side effects. - * @note This function is not meant to be invoked directly by the application - * code. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->ODR) - -/** - * @brief Writes on a I/O port. - * @details This function is implemented by writing the GPIO ODR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->ODR = (bits)) - -/** - * @brief Sets a bits mask on a I/O port. - * @details This function is implemented by writing the GPIO BSRR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be ORed on the specified port - * - * @notapi - */ -#define pal_lld_setport(port, bits) ((port)->BSRR.H.set = (uint16_t)(bits)) - -/** - * @brief Clears a bits mask on a I/O port. - * @details This function is implemented by writing the GPIO BSRR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] bits bits to be cleared on the specified port - * - * @notapi - */ -#define pal_lld_clearport(port, bits) ((port)->BSRR.H.clear = (uint16_t)(bits)) - -/** - * @brief Writes a group of bits. - * @details This function is implemented by writing the GPIO BSRR register, the - * implementation has no side effects. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset the group bit offset within the port - * @param[in] bits bits to be written. Values exceeding the group - * width are masked. - * - * @notapi - */ -#define pal_lld_writegroup(port, mask, offset, bits) \ - ((port)->BSRR.W = ((~(bits) & (mask)) << (16 + (offset))) | \ - (((bits) & (mask)) << (offset))) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -/** - * @brief Writes a logical state on an output pad. - * - * @param[in] port port identifier - * @param[in] pad pad number within the port - * @param[in] bit logical value, the value must be @p PAL_LOW or - * @p PAL_HIGH - * - * @notapi - */ -#define pal_lld_writepad(port, pad, bit) pal_lld_writegroup(port, 1, pad, bit) - -extern const PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_init(const PALConfig *config); - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/I2Cv1/i2c_lld.c b/os/hal/platforms/STM32/I2Cv1/i2c_lld.c deleted file mode 100644 index 873c11a51c..0000000000 --- a/os/hal/platforms/STM32/I2Cv1/i2c_lld.c +++ /dev/null @@ -1,894 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * @file STM32/i2c_lld.c - * @brief STM32 I2C subsystem low level driver source. - * - * @addtogroup I2C - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_I2C || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define I2C1_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_I2C_I2C1_RX_DMA_STREAM, \ - STM32_I2C1_RX_DMA_CHN) - -#define I2C1_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_I2C_I2C1_TX_DMA_STREAM, \ - STM32_I2C1_TX_DMA_CHN) - -#define I2C2_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_I2C_I2C2_RX_DMA_STREAM, \ - STM32_I2C2_RX_DMA_CHN) - -#define I2C2_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_I2C_I2C2_TX_DMA_STREAM, \ - STM32_I2C2_TX_DMA_CHN) - -#define I2C3_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_I2C_I2C3_RX_DMA_STREAM, \ - STM32_I2C3_RX_DMA_CHN) - -#define I2C3_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_I2C_I2C3_TX_DMA_STREAM, \ - STM32_I2C3_TX_DMA_CHN) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define I2C_EV5_MASTER_MODE_SELECT \ - ((uint32_t)(((I2C_SR2_MSL | I2C_SR2_BUSY) << 16) | I2C_SR1_SB)) -#define I2C_EV6_MASTER_TRA_MODE_SELECTED \ - ((uint32_t)(((I2C_SR2_MSL|I2C_SR2_BUSY|I2C_SR2_TRA) << 16) | \ - I2C_SR1_ADDR|I2C_SR1_TXE)) -#define I2C_EV6_MASTER_REC_MODE_SELECTED \ - ((uint32_t)(((I2C_SR2_MSL|I2C_SR2_BUSY)<< 16) | I2C_SR1_ADDR)) -#define I2C_EV8_2_MASTER_BYTE_TRANSMITTED \ - ((uint32_t)(((I2C_SR2_MSL | I2C_SR2_BUSY | I2C_SR2_TRA) << 16) | \ - I2C_SR1_BTF | I2C_SR1_TXE)) -#define I2C_EV_MASK 0x00FFFFFF - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief I2C1 driver identifier.*/ -#if STM32_I2C_USE_I2C1 || defined(__DOXYGEN__) -I2CDriver I2CD1; -#endif - -/** @brief I2C2 driver identifier.*/ -#if STM32_I2C_USE_I2C2 || defined(__DOXYGEN__) -I2CDriver I2CD2; -#endif - -/** @brief I2C3 driver identifier.*/ -#if STM32_I2C_USE_I2C3 || defined(__DOXYGEN__) -I2CDriver I2CD3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Wakes up the waiting thread. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] msg wakeup message - * - * @notapi - */ -#define wakeup_isr(i2cp, msg) { \ - chSysLockFromIsr(); \ - if ((i2cp)->thread != NULL) { \ - Thread *tp = (i2cp)->thread; \ - (i2cp)->thread = NULL; \ - tp->p_u.rdymsg = (msg); \ - chSchReadyI(tp); \ - } \ - chSysUnlockFromIsr(); \ -} - -/** - * @brief Aborts an I2C transaction. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_abort_operation(I2CDriver *i2cp) { - I2C_TypeDef *dp = i2cp->i2c; - - /* Stops the I2C peripheral.*/ - dp->CR1 = I2C_CR1_SWRST; - dp->CR1 = 0; - dp->CR2 = 0; - dp->SR1 = 0; - - /* Stops the associated DMA streams.*/ - dmaStreamDisable(i2cp->dmatx); - dmaStreamDisable(i2cp->dmarx); -} - -/** - * @brief Handling of stalled I2C transactions. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_safety_timeout(void *p) { - I2CDriver *i2cp = (I2CDriver *)p; - - chSysLockFromIsr(); - if (i2cp->thread) { - Thread *tp = i2cp->thread; - i2c_lld_abort_operation(i2cp); - i2cp->thread = NULL; - tp->p_u.rdymsg = RDY_TIMEOUT; - chSchReadyI(tp); - } - chSysUnlockFromIsr(); -} - -/** - * @brief Set clock speed. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_set_clock(I2CDriver *i2cp) { - I2C_TypeDef *dp = i2cp->i2c; - uint16_t regCCR, clock_div; - int32_t clock_speed = i2cp->config->clock_speed; - i2cdutycycle_t duty = i2cp->config->duty_cycle; - - chDbgCheck((i2cp != NULL) && (clock_speed > 0) && (clock_speed <= 4000000), - "i2c_lld_set_clock"); - - /* CR2 Configuration.*/ - dp->CR2 &= (uint16_t)~I2C_CR2_FREQ; - dp->CR2 |= (uint16_t)I2C_CLK_FREQ; - - /* CCR Configuration.*/ - regCCR = 0; - clock_div = I2C_CCR_CCR; - - if (clock_speed <= 100000) { - /* Configure clock_div in standard mode.*/ - chDbgAssert(duty == STD_DUTY_CYCLE, - "i2c_lld_set_clock(), #1", - "Invalid standard mode duty cycle"); - - /* Standard mode clock_div calculate: Tlow/Thigh = 1/1.*/ - chDbgAssert((STM32_PCLK1 % (clock_speed * 2)) == 0, - "i2c_lld_set_clock(), #2", - "PCLK1 must be divided without remainder"); - clock_div = (uint16_t)(STM32_PCLK1 / (clock_speed * 2)); - - chDbgAssert(clock_div >= 0x04, - "i2c_lld_set_clock(), #3", - "Clock divider less then 0x04 not allowed"); - regCCR |= (clock_div & I2C_CCR_CCR); - - /* Sets the Maximum Rise Time for standard mode.*/ - dp->TRISE = I2C_CLK_FREQ + 1; - } - else if (clock_speed <= 400000) { - /* Configure clock_div in fast mode.*/ - chDbgAssert((duty == FAST_DUTY_CYCLE_2) || (duty == FAST_DUTY_CYCLE_16_9), - "i2c_lld_set_clock(), #4", - "Invalid fast mode duty cycle"); - - if (duty == FAST_DUTY_CYCLE_2) { - /* Fast mode clock_div calculate: Tlow/Thigh = 2/1.*/ - chDbgAssert((STM32_PCLK1 % (clock_speed * 3)) == 0, - "i2c_lld_set_clock(), #5", - "PCLK1 must be divided without remainder"); - clock_div = (uint16_t)(STM32_PCLK1 / (clock_speed * 3)); - } - else if (duty == FAST_DUTY_CYCLE_16_9) { - /* Fast mode clock_div calculate: Tlow/Thigh = 16/9.*/ - chDbgAssert((STM32_PCLK1 % (clock_speed * 25)) == 0, - "i2c_lld_set_clock(), #6", - "PCLK1 must be divided without remainder"); - clock_div = (uint16_t)(STM32_PCLK1 / (clock_speed * 25)); - regCCR |= I2C_CCR_DUTY; - } - - chDbgAssert(clock_div >= 0x01, - "i2c_lld_set_clock(), #7", - "Clock divider less then 0x04 not allowed"); - regCCR |= (I2C_CCR_FS | (clock_div & I2C_CCR_CCR)); - - /* Sets the Maximum Rise Time for fast mode.*/ - dp->TRISE = (I2C_CLK_FREQ * 300 / 1000) + 1; - } - - chDbgAssert((clock_div <= I2C_CCR_CCR), - "i2c_lld_set_clock(), #8", "the selected clock is too low"); - - dp->CCR = regCCR; -} - -/** - * @brief Set operation mode of I2C hardware. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_set_opmode(I2CDriver *i2cp) { - I2C_TypeDef *dp = i2cp->i2c; - i2copmode_t opmode = i2cp->config->op_mode; - uint16_t regCR1; - - regCR1 = dp->CR1; - switch (opmode) { - case OPMODE_I2C: - regCR1 &= (uint16_t)~(I2C_CR1_SMBUS|I2C_CR1_SMBTYPE); - break; - case OPMODE_SMBUS_DEVICE: - regCR1 |= I2C_CR1_SMBUS; - regCR1 &= (uint16_t)~(I2C_CR1_SMBTYPE); - break; - case OPMODE_SMBUS_HOST: - regCR1 |= (I2C_CR1_SMBUS|I2C_CR1_SMBTYPE); - break; - } - dp->CR1 = regCR1; -} - -/** - * @brief I2C shared ISR code. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_serve_event_interrupt(I2CDriver *i2cp) { - I2C_TypeDef *dp = i2cp->i2c; - uint32_t regSR2 = dp->SR2; - uint32_t event = dp->SR1; - - /* Interrupts are disabled just before dmaStreamEnable() because there - is no need of interrupts until next transaction begin. All the work is - done by the DMA.*/ - switch (I2C_EV_MASK & (event | (regSR2 << 16))) { - case I2C_EV5_MASTER_MODE_SELECT: - dp->DR = i2cp->addr; - break; - case I2C_EV6_MASTER_REC_MODE_SELECTED: - dp->CR2 &= ~I2C_CR2_ITEVTEN; - dmaStreamEnable(i2cp->dmarx); - dp->CR2 |= I2C_CR2_LAST; /* Needed in receiver mode. */ - if (dmaStreamGetTransactionSize(i2cp->dmarx) < 2) - dp->CR1 &= ~I2C_CR1_ACK; - break; - case I2C_EV6_MASTER_TRA_MODE_SELECTED: - dp->CR2 &= ~I2C_CR2_ITEVTEN; - dmaStreamEnable(i2cp->dmatx); - break; - case I2C_EV8_2_MASTER_BYTE_TRANSMITTED: - /* Catches BTF event after the end of transmission.*/ - if (dmaStreamGetTransactionSize(i2cp->dmarx) > 0) { - /* Starts "read after write" operation, LSB = 1 -> receive.*/ - i2cp->addr |= 0x01; - dp->CR1 |= I2C_CR1_START | I2C_CR1_ACK; - return; - } - dp->CR2 &= ~I2C_CR2_ITEVTEN; - dp->CR1 |= I2C_CR1_STOP; - wakeup_isr(i2cp, RDY_OK); - break; - default: - break; - } - /* Clear ADDR flag. */ - if (event & (I2C_SR1_ADDR | I2C_SR1_ADD10)) - (void)dp->SR2; -} - -/** - * @brief DMA RX end IRQ handler. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] flags pre-shifted content of the ISR register - * - * @notapi - */ -static void i2c_lld_serve_rx_end_irq(I2CDriver *i2cp, uint32_t flags) { - I2C_TypeDef *dp = i2cp->i2c; - - /* DMA errors handling.*/ -#if defined(STM32_I2C_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_I2C_DMA_ERROR_HOOK(i2cp); - } -#else - (void)flags; -#endif - - dmaStreamDisable(i2cp->dmarx); - - dp->CR2 &= ~I2C_CR2_LAST; - dp->CR1 &= ~I2C_CR1_ACK; - dp->CR1 |= I2C_CR1_STOP; - wakeup_isr(i2cp, RDY_OK); -} - -/** - * @brief DMA TX end IRQ handler. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_serve_tx_end_irq(I2CDriver *i2cp, uint32_t flags) { - I2C_TypeDef *dp = i2cp->i2c; - - /* DMA errors handling.*/ -#if defined(STM32_I2C_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_I2C_DMA_ERROR_HOOK(i2cp); - } -#else - (void)flags; -#endif - - dmaStreamDisable(i2cp->dmatx); - /* Enables interrupts to catch BTF event meaning transmission part complete. - Interrupt handler will decide to generate STOP or to begin receiving part - of R/W transaction itself.*/ - dp->CR2 |= I2C_CR2_ITEVTEN; -} - -/** - * @brief I2C error handler. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -static void i2c_lld_serve_error_interrupt(I2CDriver *i2cp) { - I2C_TypeDef *dp = i2cp->i2c; - i2cflags_t errors; - - /* Clears interrupt flags just to be safe.*/ - chSysLockFromIsr(); - dmaStreamDisable(i2cp->dmatx); - dmaStreamDisable(i2cp->dmarx); - chSysUnlockFromIsr(); - - errors = I2CD_NO_ERROR; - - if (dp->SR1 & I2C_SR1_BERR) { /* Bus error. */ - dp->SR1 &= ~I2C_SR1_BERR; - errors |= I2CD_BUS_ERROR; - } - if (dp->SR1 & I2C_SR1_ARLO) { /* Arbitration lost. */ - dp->SR1 &= ~I2C_SR1_ARLO; - errors |= I2CD_ARBITRATION_LOST; - } - if (dp->SR1 & I2C_SR1_AF) { /* Acknowledge fail. */ - dp->SR1 &= ~I2C_SR1_AF; - dp->CR2 &= ~I2C_CR2_ITEVTEN; - dp->CR1 |= I2C_CR1_STOP; /* Setting stop bit. */ - errors |= I2CD_ACK_FAILURE; - } - if (dp->SR1 & I2C_SR1_OVR) { /* Overrun. */ - dp->SR1 &= ~I2C_SR1_OVR; - errors |= I2CD_OVERRUN; - } - if (dp->SR1 & I2C_SR1_PECERR) { /* PEC error. */ - dp->SR1 &= ~I2C_SR1_PECERR; - errors |= I2CD_PEC_ERROR; - } - if (dp->SR1 & I2C_SR1_TIMEOUT) { /* SMBus Timeout. */ - dp->SR1 &= ~I2C_SR1_TIMEOUT; - errors |= I2CD_TIMEOUT; - } - if (dp->SR1 & I2C_SR1_SMBALERT) { /* SMBus alert. */ - dp->SR1 &= ~I2C_SR1_SMBALERT; - errors |= I2CD_SMB_ALERT; - } - - /* If some error has been identified then sends wakes the waiting thread.*/ - if (errors != I2CD_NO_ERROR) { - i2cp->errors = errors; - wakeup_isr(i2cp, RDY_RESET); - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_I2C_USE_I2C1 || defined(__DOXYGEN__) -/** - * @brief I2C1 event interrupt handler. - * - * @notapi - */ -CH_IRQ_HANDLER(I2C1_EV_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - i2c_lld_serve_event_interrupt(&I2CD1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief I2C1 error interrupt handler. - */ -CH_IRQ_HANDLER(I2C1_ER_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - i2c_lld_serve_error_interrupt(&I2CD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_I2C_USE_I2C1 */ - -#if STM32_I2C_USE_I2C2 || defined(__DOXYGEN__) -/** - * @brief I2C2 event interrupt handler. - * - * @notapi - */ -CH_IRQ_HANDLER(I2C2_EV_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - i2c_lld_serve_event_interrupt(&I2CD2); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief I2C2 error interrupt handler. - * - * @notapi - */ -CH_IRQ_HANDLER(I2C2_ER_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - i2c_lld_serve_error_interrupt(&I2CD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_I2C_USE_I2C2 */ - -#if STM32_I2C_USE_I2C3 || defined(__DOXYGEN__) -/** - * @brief I2C3 event interrupt handler. - * - * @notapi - */ -CH_IRQ_HANDLER(I2C3_EV_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - i2c_lld_serve_event_interrupt(&I2CD3); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief I2C3 error interrupt handler. - * - * @notapi - */ -CH_IRQ_HANDLER(I2C3_ER_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - i2c_lld_serve_error_interrupt(&I2CD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_I2C_USE_I2C3 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level I2C driver initialization. - * - * @notapi - */ -void i2c_lld_init(void) { - -#if STM32_I2C_USE_I2C1 - i2cObjectInit(&I2CD1); - I2CD1.thread = NULL; - I2CD1.i2c = I2C1; - I2CD1.dmarx = STM32_DMA_STREAM(STM32_I2C_I2C1_RX_DMA_STREAM); - I2CD1.dmatx = STM32_DMA_STREAM(STM32_I2C_I2C1_TX_DMA_STREAM); -#endif /* STM32_I2C_USE_I2C1 */ - -#if STM32_I2C_USE_I2C2 - i2cObjectInit(&I2CD2); - I2CD2.thread = NULL; - I2CD2.i2c = I2C2; - I2CD2.dmarx = STM32_DMA_STREAM(STM32_I2C_I2C2_RX_DMA_STREAM); - I2CD2.dmatx = STM32_DMA_STREAM(STM32_I2C_I2C2_TX_DMA_STREAM); -#endif /* STM32_I2C_USE_I2C2 */ - -#if STM32_I2C_USE_I2C3 - i2cObjectInit(&I2CD3); - I2CD3.thread = NULL; - I2CD3.i2c = I2C3; - I2CD3.dmarx = STM32_DMA_STREAM(STM32_I2C_I2C3_RX_DMA_STREAM); - I2CD3.dmatx = STM32_DMA_STREAM(STM32_I2C_I2C3_TX_DMA_STREAM); -#endif /* STM32_I2C_USE_I2C3 */ -} - -/** - * @brief Configures and activates the I2C peripheral. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -void i2c_lld_start(I2CDriver *i2cp) { - I2C_TypeDef *dp = i2cp->i2c; - - i2cp->dmamode = STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_MSIZE_BYTE | - STM32_DMA_CR_MINC | STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE | - STM32_DMA_CR_TCIE; - - /* If in stopped state then enables the I2C and DMA clocks.*/ - if (i2cp->state == I2C_STOP) { - -#if STM32_I2C_USE_I2C1 - if (&I2CD1 == i2cp) { - bool_t b; - - rccResetI2C1(); - b = dmaStreamAllocate(i2cp->dmarx, - STM32_I2C_I2C1_IRQ_PRIORITY, - (stm32_dmaisr_t)i2c_lld_serve_rx_end_irq, - (void *)i2cp); - chDbgAssert(!b, "i2c_lld_start(), #1", "stream already allocated"); - b = dmaStreamAllocate(i2cp->dmatx, - STM32_I2C_I2C1_IRQ_PRIORITY, - (stm32_dmaisr_t)i2c_lld_serve_tx_end_irq, - (void *)i2cp); - chDbgAssert(!b, "i2c_lld_start(), #2", "stream already allocated"); - rccEnableI2C1(FALSE); - nvicEnableVector(I2C1_EV_IRQn, - CORTEX_PRIORITY_MASK(STM32_I2C_I2C1_IRQ_PRIORITY)); - nvicEnableVector(I2C1_ER_IRQn, - CORTEX_PRIORITY_MASK(STM32_I2C_I2C1_IRQ_PRIORITY)); - - i2cp->dmamode |= STM32_DMA_CR_CHSEL(I2C1_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_I2C_I2C1_DMA_PRIORITY); - } -#endif /* STM32_I2C_USE_I2C1 */ - -#if STM32_I2C_USE_I2C2 - if (&I2CD2 == i2cp) { - bool_t b; - - rccResetI2C2(); - b = dmaStreamAllocate(i2cp->dmarx, - STM32_I2C_I2C2_IRQ_PRIORITY, - (stm32_dmaisr_t)i2c_lld_serve_rx_end_irq, - (void *)i2cp); - chDbgAssert(!b, "i2c_lld_start(), #3", "stream already allocated"); - b = dmaStreamAllocate(i2cp->dmatx, - STM32_I2C_I2C2_IRQ_PRIORITY, - (stm32_dmaisr_t)i2c_lld_serve_tx_end_irq, - (void *)i2cp); - chDbgAssert(!b, "i2c_lld_start(), #4", "stream already allocated"); - rccEnableI2C2(FALSE); - nvicEnableVector(I2C2_EV_IRQn, - CORTEX_PRIORITY_MASK(STM32_I2C_I2C2_IRQ_PRIORITY)); - nvicEnableVector(I2C2_ER_IRQn, - CORTEX_PRIORITY_MASK(STM32_I2C_I2C2_IRQ_PRIORITY)); - - i2cp->dmamode |= STM32_DMA_CR_CHSEL(I2C2_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_I2C_I2C2_DMA_PRIORITY); - } -#endif /* STM32_I2C_USE_I2C2 */ - -#if STM32_I2C_USE_I2C3 - if (&I2CD3 == i2cp) { - bool_t b; - - rccResetI2C3(); - b = dmaStreamAllocate(i2cp->dmarx, - STM32_I2C_I2C3_IRQ_PRIORITY, - (stm32_dmaisr_t)i2c_lld_serve_rx_end_irq, - (void *)i2cp); - chDbgAssert(!b, "i2c_lld_start(), #5", "stream already allocated"); - b = dmaStreamAllocate(i2cp->dmatx, - STM32_I2C_I2C3_IRQ_PRIORITY, - (stm32_dmaisr_t)i2c_lld_serve_tx_end_irq, - (void *)i2cp); - chDbgAssert(!b, "i2c_lld_start(), #6", "stream already allocated"); - rccEnableI2C3(FALSE); - nvicEnableVector(I2C3_EV_IRQn, - CORTEX_PRIORITY_MASK(STM32_I2C_I2C3_IRQ_PRIORITY)); - nvicEnableVector(I2C3_ER_IRQn, - CORTEX_PRIORITY_MASK(STM32_I2C_I2C3_IRQ_PRIORITY)); - - i2cp->dmamode |= STM32_DMA_CR_CHSEL(I2C3_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_I2C_I2C3_DMA_PRIORITY); - } -#endif /* STM32_I2C_USE_I2C3 */ - } - - /* DMA streams mode preparation in advance.*/ - dmaStreamSetMode(i2cp->dmatx, i2cp->dmamode | STM32_DMA_CR_DIR_M2P); - dmaStreamSetMode(i2cp->dmarx, i2cp->dmamode | STM32_DMA_CR_DIR_P2M); - - /* I2C registers pointed by the DMA.*/ - dmaStreamSetPeripheral(i2cp->dmarx, &dp->DR); - dmaStreamSetPeripheral(i2cp->dmatx, &dp->DR); - - /* Reset i2c peripheral.*/ - dp->CR1 = I2C_CR1_SWRST; - dp->CR1 = 0; - dp->CR2 = I2C_CR2_ITERREN | I2C_CR2_DMAEN; - - /* Setup I2C parameters.*/ - i2c_lld_set_clock(i2cp); - i2c_lld_set_opmode(i2cp); - - /* Ready to go.*/ - dp->CR1 |= I2C_CR1_PE; -} - -/** - * @brief Deactivates the I2C peripheral. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -void i2c_lld_stop(I2CDriver *i2cp) { - - /* If not in stopped state then disables the I2C clock.*/ - if (i2cp->state != I2C_STOP) { - - /* I2C disable.*/ - i2c_lld_abort_operation(i2cp); - dmaStreamRelease(i2cp->dmatx); - dmaStreamRelease(i2cp->dmarx); - -#if STM32_I2C_USE_I2C1 - if (&I2CD1 == i2cp) { - nvicDisableVector(I2C1_EV_IRQn); - nvicDisableVector(I2C1_ER_IRQn); - rccDisableI2C1(FALSE); - } -#endif - -#if STM32_I2C_USE_I2C2 - if (&I2CD2 == i2cp) { - nvicDisableVector(I2C2_EV_IRQn); - nvicDisableVector(I2C2_ER_IRQn); - rccDisableI2C2(FALSE); - } -#endif - -#if STM32_I2C_USE_I2C3 - if (&I2CD3 == i2cp) { - nvicDisableVector(I2C3_EV_IRQn); - nvicDisableVector(I2C3_ER_IRQn); - rccDisableI2C3(FALSE); - } -#endif - } -} - -/** - * @brief Receives data via the I2C bus as master. - * @details Number of receiving bytes must be more than 1 on STM32F1x. This is - * hardware restriction. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] addr slave device address - * @param[out] rxbuf pointer to the receive buffer - * @param[in] rxbytes number of bytes to be received - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_INFINITE no timeout. - * . - * @return The operation status. - * @retval RDY_OK if the function succeeded. - * @retval RDY_RESET if one or more I2C errors occurred, the errors can - * be retrieved using @p i2cGetErrors(). - * @retval RDY_TIMEOUT if a timeout occurred before operation end. After a - * timeout the driver must be stopped and restarted - * because the bus is in an uncertain state. - * - * @notapi - */ -msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout) { - I2C_TypeDef *dp = i2cp->i2c; - VirtualTimer vt; - -#if defined(STM32F1XX_I2C) - chDbgCheck((rxbytes > 1), "i2c_lld_master_receive_timeout"); -#endif - - /* Global timeout for the whole operation.*/ - if (timeout != TIME_INFINITE) - chVTSetI(&vt, timeout, i2c_lld_safety_timeout, (void *)i2cp); - - /* Releases the lock from high level driver.*/ - chSysUnlock(); - - /* Initializes driver fields, LSB = 1 -> receive.*/ - i2cp->addr = (addr << 1) | 0x01; - i2cp->errors = 0; - - /* RX DMA setup.*/ - dmaStreamSetMemory0(i2cp->dmarx, rxbuf); - dmaStreamSetTransactionSize(i2cp->dmarx, rxbytes); - - /* Waits until BUSY flag is reset and the STOP from the previous operation - is completed, alternatively for a timeout condition.*/ - while ((dp->SR2 & I2C_SR2_BUSY) || (dp->CR1 & I2C_CR1_STOP)) { - chSysLock(); - if ((timeout != TIME_INFINITE) && !chVTIsArmedI(&vt)) - return RDY_TIMEOUT; - chSysUnlock(); - } - - /* This lock will be released in high level driver.*/ - chSysLock(); - - /* Atomic check on the timer in order to make sure that a timeout didn't - happen outside the critical zone.*/ - if ((timeout != TIME_INFINITE) && !chVTIsArmedI(&vt)) - return RDY_TIMEOUT; - - /* Starts the operation.*/ - dp->CR2 |= I2C_CR2_ITEVTEN; - dp->CR1 |= I2C_CR1_START | I2C_CR1_ACK; - - /* Waits for the operation completion or a timeout.*/ - i2cp->thread = chThdSelf(); - chSchGoSleepS(THD_STATE_SUSPENDED); - if ((timeout != TIME_INFINITE) && chVTIsArmedI(&vt)) - chVTResetI(&vt); - - return chThdSelf()->p_u.rdymsg; -} - -/** - * @brief Transmits data via the I2C bus as master. - * @details Number of receiving bytes must be 0 or more than 1 on STM32F1x. - * This is hardware restriction. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * @param[in] addr slave device address - * @param[in] txbuf pointer to the transmit buffer - * @param[in] txbytes number of bytes to be transmitted - * @param[out] rxbuf pointer to the receive buffer - * @param[in] rxbytes number of bytes to be received - * @param[in] timeout the number of ticks before the operation timeouts, - * the following special values are allowed: - * - @a TIME_INFINITE no timeout. - * . - * @return The operation status. - * @retval RDY_OK if the function succeeded. - * @retval RDY_RESET if one or more I2C errors occurred, the errors can - * be retrieved using @p i2cGetErrors(). - * @retval RDY_TIMEOUT if a timeout occurred before operation end. After a - * timeout the driver must be stopped and restarted - * because the bus is in an uncertain state. - * - * @notapi - */ -msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr, - const uint8_t *txbuf, size_t txbytes, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout) { - I2C_TypeDef *dp = i2cp->i2c; - VirtualTimer vt; - -#if defined(STM32F1XX_I2C) - chDbgCheck(((rxbytes == 0) || ((rxbytes > 1) && (rxbuf != NULL))), - "i2c_lld_master_transmit_timeout"); -#endif - - /* Global timeout for the whole operation.*/ - if (timeout != TIME_INFINITE) - chVTSetI(&vt, timeout, i2c_lld_safety_timeout, (void *)i2cp); - - /* Releases the lock from high level driver.*/ - chSysUnlock(); - - /* Initializes driver fields, LSB = 0 -> write.*/ - i2cp->addr = addr << 1; - i2cp->errors = 0; - - /* TX DMA setup.*/ - dmaStreamSetMemory0(i2cp->dmatx, txbuf); - dmaStreamSetTransactionSize(i2cp->dmatx, txbytes); - - /* RX DMA setup.*/ - dmaStreamSetMemory0(i2cp->dmarx, rxbuf); - dmaStreamSetTransactionSize(i2cp->dmarx, rxbytes); - - /* Waits until BUSY flag is reset and the STOP from the previous operation - is completed, alternatively for a timeout condition.*/ - while ((dp->SR2 & I2C_SR2_BUSY) || (dp->CR1 & I2C_CR1_STOP)) { - chSysLock(); - if ((timeout != TIME_INFINITE) && !chVTIsArmedI(&vt)) - return RDY_TIMEOUT; - chSysUnlock(); - } - - /* This lock will be released in high level driver.*/ - chSysLock(); - - /* Atomic check on the timer in order to make sure that a timeout didn't - happen outside the critical zone.*/ - if ((timeout != TIME_INFINITE) && !chVTIsArmedI(&vt)) - return RDY_TIMEOUT; - - /* Starts the operation.*/ - dp->CR2 |= I2C_CR2_ITEVTEN; - dp->CR1 |= I2C_CR1_START; - - /* Waits for the operation completion or a timeout.*/ - i2cp->thread = chThdSelf(); - chSchGoSleepS(THD_STATE_SUSPENDED); - if ((timeout != TIME_INFINITE) && chVTIsArmedI(&vt)) - chVTResetI(&vt); - - return chThdSelf()->p_u.rdymsg; -} - -#endif /* HAL_USE_I2C */ - -/** @} */ diff --git a/os/hal/platforms/STM32/I2Cv1/i2c_lld.h b/os/hal/platforms/STM32/I2Cv1/i2c_lld.h deleted file mode 100644 index 9b6a9c477f..0000000000 --- a/os/hal/platforms/STM32/I2Cv1/i2c_lld.h +++ /dev/null @@ -1,463 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * @file STM32/i2c_lld.h - * @brief STM32 I2C subsystem low level driver header. - * - * @addtogroup I2C - * @{ - */ - -#ifndef _I2C_LLD_H_ -#define _I2C_LLD_H_ - -#if HAL_USE_I2C || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Peripheral clock frequency. - */ -#define I2C_CLK_FREQ ((STM32_PCLK1) / 1000000) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief I2C1 driver enable switch. - * @details If set to @p TRUE the support for I2C1 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_I2C_USE_I2C1) || defined(__DOXYGEN__) -#define STM32_I2C_USE_I2C1 FALSE -#endif - -/** - * @brief I2C2 driver enable switch. - * @details If set to @p TRUE the support for I2C2 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_I2C_USE_I2C2) || defined(__DOXYGEN__) -#define STM32_I2C_USE_I2C2 FALSE -#endif - -/** - * @brief I2C3 driver enable switch. - * @details If set to @p TRUE the support for I2C3 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_I2C_USE_I2C3) || defined(__DOXYGEN__) -#define STM32_I2C_USE_I2C3 FALSE -#endif - -/** - * @brief I2C1 interrupt priority level setting. - */ -#if !defined(STM32_I2C_I2C1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#endif - -/** - * @brief I2C2 interrupt priority level setting. - */ -#if !defined(STM32_I2C_I2C2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#endif - -/** - * @brief I2C3 interrupt priority level setting. - */ -#if !defined(STM32_I2C_I2C3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2C_I2C3_IRQ_PRIORITY 10 -#endif - -/** -* @brief I2C1 DMA priority (0..3|lowest..highest). -* @note The priority level is used for both the TX and RX DMA streams but -* because of the streams ordering the RX stream has always priority -* over the TX stream. -*/ -#if !defined(STM32_I2C_I2C1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#endif - -/** -* @brief I2C2 DMA priority (0..3|lowest..highest). -* @note The priority level is used for both the TX and RX DMA streams but -* because of the streams ordering the RX stream has always priority -* over the TX stream. -*/ -#if !defined(STM32_I2C_I2C2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#endif - -/** -* @brief I2C3 DMA priority (0..3|lowest..highest). -* @note The priority level is used for both the TX and RX DMA streams but -* because of the streams ordering the RX stream has always priority -* over the TX stream. -*/ -#if !defined(STM32_I2C_I2C3_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2C_I2C3_DMA_PRIORITY 1 -#endif - -/** - * @brief I2C DMA error hook. - * @note The default action for DMA errors is a system halt because DMA - * error can only happen because programming errors. - */ -#if !defined(STM32_I2C_DMA_ERROR_HOOK) || defined(__DOXYGEN__) -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() -#endif - -#if STM32_ADVANCED_DMA || defined(__DOXYGEN__) - -/** - * @brief DMA stream used for I2C1 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2C_I2C1_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#endif - -/** - * @brief DMA stream used for I2C1 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2C_I2C1_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#endif - -/** - * @brief DMA stream used for I2C2 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2C_I2C2_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#endif - -/** - * @brief DMA stream used for I2C2 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2C_I2C2_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#endif - -/** - * @brief DMA stream used for I2C3 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2C_I2C3_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#endif - -/** - * @brief DMA stream used for I2C3 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2C_I2C3_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#endif - -#else /* !STM32_ADVANCED_DMA */ - -/* Fixed streams for platforms using the old DMA peripheral, the values are - valid for both STM32F1xx and STM32L1xx.*/ -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) - -#endif /* !STM32_ADVANCED_DMA*/ - -/* Flag for the whole STM32F1XX family. */ -#if defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_LD) || defined(STM32F10X_MD) || \ - defined(STM32F10X_HD) || defined(STM32F10X_XL) || \ - defined(STM32F10X_CL) -#define STM32F1XX_I2C -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/** @brief error checks */ -#if STM32_I2C_USE_I2C1 && !STM32_HAS_I2C1 -#error "I2C1 not present in the selected device" -#endif - -#if STM32_I2C_USE_I2C2 && !STM32_HAS_I2C2 -#error "I2C2 not present in the selected device" -#endif - -#if STM32_I2C_USE_I2C3 && !STM32_HAS_I2C3 -#error "I2C3 not present in the selected device" -#endif - -#if !STM32_I2C_USE_I2C1 && !STM32_I2C_USE_I2C2 && \ - !STM32_I2C_USE_I2C3 -#error "I2C driver activated but no I2C peripheral assigned" -#endif - -#if STM32_I2C_USE_I2C1 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2C_I2C1_RX_DMA_STREAM, \ - STM32_I2C1_RX_DMA_MSK) -#error "invalid DMA stream associated to I2C1 RX" -#endif - -#if STM32_I2C_USE_I2C1 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2C_I2C1_TX_DMA_STREAM, \ - STM32_I2C1_TX_DMA_MSK) -#error "invalid DMA stream associated to I2C1 TX" -#endif - -#if STM32_I2C_USE_I2C2 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2C_I2C2_RX_DMA_STREAM, \ - STM32_I2C2_RX_DMA_MSK) -#error "invalid DMA stream associated to I2C2 RX" -#endif - -#if STM32_I2C_USE_I2C2 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2C_I2C2_TX_DMA_STREAM, \ - STM32_I2C2_TX_DMA_MSK) -#error "invalid DMA stream associated to I2C2 TX" -#endif - -#if STM32_I2C_USE_I2C3 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2C_I2C3_RX_DMA_STREAM, \ - STM32_I2C3_RX_DMA_MSK) -#error "invalid DMA stream associated to I2C3 RX" -#endif - -#if STM32_I2C_USE_I2C3 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2C_I2C3_TX_DMA_STREAM, \ - STM32_I2C3_TX_DMA_MSK) -#error "invalid DMA stream associated to I2C3 TX" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/* Check clock range. */ -#if defined(STM32F4XX) -#if !(I2C_CLK_FREQ >= 2) && (I2C_CLK_FREQ <= 42) -#error "I2C peripheral clock frequency out of range." -#endif - -#elif defined(STM32L1XX_MD) -#if !(I2C_CLK_FREQ >= 2) && (I2C_CLK_FREQ <= 32) -#error "I2C peripheral clock frequency out of range." -#endif - -#elif defined(STM32F2XX) -#if !(I2C_CLK_FREQ >= 2) && (I2C_CLK_FREQ <= 30) -#error "I2C peripheral clock frequency out of range." -#endif - -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) -#if !(I2C_CLK_FREQ >= 2) && (I2C_CLK_FREQ <= 24) -#error "I2C peripheral clock frequency out of range." -#endif - -#elif defined(STM32F10X_LD) || defined(STM32F10X_MD) || \ - defined(STM32F10X_HD) || defined(STM32F10X_XL) || \ - defined(STM32F10X_CL) -#if !(I2C_CLK_FREQ >= 2) && (I2C_CLK_FREQ <= 36) -#error "I2C peripheral clock frequency out of range." -#endif -#else -#error "unspecified, unsupported or invalid STM32 platform" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type representing I2C address. - */ -typedef uint16_t i2caddr_t; - -/** - * @brief I2C Driver condition flags type. - */ -typedef uint32_t i2cflags_t; - -/** - * @brief Supported modes for the I2C bus. - */ -typedef enum { - OPMODE_I2C = 1, - OPMODE_SMBUS_DEVICE = 2, - OPMODE_SMBUS_HOST = 3, -} i2copmode_t; - -/** - * @brief Supported duty cycle modes for the I2C bus. - */ -typedef enum { - STD_DUTY_CYCLE = 1, - FAST_DUTY_CYCLE_2 = 2, - FAST_DUTY_CYCLE_16_9 = 3, -} i2cdutycycle_t; - -/** - * @brief Driver configuration structure. - */ -typedef struct { - i2copmode_t op_mode; /**< @brief Specifies the I2C mode. */ - uint32_t clock_speed; /**< @brief Specifies the clock frequency. - @note Must be set to a value lower - than 400kHz. */ - i2cdutycycle_t duty_cycle; /**< @brief Specifies the I2C fast mode - duty cycle. */ -} I2CConfig; - -/** - * @brief Type of a structure representing an I2C driver. - */ -typedef struct I2CDriver I2CDriver; - -/** - * @brief Structure representing an I2C driver. - */ -struct I2CDriver{ - /** - * @brief Driver state. - */ - i2cstate_t state; - /** - * @brief Current configuration data. - */ - const I2CConfig *config; - /** - * @brief Error flags. - */ - i2cflags_t errors; -#if I2C_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* I2C_USE_MUTUAL_EXCLUSION */ -#if defined(I2C_DRIVER_EXT_FIELDS) - I2C_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Thread waiting for I/O completion. - */ - Thread *thread; - /** - * @brief Current slave address without R/W bit. - */ - i2caddr_t addr; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; - /** - * @brief Receive DMA channel. - */ - const stm32_dma_stream_t *dmarx; - /** - * @brief Transmit DMA channel. - */ - const stm32_dma_stream_t *dmatx; - /** - * @brief Pointer to the I2Cx registers block. - */ - I2C_TypeDef *i2c; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Get errors from I2C driver. - * - * @param[in] i2cp pointer to the @p I2CDriver object - * - * @notapi - */ -#define i2c_lld_get_errors(i2cp) ((i2cp)->errors) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -#if STM32_I2C_USE_I2C1 -extern I2CDriver I2CD1; -#endif - -#if STM32_I2C_USE_I2C2 -extern I2CDriver I2CD2; -#endif - -#if STM32_I2C_USE_I2C3 -extern I2CDriver I2CD3; -#endif -#endif /* !defined(__DOXYGEN__) */ - -#ifdef __cplusplus -extern "C" { -#endif - void i2c_lld_init(void); - void i2c_lld_start(I2CDriver *i2cp); - void i2c_lld_stop(I2CDriver *i2cp); - msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr, - const uint8_t *txbuf, size_t txbytes, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout); - msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr, - uint8_t *rxbuf, size_t rxbytes, - systime_t timeout); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_I2C */ - -#endif /* _I2C_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/OTGv1/stm32_otg.h b/os/hal/platforms/STM32/OTGv1/stm32_otg.h deleted file mode 100644 index f0e3587f60..0000000000 --- a/os/hal/platforms/STM32/OTGv1/stm32_otg.h +++ /dev/null @@ -1,920 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file stm32_otg.h - * @brief STM32 OTG registers layout header. - * - * @addtogroup USB - * @{ - */ - -#ifndef _STM32_OTG_H_ -#define _STM32_OTG_H_ - -/** - * @brief Number of the implemented endpoints in OTG_FS. - * @details This value does not include the endpoint 0 that is always present. - */ -#define STM32_OTG1_ENDOPOINTS_NUMBER 3 - -/** - * @brief Number of the implemented endpoints in OTG_HS. - * @details This value does not include the endpoint 0 that is always present. - */ -#define STM32_OTG2_ENDOPOINTS_NUMBER 5 - -/** - * @brief OTG_FS FIFO memory size in words. - */ -#define STM32_OTG1_FIFO_MEM_SIZE 384 - -/** - * @brief OTG_HS FIFO memory size in words. - */ -#define STM32_OTG2_FIFO_MEM_SIZE 1024 - -/** - * @brief Host channel registers group. - */ -typedef struct { - volatile uint32_t HCCHAR; /**< @brief Host channel characteristics - register. */ - volatile uint32_t resvd8; - volatile uint32_t HCINT; /**< @brief Host channel interrupt register.*/ - volatile uint32_t HCINTMSK; /**< @brief Host channel interrupt mask - register. */ - volatile uint32_t HCTSIZ; /**< @brief Host channel transfer size - register. */ - volatile uint32_t resvd14; - volatile uint32_t resvd18; - volatile uint32_t resvd1c; -} stm32_otg_host_chn_t; - -/** - * @brief Device input endpoint registers group. - */ -typedef struct { - volatile uint32_t DIEPCTL; /**< @brief Device control IN endpoint - control register. */ - volatile uint32_t resvd4; - volatile uint32_t DIEPINT; /**< @brief Device IN endpoint interrupt - register. */ - volatile uint32_t resvdC; - volatile uint32_t DIEPTSIZ; /**< @brief Device IN endpoint transfer size - register. */ - volatile uint32_t resvd14; - volatile uint32_t DTXFSTS; /**< @brief Device IN endpoint transmit FIFO - status register. */ - volatile uint32_t resvd1C; -} stm32_otg_in_ep_t; - -/** - * @brief Device output endpoint registers group. - */ -typedef struct { - volatile uint32_t DOEPCTL; /**< @brief Device control OUT endpoint - control register. */ - volatile uint32_t resvd4; - volatile uint32_t DOEPINT; /**< @brief Device OUT endpoint interrupt - register. */ - volatile uint32_t resvdC; - volatile uint32_t DOEPTSIZ; /**< @brief Device OUT endpoint transfer - size register. */ - volatile uint32_t resvd14; - volatile uint32_t resvd18; - volatile uint32_t resvd1C; -} stm32_otg_out_ep_t; - -/** - * @brief USB registers memory map. - */ -typedef struct { - volatile uint32_t GOTGCTL; /**< @brief OTG control and status register.*/ - volatile uint32_t GOTGINT; /**< @brief OTG interrupt register. */ - volatile uint32_t GAHBCFG; /**< @brief AHB configuration register. */ - volatile uint32_t GUSBCFG; /**< @brief USB configuration register. */ - volatile uint32_t GRSTCTL; /**< @brief Reset register size. */ - volatile uint32_t GINTSTS; /**< @brief Interrupt register. */ - volatile uint32_t GINTMSK; /**< @brief Interrupt mask register. */ - volatile uint32_t GRXSTSR; /**< @brief Receive status debug read - register. */ - volatile uint32_t GRXSTSP; /**< @brief Receive status read/pop - register. */ - volatile uint32_t GRXFSIZ; /**< @brief Receive FIFO size register. */ - volatile uint32_t DIEPTXF0; /**< @brief Endpoint 0 transmit FIFO size - register. */ - volatile uint32_t HNPTXSTS; /**< @brief Non-periodic transmit FIFO/queue - status register. */ - volatile uint32_t resvd30; - volatile uint32_t resvd34; - volatile uint32_t GCCFG; /**< @brief General core configuration. */ - volatile uint32_t CID; /**< @brief Core ID register. */ - volatile uint32_t resvd58[48]; - volatile uint32_t HPTXFSIZ; /**< @brief Host periodic transmit FIFO size - register. */ - volatile uint32_t DIEPTXF[15];/**< @brief Device IN endpoint transmit FIFO - size registers. */ - volatile uint32_t resvd140[176]; - volatile uint32_t HCFG; /**< @brief Host configuration register. */ - volatile uint32_t HFIR; /**< @brief Host frame interval register. */ - volatile uint32_t HFNUM; /**< @brief Host frame number/frame time - Remaining register. */ - volatile uint32_t resvd40C; - volatile uint32_t HPTXSTS; /**< @brief Host periodic transmit FIFO/queue - status register. */ - volatile uint32_t HAINT; /**< @brief Host all channels interrupt - register. */ - volatile uint32_t HAINTMSK; /**< @brief Host all channels interrupt mask - register. */ - volatile uint32_t resvd41C[9]; - volatile uint32_t HPRT; /**< @brief Host port control and status - register. */ - volatile uint32_t resvd444[47]; - stm32_otg_host_chn_t hc[16]; /**< @brief Host channels array. */ - volatile uint32_t resvd700[64]; - volatile uint32_t DCFG; /**< @brief Device configuration register. */ - volatile uint32_t DCTL; /**< @brief Device control register. */ - volatile uint32_t DSTS; /**< @brief Device status register. */ - volatile uint32_t resvd80C; - volatile uint32_t DIEPMSK; /**< @brief Device IN endpoint common - interrupt mask register. */ - volatile uint32_t DOEPMSK; /**< @brief Device OUT endpoint common - interrupt mask register. */ - volatile uint32_t DAINT; /**< @brief Device all endpoints interrupt - register. */ - volatile uint32_t DAINTMSK; /**< @brief Device all endpoints interrupt - mask register. */ - volatile uint32_t resvd820; - volatile uint32_t resvd824; - volatile uint32_t DVBUSDIS; /**< @brief Device VBUS discharge time - register. */ - volatile uint32_t DVBUSPULSE; /**< @brief Device VBUS pulsing time - register. */ - volatile uint32_t resvd830; - volatile uint32_t DIEPEMPMSK; /**< @brief Device IN endpoint FIFO empty - interrupt mask register. */ - volatile uint32_t resvd838; - volatile uint32_t resvd83C; - volatile uint32_t resvd840[16]; - volatile uint32_t resvd880[16]; - volatile uint32_t resvd8C0[16]; - stm32_otg_in_ep_t ie[16]; /**< @brief Input endpoints. */ - stm32_otg_out_ep_t oe[16]; /**< @brief Output endpoints. */ - volatile uint32_t resvdD00[64]; - volatile uint32_t PCGCCTL; /**< @brief Power and clock gating control - register. */ - volatile uint32_t resvdE04[127]; - volatile uint32_t FIFO[16][1024]; -} stm32_otg_t; - -/** - * @name GOTGCTL register bit definitions - * @{ - */ -#define GOTGCTL_BSVLD (1U<<19) /**< B-Session Valid. */ -#define GOTGCTL_ASVLD (1U<<18) /**< A-Session Valid. */ -#define GOTGCTL_DBCT (1U<<17) /**< Long/Short debounce time. */ -#define GOTGCTL_CIDSTS (1U<<16) /**< Connector ID status. */ -#define GOTGCTL_DHNPEN (1U<<11) /**< Device HNP enabled. */ -#define GOTGCTL_HSHNPEN (1U<<10) /**< Host Set HNP enable. */ -#define GOTGCTL_HNPRQ (1U<<9) /**< HNP request. */ -#define GOTGCTL_HNGSCS (1U<<8) /**< Host negotiation success. */ -#define GOTGCTL_SRQ (1U<<1) /**< Session request. */ -#define GOTGCTL_SRQSCS (1U<<0) /**< Session request success. */ -/** @} */ - -/** - * @name GOTGINT register bit definitions - * @{ - */ -#define GOTGINT_DBCDNE (1U<<19) /**< Debounce done. */ -#define GOTGINT_ADTOCHG (1U<<18) /**< A-Device timeout change. */ -#define GOTGINT_HNGDET (1U<<17) /**< Host negotiation detected. */ -#define GOTGINT_HNSSCHG (1U<<9) /**< Host negotiation success - status change. */ -#define GOTGINT_SRSSCHG (1U<<8) /**< Session request success - status change. */ -#define GOTGINT_SEDET (1U<<2) /**< Session end detected. */ -/** @} */ - -/** - * @name GAHBCFG register bit definitions - * @{ - */ -#define GAHBCFG_PTXFELVL (1U<<8) /**< Periodic TxFIFO empty - level. */ -#define GAHBCFG_TXFELVL (1U<<7) /**< Non-periodic TxFIFO empty - level. */ -#define GAHBCFG_DMAEN (1U<<5) /**< DMA enable (HS only). */ -#define GAHBCFG_HBSTLEN_MASK (15U<<1) /**< Burst length/type mask (HS - only). */ -#define GAHBCFG_HBSTLEN(n) ((n)<<1) /**< Burst length/type (HS - only). */ -#define GAHBCFG_GINTMSK (1U<<0) /**< Global interrupt mask. */ -/** @} */ - -/** - * @name GUSBCFG register bit definitions - * @{ - */ -#define GUSBCFG_CTXPKT (1U<<31) /**< Corrupt Tx packet. */ -#define GUSBCFG_FDMOD (1U<<30) /**< Force Device Mode. */ -#define GUSBCFG_FHMOD (1U<<29) /**< Force Host Mode. */ -#define GUSBCFG_TRDT_MASK (15U<<10) /**< USB Turnaround time field - mask. */ -#define GUSBCFG_TRDT(n) ((n)<<10) /**< USB Turnaround time field - value. */ -#define GUSBCFG_HNPCAP (1U<<9) /**< HNP-Capable. */ -#define GUSBCFG_SRPCAP (1U<<8) /**< SRP-Capable. */ -#define GUSBCFG_PHYSEL (1U<<6) /**< USB 2.0 High-Speed PHY or - USB 1.1 Full-Speed serial - transceiver Select. */ -#define GUSBCFG_TOCAL_MASK (7U<<0) /**< HS/FS timeout calibration - field mask. */ -#define GUSBCFG_TOCAL(n) ((n)<<0) /**< HS/FS timeout calibration - field value. */ -/** @} */ - -/** - * @name GRSTCTL register bit definitions - * @{ - */ -#define GRSTCTL_AHBIDL (1U<<31) /**< AHB Master Idle. */ -#define GRSTCTL_TXFNUM_MASK (31U<<6) /**< TxFIFO number field mask. */ -#define GRSTCTL_TXFNUM(n) ((n)<<6) /**< TxFIFO number field value. */ -#define GRSTCTL_TXFFLSH (1U<<5) /**< TxFIFO flush. */ -#define GRSTCTL_RXFFLSH (1U<<4) /**< RxFIFO flush. */ -#define GRSTCTL_FCRST (1U<<2) /**< Host frame counter reset. */ -#define GRSTCTL_HSRST (1U<<1) /**< HClk soft reset. */ -#define GRSTCTL_CSRST (1U<<0) /**< Core soft reset. */ -/** @} */ - -/** - * @name GINTSTS register bit definitions - * @{ - */ -#define GINTSTS_WKUPINT (1U<<31) /**< Resume/Remote wakeup - detected interrupt. */ -#define GINTSTS_SRQINT (1U<<30) /**< Session request/New session - detected interrupt. */ -#define GINTSTS_DISCINT (1U<<29) /**< Disconnect detected - interrupt. */ -#define GINTSTS_CIDSCHG (1U<<28) /**< Connector ID status change.*/ -#define GINTSTS_PTXFE (1U<<26) /**< Periodic TxFIFO empty. */ -#define GINTSTS_HCINT (1U<<25) /**< Host channels interrupt. */ -#define GINTSTS_HPRTINT (1U<<24) /**< Host port interrupt. */ -#define GINTSTS_IPXFR (1U<<21) /**< Incomplete periodic - transfer. */ -#define GINTSTS_IISOOXFR (1U<<21) /**< Incomplete isochronous OUT - transfer. */ -#define GINTSTS_IISOIXFR (1U<<20) /**< Incomplete isochronous IN - transfer. */ -#define GINTSTS_OEPINT (1U<<19) /**< OUT endpoints interrupt. */ -#define GINTSTS_IEPINT (1U<<18) /**< IN endpoints interrupt. */ -#define GINTSTS_EOPF (1U<<15) /**< End of periodic frame - interrupt. */ -#define GINTSTS_ISOODRP (1U<<14) /**< Isochronous OUT packet - dropped interrupt. */ -#define GINTSTS_ENUMDNE (1U<<13) /**< Enumeration done. */ -#define GINTSTS_USBRST (1U<<12) /**< USB reset. */ -#define GINTSTS_USBSUSP (1U<<11) /**< USB suspend. */ -#define GINTSTS_ESUSP (1U<<10) /**< Early suspend. */ -#define GINTSTS_GONAKEFF (1U<<7) /**< Global OUT NAK effective. */ -#define GINTSTS_GINAKEFF (1U<<6) /**< Global IN non-periodic NAK - effective. */ -#define GINTSTS_NPTXFE (1U<<5) /**< Non-periodic TxFIFO empty. */ -#define GINTSTS_RXFLVL (1U<<4) /**< RxFIFO non-empty. */ -#define GINTSTS_SOF (1U<<3) /**< Start of frame. */ -#define GINTSTS_OTGINT (1U<<2) /**< OTG interrupt. */ -#define GINTSTS_MMIS (1U<<1) /**< Mode Mismatch interrupt. */ -#define GINTSTS_CMOD (1U<<0) /**< Current mode of operation. */ -/** @} */ - -/** - * @name GINTMSK register bit definitions - * @{ - */ -#define GINTMSK_WKUM (1U<<31) /**< Resume/remote wakeup - detected interrupt mask. */ -#define GINTMSK_SRQM (1U<<30) /**< Session request/New session - detected interrupt mask. */ -#define GINTMSK_DISCM (1U<<29) /**< Disconnect detected - interrupt mask. */ -#define GINTMSK_CIDSCHGM (1U<<28) /**< Connector ID status change - mask. */ -#define GINTMSK_PTXFEM (1U<<26) /**< Periodic TxFIFO empty mask.*/ -#define GINTMSK_HCM (1U<<25) /**< Host channels interrupt - mask. */ -#define GINTMSK_HPRTM (1U<<24) /**< Host port interrupt mask. */ -#define GINTMSK_IPXFRM (1U<<21) /**< Incomplete periodic - transfer mask. */ -#define GINTMSK_IISOOXFRM (1U<<21) /**< Incomplete isochronous OUT - transfer mask. */ -#define GINTMSK_IISOIXFRM (1U<<20) /**< Incomplete isochronous IN - transfer mask. */ -#define GINTMSK_OEPM (1U<<19) /**< OUT endpoints interrupt - mask. */ -#define GINTMSK_IEPM (1U<<18) /**< IN endpoints interrupt - mask. */ -#define GINTMSK_EOPFM (1U<<15) /**< End of periodic frame - interrupt mask. */ -#define GINTMSK_ISOODRPM (1U<<14) /**< Isochronous OUT packet - dropped interrupt mask. */ -#define GINTMSK_ENUMDNEM (1U<<13) /**< Enumeration done mask. */ -#define GINTMSK_USBRSTM (1U<<12) /**< USB reset mask. */ -#define GINTMSK_USBSUSPM (1U<<11) /**< USB suspend mask. */ -#define GINTMSK_ESUSPM (1U<<10) /**< Early suspend mask. */ -#define GINTMSK_GONAKEFFM (1U<<7) /**< Global OUT NAK effective - mask. */ -#define GINTMSK_GINAKEFFM (1U<<6) /**< Global non-periodic IN NAK - effective mask. */ -#define GINTMSK_NPTXFEM (1U<<5) /**< Non-periodic TxFIFO empty - mask. */ -#define GINTMSK_RXFLVLM (1U<<4) /**< Receive FIFO non-empty - mask. */ -#define GINTMSK_SOFM (1U<<3) /**< Start of (micro)frame mask.*/ -#define GINTMSK_OTGM (1U<<2) /**< OTG interrupt mask. */ -#define GINTMSK_MMISM (1U<<1) /**< Mode Mismatch interrupt - mask. */ -/** @} */ - -/** - * @name GRXSTSR register bit definitions - * @{ - */ -#define GRXSTSR_PKTSTS_MASK (15U<<17) /**< Packet status mask. */ -#define GRXSTSR_PKTSTS(n) ((n)<<17) /**< Packet status value. */ -#define GRXSTSR_OUT_GLOBAL_NAK GRXSTSR_PKTSTS(1) -#define GRXSTSR_OUT_DATA GRXSTSR_PKTSTS(2) -#define GRXSTSR_OUT_COMP GRXSTSR_PKTSTS(3) -#define GRXSTSR_SETUP_COMP GRXSTSR_PKTSTS(4) -#define GRXSTSR_SETUP_DATA GRXSTSR_PKTSTS(6) -#define GRXSTSR_DPID_MASK (3U<<15) /**< Data PID mask. */ -#define GRXSTSR_DPID(n) ((n)<<15) /**< Data PID value. */ -#define GRXSTSR_BCNT_MASK (0x7FF<<4) /**< Byte count mask. */ -#define GRXSTSR_BCNT(n) ((n)<<4) /**< Byte count value. */ -#define GRXSTSR_CHNUM_MASK (15U<<0) /**< Channel number mask. */ -#define GRXSTSR_CHNUM(n) ((n)<<0) /**< Channel number value. */ -#define GRXSTSR_EPNUM_MASK (15U<<0) /**< Endpoint number mask. */ -#define GRXSTSR_EPNUM(n) ((n)<<0) /**< Endpoint number value. */ -/** @} */ - -/** - * @name GRXSTSP register bit definitions - * @{ - */ -#define GRXSTSP_PKTSTS_MASK (15<<17) /**< Packet status mask. */ -#define GRXSTSP_PKTSTS(n) ((n)<<17) /**< Packet status value. */ -#define GRXSTSP_OUT_GLOBAL_NAK GRXSTSP_PKTSTS(1) -#define GRXSTSP_OUT_DATA GRXSTSP_PKTSTS(2) -#define GRXSTSP_OUT_COMP GRXSTSP_PKTSTS(3) -#define GRXSTSP_SETUP_COMP GRXSTSP_PKTSTS(4) -#define GRXSTSP_SETUP_DATA GRXSTSP_PKTSTS(6) -#define GRXSTSP_DPID_MASK (3U<<15) /**< Data PID mask. */ -#define GRXSTSP_DPID(n) ((n)<<15) /**< Data PID value. */ -#define GRXSTSP_BCNT_MASK (0x7FF<<4) /**< Byte count mask. */ -#define GRXSTSP_BCNT_OFF 4 /**< Byte count offset. */ -#define GRXSTSP_BCNT(n) ((n)<<4) /**< Byte count value. */ -#define GRXSTSP_CHNUM_MASK (15U<<0) /**< Channel number mask. */ -#define GRXSTSP_CHNUM(n) ((n)<<0) /**< Channel number value. */ -#define GRXSTSP_EPNUM_MASK (15U<<0) /**< Endpoint number mask. */ -#define GRXSTSP_EPNUM_OFF 0 /**< Endpoint number offset. */ -#define GRXSTSP_EPNUM(n) ((n)<<0) /**< Endpoint number value. */ -/** @} */ - -/** - * @name GRXFSIZ register bit definitions - * @{ - */ -#define GRXFSIZ_RXFD_MASK (0xFFFF<<0) /**< RxFIFO depth mask. */ -#define GRXFSIZ_RXFD(n) ((n)<<0) /**< RxFIFO depth value. */ -/** @} */ - -/** - * @name DIEPTXFx register bit definitions - * @{ - */ -#define DIEPTXF_INEPTXFD_MASK (0xFFFFU<<16)/**< IN endpoint TxFIFO depth - mask. */ -#define DIEPTXF_INEPTXFD(n) ((n)<<16) /**< IN endpoint TxFIFO depth - value. */ -#define DIEPTXF_INEPTXSA_MASK (0xFFFF<<0) /**< IN endpoint FIFOx transmit - RAM start address mask. */ -#define DIEPTXF_INEPTXSA(n) ((n)<<0) /**< IN endpoint FIFOx transmit - RAM start address value. */ -/** @} */ - -/** - * @name GCCFG register bit definitions - * @{ - */ -#define GCCFG_NOVBUSSENS (1U<<21) /**< VBUS sensing disable. */ -#define GCCFG_SOFOUTEN (1U<<20) /**< SOF output enable. */ -#define GCCFG_VBUSBSEN (1U<<19) /**< Enable the VBUS sensing "B" - device. */ -#define GCCFG_VBUSASEN (1U<<18) /**< Enable the VBUS sensing "A" - device. */ -#define GCCFG_PWRDWN (1U<<16) /**< Power down. */ -/** @} */ - -/** - * @name HPTXFSIZ register bit definitions - * @{ - */ -#define HPTXFSIZ_PTXFD_MASK (0xFFFFU<<16)/**< Host periodic TxFIFO - depth mask. */ -#define HPTXFSIZ_PTXFD(n) ((n)<<16) /**< Host periodic TxFIFO - depth value. */ -#define HPTXFSIZ_PTXSA_MASK (0xFFFFU<<0)/**< Host periodic TxFIFO - Start address mask. */ -#define HPTXFSIZ_PTXSA(n) ((n)<<0) /**< Host periodic TxFIFO - start address value. */ -/** @} */ - -/** - * @name HCFG register bit definitions - * @{ - */ -#define HCFG_FSLSS (1U<<2) /**< FS- and LS-only support. */ -#define HCFG_FSLSPCS_MASK (3U<<0) /**< FS/LS PHY clock select - mask. */ -#define HCFG_FSLSPCS_48 (1U<<0) /**< PHY clock is running at - 48 MHz. */ -#define HCFG_FSLSPCS_6 (2U<<0) /**< PHY clock is running at - 6 MHz. */ -/** @} */ - -/** - * @name HFIR register bit definitions - * @{ - */ -#define HFIR_FRIVL_MASK (0xFFFFU<<0)/**< Frame interval mask. */ -#define HFIR_FRIVL(n) ((n)<<0) /**< Frame interval value. */ -/** @} */ - -/** - * @name HFNUM register bit definitions - * @{ - */ -#define HFNUM_FTREM_MASK (0xFFFFU<<16)/**< Frame time Remaining mask.*/ -#define HFNUM_FTREM(n) ((n)<<16) /**< Frame time Remaining value.*/ -#define HFNUM_FRNUM_MASK (0xFFFFU<<0)/**< Frame number mask. */ -#define HFNUM_FRNUM(n) ((n)<<0) /**< Frame number value. */ -/** @} */ - -/** - * @name HPTXSTS register bit definitions - * @{ - */ -#define HPTXSTS_PTXQTOP_MASK (0xFFU<<24) /**< Top of the periodic - transmit request queue - mask. */ -#define HPTXSTS_PTXQTOP(n) ((n)<<24) /**< Top of the periodic - transmit request queue - value. */ -#define HPTXSTS_PTXQSAV_MASK (0xFF<<16) /**< Periodic transmit request - queue Space Available - mask. */ -#define HPTXSTS_PTXQSAV(n) ((n)<<16) /**< Periodic transmit request - queue Space Available - value. */ -#define HPTXSTS_PTXFSAVL_MASK (0xFFFF<<0) /**< Periodic transmit Data - FIFO Space Available - mask. */ -#define HPTXSTS_PTXFSAVL(n) ((n)<<0) /**< Periodic transmit Data - FIFO Space Available - value. */ -/** @} */ - -/** - * @name HAINT register bit definitions - * @{ - */ -#define HAINT_HAINT_MASK (0xFFFFU<<0)/**< Channel interrupts mask. */ -#define HAINT_HAINT(n) ((n)<<0) /**< Channel interrupts value. */ -/** @} */ - -/** - * @name HAINTMSK register bit definitions - * @{ - */ -#define HAINTMSK_HAINTM_MASK (0xFFFFU<<0)/**< Channel interrupt mask - mask. */ -#define HAINTMSK_HAINTM(n) ((n)<<0) /**< Channel interrupt mask - value. */ -/** @} */ - -/** - * @name HPRT register bit definitions - * @{ - */ -#define HPRT_PSPD_MASK (3U<<17) /**< Port speed mask. */ -#define HPRT_PSPD_FS (1U<<17) /**< Full speed value. */ -#define HPRT_PSPD_LS (2U<<17) /**< Low speed value. */ -#define HPRT_PTCTL_MASK (15<<13) /**< Port Test control mask. */ -#define HPRT_PTCTL(n) ((n)<<13) /**< Port Test control value. */ -#define HPRT_PPWR (1U<<12) /**< Port power. */ -#define HPRT_PLSTS_MASK (3U<<11) /**< Port Line status mask. */ -#define HPRT_PLSTS_DM (1U<<11) /**< Logic level of D-. */ -#define HPRT_PLSTS_DP (1U<<10) /**< Logic level of D+. */ -#define HPRT_PRST (1U<<8) /**< Port reset. */ -#define HPRT_PSUSP (1U<<7) /**< Port suspend. */ -#define HPRT_PRES (1U<<6) /**< Port Resume. */ -#define HPRT_POCCHNG (1U<<5) /**< Port overcurrent change. */ -#define HPRT_POCA (1U<<4) /**< Port overcurrent active. */ -#define HPRT_PENCHNG (1U<<3) /**< Port enable/disable change.*/ -#define HPRT_PENA (1U<<2) /**< Port enable. */ -#define HPRT_PCDET (1U<<1) /**< Port Connect detected. */ -#define HPRT_PCSTS (1U<<0) /**< Port connect status. */ -/** @} */ - -/** - * @name HCCHAR register bit definitions - * @{ - */ -#define HCCHAR_CHENA (1U<<31) /**< Channel enable. */ -#define HCCHAR_CHDIS (1U<<30) /**< Channel Disable. */ -#define HCCHAR_ODDFRM (1U<<29) /**< Odd frame. */ -#define HCCHAR_DAD_MASK (0x7FU<<22) /**< Device Address mask. */ -#define HCCHAR_DAD(n) ((n)<<22) /**< Device Address value. */ -#define HCCHAR_MCNT_MASK (3U<<20) /**< Multicount mask. */ -#define HCCHAR_MCNT(n) ((n)<<20) /**< Multicount value. */ -#define HCCHAR_EPTYP_MASK (3U<<18) /**< Endpoint type mask. */ -#define HCCHAR_EPTYP(n) ((n)<<18) /**< Endpoint type value. */ -#define HCCHAR_EPTYP_CTL (0U<<18) /**< Control endpoint value. */ -#define HCCHAR_EPTYP_ISO (1U<<18) /**< Isochronous endpoint value.*/ -#define HCCHAR_EPTYP_BULK (2U<<18) /**< Bulk endpoint value. */ -#define HCCHAR_EPTYP_INTR (3U<<18) /**< Interrupt endpoint value. */ -#define HCCHAR_LSDEV (1U<<17) /**< Low-Speed device. */ -#define HCCHAR_EPDIR (1U<<15) /**< Endpoint direction. */ -#define HCCHAR_EPNUM_MASK (15U<<11) /**< Endpoint number mask. */ -#define HCCHAR_EPNUM(n) ((n)<<11) /**< Endpoint number value. */ -#define HCCHAR_MPS_MASK (11U<<0) /**< Maximum packet size mask. */ -#define HCCHAR_MPS(n) (11U<<0) /**< Maximum packet size value. */ -/** @} */ - -/** - * @name HCINT register bit definitions - * @{ - */ -#define HCINT_DTERR (1U<<10) /**< Data toggle error. */ -#define HCINT_FRMOR (1U<<9) /**< Frame overrun. */ -#define HCINT_BBERR (1U<<8) /**< Babble error. */ -#define HCINT_TRERR (1U<<7) /**< Transaction Error. */ -#define HCINT_ACK (1U<<5) /**< ACK response - received/transmitted - interrupt. */ -#define HCINT_NAK (1U<<4) /**< NAK response received - interrupt. */ -#define HCINT_STALL (1U<<3) /**< STALL response received - interrupt. */ -#define HCINT_CHH (1U<<1) /**< Channel halted. */ -#define HCINT_XFRC (1U<<0) /**< Transfer completed. */ -/** @} */ - -/** - * @name HCINTMSK register bit definitions - * @{ - */ -#define HCINTMSK_DTERRM (1U<<10) /**< Data toggle error mask. */ -#define HCINTMSK_FRMORM (1U<<9) /**< Frame overrun mask. */ -#define HCINTMSK_BBERRM (1U<<8) /**< Babble error mask. */ -#define HCINTMSK_TRERRM (1U<<7) /**< Transaction error mask. */ -#define HCINTMSK_NYET (1U<<6) /**< NYET response received - interrupt mask. */ -#define HCINTMSK_ACKM (1U<<5) /**< ACK Response - received/transmitted - interrupt mask. */ -#define HCINTMSK_NAKM (1U<<4) /**< NAK response received - interrupt mask. */ -#define HCINTMSK_STALLM (1U<<3) /**< STALL response received - interrupt mask. */ -#define HCINTMSK_CHHM (1U<<1) /**< Channel halted mask. */ -#define HCINTMSK_XFRCM (1U<<0) /**< Transfer completed mask. */ -/** @} */ - -/** - * @name HCTSIZ register bit definitions - * @{ - */ -#define HCTSIZ_DPID_MASK (3U<<29) /**< PID mask. */ -#define HCTSIZ_DPID_DATA0 (0U<<29) /**< DATA0. */ -#define HCTSIZ_DPID_DATA2 (1U<<29) /**< DATA2. */ -#define HCTSIZ_DPID_DATA1 (2U<<29) /**< DATA1. */ -#define HCTSIZ_DPID_MDATA (3U<<29) /**< MDATA. */ -#define HCTSIZ_PKTCNT_MASK (0x3FFU<<19)/**< Packet count mask. */ -#define HCTSIZ_PKTCNT(n) ((n)<<19) /**< Packet count value. */ -#define HCTSIZ_XFRSIZ_MASK (0x7FFFF<<0)/**< Transfer size mask. */ -#define HCTSIZ_XFRSIZ(n) ((n)<<0) /**< Transfer size value. */ -/** @} */ - -/** - * @name DCFG register bit definitions - * @{ - */ -#define DCFG_PFIVL_MASK (3U<<11) /**< Periodic frame interval - mask. */ -#define DCFG_PFIVL(n) ((n)<<11) /**< Periodic frame interval - value. */ -#define DCFG_DAD_MASK (0x7FU<<4) /**< Device address mask. */ -#define DCFG_DAD(n) ((n)<<4) /**< Device address value. */ -#define DCFG_NZLSOHSK (1U<<2) /**< Non-Zero-Length status - OUT handshake. */ -#define DCFG_DSPD_MASK (3U<<0) /**< Device speed mask. */ -#define DCFG_DSPD_HS (0U<<0) /**< High speed (USB 2.0). */ -#define DCFG_DSPD_HS_FS (1U<<0) /**< High speed (USB 2.0) in FS - mode. */ -#define DCFG_DSPD_FS11 (3U<<0) /**< Full speed (USB 1.1 - transceiver clock is 48 - MHz). */ -/** @} */ - -/** - * @name DCTL register bit definitions - * @{ - */ -#define DCTL_POPRGDNE (1U<<11) /**< Power-on programming done. */ -#define DCTL_CGONAK (1U<<10) /**< Clear global OUT NAK. */ -#define DCTL_SGONAK (1U<<9) /**< Set global OUT NAK. */ -#define DCTL_CGINAK (1U<<8) /**< Clear global non-periodic - IN NAK. */ -#define DCTL_SGINAK (1U<<7) /**< Set global non-periodic - IN NAK. */ -#define DCTL_TCTL_MASK (7U<<4) /**< Test control mask. */ -#define DCTL_TCTL(n) ((n)<<4 /**< Test control value. */ -#define DCTL_GONSTS (1U<<3) /**< Global OUT NAK status. */ -#define DCTL_GINSTS (1U<<2) /**< Global non-periodic IN - NAK status. */ -#define DCTL_SDIS (1U<<1) /**< Soft disconnect. */ -#define DCTL_RWUSIG (1U<<0) /**< Remote wakeup signaling. */ -/** @} */ - -/** - * @name DSTS register bit definitions - * @{ - */ -#define DSTS_FNSOF_MASK (0x3FFU<<8) /**< Frame number of the received - SOF mask. */ -#define DSTS_FNSOF(n) ((n)<<8) /**< Frame number of the received - SOF value. */ -#define DSTS_EERR (1U<<3) /**< Erratic error. */ -#define DSTS_ENUMSPD_MASK (3U<<1) /**< Enumerated speed mask. */ -#define DSTS_ENUMSPD_FS_48 (3U<<1) /**< Full speed (PHY clock is - running at 48 MHz). */ -#define DSTS_SUSPSTS (1U<<0) /**< Suspend status. */ -/** @} */ - -/** - * @name DIEPMSK register bit definitions - * @{ - */ -#define DIEPMSK_TXFEM (1U<<6) /**< Transmit FIFO empty mask. */ -#define DIEPMSK_INEPNEM (1U<<6) /**< IN endpoint NAK effective - mask. */ -#define DIEPMSK_ITTXFEMSK (1U<<4) /**< IN token received when - TxFIFO empty mask. */ -#define DIEPMSK_TOCM (1U<<3) /**< Timeout condition mask. */ -#define DIEPMSK_EPDM (1U<<1) /**< Endpoint disabled - interrupt mask. */ -#define DIEPMSK_XFRCM (1U<<0) /**< Transfer completed - interrupt mask. */ -/** @} */ - -/** - * @name DOEPMSK register bit definitions - * @{ - */ -#define DOEPMSK_OTEPDM (1U<<4) /**< OUT token received when - endpoint disabled mask. */ -#define DOEPMSK_STUPM (1U<<3) /**< SETUP phase done mask. */ -#define DOEPMSK_EPDM (1U<<1) /**< Endpoint disabled - interrupt mask. */ -#define DOEPMSK_XFRCM (1U<<0) /**< Transfer completed - interrupt mask. */ -/** @} */ - -/** - * @name DAINT register bit definitions - * @{ - */ -#define DAINT_OEPINT_MASK (0xFFFFU<<16)/**< OUT endpoint interrupt - bits mask. */ -#define DAINT_OEPINT(n) ((n)<<16) /**< OUT endpoint interrupt - bits value. */ -#define DAINT_IEPINT_MASK (0xFFFFU<<0)/**< IN endpoint interrupt - bits mask. */ -#define DAINT_IEPINT(n) ((n)<<0) /**< IN endpoint interrupt - bits value. */ -/** @} */ - -/** - * @name DAINTMSK register bit definitions - * @{ - */ -#define DAINTMSK_OEPM_MASK (0xFFFFU<<16)/**< OUT EP interrupt mask - bits mask. */ -#define DAINTMSK_OEPM(n) (1U<<(16+(n)))/**< OUT EP interrupt mask - bits value. */ -#define DAINTMSK_IEPM_MASK (0xFFFFU<<0)/**< IN EP interrupt mask - bits mask. */ -#define DAINTMSK_IEPM(n) (1U<<(n)) /**< IN EP interrupt mask - bits value. */ -/** @} */ - -/** - * @name DVBUSDIS register bit definitions - * @{ - */ -#define DVBUSDIS_VBUSDT_MASK (0xFFFFU<<0)/**< Device VBUS discharge - time mask. */ -#define DVBUSDIS_VBUSDT(n) ((n)<<0) /**< Device VBUS discharge - time value. */ -/** @} */ - -/** - * @name DVBUSPULSE register bit definitions - * @{ - */ -#define DVBUSPULSE_DVBUSP_MASK (0xFFFU<<0) /**< Device VBUSpulsing time - mask. */ -#define DVBUSPULSE_DVBUSP(n) ((n)<<0) /**< Device VBUS pulsing time - value. */ -/** @} */ - -/** - * @name DIEPEMPMSK register bit definitions - * @{ - */ -#define DIEPEMPMSK_INEPTXFEM(n) (1U<<(n)) /**< IN EP Tx FIFO empty - interrupt mask bit. */ -/** @} */ - -/** - * @name DIEPCTL register bit definitions - * @{ - */ -#define DIEPCTL_EPENA (1U<<31) /**< Endpoint enable. */ -#define DIEPCTL_EPDIS (1U<<30) /**< Endpoint disable. */ -#define DIEPCTL_SD1PID (1U<<29) /**< Set DATA1 PID. */ -#define DIEPCTL_SODDFRM (1U<<29) /**< Set odd frame. */ -#define DIEPCTL_SD0PID (1U<<28) /**< Set DATA0 PID. */ -#define DIEPCTL_SEVNFRM (1U<<28) /**< Set even frame. */ -#define DIEPCTL_SNAK (1U<<27) /**< Set NAK. */ -#define DIEPCTL_CNAK (1U<<26) /**< Clear NAK. */ -#define DIEPCTL_TXFNUM_MASK (15U<<22) /**< TxFIFO number mask. */ -#define DIEPCTL_TXFNUM(n) ((n)<<22) /**< TxFIFO number value. */ -#define DIEPCTL_STALL (1U<<21) /**< STALL handshake. */ -#define DIEPCTL_SNPM (1U<<20) /**< Snoop mode. */ -#define DIEPCTL_EPTYP_MASK (3<<18) /**< Endpoint type mask. */ -#define DIEPCTL_EPTYP_CTRL (0U<<18) /**< Control. */ -#define DIEPCTL_EPTYP_ISO (1U<<18) /**< Isochronous. */ -#define DIEPCTL_EPTYP_BULK (2U<<18) /**< Bulk. */ -#define DIEPCTL_EPTYP_INTR (3U<<18) /**< Interrupt. */ -#define DIEPCTL_NAKSTS (1U<<17) /**< NAK status. */ -#define DIEPCTL_EONUM (1U<<16) /**< Even/odd frame. */ -#define DIEPCTL_DPID (1U<<16) /**< Endpoint data PID. */ -#define DIEPCTL_USBAEP (1U<<15) /**< USB active endpoint. */ -#define DIEPCTL_MPSIZ_MASK (0x3FFU<<0) /**< Maximum Packet size mask. */ -#define DIEPCTL_MPSIZ(n) ((n)<<0) /**< Maximum Packet size value. */ -/** @} */ - -/** - * @name DIEPINT register bit definitions - * @{ - */ -#define DIEPINT_TXFE (1U<<7) /**< Transmit FIFO empty. */ -#define DIEPINT_INEPNE (1U<<6) /**< IN endpoint NAK effective. */ -#define DIEPINT_ITTXFE (1U<<4) /**< IN Token received when - TxFIFO is empty. */ -#define DIEPINT_TOC (1U<<3) /**< Timeout condition. */ -#define DIEPINT_EPDISD (1U<<1) /**< Endpoint disabled - interrupt. */ -#define DIEPINT_XFRC (1U<<0) /**< Transfer completed. */ -/** @} */ - -/** - * @name DIEPTSIZ register bit definitions - * @{ - */ -#define DIEPTSIZ_MCNT_MASK (3U<<29) /**< Multi count mask. */ -#define DIEPTSIZ_MCNT(n) ((n)<<29) /**< Multi count value. */ -#define DIEPTSIZ_PKTCNT_MASK (0x3FF<<19) /**< Packet count mask. */ -#define DIEPTSIZ_PKTCNT(n) ((n)<<19) /**< Packet count value. */ -#define DIEPTSIZ_XFRSIZ_MASK (0x7FFFFU<<0)/**< Transfer size mask. */ -#define DIEPTSIZ_XFRSIZ(n) ((n)<<0) /**< Transfer size value. */ -/** @} */ - -/** - * @name DTXFSTS register bit definitions. - * @{ - */ -#define DTXFSTS_INEPTFSAV_MASK (0xFFFF<<0) /**< IN endpoint TxFIFO space - available. */ -/** @} */ - -/** - * @name DOEPCTL register bit definitions. - * @{ - */ -#define DOEPCTL_EPENA (1U<<31) /**< Endpoint enable. */ -#define DOEPCTL_EPDIS (1U<<30) /**< Endpoint disable. */ -#define DOEPCTL_SD1PID (1U<<29) /**< Set DATA1 PID. */ -#define DOEPCTL_SODDFRM (1U<<29) /**< Set odd frame. */ -#define DOEPCTL_SD0PID (1U<<28) /**< Set DATA0 PID. */ -#define DOEPCTL_SEVNFRM (1U<<28) /**< Set even frame. */ -#define DOEPCTL_SNAK (1U<<27) /**< Set NAK. */ -#define DOEPCTL_CNAK (1U<<26) /**< Clear NAK. */ -#define DOEPCTL_STALL (1U<<21) /**< STALL handshake. */ -#define DOEPCTL_SNPM (1U<<20) /**< Snoop mode. */ -#define DOEPCTL_EPTYP_MASK (3U<<18) /**< Endpoint type mask. */ -#define DOEPCTL_EPTYP_CTRL (0U<<18) /**< Control. */ -#define DOEPCTL_EPTYP_ISO (1U<<18) /**< Isochronous. */ -#define DOEPCTL_EPTYP_BULK (2U<<18) /**< Bulk. */ -#define DOEPCTL_EPTYP_INTR (3U<<18) /**< Interrupt. */ -#define DOEPCTL_NAKSTS (1U<<17) /**< NAK status. */ -#define DOEPCTL_EONUM (1U<<16) /**< Even/odd frame. */ -#define DOEPCTL_DPID (1U<<16) /**< Endpoint data PID. */ -#define DOEPCTL_USBAEP (1U<<15) /**< USB active endpoint. */ -#define DOEPCTL_MPSIZ_MASK (0x3FFU<<0) /**< Maximum Packet size mask. */ -#define DOEPCTL_MPSIZ(n) ((n)<<0) /**< Maximum Packet size value. */ -/** @} */ - -/** - * @name DOEPINT register bit definitions - * @{ - */ -#define DOEPINT_B2BSTUP (1U<<6) /**< Back-to-back SETUP packets - received. */ -#define DOEPINT_OTEPDIS (1U<<4) /**< OUT token received when - endpoint disabled. */ -#define DOEPINT_STUP (1U<<3) /**< SETUP phase done. */ -#define DOEPINT_EPDISD (1U<<1) /**< Endpoint disabled - interrupt. */ -#define DOEPINT_XFRC (1U<<0) /**< Transfer completed - interrupt. */ -/** @} */ - -/** - * @name DOEPTSIZ register bit definitions - * @{ - */ -#define DOEPTSIZ_RXDPID_MASK (3U<<29) /**< Received data PID mask. */ -#define DOEPTSIZ_RXDPID(n) ((n)<<29) /**< Received data PID value. */ -#define DOEPTSIZ_STUPCNT_MASK (3U<<29) /**< SETUP packet count mask. */ -#define DOEPTSIZ_STUPCNT(n) ((n)<<29) /**< SETUP packet count value. */ -#define DOEPTSIZ_PKTCNT_MASK (0x3FFU<<19)/**< Packet count mask. */ -#define DOEPTSIZ_PKTCNT(n) ((n)<<19) /**< Packet count value. */ -#define DOEPTSIZ_XFRSIZ_MASK (0x7FFFFU<<0)/**< Transfer size mask. */ -#define DOEPTSIZ_XFRSIZ(n) ((n)<<0) /**< Transfer size value. */ -/** @} */ - -/** - * @name PCGCCTL register bit definitions - * @{ - */ -#define PCGCCTL_PHYSUSP (1U<<4) /**< PHY Suspended. */ -#define PCGCCTL_GATEHCLK (1U<<1) /**< Gate HCLK. */ -#define PCGCCTL_STPPCLK (1U<<0) /**< Stop PCLK. */ -/** @} */ - -/** - * @brief OTG_FS registers block memory address. - */ -#define OTG_FS_ADDR 0x50000000 - -/** - * @brief OTG_HS registers block memory address. - */ -#define OTG_HS_ADDR 0x40040000 - -/** - * @brief Accesses to the OTG_FS registers block. - */ -#define OTG_FS ((stm32_otg_t *)OTG_FS_ADDR) - -/** - * @brief Accesses to the OTG_HS registers block. - */ -#define OTG_HS ((stm32_otg_t *)OTG_HS_ADDR) - -#endif /* _STM32_OTG_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/OTGv1/usb_lld.c b/os/hal/platforms/STM32/OTGv1/usb_lld.c deleted file mode 100644 index 1dd7e1b8f6..0000000000 --- a/os/hal/platforms/STM32/OTGv1/usb_lld.c +++ /dev/null @@ -1,1300 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/OTGv1/usb_lld.c - * @brief STM32 USB subsystem low level driver source. - * - * @addtogroup USB - * @{ - */ - -#include - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_USB || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define TRDT_VALUE 5 - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief OTG_FS driver identifier.*/ -#if STM32_USB_USE_OTG1 || defined(__DOXYGEN__) -USBDriver USBD1; -#endif - -/** @brief OTG_HS driver identifier.*/ -#if STM32_USB_USE_OTG2 || defined(__DOXYGEN__) -USBDriver USBD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief EP0 state. - * @note It is an union because IN and OUT endpoints are never used at the - * same time for EP0. - */ -static union { - /** - * @brief IN EP0 state. - */ - USBInEndpointState in; - /** - * @brief OUT EP0 state. - */ - USBOutEndpointState out; -} ep0_state; - -/** - * @brief Buffer for the EP0 setup packets. - */ -static uint8_t ep0setup_buffer[8]; - -/** - * @brief EP0 initialization structure. - */ -static const USBEndpointConfig ep0config = { - USB_EP_MODE_TYPE_CTRL, - _usb_ep0setup, - _usb_ep0in, - _usb_ep0out, - 0x40, - 0x40, - &ep0_state.in, - &ep0_state.out, - 1, - ep0setup_buffer -}; - -#if STM32_USB_USE_OTG1 -static const stm32_otg_params_t fsparams = { - STM32_USB_OTG1_RX_FIFO_SIZE / 4, - STM32_OTG1_FIFO_MEM_SIZE, - STM32_OTG1_ENDOPOINTS_NUMBER -}; -#endif - -#if STM32_USB_USE_OTG2 -static const stm32_otg_params_t hsparams = { - STM32_USB_OTG2_RX_FIFO_SIZE / 4, - STM32_OTG2_FIFO_MEM_SIZE, - STM32_OTG2_ENDOPOINTS_NUMBER -}; -#endif - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Wakes up the pump thread. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -static void usb_lld_wakeup_pump(USBDriver *usbp) { - - if (usbp->thd_wait != NULL) { - chThdResumeI(usbp->thd_wait); - usbp->thd_wait = NULL; - } -} - -static void otg_core_reset(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - - /* Core reset and delay of at least 3 PHY cycles.*/ - otgp->GRSTCTL = GRSTCTL_CSRST; - while ((otgp->GRSTCTL & GRSTCTL_CSRST) != 0) - ; - halPolledDelay(12); - /* Wait AHB idle condition.*/ - while ((otgp->GRSTCTL & GRSTCTL_AHBIDL) == 0) - ; -} - -static void otg_disable_ep(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - unsigned i; - - for (i = 0; i <= usbp->otgparams->num_endpoints; i++) { - /* Disable only if enabled because this sentence in the manual: - "The application must set this bit only if Endpoint Enable is - already set for this endpoint".*/ - if ((otgp->ie[i].DIEPCTL & DIEPCTL_EPENA) != 0) { - otgp->ie[i].DIEPCTL = DIEPCTL_EPDIS; - /* Wait for endpoint disable.*/ - while (!(otgp->ie[i].DIEPINT & DIEPINT_EPDISD)) - ; - } - else - otgp->ie[i].DIEPCTL = 0; - otgp->ie[i].DIEPTSIZ = 0; - otgp->ie[i].DIEPINT = 0xFFFFFFFF; - /* Disable only if enabled because this sentence in the manual: - "The application must set this bit only if Endpoint Enable is - already set for this endpoint". - Note that the attempt to disable the OUT EP0 is ignored by the - hardware but the code is simpler this way.*/ - if ((otgp->oe[i].DOEPCTL & DOEPCTL_EPENA) != 0) { - otgp->oe[i].DOEPCTL = DOEPCTL_EPDIS; - /* Wait for endpoint disable.*/ - while (!(otgp->oe[i].DOEPINT & DOEPINT_OTEPDIS)) - ; - } - else - otgp->oe[i].DOEPCTL = 0; - otgp->oe[i].DOEPTSIZ = 0; - otgp->oe[i].DOEPINT = 0xFFFFFFFF; - } - otgp->DAINTMSK = DAINTMSK_OEPM(0) | DAINTMSK_IEPM(0); -} - -static void otg_rxfifo_flush(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - - otgp->GRSTCTL = GRSTCTL_RXFFLSH; - while ((otgp->GRSTCTL & GRSTCTL_RXFFLSH) != 0) - ; - /* Wait for 3 PHY Clocks.*/ - halPolledDelay(12); -} - -static void otg_txfifo_flush(USBDriver *usbp, uint32_t fifo) { - stm32_otg_t *otgp = usbp->otg; - - otgp->GRSTCTL = GRSTCTL_TXFNUM(fifo) | GRSTCTL_TXFFLSH; - while ((otgp->GRSTCTL & GRSTCTL_TXFFLSH) != 0) - ; - /* Wait for 3 PHY Clocks.*/ - halPolledDelay(12); -} - -/** - * @brief Resets the FIFO RAM memory allocator. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -static void otg_ram_reset(USBDriver *usbp) { - - usbp->pmnext = usbp->otgparams->rx_fifo_size; -} - -/** - * @brief Allocates a block from the FIFO RAM memory. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] size size of the packet buffer to allocate in words - * - * @notapi - */ -static uint32_t otg_ram_alloc(USBDriver *usbp, size_t size) { - uint32_t next; - - next = usbp->pmnext; - usbp->pmnext += size; - chDbgAssert(usbp->pmnext <= usbp->otgparams->otg_ram_size, - "otg_fifo_alloc(), #1", "OTG FIFO memory overflow"); - return next; -} - -/** - * @brief Pushes a series of words into a FIFO. - * - * @param[in] fifop pointer to the FIFO register - * @param[in] buf pointer to the words buffer, not necessarily word - * aligned - * @param[in] n number of words to push - * - * @return A pointer after the last word pushed. - * - * @notapi - */ -static uint8_t *otg_do_push(volatile uint32_t *fifop, uint8_t *buf, size_t n) { - - while (n > 0) { - /* Note, this line relies on the Cortex-M3/M4 ability to perform - unaligned word accesses and on the LSB-first memory organization.*/ - *fifop = *((uint32_t *)buf); - buf += 4; - n--; - } - return buf; -} - -/** - * @brief Writes to a TX FIFO. - * - * @param[in] fifop pointer to the FIFO register - * @param[in] buf buffer where to copy the endpoint data - * @param[in] n maximum number of bytes to copy - * - * @notapi - */ -static void otg_fifo_write_from_buffer(volatile uint32_t *fifop, - const uint8_t *buf, - size_t n) { - - otg_do_push(fifop, (uint8_t *)buf, (n + 3) / 4); -} - -/** - * @brief Writes to a TX FIFO fetching data from a queue. - * - * @param[in] fifop pointer to the FIFO register - * @param[in] oqp pointer to an @p OutputQueue object - * @param[in] n maximum number of bytes to copy - * - * @notapi - */ -static void otg_fifo_write_from_queue(volatile uint32_t *fifop, - OutputQueue *oqp, - size_t n) { - size_t ntogo; - - ntogo = n; - while (ntogo > 0) { - uint32_t w, i; - size_t nw = ntogo / 4; - - if (nw > 0) { - size_t streak; - uint32_t nw2end = (oqp->q_top - oqp->q_rdptr) / 4; - - ntogo -= (streak = nw <= nw2end ? nw : nw2end) * 4; - oqp->q_rdptr = otg_do_push(fifop, oqp->q_rdptr, streak); - if (oqp->q_rdptr >= oqp->q_top) { - oqp->q_rdptr = oqp->q_buffer; - continue; - } - } - - /* If this condition is not satisfied then there is a word lying across - queue circular buffer boundary or there are some remaining bytes.*/ - if (ntogo <= 0) - break; - - /* One byte at time.*/ - w = 0; - i = 0; - while ((ntogo > 0) && (i < 4)) { - w |= (uint32_t)*oqp->q_rdptr++ << (i * 8); - if (oqp->q_rdptr >= oqp->q_top) - oqp->q_rdptr = oqp->q_buffer; - ntogo--; - i++; - } - *fifop = w; - } - - /* Updating queue.*/ - chSysLock(); - oqp->q_counter += n; - while (notempty(&oqp->q_waiting)) - chSchReadyI(fifo_remove(&oqp->q_waiting))->p_u.rdymsg = Q_OK; - chSchRescheduleS(); - chSysUnlock(); -} - -/** - * @brief Pops a series of words from a FIFO. - * - * @param[in] fifop pointer to the FIFO register - * @param[in] buf pointer to the words buffer, not necessarily word - * aligned - * @param[in] n number of words to push - * - * @return A pointer after the last word pushed. - * - * @notapi - */ -static uint8_t *otg_do_pop(volatile uint32_t *fifop, uint8_t *buf, size_t n) { - - while (n > 0) { - uint32_t w = *fifop; - /* Note, this line relies on the Cortex-M3/M4 ability to perform - unaligned word accesses and on the LSB-first memory organization.*/ - *((uint32_t *)buf) = w; - buf += 4; - n--; - } - return buf; -} - -/** - * @brief Reads a packet from the RXFIFO. - * - * @param[in] fifop pointer to the FIFO register - * @param[out] buf buffer where to copy the endpoint data - * @param[in] n number of bytes to pull from the FIFO - * @param[in] max number of bytes to copy into the buffer - * - * @notapi - */ -static void otg_fifo_read_to_buffer(volatile uint32_t *fifop, - uint8_t *buf, - size_t n, - size_t max) { - - n = (n + 3) / 4; - max = (max + 3) / 4; - while (n) { - uint32_t w = *fifop; - if (max) { - /* Note, this line relies on the Cortex-M3/M4 ability to perform - unaligned word accesses and on the LSB-first memory organization.*/ - *((uint32_t *)buf) = w; - buf += 4; - max--; - } - n--; - } -} - -/** - * @brief Reads a packet from the RXFIFO. - * - * @param[in] fifop pointer to the FIFO register - * @param[in] iqp pointer to an @p InputQueue object - * @param[in] n number of bytes to pull from the FIFO - * - * @notapi - */ -static void otg_fifo_read_to_queue(volatile uint32_t *fifop, - InputQueue *iqp, - size_t n) { - size_t ntogo; - - ntogo = n; - while (ntogo > 0) { - uint32_t w, i; - size_t nw = ntogo / 4; - - if (nw > 0) { - size_t streak; - uint32_t nw2end = (iqp->q_wrptr - iqp->q_wrptr) / 4; - - ntogo -= (streak = nw <= nw2end ? nw : nw2end) * 4; - iqp->q_wrptr = otg_do_pop(fifop, iqp->q_wrptr, streak); - if (iqp->q_wrptr >= iqp->q_top) { - iqp->q_wrptr = iqp->q_buffer; - continue; - } - } - - /* If this condition is not satisfied then there is a word lying across - queue circular buffer boundary or there are some remaining bytes.*/ - if (ntogo <= 0) - break; - - /* One byte at time.*/ - w = *fifop; - i = 0; - while ((ntogo > 0) && (i < 4)) { - *iqp->q_wrptr++ = (uint8_t)(w >> (i * 8)); - if (iqp->q_wrptr >= iqp->q_top) - iqp->q_wrptr = iqp->q_buffer; - ntogo--; - i++; - } - } - - /* Updating queue.*/ - chSysLock(); - iqp->q_counter += n; - while (notempty(&iqp->q_waiting)) - chSchReadyI(fifo_remove(&iqp->q_waiting))->p_u.rdymsg = Q_OK; - chSchRescheduleS(); - chSysUnlock(); -} - -/** - * @brief Incoming packets handler. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -static void otg_rxfifo_handler(USBDriver *usbp) { - uint32_t sts, cnt, ep; - - sts = usbp->otg->GRXSTSP; - switch (sts & GRXSTSP_PKTSTS_MASK) { - case GRXSTSP_SETUP_COMP: - break; - case GRXSTSP_SETUP_DATA: - cnt = (sts & GRXSTSP_BCNT_MASK) >> GRXSTSP_BCNT_OFF; - ep = (sts & GRXSTSP_EPNUM_MASK) >> GRXSTSP_EPNUM_OFF; - otg_fifo_read_to_buffer(usbp->otg->FIFO[0], usbp->epc[ep]->setup_buf, - cnt, 8); - break; - case GRXSTSP_OUT_DATA: - cnt = (sts & GRXSTSP_BCNT_MASK) >> GRXSTSP_BCNT_OFF; - ep = (sts & GRXSTSP_EPNUM_MASK) >> GRXSTSP_EPNUM_OFF; - if (usbp->epc[ep]->out_state->rxqueued) { - /* Queue associated.*/ - otg_fifo_read_to_queue(usbp->otg->FIFO[0], - usbp->epc[ep]->out_state->mode.queue.rxqueue, - cnt); - } - else { - otg_fifo_read_to_buffer(usbp->otg->FIFO[0], - usbp->epc[ep]->out_state->mode.linear.rxbuf, - cnt, - usbp->epc[ep]->out_state->rxsize - - usbp->epc[ep]->out_state->rxcnt); - usbp->epc[ep]->out_state->mode.linear.rxbuf += cnt; - } - usbp->epc[ep]->out_state->rxcnt += cnt; - break; - case GRXSTSP_OUT_GLOBAL_NAK: - case GRXSTSP_OUT_COMP: - default: - ; - } -} - -/** - * @brief Outgoing packets handler. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -static bool_t otg_txfifo_handler(USBDriver *usbp, usbep_t ep) { - - /* The TXFIFO is filled until there is space and data to be transmitted.*/ - while (TRUE) { - uint32_t n; - - /* Transaction end condition.*/ - if (usbp->epc[ep]->in_state->txcnt >= usbp->epc[ep]->in_state->txsize) - return TRUE; - - /* Number of bytes remaining in current transaction.*/ - n = usbp->epc[ep]->in_state->txsize - usbp->epc[ep]->in_state->txcnt; - if (n > usbp->epc[ep]->in_maxsize) - n = usbp->epc[ep]->in_maxsize; - - /* Checks if in the TXFIFO there is enough space to accommodate the - next packet.*/ - if (((usbp->otg->ie[ep].DTXFSTS & DTXFSTS_INEPTFSAV_MASK) * 4) < n) - return FALSE; - -#if STM32_USB_OTGFIFO_FILL_BASEPRI - __set_BASEPRI(CORTEX_PRIORITY_MASK(STM32_USB_OTGFIFO_FILL_BASEPRI)); -#endif - /* Handles the two cases: linear buffer or queue.*/ - if (usbp->epc[ep]->in_state->txqueued) { - /* Queue associated.*/ - otg_fifo_write_from_queue(usbp->otg->FIFO[ep], - usbp->epc[ep]->in_state->mode.queue.txqueue, - n); - } - else { - /* Linear buffer associated.*/ - otg_fifo_write_from_buffer(usbp->otg->FIFO[ep], - usbp->epc[ep]->in_state->mode.linear.txbuf, - n); - usbp->epc[ep]->in_state->mode.linear.txbuf += n; - } - usbp->epc[ep]->in_state->txcnt += n; - } -#if STM32_USB_OTGFIFO_FILL_BASEPRI - __set_BASEPRI(0); -#endif -} - -/** - * @brief Generic endpoint IN handler. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -static void otg_epin_handler(USBDriver *usbp, usbep_t ep) { - stm32_otg_t *otgp = usbp->otg; - uint32_t epint = otgp->ie[ep].DIEPINT; - - otgp->ie[ep].DIEPINT = 0xFFFFFFFF; - - if (epint & DIEPINT_TOC) { - /* Timeouts not handled yet, not sure how to handle.*/ - } - if ((epint & DIEPINT_XFRC) && (otgp->DIEPMSK & DIEPMSK_XFRCM)) { - /* Transmit transfer complete.*/ - _usb_isr_invoke_in_cb(usbp, ep); - } - if ((epint & DIEPINT_TXFE) && - (otgp->DIEPEMPMSK & DIEPEMPMSK_INEPTXFEM(ep))) { - /* The thread is made ready, it will be scheduled on ISR exit.*/ - chSysLockFromIsr(); - usbp->txpending |= (1 << ep); - otgp->DIEPEMPMSK &= ~(1 << ep); - usb_lld_wakeup_pump(usbp); - chSysUnlockFromIsr(); - } -} - -/** - * @brief Generic endpoint OUT handler. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -static void otg_epout_handler(USBDriver *usbp, usbep_t ep) { - stm32_otg_t *otgp = usbp->otg; - uint32_t epint = otgp->oe[ep].DOEPINT; - - /* Resets all EP IRQ sources.*/ - otgp->oe[ep].DOEPINT = 0xFFFFFFFF; - - if ((epint & DOEPINT_STUP) && (otgp->DOEPMSK & DOEPMSK_STUPM)) { - /* Setup packets handling, setup packets are handled using a - specific callback.*/ - _usb_isr_invoke_setup_cb(usbp, ep); - - } - if ((epint & DOEPINT_XFRC) && (otgp->DOEPMSK & DOEPMSK_XFRCM)) { - /* Receive transfer complete.*/ - _usb_isr_invoke_out_cb(usbp, ep); - } -} - -/** - * @brief OTG shared ISR. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -static void usb_lld_serve_interrupt(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - uint32_t sts, src; - - sts = otgp->GINTSTS & otgp->GINTMSK; - otgp->GINTSTS = sts; - - /* Reset interrupt handling.*/ - if (sts & GINTSTS_USBRST) { - _usb_reset(usbp); - _usb_isr_invoke_event_cb(usbp, USB_EVENT_RESET); - } - - /* Enumeration done.*/ - if (sts & GINTSTS_ENUMDNE) { - (void)otgp->DSTS; - } - - /* SOF interrupt handling.*/ - if (sts & GINTSTS_SOF) { - _usb_isr_invoke_sof_cb(usbp); - } - - /* RX FIFO not empty handling.*/ - if (sts & GINTSTS_RXFLVL) { - /* The interrupt is masked while the thread has control or it would - be triggered again.*/ - chSysLockFromIsr(); - otgp->GINTMSK &= ~GINTMSK_RXFLVLM; - usb_lld_wakeup_pump(usbp); - chSysUnlockFromIsr(); - } - - /* IN/OUT endpoints event handling.*/ - src = otgp->DAINT; - if (sts & GINTSTS_IEPINT) { - if (src & (1 << 0)) - otg_epin_handler(usbp, 0); - if (src & (1 << 1)) - otg_epin_handler(usbp, 1); - if (src & (1 << 2)) - otg_epin_handler(usbp, 2); - if (src & (1 << 3)) - otg_epin_handler(usbp, 3); -#if STM32_USB_USE_OTG2 - if (src & (1 << 4)) - otg_epin_handler(usbp, 4); - if (src & (1 << 5)) - otg_epin_handler(usbp, 5); -#endif - } - if (sts & GINTSTS_OEPINT) { - if (src & (1 << 16)) - otg_epout_handler(usbp, 0); - if (src & (1 << 17)) - otg_epout_handler(usbp, 1); - if (src & (1 << 18)) - otg_epout_handler(usbp, 2); - if (src & (1 << 19)) - otg_epout_handler(usbp, 3); -#if STM32_USB_USE_OTG2 - if (src & (1 << 20)) - otg_epout_handler(usbp, 4); - if (src & (1 << 21)) - otg_epout_handler(usbp, 5); -#endif - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers and threads. */ -/*===========================================================================*/ - -static msg_t usb_lld_pump(void *p) { - USBDriver *usbp = (USBDriver *)p; - stm32_otg_t *otgp = usbp->otg; - - chRegSetThreadName("usb_lld_pump"); - chSysLock(); - while (TRUE) { - usbep_t ep; - uint32_t epmask; - - /* Nothing to do, going to sleep.*/ - if ((usbp->state == USB_STOP) || - ((usbp->txpending == 0) && !(otgp->GINTSTS & GINTSTS_RXFLVL))) { - otgp->GINTMSK |= GINTMSK_RXFLVLM; - usbp->thd_wait = chThdSelf(); - chSchGoSleepS(THD_STATE_SUSPENDED); - } - chSysUnlock(); - - /* Checks if there are TXFIFOs to be filled.*/ - for (ep = 0; ep <= usbp->otgparams->num_endpoints; ep++) { - - /* Empties the RX FIFO.*/ - while (otgp->GINTSTS & GINTSTS_RXFLVL) { - otg_rxfifo_handler(usbp); - } - - epmask = (1 << ep); - if (usbp->txpending & epmask) { - bool_t done; - - chSysLock(); - /* USB interrupts are globally *suspended* because the peripheral - does not allow any interference during the TX FIFO filling - operation. - Synopsys document: DesignWare Cores USB 2.0 Hi-Speed On-The-Go (OTG) - "The application has to finish writing one complete packet before - switching to a different channel/endpoint FIFO. Violating this - rule results in an error.".*/ - otgp->GAHBCFG &= ~GAHBCFG_GINTMSK; - usbp->txpending &= ~epmask; - chSysUnlock(); - - done = otg_txfifo_handler(usbp, ep); - - chSysLock(); - otgp->GAHBCFG |= GAHBCFG_GINTMSK; - if (!done) - otgp->DIEPEMPMSK |= epmask; - chSysUnlock(); - } - } - chSysLock(); - } - chSysUnlock(); - return 0; -} - -#if STM32_USB_USE_OTG1 || defined(__DOXYGEN__) -#if !defined(STM32_OTG1_HANDLER) -#error "STM32_OTG1_HANDLER not defined" -#endif -/** - * @brief OTG1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_OTG1_HANDLER) { - - CH_IRQ_PROLOGUE(); - - usb_lld_serve_interrupt(&USBD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if STM32_USB_USE_OTG2 || defined(__DOXYGEN__) -#if !defined(STM32_OTG2_HANDLER) -#error "STM32_OTG2_HANDLER not defined" -#endif -/** - * @brief OTG2 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_OTG2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - usb_lld_serve_interrupt(&USBD2); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level USB driver initialization. - * - * @notapi - */ -void usb_lld_init(void) { - - /* Driver initialization.*/ -#if STM32_USB_USE_OTG1 - usbObjectInit(&USBD1); - USBD1.thd_ptr = NULL; - USBD1.thd_wait = NULL; - USBD1.otg = OTG_FS; - USBD1.otgparams = &fsparams; - - /* Filling the thread working area here because the function - @p chThdCreateI() does not do it.*/ -#if CH_DBG_FILL_THREADS - { - void *wsp = USBD1.wa_pump; - _thread_memfill((uint8_t *)wsp, - (uint8_t *)wsp + sizeof(Thread), - CH_THREAD_FILL_VALUE); - _thread_memfill((uint8_t *)wsp + sizeof(Thread), - (uint8_t *)wsp + sizeof(USBD1.wa_pump) - sizeof(Thread), - CH_STACK_FILL_VALUE); - } -#endif -#endif - -#if STM32_USB_USE_OTG2 - usbObjectInit(&USBD2); - USBD2.thd_ptr = NULL; - USBD2.thd_wait = NULL; - USBD2.otg = OTG_HS; - USBD2.otgparams = &hsparams; - - /* Filling the thread working area here because the function - @p chThdCreateI() does not do it.*/ -#if CH_DBG_FILL_THREADS - { - void *wsp = USBD2.wa_pump; - _thread_memfill((uint8_t *)wsp, - (uint8_t *)wsp + sizeof(Thread), - CH_THREAD_FILL_VALUE); - _thread_memfill((uint8_t *)wsp + sizeof(Thread), - (uint8_t *)wsp + sizeof(USBD2.wa_pump) - sizeof(Thread), - CH_STACK_FILL_VALUE); - } -#endif -#endif -} - -/** - * @brief Configures and activates the USB peripheral. - * @note Starting the OTG cell can be a slow operation carried out with - * interrupts disabled, perform it before starting time-critical - * operations. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_start(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - - if (usbp->state == USB_STOP) { - /* Clock activation.*/ -#if STM32_USB_USE_OTG1 - if (&USBD1 == usbp) { - /* OTG FS clock enable and reset.*/ - rccEnableOTG_FS(FALSE); - rccResetOTG_FS(); - - /* Enables IRQ vector.*/ - nvicEnableVector(STM32_OTG1_NUMBER, - CORTEX_PRIORITY_MASK(STM32_USB_OTG1_IRQ_PRIORITY)); - } -#endif -#if STM32_USB_USE_OTG2 - if (&USBD2 == usbp) { - /* OTG HS clock enable and reset.*/ - rccEnableOTG_HS(FALSE); - rccResetOTG_HS(); - - /* Enables IRQ vector.*/ - nvicEnableVector(STM32_OTG2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_USB_OTG2_IRQ_PRIORITY)); - } -#endif - - /* Creates the data pump threads in a suspended state. Note, it is - created only once, the first time @p usbStart() is invoked.*/ - usbp->txpending = 0; - if (usbp->thd_ptr == NULL) - usbp->thd_ptr = usbp->thd_wait = chThdCreateI(usbp->wa_pump, - sizeof usbp->wa_pump, - STM32_USB_OTG_THREAD_PRIO, - usb_lld_pump, - usbp); - - /* - Forced device mode. - - USB turn-around time = TRDT_VALUE. - - Full Speed 1.1 PHY.*/ - otgp->GUSBCFG = GUSBCFG_FDMOD | GUSBCFG_TRDT(TRDT_VALUE) | GUSBCFG_PHYSEL; - - /* 48MHz 1.1 PHY.*/ - otgp->DCFG = 0x02200000 | DCFG_DSPD_FS11; - - /* PHY enabled.*/ - otgp->PCGCCTL = 0; - - /* Internal FS PHY activation.*/ - otgp->GCCFG = GCCFG_VBUSASEN | GCCFG_VBUSBSEN | GCCFG_PWRDWN; - - /* Soft core reset.*/ - otg_core_reset(usbp); - - /* Interrupts on TXFIFOs half empty.*/ - otgp->GAHBCFG = 0; - - /* Endpoints re-initialization.*/ - otg_disable_ep(usbp); - - /* Clear all pending Device Interrupts, only the USB Reset interrupt - is required initially.*/ - otgp->DIEPMSK = 0; - otgp->DOEPMSK = 0; - otgp->DAINTMSK = 0; - if (usbp->config->sof_cb == NULL) - otgp->GINTMSK = GINTMSK_ENUMDNEM | GINTMSK_USBRSTM /*| GINTMSK_USBSUSPM | - GINTMSK_ESUSPM |*/; - else - otgp->GINTMSK = GINTMSK_ENUMDNEM | GINTMSK_USBRSTM /*| GINTMSK_USBSUSPM | - GINTMSK_ESUSPM */ | GINTMSK_SOFM; - otgp->GINTSTS = 0xFFFFFFFF; /* Clears all pending IRQs, if any. */ - - /* Global interrupts enable.*/ - otgp->GAHBCFG |= GAHBCFG_GINTMSK; - } -} - -/** - * @brief Deactivates the USB peripheral. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_stop(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - - /* If in ready state then disables the USB clock.*/ - if (usbp->state != USB_STOP) { - - usbp->txpending = 0; - - otgp->DAINTMSK = 0; - otgp->GAHBCFG = 0; - otgp->GCCFG = 0; - -#if STM32_USB_USE_USB1 - if (&USBD1 == usbp) { - nvicDisableVector(STM32_OTG1_NUMBER); - rccDisableOTG1(FALSE); - } -#endif - -#if STM32_USB_USE_USB2 - if (&USBD2 == usbp) { - nvicDisableVector(STM32_OTG2_NUMBER); - rccDisableOTG2(FALSE); - } -#endif - } -} - -/** - * @brief USB low level reset routine. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_reset(USBDriver *usbp) { - unsigned i; - stm32_otg_t *otgp = usbp->otg; - - /* Flush the Tx FIFO.*/ - otg_txfifo_flush(usbp, 0); - - /* All endpoints in NAK mode, interrupts cleared.*/ - for (i = 0; i <= usbp->otgparams->num_endpoints; i++) { - otgp->ie[i].DIEPCTL = DIEPCTL_SNAK; - otgp->oe[i].DOEPCTL = DOEPCTL_SNAK; - otgp->ie[i].DIEPINT = 0xFF; - otgp->oe[i].DOEPINT = 0xFF; - } - - /* Endpoint interrupts all disabled and cleared.*/ - otgp->DAINT = 0xFFFFFFFF; - otgp->DAINTMSK = DAINTMSK_OEPM(0) | DAINTMSK_IEPM(0); - - /* Resets the FIFO memory allocator.*/ - otg_ram_reset(usbp); - - /* Receive FIFO size initialization, the address is always zero.*/ - otgp->GRXFSIZ = usbp->otgparams->rx_fifo_size; - otg_rxfifo_flush(usbp); - - /* Resets the device address to zero.*/ - otgp->DCFG = (otgp->DCFG & ~DCFG_DAD_MASK) | DCFG_DAD(0); - - /* Enables also EP-related interrupt sources.*/ - otgp->GINTMSK |= GINTMSK_RXFLVLM | GINTMSK_OEPM | GINTMSK_IEPM; - otgp->DIEPMSK = DIEPMSK_TOCM | DIEPMSK_XFRCM; - otgp->DOEPMSK = DOEPMSK_STUPM | DOEPMSK_XFRCM; - - /* EP0 initialization, it is a special case.*/ - usbp->epc[0] = &ep0config; - otgp->oe[0].DOEPTSIZ = 0; - otgp->oe[0].DOEPCTL = DOEPCTL_SD0PID | DOEPCTL_USBAEP | DOEPCTL_EPTYP_CTRL | - DOEPCTL_MPSIZ(ep0config.out_maxsize); - otgp->ie[0].DIEPTSIZ = 0; - otgp->ie[0].DIEPCTL = DIEPCTL_SD0PID | DIEPCTL_USBAEP | DIEPCTL_EPTYP_CTRL | - DIEPCTL_TXFNUM(0) | DIEPCTL_MPSIZ(ep0config.in_maxsize); - otgp->DIEPTXF0 = DIEPTXF_INEPTXFD(ep0config.in_maxsize / 4) | - DIEPTXF_INEPTXSA(otg_ram_alloc(usbp, - ep0config.in_maxsize / 4)); -} - -/** - * @brief Sets the USB address. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_set_address(USBDriver *usbp) { - stm32_otg_t *otgp = usbp->otg; - - otgp->DCFG = (otgp->DCFG & ~DCFG_DAD_MASK) | DCFG_DAD(usbp->address); -} - -/** - * @brief Enables an endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep) { - uint32_t ctl, fsize; - stm32_otg_t *otgp = usbp->otg; - - /* IN and OUT common parameters.*/ - switch (usbp->epc[ep]->ep_mode & USB_EP_MODE_TYPE) { - case USB_EP_MODE_TYPE_CTRL: - ctl = DIEPCTL_SD0PID | DIEPCTL_USBAEP | DIEPCTL_EPTYP_CTRL; - break; - case USB_EP_MODE_TYPE_ISOC: - ctl = DIEPCTL_SD0PID | DIEPCTL_USBAEP | DIEPCTL_EPTYP_ISO; - break; - case USB_EP_MODE_TYPE_BULK: - ctl = DIEPCTL_SD0PID | DIEPCTL_USBAEP | DIEPCTL_EPTYP_BULK; - break; - case USB_EP_MODE_TYPE_INTR: - ctl = DIEPCTL_SD0PID | DIEPCTL_USBAEP | DIEPCTL_EPTYP_INTR; - break; - default: - return; - } - - /* OUT endpoint activation or deactivation.*/ - otgp->oe[ep].DOEPTSIZ = 0; - if (usbp->epc[ep]->out_cb != NULL) { - otgp->oe[ep].DOEPCTL = ctl | DOEPCTL_MPSIZ(usbp->epc[ep]->out_maxsize); - otgp->DAINTMSK |= DAINTMSK_OEPM(ep); - } - else { - otgp->oe[ep].DOEPCTL &= ~DOEPCTL_USBAEP; - otgp->DAINTMSK &= ~DAINTMSK_OEPM(ep); - } - - /* IN endpoint activation or deactivation.*/ - otgp->ie[ep].DIEPTSIZ = 0; - if (usbp->epc[ep]->in_cb != NULL) { - /* FIFO allocation for the IN endpoint.*/ - fsize = usbp->epc[ep]->in_maxsize / 4; - if (usbp->epc[ep]->in_multiplier > 1) - fsize *= usbp->epc[ep]->in_multiplier; - otgp->DIEPTXF[ep - 1] = DIEPTXF_INEPTXFD(fsize) | - DIEPTXF_INEPTXSA(otg_ram_alloc(usbp, fsize)); - otg_txfifo_flush(usbp, ep); - - otgp->ie[ep].DIEPCTL = ctl | - DIEPCTL_TXFNUM(ep) | - DIEPCTL_MPSIZ(usbp->epc[ep]->in_maxsize); - otgp->DAINTMSK |= DAINTMSK_IEPM(ep); - } - else { - otgp->DIEPTXF[ep - 1] = 0x02000400; /* Reset value.*/ - otg_txfifo_flush(usbp, ep); - otgp->ie[ep].DIEPCTL &= ~DIEPCTL_USBAEP; - otgp->DAINTMSK &= ~DAINTMSK_IEPM(ep); - } -} - -/** - * @brief Disables all the active endpoints except the endpoint zero. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_disable_endpoints(USBDriver *usbp) { - - /* Resets the FIFO memory allocator.*/ - otg_ram_reset(usbp); - - /* Disabling all endpoints.*/ - otg_disable_ep(usbp); -} - -/** - * @brief Returns the status of an OUT endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return The endpoint status. - * @retval EP_STATUS_DISABLED The endpoint is not active. - * @retval EP_STATUS_STALLED The endpoint is stalled. - * @retval EP_STATUS_ACTIVE The endpoint is active. - * - * @notapi - */ -usbepstatus_t usb_lld_get_status_out(USBDriver *usbp, usbep_t ep) { - uint32_t ctl; - - (void)usbp; - - ctl = usbp->otg->oe[ep].DOEPCTL; - if (!(ctl & DOEPCTL_USBAEP)) - return EP_STATUS_DISABLED; - if (ctl & DOEPCTL_STALL) - return EP_STATUS_STALLED; - return EP_STATUS_ACTIVE; -} - -/** - * @brief Returns the status of an IN endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return The endpoint status. - * @retval EP_STATUS_DISABLED The endpoint is not active. - * @retval EP_STATUS_STALLED The endpoint is stalled. - * @retval EP_STATUS_ACTIVE The endpoint is active. - * - * @notapi - */ -usbepstatus_t usb_lld_get_status_in(USBDriver *usbp, usbep_t ep) { - uint32_t ctl; - - (void)usbp; - - ctl = usbp->otg->ie[ep].DIEPCTL; - if (!(ctl & DIEPCTL_USBAEP)) - return EP_STATUS_DISABLED; - if (ctl & DIEPCTL_STALL) - return EP_STATUS_STALLED; - return EP_STATUS_ACTIVE; -} - -/** - * @brief Reads a setup packet from the dedicated packet buffer. - * @details This function must be invoked in the context of the @p setup_cb - * callback in order to read the received setup packet. - * @pre In order to use this function the endpoint must have been - * initialized as a control endpoint. - * @post The endpoint is ready to accept another packet. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @param[out] buf buffer where to copy the packet data - * - * @notapi - */ -void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf) { - - memcpy(buf, usbp->epc[ep]->setup_buf, 8); -} - -/** - * @brief Prepares for a receive operation. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep) { - uint32_t pcnt; - USBOutEndpointState *osp = usbp->epc[ep]->out_state; - - /* Transfer initialization.*/ - pcnt = (osp->rxsize + usbp->epc[ep]->out_maxsize - 1) / - usbp->epc[ep]->out_maxsize; - usbp->otg->oe[ep].DOEPTSIZ = DOEPTSIZ_STUPCNT(3) | DOEPTSIZ_PKTCNT(pcnt) | - DOEPTSIZ_XFRSIZ(usbp->epc[ep]->out_maxsize); - -} - -/** - * @brief Prepares for a transmit operation. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_prepare_transmit(USBDriver *usbp, usbep_t ep) { - USBInEndpointState *isp = usbp->epc[ep]->in_state; - - /* Transfer initialization.*/ - if (isp->txsize == 0) { - /* Special case, sending zero size packet.*/ - usbp->otg->ie[ep].DIEPTSIZ = DIEPTSIZ_PKTCNT(1) | DIEPTSIZ_XFRSIZ(0); - } - else { - /* Normal case.*/ - uint32_t pcnt = (isp->txsize + usbp->epc[ep]->in_maxsize - 1) / - usbp->epc[ep]->in_maxsize; - usbp->otg->ie[ep].DIEPTSIZ = DIEPTSIZ_PKTCNT(pcnt) | - DIEPTSIZ_XFRSIZ(usbp->epc[ep]->in_state->txsize); - } - -} - -/** - * @brief Starts a receive operation on an OUT endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_start_out(USBDriver *usbp, usbep_t ep) { - - usbp->otg->oe[ep].DOEPCTL |= DOEPCTL_CNAK; -} - -/** - * @brief Starts a transmit operation on an IN endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_start_in(USBDriver *usbp, usbep_t ep) { - - usbp->otg->ie[ep].DIEPCTL |= DIEPCTL_EPENA | DIEPCTL_CNAK; - usbp->otg->DIEPEMPMSK |= DIEPEMPMSK_INEPTXFEM(ep); -} - -/** - * @brief Brings an OUT endpoint in the stalled state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_stall_out(USBDriver *usbp, usbep_t ep) { - - usbp->otg->oe[ep].DOEPCTL |= DOEPCTL_STALL; -} - -/** - * @brief Brings an IN endpoint in the stalled state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_stall_in(USBDriver *usbp, usbep_t ep) { - - usbp->otg->ie[ep].DIEPCTL |= DIEPCTL_STALL; -} - -/** - * @brief Brings an OUT endpoint in the active state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_clear_out(USBDriver *usbp, usbep_t ep) { - - usbp->otg->oe[ep].DOEPCTL &= ~DOEPCTL_STALL; -} - -/** - * @brief Brings an IN endpoint in the active state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_clear_in(USBDriver *usbp, usbep_t ep) { - - usbp->otg->ie[ep].DIEPCTL &= ~DIEPCTL_STALL; -} - -#endif /* HAL_USE_USB */ - -/** @} */ diff --git a/os/hal/platforms/STM32/OTGv1/usb_lld.h b/os/hal/platforms/STM32/OTGv1/usb_lld.h deleted file mode 100644 index 424d523c5c..0000000000 --- a/os/hal/platforms/STM32/OTGv1/usb_lld.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/OTGv1/usb_lld.h - * @brief STM32 USB subsystem low level driver header. - * - * @addtogroup USB - * @{ - */ - -#ifndef _USB_LLD_H_ -#define _USB_LLD_H_ - -#if HAL_USE_USB || defined(__DOXYGEN__) - -#include "stm32_otg.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Maximum endpoint address. - */ -#if !STM32_USB_USE_OTG2 || defined(__DOXYGEN__) -#define USB_MAX_ENDPOINTS 3 -#else -#define USB_MAX_ENDPOINTS 5 -#endif - -/** - * @brief The address can be changed immediately upon packet reception. - */ -#define USB_SET_ADDRESS_MODE USB_EARLY_SET_ADDRESS - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief OTG1 driver enable switch. - * @details If set to @p TRUE the support for OTG_FS is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_USB_USE_OTG1) || defined(__DOXYGEN__) -#define STM32_USB_USE_OTG1 FALSE -#endif - -/** - * @brief OTG2 driver enable switch. - * @details If set to @p TRUE the support for OTG_HS is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_USB_USE_OTG2) || defined(__DOXYGEN__) -#define STM32_USB_USE_OTG2 FALSE -#endif - -/** - * @brief OTG1 interrupt priority level setting. - */ -#if !defined(STM32_USB_OTG1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#endif - -/** - * @brief OTG2 interrupt priority level setting. - */ -#if !defined(STM32_USB_OTG2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#endif - -/** - * @brief OTG1 RX shared FIFO size. - * @note Must be a multiple of 4. - */ -#if !defined(STM32_USB_OTG1_RX_FIFO_SIZE) || defined(__DOXYGEN__) -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#endif - -/** - * @brief OTG2 RX shared FIFO size. - * @note Must be a multiple of 4. - */ -#if !defined(STM32_USB_OTG2_RX_FIFO_SIZE) || defined(__DOXYGEN__) -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#endif - -/** - * @brief Dedicated data pump threads priority. - */ -#if !defined(STM32_USB_OTG_THREAD_PRIORITY) || defined(__DOXYGEN__) -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#endif - -/** - * @brief Dedicated data pump threads stack size. - */ -#if !defined(STM32_USB_OTG_THREAD_STACK_SIZE) || defined(__DOXYGEN__) -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#endif - -/** - * @brief Exception priority level during TXFIFOs operations. - * @note Because an undocumented silicon behavior the operation of - * copying a packet into a TXFIFO must not be interrupted by - * any other operation on the OTG peripheral. - * This parameter represents the priority mask during copy - * operations. The default value only allows to call USB - * functions from callbacks invoked from USB ISR handlers. - * If you need to invoke USB functions from other handlers - * then raise this priority mast to the same level of the - * handler you need to use. - * @note The value zero means disabled, when disabled calling USB - * functions is only safe from thread level or from USB - * callbacks. - */ -#if !defined(STM32_USB_OTGFIFO_FILL_BASEPRI) || defined(__DOXYGEN__) -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_USB_USE_OTG1 && !STM32_HAS_OTG1 -#error "OTG1 not present in the selected device" -#endif - -#if STM32_USB_USE_OTG2 && !STM32_HAS_OTG2 -#error "OTG2 not present in the selected device" -#endif - -#if !STM32_USB_USE_OTG1 && !STM32_USB_USE_OTG2 -#error "USB driver activated but no USB peripheral assigned" -#endif - -#if STM32_USB_USE_OTG1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_USB_OTG1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to OTG1" -#endif - -#if STM32_USB_USE_OTG2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_USB_OTG2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to OTG2" -#endif - -#if (STM32_USB_OTG1_RX_FIFO_SIZE & 3) != 0 -#error "OTG1 RX FIFO size must be a multiple of 4" -#endif - -#if (STM32_USB_OTG2_RX_FIFO_SIZE & 3) != 0 -#error "OTG2 RX FIFO size must be a multiple of 4" -#endif - -#if defined(STM32F4XX) || defined(STM32F2XX) -#define STM32_USBCLK STM32_PLL48CLK -#elif defined(STM32F10X_CL) -#define STM32_USBCLK STM32_OTGFSCLK -#else -#error "unsupported STM32 platform for OTG functionality" -#endif - -#if STM32_USBCLK != 48000000 -#error "the USB OTG driver requires a 48MHz clock" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Peripheral-specific parameters block. - */ -typedef struct { - uint32_t rx_fifo_size; - uint32_t otg_ram_size; - uint32_t num_endpoints; -} stm32_otg_params_t; - -/** - * @brief Type of an IN endpoint state structure. - */ -typedef struct { - /** - * @brief Buffer mode, queue or linear. - */ - bool_t txqueued; - /** - * @brief Requested transmit transfer size. - */ - size_t txsize; - /** - * @brief Transmitted bytes so far. - */ - size_t txcnt; - union { - struct { - /** - * @brief Pointer to the transmission linear buffer. - */ - const uint8_t *txbuf; - } linear; - struct { - /** - * @brief Pointer to the output queue. - */ - OutputQueue *txqueue; - } queue; - } mode; -} USBInEndpointState; - -/** - * @brief Type of an OUT endpoint state structure. - */ -typedef struct { - /** - * @brief Buffer mode, queue or linear. - */ - bool_t rxqueued; - /** - * @brief Requested receive transfer size. - */ - size_t rxsize; - /** - * @brief Received bytes so far. - */ - size_t rxcnt; - union { - struct { - /** - * @brief Pointer to the receive linear buffer. - */ - uint8_t *rxbuf; - } linear; - struct { - /** - * @brief Pointer to the input queue. - */ - InputQueue *rxqueue; - } queue; - } mode; -} USBOutEndpointState; - -/** - * @brief Type of an USB endpoint configuration structure. - * @note Platform specific restrictions may apply to endpoints. - */ -typedef struct { - /** - * @brief Type and mode of the endpoint. - */ - uint32_t ep_mode; - /** - * @brief Setup packet notification callback. - * @details This callback is invoked when a setup packet has been - * received. - * @post The application must immediately call @p usbReadPacket() in - * order to access the received packet. - * @note This field is only valid for @p USB_EP_MODE_TYPE_CTRL - * endpoints, it should be set to @p NULL for other endpoint - * types. - */ - usbepcallback_t setup_cb; - /** - * @brief IN endpoint notification callback. - * @details This field must be set to @p NULL if the IN endpoint is not - * used. - */ - usbepcallback_t in_cb; - /** - * @brief OUT endpoint notification callback. - * @details This field must be set to @p NULL if the OUT endpoint is not - * used. - */ - usbepcallback_t out_cb; - /** - * @brief IN endpoint maximum packet size. - * @details This field must be set to zero if the IN endpoint is not - * used. - */ - uint16_t in_maxsize; - /** - * @brief OUT endpoint maximum packet size. - * @details This field must be set to zero if the OUT endpoint is not - * used. - */ - uint16_t out_maxsize; - /** - * @brief @p USBEndpointState associated to the IN endpoint. - * @details This structure maintains the state of the IN endpoint. - */ - USBInEndpointState *in_state; - /** - * @brief @p USBEndpointState associated to the OUT endpoint. - * @details This structure maintains the state of the OUT endpoint. - */ - USBOutEndpointState *out_state; - /* End of the mandatory fields.*/ - /** - * @brief Determines the space allocated for the TXFIFO as multiples of - * the packet size (@p in_maxsize). Note that zero is interpreted - * as one for simplicity and robustness. - */ - uint16_t in_multiplier; - /** - * @brief Pointer to a buffer for setup packets. - * @details Setup packets require a dedicated 8-bytes buffer, set this - * field to @p NULL for non-control endpoints. - */ - uint8_t *setup_buf; -} USBEndpointConfig; - -/** - * @brief Type of an USB driver configuration structure. - */ -typedef struct { - /** - * @brief USB events callback. - * @details This callback is invoked when an USB driver event is registered. - */ - usbeventcb_t event_cb; - /** - * @brief Device GET_DESCRIPTOR request callback. - * @note This callback is mandatory and cannot be set to @p NULL. - */ - usbgetdescriptor_t get_descriptor_cb; - /** - * @brief Requests hook callback. - * @details This hook allows to be notified of standard requests or to - * handle non standard requests. - */ - usbreqhandler_t requests_hook_cb; - /** - * @brief Start Of Frame callback. - */ - usbcallback_t sof_cb; - /* End of the mandatory fields.*/ -} USBConfig; - -/** - * @brief Structure representing an USB driver. - */ -struct USBDriver { - /** - * @brief Driver state. - */ - usbstate_t state; - /** - * @brief Current configuration data. - */ - const USBConfig *config; - /** - * @brief Field available to user, it can be used to associate an - * application-defined handler to the USB driver. - */ - void *param; - /** - * @brief Bit map of the transmitting IN endpoints. - */ - uint16_t transmitting; - /** - * @brief Bit map of the receiving OUT endpoints. - */ - uint16_t receiving; - /** - * @brief Active endpoints configurations. - */ - const USBEndpointConfig *epc[USB_MAX_ENDPOINTS + 1]; - /** - * @brief Endpoint 0 state. - */ - usbep0state_t ep0state; - /** - * @brief Next position in the buffer to be transferred through endpoint 0. - */ - uint8_t *ep0next; - /** - * @brief Number of bytes yet to be transferred through endpoint 0. - */ - size_t ep0n; - /** - * @brief Endpoint 0 end transaction callback. - */ - usbcallback_t ep0endcb; - /** - * @brief Setup packet buffer. - */ - uint8_t setup[8]; - /** - * @brief Current USB device status. - */ - uint16_t status; - /** - * @brief Assigned USB address. - */ - uint8_t address; - /** - * @brief Current USB device configuration. - */ - uint8_t configuration; -#if defined(USB_DRIVER_EXT_FIELDS) - USB_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the OTG peripheral associated to this driver. - */ - stm32_otg_t *otg; - /** - * @brief Peripheral-specific parameters. - */ - const stm32_otg_params_t *otgparams; - /** - * @brief Pointer to the next address in the packet memory. - */ - uint32_t pmnext; - /** - * @brief Mask of TXFIFOs to be filled by the pump thread. - */ - uint32_t txpending; - /** - * @brief Pointer to the thread. - */ - Thread *thd_ptr; - /** - * @brief Pointer to the thread when it is sleeping or @p NULL. - */ - Thread *thd_wait; - /** - * @brief Working area for the dedicated data pump thread; - */ - WORKING_AREA(wa_pump, STM32_USB_OTG_THREAD_STACK_SIZE); -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Returns the exact size of a receive transaction. - * @details The received size can be different from the size specified in - * @p usbStartReceiveI() because the last packet could have a size - * different from the expected one. - * @pre The OUT endpoint must have been configured in transaction mode - * in order to use this function. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return Received data size. - * - * @notapi - */ -#define usb_lld_get_transaction_size(usbp, ep) \ - ((usbp)->epc[ep]->out_state->rxcnt) - -/** - * @brief Connects the USB device. - * - * @api - */ -#define usb_lld_connect_bus(usbp) (usbp->otg->GCCFG |= GCCFG_VBUSBSEN) - -/** - * @brief Disconnect the USB device. - * - * @api - */ -#define usb_lld_disconnect_bus(usbp) (usbp->otg->GCCFG &= ~GCCFG_VBUSBSEN) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_USB_USE_OTG1 && !defined(__DOXYGEN__) -extern USBDriver USBD1; -#endif - -#if STM32_USB_USE_OTG2 && !defined(__DOXYGEN__) -extern USBDriver USBD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void usb_lld_init(void); - void usb_lld_start(USBDriver *usbp); - void usb_lld_stop(USBDriver *usbp); - void usb_lld_reset(USBDriver *usbp); - void usb_lld_set_address(USBDriver *usbp); - void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep); - void usb_lld_disable_endpoints(USBDriver *usbp); - usbepstatus_t usb_lld_get_status_in(USBDriver *usbp, usbep_t ep); - usbepstatus_t usb_lld_get_status_out(USBDriver *usbp, usbep_t ep); - void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf); - void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep); - void usb_lld_prepare_transmit(USBDriver *usbp, usbep_t ep); - void usb_lld_start_out(USBDriver *usbp, usbep_t ep); - void usb_lld_start_in(USBDriver *usbp, usbep_t ep); - void usb_lld_stall_out(USBDriver *usbp, usbep_t ep); - void usb_lld_stall_in(USBDriver *usbp, usbep_t ep); - void usb_lld_clear_out(USBDriver *usbp, usbep_t ep); - void usb_lld_clear_in(USBDriver *usbp, usbep_t ep); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_USB */ - -#endif /* _USB_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/RTCv1/rtc_lld.c b/os/hal/platforms/STM32/RTCv1/rtc_lld.c deleted file mode 100644 index a8152dd9b9..0000000000 --- a/os/hal/platforms/STM32/RTCv1/rtc_lld.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * @file STM32/RTCv1/rtc_lld.c - * @brief STM32 RTC subsystem low level driver header. - * - * @addtogroup RTC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_RTC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief RTC driver identifier. - */ -RTCDriver RTCD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Wait for synchronization of RTC registers with APB1 bus. - * @details This function must be invoked before trying to read RTC registers - * in the backup domain: DIV, CNT, ALR. CR registers can always - * be read. - * - * @notapi - */ -#define rtc_lld_apb1_sync() {while ((RTC->CRL & RTC_CRL_RSF) == 0);} - -/** - * @brief Wait for for previous write operation complete. - * @details This function must be invoked before writing to any RTC registers - * - * @notapi - */ -#define rtc_lld_wait_write() {while ((RTC->CRL & RTC_CRL_RTOFF) == 0);} - -/** - * @brief Acquires write access to RTC registers. - * @details Before writing to the backup domain RTC registers the previous - * write operation must be completed. Use this function before - * writing to PRL, CNT, ALR registers. - * - * @notapi - */ -#define rtc_lld_acquire() {rtc_lld_wait_write(); RTC->CRL |= RTC_CRL_CNF;} - -/** - * @brief Releases write access to RTC registers. - * - * @notapi - */ -#define rtc_lld_release() {RTC->CRL &= ~RTC_CRL_CNF;} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief RTC interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(RTC_IRQHandler) { - uint16_t flags; - - CH_IRQ_PROLOGUE(); - - /* This wait works only when AHB1 bus was previously powered off by any - reason (standby, reset, etc). In other cases it does nothing.*/ - rtc_lld_apb1_sync(); - - /* Mask of all enabled and pending sources.*/ - flags = RTC->CRH & RTC->CRL; - RTC->CRL &= ~(RTC_CRL_SECF | RTC_CRL_ALRF | RTC_CRL_OWF); - - if (flags & RTC_CRL_SECF) - RTCD1.callback(&RTCD1, RTC_EVENT_SECOND); - - if (flags & RTC_CRL_ALRF) - RTCD1.callback(&RTCD1, RTC_EVENT_ALARM); - - if (flags & RTC_CRL_OWF) - RTCD1.callback(&RTCD1, RTC_EVENT_OVERFLOW); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Enable access to registers and initialize RTC if BKP domain - * was previously reseted. - * @note: Cold start time of LSE oscillator on STM32 platform - * takes about 3 seconds. - * - * @notapi - */ -void rtc_lld_init(void){ - - /* Required because access to PRL.*/ - rtc_lld_apb1_sync(); - - /* - * Writes preload register only if its value is not equal to desired value. - * - * Ref CD00171190: RM0008 Reference manual Cls 18.4.3 The RTC->PRL registers - * are write only. We must store the value for the pre-scaler in BKP->DR1 - * and BKP->DR1 so we know it has been set. - * The pre-scaler must not be set on every reset as RTC clock counts are - * lost when it is set. - */ - if ((STM32_RTCCLK - 1) != ((((uint32_t)BKP->DR1) << 16) | BKP->DR2)){ - rtc_lld_acquire(); - RTC->PRLH = (uint16_t)((STM32_RTCCLK - 1) >> 16) & 0x000F; - BKP->DR1 = (uint16_t)((STM32_RTCCLK - 1) >> 16) & 0x000F; - RTC->PRLL = (uint16_t)(((STM32_RTCCLK - 1)) & 0xFFFF); - BKP->DR2 = (uint16_t)(((STM32_RTCCLK - 1)) & 0xFFFF); - rtc_lld_release(); - } - - /* All interrupts initially disabled.*/ - rtc_lld_wait_write(); - RTC->CRH = 0; - - /* Callback initially disabled.*/ - RTCD1.callback = NULL; - - /* IRQ vector permanently assigned to this driver.*/ - nvicEnableVector(RTC_IRQn, CORTEX_PRIORITY_MASK(STM32_RTC_IRQ_PRIORITY)); -} - -/** - * @brief Set current time. - * @note Fractional part will be silently ignored. There is no possibility - * to change it on STM32F1xx platform. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] timespec pointer to a @p RTCTime structure - * - * @notapi - */ -void rtc_lld_set_time(RTCDriver *rtcp, const RTCTime *timespec) { - - (void)rtcp; - - rtc_lld_acquire(); - RTC->CNTH = (uint16_t)(timespec->tv_sec >> 16); - RTC->CNTL = (uint16_t)(timespec->tv_sec & 0xFFFF); - rtc_lld_release(); -} - -/** - * @brief Get current time. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] timespec pointer to a @p RTCTime structure - * - * @notapi - */ -void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec) { - (void)rtcp; - - uint32_t time_frac; - - /* Required because access to CNT and DIV.*/ - rtc_lld_apb1_sync(); - - /* Loops until two consecutive read returning the same value.*/ - do { - timespec->tv_sec = ((uint32_t)(RTC->CNTH) << 16) + RTC->CNTL; - time_frac = (((uint32_t)RTC->DIVH) << 16) + (uint32_t)RTC->DIVL; - } while ((timespec->tv_sec) != (((uint32_t)(RTC->CNTH) << 16) + RTC->CNTL)); - - timespec->tv_msec = (uint16_t)(((STM32_RTCCLK - 1 - time_frac) * 1000) / - STM32_RTCCLK); -} - -/** - * @brief Set alarm time. - * - * @note Default value after BKP domain reset is 0xFFFFFFFF - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] alarm alarm identifier - * @param[in] alarmspec pointer to a @p RTCAlarm structure - * - * @notapi - */ -void rtc_lld_set_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - const RTCAlarm *alarmspec) { - - (void)rtcp; - (void)alarm; - - rtc_lld_acquire(); - if (alarmspec != NULL) { - RTC->ALRH = (uint16_t)(alarmspec->tv_sec >> 16); - RTC->ALRL = (uint16_t)(alarmspec->tv_sec & 0xFFFF); - } - else { - RTC->ALRH = 0; - RTC->ALRL = 0; - } - rtc_lld_release(); -} - -/** - * @brief Get current alarm. - * @note If an alarm has not been set then the returned alarm specification - * is not meaningful. - * - * @note Default value after BKP domain reset is 0xFFFFFFFF. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] alarm alarm identifier - * @param[out] alarmspec pointer to a @p RTCAlarm structure - * - * @notapi - */ -void rtc_lld_get_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - RTCAlarm *alarmspec) { - - (void)rtcp; - (void)alarm; - - /* Required because access to ALR.*/ - rtc_lld_apb1_sync(); - - alarmspec->tv_sec = ((RTC->ALRH << 16) + RTC->ALRL); -} - -/** - * @brief Enables or disables RTC callbacks. - * @details This function enables or disables callbacks, use a @p NULL pointer - * in order to disable a callback. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] callback callback function pointer or @p NULL - * - * @notapi - */ -void rtc_lld_set_callback(RTCDriver *rtcp, rtccb_t callback) { - - if (callback != NULL) { - - /* IRQ sources enabled only after setting up the callback.*/ - rtcp->callback = callback; - - rtc_lld_wait_write(); - RTC->CRL &= ~(RTC_CRL_OWF | RTC_CRL_ALRF | RTC_CRL_SECF); - RTC->CRH = RTC_CRH_OWIE | RTC_CRH_ALRIE | RTC_CRH_SECIE; - } - else { - rtc_lld_wait_write(); - RTC->CRH = 0; - - /* Callback set to NULL only after disabling the IRQ sources.*/ - rtcp->callback = NULL; - } -} - -#include "chrtclib.h" - -/** - * @brief Get current time in format suitable for usage in FatFS. - * - * @param[in] rtcp pointer to RTC driver structure - * @return FAT time value. - * - * @api - */ -uint32_t rtc_lld_get_time_fat(RTCDriver *rtcp) { - uint32_t fattime; - struct tm timp; - - rtcGetTimeTm(rtcp, &timp); - - fattime = (timp.tm_sec) >> 1; - fattime |= (timp.tm_min) << 5; - fattime |= (timp.tm_hour) << 11; - fattime |= (timp.tm_mday) << 16; - fattime |= (timp.tm_mon + 1) << 21; - fattime |= (timp.tm_year - 80) << 25; - - return fattime; -} -#endif /* HAL_USE_RTC */ - -/** @} */ diff --git a/os/hal/platforms/STM32/RTCv1/rtc_lld.h b/os/hal/platforms/STM32/RTCv1/rtc_lld.h deleted file mode 100644 index c0ad92525e..0000000000 --- a/os/hal/platforms/STM32/RTCv1/rtc_lld.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * @file STM32/RTCv1/rtc_lld.h - * @brief STM32F1xx RTC subsystem low level driver header. - * - * @addtogroup RTC - * @{ - */ - -#ifndef _RTC_LLD_H_ -#define _RTC_LLD_H_ - -#if HAL_USE_RTC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief This RTC implementation supports callbacks. - */ -#define RTC_SUPPORTS_CALLBACKS TRUE - -/** - * @brief One alarm comparator available. - */ -#define RTC_ALARMS 1 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if HAL_USE_RTC && !STM32_HAS_RTC -#error "RTC not present in the selected device" -#endif - -#if STM32_RTCCLK == 0 -#error "RTC clock not enabled" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an RTC alarm time stamp. - */ -typedef struct RTCAlarm RTCAlarm; - -/** - * @brief Type of a structure representing an RTC callbacks config. - */ -typedef struct RTCCallbackConfig RTCCallbackConfig; - -/** - * @brief Type of an RTC alarm. - * @details Meaningful on platforms with more than 1 alarm comparator. - */ -typedef uint32_t rtcalarm_t; - -/** - * @brief Type of an RTC event. - */ -typedef enum { - RTC_EVENT_SECOND = 0, /** Triggered every second. */ - RTC_EVENT_ALARM = 1, /** Triggered on alarm. */ - RTC_EVENT_OVERFLOW = 2 /** Triggered on counter overflow. */ -} rtcevent_t; - -/** - * @brief Type of a generic RTC callback. - */ -typedef void (*rtccb_t)(RTCDriver *rtcp, rtcevent_t event); - -/** - * @brief Structure representing an RTC callbacks config. - */ -struct RTCCallbackConfig{ - /** - * @brief Generic RTC callback pointer. - */ - rtccb_t callback; -}; - -/** - * @brief Structure representing an RTC time stamp. - */ -struct RTCTime { - /** - * @brief Seconds since UNIX epoch. - */ - uint32_t tv_sec; - /** - * @brief Fractional part. - */ - uint32_t tv_msec; -}; - -/** - * @brief Structure representing an RTC alarm time stamp. - */ -struct RTCAlarm { - /** - * @brief Seconds since UNIX epoch. - */ - uint32_t tv_sec; -}; - -/** - * @brief Structure representing an RTC driver. - */ -struct RTCDriver{ - /** - * @brief Callback pointer. - */ - rtccb_t callback; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern RTCDriver RTCD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void rtc_lld_init(void); - void rtc_lld_set_time(RTCDriver *rtcp, const RTCTime *timespec); - void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec); - void rtc_lld_set_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - const RTCAlarm *alarmspec); - void rtc_lld_get_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - RTCAlarm *alarmspec); - void rtc_lld_set_callback(RTCDriver *rtcp, rtccb_t callback); - uint32_t rtc_lld_get_time_fat(RTCDriver *rtcp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_RTC */ - -#endif /* _RTC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/RTCv2/rtc_lld.c b/os/hal/platforms/STM32/RTCv2/rtc_lld.c deleted file mode 100644 index 34406e1a3c..0000000000 --- a/os/hal/platforms/STM32/RTCv2/rtc_lld.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * @file STM32/RTCv2/rtc_lld.c - * @brief STM32L1xx/STM32F2xx/STM32F4xx RTC low level driver. - * - * @addtogroup RTC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_RTC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief RTC driver identifier. - */ -RTCDriver RTCD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ -/** - * @brief Wait for synchronization of RTC registers with APB1 bus. - * @details This function must be invoked before trying to read RTC registers. - * - * @notapi - */ -#define rtc_lld_apb1_sync() {while ((RTCD1.id_rtc->ISR & RTC_ISR_RSF) == 0);} - -/** - * @brief Beginning of configuration procedure. - * - * @notapi - */ -#define rtc_lld_enter_init() { \ - RTCD1.id_rtc->ISR |= RTC_ISR_INIT; \ - while ((RTCD1.id_rtc->ISR & RTC_ISR_INITF) == 0) \ - ; \ -} - -/** - * @brief Finalizing of configuration procedure. - * - * @notapi - */ -#define rtc_lld_exit_init() {RTCD1.id_rtc->ISR &= ~RTC_ISR_INIT;} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Enable access to registers. - * - * @api - */ -void rtc_lld_init(void){ - RTCD1.id_rtc = RTC; - - /* Asynchronous part of preloader. Set it to maximum value. */ - uint32_t prediv_a = 0x7F; - - /* Disable write protection. */ - RTCD1.id_rtc->WPR = 0xCA; - RTCD1.id_rtc->WPR = 0x53; - - /* If calendar not init yet. */ - if (!(RTC->ISR & RTC_ISR_INITS)){ - rtc_lld_enter_init(); - - /* Prescaler register must be written in two SEPARATE writes. */ - prediv_a = (prediv_a << 16) | - (((STM32_RTCCLK / (prediv_a + 1)) - 1) & 0x7FFF); - RTCD1.id_rtc->PRER = prediv_a; - RTCD1.id_rtc->PRER = prediv_a; - rtc_lld_exit_init(); - } -} - -/** - * @brief Set current time. - * @note Fractional part will be silently ignored. There is no possibility - * to set it on STM32 platform. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] timespec pointer to a @p RTCTime structure - * - * @api - */ -void rtc_lld_set_time(RTCDriver *rtcp, const RTCTime *timespec) { - (void)rtcp; - - rtc_lld_enter_init(); - if (timespec->h12) - RTCD1.id_rtc->CR |= RTC_CR_FMT; - else - RTCD1.id_rtc->CR &= ~RTC_CR_FMT; - RTCD1.id_rtc->TR = timespec->tv_time; - RTCD1.id_rtc->DR = timespec->tv_date; - rtc_lld_exit_init(); -} - -/** - * @brief Get current time. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[out] timespec pointer to a @p RTCTime structure - * - * @api - */ -void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec) { - (void)rtcp; - - rtc_lld_apb1_sync(); - -#if STM32_RTC_HAS_SUBSECONDS - timespec->tv_msec = - (1000 * ((RTCD1.id_rtc->PRER & 0x7FFF) - RTCD1.id_rtc->SSR)) / - ((RTCD1.id_rtc->PRER & 0x7FFF) + 1); -#endif /* STM32_RTC_HAS_SUBSECONDS */ - timespec->tv_time = RTCD1.id_rtc->TR; - timespec->tv_date = RTCD1.id_rtc->DR; -} - -/** - * @brief Set alarm time. - * - * @note Default value after BKP domain reset for both comparators is 0. - * @note Function does not performs any checks of alarm time validity. - * - * @param[in] rtcp Pointer to RTC driver structure. - * @param[in] alarm Alarm identifier. Can be 1 or 2. - * @param[in] alarmspec Pointer to a @p RTCAlarm structure. - * - * @api - */ -void rtc_lld_set_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - const RTCAlarm *alarmspec) { - if (alarm == 1){ - if (alarmspec != NULL){ - rtcp->id_rtc->CR &= ~RTC_CR_ALRAE; - while(!(rtcp->id_rtc->ISR & RTC_ISR_ALRAWF)) - ; - rtcp->id_rtc->ALRMAR = alarmspec->tv_datetime; - rtcp->id_rtc->CR |= RTC_CR_ALRAE; - rtcp->id_rtc->CR |= RTC_CR_ALRAIE; - } - else { - rtcp->id_rtc->CR &= ~RTC_CR_ALRAIE; - rtcp->id_rtc->CR &= ~RTC_CR_ALRAE; - } - } - else{ - if (alarmspec != NULL){ - rtcp->id_rtc->CR &= ~RTC_CR_ALRBE; - while(!(rtcp->id_rtc->ISR & RTC_ISR_ALRBWF)) - ; - rtcp->id_rtc->ALRMBR = alarmspec->tv_datetime; - rtcp->id_rtc->CR |= RTC_CR_ALRBE; - rtcp->id_rtc->CR |= RTC_CR_ALRBIE; - } - else { - rtcp->id_rtc->CR &= ~RTC_CR_ALRBIE; - rtcp->id_rtc->CR &= ~RTC_CR_ALRBE; - } - } -} - -/** - * @brief Get alarm time. - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] alarm alarm identifier - * @param[out] alarmspec pointer to a @p RTCAlarm structure - * - * @api - */ -void rtc_lld_get_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - RTCAlarm *alarmspec) { - if (alarm == 1) - alarmspec->tv_datetime = rtcp->id_rtc->ALRMAR; - else - alarmspec->tv_datetime = rtcp->id_rtc->ALRMBR; -} - -/** - * @brief Sets time of periodic wakeup. - * - * @note Default value after BKP domain reset is 0x0000FFFF - * - * @param[in] rtcp pointer to RTC driver structure - * @param[in] wakeupspec pointer to a @p RTCWakeup structure - * - * @api - */ -void rtcSetPeriodicWakeup_v2(RTCDriver *rtcp, RTCWakeup *wakeupspec){ - chDbgCheck((wakeupspec->wakeup != 0x30000), - "rtc_lld_set_periodic_wakeup, forbidden combination"); - - if (wakeupspec != NULL){ - rtcp->id_rtc->CR &= ~RTC_CR_WUTE; - while(!(rtcp->id_rtc->ISR & RTC_ISR_WUTWF)) - ; - rtcp->id_rtc->WUTR = wakeupspec->wakeup & 0xFFFF; - rtcp->id_rtc->CR = (wakeupspec->wakeup >> 16) & 0x7; - rtcp->id_rtc->CR |= RTC_CR_WUTIE; - rtcp->id_rtc->CR |= RTC_CR_WUTE; - } - else { - rtcp->id_rtc->CR &= ~RTC_CR_WUTIE; - rtcp->id_rtc->CR &= ~RTC_CR_WUTE; - } -} - -/** - * @brief Gets time of periodic wakeup. - * - * @note Default value after BKP domain reset is 0x0000FFFF - * - * @param[in] rtcp pointer to RTC driver structure - * @param[out] wakeupspec pointer to a @p RTCWakeup structure - * - * @api - */ -void rtcGetPeriodicWakeup_v2(RTCDriver *rtcp, RTCWakeup *wakeupspec){ - wakeupspec->wakeup = 0; - wakeupspec->wakeup |= rtcp->id_rtc->WUTR; - wakeupspec->wakeup |= (((uint32_t)rtcp->id_rtc->CR) & 0x7) << 16; -} - -/** - * @brief Get current time in format suitable for usage in FatFS. - * - * @param[in] rtcp pointer to RTC driver structure - * @return FAT time value. - * - * @api - */ -uint32_t rtc_lld_get_time_fat(RTCDriver *rtcp) { - uint32_t fattime; - RTCTime timespec; - uint32_t tv_time; - uint32_t tv_date; - uint32_t v; - - chSysLock(); - rtcGetTimeI(rtcp, ×pec); - chSysUnlock(); - - tv_time = timespec.tv_time; - tv_date = timespec.tv_date; - - v = (tv_time & RTC_TR_SU) >> RTC_TR_SU_OFFSET; - v += ((tv_time & RTC_TR_ST) >> RTC_TR_ST_OFFSET) * 10; - fattime = v >> 1; - - v = (tv_time & RTC_TR_MNU) >> RTC_TR_MNU_OFFSET; - v += ((tv_time & RTC_TR_MNT) >> RTC_TR_MNT_OFFSET) * 10; - fattime |= v << 5; - - v = (tv_time & RTC_TR_HU) >> RTC_TR_HU_OFFSET; - v += ((tv_time & RTC_TR_HT) >> RTC_TR_HT_OFFSET) * 10; - v += 12 * ((tv_time & RTC_TR_PM) >> RTC_TR_PM_OFFSET); - fattime |= v << 11; - - v = (tv_date & RTC_DR_DU) >> RTC_DR_DU_OFFSET; - v += ((tv_date & RTC_DR_DT) >> RTC_DR_DT_OFFSET) * 10; - fattime |= v << 16; - - v = (tv_date & RTC_DR_MU) >> RTC_DR_MU_OFFSET; - v += ((tv_date & RTC_DR_MT) >> RTC_DR_MT_OFFSET) * 10; - fattime |= v << 21; - - v = (tv_date & RTC_DR_YU) >> RTC_DR_YU_OFFSET; - v += ((tv_date & RTC_DR_YT) >> RTC_DR_YT_OFFSET) * 10; - v += 2000 - 1900 - 80; - fattime |= v << 25; - - return fattime; -} - -#endif /* HAL_USE_RTC */ - -/** @} */ diff --git a/os/hal/platforms/STM32/RTCv2/rtc_lld.h b/os/hal/platforms/STM32/RTCv2/rtc_lld.h deleted file mode 100644 index c598fca51c..0000000000 --- a/os/hal/platforms/STM32/RTCv2/rtc_lld.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * @file STM32/RTCv2/rtc_lld.h - * @brief STM32L1xx/STM32F2xx/STM32F4xx RTC low level driver header. - * - * @addtogroup RTC - * @{ - */ - -#ifndef _RTC_LLD_H_ -#define _RTC_LLD_H_ - -#if HAL_USE_RTC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Two alarm comparators available on STM32F4x. - */ -#define RTC_ALARMS 2 - -/** - * @brief Data offsets in RTC date and time registers. - */ -#define RTC_TR_PM_OFFSET 22 -#define RTC_TR_HT_OFFSET 20 -#define RTC_TR_HU_OFFSET 16 -#define RTC_TR_MNT_OFFSET 12 -#define RTC_TR_MNU_OFFSET 8 -#define RTC_TR_ST_OFFSET 4 -#define RTC_TR_SU_OFFSET 0 - -#define RTC_DR_YT_OFFSET 20 -#define RTC_DR_YU_OFFSET 16 -#define RTC_DR_WDU_OFFSET 13 -#define RTC_DR_MT_OFFSET 12 -#define RTC_DR_MU_OFFSET 8 -#define RTC_DR_DT_OFFSET 4 -#define RTC_DR_DU_OFFSET 0 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if HAL_USE_RTC && !STM32_HAS_RTC -#error "RTC not present in the selected device" -#endif - -#if !(STM32_RTCSEL == STM32_RTCSEL_LSE) && \ - !(STM32_RTCSEL == STM32_RTCSEL_LSI) && \ - !(STM32_RTCSEL == STM32_RTCSEL_HSEDIV) -#error "invalid source selected for RTC clock" -#endif - -#if !defined(RTC_USE_INTERRUPTS) || defined(__DOXYGEN__) -#define RTC_USE_INTERRUPTS FALSE -#endif - -#if STM32_PCLK1 < (STM32_RTCCLK * 7) -#error "STM32_PCLK1 frequency is too low to handle RTC without ugly workaround" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an RTC alarm time stamp. - */ -typedef struct RTCAlarm RTCAlarm; - -/** - * @brief Type of a structure representing an RTC wakeup period. - */ -typedef struct RTCWakeup RTCWakeup; - -/** - * @brief Type of a structure representing an RTC callbacks config. - */ -typedef struct RTCCallbackConfig RTCCallbackConfig; - -/** - * @brief Type of an RTC alarm. - * @details Meaningful on platforms with more than 1 alarm comparator. - */ -typedef uint32_t rtcalarm_t; - -/** - * @brief Structure representing an RTC time stamp. - */ -struct RTCTime { - /** - * @brief RTC date register in STM32 BCD format. - */ - uint32_t tv_date; - /** - * @brief RTC time register in STM32 BCD format. - */ - uint32_t tv_time; - /** - * @brief Set this to TRUE to use 12 hour notation. - */ - bool_t h12; - /** - * @brief Fractional part of time. - */ -#if STM32_RTC_HAS_SUBSECONDS - uint32_t tv_msec; -#endif -}; - -/** - * @brief Structure representing an RTC alarm time stamp. - */ -struct RTCAlarm { - /** - * @brief Date and time of alarm in STM32 BCD. - */ - uint32_t tv_datetime; -}; - -/** - * @brief Structure representing an RTC periodic wakeup period. - */ -struct RTCWakeup { - /** - * @brief RTC WUTR register. - * @details Bits [15:0] contain value of WUTR register - * Bits [18:16] contain value of WUCKSEL bits in CR register - * - * @notes ((WUTR == 0) || (WUCKSEL == 3)) is forbidden combination. - */ - uint32_t wakeup; -}; - -/** - * @brief Structure representing an RTC driver. - */ -struct RTCDriver{ - /** - * @brief Pointer to the RTC registers block. - */ - RTC_TypeDef *id_rtc; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern RTCDriver RTCD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void rtc_lld_init(void); - void rtc_lld_set_time(RTCDriver *rtcp, const RTCTime *timespec); - void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec); - void rtc_lld_set_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - const RTCAlarm *alarmspec); - void rtc_lld_get_alarm(RTCDriver *rtcp, - rtcalarm_t alarm, - RTCAlarm *alarmspec); - void rtcSetPeriodicWakeup_v2(RTCDriver *rtcp, RTCWakeup *wakeupspec); - void rtcGetPeriodicWakeup_v2(RTCDriver *rtcp, RTCWakeup *wakeupspec); - uint32_t rtc_lld_get_time_fat(RTCDriver *rtcp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_RTC */ - -#endif /* _RTC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USARTv1/uart_lld.c b/os/hal/platforms/STM32/USARTv1/uart_lld.c deleted file mode 100644 index b642304637..0000000000 --- a/os/hal/platforms/STM32/USARTv1/uart_lld.c +++ /dev/null @@ -1,666 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/USARTv1/uart_lld.c - * @brief STM32 low level UART driver code. - * - * @addtogroup UART - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_UART || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define USART1_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART1_RX_DMA_STREAM, \ - STM32_USART1_RX_DMA_CHN) - -#define USART1_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART1_TX_DMA_STREAM, \ - STM32_USART1_TX_DMA_CHN) - -#define USART2_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART2_RX_DMA_STREAM, \ - STM32_USART2_RX_DMA_CHN) - -#define USART2_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART2_TX_DMA_STREAM, \ - STM32_USART2_TX_DMA_CHN) - -#define USART3_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART3_RX_DMA_STREAM, \ - STM32_USART3_RX_DMA_CHN) - -#define USART3_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART3_TX_DMA_STREAM, \ - STM32_USART3_TX_DMA_CHN) - -#define USART6_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART6_RX_DMA_STREAM, \ - STM32_USART6_RX_DMA_CHN) - -#define USART6_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART6_TX_DMA_STREAM, \ - STM32_USART6_TX_DMA_CHN) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief USART1 UART driver identifier.*/ -#if STM32_UART_USE_USART1 || defined(__DOXYGEN__) -UARTDriver UARTD1; -#endif - -/** @brief USART2 UART driver identifier.*/ -#if STM32_UART_USE_USART2 || defined(__DOXYGEN__) -UARTDriver UARTD2; -#endif - -/** @brief USART3 UART driver identifier.*/ -#if STM32_UART_USE_USART3 || defined(__DOXYGEN__) -UARTDriver UARTD3; -#endif - - -/** @brief USART6 UART driver identifier.*/ -#if STM32_UART_USE_USART6 || defined(__DOXYGEN__) -UARTDriver UARTD6; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Status bits translation. - * - * @param[in] sr USART SR register value - * - * @return The error flags. - */ -static uartflags_t translate_errors(uint16_t sr) { - uartflags_t sts = 0; - - if (sr & USART_SR_ORE) - sts |= UART_OVERRUN_ERROR; - if (sr & USART_SR_PE) - sts |= UART_PARITY_ERROR; - if (sr & USART_SR_FE) - sts |= UART_FRAMING_ERROR; - if (sr & USART_SR_NE) - sts |= UART_NOISE_ERROR; - if (sr & USART_SR_LBD) - sts |= UART_BREAK_DETECTED; - return sts; -} - -/** - * @brief Puts the receiver in the UART_RX_IDLE state. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void set_rx_idle_loop(UARTDriver *uartp) { - uint32_t mode; - - /* RX DMA channel preparation, if the char callback is defined then the - TCIE interrupt is enabled too.*/ - if (uartp->config->rxchar_cb == NULL) - mode = STM32_DMA_CR_DIR_P2M | STM32_DMA_CR_CIRC; - else - mode = STM32_DMA_CR_DIR_P2M | STM32_DMA_CR_CIRC | STM32_DMA_CR_TCIE; - dmaStreamSetMemory0(uartp->dmarx, &uartp->rxbuf); - dmaStreamSetTransactionSize(uartp->dmarx, 1); - dmaStreamSetMode(uartp->dmarx, uartp->dmamode | mode); - dmaStreamEnable(uartp->dmarx); -} - -/** - * @brief USART de-initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void usart_stop(UARTDriver *uartp) { - - /* Stops RX and TX DMA channels.*/ - dmaStreamDisable(uartp->dmarx); - dmaStreamDisable(uartp->dmatx); - - /* Stops USART operations.*/ - uartp->usart->CR1 = 0; - uartp->usart->CR2 = 0; - uartp->usart->CR3 = 0; -} - -/** - * @brief USART initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void usart_start(UARTDriver *uartp) { - uint16_t cr1; - USART_TypeDef *u = uartp->usart; - - /* Defensive programming, starting from a clean state.*/ - usart_stop(uartp); - - /* Baud rate setting.*/ -#if STM32_HAS_USART6 - if ((uartp->usart == USART1) || (uartp->usart == USART6)) -#else - if (uartp->usart == USART1) -#endif - u->BRR = STM32_PCLK2 / uartp->config->speed; - else - u->BRR = STM32_PCLK1 / uartp->config->speed; - - /* Resetting eventual pending status flags.*/ - (void)u->SR; /* SR reset step 1.*/ - (void)u->DR; /* SR reset step 2.*/ - u->SR = 0; - - /* Note that some bits are enforced because required for correct driver - operations.*/ - if (uartp->config->txend2_cb == NULL) - cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE; - else - cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE | - USART_CR1_TCIE; - u->CR1 = uartp->config->cr1 | cr1; - u->CR2 = uartp->config->cr2 | USART_CR2_LBDIE; - u->CR3 = uartp->config->cr3 | USART_CR3_DMAT | USART_CR3_DMAR | - USART_CR3_EIE; - - /* Starting the receiver idle loop.*/ - set_rx_idle_loop(uartp); -} - -/** - * @brief RX DMA common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void uart_lld_serve_rx_end_irq(UARTDriver *uartp, uint32_t flags) { - - /* DMA errors handling.*/ -#if defined(STM32_UART_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_UART_DMA_ERROR_HOOK(uartp); - } -#else - (void)flags; -#endif - - if (uartp->rxstate == UART_RX_IDLE) { - /* Receiver in idle state, a callback is generated, if enabled, for each - received character and then the driver stays in the same state.*/ - if (uartp->config->rxchar_cb != NULL) - uartp->config->rxchar_cb(uartp, uartp->rxbuf); - } - else { - /* Receiver in active state, a callback is generated, if enabled, after - a completed transfer.*/ - dmaStreamDisable(uartp->dmarx); - uartp->rxstate = UART_RX_COMPLETE; - if (uartp->config->rxend_cb != NULL) - uartp->config->rxend_cb(uartp); - - /* If the callback didn't explicitly change state then the receiver - automatically returns to the idle state.*/ - if (uartp->rxstate == UART_RX_COMPLETE) { - uartp->rxstate = UART_RX_IDLE; - set_rx_idle_loop(uartp); - } - } -} - -/** - * @brief TX DMA common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void uart_lld_serve_tx_end_irq(UARTDriver *uartp, uint32_t flags) { - - /* DMA errors handling.*/ -#if defined(STM32_UART_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_UART_DMA_ERROR_HOOK(uartp); - } -#else - (void)flags; -#endif - - dmaStreamDisable(uartp->dmatx); - - /* A callback is generated, if enabled, after a completed transfer.*/ - uartp->txstate = UART_TX_COMPLETE; - if (uartp->config->txend1_cb != NULL) - uartp->config->txend1_cb(uartp); - - /* If the callback didn't explicitly change state then the transmitter - automatically returns to the idle state.*/ - if (uartp->txstate == UART_TX_COMPLETE) - uartp->txstate = UART_TX_IDLE; -} - -/** - * @brief USART common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void serve_usart_irq(UARTDriver *uartp) { - uint16_t sr; - USART_TypeDef *u = uartp->usart; - - sr = u->SR; /* SR reset step 1.*/ - (void)u->DR; /* SR reset step 2.*/ - if (sr & (USART_SR_LBD | USART_SR_ORE | USART_SR_NE | - USART_SR_FE | USART_SR_PE)) { - u->SR = ~USART_SR_LBD; - if (uartp->config->rxerr_cb != NULL) - uartp->config->rxerr_cb(uartp, translate_errors(sr)); - } - if (sr & USART_SR_TC) { - u->SR = ~USART_SR_TC; - - /* End of transmission, a callback is generated.*/ - if (uartp->config->txend2_cb != NULL) - uartp->config->txend2_cb(uartp); - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_UART_USE_USART1 || defined(__DOXYGEN__) -#if !defined(STM32_USART1_HANDLER) -#error "STM32_USART1_HANDLER not defined" -#endif -/** - * @brief USART1 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART1_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART1 */ - -#if STM32_UART_USE_USART2 || defined(__DOXYGEN__) -#if !defined(STM32_USART2_HANDLER) -#error "STM32_USART2_HANDLER not defined" -#endif -/** - * @brief USART2 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART2 */ - -#if STM32_UART_USE_USART3 || defined(__DOXYGEN__) -#if !defined(STM32_USART3_HANDLER) -#error "STM32_USART3_HANDLER not defined" -#endif -/** - * @brief USART3 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART3_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART3 */ - -#if STM32_UART_USE_USART6 || defined(__DOXYGEN__) -#if !defined(STM32_USART6_HANDLER) -#error "STM32_USART6_HANDLER not defined" -#endif -/** - * @brief USART6 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART6_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD6); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART6 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level UART driver initialization. - * - * @notapi - */ -void uart_lld_init(void) { - -#if STM32_UART_USE_USART1 - uartObjectInit(&UARTD1); - UARTD1.usart = USART1; - UARTD1.dmarx = STM32_DMA_STREAM(STM32_UART_USART1_RX_DMA_STREAM); - UARTD1.dmatx = STM32_DMA_STREAM(STM32_UART_USART1_TX_DMA_STREAM); -#endif - -#if STM32_UART_USE_USART2 - uartObjectInit(&UARTD2); - UARTD2.usart = USART2; - UARTD2.dmarx = STM32_DMA_STREAM(STM32_UART_USART2_RX_DMA_STREAM); - UARTD2.dmatx = STM32_DMA_STREAM(STM32_UART_USART2_TX_DMA_STREAM); -#endif - -#if STM32_UART_USE_USART3 - uartObjectInit(&UARTD3); - UARTD3.usart = USART3; - UARTD3.dmarx = STM32_DMA_STREAM(STM32_UART_USART3_RX_DMA_STREAM); - UARTD3.dmatx = STM32_DMA_STREAM(STM32_UART_USART3_TX_DMA_STREAM); -#endif - -#if STM32_UART_USE_USART6 - uartObjectInit(&UARTD6); - UARTD6.usart = USART6; - UARTD6.dmarx = STM32_DMA_STREAM(STM32_UART_USART6_RX_DMA_STREAM); - UARTD6.dmatx = STM32_DMA_STREAM(STM32_UART_USART6_TX_DMA_STREAM); -#endif -} - -/** - * @brief Configures and activates the UART peripheral. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @notapi - */ -void uart_lld_start(UARTDriver *uartp) { - - uartp->dmamode = STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; - - if (uartp->state == UART_STOP) { -#if STM32_UART_USE_USART1 - if (&UARTD1 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART1_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #1", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART1_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #2", "stream already allocated"); - rccEnableUSART1(FALSE); - nvicEnableVector(STM32_USART1_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART1_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART1_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART1_DMA_PRIORITY); - } -#endif - -#if STM32_UART_USE_USART2 - if (&UARTD2 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART2_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #3", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART2_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #4", "stream already allocated"); - rccEnableUSART2(FALSE); - nvicEnableVector(STM32_USART2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART2_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART2_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART2_DMA_PRIORITY); - } -#endif - -#if STM32_UART_USE_USART3 - if (&UARTD3 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART3_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #5", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART3_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #6", "stream already allocated"); - rccEnableUSART3(FALSE); - nvicEnableVector(STM32_USART3_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART3_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART3_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART3_DMA_PRIORITY); - } -#endif - -#if STM32_UART_USE_USART6 - if (&UARTD6 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART6_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #5", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART6_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #6", "stream already allocated"); - rccEnableUSART6(FALSE); - nvicEnableVector(STM32_USART6_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART6_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART6_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART6_DMA_PRIORITY); - } -#endif - - /* Static DMA setup, the transfer size depends on the USART settings, - it is 16 bits if M=1 and PCE=0 else it is 8 bits.*/ - if ((uartp->config->cr1 & (USART_CR1_M | USART_CR1_PCE)) == USART_CR1_M) - uartp->dmamode |= STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD; - dmaStreamSetPeripheral(uartp->dmarx, &uartp->usart->DR); - dmaStreamSetPeripheral(uartp->dmatx, &uartp->usart->DR); - uartp->rxbuf = 0; - } - - uartp->rxstate = UART_RX_IDLE; - uartp->txstate = UART_TX_IDLE; - usart_start(uartp); -} - -/** - * @brief Deactivates the UART peripheral. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @notapi - */ -void uart_lld_stop(UARTDriver *uartp) { - - if (uartp->state == UART_READY) { - usart_stop(uartp); - dmaStreamRelease(uartp->dmarx); - dmaStreamRelease(uartp->dmatx); - -#if STM32_UART_USE_USART1 - if (&UARTD1 == uartp) { - nvicDisableVector(STM32_USART1_NUMBER); - rccDisableUSART1(FALSE); - return; - } -#endif - -#if STM32_UART_USE_USART2 - if (&UARTD2 == uartp) { - nvicDisableVector(STM32_USART2_NUMBER); - rccDisableUSART2(FALSE); - return; - } -#endif - -#if STM32_UART_USE_USART3 - if (&UARTD3 == uartp) { - nvicDisableVector(STM32_USART3_NUMBER); - rccDisableUSART3(FALSE); - return; - } -#endif - -#if STM32_UART_USE_USART6 - if (&UARTD6 == uartp) { - nvicDisableVector(STM32_USART6_NUMBER); - rccDisableUSART6(FALSE); - return; - } -#endif - } -} - -/** - * @brief Starts a transmission on the UART peripheral. - * @note The buffers are organized as uint8_t arrays for data sizes below - * or equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] n number of data frames to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void uart_lld_start_send(UARTDriver *uartp, size_t n, const void *txbuf) { - - /* TX DMA channel preparation and start.*/ - dmaStreamSetMemory0(uartp->dmatx, txbuf); - dmaStreamSetTransactionSize(uartp->dmatx, n); - dmaStreamSetMode(uartp->dmatx, uartp->dmamode | STM32_DMA_CR_DIR_M2P | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE); - dmaStreamEnable(uartp->dmatx); -} - -/** - * @brief Stops any ongoing transmission. - * @note Stopping a transmission also suppresses the transmission callbacks. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @return The number of data frames not transmitted by the - * stopped transmit operation. - * - * @notapi - */ -size_t uart_lld_stop_send(UARTDriver *uartp) { - - dmaStreamDisable(uartp->dmatx); - return dmaStreamGetTransactionSize(uartp->dmatx); -} - -/** - * @brief Starts a receive operation on the UART peripheral. - * @note The buffers are organized as uint8_t arrays for data sizes below - * or equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] n number of data frames to send - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf) { - - /* Stopping previous activity (idle state).*/ - dmaStreamDisable(uartp->dmarx); - - /* RX DMA channel preparation and start.*/ - dmaStreamSetMemory0(uartp->dmarx, rxbuf); - dmaStreamSetTransactionSize(uartp->dmarx, n); - dmaStreamSetMode(uartp->dmarx, uartp->dmamode | STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE); - dmaStreamEnable(uartp->dmarx); -} - -/** - * @brief Stops any ongoing receive operation. - * @note Stopping a receive operation also suppresses the receive callbacks. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @return The number of data frames not received by the - * stopped receive operation. - * - * @notapi - */ -size_t uart_lld_stop_receive(UARTDriver *uartp) { - size_t n; - - dmaStreamDisable(uartp->dmarx); - n = dmaStreamGetTransactionSize(uartp->dmarx); - set_rx_idle_loop(uartp); - return n; -} - -#endif /* HAL_USE_UART */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USARTv1/uart_lld.h b/os/hal/platforms/STM32/USARTv1/uart_lld.h deleted file mode 100644 index 7994b1e627..0000000000 --- a/os/hal/platforms/STM32/USARTv1/uart_lld.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/uart_lld.h - * @brief STM32 low level UART driver header. - * - * @addtogroup UART - * @{ - */ - -#ifndef _UART_LLD_H_ -#define _UART_LLD_H_ - -#if HAL_USE_UART || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief UART driver on USART1 enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART1) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART1 FALSE -#endif - -/** - * @brief UART driver on USART2 enable switch. - * @details If set to @p TRUE the support for USART2 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART2) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART2 FALSE -#endif - -/** - * @brief UART driver on USART3 enable switch. - * @details If set to @p TRUE the support for USART3 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART3) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART3 FALSE -#endif - -/** - * @brief UART driver on USART6 enable switch. - * @details If set to @p TRUE the support for USART6 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART6) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART6 FALSE -#endif - -/** - * @brief USART1 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART2 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART3 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART6 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART6_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART1 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART1_DMA_PRIORITY 0 -#endif - -/** - * @brief USART2 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART2_DMA_PRIORITY 0 -#endif - -/** - * @brief USART3 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART3_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART3_DMA_PRIORITY 0 -#endif - -/** - * @brief USART6 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART6_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART6_DMA_PRIORITY 0 -#endif - -/** - * @brief USART1 DMA error hook. - * @note The default action for DMA errors is a system halt because DMA - * error can only happen because programming errors. - */ -#if !defined(STM32_UART_DMA_ERROR_HOOK) || defined(__DOXYGEN__) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() -#endif - -#if STM32_ADVANCED_DMA || defined(__DOXYGEN__) - -/** - * @brief DMA stream used for USART1 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART1_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#endif - -/** - * @brief DMA stream used for USART1 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART1_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#endif - -/** - * @brief DMA stream used for USART2 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART2_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#endif - -/** - * @brief DMA stream used for USART2 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART2_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#endif - -/** - * @brief DMA stream used for USART3 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART3_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#endif - -/** - * @brief DMA stream used for USART3 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART3_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#endif - -/** - * @brief DMA stream used for USART6 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART6_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#endif - -/** - * @brief DMA stream used for USART6 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART6_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#endif - -#else /* !STM32_ADVANCED_DMA */ - -/* Fixed streams for platforms using the old DMA peripheral, the values are - valid for both STM32F1xx and STM32L1xx.*/ -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) - -#endif /* !STM32_ADVANCED_DMA*/ -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_UART_USE_USART1 && !STM32_HAS_USART1 -#error "USART1 not present in the selected device" -#endif - -#if STM32_UART_USE_USART2 && !STM32_HAS_USART2 -#error "USART2 not present in the selected device" -#endif - -#if STM32_UART_USE_USART3 && !STM32_HAS_USART3 -#error "USART3 not present in the selected device" -#endif - -#if STM32_UART_USE_USART6 && !STM32_HAS_USART6 -#error "USART6 not present in the selected device" -#endif - -#if !STM32_UART_USE_USART1 && !STM32_UART_USE_USART2 && \ - !STM32_UART_USE_USART3 && !STM32_UART_USE_USART6 -#error "UART driver activated but no USART/UART peripheral assigned" -#endif - -#if STM32_UART_USE_USART1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART1" -#endif - -#if STM32_UART_USE_USART2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART2" -#endif - -#if STM32_UART_USE_USART3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART3_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART3" -#endif - -#if STM32_UART_USE_USART6 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART6_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART6" -#endif - -#if STM32_UART_USE_USART1 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART1_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART1" -#endif - -#if STM32_UART_USE_USART2 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART2_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART2" -#endif - -#if STM32_UART_USE_USART3 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART3_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART3" -#endif - -#if STM32_UART_USE_USART6 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART6_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART6" -#endif - -#if STM32_UART_USE_USART1 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART1_RX_DMA_STREAM, \ - STM32_USART1_RX_DMA_MSK) -#error "invalid DMA stream associated to USART1 RX" -#endif - -#if STM32_UART_USE_USART1 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART1_TX_DMA_STREAM, \ - STM32_USART1_TX_DMA_MSK) -#error "invalid DMA stream associated to USART1 TX" -#endif - -#if STM32_UART_USE_USART2 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART2_RX_DMA_STREAM, \ - STM32_USART2_RX_DMA_MSK) -#error "invalid DMA stream associated to USART2 RX" -#endif - -#if STM32_UART_USE_USART2 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART2_TX_DMA_STREAM, \ - STM32_USART2_TX_DMA_MSK) -#error "invalid DMA stream associated to USART2 TX" -#endif - -#if STM32_UART_USE_USART3 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART3_RX_DMA_STREAM, \ - STM32_USART3_RX_DMA_MSK) -#error "invalid DMA stream associated to USART3 RX" -#endif - -#if STM32_UART_USE_USART3 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART3_TX_DMA_STREAM, \ - STM32_USART3_TX_DMA_MSK) -#error "invalid DMA stream associated to USART3 TX" -#endif - -#if STM32_UART_USE_USART6 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART6_RX_DMA_STREAM, \ - STM32_USART6_RX_DMA_MSK) -#error "invalid DMA stream associated to USART6 RX" -#endif - -#if STM32_UART_USE_USART6 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART6_TX_DMA_STREAM, \ - STM32_USART6_TX_DMA_MSK) -#error "invalid DMA stream associated to USART6 TX" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief UART driver condition flags type. - */ -typedef uint32_t uartflags_t; - -/** - * @brief Structure representing an UART driver. - */ -typedef struct UARTDriver UARTDriver; - -/** - * @brief Generic UART notification callback type. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -typedef void (*uartcb_t)(UARTDriver *uartp); - -/** - * @brief Character received UART notification callback type. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] c received character - */ -typedef void (*uartccb_t)(UARTDriver *uartp, uint16_t c); - -/** - * @brief Receive error UART notification callback type. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] e receive error mask - */ -typedef void (*uartecb_t)(UARTDriver *uartp, uartflags_t e); - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief End of transmission buffer callback. - */ - uartcb_t txend1_cb; - /** - * @brief Physical end of transmission callback. - */ - uartcb_t txend2_cb; - /** - * @brief Receive buffer filled callback. - */ - uartcb_t rxend_cb; - /** - * @brief Character received while out if the @p UART_RECEIVE state. - */ - uartccb_t rxchar_cb; - /** - * @brief Receive error callback. - */ - uartecb_t rxerr_cb; - /* End of the mandatory fields.*/ - /** - * @brief Bit rate. - */ - uint32_t speed; - /** - * @brief Initialization value for the CR1 register. - */ - uint16_t cr1; - /** - * @brief Initialization value for the CR2 register. - */ - uint16_t cr2; - /** - * @brief Initialization value for the CR3 register. - */ - uint16_t cr3; -} UARTConfig; - -/** - * @brief Structure representing an UART driver. - */ -struct UARTDriver { - /** - * @brief Driver state. - */ - uartstate_t state; - /** - * @brief Transmitter state. - */ - uarttxstate_t txstate; - /** - * @brief Receiver state. - */ - uartrxstate_t rxstate; - /** - * @brief Current configuration data. - */ - const UARTConfig *config; -#if defined(UART_DRIVER_EXT_FIELDS) - UART_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the USART registers block. - */ - USART_TypeDef *usart; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; - /** - * @brief Receive DMA channel. - */ - const stm32_dma_stream_t *dmarx; - /** - * @brief Transmit DMA channel. - */ - const stm32_dma_stream_t *dmatx; - /** - * @brief Default receive buffer while into @p UART_RX_IDLE state. - */ - volatile uint16_t rxbuf; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_UART_USE_USART1 && !defined(__DOXYGEN__) -extern UARTDriver UARTD1; -#endif - -#if STM32_UART_USE_USART2 && !defined(__DOXYGEN__) -extern UARTDriver UARTD2; -#endif - -#if STM32_UART_USE_USART3 && !defined(__DOXYGEN__) -extern UARTDriver UARTD3; -#endif - -#if STM32_UART_USE_USART6 && !defined(__DOXYGEN__) -extern UARTDriver UARTD6; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void uart_lld_init(void); - void uart_lld_start(UARTDriver *uartp); - void uart_lld_stop(UARTDriver *uartp); - void uart_lld_start_send(UARTDriver *uartp, size_t n, const void *txbuf); - size_t uart_lld_stop_send(UARTDriver *uartp); - void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf); - size_t uart_lld_stop_receive(UARTDriver *uartp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_UART */ - -#endif /* _UART_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USARTv2/uart_lld.c b/os/hal/platforms/STM32/USARTv2/uart_lld.c deleted file mode 100644 index 276aa7e8db..0000000000 --- a/os/hal/platforms/STM32/USARTv2/uart_lld.c +++ /dev/null @@ -1,597 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/USARTv2/uart_lld.c - * @brief STM32 low level UART driver code. - * - * @addtogroup UART - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_UART || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define USART1_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART1_RX_DMA_STREAM, \ - STM32_USART1_RX_DMA_CHN) - -#define USART1_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART1_TX_DMA_STREAM, \ - STM32_USART1_TX_DMA_CHN) - -#define USART2_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART2_RX_DMA_STREAM, \ - STM32_USART2_RX_DMA_CHN) - -#define USART2_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART2_TX_DMA_STREAM, \ - STM32_USART2_TX_DMA_CHN) - -#define USART3_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART3_RX_DMA_STREAM, \ - STM32_USART3_RX_DMA_CHN) - -#define USART3_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_UART_USART3_TX_DMA_STREAM, \ - STM32_USART3_TX_DMA_CHN) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief USART1 UART driver identifier.*/ -#if STM32_UART_USE_USART1 || defined(__DOXYGEN__) -UARTDriver UARTD1; -#endif - -/** @brief USART2 UART driver identifier.*/ -#if STM32_UART_USE_USART2 || defined(__DOXYGEN__) -UARTDriver UARTD2; -#endif - -/** @brief USART3 UART driver identifier.*/ -#if STM32_UART_USE_USART3 || defined(__DOXYGEN__) -UARTDriver UARTD3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Status bits translation. - * - * @param[in] sr USART SR register value - * - * @return The error flags. - */ -static uartflags_t translate_errors(uint16_t isr) { - uartflags_t sts = 0; - - if (isr & USART_ISR_ORE) - sts |= UART_OVERRUN_ERROR; - if (isr & USART_ISR_PE) - sts |= UART_PARITY_ERROR; - if (isr & USART_ISR_FE) - sts |= UART_FRAMING_ERROR; - if (isr & USART_ISR_NE) - sts |= UART_NOISE_ERROR; - if (isr & USART_ISR_LBD) - sts |= UART_BREAK_DETECTED; - return sts; -} - -/** - * @brief Puts the receiver in the UART_RX_IDLE state. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void set_rx_idle_loop(UARTDriver *uartp) { - uint32_t mode; - - /* RX DMA channel preparation, if the char callback is defined then the - TCIE interrupt is enabled too.*/ - if (uartp->config->rxchar_cb == NULL) - mode = STM32_DMA_CR_DIR_P2M | STM32_DMA_CR_CIRC; - else - mode = STM32_DMA_CR_DIR_P2M | STM32_DMA_CR_CIRC | STM32_DMA_CR_TCIE; - dmaStreamSetMemory0(uartp->dmarx, &uartp->rxbuf); - dmaStreamSetTransactionSize(uartp->dmarx, 1); - dmaStreamSetMode(uartp->dmarx, uartp->dmamode | mode); - dmaStreamEnable(uartp->dmarx); -} - -/** - * @brief USART de-initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void usart_stop(UARTDriver *uartp) { - - /* Stops RX and TX DMA channels.*/ - dmaStreamDisable(uartp->dmarx); - dmaStreamDisable(uartp->dmatx); - - /* Stops USART operations.*/ - uartp->usart->CR1 = 0; - uartp->usart->CR2 = 0; - uartp->usart->CR3 = 0; -} - -/** - * @brief USART initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void usart_start(UARTDriver *uartp) { - uint16_t cr1; - USART_TypeDef *u = uartp->usart; - - /* Defensive programming, starting from a clean state.*/ - usart_stop(uartp); - - /* Baud rate setting.*/ -#if defined(STM32F0XX) - if (uartp->usart == USART1) - u->BRR = STM32_USART1CLK / uartp->config->speed; - else - u->BRR = STM32_PCLK / uartp->config->speed; -#else /* !defined(STM32F0XX) */ - if (uartp->usart == USART1) - u->BRR = STM32_PCLK2 / uartp->config->speed; - else - u->BRR = STM32_PCLK1 / uartp->config->speed; -#endif /* !defined(STM32F0XX) */ - - /* Resetting eventual pending status flags.*/ - u->ICR = 0xFFFFFFFF; - - /* Note that some bits are enforced because required for correct driver - operations.*/ - if (uartp->config->txend2_cb == NULL) - cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE; - else - cr1 = USART_CR1_UE | USART_CR1_PEIE | USART_CR1_TE | USART_CR1_RE | - USART_CR1_TCIE; - u->CR1 = uartp->config->cr1 | cr1; - u->CR2 = uartp->config->cr2 | USART_CR2_LBDIE; - u->CR3 = uartp->config->cr3 | USART_CR3_DMAT | USART_CR3_DMAR | - USART_CR3_EIE; - - /* Starting the receiver idle loop.*/ - set_rx_idle_loop(uartp); -} - -/** - * @brief RX DMA common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void uart_lld_serve_rx_end_irq(UARTDriver *uartp, uint32_t flags) { - - /* DMA errors handling.*/ -#if defined(STM32_UART_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_UART_DMA_ERROR_HOOK(uartp); - } -#else - (void)flags; -#endif - - if (uartp->rxstate == UART_RX_IDLE) { - /* Receiver in idle state, a callback is generated, if enabled, for each - received character and then the driver stays in the same state.*/ - if (uartp->config->rxchar_cb != NULL) - uartp->config->rxchar_cb(uartp, uartp->rxbuf); - } - else { - /* Receiver in active state, a callback is generated, if enabled, after - a completed transfer.*/ - dmaStreamDisable(uartp->dmarx); - uartp->rxstate = UART_RX_COMPLETE; - if (uartp->config->rxend_cb != NULL) - uartp->config->rxend_cb(uartp); - - /* If the callback didn't explicitly change state then the receiver - automatically returns to the idle state.*/ - if (uartp->rxstate == UART_RX_COMPLETE) { - uartp->rxstate = UART_RX_IDLE; - set_rx_idle_loop(uartp); - } - } -} - -/** - * @brief TX DMA common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void uart_lld_serve_tx_end_irq(UARTDriver *uartp, uint32_t flags) { - - /* DMA errors handling.*/ -#if defined(STM32_UART_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_UART_DMA_ERROR_HOOK(uartp); - } -#else - (void)flags; -#endif - - dmaStreamDisable(uartp->dmatx); - - /* A callback is generated, if enabled, after a completed transfer.*/ - uartp->txstate = UART_TX_COMPLETE; - if (uartp->config->txend1_cb != NULL) - uartp->config->txend1_cb(uartp); - - /* If the callback didn't explicitly change state then the transmitter - automatically returns to the idle state.*/ - if (uartp->txstate == UART_TX_COMPLETE) - uartp->txstate = UART_TX_IDLE; -} - -/** - * @brief USART common service routine. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -static void serve_usart_irq(UARTDriver *uartp) { - uint16_t isr; - USART_TypeDef *u = uartp->usart; - - /* Reading and clearing status.*/ - isr = u->ISR; - u->ICR = isr; - - if (isr & (USART_ISR_LBD | USART_ISR_ORE | USART_ISR_NE | - USART_ISR_FE | USART_ISR_PE)) { - if (uartp->config->rxerr_cb != NULL) - uartp->config->rxerr_cb(uartp, translate_errors(isr)); - } - if (isr & USART_ISR_TC) { - /* End of transmission, a callback is generated.*/ - if (uartp->config->txend2_cb != NULL) - uartp->config->txend2_cb(uartp); - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_UART_USE_USART1 || defined(__DOXYGEN__) -#if !defined(STM32_USART1_HANDLER) -#error "STM32_USART1_HANDLER not defined" -#endif -/** - * @brief USART1 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART1_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART1 */ - -#if STM32_UART_USE_USART2 || defined(__DOXYGEN__) -#if !defined(STM32_USART2_HANDLER) -#error "STM32_USART2_HANDLER not defined" -#endif -/** - * @brief USART2 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART2 */ - -#if STM32_UART_USE_USART3 || defined(__DOXYGEN__) -#if !defined(STM32_USART3_HANDLER) -#error "STM32_USART3_HANDLER not defined" -#endif -/** - * @brief USART3 IRQ handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART3_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_usart_irq(&UARTD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_UART_USE_USART3 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level UART driver initialization. - * - * @notapi - */ -void uart_lld_init(void) { - -#if STM32_UART_USE_USART1 - uartObjectInit(&UARTD1); - UARTD1.usart = USART1; - UARTD1.dmarx = STM32_DMA_STREAM(STM32_UART_USART1_RX_DMA_STREAM); - UARTD1.dmatx = STM32_DMA_STREAM(STM32_UART_USART1_TX_DMA_STREAM); -#endif - -#if STM32_UART_USE_USART2 - uartObjectInit(&UARTD2); - UARTD2.usart = USART2; - UARTD2.dmarx = STM32_DMA_STREAM(STM32_UART_USART2_RX_DMA_STREAM); - UARTD2.dmatx = STM32_DMA_STREAM(STM32_UART_USART2_TX_DMA_STREAM); -#endif - -#if STM32_UART_USE_USART3 - uartObjectInit(&UARTD3); - UARTD3.usart = USART3; - UARTD3.dmarx = STM32_DMA_STREAM(STM32_UART_USART3_RX_DMA_STREAM); - UARTD3.dmatx = STM32_DMA_STREAM(STM32_UART_USART3_TX_DMA_STREAM); -#endif -} - -/** - * @brief Configures and activates the UART peripheral. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @notapi - */ -void uart_lld_start(UARTDriver *uartp) { - - uartp->dmamode = STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; - - if (uartp->state == UART_STOP) { -#if STM32_UART_USE_USART1 - if (&UARTD1 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART1_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #1", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART1_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #2", "stream already allocated"); - rccEnableUSART1(FALSE); - nvicEnableVector(STM32_USART1_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART1_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART1_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART1_DMA_PRIORITY); - } -#endif - -#if STM32_UART_USE_USART2 - if (&UARTD2 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART2_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #3", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART2_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #4", "stream already allocated"); - rccEnableUSART2(FALSE); - nvicEnableVector(STM32_USART2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART2_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART2_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART2_DMA_PRIORITY); - } -#endif - -#if STM32_UART_USE_USART3 - if (&UARTD3 == uartp) { - bool_t b; - b = dmaStreamAllocate(uartp->dmarx, - STM32_UART_USART3_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_rx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #5", "stream already allocated"); - b = dmaStreamAllocate(uartp->dmatx, - STM32_UART_USART3_IRQ_PRIORITY, - (stm32_dmaisr_t)uart_lld_serve_tx_end_irq, - (void *)uartp); - chDbgAssert(!b, "uart_lld_start(), #6", "stream already allocated"); - rccEnableUSART3(FALSE); - nvicEnableVector(STM32_USART3_NUMBER, - CORTEX_PRIORITY_MASK(STM32_UART_USART3_IRQ_PRIORITY)); - uartp->dmamode |= STM32_DMA_CR_CHSEL(USART3_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_UART_USART3_DMA_PRIORITY); - } -#endif - - /* Static DMA setup, the transfer size depends on the USART settings, - it is 16 bits if M=1 and PCE=0 else it is 8 bits.*/ - if ((uartp->config->cr1 & (USART_CR1_M | USART_CR1_PCE)) == USART_CR1_M) - uartp->dmamode |= STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD; - dmaStreamSetPeripheral(uartp->dmarx, &uartp->usart->RDR); - dmaStreamSetPeripheral(uartp->dmatx, &uartp->usart->TDR); - uartp->rxbuf = 0; - } - - uartp->rxstate = UART_RX_IDLE; - uartp->txstate = UART_TX_IDLE; - usart_start(uartp); -} - -/** - * @brief Deactivates the UART peripheral. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @notapi - */ -void uart_lld_stop(UARTDriver *uartp) { - - if (uartp->state == UART_READY) { - usart_stop(uartp); - dmaStreamRelease(uartp->dmarx); - dmaStreamRelease(uartp->dmatx); - -#if STM32_UART_USE_USART1 - if (&UARTD1 == uartp) { - nvicDisableVector(STM32_USART1_NUMBER); - rccDisableUSART1(FALSE); - return; - } -#endif - -#if STM32_UART_USE_USART2 - if (&UARTD2 == uartp) { - nvicDisableVector(STM32_USART2_NUMBER); - rccDisableUSART2(FALSE); - return; - } -#endif - -#if STM32_UART_USE_USART3 - if (&UARTD3 == uartp) { - nvicDisableVector(STM32_USART3_NUMBER); - rccDisableUSART3(FALSE); - return; - } -#endif - } -} - -/** - * @brief Starts a transmission on the UART peripheral. - * @note The buffers are organized as uint8_t arrays for data sizes below - * or equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] n number of data frames to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void uart_lld_start_send(UARTDriver *uartp, size_t n, const void *txbuf) { - - /* TX DMA channel preparation and start.*/ - dmaStreamSetMemory0(uartp->dmatx, txbuf); - dmaStreamSetTransactionSize(uartp->dmatx, n); - dmaStreamSetMode(uartp->dmatx, uartp->dmamode | STM32_DMA_CR_DIR_M2P | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE); - dmaStreamEnable(uartp->dmatx); -} - -/** - * @brief Stops any ongoing transmission. - * @note Stopping a transmission also suppresses the transmission callbacks. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @return The number of data frames not transmitted by the - * stopped transmit operation. - * - * @notapi - */ -size_t uart_lld_stop_send(UARTDriver *uartp) { - - dmaStreamDisable(uartp->dmatx); - return dmaStreamGetTransactionSize(uartp->dmatx); -} - -/** - * @brief Starts a receive operation on the UART peripheral. - * @note The buffers are organized as uint8_t arrays for data sizes below - * or equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] n number of data frames to send - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf) { - - /* Stopping previous activity (idle state).*/ - dmaStreamDisable(uartp->dmarx); - - /* RX DMA channel preparation and start.*/ - dmaStreamSetMemory0(uartp->dmarx, rxbuf); - dmaStreamSetTransactionSize(uartp->dmarx, n); - dmaStreamSetMode(uartp->dmarx, uartp->dmamode | STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE); - dmaStreamEnable(uartp->dmarx); -} - -/** - * @brief Stops any ongoing receive operation. - * @note Stopping a receive operation also suppresses the receive callbacks. - * - * @param[in] uartp pointer to the @p UARTDriver object - * - * @return The number of data frames not received by the - * stopped receive operation. - * - * @notapi - */ -size_t uart_lld_stop_receive(UARTDriver *uartp) { - size_t n; - - dmaStreamDisable(uartp->dmarx); - n = dmaStreamGetTransactionSize(uartp->dmarx); - set_rx_idle_loop(uartp); - return n; -} - -#endif /* HAL_USE_UART */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USARTv2/uart_lld.h b/os/hal/platforms/STM32/USARTv2/uart_lld.h deleted file mode 100644 index 29a5e85da1..0000000000 --- a/os/hal/platforms/STM32/USARTv2/uart_lld.h +++ /dev/null @@ -1,438 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/uart_lld.h - * @brief STM32 low level UART driver header. - * - * @addtogroup UART - * @{ - */ - -#ifndef _UART_LLD_H_ -#define _UART_LLD_H_ - -#if HAL_USE_UART || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief UART driver on USART1 enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART1) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART1 FALSE -#endif - -/** - * @brief UART driver on USART2 enable switch. - * @details If set to @p TRUE the support for USART2 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART2) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART2 FALSE -#endif - -/** - * @brief UART driver on USART3 enable switch. - * @details If set to @p TRUE the support for USART3 is included. - * @note The default is @p FALSE. - */ -#if !defined(STM32_UART_USE_USART3) || defined(__DOXYGEN__) -#define STM32_UART_USE_USART3 FALSE -#endif - -/** - * @brief USART1 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART2 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART3 interrupt priority level setting. - */ -#if !defined(STM32_UART_USART3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#endif - -/** - * @brief USART1 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART1_DMA_PRIORITY 0 -#endif - -/** - * @brief USART2 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART2_DMA_PRIORITY 0 -#endif - -/** - * @brief USART3 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA channels but - * because of the channels ordering the RX channel has always priority - * over the TX channel. - */ -#if !defined(STM32_UART_USART3_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_UART_USART3_DMA_PRIORITY 0 -#endif - -/** - * @brief USART1 DMA error hook. - * @note The default action for DMA errors is a system halt because DMA - * error can only happen because programming errors. - */ -#if !defined(STM32_UART_DMA_ERROR_HOOK) || defined(__DOXYGEN__) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() -#endif - -/** - * @brief DMA stream used for USART1 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART1_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#endif - -/** - * @brief DMA stream used for USART1 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART1_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#endif - -/** - * @brief DMA stream used for USART2 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART2_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#endif - -/** - * @brief DMA stream used for USART2 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART2_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#endif - -/** - * @brief DMA stream used for USART3 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART3_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#endif - -/** - * @brief DMA stream used for USART3 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_UART_USART3_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_UART_USE_USART1 && !STM32_HAS_USART1 -#error "USART1 not present in the selected device" -#endif - -#if STM32_UART_USE_USART2 && !STM32_HAS_USART2 -#error "USART2 not present in the selected device" -#endif - -#if STM32_UART_USE_USART3 && !STM32_HAS_USART3 -#error "USART3 not present in the selected device" -#endif - -#if !STM32_UART_USE_USART1 && !STM32_UART_USE_USART2 && \ - !STM32_UART_USE_USART3 -#error "UART driver activated but no USART/UART peripheral assigned" -#endif - -#if STM32_UART_USE_USART1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART1" -#endif - -#if STM32_UART_USE_USART2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART2" -#endif - -#if STM32_UART_USE_USART3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_UART_USART3_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USART3" -#endif - -#if STM32_UART_USE_USART1 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART1_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART1" -#endif - -#if STM32_UART_USE_USART2 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART2_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART2" -#endif - -#if STM32_UART_USE_USART3 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_UART_USART3_DMA_PRIORITY) -#error "Invalid DMA priority assigned to USART3" -#endif - -#if STM32_UART_USE_USART1 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART1_RX_DMA_STREAM, \ - STM32_USART1_RX_DMA_MSK) -#error "invalid DMA stream associated to USART1 RX" -#endif - -#if STM32_UART_USE_USART1 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART1_TX_DMA_STREAM, \ - STM32_USART1_TX_DMA_MSK) -#error "invalid DMA stream associated to USART1 TX" -#endif - -#if STM32_UART_USE_USART2 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART2_RX_DMA_STREAM, \ - STM32_USART2_RX_DMA_MSK) -#error "invalid DMA stream associated to USART2 RX" -#endif - -#if STM32_UART_USE_USART2 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART2_TX_DMA_STREAM, \ - STM32_USART2_TX_DMA_MSK) -#error "invalid DMA stream associated to USART2 TX" -#endif - -#if STM32_UART_USE_USART3 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART3_RX_DMA_STREAM, \ - STM32_USART3_RX_DMA_MSK) -#error "invalid DMA stream associated to USART3 RX" -#endif - -#if STM32_UART_USE_USART3 && \ - !STM32_DMA_IS_VALID_ID(STM32_UART_USART3_TX_DMA_STREAM, \ - STM32_USART3_TX_DMA_MSK) -#error "invalid DMA stream associated to USART3 TX" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief UART driver condition flags type. - */ -typedef uint32_t uartflags_t; - -/** - * @brief Structure representing an UART driver. - */ -typedef struct UARTDriver UARTDriver; - -/** - * @brief Generic UART notification callback type. - * - * @param[in] uartp pointer to the @p UARTDriver object - */ -typedef void (*uartcb_t)(UARTDriver *uartp); - -/** - * @brief Character received UART notification callback type. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] c received character - */ -typedef void (*uartccb_t)(UARTDriver *uartp, uint16_t c); - -/** - * @brief Receive error UART notification callback type. - * - * @param[in] uartp pointer to the @p UARTDriver object - * @param[in] e receive error mask - */ -typedef void (*uartecb_t)(UARTDriver *uartp, uartflags_t e); - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief End of transmission buffer callback. - */ - uartcb_t txend1_cb; - /** - * @brief Physical end of transmission callback. - */ - uartcb_t txend2_cb; - /** - * @brief Receive buffer filled callback. - */ - uartcb_t rxend_cb; - /** - * @brief Character received while out if the @p UART_RECEIVE state. - */ - uartccb_t rxchar_cb; - /** - * @brief Receive error callback. - */ - uartecb_t rxerr_cb; - /* End of the mandatory fields.*/ - /** - * @brief Bit rate. - */ - uint32_t speed; - /** - * @brief Initialization value for the CR1 register. - */ - uint16_t cr1; - /** - * @brief Initialization value for the CR2 register. - */ - uint16_t cr2; - /** - * @brief Initialization value for the CR3 register. - */ - uint16_t cr3; -} UARTConfig; - -/** - * @brief Structure representing an UART driver. - */ -struct UARTDriver { - /** - * @brief Driver state. - */ - uartstate_t state; - /** - * @brief Transmitter state. - */ - uarttxstate_t txstate; - /** - * @brief Receiver state. - */ - uartrxstate_t rxstate; - /** - * @brief Current configuration data. - */ - const UARTConfig *config; -#if defined(UART_DRIVER_EXT_FIELDS) - UART_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the USART registers block. - */ - USART_TypeDef *usart; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; - /** - * @brief Receive DMA channel. - */ - const stm32_dma_stream_t *dmarx; - /** - * @brief Transmit DMA channel. - */ - const stm32_dma_stream_t *dmatx; - /** - * @brief Default receive buffer while into @p UART_RX_IDLE state. - */ - volatile uint16_t rxbuf; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_UART_USE_USART1 && !defined(__DOXYGEN__) -extern UARTDriver UARTD1; -#endif - -#if STM32_UART_USE_USART2 && !defined(__DOXYGEN__) -extern UARTDriver UARTD2; -#endif - -#if STM32_UART_USE_USART3 && !defined(__DOXYGEN__) -extern UARTDriver UARTD3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void uart_lld_init(void); - void uart_lld_start(UARTDriver *uartp); - void uart_lld_stop(UARTDriver *uartp); - void uart_lld_start_send(UARTDriver *uartp, size_t n, const void *txbuf); - size_t uart_lld_stop_send(UARTDriver *uartp); - void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf); - size_t uart_lld_stop_receive(UARTDriver *uartp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_UART */ - -#endif /* _UART_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USBv1/stm32_usb.h b/os/hal/platforms/STM32/USBv1/stm32_usb.h deleted file mode 100644 index ab4f5b2d19..0000000000 --- a/os/hal/platforms/STM32/USBv1/stm32_usb.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file stm32_usb.h - * @brief STM32 USB registers layout header. - * @note This file requires definitions from the ST STM32 header files - * stm32f10x.h or stm32l1xx.h. - * - * @addtogroup USB - * @{ - */ - -#ifndef _STM32_USB_H_ -#define _STM32_USB_H_ - -/** - * @brief Number of the available endpoints. - * @details This value does not include the endpoint 0 which is always present. - */ -#define USB_ENDOPOINTS_NUMBER 7 - -/** - * @brief USB registers block. - */ -typedef struct { - /** - * @brief Endpoint registers. - */ - volatile uint32_t EPR[USB_ENDOPOINTS_NUMBER + 1]; - /* - * @brief Reserved space. - */ - volatile uint32_t _r20[8]; - /* - * @brief Control Register. - */ - volatile uint32_t CNTR; - /* - * @brief Interrupt Status Register. - */ - volatile uint32_t ISTR; - /* - * @brief Frame Number Register. - */ - volatile uint32_t FNR; - /* - * @brief Device Address Register. - */ - volatile uint32_t DADDR; - /* - * @brief Buffer Table Address. - */ - volatile uint32_t BTABLE; -} stm32_usb_t; - -/** - * @brief USB descriptor registers block. - */ -typedef struct { - /** - * @brief TX buffer offset register. - */ - volatile uint32_t TXADDR0; - /** - * @brief TX counter register 0. - */ - volatile uint16_t TXCOUNT0; - /** - * @brief TX counter register 1. - */ - volatile uint16_t TXCOUNT1; - /** - * @brief RX buffer offset register. - */ - volatile uint32_t RXADDR0; - /** - * @brief RX counter register 0. - */ - volatile uint16_t RXCOUNT0; - /** - * @brief RX counter register 1. - */ - volatile uint16_t RXCOUNT1; -} stm32_usb_descriptor_t; - -/** - * @name Register aliases - * @{ - */ -#define RXADDR1 TXADDR0 -#define TXADDR1 RXADDR0 -/** @} */ - -/** - * @brief USB registers block numeric address. - */ -#define STM32_USB_BASE (APB1PERIPH_BASE + 0x5C00) - -/** - * @brief USB RAM numeric address. - */ -#define STM32_USBRAM_BASE (APB1PERIPH_BASE + 0x6000) - -/** - * @brief Pointer to the USB registers block. - */ -#define STM32_USB ((stm32_usb_t *)STM32_USB_BASE) - -/** - * @brief Pointer to the USB RAM. - */ -#define STM32_USBRAM ((uint32_t *)STM32_USBRAM_BASE) - -/** - * @brief Size of the dedicated packet memory. - */ -#define USB_PMA_SIZE 512 - -/** - * @brief Mask of all the toggling bits in the EPR register. - */ -#define EPR_TOGGLE_MASK (EPR_STAT_TX_MASK | EPR_DTOG_TX | \ - EPR_STAT_RX_MASK | EPR_DTOG_RX | \ - EPR_SETUP) - -#define EPR_EA_MASK 0x000F -#define EPR_STAT_TX_MASK 0x0030 -#define EPR_STAT_TX_DIS 0x0000 -#define EPR_STAT_TX_STALL 0x0010 -#define EPR_STAT_TX_NAK 0x0020 -#define EPR_STAT_TX_VALID 0x0030 -#define EPR_DTOG_TX 0x0040 -#define EPR_SWBUF_RX EPR_DTOG_TX -#define EPR_CTR_TX 0x0080 -#define EPR_EP_KIND 0x0100 -#define EPR_EP_DBL_BUF EPR_EP_KIND -#define EPR_EP_STATUS_OUT EPR_EP_KIND -#define EPR_EP_TYPE_MASK 0x0600 -#define EPR_EP_TYPE_BULK 0x0000 -#define EPR_EP_TYPE_CONTROL 0x0200 -#define EPR_EP_TYPE_ISO 0x0400 -#define EPR_EP_TYPE_INTERRUPT 0x0600 -#define EPR_SETUP 0x0800 -#define EPR_STAT_RX_MASK 0x3000 -#define EPR_STAT_RX_DIS 0x0000 -#define EPR_STAT_RX_STALL 0x1000 -#define EPR_STAT_RX_NAK 0x2000 -#define EPR_STAT_RX_VALID 0x3000 -#define EPR_DTOG_RX 0x4000 -#define EPR_SWBUF_TX EPR_DTOG_RX -#define EPR_CTR_RX 0x8000 - -#define CNTR_FRES 0x0001 -#define CNTR_PDWN 0x0002 -#define CNTR_LP_MODE 0x0004 -#define CNTR_FSUSP 0x0008 -#define CNTR_RESUME 0x0010 -#define CNTR_ESOFM 0x0100 -#define CNTR_SOFM 0x0200 -#define CNTR_RESETM 0x0400 -#define CNTR_SUSPM 0x0800 -#define CNTR_WKUPM 0x1000 -#define CNTR_ERRM 0x2000 -#define CNTR_PMAOVRM 0x4000 -#define CNTR_CTRM 0x8000 - -#define ISTR_EP_ID_MASK 0x000F -#define ISTR_DIR 0x0010 -#define ISTR_ESOF 0x0100 -#define ISTR_SOF 0x0200 -#define ISTR_RESET 0x0400 -#define ISTR_SUSP 0x0800 -#define ISTR_WKUP 0x1000 -#define ISTR_ERR 0x2000 -#define ISTR_PMAOVR 0x4000 -#define ISTR_CTR 0x8000 - -#define FNR_FN_MASK 0x07FF -#define FNR_LSOF 0x1800 -#define FNR_LCK 0x2000 -#define FNR_RXDM 0x4000 -#define FNR_RXDP 0x8000 - -#define DADDR_ADD_MASK 0x007F -#define DADDR_EF 0x0080 - -#define RXCOUNT_COUNT_MASK 0x03FF -#define TXCOUNT_COUNT_MASK 0x03FF - -#define EPR_SET(ep, epr) \ - STM32_USB->EPR[ep] = (epr) & ~EPR_TOGGLE_MASK - -#define EPR_TOGGLE(ep, epr) \ - STM32_USB->EPR[ep] = (STM32_USB->EPR[ep] ^ ((epr) & EPR_TOGGLE_MASK)) - -#define EPR_SET_STAT_RX(ep, epr) \ - STM32_USB->EPR[ep] = (STM32_USB->EPR[ep] & \ - ~(EPR_TOGGLE_MASK & ~EPR_STAT_RX_MASK)) ^ \ - (epr) - -#define EPR_SET_STAT_TX(ep, epr) \ - STM32_USB->EPR[ep] = (STM32_USB->EPR[ep] & \ - ~(EPR_TOGGLE_MASK & ~EPR_STAT_TX_MASK)) ^ \ - (epr) - -#define EPR_CLEAR_CTR_RX(ep) \ - STM32_USB->EPR[ep] &= ~EPR_CTR_RX & ~EPR_TOGGLE_MASK - -#define EPR_CLEAR_CTR_TX(ep) \ - STM32_USB->EPR[ep] &= ~EPR_CTR_TX & ~EPR_TOGGLE_MASK - -/** - * @brief Returns an endpoint descriptor pointer. - */ -#define USB_GET_DESCRIPTOR(ep) \ - ((stm32_usb_descriptor_t *)((uint32_t)STM32_USBRAM_BASE + \ - (uint32_t)STM32_USB->BTABLE * 2 + \ - (uint32_t)(ep) * \ - sizeof(stm32_usb_descriptor_t))) - -/** - * @brief Converts from a PMA address to a physical address. - */ -#define USB_ADDR2PTR(addr) \ - ((uint32_t *)((addr) * 2 + STM32_USBRAM_BASE)) - -#endif /* _STM32_USB_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USBv1/usb_lld.c b/os/hal/platforms/STM32/USBv1/usb_lld.c deleted file mode 100644 index 121e82f43e..0000000000 --- a/os/hal/platforms/STM32/USBv1/usb_lld.c +++ /dev/null @@ -1,829 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/USBv1/usb_lld.c - * @brief STM32 USB subsystem low level driver source. - * - * @addtogroup USB - * @{ - */ - -#include - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_USB || defined(__DOXYGEN__) - -#define BTABLE_ADDR 0x0000 - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief USB1 driver identifier.*/ -#if STM32_USB_USE_USB1 || defined(__DOXYGEN__) -USBDriver USBD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief EP0 state. - * @note It is an union because IN and OUT endpoints are never used at the - * same time for EP0. - */ -static union { - /** - * @brief IN EP0 state. - */ - USBInEndpointState in; - /** - * @brief OUT EP0 state. - */ - USBOutEndpointState out; -} ep0_state; - -/** - * @brief Buffer for the EP0 setup packets. - */ -static uint8_t ep0setup_buffer[8]; - -/** - * @brief EP0 initialization structure. - */ -static const USBEndpointConfig ep0config = { - USB_EP_MODE_TYPE_CTRL, - _usb_ep0setup, - _usb_ep0in, - _usb_ep0out, - 0x40, - 0x40, - &ep0_state.in, - &ep0_state.out, - 1, - ep0setup_buffer -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Resets the packet memory allocator. - * - * @param[in] usbp pointer to the @p USBDriver object - */ -static void usb_pm_reset(USBDriver *usbp) { - - /* The first 64 bytes are reserved for the descriptors table. The effective - available RAM for endpoint buffers is just 448 bytes.*/ - usbp->pmnext = 64; -} - -/** - * @brief Resets the packet memory allocator. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] size size of the packet buffer to allocate - */ -static uint32_t usb_pm_alloc(USBDriver *usbp, size_t size) { - uint32_t next; - - next = usbp->pmnext; - usbp->pmnext += size; - chDbgAssert(usbp->pmnext <= USB_PMA_SIZE, "usb_pm_alloc(), #1", "PMA overflow"); - return next; -} - -/** - * @brief Reads from a dedicated packet buffer. - * - * @param[in] udp pointer to a @p stm32_usb_descriptor_t - * @param[out] buf buffer where to copy the packet data - * @param[in] n maximum number of bytes to copy. This value must - * not exceed the maximum packet size for this endpoint. - * - * @notapi - */ -static void usb_packet_read_to_buffer(stm32_usb_descriptor_t *udp, - uint8_t *buf, size_t n) { - uint32_t *pmap= USB_ADDR2PTR(udp->RXADDR0); - - n = (n + 1) / 2; - while (n > 0) { - /* Note, this line relies on the Cortex-M3/M4 ability to perform - unaligned word accesses.*/ - *(uint16_t *)buf = (uint16_t)*pmap++; - buf += 2; - n--; - } -} - -/** - * @brief Reads from a dedicated packet buffer. - * - * @param[in] udp pointer to a @p stm32_usb_descriptor_t - * @param[in] iqp pointer to an @p InputQueue object - * @param[in] n maximum number of bytes to copy. This value must - * not exceed the maximum packet size for this endpoint. - * - * @notapi - */ -static void usb_packet_read_to_queue(stm32_usb_descriptor_t *udp, - InputQueue *iqp, size_t n) { - size_t nhw; - uint32_t *pmap= USB_ADDR2PTR(udp->RXADDR0); - - nhw = n / 2; - while (nhw > 0) { - uint32_t w; - - w = *pmap++; - *iqp->q_wrptr++ = (uint8_t)w; - if (iqp->q_wrptr >= iqp->q_top) - iqp->q_wrptr = iqp->q_buffer; - *iqp->q_wrptr++ = (uint8_t)(w >> 8); - if (iqp->q_wrptr >= iqp->q_top) - iqp->q_wrptr = iqp->q_buffer; - nhw--; - } - /* Last byte for odd numbers.*/ - if ((n & 1) != 0) { - *iqp->q_wrptr++ = (uint8_t)*pmap; - if (iqp->q_wrptr >= iqp->q_top) - iqp->q_wrptr = iqp->q_buffer; - } - - /* Updating queue.*/ - chSysLockFromIsr(); - iqp->q_counter += n; - while (notempty(&iqp->q_waiting)) - chSchReadyI(fifo_remove(&iqp->q_waiting))->p_u.rdymsg = Q_OK; - chSysUnlockFromIsr(); -} - -/** - * @brief Writes to a dedicated packet buffer. - * - * @param[in] udp pointer to a @p stm32_usb_descriptor_t - * @param[in] buf buffer where to fetch the packet data - * @param[in] n maximum number of bytes to copy. This value must - * not exceed the maximum packet size for this endpoint. - * - * @notapi - */ -static void usb_packet_write_from_buffer(stm32_usb_descriptor_t *udp, - const uint8_t *buf, - size_t n) { - uint32_t *pmap = USB_ADDR2PTR(udp->TXADDR0); - - udp->TXCOUNT0 = (uint16_t)n; - n = (n + 1) / 2; - while (n > 0) { - /* Note, this line relies on the Cortex-M3/M4 ability to perform - unaligned word accesses.*/ - *pmap++ = *(uint16_t *)buf; - buf += 2; - n--; - } -} - -/** - * @brief Writes to a dedicated packet buffer. - * - * @param[in] udp pointer to a @p stm32_usb_descriptor_t - * @param[in] buf buffer where to fetch the packet data - * @param[in] n maximum number of bytes to copy. This value must - * not exceed the maximum packet size for this endpoint. - * - * @notapi - */ -static void usb_packet_write_from_queue(stm32_usb_descriptor_t *udp, - OutputQueue *oqp, size_t n) { - size_t nhw; - uint32_t *pmap = USB_ADDR2PTR(udp->TXADDR0); - - udp->TXCOUNT0 = (uint16_t)n; - nhw = n / 2; - while (nhw > 0) { - uint32_t w; - - w = (uint32_t)*oqp->q_rdptr++; - if (oqp->q_rdptr >= oqp->q_top) - oqp->q_rdptr = oqp->q_buffer; - w |= (uint32_t)*oqp->q_rdptr++ << 8; - if (oqp->q_rdptr >= oqp->q_top) - oqp->q_rdptr = oqp->q_buffer; - *pmap++ = w; - nhw--; - } - - /* Last byte for odd numbers.*/ - if ((n & 1) != 0) { - *pmap = (uint32_t)*oqp->q_rdptr++; - if (oqp->q_rdptr >= oqp->q_top) - oqp->q_rdptr = oqp->q_buffer; - } - - /* Updating queue. Note, the lock is done in this unusual way because this - function can be called from both ISR and thread context so the kind - of lock function to be invoked cannot be decided beforehand.*/ - port_lock(); - dbg_enter_lock(); - - oqp->q_counter += n; - while (notempty(&oqp->q_waiting)) - chSchReadyI(fifo_remove(&oqp->q_waiting))->p_u.rdymsg = Q_OK; - - dbg_leave_lock(); - port_unlock(); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_USB_USE_USB1 || defined(__DOXYGEN__) -#if !defined(STM32_USB1_HP_HANDLER) -#error "STM32_USB1_HP_HANDLER not defined" -#endif -/** - * @brief USB high priority interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USB1_HP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - CH_IRQ_EPILOGUE(); -} - -#if !defined(STM32_USB1_LP_HANDLER) -#error "STM32_USB1_LP_HANDLER not defined" -#endif -/** - * @brief USB low priority interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USB1_LP_HANDLER) { - uint32_t istr; - USBDriver *usbp = &USBD1; - - CH_IRQ_PROLOGUE(); - - istr = STM32_USB->ISTR; - - /* USB bus reset condition handling.*/ - if (istr & ISTR_RESET) { - _usb_reset(usbp); - _usb_isr_invoke_event_cb(usbp, USB_EVENT_RESET); - STM32_USB->ISTR = ~ISTR_RESET; - } - - /* USB bus SUSPEND condition handling.*/ - if (istr & ISTR_SUSP) { - STM32_USB->CNTR |= CNTR_FSUSP; - _usb_isr_invoke_event_cb(usbp, USB_EVENT_SUSPEND); -#if STM32_USB_LOW_POWER_ON_SUSPEND - STM32_USB->CNTR |= CNTR_LP_MODE; -#endif - STM32_USB->ISTR = ~ISTR_SUSP; - } - - /* USB bus WAKEUP condition handling.*/ - if (istr & ISTR_WKUP) { - uint32_t fnr = STM32_USB->FNR; - if (!(fnr & FNR_RXDP)) { - STM32_USB->CNTR &= ~CNTR_FSUSP; - _usb_isr_invoke_event_cb(usbp, USB_EVENT_WAKEUP); - } -#if STM32_USB_LOW_POWER_ON_SUSPEND - else { - /* Just noise, going back in SUSPEND mode, reference manual 22.4.5, - table 169.*/ - STM32_USB->CNTR |= CNTR_LP_MODE; - } -#endif - STM32_USB->ISTR = ~ISTR_WKUP; - } - - /* SOF handling.*/ - if (istr & ISTR_SOF) { - _usb_isr_invoke_sof_cb(usbp); - STM32_USB->ISTR = ~ISTR_SOF; - } - - /* Endpoint events handling.*/ - while (istr & ISTR_CTR) { - size_t n; - uint32_t ep; - uint32_t epr = STM32_USB->EPR[ep = istr & ISTR_EP_ID_MASK]; - const USBEndpointConfig *epcp = usbp->epc[ep]; - - if (epr & EPR_CTR_TX) { - size_t transmitted; - /* IN endpoint, transmission.*/ - EPR_CLEAR_CTR_TX(ep); - - transmitted = (size_t)USB_GET_DESCRIPTOR(ep)->TXCOUNT0; - epcp->in_state->txcnt += transmitted; - epcp->in_state->txsize -= transmitted; - if (epcp->in_state->txsize > 0) { - /* Transfer not completed, there are more packets to send.*/ - if (epcp->in_state->txsize > epcp->in_maxsize) - n = epcp->in_maxsize; - else - n = epcp->in_state->txsize; - - if (epcp->in_state->txqueued) - usb_packet_write_from_queue(USB_GET_DESCRIPTOR(ep), - epcp->in_state->mode.queue.txqueue, - n); - else { - epcp->in_state->mode.linear.txbuf += transmitted; - usb_packet_write_from_buffer(USB_GET_DESCRIPTOR(ep), - epcp->in_state->mode.linear.txbuf, - n); - } - chSysLockFromIsr(); - usb_lld_start_in(usbp, ep); - chSysUnlockFromIsr(); - } - else { - /* Transfer completed, invokes the callback.*/ - _usb_isr_invoke_in_cb(usbp, ep); - } - } - if (epr & EPR_CTR_RX) { - EPR_CLEAR_CTR_RX(ep); - /* OUT endpoint, receive.*/ - if (epr & EPR_SETUP) { - /* Setup packets handling, setup packets are handled using a - specific callback.*/ - _usb_isr_invoke_setup_cb(usbp, ep); - } - else { - stm32_usb_descriptor_t *udp = USB_GET_DESCRIPTOR(ep); - n = (size_t)udp->RXCOUNT0 & RXCOUNT_COUNT_MASK; - - /* Reads the packet into the defined buffer.*/ - if (epcp->out_state->rxqueued) - usb_packet_read_to_queue(udp, - epcp->out_state->mode.queue.rxqueue, - n); - else { - usb_packet_read_to_buffer(udp, - epcp->out_state->mode.linear.rxbuf, - n); - epcp->out_state->mode.linear.rxbuf += n; - } - /* Transaction data updated.*/ - epcp->out_state->rxcnt += n; - epcp->out_state->rxsize -= n; - epcp->out_state->rxpkts -= 1; - if (epcp->out_state->rxpkts > 0) { - /* Transfer not completed, there are more packets to receive.*/ - EPR_SET_STAT_RX(ep, EPR_STAT_RX_VALID); - } - else { - /* Transfer completed, invokes the callback.*/ - _usb_isr_invoke_out_cb(usbp, ep); - } - } - } - istr = STM32_USB->ISTR; - } - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level USB driver initialization. - * - * @notapi - */ -void usb_lld_init(void) { - - /* Driver initialization.*/ - usbObjectInit(&USBD1); -} - -/** - * @brief Configures and activates the USB peripheral. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_start(USBDriver *usbp) { - - if (usbp->state == USB_STOP) { - /* Clock activation.*/ -#if STM32_USB_USE_USB1 - if (&USBD1 == usbp) { - /* USB clock enabled.*/ - rccEnableUSB(FALSE); - /* Powers up the transceiver while holding the USB in reset state.*/ - STM32_USB->CNTR = CNTR_FRES; - /* Enabling the USB IRQ vectors, this also gives enough time to allow - the transceiver power up (1uS).*/ - nvicEnableVector(STM32_USB1_HP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_USB_USB1_HP_IRQ_PRIORITY)); - nvicEnableVector(STM32_USB1_LP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_USB_USB1_LP_IRQ_PRIORITY)); - /* Releases the USB reset.*/ - STM32_USB->CNTR = 0; - } -#endif - /* Reset procedure enforced on driver start.*/ - _usb_reset(usbp); - } - /* Configuration.*/ -} - -/** - * @brief Deactivates the USB peripheral. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_stop(USBDriver *usbp) { - - /* If in ready state then disables the USB clock.*/ - if (usbp->state == USB_STOP) { -#if STM32_USB_USE_USB1 - if (&USBD1 == usbp) { - nvicDisableVector(STM32_USB1_HP_NUMBER); - nvicDisableVector(STM32_USB1_LP_NUMBER); - STM32_USB->CNTR = CNTR_PDWN | CNTR_FRES; - rccDisableUSB(FALSE); - } -#endif - } -} - -/** - * @brief USB low level reset routine. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_reset(USBDriver *usbp) { - uint32_t cntr; - - /* Post reset initialization.*/ - STM32_USB->BTABLE = 0; - STM32_USB->ISTR = 0; - STM32_USB->DADDR = DADDR_EF; - cntr = /*CNTR_ESOFM | */ CNTR_RESETM | CNTR_SUSPM | - CNTR_WKUPM | /*CNTR_ERRM | CNTR_PMAOVRM |*/ CNTR_CTRM; - /* The SOF interrupt is only enabled if a callback is defined for - this service because it is an high rate source.*/ - if (usbp->config->sof_cb != NULL) - cntr |= CNTR_SOFM; - STM32_USB->CNTR = cntr; - - /* Resets the packet memory allocator.*/ - usb_pm_reset(usbp); - - /* EP0 initialization.*/ - usbp->epc[0] = &ep0config; - usb_lld_init_endpoint(usbp, 0); -} - -/** - * @brief Sets the USB address. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_set_address(USBDriver *usbp) { - - STM32_USB->DADDR = (uint32_t)(usbp->address) | DADDR_EF; -} - -/** - * @brief Enables an endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep) { - uint16_t nblocks, epr; - stm32_usb_descriptor_t *dp; - const USBEndpointConfig *epcp = usbp->epc[ep]; - - /* Setting the endpoint type.*/ - switch (epcp->ep_mode & USB_EP_MODE_TYPE) { - case USB_EP_MODE_TYPE_ISOC: - epr = EPR_EP_TYPE_ISO; - break; - case USB_EP_MODE_TYPE_BULK: - epr = EPR_EP_TYPE_BULK; - break; - case USB_EP_MODE_TYPE_INTR: - epr = EPR_EP_TYPE_INTERRUPT; - break; - default: - epr = EPR_EP_TYPE_CONTROL; - } - - /* IN endpoint initially in NAK mode.*/ - if (epcp->in_cb != NULL) - epr |= EPR_STAT_TX_NAK; - - /* OUT endpoint initially in NAK mode.*/ - if (epcp->out_cb != NULL) - epr |= EPR_STAT_RX_NAK; - - /* EPxR register setup.*/ - EPR_SET(ep, epr | ep); - EPR_TOGGLE(ep, epr); - - /* Endpoint size and address initialization.*/ - if (epcp->out_maxsize > 62) - nblocks = (((((epcp->out_maxsize - 1) | 0x1f) + 1) / 32) << 10) | - 0x8000; - else - nblocks = ((((epcp->out_maxsize - 1) | 1) + 1) / 2) << 10; - dp = USB_GET_DESCRIPTOR(ep); - dp->TXCOUNT0 = 0; - dp->RXCOUNT0 = nblocks; - dp->TXADDR0 = usb_pm_alloc(usbp, epcp->in_maxsize); - dp->RXADDR0 = usb_pm_alloc(usbp, epcp->out_maxsize); -} - -/** - * @brief Disables all the active endpoints except the endpoint zero. - * - * @param[in] usbp pointer to the @p USBDriver object - * - * @notapi - */ -void usb_lld_disable_endpoints(USBDriver *usbp) { - unsigned i; - - /* Resets the packet memory allocator.*/ - usb_pm_reset(usbp); - - /* Disabling all endpoints.*/ - for (i = 1; i <= USB_ENDOPOINTS_NUMBER; i++) { - EPR_TOGGLE(i, 0); - EPR_SET(i, 0); - } -} - -/** - * @brief Returns the status of an OUT endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return The endpoint status. - * @retval EP_STATUS_DISABLED The endpoint is not active. - * @retval EP_STATUS_STALLED The endpoint is stalled. - * @retval EP_STATUS_ACTIVE The endpoint is active. - * - * @notapi - */ -usbepstatus_t usb_lld_get_status_out(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - switch (STM32_USB->EPR[ep] & EPR_STAT_RX_MASK) { - case EPR_STAT_RX_DIS: - return EP_STATUS_DISABLED; - case EPR_STAT_RX_STALL: - return EP_STATUS_STALLED; - default: - return EP_STATUS_ACTIVE; - } -} - -/** - * @brief Returns the status of an IN endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return The endpoint status. - * @retval EP_STATUS_DISABLED The endpoint is not active. - * @retval EP_STATUS_STALLED The endpoint is stalled. - * @retval EP_STATUS_ACTIVE The endpoint is active. - * - * @notapi - */ -usbepstatus_t usb_lld_get_status_in(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - switch (STM32_USB->EPR[ep] & EPR_STAT_TX_MASK) { - case EPR_STAT_TX_DIS: - return EP_STATUS_DISABLED; - case EPR_STAT_TX_STALL: - return EP_STATUS_STALLED; - default: - return EP_STATUS_ACTIVE; - } -} - -/** - * @brief Reads a setup packet from the dedicated packet buffer. - * @details This function must be invoked in the context of the @p setup_cb - * callback in order to read the received setup packet. - * @pre In order to use this function the endpoint must have been - * initialized as a control endpoint. - * @post The endpoint is ready to accept another packet. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @param[out] buf buffer where to copy the packet data - * - * @notapi - */ -void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf) { - uint32_t *pmap; - stm32_usb_descriptor_t *udp; - uint32_t n; - - (void)usbp; - udp = USB_GET_DESCRIPTOR(ep); - pmap = USB_ADDR2PTR(udp->RXADDR0); - for (n = 0; n < 4; n++) { - *(uint16_t *)buf = (uint16_t)*pmap++; - buf += 2; - } -} - -/** - * @brief Prepares for a receive operation. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep) { - USBOutEndpointState *osp = usbp->epc[ep]->out_state; - - /* Transfer initialization.*/ - if (osp->rxsize == 0) /* Special case for zero sized packets.*/ - osp->rxpkts = 1; - else - osp->rxpkts = (uint16_t)((osp->rxsize + usbp->epc[ep]->out_maxsize - 1) / - usbp->epc[ep]->out_maxsize); -} - -/** - * @brief Prepares for a transmit operation. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_prepare_transmit(USBDriver *usbp, usbep_t ep) { - size_t n; - USBInEndpointState *isp = usbp->epc[ep]->in_state; - - /* Transfer initialization.*/ - n = isp->txsize; - if (n > (size_t)usbp->epc[ep]->in_maxsize) - n = (size_t)usbp->epc[ep]->in_maxsize; - - if (isp->txqueued) - usb_packet_write_from_queue(USB_GET_DESCRIPTOR(ep), - isp->mode.queue.txqueue, n); - else - usb_packet_write_from_buffer(USB_GET_DESCRIPTOR(ep), - isp->mode.linear.txbuf, n); -} - -/** - * @brief Starts a receive operation on an OUT endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_start_out(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - - EPR_SET_STAT_RX(ep, EPR_STAT_RX_VALID); -} - -/** - * @brief Starts a transmit operation on an IN endpoint. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_start_in(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - - EPR_SET_STAT_TX(ep, EPR_STAT_TX_VALID); -} - -/** - * @brief Brings an OUT endpoint in the stalled state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_stall_out(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - - EPR_SET_STAT_RX(ep, EPR_STAT_RX_STALL); -} - -/** - * @brief Brings an IN endpoint in the stalled state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_stall_in(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - - EPR_SET_STAT_TX(ep, EPR_STAT_TX_STALL); -} - -/** - * @brief Brings an OUT endpoint in the active state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_clear_out(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - - /* Makes sure to not put to NAK an endpoint that is already - transferring.*/ - if ((STM32_USB->EPR[ep] & EPR_STAT_RX_MASK) != EPR_STAT_RX_VALID) - EPR_SET_STAT_TX(ep, EPR_STAT_RX_NAK); -} - -/** - * @brief Brings an IN endpoint in the active state. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * - * @notapi - */ -void usb_lld_clear_in(USBDriver *usbp, usbep_t ep) { - - (void)usbp; - - /* Makes sure to not put to NAK an endpoint that is already - transferring.*/ - if ((STM32_USB->EPR[ep] & EPR_STAT_TX_MASK) != EPR_STAT_TX_VALID) - EPR_SET_STAT_TX(ep, EPR_STAT_TX_NAK); -} - -#endif /* HAL_USE_USB */ - -/** @} */ diff --git a/os/hal/platforms/STM32/USBv1/usb_lld.h b/os/hal/platforms/STM32/USBv1/usb_lld.h deleted file mode 100644 index 76aa0590f4..0000000000 --- a/os/hal/platforms/STM32/USBv1/usb_lld.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/USBv1/usb_lld.h - * @brief STM32 USB subsystem low level driver header. - * - * @addtogroup USB - * @{ - */ - -#ifndef _USB_LLD_H_ -#define _USB_LLD_H_ - -#if HAL_USE_USB || defined(__DOXYGEN__) - -#include "stm32_usb.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Maximum endpoint address. - */ -#define USB_MAX_ENDPOINTS USB_ENDOPOINTS_NUMBER - -/** - * @brief This device requires the address change after the status packet. - */ -#define USB_SET_ADDRESS_MODE USB_LATE_SET_ADDRESS - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief USB1 driver enable switch. - * @details If set to @p TRUE the support for USB1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_USB_USE_USB1) || defined(__DOXYGEN__) -#define STM32_USB_USE_USB1 FALSE -#endif - -/** - * @brief Enables the USB device low power mode on suspend. - */ -#if !defined(STM32_USB_LOW_POWER_ON_SUSPEND) || defined(__DOXYGEN__) -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#endif - -/** - * @brief USB1 interrupt priority level setting. - */ -#if !defined(STM32_USB_USB1_HP_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#endif - -/** - * @brief USB1 interrupt priority level setting. - */ -#if !defined(STM32_USB_USB1_LP_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_USB_USE_USB1 && !STM32_HAS_USB -#error "USB not present in the selected device" -#endif - -#if !STM32_USB_USE_USB1 -#error "USB driver activated but no USB peripheral assigned" -#endif - -#if STM32_USB_USE_USB1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_USB_USB1_HP_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USB HP" -#endif - -#if STM32_USB_USE_USB1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_USB_USB1_LP_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to USB LP" -#endif - -#if STM32_USBCLK != 48000000 -#error "the USB driver requires a 48MHz clock" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of an IN endpoint state structure. - */ -typedef struct { - /** - * @brief Buffer mode, queue or linear. - */ - bool_t txqueued; - /** - * @brief Requested transmit transfer size. - */ - size_t txsize; - /** - * @brief Transmitted bytes so far. - */ - size_t txcnt; - union { - struct { - /** - * @brief Pointer to the transmission linear buffer. - */ - const uint8_t *txbuf; - } linear; - struct { - /** - * @brief Pointer to the output queue. - */ - OutputQueue *txqueue; - } queue; - /* End of the mandatory fields.*/ - } mode; -} USBInEndpointState; - -/** - * @brief Type of an OUT endpoint state structure. - */ -typedef struct { - /** - * @brief Buffer mode, queue or linear. - */ - bool_t rxqueued; - /** - * @brief Requested receive transfer size. - */ - size_t rxsize; - /** - * @brief Received bytes so far. - */ - size_t rxcnt; - union { - struct { - /** - * @brief Pointer to the receive linear buffer. - */ - uint8_t *rxbuf; - } linear; - struct { - /** - * @brief Pointer to the input queue. - */ - InputQueue *rxqueue; - } queue; - } mode; - /* End of the mandatory fields.*/ - /** - * @brief Number of packets to receive. - */ - uint16_t rxpkts; -} USBOutEndpointState; - -/** - * @brief Type of an USB endpoint configuration structure. - * @note Platform specific restrictions may apply to endpoints. - */ -typedef struct { - /** - * @brief Type and mode of the endpoint. - */ - uint32_t ep_mode; - /** - * @brief Setup packet notification callback. - * @details This callback is invoked when a setup packet has been - * received. - * @post The application must immediately call @p usbReadPacket() in - * order to access the received packet. - * @note This field is only valid for @p USB_EP_MODE_TYPE_CTRL - * endpoints, it should be set to @p NULL for other endpoint - * types. - */ - usbepcallback_t setup_cb; - /** - * @brief IN endpoint notification callback. - * @details This field must be set to @p NULL if the IN endpoint is not - * used. - */ - usbepcallback_t in_cb; - /** - * @brief OUT endpoint notification callback. - * @details This field must be set to @p NULL if the OUT endpoint is not - * used. - */ - usbepcallback_t out_cb; - /** - * @brief IN endpoint maximum packet size. - * @details This field must be set to zero if the IN endpoint is not - * used. - */ - uint16_t in_maxsize; - /** - * @brief OUT endpoint maximum packet size. - * @details This field must be set to zero if the OUT endpoint is not - * used. - */ - uint16_t out_maxsize; - /** - * @brief @p USBEndpointState associated to the IN endpoint. - * @details This structure maintains the state of the IN endpoint. - */ - USBInEndpointState *in_state; - /** - * @brief @p USBEndpointState associated to the OUT endpoint. - * @details This structure maintains the state of the OUT endpoint. - */ - USBOutEndpointState *out_state; - /* End of the mandatory fields.*/ - /** - * @brief Reserved field, not currently used. - * @note Initialize this field to 1 in order to be forward compatible. - */ - uint16_t ep_buffers; - /** - * @brief Pointer to a buffer for setup packets. - * @details Setup packets require a dedicated 8-bytes buffer, set this - * field to @p NULL for non-control endpoints. - */ - uint8_t *setup_buf; -} USBEndpointConfig; - -/** - * @brief Type of an USB driver configuration structure. - */ -typedef struct { - /** - * @brief USB events callback. - * @details This callback is invoked when an USB driver event is registered. - */ - usbeventcb_t event_cb; - /** - * @brief Device GET_DESCRIPTOR request callback. - * @note This callback is mandatory and cannot be set to @p NULL. - */ - usbgetdescriptor_t get_descriptor_cb; - /** - * @brief Requests hook callback. - * @details This hook allows to be notified of standard requests or to - * handle non standard requests. - */ - usbreqhandler_t requests_hook_cb; - /** - * @brief Start Of Frame callback. - */ - usbcallback_t sof_cb; - /* End of the mandatory fields.*/ -} USBConfig; - -/** - * @brief Structure representing an USB driver. - */ -struct USBDriver { - /** - * @brief Driver state. - */ - usbstate_t state; - /** - * @brief Current configuration data. - */ - const USBConfig *config; - /** - * @brief Field available to user, it can be used to associate an - * application-defined handler to the USB driver. - */ - void *param; - /** - * @brief Bit map of the transmitting IN endpoints. - */ - uint16_t transmitting; - /** - * @brief Bit map of the receiving OUT endpoints. - */ - uint16_t receiving; - /** - * @brief Active endpoints configurations. - */ - const USBEndpointConfig *epc[USB_MAX_ENDPOINTS + 1]; - /** - * @brief Endpoint 0 state. - */ - usbep0state_t ep0state; - /** - * @brief Next position in the buffer to be transferred through endpoint 0. - */ - uint8_t *ep0next; - /** - * @brief Number of bytes yet to be transferred through endpoint 0. - */ - size_t ep0n; - /** - * @brief Endpoint 0 end transaction callback. - */ - usbcallback_t ep0endcb; - /** - * @brief Setup packet buffer. - */ - uint8_t setup[8]; - /** - * @brief Current USB device status. - */ - uint16_t status; - /** - * @brief Assigned USB address. - */ - uint8_t address; - /** - * @brief Current USB device configuration. - */ - uint8_t configuration; -#if defined(USB_DRIVER_EXT_FIELDS) - USB_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the next address in the packet memory. - */ - uint32_t pmnext; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Returns the current frame number. - * - * @param[in] usbp pointer to the @p USBDriver object - * @return The current frame number. - * - * @notapi - */ -#define usb_lld_get_frame_number(usbp) (STM32_USB->FNR & FNR_FN_MASK) - -/** - * @brief Returns the exact size of a receive transaction. - * @details The received size can be different from the size specified in - * @p usbStartReceiveI() because the last packet could have a size - * different from the expected one. - * @pre The OUT endpoint must have been configured in transaction mode - * in order to use this function. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return Received data size. - * - * @notapi - */ -#define usb_lld_get_transaction_size(usbp, ep) \ - ((usbp)->epc[ep]->out_state->rxcnt) - -/** - * @brief Returns the exact size of a received packet. - * @pre The OUT endpoint must have been configured in packet mode - * in order to use this function. - * - * @param[in] usbp pointer to the @p USBDriver object - * @param[in] ep endpoint number - * @return Received data size. - * - * @notapi - */ -#define usb_lld_get_packet_size(usbp, ep) \ - ((size_t)USB_GET_DESCRIPTOR(ep)->RXCOUNT & RXCOUNT_COUNT_MASK) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_USB_USE_USB1 && !defined(__DOXYGEN__) -extern USBDriver USBD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void usb_lld_init(void); - void usb_lld_start(USBDriver *usbp); - void usb_lld_stop(USBDriver *usbp); - void usb_lld_reset(USBDriver *usbp); - void usb_lld_set_address(USBDriver *usbp); - void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep); - void usb_lld_disable_endpoints(USBDriver *usbp); - usbepstatus_t usb_lld_get_status_in(USBDriver *usbp, usbep_t ep); - usbepstatus_t usb_lld_get_status_out(USBDriver *usbp, usbep_t ep); - void usb_lld_read_setup(USBDriver *usbp, usbep_t ep, uint8_t *buf); - void usb_lld_prepare_receive(USBDriver *usbp, usbep_t ep); - void usb_lld_prepare_transmit(USBDriver *usbp, usbep_t ep); - void usb_lld_start_out(USBDriver *usbp, usbep_t ep); - void usb_lld_start_in(USBDriver *usbp, usbep_t ep); - void usb_lld_stall_out(USBDriver *usbp, usbep_t ep); - void usb_lld_stall_in(USBDriver *usbp, usbep_t ep); - void usb_lld_clear_out(USBDriver *usbp, usbep_t ep); - void usb_lld_clear_in(USBDriver *usbp, usbep_t ep); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_USB */ - -#endif /* _USB_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/can_lld.c b/os/hal/platforms/STM32/can_lld.c deleted file mode 100644 index 32d273c6f1..0000000000 --- a/os/hal/platforms/STM32/can_lld.c +++ /dev/null @@ -1,408 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/can_lld.c - * @brief STM32 CAN subsystem low level driver source. - * - * @addtogroup CAN - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_CAN || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief ADC1 driver identifier.*/ -#if STM32_CAN_USE_CAN1 || defined(__DOXYGEN__) -CANDriver CAND1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief CAN1 TX interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_CAN1_TX_HANDLER) { - - CH_IRQ_PROLOGUE(); - - /* No more events until a message is transmitted.*/ - CAN1->TSR = CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2; - chSysLockFromIsr(); - while (chSemGetCounterI(&CAND1.txsem) < 0) - chSemSignalI(&CAND1.txsem); - chEvtBroadcastI(&CAND1.txempty_event); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/* - * @brief CAN1 RX0 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_CAN1_RX0_HANDLER) { - uint32_t rf0r; - - CH_IRQ_PROLOGUE(); - - rf0r = CAN1->RF0R; - if ((rf0r & CAN_RF0R_FMP0) > 0) { - /* No more receive events until the queue 0 has been emptied.*/ - CAN1->IER &= ~CAN_IER_FMPIE0; - chSysLockFromIsr(); - while (chSemGetCounterI(&CAND1.rxsem) < 0) - chSemSignalI(&CAND1.rxsem); - chEvtBroadcastI(&CAND1.rxfull_event); - chSysUnlockFromIsr(); - } - if ((rf0r & CAN_RF0R_FOVR0) > 0) { - /* Overflow events handling.*/ - CAN1->RF0R = CAN_RF0R_FOVR0; - chSysLockFromIsr(); - chEvtBroadcastFlagsI(&CAND1.error_event, CAN_OVERFLOW_ERROR); - chSysUnlockFromIsr(); - } - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief CAN1 RX1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_CAN1_RX1_HANDLER) { - - CH_IRQ_PROLOGUE(); - - chSysHalt(); /* Not supported (yet).*/ - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief CAN1 SCE interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_CAN1_SCE_HANDLER) { - uint32_t msr; - - CH_IRQ_PROLOGUE(); - - msr = CAN1->MSR; - CAN1->MSR = CAN_MSR_ERRI | CAN_MSR_WKUI | CAN_MSR_SLAKI; - /* Wakeup event.*/ - if (msr & CAN_MSR_WKUI) { - chSysLockFromIsr(); - chEvtBroadcastI(&CAND1.wakeup_event); - chSysUnlockFromIsr(); - } - /* Error event.*/ - if (msr & CAN_MSR_ERRI) { - flagsmask_t flags; - uint32_t esr = CAN1->ESR; - - CAN1->ESR &= ~CAN_ESR_LEC; - flags = (flagsmask_t)(esr & 7); - if ((esr & CAN_ESR_LEC) > 0) - flags |= CAN_FRAMING_ERROR; - - chSysLockFromIsr(); - /* The content of the ESR register is copied unchanged in the upper - half word of the listener flags mask.*/ - chEvtBroadcastFlagsI(&CAND1.error_event, flags | (flagsmask_t)(esr < 16)); - chSysUnlockFromIsr(); - } - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level CAN driver initialization. - * - * @notapi - */ -void can_lld_init(void) { - -#if STM32_CAN_USE_CAN1 - /* Driver initialization.*/ - canObjectInit(&CAND1); - CAND1.can = CAN1; -#endif -} - -/** - * @brief Configures and activates the CAN peripheral. - * - * @param[in] canp pointer to the @p CANDriver object - * - * @notapi - */ -void can_lld_start(CANDriver *canp) { - - /* Clock activation.*/ -#if STM32_CAN_USE_CAN1 - if (&CAND1 == canp) { - nvicEnableVector(STM32_CAN1_TX_NUMBER, - CORTEX_PRIORITY_MASK(STM32_CAN_CAN1_IRQ_PRIORITY)); - nvicEnableVector(STM32_CAN1_RX0_NUMBER, - CORTEX_PRIORITY_MASK(STM32_CAN_CAN1_IRQ_PRIORITY)); - nvicEnableVector(STM32_CAN1_RX1_NUMBER, - CORTEX_PRIORITY_MASK(STM32_CAN_CAN1_IRQ_PRIORITY)); - nvicEnableVector(STM32_CAN1_SCE_NUMBER, - CORTEX_PRIORITY_MASK(STM32_CAN_CAN1_IRQ_PRIORITY)); - rccEnableCAN1(FALSE); - } -#endif - - /* Entering initialization mode. */ - canp->state = CAN_STARTING; - canp->can->MCR = CAN_MCR_INRQ; - while ((canp->can->MSR & CAN_MSR_INAK) == 0) - chThdSleepS(1); - /* BTR initialization.*/ - canp->can->BTR = canp->config->btr; - /* MCR initialization.*/ - canp->can->MCR = canp->config->mcr; - /* Filters initialization.*/ - canp->can->FMR |= CAN_FMR_FINIT; - if (canp->config->num > 0) { - uint32_t i, fmask; - CAN_FilterRegister_TypeDef *cfp; - - canp->can->FA1R = 0; - canp->can->FM1R = 0; - canp->can->FS1R = 0; - canp->can->FFA1R = 0; - cfp = canp->can->sFilterRegister; - fmask = 1; - for (i = 0; i < STM32_CAN_MAX_FILTERS; i++) { - if (i < canp->config->num) { - if (canp->config->filters[i].mode) - canp->can->FM1R |= fmask; - if (canp->config->filters[i].scale) - canp->can->FS1R |= fmask; - if (canp->config->filters[i].assignment) - canp->can->FFA1R |= fmask; - cfp->FR1 = canp->config->filters[i].register1; - cfp->FR2 = canp->config->filters[i].register2; - canp->can->FA1R |= fmask; - } - else { - cfp->FR1 = 0; - cfp->FR2 = 0; - } - /* Gives a chance for preemption since this is a rather long loop.*/ - chSysUnlock(); - cfp++; - fmask <<= 1; - chSysLock(); - } - } - else { - /* Setup a default filter.*/ - canp->can->sFilterRegister[0].FR1 = 0; - canp->can->sFilterRegister[0].FR2 = 0; - canp->can->FM1R = 0; - canp->can->FFA1R = 0; - canp->can->FS1R = 1; - canp->can->FA1R = 1; - } - canp->can->FMR &= ~CAN_FMR_FINIT; - /* Interrupt sources initialization.*/ - canp->can->IER = CAN_IER_TMEIE | CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | - CAN_IER_WKUIE | CAN_IER_ERRIE | CAN_IER_LECIE | - CAN_IER_BOFIE | CAN_IER_EPVIE | CAN_IER_EWGIE | - CAN_IER_FOVIE0 | CAN_IER_FOVIE1; -} - -/** - * @brief Deactivates the CAN peripheral. - * - * @param[in] canp pointer to the @p CANDriver object - * - * @notapi - */ -void can_lld_stop(CANDriver *canp) { - - /* If in ready state then disables the CAN peripheral.*/ - if (canp->state == CAN_READY) { -#if STM32_CAN_USE_CAN1 - if (&CAND1 == canp) { - CAN1->MCR = 0x00010002; /* Register reset value. */ - CAN1->IER = 0x00000000; /* All sources disabled. */ - nvicDisableVector(STM32_CAN1_TX_NUMBER); - nvicDisableVector(STM32_CAN1_RX0_NUMBER); - nvicDisableVector(STM32_CAN1_RX1_NUMBER); - nvicDisableVector(STM32_CAN1_SCE_NUMBER); - rccDisableCAN1(FALSE); - } -#endif - } -} - -/** - * @brief Determines whether a frame can be transmitted. - * - * @param[in] canp pointer to the @p CANDriver object - * - * @return The queue space availability. - * @retval FALSE no space in the transmit queue. - * @retval TRUE transmit slot available. - * - * @notapi - */ -bool_t can_lld_can_transmit(CANDriver *canp) { - - return (canp->can->TSR & CAN_TSR_TME) != 0; -} - -/** - * @brief Inserts a frame into the transmit queue. - * - * @param[in] canp pointer to the @p CANDriver object - * @param[in] ctfp pointer to the CAN frame to be transmitted - * - * @notapi - */ -void can_lld_transmit(CANDriver *canp, const CANTxFrame *ctfp) { - uint32_t tir; - CAN_TxMailBox_TypeDef *tmbp; - - /* Pointer to a free transmission mailbox.*/ - tmbp = &canp->can->sTxMailBox[(canp->can->TSR & CAN_TSR_CODE) >> 24]; - - /* Preparing the message.*/ - if (ctfp->IDE) - tir = ((uint32_t)ctfp->EID << 3) | ((uint32_t)ctfp->RTR << 1) | - CAN_TI0R_IDE; - else - tir = ((uint32_t)ctfp->SID << 21) | ((uint32_t)ctfp->RTR << 1); - tmbp->TDTR = ctfp->DLC; - tmbp->TDLR = ctfp->data32[0]; - tmbp->TDHR = ctfp->data32[1]; - tmbp->TIR = tir | CAN_TI0R_TXRQ; -} - -/** - * @brief Determines whether a frame has been received. - * - * @param[in] canp pointer to the @p CANDriver object - * - * @return The queue space availability. - * @retval FALSE no space in the transmit queue. - * @retval TRUE transmit slot available. - * - * @notapi - */ -bool_t can_lld_can_receive(CANDriver *canp) { - - return (canp->can->RF0R & CAN_RF0R_FMP0) > 0; -} - -/** - * @brief Receives a frame from the input queue. - * - * @param[in] canp pointer to the @p CANDriver object - * @param[out] crfp pointer to the buffer where the CAN frame is copied - * - * @notapi - */ -void can_lld_receive(CANDriver *canp, CANRxFrame *crfp) { - uint32_t r; - - /* Fetches the message.*/ - r = canp->can->sFIFOMailBox[0].RIR; - crfp->RTR = (r & CAN_RI0R_RTR) >> 1; - crfp->IDE = (r & CAN_RI0R_IDE) >> 2; - if (crfp->IDE) - crfp->EID = r >> 3; - else - crfp->SID = r >> 21; - r = canp->can->sFIFOMailBox[0].RDTR; - crfp->DLC = r & CAN_RDT0R_DLC; - crfp->FMI = (uint8_t)(r >> 8); - crfp->TIME = (uint16_t)(r >> 16); - crfp->data32[0] = canp->can->sFIFOMailBox[0].RDLR; - crfp->data32[1] = canp->can->sFIFOMailBox[0].RDHR; - - /* Releases the mailbox.*/ - canp->can->RF0R = CAN_RF0R_RFOM0; - - /* If the queue is empty re-enables the interrupt in order to generate - events again.*/ - if ((canp->can->RF0R & CAN_RF0R_FMP0) == 0) - canp->can->IER |= CAN_IER_FMPIE0; -} - -#if CAN_USE_SLEEP_MODE || defined(__DOXYGEN__) -/** - * @brief Enters the sleep mode. - * - * @param[in] canp pointer to the @p CANDriver object - * - * @notapi - */ -void can_lld_sleep(CANDriver *canp) { - - canp->can->MCR |= CAN_MCR_SLEEP; -} - -/** - * @brief Enforces leaving the sleep mode. - * - * @param[in] canp pointer to the @p CANDriver object - * - * @notapi - */ -void can_lld_wakeup(CANDriver *canp) { - - canp->can->MCR &= ~CAN_MCR_SLEEP; -} -#endif /* CAN_USE_SLEEP_MODE */ - -#endif /* HAL_USE_CAN */ - -/** @} */ diff --git a/os/hal/platforms/STM32/can_lld.h b/os/hal/platforms/STM32/can_lld.h deleted file mode 100644 index 003a6743f9..0000000000 --- a/os/hal/platforms/STM32/can_lld.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/can_lld.h - * @brief STM32 CAN subsystem low level driver header. - * - * @addtogroup CAN - * @{ - */ - -#ifndef _CAN_LLD_H_ -#define _CAN_LLD_H_ - -#if HAL_USE_CAN || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/* - * The following macros from the ST header file are replaced with better - * equivalents. - */ -#undef CAN_BTR_BRP -#undef CAN_BTR_TS1 -#undef CAN_BTR_TS2 -#undef CAN_BTR_SJW - -/** - * @brief This switch defines whether the driver implementation supports - * a low power switch mode with automatic an wakeup feature. - */ -#define CAN_SUPPORTS_SLEEP TRUE - -/** - * @name CAN registers helper macros - * @{ - */ -#define CAN_BTR_BRP(n) (n) /**< @brief BRP field macro.*/ -#define CAN_BTR_TS1(n) ((n) << 16) /**< @brief TS1 field macro.*/ -#define CAN_BTR_TS2(n) ((n) << 20) /**< @brief TS2 field macro.*/ -#define CAN_BTR_SJW(n) ((n) << 24) /**< @brief SJW field macro.*/ - -#define CAN_IDE_STD 0 /**< @brief Standard id. */ -#define CAN_IDE_EXT 1 /**< @brief Extended id. */ - -#define CAN_RTR_DATA 0 /**< @brief Data frame. */ -#define CAN_RTR_REMOTE 1 /**< @brief Remote frame. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief CAN1 driver enable switch. - * @details If set to @p TRUE the support for ADC1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_CAN_USE_CAN1) || defined(__DOXYGEN__) -#define STM32_CAN_USE_CAN1 FALSE -#endif - -/** - * @brief CAN1 interrupt priority level setting. - */ -#if !defined(STM32_CAN_CAN1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_CAN_USE_CAN1 && !STM32_HAS_CAN1 -#error "CAN1 not present in the selected device" -#endif - -#if !STM32_CAN_USE_CAN1 -#error "CAN driver activated but no CAN peripheral assigned" -#endif - -#if CAN_USE_SLEEP_MODE && !CAN_SUPPORTS_SLEEP -#error "CAN sleep mode not supported in this architecture" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief CAN transmission frame. - * @note Accessing the frame data as word16 or word32 is not portable because - * machine data endianness, it can be still useful for a quick filling. - */ -typedef struct { - struct { - uint8_t DLC:4; /**< @brief Data length. */ - uint8_t RTR:1; /**< @brief Frame type. */ - uint8_t IDE:1; /**< @brief Identifier type. */ - }; - union { - struct { - uint32_t SID:11; /**< @brief Standard identifier.*/ - }; - struct { - uint32_t EID:29; /**< @brief Extended identifier.*/ - }; - }; - union { - uint8_t data8[8]; /**< @brief Frame data. */ - uint16_t data16[4]; /**< @brief Frame data. */ - uint32_t data32[2]; /**< @brief Frame data. */ - }; -} CANTxFrame; - -/** - * @brief CAN received frame. - * @note Accessing the frame data as word16 or word32 is not portable because - * machine data endianness, it can be still useful for a quick filling. - */ -typedef struct { - struct { - uint8_t FMI; /**< @brief Filter id. */ - uint16_t TIME; /**< @brief Time stamp. */ - }; - struct { - uint8_t DLC:4; /**< @brief Data length. */ - uint8_t RTR:1; /**< @brief Frame type. */ - uint8_t IDE:1; /**< @brief Identifier type. */ - }; - union { - struct { - uint32_t SID:11; /**< @brief Standard identifier.*/ - }; - struct { - uint32_t EID:29; /**< @brief Extended identifier.*/ - }; - }; - union { - uint8_t data8[8]; /**< @brief Frame data. */ - uint16_t data16[4]; /**< @brief Frame data. */ - uint32_t data32[2]; /**< @brief Frame data. */ - }; -} CANRxFrame; - -/** - * @brief CAN filter. - * @note Refer to the STM32 reference manual for info about filters. - */ -typedef struct { - /** - * @brief Filter mode. - * @note This bit represent the CAN_FM1R register bit associated to this - * filter (0=mask mode, 1=list mode). - */ - uint32_t mode:1; - /** - * @brief Filter scale. - * @note This bit represent the CAN_FS1R register bit associated to this - * filter (0=16 bits mode, 1=32 bits mode). - */ - uint32_t scale:1; - /** - * @brief Filter mode. - * @note This bit represent the CAN_FFA1R register bit associated to this - * filter, must be set to zero in this version of the driver. - */ - uint32_t assignment:1; - /** - * @brief Filter register 1 (identifier). - */ - uint32_t register1; - /** - * @brief Filter register 2 (mask/identifier depending on mode=0/1). - */ - uint32_t register2; -} CANFilter; - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief CAN MCR register initialization data. - * @note Some bits in this register are enforced by the driver regardless - * their status in this field. - */ - uint32_t mcr; - /** - * @brief CAN BTR register initialization data. - * @note Some bits in this register are enforced by the driver regardless - * their status in this field. - */ - uint32_t btr; - /** - * @brief Number of elements into the filters array. - * @note By setting this field to zero a default filter is enabled that - * allows all frames, this should be adequate for simple applications. - */ - uint32_t num; - /** - * @brief Pointer to an array of @p CANFilter structures. - * @note This field can be set to @p NULL if the field @p num is set to - * zero. - */ - const CANFilter *filters; -} CANConfig; - -/** - * @brief Structure representing an CAN driver. - */ -typedef struct { - /** - * @brief Driver state. - */ - canstate_t state; - /** - * @brief Current configuration data. - */ - const CANConfig *config; - /** - * @brief Transmission queue semaphore. - */ - Semaphore txsem; - /** - * @brief Receive queue semaphore. - */ - Semaphore rxsem; - /** - * @brief One or more frames become available. - * @note After broadcasting this event it will not be broadcasted again - * until the received frames queue has been completely emptied. It - * is not broadcasted for each received frame. It is - * responsibility of the application to empty the queue by repeatedly - * invoking @p chReceive() when listening to this event. This behavior - * minimizes the interrupt served by the system because CAN traffic. - */ - EventSource rxfull_event; - /** - * @brief One or more transmission slots become available. - */ - EventSource txempty_event; - /** - * @brief A CAN bus error happened. - */ - EventSource error_event; -#if CAN_USE_SLEEP_MODE || defined (__DOXYGEN__) - /** - * @brief Entering sleep state event. - */ - EventSource sleep_event; - /** - * @brief Exiting sleep state event. - */ - EventSource wakeup_event; -#endif /* CAN_USE_SLEEP_MODE */ - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the CAN registers. - */ - CAN_TypeDef *can; -} CANDriver; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_CAN_USE_CAN1 && !defined(__DOXYGEN__) -extern CANDriver CAND1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void can_lld_init(void); - void can_lld_start(CANDriver *canp); - void can_lld_stop(CANDriver *canp); - bool_t can_lld_can_transmit(CANDriver *canp); - void can_lld_transmit(CANDriver *canp, const CANTxFrame *crfp); - bool_t can_lld_can_receive(CANDriver *canp); - void can_lld_receive(CANDriver *canp, CANRxFrame *ctfp); -#if CAN_USE_SLEEP_MODE - void can_lld_sleep(CANDriver *canp); - void can_lld_wakeup(CANDriver *canp); -#endif /* CAN_USE_SLEEP_MODE */ -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_CAN */ - -#endif /* _CAN_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/ext_lld.c b/os/hal/platforms/STM32/ext_lld.c deleted file mode 100644 index d9cd22cd79..0000000000 --- a/os/hal/platforms/STM32/ext_lld.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/ext_lld.c - * @brief STM32 EXT subsystem low level driver source. - * - * @addtogroup EXT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -#include "ext_lld_isr.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief EXTD1 driver identifier. - */ -EXTDriver EXTD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level EXT driver initialization. - * - * @notapi - */ -void ext_lld_init(void) { - - /* Driver initialization.*/ - extObjectInit(&EXTD1); -} - -/** - * @brief Configures and activates the EXT peripheral. - * - * @param[in] extp pointer to the @p EXTDriver object - * - * @notapi - */ -void ext_lld_start(EXTDriver *extp) { - unsigned i; - - if (extp->state == EXT_STOP) - ext_lld_exti_irq_enable(); - - /* Configuration of automatic channels.*/ - for (i = 0; i < EXT_MAX_CHANNELS; i++) - if (extp->config->channels[i].mode & EXT_CH_MODE_AUTOSTART) - ext_lld_channel_enable(extp, i); - else - ext_lld_channel_disable(extp, i); -} - -/** - * @brief Deactivates the EXT peripheral. - * - * @param[in] extp pointer to the @p EXTDriver object - * - * @notapi - */ -void ext_lld_stop(EXTDriver *extp) { - - if (extp->state == EXT_ACTIVE) - ext_lld_exti_irq_disable(); - - EXTI->EMR = 0; - EXTI->IMR = 0; - EXTI->PR = EXT_CHANNELS_MASK; -} - -/** - * @brief Enables an EXT channel. - * - * @param[in] extp pointer to the @p EXTDriver object - * @param[in] channel channel to be enabled - * - * @notapi - */ -void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) { - - /* Programming edge registers.*/ - if (extp->config->channels[channel].mode & EXT_CH_MODE_RISING_EDGE) - EXTI->RTSR |= (1 << channel); - else - EXTI->RTSR &= ~(1 << channel); - if (extp->config->channels[channel].mode & EXT_CH_MODE_FALLING_EDGE) - EXTI->FTSR |= (1 << channel); - else - EXTI->FTSR &= ~(1 << channel); - - /* Programming interrupt and event registers.*/ - if (extp->config->channels[channel].cb != NULL) { - EXTI->IMR |= (1 << channel); - EXTI->EMR &= ~(1 << channel); - } - else { - EXTI->EMR |= (1 << channel); - EXTI->IMR &= ~(1 << channel); - } - - /* Setting the associated GPIO for external channels.*/ - if (channel < 16) { - uint32_t n = channel >> 2; - uint32_t mask = ~(0xF << ((channel & 3) * 4)); - uint32_t port = ((extp->config->channels[channel].mode & - EXT_MODE_GPIO_MASK) >> - EXT_MODE_GPIO_OFF) << ((channel & 3) * 4); - -#if defined(STM32L1XX_MD) || defined(STM32F0XX) || defined(STM32F2XX) || \ - defined(STM32F4XX) - SYSCFG->EXTICR[n] = (SYSCFG->EXTICR[n] & mask) | port; -#else /* STM32F1XX */ - AFIO->EXTICR[n] = (AFIO->EXTICR[n] & mask) | port; -#endif /* STM32F1XX */ - } -} - -/** - * @brief Disables an EXT channel. - * - * @param[in] extp pointer to the @p EXTDriver object - * @param[in] channel channel to be disabled - * - * @notapi - */ -void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) { - - (void)extp; - - EXTI->IMR &= ~(1 << channel); - EXTI->EMR &= ~(1 << channel); - EXTI->RTSR &= ~(1 << channel); - EXTI->FTSR &= ~(1 << channel); - EXTI->PR = (1 << channel); -} - -#endif /* HAL_USE_EXT */ - -/** @} */ diff --git a/os/hal/platforms/STM32/ext_lld.h b/os/hal/platforms/STM32/ext_lld.h deleted file mode 100644 index 5d23b3dcb9..0000000000 --- a/os/hal/platforms/STM32/ext_lld.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/ext_lld.h - * @brief STM32 EXT subsystem low level driver header. - * - * @addtogroup EXT - * @{ - */ - -#ifndef _EXT_LLD_H_ -#define _EXT_LLD_H_ - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Available number of EXT channels. - */ -#define EXT_MAX_CHANNELS STM32_EXTI_NUM_CHANNELS - -/** - * @brief Mask of the available channels. - */ -#define EXT_CHANNELS_MASK ((1 << EXT_MAX_CHANNELS) - 1) - -/** - * @name STM32-specific EXT channel modes - * @{ - */ -#define EXT_MODE_GPIO_MASK 0xF0 /**< @brief Port field mask. */ -#define EXT_MODE_GPIO_OFF 4 /**< @brief Port field offset. */ -#define EXT_MODE_GPIOA 0x00 /**< @brief GPIOA identifier. */ -#define EXT_MODE_GPIOB 0x10 /**< @brief GPIOB identifier. */ -#define EXT_MODE_GPIOC 0x20 /**< @brief GPIOC identifier. */ -#define EXT_MODE_GPIOD 0x30 /**< @brief GPIOD identifier. */ -#define EXT_MODE_GPIOE 0x40 /**< @brief GPIOE identifier. */ -#define EXT_MODE_GPIOF 0x50 /**< @brief GPIOF identifier. */ -#define EXT_MODE_GPIOG 0x60 /**< @brief GPIOG identifier. */ -#define EXT_MODE_GPIOH 0x70 /**< @brief GPIOH identifier. */ -#define EXT_MODE_GPIOI 0x80 /**< @brief GPIOI identifier. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief EXT channel identifier. - */ -typedef uint32_t expchannel_t; - -/** - * @brief Type of an EXT generic notification callback. - * - * @param[in] extp pointer to the @p EXPDriver object triggering the - * callback - */ -typedef void (*extcallback_t)(EXTDriver *extp, expchannel_t channel); - -/** - * @brief Channel configuration structure. - */ -typedef struct { - /** - * @brief Channel mode. - */ - uint32_t mode; - /** - * @brief Channel callback. - * @details In the STM32 implementation a @p NULL callback pointer is - * valid and configures the channel as an event sources instead - * of an interrupt source. - */ - extcallback_t cb; -} EXTChannelConfig; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Channel configurations. - */ - EXTChannelConfig channels[EXT_MAX_CHANNELS]; - /* End of the mandatory fields.*/ -} EXTConfig; - -/** - * @brief Structure representing an EXT driver. - */ -struct EXTDriver { - /** - * @brief Driver state. - */ - extstate_t state; - /** - * @brief Current configuration data. - */ - const EXTConfig *config; - /* End of the mandatory fields.*/ -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern EXTDriver EXTD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void ext_lld_init(void); - void ext_lld_start(EXTDriver *extp); - void ext_lld_stop(EXTDriver *extp); - void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel); - void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_EXT */ - -#endif /* _EXT_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/gpt_lld.c b/os/hal/platforms/STM32/gpt_lld.c deleted file mode 100644 index 22b6cb0546..0000000000 --- a/os/hal/platforms/STM32/gpt_lld.c +++ /dev/null @@ -1,468 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/gpt_lld.c - * @brief STM32 GPT subsystem low level driver source. - * - * @addtogroup GPT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief GPTD1 driver identifier. - * @note The driver GPTD1 allocates the complex timer TIM1 when enabled. - */ -#if STM32_GPT_USE_TIM1 || defined(__DOXYGEN__) -GPTDriver GPTD1; -#endif - -/** - * @brief GPTD2 driver identifier. - * @note The driver GPTD2 allocates the timer TIM2 when enabled. - */ -#if STM32_GPT_USE_TIM2 || defined(__DOXYGEN__) -GPTDriver GPTD2; -#endif - -/** - * @brief GPTD3 driver identifier. - * @note The driver GPTD3 allocates the timer TIM3 when enabled. - */ -#if STM32_GPT_USE_TIM3 || defined(__DOXYGEN__) -GPTDriver GPTD3; -#endif - -/** - * @brief GPTD4 driver identifier. - * @note The driver GPTD4 allocates the timer TIM4 when enabled. - */ -#if STM32_GPT_USE_TIM4 || defined(__DOXYGEN__) -GPTDriver GPTD4; -#endif - -/** - * @brief GPTD5 driver identifier. - * @note The driver GPTD5 allocates the timer TIM5 when enabled. - */ -#if STM32_GPT_USE_TIM5 || defined(__DOXYGEN__) -GPTDriver GPTD5; -#endif - -/** - * @brief GPTD8 driver identifier. - * @note The driver GPTD8 allocates the timer TIM8 when enabled. - */ -#if STM32_GPT_USE_TIM8 || defined(__DOXYGEN__) -GPTDriver GPTD8; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared IRQ handler. - * - * @param[in] gptp pointer to a @p GPTDriver object - */ -static void gpt_lld_serve_interrupt(GPTDriver *gptp) { - - gptp->tim->SR = 0; - if (gptp->state == GPT_ONESHOT) { - gptp->state = GPT_READY; /* Back in GPT_READY state. */ - gpt_lld_stop_timer(gptp); /* Timer automatically stopped. */ - } - gptp->config->callback(gptp); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_GPT_USE_TIM1 -#if !defined(STM32_TIM1_UP_HANDLER) -#error "STM32_TIM1_UP_HANDLER not defined" -#endif -/** - * @brief TIM2 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM1_UP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_GPT_USE_TIM1 */ - -#if STM32_GPT_USE_TIM2 -#if !defined(STM32_TIM2_HANDLER) -#error "STM32_TIM2_HANDLER not defined" -#endif -/** - * @brief TIM2 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_GPT_USE_TIM2 */ - -#if STM32_GPT_USE_TIM3 -#if !defined(STM32_TIM3_HANDLER) -#error "STM32_TIM3_HANDLER not defined" -#endif -/** - * @brief TIM3 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM3_HANDLER) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_GPT_USE_TIM3 */ - -#if STM32_GPT_USE_TIM4 -#if !defined(STM32_TIM4_HANDLER) -#error "STM32_TIM4_HANDLER not defined" -#endif -/** - * @brief TIM4 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM4_HANDLER) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD4); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_GPT_USE_TIM4 */ - -#if STM32_GPT_USE_TIM5 -#if !defined(STM32_TIM5_HANDLER) -#error "STM32_TIM5_HANDLER not defined" -#endif -/** - * @brief TIM5 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM5_HANDLER) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD5); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_GPT_USE_TIM5 */ - -#if STM32_GPT_USE_TIM8 -#if !defined(STM32_TIM8_UP_HANDLER) -#error "STM32_TIM8_UP_HANDLER not defined" -#endif -/** - * @brief TIM8 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM8_UP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - gpt_lld_serve_interrupt(&GPTD8); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_GPT_USE_TIM8 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level GPT driver initialization. - * - * @notapi - */ -void gpt_lld_init(void) { - -#if STM32_GPT_USE_TIM1 - /* Driver initialization.*/ - GPTD1.tim = STM32_TIM1; - gptObjectInit(&GPTD1); -#endif - -#if STM32_GPT_USE_TIM2 - /* Driver initialization.*/ - GPTD2.tim = STM32_TIM2; - gptObjectInit(&GPTD2); -#endif - -#if STM32_GPT_USE_TIM3 - /* Driver initialization.*/ - GPTD3.tim = STM32_TIM3; - gptObjectInit(&GPTD3); -#endif - -#if STM32_GPT_USE_TIM4 - /* Driver initialization.*/ - GPTD4.tim = STM32_TIM4; - gptObjectInit(&GPTD4); -#endif - -#if STM32_GPT_USE_TIM5 - /* Driver initialization.*/ - GPTD5.tim = STM32_TIM5; - gptObjectInit(&GPTD5); -#endif - -#if STM32_GPT_USE_TIM8 - /* Driver initialization.*/ - GPTD8.tim = STM32_TIM8; - gptObjectInit(&GPTD8); -#endif -} - -/** - * @brief Configures and activates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_start(GPTDriver *gptp) { - uint16_t psc; - - if (gptp->state == GPT_STOP) { - /* Clock activation.*/ -#if STM32_GPT_USE_TIM1 - if (&GPTD1 == gptp) { - rccEnableTIM1(FALSE); - rccResetTIM1(); - nvicEnableVector(STM32_TIM1_UP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_GPT_TIM1_IRQ_PRIORITY)); - gptp->clock = STM32_TIMCLK2; - } -#endif -#if STM32_GPT_USE_TIM2 - if (&GPTD2 == gptp) { - rccEnableTIM2(FALSE); - rccResetTIM2(); - nvicEnableVector(STM32_TIM2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_GPT_TIM2_IRQ_PRIORITY)); - gptp->clock = STM32_TIMCLK1; - } -#endif -#if STM32_GPT_USE_TIM3 - if (&GPTD3 == gptp) { - rccEnableTIM3(FALSE); - rccResetTIM3(); - nvicEnableVector(STM32_TIM3_NUMBER, - CORTEX_PRIORITY_MASK(STM32_GPT_TIM3_IRQ_PRIORITY)); - gptp->clock = STM32_TIMCLK1; - } -#endif -#if STM32_GPT_USE_TIM4 - if (&GPTD4 == gptp) { - rccEnableTIM4(FALSE); - rccResetTIM4(); - nvicEnableVector(STM32_TIM4_NUMBER, - CORTEX_PRIORITY_MASK(STM32_GPT_TIM4_IRQ_PRIORITY)); - gptp->clock = STM32_TIMCLK1; - } -#endif - -#if STM32_GPT_USE_TIM5 - if (&GPTD5 == gptp) { - rccEnableTIM5(FALSE); - rccResetTIM5(); - nvicEnableVector(STM32_TIM5_NUMBER, - CORTEX_PRIORITY_MASK(STM32_GPT_TIM5_IRQ_PRIORITY)); - gptp->clock = STM32_TIMCLK1; - } -#endif - -#if STM32_GPT_USE_TIM8 - if (&GPTD8 == gptp) { - rccEnableTIM8(FALSE); - rccResetTIM8(); - nvicEnableVector(STM32_TIM8_UP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_GPT_TIM8_IRQ_PRIORITY)); - gptp->clock = STM32_TIMCLK2; - } -#endif - } - - /* Prescaler value calculation.*/ - psc = (uint16_t)((gptp->clock / gptp->config->frequency) - 1); - chDbgAssert(((uint32_t)(psc + 1) * gptp->config->frequency) == gptp->clock, - "gpt_lld_start(), #1", "invalid frequency"); - - /* Timer configuration.*/ - gptp->tim->CR1 = 0; /* Initially stopped. */ - gptp->tim->CR2 = TIM_CR2_CCDS; /* DMA on UE (if any). */ - gptp->tim->PSC = psc; /* Prescaler value. */ - gptp->tim->DIER = 0; -} - -/** - * @brief Deactivates the GPT peripheral. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop(GPTDriver *gptp) { - - if (gptp->state == GPT_READY) { - gptp->tim->CR1 = 0; /* Timer disabled. */ - gptp->tim->DIER = 0; /* All IRQs disabled. */ - gptp->tim->SR = 0; /* Clear eventual pending IRQs. */ - -#if STM32_GPT_USE_TIM1 - if (&GPTD1 == gptp) { - nvicDisableVector(STM32_TIM1_UP_NUMBER); - rccDisableTIM1(FALSE); - } -#endif -#if STM32_GPT_USE_TIM2 - if (&GPTD2 == gptp) { - nvicDisableVector(STM32_TIM2_NUMBER); - rccDisableTIM2(FALSE); - } -#endif -#if STM32_GPT_USE_TIM3 - if (&GPTD3 == gptp) { - nvicDisableVector(STM32_TIM3_NUMBER); - rccDisableTIM3(FALSE); - } -#endif -#if STM32_GPT_USE_TIM4 - if (&GPTD4 == gptp) { - nvicDisableVector(STM32_TIM4_NUMBER); - rccDisableTIM4(FALSE); - } -#endif -#if STM32_GPT_USE_TIM5 - if (&GPTD5 == gptp) { - nvicDisableVector(STM32_TIM5_NUMBER); - rccDisableTIM5(FALSE); - } -#endif -#if STM32_GPT_USE_TIM8 - if (&GPTD8 == gptp) { - nvicDisableVector(STM32_TIM8_UP_NUMBER); - rccDisableTIM8(FALSE); - } -#endif - } -} - -/** - * @brief Starts the timer in continuous mode. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval period in ticks - * - * @notapi - */ -void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tim->ARR = interval - 1; /* Time constant. */ - gptp->tim->EGR = TIM_EGR_UG; /* Update event. */ - gptp->tim->CNT = 0; /* Reset counter. */ - /* NOTE: After generating the UG event it takes several clock cycles before - SR bit 0 goes to 1. This is because the clearing of CNT has been inserted - before the clearing of SR, to give it some time.*/ - gptp->tim->SR = 0; /* Clear pending IRQs (if any). */ - gptp->tim->DIER = TIM_DIER_UIE; /* Update Event IRQ enabled. */ - gptp->tim->CR1 = TIM_CR1_URS | TIM_CR1_CEN; -} - -/** - * @brief Stops the timer. - * - * @param[in] gptp pointer to the @p GPTDriver object - * - * @notapi - */ -void gpt_lld_stop_timer(GPTDriver *gptp) { - - gptp->tim->CR1 = 0; /* Initially stopped. */ - gptp->tim->SR = 0; /* Clear pending IRQs (if any). */ - gptp->tim->DIER = 0; /* Interrupts disabled. */ -} - -/** - * @brief Starts the timer in one shot mode and waits for completion. - * @details This function specifically polls the timer waiting for completion - * in order to not have extra delays caused by interrupt servicing, - * this function is only recommended for short delays. - * - * @param[in] gptp pointer to the @p GPTDriver object - * @param[in] interval time interval in ticks - * - * @notapi - */ -void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval) { - - gptp->tim->ARR = interval - 1; /* Time constant. */ - gptp->tim->EGR = TIM_EGR_UG; /* Update event. */ - gptp->tim->SR = 0; /* Clear pending IRQs (if any). */ - gptp->tim->CR1 = TIM_CR1_OPM | TIM_CR1_URS | TIM_CR1_CEN; - while (!(gptp->tim->SR & TIM_SR_UIF)) - ; -} - -#endif /* HAL_USE_GPT */ - -/** @} */ diff --git a/os/hal/platforms/STM32/gpt_lld.h b/os/hal/platforms/STM32/gpt_lld.h deleted file mode 100644 index 40de603d41..0000000000 --- a/os/hal/platforms/STM32/gpt_lld.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/gpt_lld.h - * @brief STM32 GPT subsystem low level driver header. - * - * @addtogroup GPT - * @{ - */ - -#ifndef _GPT_LLD_H_ -#define _GPT_LLD_H_ - -#if HAL_USE_GPT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief GPTD1 driver enable switch. - * @details If set to @p TRUE the support for GPTD1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_GPT_USE_TIM1) || defined(__DOXYGEN__) -#define STM32_GPT_USE_TIM1 FALSE -#endif - -/** - * @brief GPTD2 driver enable switch. - * @details If set to @p TRUE the support for GPTD2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_GPT_USE_TIM2) || defined(__DOXYGEN__) -#define STM32_GPT_USE_TIM2 FALSE -#endif - -/** - * @brief GPTD3 driver enable switch. - * @details If set to @p TRUE the support for GPTD3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_GPT_USE_TIM3) || defined(__DOXYGEN__) -#define STM32_GPT_USE_TIM3 FALSE -#endif - -/** - * @brief GPTD4 driver enable switch. - * @details If set to @p TRUE the support for GPTD4 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_GPT_USE_TIM4) || defined(__DOXYGEN__) -#define STM32_GPT_USE_TIM4 FALSE -#endif - -/** - * @brief GPTD5 driver enable switch. - * @details If set to @p TRUE the support for GPTD5 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_GPT_USE_TIM5) || defined(__DOXYGEN__) -#define STM32_GPT_USE_TIM5 FALSE -#endif - -/** - * @brief GPTD8 driver enable switch. - * @details If set to @p TRUE the support for GPTD8 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_GPT_USE_TIM8) || defined(__DOXYGEN__) -#define STM32_GPT_USE_TIM8 FALSE -#endif - -/** - * @brief GPTD1 interrupt priority level setting. - */ -#if !defined(STM32_GPT_TIM1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#endif - -/** - * @brief GPTD2 interrupt priority level setting. - */ -#if !defined(STM32_GPT_TIM2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#endif - -/** - * @brief GPTD3 interrupt priority level setting. - */ -#if !defined(STM32_GPT_TIM3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#endif - -/** - * @brief GPTD4 interrupt priority level setting. - */ -#if !defined(STM32_GPT_TIM4_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#endif - -/** - * @brief GPTD5 interrupt priority level setting. - */ -#if !defined(STM32_GPT_TIM5_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#endif - -/** - * @brief GPTD5 interrupt priority level setting. - */ -#if !defined(STM32_GPT_TIM8_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_GPT_USE_TIM1 && !STM32_HAS_TIM1 -#error "TIM1 not present in the selected device" -#endif - -#if STM32_GPT_USE_TIM2 && !STM32_HAS_TIM2 -#error "TIM2 not present in the selected device" -#endif - -#if STM32_GPT_USE_TIM3 && !STM32_HAS_TIM3 -#error "TIM3 not present in the selected device" -#endif - -#if STM32_GPT_USE_TIM4 && !STM32_HAS_TIM4 -#error "TIM4 not present in the selected device" -#endif - -#if STM32_GPT_USE_TIM5 && !STM32_HAS_TIM5 -#error "TIM5 not present in the selected device" -#endif - -#if STM32_GPT_USE_TIM8 && !STM32_HAS_TIM8 -#error "TIM8 not present in the selected device" -#endif - -#if !STM32_GPT_USE_TIM1 && !STM32_GPT_USE_TIM2 && \ - !STM32_GPT_USE_TIM3 && !STM32_GPT_USE_TIM4 && \ - !STM32_GPT_USE_TIM5 && !STM32_GPT_USE_TIM8 -#error "GPT driver activated but no TIM peripheral assigned" -#endif - -#if STM32_GPT_USE_TIM1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_GPT_TIM1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM1" -#endif - -#if STM32_GPT_USE_TIM2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_GPT_TIM2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM2" -#endif - -#if STM32_GPT_USE_TIM3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_GPT_TIM3_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM3" -#endif - -#if STM32_GPT_USE_TIM4 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_GPT_TIM4_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM4" -#endif - -#if STM32_GPT_USE_TIM5 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_GPT_TIM5_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM5" -#endif - -#if STM32_GPT_USE_TIM8 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_GPT_TIM8_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM8" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief GPT frequency type. - */ -typedef uint32_t gptfreq_t; - -/** - * @brief GPT counter type. - */ -typedef uint16_t gptcnt_t; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Timer clock in Hz. - * @note The low level can use assertions in order to catch invalid - * frequency specifications. - */ - gptfreq_t frequency; - /** - * @brief Timer callback pointer. - * @note This callback is invoked on GPT counter events. - */ - gptcallback_t callback; - /* End of the mandatory fields.*/ -} GPTConfig; - -/** - * @brief Structure representing a GPT driver. - */ -struct GPTDriver { - /** - * @brief Driver state. - */ - gptstate_t state; - /** - * @brief Current configuration data. - */ - const GPTConfig *config; -#if defined(GPT_DRIVER_EXT_FIELDS) - GPT_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Timer base clock. - */ - uint32_t clock; - /** - * @brief Pointer to the TIMx registers block. - */ - stm32_tim_t *tim; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_GPT_USE_TIM1 && !defined(__DOXYGEN__) -extern GPTDriver GPTD1; -#endif - -#if STM32_GPT_USE_TIM2 && !defined(__DOXYGEN__) -extern GPTDriver GPTD2; -#endif - -#if STM32_GPT_USE_TIM3 && !defined(__DOXYGEN__) -extern GPTDriver GPTD3; -#endif - -#if STM32_GPT_USE_TIM4 && !defined(__DOXYGEN__) -extern GPTDriver GPTD4; -#endif - -#if STM32_GPT_USE_TIM5 && !defined(__DOXYGEN__) -extern GPTDriver GPTD5; -#endif - -#if STM32_GPT_USE_TIM8 && !defined(__DOXYGEN__) -extern GPTDriver GPTD8; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void gpt_lld_init(void); - void gpt_lld_start(GPTDriver *gptp); - void gpt_lld_stop(GPTDriver *gptp); - void gpt_lld_start_timer(GPTDriver *gptp, gptcnt_t period); - void gpt_lld_stop_timer(GPTDriver *gptp); - void gpt_lld_polled_delay(GPTDriver *gptp, gptcnt_t interval); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GPT */ - -#endif /* _GPT_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/i2s_lld.c b/os/hal/platforms/STM32/i2s_lld.c deleted file mode 100644 index b052fa0246..0000000000 --- a/os/hal/platforms/STM32/i2s_lld.c +++ /dev/null @@ -1,165 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/i2s_lld.c - * @brief I2S Driver subsystem low level driver source template. - * - * @addtogroup I2S - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_I2S || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level I2S driver initialization. - * - * @notapi - */ -void i2s_lld_init(void) { - -#if STM32_I2S_USE_I2S2 - spiObjectInit(&I2SD2); - I2SD2.spi = SPI2; -#endif - -#if STM32_I2S_USE_I2S3 - spiObjectInit(&I2SD3); - I2SD3.spi = SPI3; -#endif -} - -/** - * @brief Configures and activates the I2S peripheral. - * - * @param[in] i2sp pointer to the @p I2SDriver object - * - * @notapi - */ -void i2s_lld_start(I2SDriver *i2sp) { - - /* If in stopped state then enables the SPI and DMA clocks.*/ - if (i2sp->state == I2S_STOP) { -#if STM32_SPI_USE_SPI2 - if (&SPID2 == spip) { - bool_t b; - b = dmaStreamAllocate(spip->dma, - STM32_I2S_I2S2_IRQ_PRIORITY, - (stm32_dmaisr_t)i2s_lld_serve_rx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #1", "stream already allocated"); - rccEnableSPI2(FALSE); - } -#endif -#if STM32_SPI_USE_SPI3 - if (&SPID3 == spip) { - bool_t b; - b = dmaStreamAllocate(spip->dma, - STM32_I2S_I2S3_IRQ_PRIORITY, - (stm32_dmaisr_t)i2s_lld_serve_rx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #2", "stream already allocated"); - rccEnableSPI3(FALSE); - } -#endif - } - /* Configuration.*/ -} - -/** - * @brief Deactivates the I2S peripheral. - * - * @param[in] i2sp pointer to the @p I2SDriver object - * - * @notapi - */ -void i2s_lld_stop(I2SDriver *i2sp) { - - if (i2sp->state == I2S_READY) { - /* Clock deactivation.*/ - - } -} - -/** - * @brief Starts a I2S data exchange. - * - * @param[in] i2sp pointer to the @p I2SDriver object - * - * @notapi - */ -void i2s_lld_start_exchange(I2SDriver *i2sp) { - -} - -/** - * @brief Starts a I2S data exchange in continuous mode. - * - * @param[in] i2sp pointer to the @p I2SDriver object - * - * @notapi - */ -void i2s_lld_start_exchange_continuous(I2SDriver *i2sp) { - -} - -/** - * @brief Stops the ongoing data exchange. - * @details The ongoing data exchange, if any, is stopped, if the driver - * was not active the function does nothing. - * - * @param[in] i2sp pointer to the @p I2SDriver object - * - * @notapi - */ -void i2s_lld_stop_exchange(I2SDriver *i2sp) { - -} - -#endif /* HAL_USE_I2S */ - -/** @} */ diff --git a/os/hal/platforms/STM32/i2s_lld.h b/os/hal/platforms/STM32/i2s_lld.h deleted file mode 100644 index 44d33ab274..0000000000 --- a/os/hal/platforms/STM32/i2s_lld.h +++ /dev/null @@ -1,321 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/i2s_lld.h - * @brief I2S Driver subsystem low level driver header template. - * - * @addtogroup I2S - * @{ - */ - -#ifndef _I2S_LLD_H_ -#define _I2S_LLD_H_ - -#if HAL_USE_I2S || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief I2S2 driver enable switch. - * @details If set to @p TRUE the support for I2S2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_I2S_USE_I2S2) || defined(__DOXYGEN__) -#define STM32_I2S_USE_I2S2 FALSE -#endif - -/** - * @brief I2S3 driver enable switch. - * @details If set to @p TRUE the support for I2S3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_I2S_USE_I2S3) || defined(__DOXYGEN__) -#define STM32_I2S_USE_I2S3 FALSE -#endif - -/** - * @brief I2S2 interrupt priority level setting. - */ -#if !defined(STM32_I2S_I2S2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2S_I2S2_IRQ_PRIORITY 10 -#endif - -/** - * @brief I2S3 interrupt priority level setting. - */ -#if !defined(STM32_I2S_I2S3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2S_I2S3_IRQ_PRIORITY 10 -#endif - -/** - * @brief I2S2 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_I2S_I2S2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2S_I2S2_DMA_PRIORITY 1 -#endif - -/** - * @brief I2S3 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_I2S_I2S2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_I2S_I2S2_DMA_PRIORITY 1 -#endif - -/** - * @brief I2S DMA error hook. - */ -#if !defined(STM32_I2S_DMA_ERROR_HOOK) || defined(__DOXYGEN__) -#define STM32_I2S_DMA_ERROR_HOOK(i2sp) chSysHalt() -#endif - -#if STM32_ADVANCED_DMA || defined(__DOXYGEN__) - -/** - * @brief DMA stream used for I2S2 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2S_I2S2_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2S_I2S2_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#endif - -/** - * @brief DMA stream used for I2S2 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2S_I2S2_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2S_I2S2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#endif - -/** - * @brief DMA stream used for I2S3 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2S_I2S3_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2S_I2S3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#endif - -/** - * @brief DMA stream used for I2S3 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_I2S_I2S3_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_I2S_I2S3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#endif - -#else /* !STM32_ADVANCED_DMA */ - -/* Fixed streams for platforms using the old DMA peripheral, the values are - valid for both STM32F1xx and STM32L1xx.*/ -#define STM32_I2S_I2S2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2S_I2S2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_I2S_I2S3_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_I2S_I2S3_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) - -#endif /* !STM32_ADVANCED_DMA */ -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_I2S_USE_I2S2 && !STM32_HAS_SPI2 -#error "SPI2 not present in the selected device" -#endif - -#if STM32_I2S_USE_I2S3 && !STM32_HAS_SPI3 -#error "SPI3 not present in the selected device" -#endif - -#if !STM32_I2S_USE_I2S2 && !STM32_I2S_USE_I2S3 -#error "I2S driver activated but no I2S peripheral assigned" -#endif - -#if STM32_I2S_USE_I2S2 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2S_I2S2_RX_DMA_STREAM, STM32_SPI2_RX_DMA_MSK) -#error "invalid DMA stream associated to I2S2 RX" -#endif - -#if STM32_I2S_USE_I2S2 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2S_I2S2_TX_DMA_STREAM, STM32_SPI2_TX_DMA_MSK) -#error "invalid DMA stream associated to I2S2 TX" -#endif - -#if STM32_I2S_USE_I2S3 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2S_I2S3_RX_DMA_STREAM, STM32_SPI3_RX_DMA_MSK) -#error "invalid DMA stream associated to I2S3 RX" -#endif - -#if STM32_I2S_USE_I2S3 && \ - !STM32_DMA_IS_VALID_ID(STM32_I2S_I2S3_TX_DMA_STREAM, STM32_SPI3_TX_DMA_MSK) -#error "invalid DMA stream associated to I2S3 TX" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief I2S mode type. - */ -typedef uint32_t i2smode_t; - -/** - * @brief Type of a structure representing an I2S driver. - */ -typedef struct I2SDriver I2SDriver; - -/** - * @brief I2S notification callback type. - * - * @param[in] i2sp pointer to the @p I2SDriver object - * @param[in] buffer pointer to the buffer - * @param[in] n number of sample positions starting from @p buffer - */ -typedef void (*i2scallback_t)(I2SDriver *i2sp, void *buffer, size_t n); - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief I2S mode selection. - */ - i2smode_t mode; - /** - * @brief Transmission buffer pointer. - */ - const void *tx_buffer; - /** - * @brief Transmission buffer size in number of samples. - */ - size_t tx_size; - /** - * @brief Callback function associated to the transmission or @p NULL. - */ - i2scallback_t tx_cb; - /** - * @brief Receive buffer pointer. - */ - void *rx_buffer; - /** - * @brief Receive buffer size in number of samples. - */ - size_t rx_size; - /** - * @brief Callback function associated to the reception or @p NULL. - */ - i2scallback_t rx_cb;; - /* End of the mandatory fields.*/ - /** - * @brief Configuration of the I2SCFGR register. - * @details See the STM32 reference manual, this register is used for - * the I2S configuration, the following bits must not be - * specified because handled directly by the driver: - * - I2SMOD - * - I2SE - * - I2SCFG - * . - */ - int16_t i2scfgr; - /** - * @brief Configuration of the I2SPR register. - * @details See the STM32 reference manual, this register is used for - * the I2S clock setup. - */ - int16_t i2spr; -} I2SConfig; - -/** - * @brief Structure representing an I2S driver. - */ -struct I2SDriver { - /** - * @brief Driver state. - */ - i2sstate_t state; - /** - * @brief Current configuration data. - */ - const I2SConfig *config; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SPIx registers block. - */ - SPI_TypeDef *spi; - /** - * @brief DMA stream. - */ - const stm32_dma_stream_t *dma; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_I2S_USE_I2S2 && !defined(__DOXYGEN__) -extern I2SDriver I2SD2; -#endif - -#if STM32_I2S_USE_I2S3 && !defined(__DOXYGEN__) -extern I2SDriver I2SD3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void i2s_lld_init(void); - void i2s_lld_start(I2SDriver *i2sp); - void i2s_lld_stop(I2SDriver *i2sp); - void i2s_lld_start_exchange(I2SDriver *i2sp); - void i2s_lld_start_exchange_continuous(I2SDriver *i2sp); - void i2s_lld_stop_exchange(I2SDriver *i2sp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_I2S */ - -#endif /* _I2S_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/icu_lld.c b/os/hal/platforms/STM32/icu_lld.c deleted file mode 100644 index 82fb39769a..0000000000 --- a/os/hal/platforms/STM32/icu_lld.c +++ /dev/null @@ -1,588 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Fabio Utzig and - Xo Wang. - */ - -/** - * @file STM32/icu_lld.c - * @brief STM32 ICU subsystem low level driver header. - * - * @addtogroup ICU - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_ICU || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief ICUD1 driver identifier. - * @note The driver ICUD1 allocates the complex timer TIM1 when enabled. - */ -#if STM32_ICU_USE_TIM1 || defined(__DOXYGEN__) -ICUDriver ICUD1; -#endif - -/** - * @brief ICUD2 driver identifier. - * @note The driver ICUD1 allocates the timer TIM2 when enabled. - */ -#if STM32_ICU_USE_TIM2 || defined(__DOXYGEN__) -ICUDriver ICUD2; -#endif - -/** - * @brief ICUD3 driver identifier. - * @note The driver ICUD1 allocates the timer TIM3 when enabled. - */ -#if STM32_ICU_USE_TIM3 || defined(__DOXYGEN__) -ICUDriver ICUD3; -#endif - -/** - * @brief ICUD4 driver identifier. - * @note The driver ICUD4 allocates the timer TIM4 when enabled. - */ -#if STM32_ICU_USE_TIM4 || defined(__DOXYGEN__) -ICUDriver ICUD4; -#endif - -/** - * @brief ICUD5 driver identifier. - * @note The driver ICUD5 allocates the timer TIM5 when enabled. - */ -#if STM32_ICU_USE_TIM5 || defined(__DOXYGEN__) -ICUDriver ICUD5; -#endif - -/** - * @brief ICUD8 driver identifier. - * @note The driver ICUD8 allocates the timer TIM8 when enabled. - */ -#if STM32_ICU_USE_TIM8 || defined(__DOXYGEN__) -ICUDriver ICUD8; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared IRQ handler. - * - * @param[in] icup pointer to the @p ICUDriver object - */ -static void icu_lld_serve_interrupt(ICUDriver *icup) { - uint16_t sr; - - sr = icup->tim->SR & icup->tim->DIER; - icup->tim->SR = ~sr; - if (icup->config->channel == ICU_CHANNEL_1) { - if ((sr & TIM_SR_CC1IF) != 0) - _icu_isr_invoke_period_cb(icup); - if ((sr & TIM_SR_CC2IF) != 0) - _icu_isr_invoke_width_cb(icup); - } else { - if ((sr & TIM_SR_CC1IF) != 0) - _icu_isr_invoke_width_cb(icup); - if ((sr & TIM_SR_CC2IF) != 0) - _icu_isr_invoke_period_cb(icup); - } - if ((sr & TIM_SR_UIF) != 0) - _icu_isr_invoke_overflow_cb(icup); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_ICU_USE_TIM1 -#if !defined(STM32_TIM1_UP_HANDLER) -#error "STM32_TIM1_UP_HANDLER not defined" -#endif -/** - * @brief TIM1 compare interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM1_UP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD1); - - CH_IRQ_EPILOGUE(); -} - -#if !defined(STM32_TIM1_CC_HANDLER) -#error "STM32_TIM1_CC_HANDLER not defined" -#endif -/** - * @brief TIM1 compare interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM1_CC_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_ICU_USE_TIM1 */ - -#if STM32_ICU_USE_TIM2 -#if !defined(STM32_TIM2_HANDLER) -#error "STM32_TIM2_HANDLER not defined" -#endif -/** - * @brief TIM2 interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_ICU_USE_TIM2 */ - -#if STM32_ICU_USE_TIM3 -#if !defined(STM32_TIM3_HANDLER) -#error "STM32_TIM3_HANDLER not defined" -#endif -/** - * @brief TIM3 interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM3_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_ICU_USE_TIM3 */ - -#if STM32_ICU_USE_TIM4 -#if !defined(STM32_TIM4_HANDLER) -#error "STM32_TIM4_HANDLER not defined" -#endif -/** - * @brief TIM4 interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM4_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD4); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_ICU_USE_TIM4 */ - -#if STM32_ICU_USE_TIM5 -#if !defined(STM32_TIM5_HANDLER) -#error "STM32_TIM5_HANDLER not defined" -#endif -/** - * @brief TIM5 interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM5_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD5); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_ICU_USE_TIM5 */ - -#if STM32_ICU_USE_TIM8 -#if !defined(STM32_TIM8_UP_HANDLER) -#error "STM32_TIM8_UP_HANDLER not defined" -#endif -/** - * @brief TIM8 compare interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM8_UP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD8); - - CH_IRQ_EPILOGUE(); -} - -#if !defined(STM32_TIM8_CC_HANDLER) -#error "STM32_TIM8_CC_HANDLER not defined" -#endif -/** - * @brief TIM8 compare interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM8_CC_HANDLER) { - - CH_IRQ_PROLOGUE(); - - icu_lld_serve_interrupt(&ICUD8); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_ICU_USE_TIM8 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level ICU driver initialization. - * - * @notapi - */ -void icu_lld_init(void) { - -#if STM32_ICU_USE_TIM1 - /* Driver initialization.*/ - icuObjectInit(&ICUD1); - ICUD1.tim = STM32_TIM1; -#endif - -#if STM32_ICU_USE_TIM2 - /* Driver initialization.*/ - icuObjectInit(&ICUD2); - ICUD2.tim = STM32_TIM2; -#endif - -#if STM32_ICU_USE_TIM3 - /* Driver initialization.*/ - icuObjectInit(&ICUD3); - ICUD3.tim = STM32_TIM3; -#endif - -#if STM32_ICU_USE_TIM4 - /* Driver initialization.*/ - icuObjectInit(&ICUD4); - ICUD4.tim = STM32_TIM4; -#endif - -#if STM32_ICU_USE_TIM5 - /* Driver initialization.*/ - icuObjectInit(&ICUD5); - ICUD5.tim = STM32_TIM5; -#endif - -#if STM32_ICU_USE_TIM8 - /* Driver initialization.*/ - icuObjectInit(&ICUD8); - ICUD8.tim = STM32_TIM8; -#endif -} - -/** - * @brief Configures and activates the ICU peripheral. - * - * @param[in] icup pointer to the @p ICUDriver object - * - * @notapi - */ -void icu_lld_start(ICUDriver *icup) { - uint32_t psc; - - chDbgAssert((icup->config->channel == ICU_CHANNEL_1) || - (icup->config->channel == ICU_CHANNEL_2), - "icu_lld_start(), #1", "invalid input"); - - if (icup->state == ICU_STOP) { - /* Clock activation and timer reset.*/ -#if STM32_ICU_USE_TIM1 - if (&ICUD1 == icup) { - rccEnableTIM1(FALSE); - rccResetTIM1(); - nvicEnableVector(STM32_TIM1_UP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM1_IRQ_PRIORITY)); - nvicEnableVector(STM32_TIM1_CC_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM1_IRQ_PRIORITY)); - icup->clock = STM32_TIMCLK2; - } -#endif -#if STM32_ICU_USE_TIM2 - if (&ICUD2 == icup) { - rccEnableTIM2(FALSE); - rccResetTIM2(); - nvicEnableVector(STM32_TIM2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM2_IRQ_PRIORITY)); - icup->clock = STM32_TIMCLK1; - } -#endif -#if STM32_ICU_USE_TIM3 - if (&ICUD3 == icup) { - rccEnableTIM3(FALSE); - rccResetTIM3(); - nvicEnableVector(STM32_TIM3_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM3_IRQ_PRIORITY)); - icup->clock = STM32_TIMCLK1; - } -#endif -#if STM32_ICU_USE_TIM4 - if (&ICUD4 == icup) { - rccEnableTIM4(FALSE); - rccResetTIM4(); - nvicEnableVector(STM32_TIM4_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM4_IRQ_PRIORITY)); - icup->clock = STM32_TIMCLK1; - } -#endif - -#if STM32_ICU_USE_TIM5 - if (&ICUD5 == icup) { - rccEnableTIM5(FALSE); - rccResetTIM5(); - nvicEnableVector(STM32_TIM5_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM5_IRQ_PRIORITY)); - icup->clock = STM32_TIMCLK1; - } -#endif -#if STM32_ICU_USE_TIM8 - if (&ICUD8 == icup) { - rccEnableTIM8(FALSE); - rccResetTIM8(); - nvicEnableVector(STM32_TIM8_UP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM8_IRQ_PRIORITY)); - nvicEnableVector(STM32_TIM8_CC_NUMBER, - CORTEX_PRIORITY_MASK(STM32_ICU_TIM8_IRQ_PRIORITY)); - icup->clock = STM32_TIMCLK2; - } -#endif - } - else { - /* Driver re-configuration scenario, it must be stopped first.*/ - icup->tim->CR1 = 0; /* Timer disabled. */ - icup->tim->DIER = 0; /* All IRQs disabled. */ - icup->tim->SR = 0; /* Clear eventual pending IRQs. */ - icup->tim->CCR[0] = 0; /* Comparator 1 disabled. */ - icup->tim->CCR[1] = 0; /* Comparator 2 disabled. */ - icup->tim->CNT = 0; /* Counter reset to zero. */ - } - - /* Timer configuration.*/ - psc = (icup->clock / icup->config->frequency) - 1; - chDbgAssert((psc <= 0xFFFF) && - ((psc + 1) * icup->config->frequency) == icup->clock, - "icu_lld_start(), #1", "invalid frequency"); - icup->tim->PSC = (uint16_t)psc; - icup->tim->ARR = 0xFFFF; - - if (icup->config->channel == ICU_CHANNEL_1) { - /* Selected input 1. - CCMR1_CC1S = 01 = CH1 Input on TI1. - CCMR1_CC2S = 10 = CH2 Input on TI1.*/ - icup->tim->CCMR1 = TIM_CCMR1_CC1S_0 | - TIM_CCMR1_CC2S_1; - /* SMCR_TS = 101, input is TI1FP1. - SMCR_SMS = 100, reset on rising edge.*/ - icup->tim->SMCR = TIM_SMCR_TS_2 | TIM_SMCR_TS_0 | - TIM_SMCR_SMS_2; - /* The CCER settings depend on the selected trigger mode. - ICU_INPUT_ACTIVE_HIGH: Active on rising edge, idle on falling edge. - ICU_INPUT_ACTIVE_LOW: Active on falling edge, idle on rising edge.*/ - if (icup->config->mode == ICU_INPUT_ACTIVE_HIGH) - icup->tim->CCER = TIM_CCER_CC1E | - TIM_CCER_CC2E | TIM_CCER_CC2P; - else - icup->tim->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P | - TIM_CCER_CC2E; - /* Direct pointers to the capture registers in order to make reading - data faster from within callbacks.*/ - icup->wccrp = &icup->tim->CCR[1]; - icup->pccrp = &icup->tim->CCR[0]; - } else { - /* Selected input 2. - CCMR1_CC1S = 10 = CH1 Input on TI2. - CCMR1_CC2S = 01 = CH2 Input on TI2.*/ - icup->tim->CCMR1 = TIM_CCMR1_CC1S_1 | - TIM_CCMR1_CC2S_0; - /* SMCR_TS = 110, input is TI2FP2. - SMCR_SMS = 100, reset on rising edge.*/ - icup->tim->SMCR = TIM_SMCR_TS_2 | TIM_SMCR_TS_1 | - TIM_SMCR_SMS_2; - /* The CCER settings depend on the selected trigger mode. - ICU_INPUT_ACTIVE_HIGH: Active on rising edge, idle on falling edge. - ICU_INPUT_ACTIVE_LOW: Active on falling edge, idle on rising edge.*/ - if (icup->config->mode == ICU_INPUT_ACTIVE_HIGH) - icup->tim->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P | - TIM_CCER_CC2E; - else - icup->tim->CCER = TIM_CCER_CC1E | - TIM_CCER_CC2E | TIM_CCER_CC2P; - /* Direct pointers to the capture registers in order to make reading - data faster from within callbacks.*/ - icup->wccrp = &icup->tim->CCR[0]; - icup->pccrp = &icup->tim->CCR[1]; - } -} - -/** - * @brief Deactivates the ICU peripheral. - * - * @param[in] icup pointer to the @p ICUDriver object - * - * @notapi - */ -void icu_lld_stop(ICUDriver *icup) { - - if (icup->state == ICU_READY) { - /* Clock deactivation.*/ - icup->tim->CR1 = 0; /* Timer disabled. */ - icup->tim->DIER = 0; /* All IRQs disabled. */ - icup->tim->SR = 0; /* Clear eventual pending IRQs. */ - -#if STM32_ICU_USE_TIM1 - if (&ICUD1 == icup) { - nvicDisableVector(STM32_TIM1_UP_NUMBER); - nvicDisableVector(STM32_TIM1_CC_NUMBER); - rccDisableTIM1(FALSE); - } -#endif -#if STM32_ICU_USE_TIM2 - if (&ICUD2 == icup) { - nvicDisableVector(STM32_TIM2_NUMBER); - rccDisableTIM2(FALSE); - } -#endif -#if STM32_ICU_USE_TIM3 - if (&ICUD3 == icup) { - nvicDisableVector(STM32_TIM3_NUMBER); - rccDisableTIM3(FALSE); - } -#endif -#if STM32_ICU_USE_TIM4 - if (&ICUD4 == icup) { - nvicDisableVector(STM32_TIM4_NUMBER); - rccDisableTIM4(FALSE); - } -#endif -#if STM32_ICU_USE_TIM5 - if (&ICUD5 == icup) { - nvicDisableVector(STM32_TIM5_NUMBER); - rccDisableTIM5(FALSE); - } -#endif - } -#if STM32_ICU_USE_TIM8 - if (&ICUD8 == icup) { - nvicDisableVector(STM32_TIM8_UP_NUMBER); - nvicDisableVector(STM32_TIM8_CC_NUMBER); - rccDisableTIM8(FALSE); - } -#endif -} - -/** - * @brief Enables the input capture. - * - * @param[in] icup pointer to the @p ICUDriver object - * - * @notapi - */ -void icu_lld_enable(ICUDriver *icup) { - - icup->tim->SR = 0; /* Clear pending IRQs (if any). */ - if (icup->config->channel == ICU_CHANNEL_1) { - if (icup->config->period_cb != NULL) - icup->tim->DIER |= TIM_DIER_CC1IE; - if (icup->config->width_cb != NULL) - icup->tim->DIER |= TIM_DIER_CC2IE; - } else { - if (icup->config->width_cb != NULL) - icup->tim->DIER |= TIM_DIER_CC1IE; - if (icup->config->period_cb != NULL) - icup->tim->DIER |= TIM_DIER_CC2IE; - } - if (icup->config->overflow_cb != NULL) - icup->tim->DIER |= TIM_DIER_UIE; - icup->tim->CR1 = TIM_CR1_URS | TIM_CR1_CEN; -} - -/** - * @brief Disables the input capture. - * - * @param[in] icup pointer to the @p ICUDriver object - * - * @notapi - */ -void icu_lld_disable(ICUDriver *icup) { - - icup->tim->CR1 = 0; /* Initially stopped. */ - icup->tim->SR = 0; /* Clear pending IRQs (if any). */ - icup->tim->DIER = 0; /* Interrupts disabled. */ -} - -#endif /* HAL_USE_ICU */ - -/** @} */ diff --git a/os/hal/platforms/STM32/icu_lld.h b/os/hal/platforms/STM32/icu_lld.h deleted file mode 100644 index 6469037aa6..0000000000 --- a/os/hal/platforms/STM32/icu_lld.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/icu_lld.h - * @brief STM32 ICU subsystem low level driver header. - * - * @addtogroup ICU - * @{ - */ - -#ifndef _ICU_LLD_H_ -#define _ICU_LLD_H_ - -#if HAL_USE_ICU || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief ICUD1 driver enable switch. - * @details If set to @p TRUE the support for ICUD1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ICU_USE_TIM1) || defined(__DOXYGEN__) -#define STM32_ICU_USE_TIM1 FALSE -#endif - -/** - * @brief ICUD2 driver enable switch. - * @details If set to @p TRUE the support for ICUD2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ICU_USE_TIM2) || defined(__DOXYGEN__) -#define STM32_ICU_USE_TIM2 FALSE -#endif - -/** - * @brief ICUD3 driver enable switch. - * @details If set to @p TRUE the support for ICUD3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ICU_USE_TIM3) || defined(__DOXYGEN__) -#define STM32_ICU_USE_TIM3 FALSE -#endif - -/** - * @brief ICUD4 driver enable switch. - * @details If set to @p TRUE the support for ICUD4 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ICU_USE_TIM4) || defined(__DOXYGEN__) -#define STM32_ICU_USE_TIM4 FALSE -#endif - -/** - * @brief ICUD5 driver enable switch. - * @details If set to @p TRUE the support for ICUD5 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ICU_USE_TIM5) || defined(__DOXYGEN__) -#define STM32_ICU_USE_TIM5 FALSE -#endif - -/** - * @brief ICUD8 driver enable switch. - * @details If set to @p TRUE the support for ICUD8 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ICU_USE_TIM8) || defined(__DOXYGEN__) -#define STM32_ICU_USE_TIM8 FALSE -#endif - -/** - * @brief ICUD1 interrupt priority level setting. - */ -#if !defined(STM32_ICU_TIM1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#endif - -/** - * @brief ICUD2 interrupt priority level setting. - */ -#if !defined(STM32_ICU_TIM2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#endif - -/** - * @brief ICUD3 interrupt priority level setting. - */ -#if !defined(STM32_ICU_TIM3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#endif - -/** - * @brief ICUD4 interrupt priority level setting. - */ -#if !defined(STM32_ICU_TIM4_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#endif - -/** - * @brief ICUD5 interrupt priority level setting. - */ -#if !defined(STM32_ICU_TIM5_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#endif - -/** - * @brief ICUD8 interrupt priority level setting. - */ -#if !defined(STM32_ICU_TIM8_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_ICU_USE_TIM1 && !STM32_HAS_TIM1 -#error "TIM1 not present in the selected device" -#endif - -#if STM32_ICU_USE_TIM2 && !STM32_HAS_TIM2 -#error "TIM2 not present in the selected device" -#endif - -#if STM32_ICU_USE_TIM3 && !STM32_HAS_TIM3 -#error "TIM3 not present in the selected device" -#endif - -#if STM32_ICU_USE_TIM4 && !STM32_HAS_TIM4 -#error "TIM4 not present in the selected device" -#endif - -#if STM32_ICU_USE_TIM5 && !STM32_HAS_TIM5 -#error "TIM5 not present in the selected device" -#endif - -#if STM32_ICU_USE_TIM8 && !STM32_HAS_TIM8 -#error "TIM8 not present in the selected device" -#endif - -#if !STM32_ICU_USE_TIM1 && !STM32_ICU_USE_TIM2 && \ - !STM32_ICU_USE_TIM3 && !STM32_ICU_USE_TIM4 && \ - !STM32_ICU_USE_TIM5 && !STM32_ICU_USE_TIM8 -#error "ICU driver activated but no TIM peripheral assigned" -#endif - -#if STM32_ICU_USE_TIM1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ICU_TIM1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM1" -#endif - -#if STM32_ICU_USE_TIM2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ICU_TIM2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM2" -#endif - -#if STM32_ICU_USE_TIM3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ICU_TIM3_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM3" -#endif - -#if STM32_ICU_USE_TIM4 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ICU_TIM4_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM4" -#endif - -#if STM32_ICU_USE_TIM5 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ICU_TIM5_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM5" -#endif - -#if STM32_ICU_USE_TIM8 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ICU_TIM8_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM8" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief ICU driver mode. - */ -typedef enum { - ICU_INPUT_ACTIVE_HIGH = 0, /**< Trigger on rising edge. */ - ICU_INPUT_ACTIVE_LOW = 1, /**< Trigger on falling edge. */ -} icumode_t; - -/** - * @brief ICU frequency type. - */ -typedef uint32_t icufreq_t; - -/** - * @brief ICU channel. - */ -typedef enum { - ICU_CHANNEL_1 = 0, /**< Use TIMxCH1. */ - ICU_CHANNEL_2 = 1, /**< Use TIMxCH2. */ -} icuchannel_t; - -/** - * @brief ICU counter type. - */ -typedef uint16_t icucnt_t; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - /** - * @brief Driver mode. - */ - icumode_t mode; - /** - * @brief Timer clock in Hz. - * @note The low level can use assertions in order to catch invalid - * frequency specifications. - */ - icufreq_t frequency; - /** - * @brief Callback for pulse width measurement. - */ - icucallback_t width_cb; - /** - * @brief Callback for cycle period measurement. - */ - icucallback_t period_cb; - /** - * @brief Callback for timer overflow. - */ - icucallback_t overflow_cb; - /* End of the mandatory fields.*/ - /** - * @brief Timer input channel to be used. - * @note Only inputs TIMx 1 and 2 are supported. - */ - icuchannel_t channel; -} ICUConfig; - -/** - * @brief Structure representing an ICU driver. - */ -struct ICUDriver { - /** - * @brief Driver state. - */ - icustate_t state; - /** - * @brief Current configuration data. - */ - const ICUConfig *config; -#if defined(ICU_DRIVER_EXT_FIELDS) - ICU_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Timer base clock. - */ - uint32_t clock; - /** - * @brief Pointer to the TIMx registers block. - */ - stm32_tim_t *tim; - /** - * @brief CCR register used for width capture. - */ - volatile uint32_t *wccrp; - /** - * @brief CCR register used for period capture. - */ - volatile uint32_t *pccrp; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Returns the width of the latest pulse. - * @details The pulse width is defined as number of ticks between the start - * edge and the stop edge. - * - * @param[in] icup pointer to the @p ICUDriver object - * @return The number of ticks. - * - * @notapi - */ -#define icu_lld_get_width(icup) (*((icup)->wccrp) + 1) - -/** - * @brief Returns the width of the latest cycle. - * @details The cycle width is defined as number of ticks between a start - * edge and the next start edge. - * - * @param[in] icup pointer to the @p ICUDriver object - * @return The number of ticks. - * - * @notapi - */ -#define icu_lld_get_period(icup) (*((icup)->pccrp) + 1) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_ICU_USE_TIM1 && !defined(__DOXYGEN__) -extern ICUDriver ICUD1; -#endif - -#if STM32_ICU_USE_TIM2 && !defined(__DOXYGEN__) -extern ICUDriver ICUD2; -#endif - -#if STM32_ICU_USE_TIM3 && !defined(__DOXYGEN__) -extern ICUDriver ICUD3; -#endif - -#if STM32_ICU_USE_TIM4 && !defined(__DOXYGEN__) -extern ICUDriver ICUD4; -#endif - -#if STM32_ICU_USE_TIM5 && !defined(__DOXYGEN__) -extern ICUDriver ICUD5; -#endif - -#if STM32_ICU_USE_TIM8 && !defined(__DOXYGEN__) -extern ICUDriver ICUD8; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void icu_lld_init(void); - void icu_lld_start(ICUDriver *icup); - void icu_lld_stop(ICUDriver *icup); - void icu_lld_enable(ICUDriver *icup); - void icu_lld_disable(ICUDriver *icup); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_ICU */ - -#endif /* _ICU_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/mac_lld.c b/os/hal/platforms/STM32/mac_lld.c deleted file mode 100644 index eb87d579d7..0000000000 --- a/os/hal/platforms/STM32/mac_lld.c +++ /dev/null @@ -1,674 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/mac_lld.c - * @brief STM32 low level MAC driver code. - * - * @addtogroup MAC - * @{ - */ - -#include - -#include "ch.h" -#include "hal.h" -#include "mii.h" - -#if HAL_USE_MAC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define BUFFER_SIZE ((((STM32_MAC_BUFFERS_SIZE - 1) | 3) + 1) / 4) - -/* MII divider optimal value.*/ -#if (STM32_HCLK >= 150000000) -#define MACMIIDR_CR ETH_MACMIIAR_CR_Div102 -#elif (STM32_HCLK >= 100000000) -#define MACMIIDR_CR ETH_MACMIIAR_CR_Div62 -#elif (STM32_HCLK >= 60000000) -#define MACMIIDR_CR ETH_MACMIIAR_CR_Div42 -#elif (STM32_HCLK >= 35000000) -#define MACMIIDR_CR ETH_MACMIIAR_CR_Div26 -#elif (STM32_HCLK >= 20000000) -#define MACMIIDR_CR ETH_MACMIIAR_CR_Div16 -#else -#error "STM32_HCLK below minimum frequency for ETH operations (20MHz)" -#endif - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief Ethernet driver 1. - */ -MACDriver ETHD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -static const uint8_t default_mac_address[] = {0xAA, 0x55, 0x13, - 0x37, 0x01, 0x10}; - -static stm32_eth_rx_descriptor_t rd[STM32_MAC_RECEIVE_BUFFERS]; -static stm32_eth_tx_descriptor_t td[STM32_MAC_TRANSMIT_BUFFERS]; - -static uint32_t rb[STM32_MAC_RECEIVE_BUFFERS][BUFFER_SIZE]; -static uint32_t tb[STM32_MAC_TRANSMIT_BUFFERS][BUFFER_SIZE]; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Writes a PHY register. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[in] reg register number - * @param[in] value new register value - */ -static void mii_write(MACDriver *macp, uint32_t reg, uint32_t value) { - - ETH->MACMIIDR = value; - ETH->MACMIIAR = macp->phyaddr | (reg << 6) | MACMIIDR_CR | - ETH_MACMIIAR_MW | ETH_MACMIIAR_MB; - while ((ETH->MACMIIAR & ETH_MACMIIAR_MB) != 0) - ; -} - -/** - * @brief Reads a PHY register. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[in] reg register number - * - * @return The PHY register content. - */ -static uint32_t mii_read(MACDriver *macp, uint32_t reg) { - - ETH->MACMIIAR = macp->phyaddr | (reg << 6) | MACMIIDR_CR | ETH_MACMIIAR_MB; - while ((ETH->MACMIIAR & ETH_MACMIIAR_MB) != 0) - ; - return ETH->MACMIIDR; -} - -#if !defined(BOARD_PHY_ADDRESS) -/** - * @brief PHY address detection. - * - * @param[in] macp pointer to the @p MACDriver object - */ -static void mii_find_phy(MACDriver *macp) { - uint32_t i; - -#if STM32_MAC_PHY_TIMEOUT > 0 - halrtcnt_t start = halGetCounterValue(); - halrtcnt_t timeout = start + MS2RTT(STM32_MAC_PHY_TIMEOUT); - while (halIsCounterWithin(start, timeout)) { -#endif - for (i = 0; i < 31; i++) { - macp->phyaddr = i << 11; - ETH->MACMIIDR = (i << 6) | MACMIIDR_CR; - if ((mii_read(macp, MII_PHYSID1) == (BOARD_PHY_ID >> 16)) && - ((mii_read(macp, MII_PHYSID2) & 0xFFF0) == (BOARD_PHY_ID & 0xFFF0))) { - return; - } - } -#if STM32_MAC_PHY_TIMEOUT > 0 - } -#endif - /* Wrong or defective board.*/ - chSysHalt(); -} -#endif - -/** - * @brief MAC address setup. - * - * @param[in] p pointer to a six bytes buffer containing the MAC - * address - */ -static void mac_lld_set_address(const uint8_t *p) { - - /* MAC address configuration, only a single address comparator is used, - hash table not used.*/ - ETH->MACA0HR = ((uint32_t)p[5] << 8) | - ((uint32_t)p[4] << 0); - ETH->MACA0LR = ((uint32_t)p[3] << 24) | - ((uint32_t)p[2] << 16) | - ((uint32_t)p[1] << 8) | - ((uint32_t)p[0] << 0); - ETH->MACA1HR = 0x0000FFFF; - ETH->MACA1LR = 0xFFFFFFFF; - ETH->MACA2HR = 0x0000FFFF; - ETH->MACA2LR = 0xFFFFFFFF; - ETH->MACA3HR = 0x0000FFFF; - ETH->MACA3LR = 0xFFFFFFFF; - ETH->MACHTHR = 0; - ETH->MACHTLR = 0; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -CH_IRQ_HANDLER(ETH_IRQHandler) { - uint32_t dmasr; - - CH_IRQ_PROLOGUE(); - - dmasr = ETH->DMASR; - ETH->DMASR = dmasr; /* Clear status bits.*/ - - if (dmasr & ETH_DMASR_RS) { - /* Data Received.*/ - chSysLockFromIsr(); - chSemResetI(ÐD1.rdsem, 0); -#if MAC_USE_EVENTS - chEvtBroadcastI(ÐD1.rdevent); -#endif - chSysUnlockFromIsr(); - } - - if (dmasr & ETH_DMASR_TS) { - /* Data Transmitted.*/ - chSysLockFromIsr(); - chSemResetI(ÐD1.tdsem, 0); - chSysUnlockFromIsr(); - } - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level MAC initialization. - * - * @notapi - */ -void mac_lld_init(void) { - unsigned i; - - macObjectInit(ÐD1); - ETHD1.link_up = FALSE; - - /* Descriptor tables are initialized in chained mode, note that the first - word is not initialized here but in mac_lld_start().*/ - for (i = 0; i < STM32_MAC_RECEIVE_BUFFERS; i++) { - rd[i].rdes1 = STM32_RDES1_RCH | STM32_MAC_BUFFERS_SIZE; - rd[i].rdes2 = (uint32_t)rb[i]; - rd[i].rdes3 = (uint32_t)&rd[(i + 1) % STM32_MAC_RECEIVE_BUFFERS]; - } - for (i = 0; i < STM32_MAC_TRANSMIT_BUFFERS; i++) { - td[i].tdes1 = 0; - td[i].tdes2 = (uint32_t)tb[i]; - td[i].tdes3 = (uint32_t)&td[(i + 1) % STM32_MAC_TRANSMIT_BUFFERS]; - } - - /* Selection of the RMII or MII mode based on info exported by board.h.*/ -#if defined(STM32F10X_CL) -#if defined(BOARD_PHY_RMII) - AFIO->MAPR |= AFIO_MAPR_MII_RMII_SEL; -#else - AFIO->MAPR &= ~AFIO_MAPR_MII_RMII_SEL; -#endif -#elif defined(STM32F2XX) || defined(STM32F4XX) -#if defined(BOARD_PHY_RMII) - SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL; -#else - SYSCFG->PMC &= ~SYSCFG_PMC_MII_RMII_SEL; -#endif -#else -#error "unsupported STM32 platform for MAC driver" -#endif - - /* Reset of the MAC core.*/ - rccResetETH(); - - /* MAC clocks temporary activation.*/ - rccEnableETH(FALSE); - - /* PHY address setup.*/ -#if defined(BOARD_PHY_ADDRESS) - ETHD1.phyaddr = BOARD_PHY_ADDRESS << 11; -#else - mii_find_phy(ÐD1); -#endif - -#if defined(BOARD_PHY_RESET) - /* PHY board-specific reset procedure.*/ - BOARD_PHY_RESET(); -#else - /* PHY soft reset procedure.*/ - mii_write(ÐD1, MII_BMCR, BMCR_RESET); -#if defined(BOARD_PHY_RESET_DELAY) - halPolledDelay(BOARD_PHY_RESET_DELAY); -#endif - while (mii_read(ÐD1, MII_BMCR) & BMCR_RESET) - ; -#endif - - /* PHY in power down mode until the driver will be started.*/ - mii_write(ÐD1, MII_BMCR, mii_read(ÐD1, MII_BMCR) | BMCR_PDOWN); - - /* MAC clocks stopped again.*/ - rccDisableETH(FALSE); -} - -/** - * @brief Configures and activates the MAC peripheral. - * - * @param[in] macp pointer to the @p MACDriver object - * - * @notapi - */ -void mac_lld_start(MACDriver *macp) { - unsigned i; - - /* Resets the state of all descriptors.*/ - for (i = 0; i < STM32_MAC_RECEIVE_BUFFERS; i++) - rd[i].rdes0 = STM32_RDES0_OWN; - macp->rxptr = (stm32_eth_rx_descriptor_t *)rd; - for (i = 0; i < STM32_MAC_TRANSMIT_BUFFERS; i++) - td[i].tdes0 = STM32_TDES0_TCH; - macp->txptr = (stm32_eth_tx_descriptor_t *)td; - - /* MAC clocks activation and commanded reset procedure.*/ - rccEnableETH(FALSE); - ETH->DMABMR |= ETH_DMABMR_SR; - while(ETH->DMABMR & ETH_DMABMR_SR) - ; - - /* ISR vector enabled.*/ - nvicEnableVector(ETH_IRQn, CORTEX_PRIORITY_MASK(STM32_ETH1_IRQ_PRIORITY)); - -#if STM32_ETH1_CHANGE_PHY_STATE - /* PHY in power up mode.*/ - mii_write(macp, MII_BMCR, mii_read(macp, MII_BMCR) & ~BMCR_PDOWN); -#endif - - /* MAC configuration.*/ - ETH->MACFFR = 0; - ETH->MACFCR = 0; - ETH->MACVLANTR = 0; - - /* MAC address setup.*/ - if (macp->config->mac_address == NULL) - mac_lld_set_address(default_mac_address); - else - mac_lld_set_address(macp->config->mac_address); - - /* Transmitter and receiver enabled. - Note that the complete setup of the MAC is performed when the link - status is detected.*/ -#if STM32_IP_CHECKSUM_OFFLOAD - ETH->MACCR = ETH_MACCR_IPCO | ETH_MACCR_RE | ETH_MACCR_TE; -#else - ETH->MACCR = ETH_MACCR_RE | ETH_MACCR_TE; -#endif - - /* DMA configuration: - Descriptor chains pointers.*/ - ETH->DMARDLAR = (uint32_t)rd; - ETH->DMATDLAR = (uint32_t)td; - - /* Enabling required interrupt sources.*/ - ETH->DMASR = ETH->DMASR; - ETH->DMAIER = ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE; - - /* DMA general settings.*/ - ETH->DMABMR = ETH_DMABMR_AAB | ETH_DMABMR_RDP_1Beat | ETH_DMABMR_PBL_1Beat; - - /* Transmit FIFO flush.*/ - ETH->DMAOMR = ETH_DMAOMR_FTF; - while (ETH->DMAOMR & ETH_DMAOMR_FTF) - ; - - /* DMA final configuration and start.*/ - ETH->DMAOMR = ETH_DMAOMR_DTCEFD | ETH_DMAOMR_RSF | ETH_DMAOMR_TSF | - ETH_DMAOMR_ST | ETH_DMAOMR_SR; -} - -/** - * @brief Deactivates the MAC peripheral. - * - * @param[in] macp pointer to the @p MACDriver object - * - * @notapi - */ -void mac_lld_stop(MACDriver *macp) { - - if (macp->state != MAC_STOP) { -#if STM32_ETH1_CHANGE_PHY_STATE - /* PHY in power down mode until the driver will be restarted.*/ - mii_write(macp, MII_BMCR, mii_read(macp, MII_BMCR) | BMCR_PDOWN); -#endif - - /* MAC and DMA stopped.*/ - ETH->MACCR = 0; - ETH->DMAOMR = 0; - ETH->DMAIER = 0; - ETH->DMASR = ETH->DMASR; - - /* MAC clocks stopped.*/ - rccDisableETH(FALSE); - - /* ISR vector disabled.*/ - nvicDisableVector(ETH_IRQn); - } -} - -/** - * @brief Returns a transmission descriptor. - * @details One of the available transmission descriptors is locked and - * returned. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[out] tdp pointer to a @p MACTransmitDescriptor structure - * @return The operation status. - * @retval RDY_OK the descriptor has been obtained. - * @retval RDY_TIMEOUT descriptor not available. - * - * @notapi - */ -msg_t mac_lld_get_transmit_descriptor(MACDriver *macp, - MACTransmitDescriptor *tdp) { - stm32_eth_tx_descriptor_t *tdes; - - if (!macp->link_up) - return RDY_TIMEOUT; - - chSysLock(); - - /* Get Current TX descriptor.*/ - tdes = macp->txptr; - - /* Ensure that descriptor isn't owned by the Ethernet DMA or locked by - another thread.*/ - if (tdes->tdes0 & (STM32_TDES0_OWN | STM32_TDES0_LOCKED)) { - chSysUnlock(); - return RDY_TIMEOUT; - } - - /* Marks the current descriptor as locked using a reserved bit.*/ - tdes->tdes0 |= STM32_TDES0_LOCKED; - - /* Next TX descriptor to use.*/ - macp->txptr = (stm32_eth_tx_descriptor_t *)tdes->tdes3; - - chSysUnlock(); - - /* Set the buffer size and configuration.*/ - tdp->offset = 0; - tdp->size = STM32_MAC_BUFFERS_SIZE; - tdp->physdesc = tdes; - - return RDY_OK; -} - -/** - * @brief Writes to a transmit descriptor's stream. - * - * @param[in] tdp pointer to a @p MACTransmitDescriptor structure - * @param[in] buf pointer to the buffer containing the data to be - * written - * @param[in] size number of bytes to be written - * @return The number of bytes written into the descriptor's - * stream, this value can be less than the amount - * specified in the parameter @p size if the maximum - * frame size is reached. - * - * @notapi - */ -size_t mac_lld_write_transmit_descriptor(MACTransmitDescriptor *tdp, - uint8_t *buf, - size_t size) { - - chDbgAssert(!(tdp->physdesc->tdes0 & STM32_TDES0_OWN), - "mac_lld_write_transmit_descriptor(), #1", - "attempt to write descriptor already owned by DMA"); - - if (size > tdp->size - tdp->offset) - size = tdp->size - tdp->offset; - - if (size > 0) { - memcpy((uint8_t *)(tdp->physdesc->tdes2) + tdp->offset, buf, size); - tdp->offset += size; - } - return size; -} - -/** - * @brief Releases a transmit descriptor and starts the transmission of the - * enqueued data as a single frame. - * - * @param[in] tdp the pointer to the @p MACTransmitDescriptor structure - * - * @notapi - */ -void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp) { - - chDbgAssert(!(tdp->physdesc->tdes0 & STM32_TDES0_OWN), - "mac_lld_release_transmit_descriptor(), #1", - "attempt to release descriptor already owned by DMA"); - - chSysLock(); - - /* Unlocks the descriptor and returns it to the DMA engine.*/ - tdp->physdesc->tdes1 = tdp->offset; - tdp->physdesc->tdes0 = STM32_TDES0_CIC(STM32_IP_CHECKSUM_OFFLOAD) | - STM32_TDES0_IC | STM32_TDES0_LS | STM32_TDES0_FS | - STM32_TDES0_TCH | STM32_TDES0_OWN; - - /* If the DMA engine is stalled then a restart request is issued.*/ - if ((ETH->DMASR & ETH_DMASR_TPS) == ETH_DMASR_TPS_Suspended) { - ETH->DMASR = ETH_DMASR_TBUS; - ETH->DMATPDR = ETH_DMASR_TBUS; /* Any value is OK.*/ - } - - chSysUnlock(); -} - -/** - * @brief Returns a receive descriptor. - * - * @param[in] macp pointer to the @p MACDriver object - * @param[out] rdp pointer to a @p MACReceiveDescriptor structure - * @return The operation status. - * @retval RDY_OK the descriptor has been obtained. - * @retval RDY_TIMEOUT descriptor not available. - * - * @notapi - */ -msg_t mac_lld_get_receive_descriptor(MACDriver *macp, - MACReceiveDescriptor *rdp) { - stm32_eth_rx_descriptor_t *rdes; - - chSysLock(); - - /* Get Current RX descriptor.*/ - rdes = macp->rxptr; - - /* Iterates through received frames until a valid one is found, invalid - frames are discarded.*/ - while (!(rdes->rdes0 & STM32_RDES0_OWN)) { - if (!(rdes->rdes0 & (STM32_RDES0_AFM | STM32_RDES0_ES)) -#if STM32_IP_CHECKSUM_OFFLOAD - && !(rdes->rdes0 & STM32_RDES0_FT & (STM32_RDES0_IPHCE | - STM32_RDES0_PCE)) -#endif - && (rdes->rdes0 & STM32_RDES0_FS) && (rdes->rdes0 & STM32_RDES0_LS)) { - /* Found a valid one.*/ - rdp->offset = 0; - rdp->size = ((rdes->rdes0 & STM32_RDES0_FL_MASK) >> 16) - 4; - rdp->physdesc = rdes; - macp->rxptr = (stm32_eth_rx_descriptor_t *)rdes->rdes3; - - chSysUnlock(); - return RDY_OK; - } - /* Invalid frame found, purging.*/ - rdes->rdes0 = STM32_RDES0_OWN; - macp->rxptr = (stm32_eth_rx_descriptor_t *)rdes->rdes3; - } - - chSysUnlock(); - return RDY_TIMEOUT; -} - -/** - * @brief Reads from a receive descriptor's stream. - * - * @param[in] rdp pointer to a @p MACReceiveDescriptor structure - * @param[in] buf pointer to the buffer that will receive the read data - * @param[in] size number of bytes to be read - * @return The number of bytes read from the descriptor's - * stream, this value can be less than the amount - * specified in the parameter @p size if there are - * no more bytes to read. - * - * @notapi - */ -size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp, - uint8_t *buf, - size_t size) { - - chDbgAssert(!(rdp->physdesc->rdes0 & STM32_RDES0_OWN), - "mac_lld_read_receive_descriptor(), #1", - "attempt to read descriptor already owned by DMA"); - - if (size > rdp->size - rdp->offset) - size = rdp->size - rdp->offset; - - if (size > 0) { - memcpy(buf, (uint8_t *)(rdp->physdesc->rdes2) + rdp->offset, size); - rdp->offset += size; - } - return size; -} - -/** - * @brief Releases a receive descriptor. - * @details The descriptor and its buffer are made available for more incoming - * frames. - * - * @param[in] rdp the pointer to the @p MACReceiveDescriptor structure - * - * @notapi - */ -void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp) { - - chDbgAssert(!(rdp->physdesc->rdes0 & STM32_RDES0_OWN), - "mac_lld_release_receive_descriptor(), #1", - "attempt to release descriptor already owned by DMA"); - - chSysLock(); - - /* Give buffer back to the Ethernet DMA.*/ - rdp->physdesc->rdes0 = STM32_RDES0_OWN; - - /* If the DMA engine is stalled then a restart request is issued.*/ - if ((ETH->DMASR & ETH_DMASR_RPS) == ETH_DMASR_RPS_Suspended) { - ETH->DMASR = ETH_DMASR_RBUS; - ETH->DMARPDR = ETH_DMASR_RBUS; /* Any value is OK.*/ - } - - chSysUnlock(); -} - -/** - * @brief Updates and returns the link status. - * - * @param[in] macp pointer to the @p MACDriver object - * @return The link status. - * @retval TRUE if the link is active. - * @retval FALSE if the link is down. - * - * @notapi - */ -bool_t mac_lld_poll_link_status(MACDriver *macp) { - uint32_t maccr, bmsr, bmcr; - - maccr = ETH->MACCR; - - /* PHY CR and SR registers read.*/ - (void)mii_read(macp, MII_BMSR); - bmsr = mii_read(macp, MII_BMSR); - bmcr = mii_read(macp, MII_BMCR); - - /* Check on auto-negotiation mode.*/ - if (bmcr & BMCR_ANENABLE) { - uint32_t lpa; - - /* Auto-negotiation must be finished without faults and link established.*/ - if ((bmsr & (BMSR_LSTATUS | BMSR_RFAULT | BMSR_ANEGCOMPLETE)) != - (BMSR_LSTATUS | BMSR_ANEGCOMPLETE)) - return macp->link_up = FALSE; - - /* Auto-negotiation enabled, checks the LPA register.*/ - lpa = mii_read(macp, MII_LPA); - - /* Check on link speed.*/ - if (lpa & (LPA_100HALF | LPA_100FULL | LPA_100BASE4)) - maccr |= ETH_MACCR_FES; - else - maccr &= ~ETH_MACCR_FES; - - /* Check on link mode.*/ - if (lpa & (LPA_10FULL | LPA_100FULL)) - maccr |= ETH_MACCR_DM; - else - maccr &= ~ETH_MACCR_DM; - } - else { - /* Link must be established.*/ - if (!(bmsr & BMSR_LSTATUS)) - return macp->link_up = FALSE; - - /* Check on link speed.*/ - if (bmcr & BMCR_SPEED100) - maccr |= ETH_MACCR_FES; - else - maccr &= ~ETH_MACCR_FES; - - /* Check on link mode.*/ - if (bmcr & BMCR_FULLDPLX) - maccr |= ETH_MACCR_DM; - else - maccr &= ~ETH_MACCR_DM; - } - - /* Changes the mode in the MAC.*/ - ETH->MACCR = maccr; - - /* Returns the link status.*/ - return macp->link_up = TRUE; -} - -#endif /* HAL_USE_MAC */ - -/** @} */ diff --git a/os/hal/platforms/STM32/mac_lld.h b/os/hal/platforms/STM32/mac_lld.h deleted file mode 100644 index 9709bcdb76..0000000000 --- a/os/hal/platforms/STM32/mac_lld.h +++ /dev/null @@ -1,354 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/mac_lld.h - * @brief STM32 low level MAC driver header. - * - * @addtogroup MAC - * @{ - */ - -#ifndef _MAC_LLD_H_ -#define _MAC_LLD_H_ - -#if HAL_USE_MAC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name RDES0 constants - * @{ - */ -#define STM32_RDES0_OWN 0x80000000 -#define STM32_RDES0_AFM 0x40000000 -#define STM32_RDES0_FL_MASK 0x3FFF0000 -#define STM32_RDES0_ES 0x00008000 -#define STM32_RDES0_DESERR 0x00004000 -#define STM32_RDES0_SAF 0x00002000 -#define STM32_RDES0_LE 0x00001000 -#define STM32_RDES0_OE 0x00000800 -#define STM32_RDES0_VLAN 0x00000400 -#define STM32_RDES0_FS 0x00000200 -#define STM32_RDES0_LS 0x00000100 -#define STM32_RDES0_IPHCE 0x00000080 -#define STM32_RDES0_LCO 0x00000040 -#define STM32_RDES0_FT 0x00000020 -#define STM32_RDES0_RWT 0x00000010 -#define STM32_RDES0_RE 0x00000008 -#define STM32_RDES0_DE 0x00000004 -#define STM32_RDES0_CE 0x00000002 -#define STM32_RDES0_PCE 0x00000001 -/** @} */ - -/** - * @name RDES1 constants - * @{ - */ -#define STM32_RDES1_DIC 0x80000000 -#define STM32_RDES1_RBS2_MASK 0x1FFF0000 -#define STM32_RDES1_RER 0x00008000 -#define STM32_RDES1_RCH 0x00004000 -#define STM32_RDES1_RBS1_MASK 0x00001FFF -/** @} */ - -/** - * @name TDES0 constants - * @{ - */ -#define STM32_TDES0_OWN 0x80000000 -#define STM32_TDES0_IC 0x40000000 -#define STM32_TDES0_LS 0x20000000 -#define STM32_TDES0_FS 0x10000000 -#define STM32_TDES0_DC 0x08000000 -#define STM32_TDES0_DP 0x04000000 -#define STM32_TDES0_TTSE 0x02000000 -#define STM32_TDES0_LOCKED 0x01000000 /* NOTE: Pseudo flag. */ -#define STM32_TDES0_CIC_MASK 0x00C00000 -#define STM32_TDES0_CIC(n) ((n) << 22) -#define STM32_TDES0_TER 0x00200000 -#define STM32_TDES0_TCH 0x00100000 -#define STM32_TDES0_TTSS 0x00020000 -#define STM32_TDES0_IHE 0x00010000 -#define STM32_TDES0_ES 0x00008000 -#define STM32_TDES0_JT 0x00004000 -#define STM32_TDES0_FF 0x00002000 -#define STM32_TDES0_IPE 0x00001000 -#define STM32_TDES0_LCA 0x00000800 -#define STM32_TDES0_NC 0x00000400 -#define STM32_TDES0_LCO 0x00000200 -#define STM32_TDES0_EC 0x00000100 -#define STM32_TDES0_VF 0x00000080 -#define STM32_TDES0_CC_MASK 0x00000078 -#define STM32_TDES0_ED 0x00000004 -#define STM32_TDES0_UF 0x00000002 -#define STM32_TDES0_DB 0x00000001 -/** @} */ - -/** - * @name TDES1 constants - * @{ - */ -#define STM32_TDES1_TBS2_MASK 0x1FFF0000 -#define STM32_TDES1_TBS1_MASK 0x00001FFF -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Number of available transmit buffers. - */ -#if !defined(STM32_MAC_TRANSMIT_BUFFERS) || defined(__DOXYGEN__) -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#endif - -/** - * @brief Number of available receive buffers. - */ -#if !defined(STM32_MAC_RECEIVE_BUFFERS) || defined(__DOXYGEN__) -#define STM32_MAC_RECEIVE_BUFFERS 4 -#endif - -/** - * @brief Maximum supported frame size. - */ -#if !defined(STM32_MAC_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define STM32_MAC_BUFFERS_SIZE 1522 -#endif - -/** - * @brief PHY detection timeout. - * @details Timeout, in milliseconds, for PHY address detection, if a PHY - * is not detected within the timeout then the driver halts during - * initialization. This setting applies only if the PHY address is - * not explicitly set in the board header file using - * @p BOARD_PHY_ADDRESS. A zero value disables the timeout and a - * single search path is performed. - */ -#if !defined(STM32_MAC_PHY_TIMEOUT) || defined(__DOXYGEN__) -#define STM32_MAC_PHY_TIMEOUT 100 -#endif - -/** - * @brief Change the PHY power state inside the driver. - */ -#if !defined(STM32_ETH1_CHANGE_PHY_STATE) || defined(__DOXYGEN__) -#define STM32_ETH1_CHANGE_PHY_STATE TRUE -#endif - -/** - * @brief ETHD1 interrupt priority level setting. - */ -#if !defined(STM32_ETH1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ETH1_IRQ_PRIORITY 13 -#endif - -/** - * @brief IP checksum offload. - * @details The following modes are available: - * - 0 Function disabled. - * - 1 Only IP header checksum calculation and insertion are enabled. - * - 2 IP header checksum and payload checksum calculation and - * insertion are enabled, but pseudo-header checksum is not - * calculated in hardware. - * - 3 IP Header checksum and payload checksum calculation and - * insertion are enabled, and pseudo-header checksum is - * calculated in hardware. - * . - */ -#if !defined(STM32_IP_CHECKSUM_OFFLOAD) || defined(__DOXYGEN__) -#define STM32_IP_CHECKSUM_OFFLOAD 0 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (STM32_MAC_PHY_TIMEOUT > 0) && !HAL_IMPLEMENTS_COUNTERS -#error "STM32_MAC_PHY_TIMEOUT requires the realtime counter service" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of an STM32 Ethernet receive descriptor. - */ -typedef struct { - volatile uint32_t rdes0; - volatile uint32_t rdes1; - volatile uint32_t rdes2; - volatile uint32_t rdes3; -} stm32_eth_rx_descriptor_t; - -/** - * @brief Type of an STM32 Ethernet transmit descriptor. - */ -typedef struct { - volatile uint32_t tdes0; - volatile uint32_t tdes1; - volatile uint32_t tdes2; - volatile uint32_t tdes3; -} stm32_eth_tx_descriptor_t; - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief MAC address. - */ - uint8_t *mac_address; - /* End of the mandatory fields.*/ -} MACConfig; - -/** - * @brief Structure representing a MAC driver. - */ -struct MACDriver { - /** - * @brief Driver state. - */ - macstate_t state; - /** - * @brief Current configuration data. - */ - const MACConfig *config; - /** - * @brief Transmit semaphore. - */ - Semaphore tdsem; - /** - * @brief Receive semaphore. - */ - Semaphore rdsem; -#if MAC_USE_EVENTS || defined(__DOXYGEN__) - /** - * @brief Receive event. - */ - EventSource rdevent; -#endif - /* End of the mandatory fields.*/ - /** - * @brief Link status flag. - */ - bool_t link_up; - /** - * @brief PHY address (pre shifted). - */ - uint32_t phyaddr; - /** - * @brief Receive next frame pointer. - */ - stm32_eth_rx_descriptor_t *rxptr; - /** - * @brief Transmit next frame pointer. - */ - stm32_eth_tx_descriptor_t *txptr; -}; - -/** - * @brief Structure representing a transmit descriptor. - */ -typedef struct { - /** - * @brief Current write offset. - */ - size_t offset; - /** - * @brief Available space size. - */ - size_t size; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the physical descriptor. - */ - stm32_eth_tx_descriptor_t *physdesc; -} MACTransmitDescriptor; - -/** - * @brief Structure representing a receive descriptor. - */ -typedef struct { - /** - * @brief Current read offset. - */ - size_t offset; - /** - * @brief Available data size. - */ - size_t size; - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the physical descriptor. - */ - stm32_eth_rx_descriptor_t *physdesc; -} MACReceiveDescriptor; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern MACDriver ETHD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void mac_lld_init(void); - void mac_lld_start(MACDriver *macp); - void mac_lld_stop(MACDriver *macp); - msg_t mac_lld_get_transmit_descriptor(MACDriver *macp, - MACTransmitDescriptor *tdp); - size_t mac_lld_write_transmit_descriptor(MACTransmitDescriptor *tdp, - uint8_t *buf, - size_t size); - void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp); - msg_t mac_lld_get_receive_descriptor(MACDriver *macp, - MACReceiveDescriptor *rdp); - size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp, - uint8_t *buf, - size_t size); - void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp); - bool_t mac_lld_poll_link_status(MACDriver *macp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_MAC */ - -#endif /* _MAC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/pwm_lld.c b/os/hal/platforms/STM32/pwm_lld.c deleted file mode 100644 index dcd0d166f0..0000000000 --- a/os/hal/platforms/STM32/pwm_lld.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/pwm_lld.c - * @brief STM32 PWM subsystem low level driver header. - * - * @addtogroup PWM - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PWM || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief PWMD1 driver identifier. - * @note The driver PWMD1 allocates the complex timer TIM1 when enabled. - */ -#if STM32_PWM_USE_TIM1 || defined(__DOXYGEN__) -PWMDriver PWMD1; -#endif - -/** - * @brief PWMD2 driver identifier. - * @note The driver PWMD2 allocates the timer TIM2 when enabled. - */ -#if STM32_PWM_USE_TIM2 || defined(__DOXYGEN__) -PWMDriver PWMD2; -#endif - -/** - * @brief PWMD3 driver identifier. - * @note The driver PWMD3 allocates the timer TIM3 when enabled. - */ -#if STM32_PWM_USE_TIM3 || defined(__DOXYGEN__) -PWMDriver PWMD3; -#endif - -/** - * @brief PWMD4 driver identifier. - * @note The driver PWMD4 allocates the timer TIM4 when enabled. - */ -#if STM32_PWM_USE_TIM4 || defined(__DOXYGEN__) -PWMDriver PWMD4; -#endif - -/** - * @brief PWMD5 driver identifier. - * @note The driver PWMD5 allocates the timer TIM5 when enabled. - */ -#if STM32_PWM_USE_TIM5 || defined(__DOXYGEN__) -PWMDriver PWMD5; -#endif - -/** - * @brief PWMD8 driver identifier. - * @note The driver PWMD5 allocates the timer TIM5 when enabled. - */ -#if STM32_PWM_USE_TIM8 || defined(__DOXYGEN__) -PWMDriver PWMD8; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if STM32_PWM_USE_TIM2 || STM32_PWM_USE_TIM3 || STM32_PWM_USE_TIM4 || \ - STM32_PWM_USE_TIM5 || defined(__DOXYGEN__) -/** - * @brief Common TIM2...TIM5 IRQ handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @param[in] pwmp pointer to a @p PWMDriver object - */ -static void pwm_lld_serve_interrupt(PWMDriver *pwmp) { - uint16_t sr; - - sr = pwmp->tim->SR & pwmp->tim->DIER; - pwmp->tim->SR = ~sr; - if ((sr & TIM_SR_CC1IF) != 0) - pwmp->config->channels[0].callback(pwmp); - if ((sr & TIM_SR_CC2IF) != 0) - pwmp->config->channels[1].callback(pwmp); - if ((sr & TIM_SR_CC3IF) != 0) - pwmp->config->channels[2].callback(pwmp); - if ((sr & TIM_SR_CC4IF) != 0) - pwmp->config->channels[3].callback(pwmp); - if ((sr & TIM_SR_UIF) != 0) - pwmp->config->callback(pwmp); -} -#endif /* STM32_PWM_USE_TIM2 || ... || STM32_PWM_USE_TIM5 */ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_PWM_USE_TIM1 -#if !defined(STM32_TIM1_UP_HANDLER) -#error "STM32_TIM1_UP_HANDLER not defined" -#endif -/** - * @brief TIM1 update interrupt handler. - * @note It is assumed that this interrupt is only activated if the callback - * pointer is not equal to @p NULL in order to not perform an extra - * check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM1_UP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - STM32_TIM1->SR = ~TIM_SR_UIF; - PWMD1.config->callback(&PWMD1); - - CH_IRQ_EPILOGUE(); -} - -#if !defined(STM32_TIM1_CC_HANDLER) -#error "STM32_TIM1_CC_HANDLER not defined" -#endif -/** - * @brief TIM1 compare interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM1_CC_HANDLER) { - uint16_t sr; - - CH_IRQ_PROLOGUE(); - - sr = STM32_TIM1->SR & STM32_TIM1->DIER; - STM32_TIM1->SR = ~(TIM_SR_CC1IF | TIM_SR_CC2IF | - TIM_SR_CC3IF | TIM_SR_CC4IF); - if ((sr & TIM_SR_CC1IF) != 0) - PWMD1.config->channels[0].callback(&PWMD1); - if ((sr & TIM_SR_CC2IF) != 0) - PWMD1.config->channels[1].callback(&PWMD1); - if ((sr & TIM_SR_CC3IF) != 0) - PWMD1.config->channels[2].callback(&PWMD1); - if ((sr & TIM_SR_CC4IF) != 0) - PWMD1.config->channels[3].callback(&PWMD1); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_PWM_USE_TIM1 */ - -#if STM32_PWM_USE_TIM2 -#if !defined(STM32_TIM2_HANDLER) -#error "STM32_TIM2_HANDLER not defined" -#endif -/** - * @brief TIM2 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - pwm_lld_serve_interrupt(&PWMD2); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_PWM_USE_TIM2 */ - -#if STM32_PWM_USE_TIM3 -#if !defined(STM32_TIM3_HANDLER) -#error "STM32_TIM3_HANDLER not defined" -#endif -/** - * @brief TIM3 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM3_HANDLER) { - - CH_IRQ_PROLOGUE(); - - pwm_lld_serve_interrupt(&PWMD3); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_PWM_USE_TIM3 */ - -#if STM32_PWM_USE_TIM4 -#if !defined(STM32_TIM4_HANDLER) -#error "STM32_TIM4_HANDLER not defined" -#endif -/** - * @brief TIM4 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM4_HANDLER) { - - CH_IRQ_PROLOGUE(); - - pwm_lld_serve_interrupt(&PWMD4); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_PWM_USE_TIM4 */ - -#if STM32_PWM_USE_TIM5 -#if !defined(STM32_TIM5_HANDLER) -#error "STM32_TIM5_HANDLER not defined" -#endif -/** - * @brief TIM5 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM5_HANDLER) { - - CH_IRQ_PROLOGUE(); - - pwm_lld_serve_interrupt(&PWMD5); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_PWM_USE_TIM5 */ - -#if STM32_PWM_USE_TIM8 -#if !defined(STM32_TIM8_UP_HANDLER) -#error "STM32_TIM8_UP_HANDLER not defined" -#endif -/** - * @brief TIM8 update interrupt handler. - * @note It is assumed that this interrupt is only activated if the callback - * pointer is not equal to @p NULL in order to not perform an extra - * check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM8_UP_HANDLER) { - - CH_IRQ_PROLOGUE(); - - STM32_TIM8->SR = ~TIM_SR_UIF; - PWMD8.config->callback(&PWMD8); - - CH_IRQ_EPILOGUE(); -} - -#if !defined(STM32_TIM8_CC_HANDLER) -#error "STM32_TIM8_CC_HANDLER not defined" -#endif -/** - * @brief TIM8 compare interrupt handler. - * @note It is assumed that the various sources are only activated if the - * associated callback pointer is not equal to @p NULL in order to not - * perform an extra check in a potentially critical interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_TIM8_CC_HANDLER) { - uint16_t sr; - - CH_IRQ_PROLOGUE(); - - sr = STM32_TIM8->SR & STM32_TIM8->DIER; - STM32_TIM8->SR = ~(TIM_SR_CC1IF | TIM_SR_CC2IF | - TIM_SR_CC3IF | TIM_SR_CC4IF); - if ((sr & TIM_SR_CC1IF) != 0) - PWMD8.config->channels[0].callback(&PWMD8); - if ((sr & TIM_SR_CC2IF) != 0) - PWMD8.config->channels[1].callback(&PWMD8); - if ((sr & TIM_SR_CC3IF) != 0) - PWMD8.config->channels[2].callback(&PWMD8); - if ((sr & TIM_SR_CC4IF) != 0) - PWMD8.config->channels[3].callback(&PWMD8); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM32_PWM_USE_TIM8 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level PWM driver initialization. - * - * @notapi - */ -void pwm_lld_init(void) { - -#if STM32_PWM_USE_TIM1 - /* Driver initialization.*/ - pwmObjectInit(&PWMD1); - PWMD1.tim = STM32_TIM1; -#endif - -#if STM32_PWM_USE_TIM2 - /* Driver initialization.*/ - pwmObjectInit(&PWMD2); - PWMD2.tim = STM32_TIM2; -#endif - -#if STM32_PWM_USE_TIM3 - /* Driver initialization.*/ - pwmObjectInit(&PWMD3); - PWMD3.tim = STM32_TIM3; -#endif - -#if STM32_PWM_USE_TIM4 - /* Driver initialization.*/ - pwmObjectInit(&PWMD4); - PWMD4.tim = STM32_TIM4; -#endif - -#if STM32_PWM_USE_TIM5 - /* Driver initialization.*/ - pwmObjectInit(&PWMD5); - PWMD5.tim = STM32_TIM5; -#endif - -#if STM32_PWM_USE_TIM8 - /* Driver initialization.*/ - pwmObjectInit(&PWMD8); - PWMD8.tim = STM32_TIM8; -#endif -} - -/** - * @brief Configures and activates the PWM peripheral. - * @note Starting a driver that is already in the @p PWM_READY state - * disables all the active channels. - * - * @param[in] pwmp pointer to a @p PWMDriver object - * - * @notapi - */ -void pwm_lld_start(PWMDriver *pwmp) { - uint32_t psc; - uint16_t ccer; - - if (pwmp->state == PWM_STOP) { - /* Clock activation and timer reset.*/ -#if STM32_PWM_USE_TIM1 - if (&PWMD1 == pwmp) { - rccEnableTIM1(FALSE); - rccResetTIM1(); - nvicEnableVector(STM32_TIM1_UP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM1_IRQ_PRIORITY)); - nvicEnableVector(STM32_TIM1_CC_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM1_IRQ_PRIORITY)); - pwmp->clock = STM32_TIMCLK2; - } -#endif -#if STM32_PWM_USE_TIM2 - if (&PWMD2 == pwmp) { - rccEnableTIM2(FALSE); - rccResetTIM2(); - nvicEnableVector(STM32_TIM2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM2_IRQ_PRIORITY)); - pwmp->clock = STM32_TIMCLK1; - } -#endif -#if STM32_PWM_USE_TIM3 - if (&PWMD3 == pwmp) { - rccEnableTIM3(FALSE); - rccResetTIM3(); - nvicEnableVector(STM32_TIM3_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM3_IRQ_PRIORITY)); - pwmp->clock = STM32_TIMCLK1; - } -#endif -#if STM32_PWM_USE_TIM4 - if (&PWMD4 == pwmp) { - rccEnableTIM4(FALSE); - rccResetTIM4(); - nvicEnableVector(STM32_TIM4_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM4_IRQ_PRIORITY)); - pwmp->clock = STM32_TIMCLK1; - } -#endif - -#if STM32_PWM_USE_TIM5 - if (&PWMD5 == pwmp) { - rccEnableTIM5(FALSE); - rccResetTIM5(); - nvicEnableVector(STM32_TIM5_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM5_IRQ_PRIORITY)); - pwmp->clock = STM32_TIMCLK1; - } -#endif -#if STM32_PWM_USE_TIM8 - if (&PWMD8 == pwmp) { - rccEnableTIM8(FALSE); - rccResetTIM8(); - nvicEnableVector(STM32_TIM8_UP_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM8_IRQ_PRIORITY)); - nvicEnableVector(STM32_TIM8_CC_NUMBER, - CORTEX_PRIORITY_MASK(STM32_PWM_TIM8_IRQ_PRIORITY)); - pwmp->clock = STM32_TIMCLK2; - } -#endif - - /* All channels configured in PWM1 mode with preload enabled and will - stay that way until the driver is stopped.*/ - pwmp->tim->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | - TIM_CCMR1_OC1PE | - TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | - TIM_CCMR1_OC2PE; - pwmp->tim->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | - TIM_CCMR2_OC3PE | - TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | - TIM_CCMR2_OC4PE; - } - else { - /* Driver re-configuration scenario, it must be stopped first.*/ - pwmp->tim->CR1 = 0; /* Timer disabled. */ - pwmp->tim->DIER = 0; /* All IRQs disabled. */ - pwmp->tim->SR = 0; /* Clear eventual pending IRQs. */ - pwmp->tim->CCR[0] = 0; /* Comparator 1 disabled. */ - pwmp->tim->CCR[1] = 0; /* Comparator 2 disabled. */ - pwmp->tim->CCR[2] = 0; /* Comparator 3 disabled. */ - pwmp->tim->CCR[3] = 0; /* Comparator 4 disabled. */ - pwmp->tim->CNT = 0; /* Counter reset to zero. */ - } - - /* Timer configuration.*/ - psc = (pwmp->clock / pwmp->config->frequency) - 1; - chDbgAssert((psc <= 0xFFFF) && - ((psc + 1) * pwmp->config->frequency) == pwmp->clock, - "pwm_lld_start(), #1", "invalid frequency"); - pwmp->tim->PSC = (uint16_t)psc; - pwmp->tim->ARR = (uint16_t)(pwmp->period - 1); - pwmp->tim->CR2 = pwmp->config->cr2; - - /* Output enables and polarities setup.*/ - ccer = 0; - switch (pwmp->config->channels[0].mode & PWM_OUTPUT_MASK) { - case PWM_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC1P; - case PWM_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC1E; - default: - ; - } - switch (pwmp->config->channels[1].mode & PWM_OUTPUT_MASK) { - case PWM_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC2P; - case PWM_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC2E; - default: - ; - } - switch (pwmp->config->channels[2].mode & PWM_OUTPUT_MASK) { - case PWM_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC3P; - case PWM_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC3E; - default: - ; - } - switch (pwmp->config->channels[3].mode & PWM_OUTPUT_MASK) { - case PWM_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC4P; - case PWM_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC4E; - default: - ; - } -#if STM32_PWM_USE_ADVANCED -#if STM32_PWM_USE_TIM1 && !STM32_PWM_USE_TIM8 - if (&PWMD1 == pwmp) { -#endif -#if !STM32_PWM_USE_TIM1 && STM32_PWM_USE_TIM8 - if (&PWMD8 == pwmp) { -#endif -#if STM32_PWM_USE_TIM1 && STM32_PWM_USE_TIM8 - if ((&PWMD1 == pwmp) || (&PWMD8 == pwmp)) { -#endif - switch (pwmp->config->channels[0].mode & PWM_COMPLEMENTARY_OUTPUT_MASK) { - case PWM_COMPLEMENTARY_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC1NP; - case PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC1NE; - default: - ; - } - switch (pwmp->config->channels[1].mode & PWM_COMPLEMENTARY_OUTPUT_MASK) { - case PWM_COMPLEMENTARY_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC2NP; - case PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC2NE; - default: - ; - } - switch (pwmp->config->channels[2].mode & PWM_COMPLEMENTARY_OUTPUT_MASK) { - case PWM_COMPLEMENTARY_OUTPUT_ACTIVE_LOW: - ccer |= TIM_CCER_CC3NP; - case PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH: - ccer |= TIM_CCER_CC3NE; - default: - ; - } - } -#endif /* STM32_PWM_USE_ADVANCED*/ - - pwmp->tim->CCER = ccer; - pwmp->tim->EGR = TIM_EGR_UG; /* Update event. */ - pwmp->tim->DIER = pwmp->config->callback == NULL ? 0 : TIM_DIER_UIE; - pwmp->tim->SR = 0; /* Clear pending IRQs. */ -#if STM32_PWM_USE_TIM1 || STM32_PWM_USE_TIM8 -#if STM32_PWM_USE_ADVANCED - pwmp->tim->BDTR = pwmp->config->bdtr | TIM_BDTR_MOE; -#else - pwmp->tim->BDTR = TIM_BDTR_MOE; -#endif -#endif - /* Timer configured and started.*/ - pwmp->tim->CR1 = TIM_CR1_ARPE | TIM_CR1_URS | TIM_CR1_CEN; -} - -/** - * @brief Deactivates the PWM peripheral. - * - * @param[in] pwmp pointer to a @p PWMDriver object - * - * @notapi - */ -void pwm_lld_stop(PWMDriver *pwmp) { - - /* If in ready state then disables the PWM clock.*/ - if (pwmp->state == PWM_READY) { - pwmp->tim->CR1 = 0; /* Timer disabled. */ - pwmp->tim->DIER = 0; /* All IRQs disabled. */ - pwmp->tim->SR = 0; /* Clear eventual pending IRQs. */ -#if STM32_PWM_USE_TIM1 || STM32_PWM_USE_TIM8 - pwmp->tim->BDTR = 0; -#endif - -#if STM32_PWM_USE_TIM1 - if (&PWMD1 == pwmp) { - nvicDisableVector(STM32_TIM1_UP_NUMBER); - nvicDisableVector(STM32_TIM1_CC_NUMBER); - rccDisableTIM1(FALSE); - } -#endif -#if STM32_PWM_USE_TIM2 - if (&PWMD2 == pwmp) { - nvicDisableVector(STM32_TIM2_NUMBER); - rccDisableTIM2(FALSE); - } -#endif -#if STM32_PWM_USE_TIM3 - if (&PWMD3 == pwmp) { - nvicDisableVector(STM32_TIM3_NUMBER); - rccDisableTIM3(FALSE); - } -#endif -#if STM32_PWM_USE_TIM4 - if (&PWMD4 == pwmp) { - nvicDisableVector(STM32_TIM4_NUMBER); - rccDisableTIM4(FALSE); - } -#endif -#if STM32_PWM_USE_TIM5 - if (&PWMD5 == pwmp) { - nvicDisableVector(STM32_TIM5_NUMBER); - rccDisableTIM5(FALSE); - } -#endif -#if STM32_PWM_USE_TIM8 - if (&PWMD8 == pwmp) { - nvicDisableVector(STM32_TIM8_UP_NUMBER); - nvicDisableVector(STM32_TIM8_CC_NUMBER); - rccDisableTIM8(FALSE); - } -#endif - } -} - -/** - * @brief Enables a PWM channel. - * @pre The PWM unit must have been activated using @p pwmStart(). - * @post The channel is active using the specified configuration. - * @note The function has effect at the next cycle start. - * - * @param[in] pwmp pointer to a @p PWMDriver object - * @param[in] channel PWM channel identifier (0...PWM_CHANNELS-1) - * @param[in] width PWM pulse width as clock pulses number - * - * @notapi - */ -void pwm_lld_enable_channel(PWMDriver *pwmp, - pwmchannel_t channel, - pwmcnt_t width) { - - pwmp->tim->CCR[channel] = width; /* New duty cycle. */ - /* If there is a callback defined for the channel then the associated - interrupt must be enabled.*/ - if (pwmp->config->channels[channel].callback != NULL) { - uint32_t dier = pwmp->tim->DIER; - /* If the IRQ is not already enabled care must be taken to clear it, - it is probably already pending because the timer is running.*/ - if ((dier & (2 << channel)) == 0) { - pwmp->tim->DIER = dier | (2 << channel); - pwmp->tim->SR = ~(2 << channel); - } - } -} - -/** - * @brief Disables a PWM channel. - * @pre The PWM unit must have been activated using @p pwmStart(). - * @post The channel is disabled and its output line returned to the - * idle state. - * @note The function has effect at the next cycle start. - * - * @param[in] pwmp pointer to a @p PWMDriver object - * @param[in] channel PWM channel identifier (0...PWM_CHANNELS-1) - * - * @notapi - */ -void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel) { - - pwmp->tim->CCR[channel] = 0; - pwmp->tim->DIER &= ~(2 << channel); -} - -#endif /* HAL_USE_PWM */ - -/** @} */ diff --git a/os/hal/platforms/STM32/pwm_lld.h b/os/hal/platforms/STM32/pwm_lld.h deleted file mode 100644 index 1d7f62d413..0000000000 --- a/os/hal/platforms/STM32/pwm_lld.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/pwm_lld.h - * @brief STM32 PWM subsystem low level driver header. - * - * @addtogroup PWM - * @{ - */ - -#ifndef _PWM_LLD_H_ -#define _PWM_LLD_H_ - -#if HAL_USE_PWM || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Number of PWM channels per PWM driver. - */ -#define PWM_CHANNELS 4 - -/** - * @brief Complementary output modes mask. - * @note This is an STM32-specific setting. - */ -#define PWM_COMPLEMENTARY_OUTPUT_MASK 0xF0 - -/** - * @brief Complementary output not driven. - * @note This is an STM32-specific setting. - */ -#define PWM_COMPLEMENTARY_OUTPUT_DISABLED 0x00 - -/** - * @brief Complementary output, active is logic level one. - * @note This is an STM32-specific setting. - * @note This setting is only available if the configuration option - * @p STM32_PWM_USE_ADVANCED is set to TRUE and only for advanced - * timers TIM1 and TIM8. - */ -#define PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH 0x10 - -/** - * @brief Complementary output, active is logic level zero. - * @note This is an STM32-specific setting. - * @note This setting is only available if the configuration option - * @p STM32_PWM_USE_ADVANCED is set to TRUE and only for advanced - * timers TIM1 and TIM8. - */ -#define PWM_COMPLEMENTARY_OUTPUT_ACTIVE_LOW 0x20 - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief If advanced timer features switch. - * @details If set to @p TRUE the advanced features for TIM1 and TIM8 are - * enabled. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_ADVANCED) || defined(__DOXYGEN__) -#define STM32_PWM_USE_ADVANCED FALSE -#endif - -/** - * @brief PWMD1 driver enable switch. - * @details If set to @p TRUE the support for PWMD1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_TIM1) || defined(__DOXYGEN__) -#define STM32_PWM_USE_TIM1 FALSE -#endif - -/** - * @brief PWMD2 driver enable switch. - * @details If set to @p TRUE the support for PWMD2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_TIM2) || defined(__DOXYGEN__) -#define STM32_PWM_USE_TIM2 FALSE -#endif - -/** - * @brief PWMD3 driver enable switch. - * @details If set to @p TRUE the support for PWMD3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_TIM3) || defined(__DOXYGEN__) -#define STM32_PWM_USE_TIM3 FALSE -#endif - -/** - * @brief PWMD4 driver enable switch. - * @details If set to @p TRUE the support for PWMD4 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_TIM4) || defined(__DOXYGEN__) -#define STM32_PWM_USE_TIM4 FALSE -#endif - -/** - * @brief PWMD5 driver enable switch. - * @details If set to @p TRUE the support for PWMD5 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_TIM5) || defined(__DOXYGEN__) -#define STM32_PWM_USE_TIM5 FALSE -#endif - -/** - * @brief PWMD8 driver enable switch. - * @details If set to @p TRUE the support for PWMD8 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_PWM_USE_TIM8) || defined(__DOXYGEN__) -#define STM32_PWM_USE_TIM8 FALSE -#endif - -/** - * @brief PWMD1 interrupt priority level setting. - */ -#if !defined(STM32_PWM_TIM1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#endif - -/** - * @brief PWMD2 interrupt priority level setting. - */ -#if !defined(STM32_PWM_TIM2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#endif - -/** - * @brief PWMD3 interrupt priority level setting. - */ -#if !defined(STM32_PWM_TIM3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#endif - -/** - * @brief PWMD4 interrupt priority level setting. - */ -#if !defined(STM32_PWM_TIM4_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#endif - -/** - * @brief PWMD5 interrupt priority level setting. - */ -#if !defined(STM32_PWM_TIM5_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#endif - -/** - * @brief PWMD8 interrupt priority level setting. - */ -#if !defined(STM32_PWM_TIM8_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#endif -/** @} */ - -/*===========================================================================*/ -/* Configuration checks. */ -/*===========================================================================*/ - -#if STM32_PWM_USE_TIM1 && !STM32_HAS_TIM1 -#error "TIM1 not present in the selected device" -#endif - -#if STM32_PWM_USE_TIM2 && !STM32_HAS_TIM2 -#error "TIM2 not present in the selected device" -#endif - -#if STM32_PWM_USE_TIM3 && !STM32_HAS_TIM3 -#error "TIM3 not present in the selected device" -#endif - -#if STM32_PWM_USE_TIM4 && !STM32_HAS_TIM4 -#error "TIM4 not present in the selected device" -#endif - -#if STM32_PWM_USE_TIM5 && !STM32_HAS_TIM5 -#error "TIM5 not present in the selected device" -#endif - -#if STM32_PWM_USE_TIM8 && !STM32_HAS_TIM8 -#error "TIM8 not present in the selected device" -#endif - -#if !STM32_PWM_USE_TIM1 && !STM32_PWM_USE_TIM2 && \ - !STM32_PWM_USE_TIM3 && !STM32_PWM_USE_TIM4 && \ - !STM32_PWM_USE_TIM5 && !STM32_PWM_USE_TIM8 -#error "PWM driver activated but no TIM peripheral assigned" -#endif - -#if STM32_PWM_USE_ADVANCED && !STM32_PWM_USE_TIM1 && !STM32_PWM_USE_TIM8 -#error "advanced mode selected but no advanced timer assigned" -#endif - -#if STM32_PWM_USE_TIM1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_PWM_TIM1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM1" -#endif - -#if STM32_PWM_USE_TIM2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_PWM_TIM2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM2" -#endif - -#if STM32_PWM_USE_TIM3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_PWM_TIM3_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM3" -#endif - -#if STM32_PWM_USE_TIM4 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_PWM_TIM4_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM4" -#endif - -#if STM32_PWM_USE_TIM5 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_PWM_TIM5_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM5" -#endif - -#if STM32_PWM_USE_TIM8 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_PWM_TIM8_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to TIM8" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief PWM mode type. - */ -typedef uint32_t pwmmode_t; - -/** - * @brief PWM channel type. - */ -typedef uint8_t pwmchannel_t; - -/** - * @brief PWM counter type. - */ -typedef uint16_t pwmcnt_t; - -/** - * @brief PWM driver channel configuration structure. - */ -typedef struct { - /** - * @brief Channel active logic level. - */ - pwmmode_t mode; - /** - * @brief Channel callback pointer. - * @note This callback is invoked on the channel compare event. If set to - * @p NULL then the callback is disabled. - */ - pwmcallback_t callback; - /* End of the mandatory fields.*/ -} PWMChannelConfig; - -/** - * @brief PWM driver configuration structure. - */ -typedef struct { - /** - * @brief Timer clock in Hz. - * @note The low level can use assertions in order to catch invalid - * frequency specifications. - */ - uint32_t frequency; - /** - * @brief PWM period in ticks. - * @note The low level can use assertions in order to catch invalid - * period specifications. - */ - pwmcnt_t period; - /** - * @brief Periodic callback pointer. - * @note This callback is invoked on PWM counter reset. If set to - * @p NULL then the callback is disabled. - */ - pwmcallback_t callback; - /** - * @brief Channels configurations. - */ - PWMChannelConfig channels[PWM_CHANNELS]; - /* End of the mandatory fields.*/ - /** - * @brief TIM CR2 register initialization data. - * @note The value of this field should normally be equal to zero. - */ - uint16_t cr2; -#if STM32_PWM_USE_ADVANCED || defined(__DOXYGEN__) - /** - * @brief TIM BDTR (break & dead-time) register initialization data. - * @note The value of this field should normally be equal to zero. - */ \ - uint16_t bdtr; -#endif -} PWMConfig; - -/** - * @brief Structure representing a PWM driver. - */ -struct PWMDriver { - /** - * @brief Driver state. - */ - pwmstate_t state; - /** - * @brief Current driver configuration data. - */ - const PWMConfig *config; - /** - * @brief Current PWM period in ticks. - */ - pwmcnt_t period; -#if defined(PWM_DRIVER_EXT_FIELDS) - PWM_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Timer base clock. - */ - uint32_t clock; - /** - * @brief Pointer to the TIMx registers block. - */ - stm32_tim_t *tim; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Changes the period the PWM peripheral. - * @details This function changes the period of a PWM unit that has already - * been activated using @p pwmStart(). - * @pre The PWM unit must have been activated using @p pwmStart(). - * @post The PWM unit period is changed to the new value. - * @note The function has effect at the next cycle start. - * @note If a period is specified that is shorter than the pulse width - * programmed in one of the channels then the behavior is not - * guaranteed. - * - * @param[in] pwmp pointer to a @p PWMDriver object - * @param[in] period new cycle time in ticks - * - * @notapi - */ -#define pwm_lld_change_period(pwmp, period) \ - ((pwmp)->tim->ARR = (uint16_t)((period) - 1)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_PWM_USE_TIM1 && !defined(__DOXYGEN__) -extern PWMDriver PWMD1; -#endif - -#if STM32_PWM_USE_TIM2 && !defined(__DOXYGEN__) -extern PWMDriver PWMD2; -#endif - -#if STM32_PWM_USE_TIM3 && !defined(__DOXYGEN__) -extern PWMDriver PWMD3; -#endif - -#if STM32_PWM_USE_TIM4 && !defined(__DOXYGEN__) -extern PWMDriver PWMD4; -#endif - -#if STM32_PWM_USE_TIM5 && !defined(__DOXYGEN__) -extern PWMDriver PWMD5; -#endif - -#if STM32_PWM_USE_TIM8 && !defined(__DOXYGEN__) -extern PWMDriver PWMD8; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void pwm_lld_init(void); - void pwm_lld_start(PWMDriver *pwmp); - void pwm_lld_stop(PWMDriver *pwmp); - void pwm_lld_enable_channel(PWMDriver *pwmp, - pwmchannel_t channel, - pwmcnt_t width); - void pwm_lld_disable_channel(PWMDriver *pwmp, pwmchannel_t channel); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PWM */ - -#endif /* _PWM_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/sdc_lld.c b/os/hal/platforms/STM32/sdc_lld.c deleted file mode 100644 index 77b20d2424..0000000000 --- a/os/hal/platforms/STM32/sdc_lld.c +++ /dev/null @@ -1,803 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/sdc_lld.c - * @brief STM32 SDC subsystem low level driver source. - * - * @addtogroup SDC - * @{ - */ - -/* - TODO: Try preerase blocks before writing (ACMD23). - */ - -#include - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SDC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SDC_SDIO_DMA_STREAM, \ - STM32_SDC_SDIO_DMA_CHN) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief SDCD1 driver identifier.*/ -SDCDriver SDCD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -#if STM32_SDC_SDIO_UNALIGNED_SUPPORT -/** - * @brief Buffer for temporary storage during unaligned transfers. - */ -static union { - uint32_t alignment; - uint8_t buf[MMCSD_BLOCK_SIZE]; -} u; -#endif /* STM32_SDC_SDIO_UNALIGNED_SUPPORT */ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Prepares card to handle read transaction. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] startblk first block to read - * @param[in] n number of blocks to read - * @param[in] resp pointer to the response buffer - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -static bool_t sdc_lld_prepare_read(SDCDriver *sdcp, uint32_t startblk, - uint32_t n, uint32_t *resp) { - - /* Driver handles data in 512 bytes blocks (just like HC cards). But if we - have not HC card than we must convert address from blocks to bytes.*/ - if (!(sdcp->cardmode & SDC_MODE_HIGH_CAPACITY)) - startblk *= MMCSD_BLOCK_SIZE; - - if (n > 1) { - /* Send read multiple blocks command to card.*/ - if (sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_READ_MULTIPLE_BLOCK, - startblk, resp) || MMCSD_R1_ERROR(resp[0])) - return CH_FAILED; - } - else{ - /* Send read single block command.*/ - if (sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_READ_SINGLE_BLOCK, - startblk, resp) || MMCSD_R1_ERROR(resp[0])) - return CH_FAILED; - } - - return CH_SUCCESS; -} - -/** - * @brief Prepares card to handle write transaction. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] startblk first block to read - * @param[in] n number of blocks to write - * @param[in] resp pointer to the response buffer - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -static bool_t sdc_lld_prepare_write(SDCDriver *sdcp, uint32_t startblk, - uint32_t n, uint32_t *resp) { - - /* Driver handles data in 512 bytes blocks (just like HC cards). But if we - have not HC card than we must convert address from blocks to bytes.*/ - if (!(sdcp->cardmode & SDC_MODE_HIGH_CAPACITY)) - startblk *= MMCSD_BLOCK_SIZE; - - if (n > 1) { - /* Write multiple blocks command.*/ - if (sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_WRITE_MULTIPLE_BLOCK, - startblk, resp) || MMCSD_R1_ERROR(resp[0])) - return CH_FAILED; - } - else{ - /* Write single block command.*/ - if (sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_WRITE_BLOCK, - startblk, resp) || MMCSD_R1_ERROR(resp[0])) - return CH_FAILED; - } - - return CH_SUCCESS; -} - -/** - * @brief Wait end of data transaction and performs finalizations. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] n number of blocks in transaction - * @param[in] resp pointer to the response buffer - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - */ -static bool_t sdc_lld_wait_transaction_end(SDCDriver *sdcp, uint32_t n, - uint32_t *resp) { - - /* Note the mask is checked before going to sleep because the interrupt - may have occurred before reaching the critical zone.*/ - chSysLock(); - if (SDIO->MASK != 0) { - chDbgAssert(sdcp->thread == NULL, - "sdc_lld_start_data_transaction(), #1", "not NULL"); - sdcp->thread = chThdSelf(); - chSchGoSleepS(THD_STATE_SUSPENDED); - chDbgAssert(sdcp->thread == NULL, - "sdc_lld_start_data_transaction(), #2", "not NULL"); - } - if ((SDIO->STA & SDIO_STA_DATAEND) == 0) { - chSysUnlock(); - return CH_FAILED; - } - -#if (defined(STM32F4XX) || defined(STM32F2XX)) - /* Wait until DMA channel enabled to be sure that all data transferred.*/ - while (sdcp->dma->stream->CR & STM32_DMA_CR_EN) - ; - - /* DMA event flags must be manually cleared.*/ - dmaStreamClearInterrupt(sdcp->dma); - - SDIO->ICR = STM32_SDIO_ICR_ALL_FLAGS; - SDIO->DCTRL = 0; - chSysUnlock(); - - /* Wait until interrupt flags to be cleared.*/ - /*while (((DMA2->LISR) >> (sdcp->dma->ishift)) & STM32_DMA_ISR_TCIF) - dmaStreamClearInterrupt(sdcp->dma);*/ -#else - /* Waits for transfer completion at DMA level, the the stream is - disabled and cleared.*/ - dmaWaitCompletion(sdcp->dma); - - SDIO->ICR = STM32_SDIO_ICR_ALL_FLAGS; - SDIO->DCTRL = 0; - chSysUnlock(); -#endif - - /* Finalize transaction.*/ - if (n > 1) - return sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_STOP_TRANSMISSION, 0, resp); - - return CH_SUCCESS; -} - -/** - * @brief Gets SDC errors. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @notapi - */ -static void sdc_lld_collect_errors(SDCDriver *sdcp) { - uint32_t errors = SDC_NO_ERROR; - - if (SDIO->STA & SDIO_STA_CCRCFAIL) { - SDIO->ICR |= SDIO_ICR_CCRCFAILC; - errors |= SDC_CMD_CRC_ERROR; - } - if (SDIO->STA & SDIO_STA_DCRCFAIL) { - SDIO->ICR |= SDIO_ICR_DCRCFAILC; - errors |= SDC_DATA_CRC_ERROR; - } - if (SDIO->STA & SDIO_STA_CTIMEOUT) { - SDIO->ICR |= SDIO_ICR_CTIMEOUTC; - errors |= SDC_COMMAND_TIMEOUT; - } - if (SDIO->STA & SDIO_STA_DTIMEOUT) { - SDIO->ICR |= SDIO_ICR_CTIMEOUTC; - errors |= SDC_DATA_TIMEOUT; - } - if (SDIO->STA & SDIO_STA_TXUNDERR) { - SDIO->ICR |= SDIO_ICR_TXUNDERRC; - errors |= SDC_TX_UNDERRUN; - } - if (SDIO->STA & SDIO_STA_RXOVERR) { - SDIO->ICR |= SDIO_ICR_RXOVERRC; - errors |= SDC_RX_OVERRUN; - } - if (SDIO->STA & SDIO_STA_STBITERR) { - SDIO->ICR |= SDIO_ICR_STBITERRC; - errors |= SDC_STARTBIT_ERROR; - } - - sdcp->errors |= errors; -} - -/** - * @brief Performs clean transaction stopping in case of errors. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] n number of blocks in transaction - * @param[in] resp pointer to the response buffer - * - * @notapi - */ -static void sdc_lld_error_cleanup(SDCDriver *sdcp, - uint32_t n, - uint32_t *resp) { - - dmaStreamClearInterrupt(sdcp->dma); - dmaStreamDisable(sdcp->dma); - SDIO->ICR = STM32_SDIO_ICR_ALL_FLAGS; - SDIO->MASK = 0; - SDIO->DCTRL = 0; - sdc_lld_collect_errors(sdcp); - if (n > 1) - sdc_lld_send_cmd_short_crc(sdcp, MMCSD_CMD_STOP_TRANSMISSION, 0, resp); -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if !defined(STM32_SDIO_HANDLER) -#error "STM32_SDIO_HANDLER not defined" -#endif -/** - * @brief SDIO IRQ handler. - * @details It just wakes transaction thread. All error handling performs in - * that thread. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_SDIO_HANDLER) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr() - - /* Disables the source but the status flags are not reset because the - read/write functions needs to check them.*/ - SDIO->MASK = 0; - - if (SDCD1.thread != NULL) { - chSchReadyI(SDCD1.thread); - SDCD1.thread = NULL; } - - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SDC driver initialization. - * - * @notapi - */ -void sdc_lld_init(void) { - - sdcObjectInit(&SDCD1); - SDCD1.thread = NULL; - SDCD1.dma = STM32_DMA_STREAM(STM32_SDC_SDIO_DMA_STREAM); -#if CH_DBG_ENABLE_ASSERTS - SDCD1.sdio = SDIO; -#endif -} - -/** - * @brief Configures and activates the SDC peripheral. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @notapi - */ -void sdc_lld_start(SDCDriver *sdcp) { - - sdcp->dmamode = STM32_DMA_CR_CHSEL(DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SDC_SDIO_DMA_PRIORITY) | - STM32_DMA_CR_PSIZE_WORD | - STM32_DMA_CR_MSIZE_WORD | - STM32_DMA_CR_MINC; - -#if (defined(STM32F4XX) || defined(STM32F2XX)) - sdcp->dmamode |= STM32_DMA_CR_PFCTRL | - STM32_DMA_CR_PBURST_INCR4 | - STM32_DMA_CR_MBURST_INCR4; -#endif - - if (sdcp->state == BLK_STOP) { - /* Note, the DMA must be enabled before the IRQs.*/ - bool_t b; - b = dmaStreamAllocate(sdcp->dma, STM32_SDC_SDIO_IRQ_PRIORITY, NULL, NULL); - chDbgAssert(!b, "i2c_lld_start(), #3", "stream already allocated"); - dmaStreamSetPeripheral(sdcp->dma, &SDIO->FIFO); -#if (defined(STM32F4XX) || defined(STM32F2XX)) - dmaStreamSetFIFO(sdcp->dma, STM32_DMA_FCR_DMDIS | STM32_DMA_FCR_FTH_FULL); -#endif - nvicEnableVector(STM32_SDIO_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SDC_SDIO_IRQ_PRIORITY)); - rccEnableSDIO(FALSE); - } - - /* Configuration, card clock is initially stopped.*/ - SDIO->POWER = 0; - SDIO->CLKCR = 0; - SDIO->DCTRL = 0; - SDIO->DTIMER = 0; -} - -/** - * @brief Deactivates the SDC peripheral. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @notapi - */ -void sdc_lld_stop(SDCDriver *sdcp) { - - if (sdcp->state != BLK_STOP) { - - /* SDIO deactivation.*/ - SDIO->POWER = 0; - SDIO->CLKCR = 0; - SDIO->DCTRL = 0; - SDIO->DTIMER = 0; - - /* Clock deactivation.*/ - nvicDisableVector(STM32_SDIO_NUMBER); - dmaStreamRelease(sdcp->dma); - rccDisableSDIO(FALSE); - } -} - -/** - * @brief Starts the SDIO clock and sets it to init mode (400kHz or less). - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @notapi - */ -void sdc_lld_start_clk(SDCDriver *sdcp) { - - (void)sdcp; - - /* Initial clock setting: 400kHz, 1bit mode.*/ - SDIO->CLKCR = STM32_SDIO_DIV_LS; - SDIO->POWER |= SDIO_POWER_PWRCTRL_0 | SDIO_POWER_PWRCTRL_1; - SDIO->CLKCR |= SDIO_CLKCR_CLKEN; -} - -/** - * @brief Sets the SDIO clock to data mode (25MHz or less). - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @notapi - */ -void sdc_lld_set_data_clk(SDCDriver *sdcp) { - - (void)sdcp; - - SDIO->CLKCR = (SDIO->CLKCR & 0xFFFFFF00) | STM32_SDIO_DIV_HS; -} - -/** - * @brief Stops the SDIO clock. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @notapi - */ -void sdc_lld_stop_clk(SDCDriver *sdcp) { - - (void)sdcp; - - SDIO->CLKCR = 0; - SDIO->POWER = 0; -} - -/** - * @brief Switches the bus to 4 bits mode. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] mode bus mode - * - * @notapi - */ -void sdc_lld_set_bus_mode(SDCDriver *sdcp, sdcbusmode_t mode) { - uint32_t clk = SDIO->CLKCR & ~SDIO_CLKCR_WIDBUS; - - (void)sdcp; - - switch (mode) { - case SDC_MODE_1BIT: - SDIO->CLKCR = clk; - break; - case SDC_MODE_4BIT: - SDIO->CLKCR = clk | SDIO_CLKCR_WIDBUS_0; - break; - case SDC_MODE_8BIT: - SDIO->CLKCR = clk | SDIO_CLKCR_WIDBUS_1; - break; - } -} - -/** - * @brief Sends an SDIO command with no response expected. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] cmd card command - * @param[in] arg command argument - * - * @notapi - */ -void sdc_lld_send_cmd_none(SDCDriver *sdcp, uint8_t cmd, uint32_t arg) { - - (void)sdcp; - - SDIO->ARG = arg; - SDIO->CMD = (uint32_t)cmd | SDIO_CMD_CPSMEN; - while ((SDIO->STA & SDIO_STA_CMDSENT) == 0) - ; - SDIO->ICR = SDIO_ICR_CMDSENTC; -} - -/** - * @brief Sends an SDIO command with a short response expected. - * @note The CRC is not verified. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] cmd card command - * @param[in] arg command argument - * @param[out] resp pointer to the response buffer (one word) - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_send_cmd_short(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, - uint32_t *resp) { - uint32_t sta; - - (void)sdcp; - - SDIO->ARG = arg; - SDIO->CMD = (uint32_t)cmd | SDIO_CMD_WAITRESP_0 | SDIO_CMD_CPSMEN; - while (((sta = SDIO->STA) & (SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT | - SDIO_STA_CCRCFAIL)) == 0) - ; - SDIO->ICR = SDIO_ICR_CMDRENDC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CCRCFAILC; - if ((sta & (SDIO_STA_CTIMEOUT)) != 0) { - sdc_lld_collect_errors(sdcp); - return CH_FAILED; - } - *resp = SDIO->RESP1; - return CH_SUCCESS; -} - -/** - * @brief Sends an SDIO command with a short response expected and CRC. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] cmd card command - * @param[in] arg command argument - * @param[out] resp pointer to the response buffer (one word) - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_send_cmd_short_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, - uint32_t *resp) { - uint32_t sta; - - (void)sdcp; - - SDIO->ARG = arg; - SDIO->CMD = (uint32_t)cmd | SDIO_CMD_WAITRESP_0 | SDIO_CMD_CPSMEN; - while (((sta = SDIO->STA) & (SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT | - SDIO_STA_CCRCFAIL)) == 0) - ; - SDIO->ICR = SDIO_ICR_CMDRENDC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CCRCFAILC; - if ((sta & (SDIO_STA_CTIMEOUT | SDIO_STA_CCRCFAIL)) != 0) { - sdc_lld_collect_errors(sdcp); - return CH_FAILED; - } - *resp = SDIO->RESP1; - return CH_SUCCESS; -} - -/** - * @brief Sends an SDIO command with a long response expected and CRC. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] cmd card command - * @param[in] arg command argument - * @param[out] resp pointer to the response buffer (four words) - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_send_cmd_long_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, - uint32_t *resp) { - uint32_t sta; - - (void)sdcp; - - SDIO->ARG = arg; - SDIO->CMD = (uint32_t)cmd | SDIO_CMD_WAITRESP_0 | SDIO_CMD_WAITRESP_1 | - SDIO_CMD_CPSMEN; - while (((sta = SDIO->STA) & (SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT | - SDIO_STA_CCRCFAIL)) == 0) - ; - SDIO->ICR = SDIO_ICR_CMDRENDC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CCRCFAILC; - if ((sta & (STM32_SDIO_STA_ERROR_MASK)) != 0) { - sdc_lld_collect_errors(sdcp); - return CH_FAILED; - } - /* Save bytes in reverse order because MSB in response comes first.*/ - *resp++ = SDIO->RESP4; - *resp++ = SDIO->RESP3; - *resp++ = SDIO->RESP2; - *resp = SDIO->RESP1; - return CH_SUCCESS; -} - -/** - * @brief Reads one or more blocks. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] startblk first block to read - * @param[out] buf pointer to the read buffer - * @param[in] n number of blocks to read - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_read_aligned(SDCDriver *sdcp, uint32_t startblk, - uint8_t *buf, uint32_t n) { - uint32_t resp[1]; - - chDbgCheck((n < (0x1000000 / MMCSD_BLOCK_SIZE)), "max transaction size"); - - SDIO->DTIMER = STM32_SDC_READ_TIMEOUT; - - /* Checks for errors and waits for the card to be ready for reading.*/ - if (_sdc_wait_for_transfer_state(sdcp)) - return CH_FAILED; - - /* Prepares the DMA channel for writing.*/ - dmaStreamSetMemory0(sdcp->dma, buf); - dmaStreamSetTransactionSize(sdcp->dma, - (n * MMCSD_BLOCK_SIZE) / sizeof (uint32_t)); - dmaStreamSetMode(sdcp->dma, sdcp->dmamode | STM32_DMA_CR_DIR_P2M); - dmaStreamEnable(sdcp->dma); - - /* Setting up data transfer.*/ - SDIO->ICR = STM32_SDIO_ICR_ALL_FLAGS; - SDIO->MASK = SDIO_MASK_DCRCFAILIE | - SDIO_MASK_DTIMEOUTIE | - SDIO_MASK_STBITERRIE | - SDIO_MASK_RXOVERRIE | - SDIO_MASK_DATAENDIE; - SDIO->DLEN = n * MMCSD_BLOCK_SIZE; - - /* Talk to card what we want from it.*/ - if (sdc_lld_prepare_read(sdcp, startblk, n, resp) == TRUE) - goto error; - - /* Transaction starts just after DTEN bit setting.*/ - SDIO->DCTRL = SDIO_DCTRL_DTDIR | - SDIO_DCTRL_DBLOCKSIZE_3 | - SDIO_DCTRL_DBLOCKSIZE_0 | - SDIO_DCTRL_DMAEN | - SDIO_DCTRL_DTEN; - if (sdc_lld_wait_transaction_end(sdcp, n, resp) == TRUE) - goto error; - - return CH_SUCCESS; - -error: - sdc_lld_error_cleanup(sdcp, n, resp); - return CH_FAILED; -} - -/** - * @brief Writes one or more blocks. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] startblk first block to write - * @param[out] buf pointer to the write buffer - * @param[in] n number of blocks to write - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_write_aligned(SDCDriver *sdcp, uint32_t startblk, - const uint8_t *buf, uint32_t n) { - uint32_t resp[1]; - - chDbgCheck((n < (0x1000000 / MMCSD_BLOCK_SIZE)), "max transaction size"); - - SDIO->DTIMER = STM32_SDC_WRITE_TIMEOUT; - - /* Checks for errors and waits for the card to be ready for writing.*/ - if (_sdc_wait_for_transfer_state(sdcp)) - return CH_FAILED; - - /* Prepares the DMA channel for writing.*/ - dmaStreamSetMemory0(sdcp->dma, buf); - dmaStreamSetTransactionSize(sdcp->dma, - (n * MMCSD_BLOCK_SIZE) / sizeof (uint32_t)); - dmaStreamSetMode(sdcp->dma, sdcp->dmamode | STM32_DMA_CR_DIR_M2P); - dmaStreamEnable(sdcp->dma); - - /* Setting up data transfer.*/ - SDIO->ICR = STM32_SDIO_ICR_ALL_FLAGS; - SDIO->MASK = SDIO_MASK_DCRCFAILIE | - SDIO_MASK_DTIMEOUTIE | - SDIO_MASK_STBITERRIE | - SDIO_MASK_TXUNDERRIE | - SDIO_MASK_DATAENDIE; - SDIO->DLEN = n * MMCSD_BLOCK_SIZE; - - /* Talk to card what we want from it.*/ - if (sdc_lld_prepare_write(sdcp, startblk, n, resp) == TRUE) - goto error; - - /* Transaction starts just after DTEN bit setting.*/ - SDIO->DCTRL = SDIO_DCTRL_DBLOCKSIZE_3 | - SDIO_DCTRL_DBLOCKSIZE_0 | - SDIO_DCTRL_DMAEN | - SDIO_DCTRL_DTEN; - if (sdc_lld_wait_transaction_end(sdcp, n, resp) == TRUE) - goto error; - - return CH_SUCCESS; - -error: - sdc_lld_error_cleanup(sdcp, n, resp); - return CH_FAILED; -} - -/** - * @brief Reads one or more blocks. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] startblk first block to read - * @param[out] buf pointer to the read buffer - * @param[in] n number of blocks to read - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_read(SDCDriver *sdcp, uint32_t startblk, - uint8_t *buf, uint32_t n) { - -#if STM32_SDC_SDIO_UNALIGNED_SUPPORT - if (((unsigned)buf & 3) != 0) { - uint32_t i; - for (i = 0; i < n; i++) { - if (sdc_lld_read_aligned(sdcp, startblk, u.buf, 1)) - return CH_FAILED; - memcpy(buf, u.buf, MMCSD_BLOCK_SIZE); - buf += MMCSD_BLOCK_SIZE; - startblk++; - } - return CH_SUCCESS; - } -#endif /* STM32_SDC_SDIO_UNALIGNED_SUPPORT */ - return sdc_lld_read_aligned(sdcp, startblk, buf, n); -} - -/** - * @brief Writes one or more blocks. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * @param[in] startblk first block to write - * @param[out] buf pointer to the write buffer - * @param[in] n number of blocks to write - * - * @return The operation status. - * @retval CH_SUCCESS operation succeeded. - * @retval CH_FAILED operation failed. - * - * @notapi - */ -bool_t sdc_lld_write(SDCDriver *sdcp, uint32_t startblk, - const uint8_t *buf, uint32_t n) { - -#if STM32_SDC_SDIO_UNALIGNED_SUPPORT - if (((unsigned)buf & 3) != 0) { - uint32_t i; - for (i = 0; i < n; i++) { - memcpy(u.buf, buf, MMCSD_BLOCK_SIZE); - buf += MMCSD_BLOCK_SIZE; - if (sdc_lld_write_aligned(sdcp, startblk, u.buf, 1)) - return CH_FAILED; - startblk++; - } - return CH_SUCCESS; - } -#endif /* STM32_SDC_SDIO_UNALIGNED_SUPPORT */ - return sdc_lld_write_aligned(sdcp, startblk, buf, n); -} - -/** - * @brief Waits for card idle condition. - * - * @param[in] sdcp pointer to the @p SDCDriver object - * - * @return The operation status. - * @retval CH_SUCCESS the operation succeeded. - * @retval CH_FAILED the operation failed. - * - * @api - */ -bool_t sdc_lld_sync(SDCDriver *sdcp) { - - /* TODO: Implement.*/ - (void)sdcp; - return CH_SUCCESS; -} - -#endif /* HAL_USE_SDC */ - -/** @} */ diff --git a/os/hal/platforms/STM32/sdc_lld.h b/os/hal/platforms/STM32/sdc_lld.h deleted file mode 100644 index 0312b011df..0000000000 --- a/os/hal/platforms/STM32/sdc_lld.h +++ /dev/null @@ -1,340 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/sdc_lld.h - * @brief STM32 SDC subsystem low level driver header. - * - * @addtogroup SDC - * @{ - */ - -#ifndef _SDC_LLD_H_ -#define _SDC_LLD_H_ - -#if HAL_USE_SDC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Value to clear all interrupts flag at once. - */ -#define STM32_SDIO_ICR_ALL_FLAGS (SDIO_ICR_CCRCFAILC | SDIO_ICR_DCRCFAILC | \ - SDIO_ICR_CTIMEOUTC | SDIO_ICR_DTIMEOUTC | \ - SDIO_ICR_TXUNDERRC | SDIO_ICR_RXOVERRC | \ - SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC | \ - SDIO_ICR_DATAENDC | SDIO_ICR_STBITERRC | \ - SDIO_ICR_DBCKENDC | SDIO_ICR_SDIOITC | \ - SDIO_ICR_CEATAENDC) - -/** - * @brief Mask of error flags in STA register. - */ -#define STM32_SDIO_STA_ERROR_MASK (SDIO_STA_CCRCFAIL | SDIO_STA_DCRCFAIL | \ - SDIO_STA_CTIMEOUT | SDIO_STA_DTIMEOUT | \ - SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief SDIO DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_SDC_SDIO_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SDC_SDIO_DMA_PRIORITY 3 -#endif - -/** - * @brief SDIO interrupt priority level setting. - */ -#if !defined(STM32_SDC_SDIO_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SDC_SDIO_IRQ_PRIORITY 9 -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_WRITE_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_WRITE_TIMEOUT_MS 250 -#endif - -/** - * @brief Read timeout in milliseconds. - */ -#if !defined(SDC_READ_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_READ_TIMEOUT_MS 5 -#endif - -/** - * @brief Support for unaligned transfers. - * @note Unaligned transfers are much slower. - */ -#if !defined(STM32_SDC_SDIO_UNALIGNED_SUPPORT) || defined(__DOXYGEN__) -#define STM32_SDC_SDIO_UNALIGNED_SUPPORT TRUE -#endif - -#if STM32_ADVANCED_DMA || defined(__DOXYGEN__) - -/** - * @brief DMA stream used for SDC operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SDC_SDIO_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#endif - -#else /* !STM32_ADVANCED_DMA*/ -#define STM32_SDC_SDIO_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) - -#endif /* !STM32_ADVANCED_DMA*/ -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !STM32_HAS_SDIO -#error "SDIO not present in the selected device" -#endif - -#if !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SDC_SDIO_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to SDIO" -#endif - -#if !STM32_DMA_IS_VALID_PRIORITY(STM32_SDC_SDIO_DMA_PRIORITY) -#error "Invalid DMA priority assigned to SDIO" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/* - * SDIO clock divider. - */ -#if (defined(STM32F4XX) || defined(STM32F2XX)) -#define STM32_SDIO_DIV_HS 0 -#define STM32_SDIO_DIV_LS 120 - -#elif STM32_HCLK > 48000000 -#define STM32_SDIO_DIV_HS 1 -#define STM32_SDIO_DIV_LS 178 -#else - -#define STM32_SDIO_DIV_HS 0 -#define STM32_SDIO_DIV_LS 118 -#endif - -/** - * @brief SDIO data timeouts in SDIO clock cycles. - */ -#if (defined(STM32F4XX) || defined(STM32F2XX)) -#if !STM32_CLOCK48_REQUIRED -#error "SDIO requires STM32_CLOCK48_REQUIRED to be enabled" -#endif - -#define STM32_SDC_WRITE_TIMEOUT \ - (((STM32_PLL48CLK / (STM32_SDIO_DIV_HS + 2)) / 1000) * SDC_WRITE_TIMEOUT_MS) -#define STM32_SDC_READ_TIMEOUT \ - (((STM32_PLL48CLK / (STM32_SDIO_DIV_HS + 2)) / 1000) * SDC_READ_TIMEOUT_MS) - -#else -#define STM32_SDC_WRITE_TIMEOUT \ - (((STM32_HCLK / (STM32_SDIO_DIV_HS + 2)) / 1000) * SDC_WRITE_TIMEOUT_MS) -#define STM32_SDC_READ_TIMEOUT \ - (((STM32_HCLK / (STM32_SDIO_DIV_HS + 2)) / 1000) * SDC_READ_TIMEOUT_MS) -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of SDIO bus mode. - */ -typedef enum { - SDC_MODE_1BIT = 0, - SDC_MODE_4BIT, - SDC_MODE_8BIT -} sdcbusmode_t; - -/** - * @brief Type of card flags. - */ -typedef uint32_t sdcmode_t; - -/** - * @brief SDC Driver condition flags type. - */ -typedef uint32_t sdcflags_t; - -/** - * @brief Type of a structure representing an SDC driver. - */ -typedef struct SDCDriver SDCDriver; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - uint32_t dummy; -} SDCConfig; - -/** - * @brief @p SDCDriver specific methods. - */ -#define _sdc_driver_methods \ - _mmcsd_block_device_methods - -/** - * @extends MMCSDBlockDeviceVMT - * - * @brief @p SDCDriver virtual methods table. - */ -struct SDCDriverVMT { - _sdc_driver_methods -}; - -/** - * @brief Structure representing an SDC driver. - */ -struct SDCDriver { - /** - * @brief Virtual Methods Table. - */ - const struct SDCDriverVMT *vmt; - _mmcsd_block_device_data - /** - * @brief Current configuration data. - */ - const SDCConfig *config; - /** - * @brief Various flags regarding the mounted card. - */ - sdcmode_t cardmode; - /** - * @brief Errors flags. - */ - sdcflags_t errors; - /** - * @brief Card RCA. - */ - uint32_t rca; - /* End of the mandatory fields.*/ - /** - * @brief Thread waiting for I/O completion IRQ. - */ - Thread *thread; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; - /** - * @brief Transmit DMA channel. - */ - const stm32_dma_stream_t *dma; - /** - * @brief Pointer to the SDIO registers block. - * @note Used only for dubugging purpose. - */ -#if CH_DBG_ENABLE_ASSERTS - SDIO_TypeDef *sdio; -#endif -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name R1 response utilities - * @{ - */ -/** - * @brief Evaluates to @p TRUE if the R1 response contains error flags. - * - * @param[in] r1 the r1 response - */ -#define MMCSD_R1_ERROR(r1) (((r1) & MMCSD_R1_ERROR_MASK) != 0) - -/** - * @brief Returns the status field of an R1 response. - * - * @param[in] r1 the r1 response - */ -#define MMCSD_R1_STS(r1) (((r1) >> 9) & 15) - -/** - * @brief Evaluates to @p TRUE if the R1 response indicates a locked card. - * - * @param[in] r1 the r1 response - */ -#define MMCSD_R1_IS_CARD_LOCKED(r1) (((r1) >> 21) & 1) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern SDCDriver SDCD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sdc_lld_init(void); - void sdc_lld_start(SDCDriver *sdcp); - void sdc_lld_stop(SDCDriver *sdcp); - void sdc_lld_start_clk(SDCDriver *sdcp); - void sdc_lld_set_data_clk(SDCDriver *sdcp); - void sdc_lld_stop_clk(SDCDriver *sdcp); - void sdc_lld_set_bus_mode(SDCDriver *sdcp, sdcbusmode_t mode); - void sdc_lld_send_cmd_none(SDCDriver *sdcp, uint8_t cmd, uint32_t arg); - bool_t sdc_lld_send_cmd_short(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, - uint32_t *resp); - bool_t sdc_lld_send_cmd_short_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, - uint32_t *resp); - bool_t sdc_lld_send_cmd_long_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, - uint32_t *resp); - bool_t sdc_lld_read(SDCDriver *sdcp, uint32_t startblk, - uint8_t *buf, uint32_t n); - bool_t sdc_lld_write(SDCDriver *sdcp, uint32_t startblk, - const uint8_t *buf, uint32_t n); - bool_t sdc_lld_sync(SDCDriver *sdcp); - bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp); - bool_t sdc_lld_is_write_protected(SDCDriver *sdcp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SDC */ - -#endif /* _SDC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/serial_lld.c b/os/hal/platforms/STM32/serial_lld.c deleted file mode 100644 index 841b9b386d..0000000000 --- a/os/hal/platforms/STM32/serial_lld.c +++ /dev/null @@ -1,652 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/serial_lld.c - * @brief STM32 low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief USART1 serial driver identifier.*/ -#if STM32_SERIAL_USE_USART1 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif - -/** @brief USART2 serial driver identifier.*/ -#if STM32_SERIAL_USE_USART2 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/** @brief USART3 serial driver identifier.*/ -#if STM32_SERIAL_USE_USART3 || defined(__DOXYGEN__) -SerialDriver SD3; -#endif - -/** @brief UART4 serial driver identifier.*/ -#if STM32_SERIAL_USE_UART4 || defined(__DOXYGEN__) -SerialDriver SD4; -#endif - -/** @brief UART5 serial driver identifier.*/ -#if STM32_SERIAL_USE_UART5 || defined(__DOXYGEN__) -SerialDriver SD5; -#endif - -/** @brief USART6 serial driver identifier.*/ -#if STM32_SERIAL_USE_USART6 || defined(__DOXYGEN__) -SerialDriver SD6; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = -{ - SERIAL_DEFAULT_BITRATE, - 0, - USART_CR2_STOP1_BITS | USART_CR2_LINEN, - 0 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/* Local functions have different implementations depending on the USART type, - STM32F0xx devices and newer have an enhanced peripheral with slightly - different register interface.*/ - -#if defined(STM32F0XX) - -/** - * @brief USART initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart_init(SerialDriver *sdp, const SerialConfig *config) { - USART_TypeDef *u = sdp->usart; - - /* Baud rate setting.*/ - if (sdp->usart == USART1) - u->BRR = STM32_USART1CLK / config->sc_speed; - else - u->BRR = STM32_PCLK / config->sc_speed; - - /* Note that some bits are enforced.*/ - u->CR1 = config->sc_cr1 | USART_CR1_UE | USART_CR1_PEIE | - USART_CR1_RXNEIE | USART_CR1_TE | - USART_CR1_RE; - u->CR2 = config->sc_cr2 | USART_CR2_LBDIE; - u->CR3 = config->sc_cr3 | USART_CR3_EIE; - u->ICR = 0xFFFFFFFF; -} - -/** - * @brief USART de-initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] u pointer to an USART I/O block - */ -static void usart_deinit(USART_TypeDef *u) { - - u->CR1 = 0; - u->CR2 = 0; - u->CR3 = 0; -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] isr USART ISR register value - */ -static void set_error(SerialDriver *sdp, uint16_t isr) { - flagsmask_t sts = 0; - - if (isr & USART_ISR_ORE) - sts |= SD_OVERRUN_ERROR; - if (isr & USART_ISR_PE) - sts |= SD_PARITY_ERROR; - if (isr & USART_ISR_FE) - sts |= SD_FRAMING_ERROR; - if (isr & USART_ISR_NE) - sts |= SD_NOISE_ERROR; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Common IRQ handler. - * - * @param[in] sdp communication channel associated to the USART - */ -static void serve_interrupt(SerialDriver *sdp) { - USART_TypeDef *u = sdp->usart; - uint16_t cr1 = u->CR1; - uint16_t isr; - - /* Reading and clearing status.*/ - isr = u->ISR; - u->ICR = isr; - - /* Error condition detection.*/ - if (isr & (USART_ISR_ORE | USART_ISR_NE | USART_ISR_FE | USART_ISR_PE)) - set_error(sdp, isr); - /* Special case, LIN break detection.*/ - if (isr & USART_ISR_LBD) { - chSysLockFromIsr(); - chnAddFlagsI(sdp, SD_BREAK_DETECTED); - chSysUnlockFromIsr(); - } - /* Data available.*/ - if (isr & USART_ISR_RXNE) { - chSysLockFromIsr(); - sdIncomingDataI(sdp, (uint8_t)u->RDR); - chSysUnlockFromIsr(); - } - /* Transmission buffer empty.*/ - if ((cr1 & USART_CR1_TXEIE) && (isr & USART_ISR_TXE)) { - msg_t b; - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - u->CR1 = (cr1 & ~USART_CR1_TXEIE) | USART_CR1_TCIE; - } - else - u->TDR = b; - chSysUnlockFromIsr(); - } - /* Physical transmission end.*/ - if (isr & USART_ISR_TC) { - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_TRANSMISSION_END); - chSysUnlockFromIsr(); - u->CR1 = cr1 & ~USART_CR1_TCIE; - } -} - -#else /* !defined(STM32F0XX) */ - -/** - * @brief USART initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration - */ -static void usart_init(SerialDriver *sdp, const SerialConfig *config) { - USART_TypeDef *u = sdp->usart; - - /* Baud rate setting.*/ -#if STM32_HAS_USART6 - if ((sdp->usart == USART1) || (sdp->usart == USART6)) -#else - if (sdp->usart == USART1) -#endif - u->BRR = STM32_PCLK2 / config->sc_speed; - else - u->BRR = STM32_PCLK1 / config->sc_speed; - - /* Note that some bits are enforced.*/ - u->CR1 = config->sc_cr1 | USART_CR1_UE | USART_CR1_PEIE | - USART_CR1_RXNEIE | USART_CR1_TE | - USART_CR1_RE; - u->CR2 = config->sc_cr2 | USART_CR2_LBDIE; - u->CR3 = config->sc_cr3 | USART_CR3_EIE; - u->SR = 0; - (void)u->SR; /* SR reset step 1.*/ - (void)u->DR; /* SR reset step 2.*/ -} - -/** - * @brief USART de-initialization. - * @details This function must be invoked with interrupts disabled. - * - * @param[in] u pointer to an USART I/O block - */ -static void usart_deinit(USART_TypeDef *u) { - - u->CR1 = 0; - u->CR2 = 0; - u->CR3 = 0; -} - -/** - * @brief Error handling routine. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] sr USART SR register value - */ -static void set_error(SerialDriver *sdp, uint16_t sr) { - flagsmask_t sts = 0; - - if (sr & USART_SR_ORE) - sts |= SD_OVERRUN_ERROR; - if (sr & USART_SR_PE) - sts |= SD_PARITY_ERROR; - if (sr & USART_SR_FE) - sts |= SD_FRAMING_ERROR; - if (sr & USART_SR_NE) - sts |= SD_NOISE_ERROR; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Common IRQ handler. - * - * @param[in] sdp communication channel associated to the USART - */ -static void serve_interrupt(SerialDriver *sdp) { - USART_TypeDef *u = sdp->usart; - uint16_t cr1 = u->CR1; - uint16_t sr = u->SR; /* SR reset step 1.*/ - uint16_t dr = u->DR; /* SR reset step 2.*/ - - /* Error condition detection.*/ - if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE)) - set_error(sdp, sr); - /* Special case, LIN break detection.*/ - if (sr & USART_SR_LBD) { - chSysLockFromIsr(); - chnAddFlagsI(sdp, SD_BREAK_DETECTED); - chSysUnlockFromIsr(); - u->SR &= ~USART_SR_LBD; - } - /* Data available.*/ - if (sr & USART_SR_RXNE) { - chSysLockFromIsr(); - sdIncomingDataI(sdp, (uint8_t)dr); - chSysUnlockFromIsr(); - } - /* Transmission buffer empty.*/ - if ((cr1 & USART_CR1_TXEIE) && (sr & USART_SR_TXE)) { - msg_t b; - chSysLockFromIsr(); - b = chOQGetI(&sdp->oqueue); - if (b < Q_OK) { - chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY); - u->CR1 = (cr1 & ~USART_CR1_TXEIE) | USART_CR1_TCIE; - } - else - u->DR = b; - chSysUnlockFromIsr(); - } - /* Physical transmission end.*/ - if (sr & USART_SR_TC) { - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_TRANSMISSION_END); - chSysUnlockFromIsr(); - u->CR1 = cr1 & ~USART_CR1_TCIE; - u->SR &= ~USART_SR_TC; - } -} - -#endif /* !defined(STM32F0XX) */ - -#if STM32_SERIAL_USE_USART1 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - USART1->CR1 |= USART_CR1_TXEIE; -} -#endif - -#if STM32_SERIAL_USE_USART2 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - USART2->CR1 |= USART_CR1_TXEIE; -} -#endif - -#if STM32_SERIAL_USE_USART3 || defined(__DOXYGEN__) -static void notify3(GenericQueue *qp) { - - (void)qp; - USART3->CR1 |= USART_CR1_TXEIE; -} -#endif - -#if STM32_SERIAL_USE_UART4 || defined(__DOXYGEN__) -static void notify4(GenericQueue *qp) { - - (void)qp; - UART4->CR1 |= USART_CR1_TXEIE; -} -#endif - -#if STM32_SERIAL_USE_UART5 || defined(__DOXYGEN__) -static void notify5(GenericQueue *qp) { - - (void)qp; - UART5->CR1 |= USART_CR1_TXEIE; -} -#endif - -#if STM32_SERIAL_USE_USART6 || defined(__DOXYGEN__) -static void notify6(GenericQueue *qp) { - - (void)qp; - USART6->CR1 |= USART_CR1_TXEIE; -} -#endif - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_SERIAL_USE_USART1 || defined(__DOXYGEN__) -#if !defined(STM32_USART1_HANDLER) -#error "STM32_USART1_HANDLER not defined" -#endif -/** - * @brief USART1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART1_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD1); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if STM32_SERIAL_USE_USART2 || defined(__DOXYGEN__) -#if !defined(STM32_USART2_HANDLER) -#error "STM32_USART2_HANDLER not defined" -#endif -/** - * @brief USART2 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART2_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD2); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if STM32_SERIAL_USE_USART3 || defined(__DOXYGEN__) -#if !defined(STM32_USART3_HANDLER) -#error "STM32_USART3_HANDLER not defined" -#endif -/** - * @brief USART3 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART3_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD3); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if STM32_SERIAL_USE_UART4 || defined(__DOXYGEN__) -#if !defined(STM32_UART4_HANDLER) -#error "STM32_UART4_HANDLER not defined" -#endif -/** - * @brief UART4 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_UART4_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD4); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if STM32_SERIAL_USE_UART5 || defined(__DOXYGEN__) -#if !defined(STM32_UART5_HANDLER) -#error "STM32_UART5_HANDLER not defined" -#endif -/** - * @brief UART5 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_UART5_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD5); - - CH_IRQ_EPILOGUE(); -} -#endif - -#if STM32_SERIAL_USE_USART6 || defined(__DOXYGEN__) -#if !defined(STM32_USART6_HANDLER) -#error "STM32_USART6_HANDLER not defined" -#endif -/** - * @brief USART1 interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(STM32_USART6_HANDLER) { - - CH_IRQ_PROLOGUE(); - - serve_interrupt(&SD6); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if STM32_SERIAL_USE_USART1 - sdObjectInit(&SD1, NULL, notify1); - SD1.usart = USART1; -#endif - -#if STM32_SERIAL_USE_USART2 - sdObjectInit(&SD2, NULL, notify2); - SD2.usart = USART2; -#endif - -#if STM32_SERIAL_USE_USART3 - sdObjectInit(&SD3, NULL, notify3); - SD3.usart = USART3; -#endif - -#if STM32_SERIAL_USE_UART4 - sdObjectInit(&SD4, NULL, notify4); - SD4.usart = UART4; -#endif - -#if STM32_SERIAL_USE_UART5 - sdObjectInit(&SD5, NULL, notify5); - SD5.usart = UART5; -#endif - -#if STM32_SERIAL_USE_USART6 - sdObjectInit(&SD6, NULL, notify6); - SD6.usart = USART6; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - - if (sdp->state == SD_STOP) { -#if STM32_SERIAL_USE_USART1 - if (&SD1 == sdp) { - rccEnableUSART1(FALSE); - nvicEnableVector(STM32_USART1_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SERIAL_USART1_PRIORITY)); - } -#endif -#if STM32_SERIAL_USE_USART2 - if (&SD2 == sdp) { - rccEnableUSART2(FALSE); - nvicEnableVector(STM32_USART2_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SERIAL_USART2_PRIORITY)); - } -#endif -#if STM32_SERIAL_USE_USART3 - if (&SD3 == sdp) { - rccEnableUSART3(FALSE); - nvicEnableVector(STM32_USART3_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SERIAL_USART3_PRIORITY)); - } -#endif -#if STM32_SERIAL_USE_UART4 - if (&SD4 == sdp) { - rccEnableUART4(FALSE); - nvicEnableVector(STM32_UART4_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SERIAL_UART4_PRIORITY)); - } -#endif -#if STM32_SERIAL_USE_UART5 - if (&SD5 == sdp) { - rccEnableUART5(FALSE); - nvicEnableVector(STM32_UART5_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SERIAL_UART5_PRIORITY)); - } -#endif -#if STM32_SERIAL_USE_USART6 - if (&SD6 == sdp) { - rccEnableUSART6(FALSE); - nvicEnableVector(STM32_USART6_NUMBER, - CORTEX_PRIORITY_MASK(STM32_SERIAL_USART6_PRIORITY)); - } -#endif - } - usart_init(sdp, config); -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - - if (sdp->state == SD_READY) { - usart_deinit(sdp->usart); -#if STM32_SERIAL_USE_USART1 - if (&SD1 == sdp) { - rccDisableUSART1(FALSE); - nvicDisableVector(STM32_USART1_NUMBER); - return; - } -#endif -#if STM32_SERIAL_USE_USART2 - if (&SD2 == sdp) { - rccDisableUSART2(FALSE); - nvicDisableVector(STM32_USART2_NUMBER); - return; - } -#endif -#if STM32_SERIAL_USE_USART3 - if (&SD3 == sdp) { - rccDisableUSART3(FALSE); - nvicDisableVector(STM32_USART3_NUMBER); - return; - } -#endif -#if STM32_SERIAL_USE_UART4 - if (&SD4 == sdp) { - rccDisableUART4(FALSE); - nvicDisableVector(STM32_UART4_NUMBER); - return; - } -#endif -#if STM32_SERIAL_USE_UART5 - if (&SD5 == sdp) { - rccDisableUART5(FALSE); - nvicDisableVector(STM32_UART5_NUMBER); - return; - } -#endif -#if STM32_SERIAL_USE_USART6 - if (&SD6 == sdp) { - rccDisableUSART6(FALSE); - nvicDisableVector(STM32_USART6_NUMBER); - return; - } -#endif - } -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/STM32/serial_lld.h b/os/hal/platforms/STM32/serial_lld.h deleted file mode 100644 index d98cb14bd7..0000000000 --- a/os/hal/platforms/STM32/serial_lld.h +++ /dev/null @@ -1,306 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/serial_lld.h - * @brief STM32 low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief USART1 driver enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SERIAL_USE_USART1) || defined(__DOXYGEN__) -#define STM32_SERIAL_USE_USART1 FALSE -#endif - -/** - * @brief USART2 driver enable switch. - * @details If set to @p TRUE the support for USART2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SERIAL_USE_USART2) || defined(__DOXYGEN__) -#define STM32_SERIAL_USE_USART2 FALSE -#endif - -/** - * @brief USART3 driver enable switch. - * @details If set to @p TRUE the support for USART3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SERIAL_USE_USART3) || defined(__DOXYGEN__) -#define STM32_SERIAL_USE_USART3 FALSE -#endif - -/** - * @brief UART4 driver enable switch. - * @details If set to @p TRUE the support for UART4 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SERIAL_USE_UART4) || defined(__DOXYGEN__) -#define STM32_SERIAL_USE_UART4 FALSE -#endif - -/** - * @brief UART5 driver enable switch. - * @details If set to @p TRUE the support for UART5 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SERIAL_USE_UART5) || defined(__DOXYGEN__) -#define STM32_SERIAL_USE_UART5 FALSE -#endif - -/** - * @brief USART6 driver enable switch. - * @details If set to @p TRUE the support for USART6 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SERIAL_USE_USART6) || defined(__DOXYGEN__) -#define STM32_SERIAL_USE_USART6 FALSE -#endif - -/** - * @brief USART1 interrupt priority level setting. - */ -#if !defined(STM32_SERIAL_USART1_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SERIAL_USART1_PRIORITY 12 -#endif - -/** - * @brief USART2 interrupt priority level setting. - */ -#if !defined(STM32_SERIAL_USART2_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SERIAL_USART2_PRIORITY 12 -#endif - -/** - * @brief USART3 interrupt priority level setting. - */ -#if !defined(STM32_SERIAL_USART3_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SERIAL_USART3_PRIORITY 12 -#endif - -/** - * @brief UART4 interrupt priority level setting. - */ -#if !defined(STM32_SERIAL_UART4_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SERIAL_UART4_PRIORITY 12 -#endif - -/** - * @brief UART5 interrupt priority level setting. - */ -#if !defined(STM32_SERIAL_UART5_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SERIAL_UART5_PRIORITY 12 -#endif - -/** - * @brief USART6 interrupt priority level setting. - */ -#if !defined(STM32_SERIAL_USART6_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SERIAL_USART6_PRIORITY 12 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_SERIAL_USE_USART1 && !STM32_HAS_USART1 -#error "USART1 not present in the selected device" -#endif - -#if STM32_SERIAL_USE_USART2 && !STM32_HAS_USART2 -#error "USART2 not present in the selected device" -#endif - -#if STM32_SERIAL_USE_USART3 && !STM32_HAS_USART3 -#error "USART3 not present in the selected device" -#endif - -#if STM32_SERIAL_USE_UART4 && !STM32_HAS_UART4 -#error "UART4 not present in the selected device" -#endif - -#if STM32_SERIAL_USE_UART5 && !STM32_HAS_UART5 -#error "UART5 not present in the selected device" -#endif - -#if STM32_SERIAL_USE_USART6 && !STM32_HAS_USART6 -#error "USART6 not present in the selected device" -#endif - -#if !STM32_SERIAL_USE_USART1 && !STM32_SERIAL_USE_USART2 && \ - !STM32_SERIAL_USE_USART3 && !STM32_SERIAL_USE_UART4 && \ - !STM32_SERIAL_USE_UART5 && !STM32_SERIAL_USE_USART6 -#error "SERIAL driver activated but no USART/UART peripheral assigned" -#endif - -#if STM32_SERIAL_USE_USART1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SERIAL_USART1_PRIORITY) -#error "Invalid IRQ priority assigned to USART1" -#endif - -#if STM32_SERIAL_USE_USART2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SERIAL_USART2_PRIORITY) -#error "Invalid IRQ priority assigned to USART2" -#endif - -#if STM32_SERIAL_USE_USART3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SERIAL_USART3_PRIORITY) -#error "Invalid IRQ priority assigned to USART3" -#endif - -#if STM32_SERIAL_USE_UART4 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SERIAL_UART4_PRIORITY) -#error "Invalid IRQ priority assigned to UART4" -#endif - -#if STM32_SERIAL_USE_UART5 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SERIAL_UART5_PRIORITY) -#error "Invalid IRQ priority assigned to UART5" -#endif - -#if STM32_SERIAL_USE_USART6 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SERIAL_USART6_PRIORITY) -#error "Invalid IRQ priority assigned to USART6" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief STM32 Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { - /** - * @brief Bit rate. - */ - uint32_t sc_speed; - /** - * @brief Initialization value for the CR1 register. - */ - uint16_t sc_cr1; - /** - * @brief Initialization value for the CR2 register. - */ - uint16_t sc_cr2; - /** - * @brief Initialization value for the CR3 register. - */ - uint16_t sc_cr3; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Pointer to the USART registers block.*/ \ - USART_TypeDef *usart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/* - * Extra USARTs definitions here (missing from the ST header file). - */ -#define USART_CR2_STOP1_BITS (0 << 12) /**< @brief CR2 1 stop bit value.*/ -#define USART_CR2_STOP0P5_BITS (1 << 12) /**< @brief CR2 0.5 stop bit value.*/ -#define USART_CR2_STOP2_BITS (2 << 12) /**< @brief CR2 2 stop bit value.*/ -#define USART_CR2_STOP1P5_BITS (3 << 12) /**< @brief CR2 1.5 stop bit value.*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_SERIAL_USE_USART1 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if STM32_SERIAL_USE_USART2 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif -#if STM32_SERIAL_USE_USART3 && !defined(__DOXYGEN__) -extern SerialDriver SD3; -#endif -#if STM32_SERIAL_USE_UART4 && !defined(__DOXYGEN__) -extern SerialDriver SD4; -#endif -#if STM32_SERIAL_USE_UART5 && !defined(__DOXYGEN__) -extern SerialDriver SD5; -#endif -#if STM32_SERIAL_USE_USART6 && !defined(__DOXYGEN__) -extern SerialDriver SD6; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/spi_lld.c b/os/hal/platforms/STM32/spi_lld.c deleted file mode 100644 index 06a2a27370..0000000000 --- a/os/hal/platforms/STM32/spi_lld.c +++ /dev/null @@ -1,491 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/spi_lld.c - * @brief STM32 SPI subsystem low level driver source. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define SPI1_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SPI_SPI1_RX_DMA_STREAM, \ - STM32_SPI1_RX_DMA_CHN) - -#define SPI1_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SPI_SPI1_TX_DMA_STREAM, \ - STM32_SPI1_TX_DMA_CHN) - -#define SPI2_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SPI_SPI2_RX_DMA_STREAM, \ - STM32_SPI2_RX_DMA_CHN) - -#define SPI2_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SPI_SPI2_TX_DMA_STREAM, \ - STM32_SPI2_TX_DMA_CHN) - -#define SPI3_RX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SPI_SPI3_RX_DMA_STREAM, \ - STM32_SPI3_RX_DMA_CHN) - -#define SPI3_TX_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_SPI_SPI3_TX_DMA_STREAM, \ - STM32_SPI3_TX_DMA_CHN) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief SPI1 driver identifier.*/ -#if STM32_SPI_USE_SPI1 || defined(__DOXYGEN__) -SPIDriver SPID1; -#endif - -/** @brief SPI2 driver identifier.*/ -#if STM32_SPI_USE_SPI2 || defined(__DOXYGEN__) -SPIDriver SPID2; -#endif - -/** @brief SPI3 driver identifier.*/ -#if STM32_SPI_USE_SPI3 || defined(__DOXYGEN__) -SPIDriver SPID3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -static uint16_t dummytx; -static uint16_t dummyrx; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared end-of-rx service routine. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void spi_lld_serve_rx_interrupt(SPIDriver *spip, uint32_t flags) { - - /* DMA errors handling.*/ -#if defined(STM32_SPI_DMA_ERROR_HOOK) - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_SPI_DMA_ERROR_HOOK(spip); - } -#else - (void)flags; -#endif - - /* Stop everything.*/ - dmaStreamDisable(spip->dmatx); - dmaStreamDisable(spip->dmarx); - - /* Portable SPI ISR code defined in the high level driver, note, it is - a macro.*/ - _spi_isr_code(spip); -} - -/** - * @brief Shared end-of-tx service routine. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void spi_lld_serve_tx_interrupt(SPIDriver *spip, uint32_t flags) { - - /* DMA errors handling.*/ -#if defined(STM32_SPI_DMA_ERROR_HOOK) - (void)spip; - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - STM32_SPI_DMA_ERROR_HOOK(spip); - } -#else - (void)spip; - (void)flags; -#endif -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - - dummytx = 0xFFFF; - -#if STM32_SPI_USE_SPI1 - spiObjectInit(&SPID1); - SPID1.spi = SPI1; - SPID1.dmarx = STM32_DMA_STREAM(STM32_SPI_SPI1_RX_DMA_STREAM); - SPID1.dmatx = STM32_DMA_STREAM(STM32_SPI_SPI1_TX_DMA_STREAM); - SPID1.rxdmamode = STM32_DMA_CR_CHSEL(SPI1_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SPI_SPI1_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | - STM32_DMA_CR_TEIE; - SPID1.txdmamode = STM32_DMA_CR_CHSEL(SPI1_TX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SPI_SPI1_DMA_PRIORITY) | - STM32_DMA_CR_DIR_M2P | - STM32_DMA_CR_DMEIE | - STM32_DMA_CR_TEIE; -#endif - -#if STM32_SPI_USE_SPI2 - spiObjectInit(&SPID2); - SPID2.spi = SPI2; - SPID2.dmarx = STM32_DMA_STREAM(STM32_SPI_SPI2_RX_DMA_STREAM); - SPID2.dmatx = STM32_DMA_STREAM(STM32_SPI_SPI2_TX_DMA_STREAM); - SPID2.rxdmamode = STM32_DMA_CR_CHSEL(SPI2_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SPI_SPI2_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | - STM32_DMA_CR_TEIE; - SPID2.txdmamode = STM32_DMA_CR_CHSEL(SPI2_TX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SPI_SPI2_DMA_PRIORITY) | - STM32_DMA_CR_DIR_M2P | - STM32_DMA_CR_DMEIE | - STM32_DMA_CR_TEIE; -#endif - -#if STM32_SPI_USE_SPI3 - spiObjectInit(&SPID3); - SPID3.spi = SPI3; - SPID3.dmarx = STM32_DMA_STREAM(STM32_SPI_SPI3_RX_DMA_STREAM); - SPID3.dmatx = STM32_DMA_STREAM(STM32_SPI_SPI3_TX_DMA_STREAM); - SPID3.rxdmamode = STM32_DMA_CR_CHSEL(SPI3_RX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SPI_SPI3_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | - STM32_DMA_CR_TEIE; - SPID3.txdmamode = STM32_DMA_CR_CHSEL(SPI3_TX_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_SPI_SPI3_DMA_PRIORITY) | - STM32_DMA_CR_DIR_M2P | - STM32_DMA_CR_DMEIE | - STM32_DMA_CR_TEIE; -#endif -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - /* If in stopped state then enables the SPI and DMA clocks.*/ - if (spip->state == SPI_STOP) { -#if STM32_SPI_USE_SPI1 - if (&SPID1 == spip) { - bool_t b; - b = dmaStreamAllocate(spip->dmarx, - STM32_SPI_SPI1_IRQ_PRIORITY, - (stm32_dmaisr_t)spi_lld_serve_rx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #1", "stream already allocated"); - b = dmaStreamAllocate(spip->dmatx, - STM32_SPI_SPI1_IRQ_PRIORITY, - (stm32_dmaisr_t)spi_lld_serve_tx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #2", "stream already allocated"); - rccEnableSPI1(FALSE); - } -#endif -#if STM32_SPI_USE_SPI2 - if (&SPID2 == spip) { - bool_t b; - b = dmaStreamAllocate(spip->dmarx, - STM32_SPI_SPI2_IRQ_PRIORITY, - (stm32_dmaisr_t)spi_lld_serve_rx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #3", "stream already allocated"); - b = dmaStreamAllocate(spip->dmatx, - STM32_SPI_SPI2_IRQ_PRIORITY, - (stm32_dmaisr_t)spi_lld_serve_tx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #4", "stream already allocated"); - rccEnableSPI2(FALSE); - } -#endif -#if STM32_SPI_USE_SPI3 - if (&SPID3 == spip) { - bool_t b; - b = dmaStreamAllocate(spip->dmarx, - STM32_SPI_SPI3_IRQ_PRIORITY, - (stm32_dmaisr_t)spi_lld_serve_rx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #5", "stream already allocated"); - b = dmaStreamAllocate(spip->dmatx, - STM32_SPI_SPI3_IRQ_PRIORITY, - (stm32_dmaisr_t)spi_lld_serve_tx_interrupt, - (void *)spip); - chDbgAssert(!b, "spi_lld_start(), #6", "stream already allocated"); - rccEnableSPI3(FALSE); - } -#endif - - /* DMA setup.*/ - dmaStreamSetPeripheral(spip->dmarx, &spip->spi->DR); - dmaStreamSetPeripheral(spip->dmatx, &spip->spi->DR); - } - - /* Configuration-specific DMA setup.*/ -#if defined(STM32F0XX) - if ((spip->config->cr1 & SPI_CR2_DS) < - (SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0)) { -#else /* !defined(STM32F0XX) */ - if ((spip->config->cr1 & SPI_CR1_DFF) == 0) { -#endif /* !defined(STM32F0XX) */ - /* Frame width is 8 bits or smaller.*/ - spip->rxdmamode = (spip->rxdmamode & ~STM32_DMA_CR_SIZE_MASK) | - STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_MSIZE_BYTE; - spip->txdmamode = (spip->txdmamode & ~STM32_DMA_CR_SIZE_MASK) | - STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_MSIZE_BYTE; - } - else { - /* Frame width is larger than 8 bits.*/ - spip->rxdmamode = (spip->rxdmamode & ~STM32_DMA_CR_SIZE_MASK) | - STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD; - spip->txdmamode = (spip->txdmamode & ~STM32_DMA_CR_SIZE_MASK) | - STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD; - } - /* SPI setup and enable.*/ - spip->spi->CR1 = 0; - spip->spi->CR1 = spip->config->cr1 | SPI_CR1_MSTR | SPI_CR1_SSM | - SPI_CR1_SSI; - spip->spi->CR2 = SPI_CR2_SSOE | SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN; - spip->spi->CR1 |= SPI_CR1_SPE; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - /* If in ready state then disables the SPI clock.*/ - if (spip->state == SPI_READY) { - - /* SPI disable.*/ - spip->spi->CR1 = 0; - dmaStreamRelease(spip->dmarx); - dmaStreamRelease(spip->dmatx); - -#if STM32_SPI_USE_SPI1 - if (&SPID1 == spip) - rccDisableSPI1(FALSE); -#endif -#if STM32_SPI_USE_SPI2 - if (&SPID2 == spip) - rccDisableSPI2(FALSE); -#endif -#if STM32_SPI_USE_SPI3 - if (&SPID3 == spip) - rccDisableSPI3(FALSE); -#endif - } -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This asynchronous function starts the transmission of a series of - * idle words on the SPI bus and ignores the received data. - * @post At the end of the operation the configured callback is invoked. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - dmaStreamSetMemory0(spip->dmarx, &dummyrx); - dmaStreamSetTransactionSize(spip->dmarx, n); - dmaStreamSetMode(spip->dmarx, spip->rxdmamode); - - dmaStreamSetMemory0(spip->dmatx, &dummytx); - dmaStreamSetTransactionSize(spip->dmatx, n); - dmaStreamSetMode(spip->dmatx, spip->txdmamode); - - dmaStreamEnable(spip->dmarx); - dmaStreamEnable(spip->dmatx); -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This asynchronous function starts a simultaneous transmit/receive - * operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - dmaStreamSetMemory0(spip->dmarx, rxbuf); - dmaStreamSetTransactionSize(spip->dmarx, n); - dmaStreamSetMode(spip->dmarx, spip->rxdmamode| STM32_DMA_CR_MINC); - - dmaStreamSetMemory0(spip->dmatx, txbuf); - dmaStreamSetTransactionSize(spip->dmatx, n); - dmaStreamSetMode(spip->dmatx, spip->txdmamode | STM32_DMA_CR_MINC); - - dmaStreamEnable(spip->dmarx); - dmaStreamEnable(spip->dmatx); -} - -/** - * @brief Sends data over the SPI bus. - * @details This asynchronous function starts a transmit operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - dmaStreamSetMemory0(spip->dmarx, &dummyrx); - dmaStreamSetTransactionSize(spip->dmarx, n); - dmaStreamSetMode(spip->dmarx, spip->rxdmamode); - - dmaStreamSetMemory0(spip->dmatx, txbuf); - dmaStreamSetTransactionSize(spip->dmatx, n); - dmaStreamSetMode(spip->dmatx, spip->txdmamode | STM32_DMA_CR_MINC); - - dmaStreamEnable(spip->dmarx); - dmaStreamEnable(spip->dmatx); -} - -/** - * @brief Receives data from the SPI bus. - * @details This asynchronous function starts a receive operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - dmaStreamSetMemory0(spip->dmarx, rxbuf); - dmaStreamSetTransactionSize(spip->dmarx, n); - dmaStreamSetMode(spip->dmarx, spip->rxdmamode | STM32_DMA_CR_MINC); - - dmaStreamSetMemory0(spip->dmatx, &dummytx); - dmaStreamSetTransactionSize(spip->dmatx, n); - dmaStreamSetMode(spip->dmatx, spip->txdmamode); - - dmaStreamEnable(spip->dmarx); - dmaStreamEnable(spip->dmatx); -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame) { - - spip->spi->DR = frame; - while ((spip->spi->SR & SPI_SR_RXNE) == 0) - ; - return spip->spi->DR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/STM32/spi_lld.h b/os/hal/platforms/STM32/spi_lld.h deleted file mode 100644 index 535819af47..0000000000 --- a/os/hal/platforms/STM32/spi_lld.h +++ /dev/null @@ -1,424 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/spi_lld.h - * @brief STM32 SPI subsystem low level driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief SPI1 driver enable switch. - * @details If set to @p TRUE the support for SPI1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SPI_USE_SPI1) || defined(__DOXYGEN__) -#define STM32_SPI_USE_SPI1 FALSE -#endif - -/** - * @brief SPI2 driver enable switch. - * @details If set to @p TRUE the support for SPI2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SPI_USE_SPI2) || defined(__DOXYGEN__) -#define STM32_SPI_USE_SPI2 FALSE -#endif - -/** - * @brief SPI3 driver enable switch. - * @details If set to @p TRUE the support for SPI3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_SPI_USE_SPI3) || defined(__DOXYGEN__) -#define STM32_SPI_USE_SPI3 FALSE -#endif - -/** - * @brief SPI1 interrupt priority level setting. - */ -#if !defined(STM32_SPI_SPI1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#endif - -/** - * @brief SPI2 interrupt priority level setting. - */ -#if !defined(STM32_SPI_SPI2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#endif - -/** - * @brief SPI3 interrupt priority level setting. - */ -#if !defined(STM32_SPI_SPI3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#endif - -/** - * @brief SPI1 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA streams but - * because of the streams ordering the RX stream has always priority - * over the TX stream. - */ -#if !defined(STM32_SPI_SPI1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#endif - -/** - * @brief SPI2 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA streams but - * because of the streams ordering the RX stream has always priority - * over the TX stream. - */ -#if !defined(STM32_SPI_SPI2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#endif - -/** - * @brief SPI3 DMA priority (0..3|lowest..highest). - * @note The priority level is used for both the TX and RX DMA streams but - * because of the streams ordering the RX stream has always priority - * over the TX stream. - */ -#if !defined(STM32_SPI_SPI3_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#endif - -/** - * @brief SPI DMA error hook. - */ -#if !defined(STM32_SPI_DMA_ERROR_HOOK) || defined(__DOXYGEN__) -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() -#endif - -#if STM32_ADVANCED_DMA || defined(__DOXYGEN__) - -/** - * @brief DMA stream used for SPI1 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SPI_SPI1_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#endif - -/** - * @brief DMA stream used for SPI1 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SPI_SPI1_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#endif - -/** - * @brief DMA stream used for SPI2 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SPI_SPI2_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#endif - -/** - * @brief DMA stream used for SPI2 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SPI_SPI2_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#endif - -/** - * @brief DMA stream used for SPI3 RX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SPI_SPI3_RX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#endif - -/** - * @brief DMA stream used for SPI3 TX operations. - * @note This option is only available on platforms with enhanced DMA. - */ -#if !defined(STM32_SPI_SPI3_TX_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#endif - -#else /* !STM32_ADVANCED_DMA */ - -#if defined(STM32F0XX) -/* Fixed values for STM32F0xx devices.*/ -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) - -#else /* !defined(STM32F0XX) */ -/* Fixed streams for platforms using the old DMA peripheral, the values are - valid for both STM32F1xx and STM32L1xx.*/ -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#endif /* !defined(STM32F0XX) */ - -#endif /* !STM32_ADVANCED_DMA*/ -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_SPI_USE_SPI1 && !STM32_HAS_SPI1 -#error "SPI1 not present in the selected device" -#endif - -#if STM32_SPI_USE_SPI2 && !STM32_HAS_SPI2 -#error "SPI2 not present in the selected device" -#endif - -#if STM32_SPI_USE_SPI3 && !STM32_HAS_SPI3 -#error "SPI3 not present in the selected device" -#endif - -#if !STM32_SPI_USE_SPI1 && !STM32_SPI_USE_SPI2 && !STM32_SPI_USE_SPI3 -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -#if STM32_SPI_USE_SPI1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SPI_SPI1_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to SPI1" -#endif - -#if STM32_SPI_USE_SPI2 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SPI_SPI2_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to SPI2" -#endif - -#if STM32_SPI_USE_SPI3 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_SPI_SPI3_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to SPI3" -#endif - -#if STM32_SPI_USE_SPI1 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_SPI_SPI1_DMA_PRIORITY) -#error "Invalid DMA priority assigned to SPI1" -#endif - -#if STM32_SPI_USE_SPI2 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_SPI_SPI2_DMA_PRIORITY) -#error "Invalid DMA priority assigned to SPI2" -#endif - -#if STM32_SPI_USE_SPI3 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_SPI_SPI3_DMA_PRIORITY) -#error "Invalid DMA priority assigned to SPI3" -#endif - -#if STM32_SPI_USE_SPI1 && \ - !STM32_DMA_IS_VALID_ID(STM32_SPI_SPI1_RX_DMA_STREAM, STM32_SPI1_RX_DMA_MSK) -#error "invalid DMA stream associated to SPI1 RX" -#endif - -#if STM32_SPI_USE_SPI1 && \ - !STM32_DMA_IS_VALID_ID(STM32_SPI_SPI1_TX_DMA_STREAM, STM32_SPI1_TX_DMA_MSK) -#error "invalid DMA stream associated to SPI1 TX" -#endif - -#if STM32_SPI_USE_SPI2 && \ - !STM32_DMA_IS_VALID_ID(STM32_SPI_SPI2_RX_DMA_STREAM, STM32_SPI2_RX_DMA_MSK) -#error "invalid DMA stream associated to SPI2 RX" -#endif - -#if STM32_SPI_USE_SPI2 && \ - !STM32_DMA_IS_VALID_ID(STM32_SPI_SPI2_TX_DMA_STREAM, STM32_SPI2_TX_DMA_MSK) -#error "invalid DMA stream associated to SPI2 TX" -#endif - -#if STM32_SPI_USE_SPI3 && \ - !STM32_DMA_IS_VALID_ID(STM32_SPI_SPI3_RX_DMA_STREAM, STM32_SPI3_RX_DMA_MSK) -#error "invalid DMA stream associated to SPI3 RX" -#endif - -#if STM32_SPI_USE_SPI3 && \ - !STM32_DMA_IS_VALID_ID(STM32_SPI_SPI3_TX_DMA_STREAM, STM32_SPI3_TX_DMA_MSK) -#error "invalid DMA stream associated to SPI3 TX" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SPI initialization data. - */ - uint16_t cr1; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver{ - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the SPIx registers block. - */ - SPI_TypeDef *spi; - /** - * @brief Receive DMA stream. - */ - const stm32_dma_stream_t *dmarx; - /** - * @brief Transmit DMA stream. - */ - const stm32_dma_stream_t *dmatx; - /** - * @brief RX DMA mode bit mask. - */ - uint32_t rxdmamode; - /** - * @brief TX DMA mode bit mask. - */ - uint32_t txdmamode; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_SPI_USE_SPI1 && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#if STM32_SPI_USE_SPI2 && !defined(__DOXYGEN__) -extern SPIDriver SPID2; -#endif - -#if STM32_SPI_USE_SPI3 && !defined(__DOXYGEN__) -extern SPIDriver SPID3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32/stm32.h b/os/hal/platforms/STM32/stm32.h deleted file mode 100644 index 0a01169d0c..0000000000 --- a/os/hal/platforms/STM32/stm32.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32/stm32.h - * @brief STM32 common header. - * @pre One of the following macros must be defined before including - * this header, the macro selects the inclusion of the appropriate - * vendor header: - * - STM32F0XX for Entry Level devices. - * - STM32F10X_LD_VL for Value Line Low Density devices. - * - STM32F10X_MD_VL for Value Line Medium Density devices. - * - STM32F10X_LD for Performance Low Density devices. - * - STM32F10X_MD for Performance Medium Density devices. - * - STM32F10X_HD for Performance High Density devices. - * - STM32F10X_XL for Performance eXtra Density devices. - * - STM32F10X_CL for Connectivity Line devices. - * - STM32F2XX for High-performance STM32 F-2 devices. - * - STM32F30X for Analog & DSP devices. - * - STM32F4XX for High-performance STM32 F-4 devices. - * - STM32L1XX_MD for Ultra Low Power Medium-density devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _STM32_H_ -#define _STM32_H_ - -#if defined(STM32F0XX) -#include "stm32f0xx.h" - -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) || defined(STM32F10X_LD) || \ - defined(STM32F10X_MD) || defined(STM32F10X_HD) || \ - defined(STM32F10X_XL) || defined(STM32F10X_CL) || \ - defined(__DOXYGEN__) -#include "stm32f10x.h" - -#elif defined(STM32F2XX) -#include "stm32f2xx.h" - -#elif defined(STM32F30X) -#include "stm32f30x.h" - -#elif defined(STM32F4XX) -#include "stm32f4xx.h" - -#elif defined(STM32L1XX_MD) -#include "stm32l1xx.h" - -#else -#error "STM32 device not specified" -#endif - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief STM32 TIM registers block. - * @note Redefined from the ST headers because the non uniform - * declaration of the CCR registers among the various - * sub-families. - */ -typedef struct { - volatile uint16_t CR1; - uint16_t _resvd0; - volatile uint16_t CR2; - uint16_t _resvd1; - volatile uint16_t SMCR; - uint16_t _resvd2; - volatile uint16_t DIER; - uint16_t _resvd3; - volatile uint16_t SR; - uint16_t _resvd4; - volatile uint16_t EGR; - uint16_t _resvd5; - volatile uint16_t CCMR1; - uint16_t _resvd6; - volatile uint16_t CCMR2; - uint16_t _resvd7; - volatile uint16_t CCER; - uint16_t _resvd8; - volatile uint32_t CNT; - volatile uint16_t PSC; - uint16_t _resvd9; - volatile uint32_t ARR; - volatile uint16_t RCR; - uint16_t _resvd10; - volatile uint32_t CCR[4]; - volatile uint16_t BDTR; - uint16_t _resvd11; - volatile uint16_t DCR; - uint16_t _resvd12; - volatile uint16_t DMAR; - uint16_t _resvd13; - volatile uint16_t OR; - uint16_t _resvd14; -} stm32_tim_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name TIM units references - * @{ - */ -#define STM32_TIM1 ((stm32_tim_t *)TIM1_BASE) -#define STM32_TIM2 ((stm32_tim_t *)TIM2_BASE) -#define STM32_TIM3 ((stm32_tim_t *)TIM3_BASE) -#define STM32_TIM4 ((stm32_tim_t *)TIM4_BASE) -#define STM32_TIM5 ((stm32_tim_t *)TIM5_BASE) -#define STM32_TIM6 ((stm32_tim_t *)TIM6_BASE) -#define STM32_TIM7 ((stm32_tim_t *)TIM7_BASE) -#define STM32_TIM8 ((stm32_tim_t *)TIM8_BASE) -#define STM32_TIM9 ((stm32_tim_t *)TIM9_BASE) -#define STM32_TIM10 ((stm32_tim_t *)TIM10_BASE) -#define STM32_TIM11 ((stm32_tim_t *)TIM11_BASE) -#define STM32_TIM12 ((stm32_tim_t *)TIM12_BASE) -#define STM32_TIM13 ((stm32_tim_t *)TIM13_BASE) -#define STM32_TIM14 ((stm32_tim_t *)TIM14_BASE) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#endif /* _STM32_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/adc_lld.c b/os/hal/platforms/STM32F0xx/adc_lld.c deleted file mode 100644 index dcc7c64f04..0000000000 --- a/os/hal/platforms/STM32F0xx/adc_lld.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/adc_lld.c - * @brief STM32F0xx ADC subsystem low level driver source. - * - * @addtogroup ADC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief ADC1 driver identifier.*/ -#if STM32_ADC_USE_ADC1 || defined(__DOXYGEN__) -ADCDriver ADCD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Stops an ongoing conversion, if any. - * - * @param[in] adc pointer to the ADC registers block - */ -static void adc_lld_stop_adc(ADC_TypeDef *adc) { - - if (adc->CR & ADC_CR_ADSTART) { - adc->CR |= ADC_CR_ADSTP; - while (adc->CR & ADC_CR_ADSTP) - ; - } -} - -/** - * @brief ADC DMA ISR service routine. - * - * @param[in] adcp pointer to the @p ADCDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void adc_lld_serve_rx_interrupt(ADCDriver *adcp, uint32_t flags) { - - /* DMA errors handling.*/ - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - /* DMA, this could help only if the DMA tries to access an unmapped - address space or violates alignment rules.*/ - _adc_isr_error_code(adcp, ADC_ERR_DMAFAILURE); - } - else { - /* It is possible that the conversion group has already be reset by the - ADC error handler, in this case this interrupt is spurious.*/ - if (adcp->grpp != NULL) { - if ((flags & STM32_DMA_ISR_HTIF) != 0) { - /* Half transfer processing.*/ - _adc_isr_half_code(adcp); - } - if ((flags & STM32_DMA_ISR_TCIF) != 0) { - /* Transfer complete processing.*/ - _adc_isr_full_code(adcp); - } - } - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 || defined(__DOXYGEN__) -/** - * @brief ADC interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(ADC1_COMP_IRQHandler) { - uint32_t isr; - - CH_IRQ_PROLOGUE(); - - isr = ADC1->ISR; - ADC1->ISR = isr; - - /* It could be a spurious interrupt caused by overflows after DMA disabling, - just ignore it in this case.*/ - if (ADCD1.grpp != NULL) { - /* Note, an overflow may occur after the conversion ended before the driver - is able to stop the ADC, this is why the DMA channel is checked too.*/ - if ((isr & ADC_ISR_OVR) && - (dmaStreamGetTransactionSize(ADCD1.dmastp) > 0)) { - /* ADC overflow condition, this could happen only if the DMA is unable - to read data fast enough.*/ - _adc_isr_error_code(&ADCD1, ADC_ERR_OVERFLOW); - } - if (isr & ADC_ISR_AWD) { - /* Analog watchdog error.*/ - _adc_isr_error_code(&ADCD1, ADC_ERR_AWD); - } - } - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level ADC driver initialization. - * - * @notapi - */ -void adc_lld_init(void) { - -#if STM32_ADC_USE_ADC1 - /* Driver initialization.*/ - adcObjectInit(&ADCD1); - ADCD1.adc = ADC1; - ADCD1.dmastp = STM32_DMA1_STREAM1; - ADCD1.dmamode = STM32_DMA_CR_PL(STM32_ADC_ADC1_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PSIZE_HWORD | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; -#endif - - /* The shared vector is initialized on driver initialization and never - disabled.*/ - nvicEnableVector(ADC1_COMP_IRQn, - CORTEX_PRIORITY_MASK(STM32_ADC_IRQ_PRIORITY)); - - /* Calibration procedure.*/ - rccEnableADC1(FALSE); - chDbgAssert(ADC1->CR == 0, "adc_lld_init(), #1", "invalid register state"); - ADC1->CR |= ADC_CR_ADCAL; - while (ADC1->CR & ADC_CR_ADCAL) - ; - rccDisableADC1(FALSE); -} - -/** - * @brief Configures and activates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start(ADCDriver *adcp) { - - /* If in stopped state then enables the ADC and DMA clocks.*/ - if (adcp->state == ADC_STOP) { -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) { - bool_t b; - b = dmaStreamAllocate(adcp->dmastp, - STM32_ADC_ADC1_DMA_IRQ_PRIORITY, - (stm32_dmaisr_t)adc_lld_serve_rx_interrupt, - (void *)adcp); - chDbgAssert(!b, "adc_lld_start(), #1", "stream already allocated"); - dmaStreamSetPeripheral(adcp->dmastp, &ADC1->DR); - rccEnableADC1(FALSE); -#if STM32_ADCSW == STM32_ADCSW_HSI14 - /* Clock from HSI14, no need for jitter removal.*/ - ADC1->CFGR2 = 0x00001000; -#else -#if STM32_ADCPRE == STM32_ADCPRE_DIV2 - ADC1->CFGR2 = 0x00001000 | ADC_CFGR2_JITOFFDIV2; -#else - ADC1->CFGR2 = 0x00001000 | ADC_CFGR2_JITOFFDIV4; -#endif -#endif - } -#endif /* STM32_ADC_USE_ADC1 */ - - /* ADC initial setup, starting the analog part here in order to reduce - the latency when starting a conversion.*/ - adcp->adc->CR = ADC_CR_ADEN; - while (!(adcp->adc->ISR & ADC_ISR_ADRDY)) - ; - } -} - -/** - * @brief Deactivates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop(ADCDriver *adcp) { - - /* If in ready state then disables the ADC clock and analog part.*/ - if (adcp->state == ADC_READY) { - - dmaStreamRelease(adcp->dmastp); - - /* Disabling ADC.*/ - if (adcp->adc->CR & ADC_CR_ADEN) { - adc_lld_stop_adc(adcp->adc); - adcp->adc->CR |= ADC_CR_ADDIS; - while (adcp->adc->CR & ADC_CR_ADDIS) - ; - } - -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) - rccDisableADC1(FALSE); -#endif - } -} - -/** - * @brief Starts an ADC conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start_conversion(ADCDriver *adcp) { - uint32_t mode; - const ADCConversionGroup *grpp = adcp->grpp; - - /* DMA setup.*/ - mode = adcp->dmamode; - if (grpp->circular) { - mode |= STM32_DMA_CR_CIRC; - } - if (adcp->depth > 1) { - /* If the buffer depth is greater than one then the half transfer interrupt - interrupt is enabled in order to allows streaming processing.*/ - mode |= STM32_DMA_CR_HTIE; - } - dmaStreamSetMemory0(adcp->dmastp, adcp->samples); - dmaStreamSetTransactionSize(adcp->dmastp, (uint32_t)grpp->num_channels * - (uint32_t)adcp->depth); - dmaStreamSetMode(adcp->dmastp, mode); - dmaStreamEnable(adcp->dmastp); - - /* ADC setup, if it is defined a callback for the analog watch dog then it - is enabled.*/ - adcp->adc->ISR = adcp->adc->ISR; - adcp->adc->IER = ADC_IER_OVRIE | ADC_IER_AWDIE; - adcp->adc->TR = grpp->tr; - adcp->adc->SMPR = grpp->smpr; - adcp->adc->CHSELR = grpp->chselr; - - /* ADC configuration and start.*/ - adcp->adc->CFGR1 = grpp->cfgr1 | ADC_CFGR1_CONT | ADC_CFGR1_DMACFG | - ADC_CFGR1_DMAEN; - adcp->adc->CR |= ADC_CR_ADSTART; -} - -/** - * @brief Stops an ongoing conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop_conversion(ADCDriver *adcp) { - - dmaStreamDisable(adcp->dmastp); - adc_lld_stop_adc(adcp->adc); -} - -#endif /* HAL_USE_ADC */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/adc_lld.h b/os/hal/platforms/STM32F0xx/adc_lld.h deleted file mode 100644 index ecf2151607..0000000000 --- a/os/hal/platforms/STM32F0xx/adc_lld.h +++ /dev/null @@ -1,337 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/adc_lld.h - * @brief STM32F0xx ADC subsystem low level driver header. - * - * @addtogroup ADC - * @{ - */ - -#ifndef _ADC_LLD_H_ -#define _ADC_LLD_H_ - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Sampling rates - * @{ - */ -#define ADC_SMPR_SMP_1P5 0 /**< @brief 14 cycles conversion time */ -#define ADC_SMPR_SMP_7P5 1 /**< @brief 21 cycles conversion time. */ -#define ADC_SMPR_SMP_13P5 2 /**< @brief 28 cycles conversion time. */ -#define ADC_SMPR_SMP_28P5 3 /**< @brief 41 cycles conversion time. */ -#define ADC_SMPR_SMP_41P5 4 /**< @brief 54 cycles conversion time. */ -#define ADC_SMPR_SMP_55P5 5 /**< @brief 68 cycles conversion time. */ -#define ADC_SMPR_SMP_71P5 6 /**< @brief 84 cycles conversion time. */ -#define ADC_SMPR_SMP_239P5 7 /**< @brief 252 cycles conversion time. */ -/** @} */ - -/** - * @name Resolution - * @{ - */ -#define ADC_CFGR1_RES_12BIT (0 << 3) -#define ADC_CFGR1_RES_10BIT (1 << 3) -#define ADC_CFGR1_RES_8BIT (2 << 3) -#define ADC_CFGR1_RES_6BIT (3 << 3) -/** @} */ - -/** - * @name Threashold register initializer - * @{ - */ -#define ADC_TR(low, high) (((uint32_t)(high) << 16) | (uint32_t)(low)) -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief ADC1 driver enable switch. - * @details If set to @p TRUE the support for ADC1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ADC_USE_ADC1) || defined(__DOXYGEN__) -#define STM32_ADC_USE_ADC1 FALSE -#endif - -/** - * @brief ADC1 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_ADC_ADC1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#endif - -/** - * @brief ADC interrupt priority level setting. - */ -#if !defined(STM32_ADC_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_IRQ_PRIORITY 2 -#endif - -/** - * @brief ADC1 DMA interrupt priority level setting. - */ -#if !defined(STM32_ADC_ADC1_DMA_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !STM32_HAS_ADC1 -#error "ADC1 not present in the selected device" -#endif - -#if !STM32_ADC_USE_ADC1 -#error "ADC driver activated but no ADC peripheral assigned" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ADC_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to ADC1" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ADC_ADC1_DMA_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to ADC1 DMA" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_ADC_ADC1_DMA_PRIORITY) -#error "Invalid DMA priority assigned to ADC1" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief ADC sample data type. - */ -typedef uint16_t adcsample_t; - -/** - * @brief Channels number in a conversion group. - */ -typedef uint16_t adc_channels_num_t; - -/** - * @brief Possible ADC failure causes. - * @note Error codes are architecture dependent and should not relied - * upon. - */ -typedef enum { - ADC_ERR_DMAFAILURE = 0, /**< DMA operations failure. */ - ADC_ERR_OVERFLOW = 1, /**< ADC overflow condition. */ - ADC_ERR_AWD = 2 /**< Analog watchdog triggered. */ -} adcerror_t; - -/** - * @brief Type of a structure representing an ADC driver. - */ -typedef struct ADCDriver ADCDriver; - -/** - * @brief ADC notification callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] buffer pointer to the most recent samples data - * @param[in] n number of buffer rows available starting from @p buffer - */ -typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n); - -/** - * @brief ADC error callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] err ADC error code - */ -typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err); - -/** - * @brief Conversion group configuration structure. - * @details This implementation-dependent structure describes a conversion - * operation. - * @note The use of this configuration structure requires knowledge of - * STM32 ADC cell registers interface, please refer to the STM32 - * reference manual for details. - */ -typedef struct { - /** - * @brief Enables the circular buffer mode for the group. - */ - bool_t circular; - /** - * @brief Number of the analog channels belonging to the conversion group. - */ - adc_channels_num_t num_channels; - /** - * @brief Callback function associated to the group or @p NULL. - */ - adccallback_t end_cb; - /** - * @brief Error callback or @p NULL. - */ - adcerrorcallback_t error_cb; - /* End of the mandatory fields.*/ - /** - * @brief ADC CFGR1 register initialization data. - */ - uint32_t cfgr1; - /** - * @brief ADC TR register initialization data. - */ - uint32_t tr; - /** - * @brief ADC SMPR register initialization data. - */ - uint32_t smpr; - /** - * @brief ADC CHSELR register initialization data. - * @details The number of bits at logic level one in this register must - * be equal to the number in the @p num_channels field. - */ - uint32_t chselr; -} ADCConversionGroup; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - uint32_t dummy; -} ADCConfig; - -/** - * @brief Structure representing an ADC driver. - */ -struct ADCDriver { - /** - * @brief Driver state. - */ - adcstate_t state; - /** - * @brief Current configuration data. - */ - const ADCConfig *config; - /** - * @brief Current samples buffer pointer or @p NULL. - */ - adcsample_t *samples; - /** - * @brief Current samples buffer depth or @p 0. - */ - size_t depth; - /** - * @brief Current conversion group pointer or @p NULL. - */ - const ADCConversionGroup *grpp; -#if ADC_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif -#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the peripheral. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* ADC_USE_MUTUAL_EXCLUSION */ -#if defined(ADC_DRIVER_EXT_FIELDS) - ADC_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the ADCx registers block. - */ - ADC_TypeDef *adc; - /** - * @brief Pointer to associated SMA channel. - */ - const stm32_dma_stream_t *dmastp; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Changes the value of the ADC CCR register. - * @details Use this function in order to enable or disable the internal - * analog sources. See the documentation in the STM32F0xx Reference - * Manual. - */ -#define adcSTM32SetCCR(ccr) (ADC->CCR = (ccr)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !defined(__DOXYGEN__) -extern ADCDriver ADCD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void adc_lld_init(void); - void adc_lld_start(ADCDriver *adcp); - void adc_lld_stop(ADCDriver *adcp); - void adc_lld_start_conversion(ADCDriver *adcp); - void adc_lld_stop_conversion(ADCDriver *adcp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_ADC */ - -#endif /* _ADC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/ext_lld_isr.c b/os/hal/platforms/STM32F0xx/ext_lld_isr.c deleted file mode 100644 index 8b8e81db85..0000000000 --- a/os/hal/platforms/STM32F0xx/ext_lld_isr.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/ext_lld_isr.c - * @brief STM32F0xx EXT subsystem low level driver ISR code. - * - * @addtogroup EXT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -#include "ext_lld_isr.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief EXTI[0] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI0_1_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 0) | (1 << 1)); - EXTI->PR = pr; - if (pr & (1 << 0)) - EXTD1.config->channels[0].cb(&EXTD1, 0); - if (pr & (1 << 1)) - EXTD1.config->channels[1].cb(&EXTD1, 1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[1] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI2_3_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 2) | (1 << 3)); - EXTI->PR = pr; - if (pr & (1 << 2)) - EXTD1.config->channels[2].cb(&EXTD1, 2); - if (pr & (1 << 3)) - EXTD1.config->channels[3].cb(&EXTD1, 3); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[4]...EXTI[15] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI4_15_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | - (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | - (1 << 14) | (1 << 15)); - EXTI->PR = pr; - if (pr & (1 << 4)) - EXTD1.config->channels[4].cb(&EXTD1, 4); - if (pr & (1 << 5)) - EXTD1.config->channels[5].cb(&EXTD1, 5); - if (pr & (1 << 6)) - EXTD1.config->channels[6].cb(&EXTD1, 6); - if (pr & (1 << 7)) - EXTD1.config->channels[7].cb(&EXTD1, 7); - if (pr & (1 << 8)) - EXTD1.config->channels[8].cb(&EXTD1, 8); - if (pr & (1 << 9)) - EXTD1.config->channels[9].cb(&EXTD1, 9); - if (pr & (1 << 10)) - EXTD1.config->channels[10].cb(&EXTD1, 10); - if (pr & (1 << 11)) - EXTD1.config->channels[11].cb(&EXTD1, 11); - if (pr & (1 << 12)) - EXTD1.config->channels[12].cb(&EXTD1, 12); - if (pr & (1 << 13)) - EXTD1.config->channels[13].cb(&EXTD1, 13); - if (pr & (1 << 14)) - EXTD1.config->channels[14].cb(&EXTD1, 14); - if (pr & (1 << 15)) - EXTD1.config->channels[15].cb(&EXTD1, 15); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[16] interrupt handler (PVD). - * - * @isr - */ -CH_IRQ_HANDLER(PVD_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 16); - EXTD1.config->channels[16].cb(&EXTD1, 16); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[17] interrupt handler (RTC). - * - * @isr - */ -CH_IRQ_HANDLER(RTC_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 17); - EXTD1.config->channels[17].cb(&EXTD1, 17); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Enables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_enable(void) { - - nvicEnableVector(EXTI0_1_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI0_1_IRQ_PRIORITY)); - nvicEnableVector(EXTI2_3_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI2_3_IRQ_PRIORITY)); - nvicEnableVector(EXTI4_15_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI4_15_IRQ_PRIORITY)); - nvicEnableVector(PVD_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI16_IRQ_PRIORITY)); - nvicEnableVector(RTC_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI17_IRQ_PRIORITY)); -} - -/** - * @brief Disables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_disable(void) { - - nvicDisableVector(EXTI0_1_IRQn); - nvicDisableVector(EXTI2_3_IRQn); - nvicDisableVector(EXTI4_15_IRQn); - nvicDisableVector(PVD_IRQn); - nvicDisableVector(RTC_IRQn); -} - -#endif /* HAL_USE_EXT */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/ext_lld_isr.h b/os/hal/platforms/STM32F0xx/ext_lld_isr.h deleted file mode 100644 index 6b2e496559..0000000000 --- a/os/hal/platforms/STM32F0xx/ext_lld_isr.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/ext_lld_isr.h - * @brief STM32F0xx EXT subsystem low level driver ISR header. - * - * @addtogroup EXT - * @{ - */ - -#ifndef _EXT_LLD_ISR_H_ -#define _EXT_LLD_ISR_H_ - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief EXTI0..1 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI0_1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#endif - -/** - * @brief EXTI2..3 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI2_3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#endif - -/** - * @brief EXTI4..15 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI4_15_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#endif - -/** - * @brief EXTI16 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI16_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#endif - -/** - * @brief EXTI17 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI17_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void ext_lld_exti_irq_enable(void); - void ext_lld_exti_irq_disable(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_EXT */ - -#endif /* _EXT_LLD_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/hal_lld.c b/os/hal/platforms/STM32F0xx/hal_lld.c deleted file mode 100644 index 401afe7e32..0000000000 --- a/os/hal/platforms/STM32F0xx/hal_lld.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/hal_lld.c - * @brief STM32F0xx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes the backup domain. - * @note WARNING! Changing clock source impossible without resetting - * of the whole BKP domain. - */ -static void hal_lld_backup_domain_init(void) { - - /* Backup domain access enabled and left open.*/ - PWR->CR |= PWR_CR_DBP; - - /* Reset BKP domain if different clock source selected.*/ - if ((RCC->BDCR & STM32_RTCSEL_MASK) != STM32_RTCSEL){ - /* Backup domain reset.*/ - RCC->BDCR = RCC_BDCR_BDRST; - RCC->BDCR = 0; - } - - /* If enabled then the LSE is started.*/ -#if STM32_LSE_ENABLED - RCC->BDCR |= RCC_BDCR_LSEON; - while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0) - ; /* Waits until LSE is stable. */ -#endif - -#if STM32_RTCSEL != STM32_RTCSEL_NOCLOCK - /* If the backup domain hasn't been initialized yet then proceed with - initialization.*/ - if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0) { - /* Selects clock source.*/ - RCC->BDCR |= STM32_RTCSEL; - - /* RTC clock enabled.*/ - RCC->BDCR |= RCC_BDCR_RTCEN; - } -#endif /* STM32_RTCSEL != STM32_RTCSEL_NOCLOCK */ -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* Reset of all peripherals.*/ - rccResetAPB1(0xFFFFFFFF); - rccResetAPB2(!RCC_APB2RSTR_DBGMCURST); - - /* SysTick initialization using the system clock.*/ - SysTick->LOAD = STM32_HCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; - - /* PWR and BD clocks enabled.*/ - rccEnablePWRInterface(FALSE); - - /* Initializes the backup domain.*/ - hal_lld_backup_domain_init(); - -#if defined(STM32_DMA_REQUIRED) - dmaInit(); -#endif - - /* Programmable voltage detector enable.*/ -#if STM32_PVD_ENABLE - PWR->CR |= PWR_CR_PVDE | (STM32_PLS & STM32_PLS_MASK); -#endif /* STM32_PVD_ENABLE */ -} - -/** - * @brief STM32 clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function should be invoked just after the system reset. - * - * @special - */ -void stm32_clock_init(void) { - -#if !STM32_NO_INIT - /* HSI setup, it enforces the reset situation in order to handle possible - problems with JTAG probes and re-initializations.*/ - RCC->CR |= RCC_CR_HSION; /* Make sure HSI is ON. */ - while (!(RCC->CR & RCC_CR_HSIRDY)) - ; /* Wait until HSI is stable. */ - RCC->CR &= RCC_CR_HSITRIM | RCC_CR_HSION; /* CR Reset value. */ - RCC->CFGR = 0; /* CFGR reset value. */ - while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) - ; /* Waits until HSI is selected. */ - -#if STM32_HSE_ENABLED - /* HSE activation.*/ - RCC->CR |= RCC_CR_HSEON; - while (!(RCC->CR & RCC_CR_HSERDY)) - ; /* Waits until HSE is stable. */ -#endif - -#if STM32_HSE14_ENABLED - /* HSI14 activation.*/ - RCC->CR2 |= RCC_CR2_HSI14ON; - while (!(RCC->CR2 & RCC_CR2_HSI14RDY)) - ; /* Waits until HSI14 is stable. */ -#endif - -#if STM32_LSI_ENABLED - /* LSI activation.*/ - RCC->CSR |= RCC_CSR_LSION; - while ((RCC->CSR & RCC_CSR_LSIRDY) == 0) - ; /* Waits until LSI is stable. */ -#endif - -#if STM32_ACTIVATE_PLL - /* PLL activation.*/ - RCC->CFGR |= STM32_PLLMUL | STM32_PLLXTPRE | STM32_PLLSRC; - RCC->CR |= RCC_CR_PLLON; - while (!(RCC->CR & RCC_CR_PLLRDY)) - ; /* Waits until PLL is stable. */ -#endif - - /* Clock settings.*/ - RCC->CFGR = STM32_MCOSEL | STM32_PLLMUL | STM32_PLLXTPRE | - STM32_PLLSRC | STM32_ADCPRE | STM32_PPRE | STM32_HPRE; - RCC->CFGR3 = STM32_ADCSW | STM32_CECSW | STM32_I2C1SW | STM32_USART1SW; - - /* Flash setup and final clock selection. */ - FLASH->ACR = STM32_FLASHBITS; - - /* Switching to the configured clock source if it is different from HSI.*/ -#if (STM32_SW != STM32_SW_HSI) - /* Switches clock source.*/ - RCC->CFGR |= STM32_SW; - while ((RCC->CFGR & RCC_CFGR_SWS) != (STM32_SW << 2)) - ; /* Waits selection complete. */ -#endif - - /* SYSCFG clock enabled here because it is a multi-functional unit shared - among multiple drivers.*/ - rccEnableAPB2(RCC_APB2ENR_SYSCFGEN, TRUE); -#endif /* !STM32_NO_INIT */ -} - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/hal_lld.h b/os/hal/platforms/STM32F0xx/hal_lld.h deleted file mode 100644 index 4e64865ab1..0000000000 --- a/os/hal/platforms/STM32F0xx/hal_lld.h +++ /dev/null @@ -1,977 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/hal_lld.h - * @brief STM32F0xx HAL subsystem low level driver header. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - STM32_LSECLK. - * - STM32_HSECLK. - * - STM32_HSE_BYPASS (optionally). - * . - * One of the following macros must also be defined: - * - STM32F0XX for Entry Level devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "stm32.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @name Platform identification - * @{ - */ -#define PLATFORM_NAME "STM32F05x Entry Level" -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Maximum system clock frequency. - */ -#define STM32_SYSCLK_MAX 48000000 - -/** - * @brief Maximum HSE clock frequency. - */ -#define STM32_HSECLK_MAX 32000000 - -/** - * @brief Minimum HSE clock frequency. - */ -#define STM32_HSECLK_MIN 1000000 - -/** - * @brief Maximum LSE clock frequency. - */ -#define STM32_LSECLK_MAX 1000000 - -/** - * @brief Minimum LSE clock frequency. - */ -#define STM32_LSECLK_MIN 32768 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MAX 25000000 - -/** - * @brief Minimum PLLs input clock frequency. - */ -#define STM32_PLLIN_MIN 1000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MAX 48000000 - -/** - * @brief Minimum PLL output clock frequency. - */ -#define STM32_PLLOUT_MIN 16000000 - -/** - * @brief Maximum APB clock frequency. - */ -#define STM32_PCLK_MAX 48000000 - -/** - * @brief Maximum ADC clock frequency. - */ -#define STM32_ADCCLK_MAX 14000000 -/** @} */ - -/** - * @name Internal clock sources - * @{ - */ -#define STM32_HSICLK 8000000 /**< High speed internal clock. */ -#define STM32_HSI14CLK 14000000 /**< 14MHz speed internal clock.*/ -#define STM32_LSICLK 40000 /**< Low speed internal clock. */ -/** @} */ - -/** - * @name PWR_CR register bits definitions - * @{ - */ -#define STM32_PLS_MASK (7 << 5) /**< PLS bits mask. */ -#define STM32_PLS_LEV0 (0 << 5) /**< PVD level 0. */ -#define STM32_PLS_LEV1 (1 << 5) /**< PVD level 1. */ -#define STM32_PLS_LEV2 (2 << 5) /**< PVD level 2. */ -#define STM32_PLS_LEV3 (3 << 5) /**< PVD level 3. */ -#define STM32_PLS_LEV4 (4 << 5) /**< PVD level 4. */ -#define STM32_PLS_LEV5 (5 << 5) /**< PVD level 5. */ -#define STM32_PLS_LEV6 (6 << 5) /**< PVD level 6. */ -#define STM32_PLS_LEV7 (7 << 5) /**< PVD level 7. */ -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_ADCPRE_DIV2 (0 << 14) /**< PCLK divided by 2. */ -#define STM32_ADCPRE_DIV4 (1 << 14) /**< PCLK divided by 4. */ - -#define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI. */ -#define STM32_PLLSRC_HSE (1 << 16) /**< PLL clock source is HSE. */ - -#define STM32_PLLXTPRE_DIV1 (0 << 17) /**< HSE divided by 1. */ -#define STM32_PLLXTPRE_DIV2 (1 << 17) /**< HSE divided by 2. */ - -#define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ -#define STM32_MCOSEL_HSI14 (3 << 24) /**< HSI14 clock on MCO pin. */ -#define STM32_MCOSEL_SYSCLK (4 << 24) /**< SYSCLK on MCO pin. */ -#define STM32_MCOSEL_HSI (5 << 24) /**< HSI clock on MCO pin. */ -#define STM32_MCOSEL_HSE (6 << 24) /**< HSE clock on MCO pin. */ -#define STM32_MCOSEL_PLLDIV2 (7 << 24) /**< PLL/2 clock on MCO pin. */ -/** @} */ - -/** - * @name RCC_BDCR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 8) /**< RTC clock source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No clock. */ -#define STM32_RTCSEL_LSE (1 << 8) /**< LSE used as RTC clock. */ -#define STM32_RTCSEL_LSI (2 << 8) /**< LSI used as RTC clock. */ -#define STM32_RTCSEL_HSEDIV (3 << 8) /**< HSE divided by 32 used as - RTC clock. */ -/** @} */ - -/** - * @name RCC_CFGR3 register bits definitions - * @{ - */ -#define STM32_USART1SW_MASK (3 << 0) /**< USART1 clock source mask. */ -#define STM32_USART1SW_PCLK (0 << 0) /**< USART1 clock is PCLK. */ -#define STM32_USART1SW_SYSCLK (1 << 0) /**< USART1 clock is SYSCLK. */ -#define STM32_USART1SW_LSE (2 << 0) /**< USART1 clock is LSE. */ -#define STM32_USART1SW_HSI (3 << 0) /**< USART1 clock is HSI. */ -#define STM32_I2C1SW_MASK (1 << 4) /**< I2C clock source mask. */ -#define STM32_I2C1SW_HSI (0 << 4) /**< I2C clock is HSI. */ -#define STM32_I2C1SW_SYSCLK (1 << 4) /**< I2C clock is SYSCLK. */ -#define STM32_CECSW_MASK (1 << 6) /**< CEC clock source mask. */ -#define STM32_CECSW_HSI (0 << 6) /**< CEC clock is HSI/244. */ -#define STM32_CECSW_LSE (1 << 6) /**< CEC clock is LSE. */ -#define STM32_ADCSW_MASK (1 << 8) /**< ADC clock source mask. */ -#define STM32_ADCSW_HSI14 (0 << 8) /**< ADC clock is HSI14. */ -#define STM32_ADCSW_PCLK (1 << 8) /**< ADC clock is PCLK/2|4. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name STM32F0xx capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_ADC1_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 1) | \ - STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_ADC1_DMA_CHN 0x00000000 - -#define STM32_HAS_ADC2 FALSE -#define STM32_ADC2_DMA_MSK 0x00000000 -#define STM32_ADC2_DMA_CHN 0x00000000 - -#define STM32_HAS_ADC3 FALSE -#define STM32_ADC3_DMA_MSK 0x00000000 -#define STM32_ADC3_DMA_CHN 0x00000000 - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 FALSE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 0 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 FALSE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 28 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE FALSE -#define STM32_HAS_GPIOF TRUE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTC_HAS_SUBSECONDS FALSE -#define STM32_RTC_IS_CALENDAR TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 FALSE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 FALSE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 TRUE -#define STM32_HAS_TIM15 TRUE -#define STM32_HAS_TIM16 TRUE -#define STM32_HAS_TIM17 TRUE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3) | \ - STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2) | \ - STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 FALSE -#define STM32_USART3_RX_DMA_MSK 0 -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK 0 -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK 0 -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK 0 -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB TRUE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ - -/*===========================================================================*/ -/* Platform specific friendly IRQ names. */ -/*===========================================================================*/ - -/** - * @name IRQ VECTOR names - * @{ - */ -#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */ -#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line - detect. */ -#define RTC_IRQHandler Vector48 /**< RTC through EXTI Line - Interrupt. */ -#define FLASH_IRQHandler Vector4C /**< Flash. */ -#define RCC_IRQHandler Vector50 /**< RCC. */ -#define EXTI0_1_IRQHandler Vector54 /**< EXTI Line 0..1. */ -#define EXTI2_3_IRQHandler Vector58 /**< EXTI Line 2..3. */ -#define EXTI4_15_IRQHandler Vector5C /**< EXTI Line 4..15. */ -#define TS_IRQHandler Vector60 /**< TS. */ -#define DMA1_Ch1_IRQHandler Vector64 /**< DMA1 Channel 1. */ -#define DMA1_Ch2_3_IRQHandler Vector68 /**< DMA1 Channels 2 and 3. */ -#define DMA1_Ch4_5_IRQHandler Vector6C /**< DMA1 Channels 4 and 5. */ -#define ADC1_COMP_IRQHandler Vector70 /**< ADC1 comparators 1 and 2. */ -#define TIM1_BRK_UP_TRG_COM_IRQHandler Vector74 /**< TIM1 common. */ -#define TIM1_CC_IRQHandler Vector78 /**< TIM1 Capture Compare. */ -#define TIM2_IRQHandler Vector7C /**< TIM2. */ -#define TIM3_IRQHandler Vector80 /**< TIM3. */ -#define TIM6_DAC_IRQHandler Vector84 /**< TIM6 and DAC. */ -#define TIM14_IRQHandler Vector8C /**< TIM14. */ -#define TIM15_IRQHandler Vector90 /**< TIM15. */ -#define TIM16_IRQHandler Vector94 /**< TIM16. */ -#define TIM17_IRQHandler Vector98 /**< TIM17. */ -#define I2C1_IRQHandler Vector9C /**< I2C1. */ -#define I2C2_IRQHandler VectorA0 /**< I2C2. */ -#define SPI1_IRQHandler VectorA4 /**< SPI1. */ -#define SPI2_IRQHandler VectorA8 /**< SPI2. */ -#define USART1_IRQHandler VectorAC /**< USART1. */ -#define USART2_IRQHandler VectorB0 /**< USART2. */ -#define CEC_IRQHandler VectorB8 /**< CEC. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Disables the PWR/RCC initialization in the HAL. - */ -#if !defined(STM32_NO_INIT) || defined(__DOXYGEN__) -#define STM32_NO_INIT FALSE -#endif - -/** - * @brief Enables or disables the programmable voltage detector. - */ -#if !defined(STM32_PVD_ENABLE) || defined(__DOXYGEN__) -#define STM32_PVD_ENABLE FALSE -#endif - -/** - * @brief Sets voltage level for programmable voltage detector. - */ -#if !defined(STM32_PLS) || defined(__DOXYGEN__) -#define STM32_PLS STM32_PLS_LEV0 -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM32_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the HSI14 clock source. - */ -#if !defined(STM32_HSI14_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSI14_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSI_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSE_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSE clock source. - */ -#if !defined(STM32_LSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSE_ENABLED FALSE -#endif - -/** - * @brief Main clock source selection. - * @note If the selected clock source is not the PLL then the PLL is not - * initialized and started. - * @note The default value is calculated for a 48MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -/** - * @brief Clock source for the PLL. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 48MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSE -#endif - -/** - * @brief Crystal PLL pre-divider. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 48MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLXTPRE) || defined(__DOXYGEN__) -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#endif - -/** - * @brief PLL multiplier value. - * @note The allowed range is 2...16. - * @note The default value is calculated for a 48MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLMUL_VALUE 6 -#endif - -/** - * @brief AHB prescaler value. - * @note The default value is calculated for a 48MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE) || defined(__DOXYGEN__) -#define STM32_PPRE STM32_PPRE_DIV1 -#endif - -/** - * @brief MCO pin setting. - */ -#if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#endif - -/** - * @brief ADC prescaler value. - */ -#if !defined(STM32_ADCPRE) || defined(__DOXYGEN__) -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#endif - -/** - * @brief ADC clock source. - */ -#if !defined(STM32_ADCSW) || defined(__DOXYGEN__) -#define STM32_ADCSW STM32_ADCSW_HSI14 -#endif - -/** - * @brief CEC clock source. - */ -#if !defined(STM32_CECSW) || defined(__DOXYGEN__) -#define STM32_CECSW STM32_CECSW_HSI -#endif - -/** - * @brief I2C1 clock source. - */ -#if !defined(STM32_I2C1SW) || defined(__DOXYGEN__) -#define STM32_I2C1SW STM32_I2C1SW_HSI -#endif - -/** - * @brief USART1 clock source. - */ -#if !defined(STM32_USART1SW) || defined(__DOXYGEN__) -#define STM32_USART1SW STM32_USART1SW_PCLK -#endif - -/** - * @brief RTC clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_LSI -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Configuration-related checks. - */ -#if !defined(STM32F0xx_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F0xx_MCUCONF not defined" -#endif - -/* - * HSI related checks. - */ -#if STM32_HSI_ENABLED -#else /* !STM32_HSI_ENABLED */ - -#if STM32_SW == STM32_SW_HSI -#error "HSI not enabled, required by STM32_SW" -#endif - -#if STM32_CECSW == STM32_CECSW_HSI -#error "HSI not enabled, required by STM32_CECSW" -#endif - -#if STM32_I2C1SW == STM32_I2C1SW_HSI -#error "HSI not enabled, required by STM32_I2C1SW" -#endif - -#if STM32_USART1SW == STM32_USART1SW_HSI -#error "HSI not enabled, required by STM32_USART1SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCOSEL" -#endif - -#endif /* !STM32_HSI_ENABLED */ - -/* - * HSI14 related checks. - */ -#if STM32_HSI14_ENABLED -#else /* !STM32_HSI14_ENABLED */ - -#if STM32_MCOSEL == STM32_MCOSEL_HSI14 -#error "HSI14 not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_ADCSW == STM32_ADCSW_HSI14 -#error "HSI14 not enabled, required by STM32_ADCSW" -#endif - -#endif /* !STM32_HSI14_ENABLED */ - -/* - * HSE related checks. - */ -#if STM32_HSE_ENABLED - -#if STM32_HSECLK == 0 -#error "HSE frequency not defined" -#elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" -#endif - -#else /* !STM32_HSE_ENABLED */ - -#if STM32_SW == STM32_SW_HSE -#error "HSE not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE) -#error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) -#error "HSE not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#error "HSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_HSE_ENABLED */ - -/* - * LSI related checks. - */ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSI -#error "LSI not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSI_ENABLED */ - -/* - * LSE related checks. - */ -#if STM32_LSE_ENABLED - -#if (STM32_LSECLK == 0) -#error "LSE frequency not defined" -#endif - -#if STM32_CECSW == STM32_CECSW_LSE -#error "LSE not enabled, required by STM32_CECSW" -#endif - -#if STM32_USART1SW == STM32_USART1SW_LSE -#error "LSE not enabled, required by STM32_USART1SW" -#endif - -#if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) -#error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" -#endif - -#else /* !STM32_LSE_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSE -#error "LSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSE_ENABLED */ - -/* PLL activation conditions.*/ -#if (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) || \ - defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLL TRUE -#else -#define STM32_ACTIVATE_PLL FALSE -#endif - -/* HSE prescaler setting check.*/ -#if (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV1) && \ - (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV2) -#error "invalid STM32_PLLXTPRE value specified" -#endif - -/** - * @brief PLLMUL field. - */ -#if ((STM32_PLLMUL_VALUE >= 2) && (STM32_PLLMUL_VALUE <= 16)) || \ - defined(__DOXYGEN__) -#define STM32_PLLMUL ((STM32_PLLMUL_VALUE - 2) << 18) -#else -#error "invalid STM32_PLLMUL_VALUE value specified" -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) -#if STM32_PLLXTPRE == STM32_PLLXTPRE_DIV1 -#define STM32_PLLCLKIN (STM32_HSECLK / 1) -#else -#define STM32_PLLCLKIN (STM32_HSECLK / 2) -#endif -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN (STM32_HSICLK / 2) -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* PLL input frequency range check.*/ -#if (STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX) -#error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) - -/* PLL output frequency range check.*/ -#if (STM32_PLLCLKOUT < STM32_PLLOUT_MIN) || (STM32_PLLCLKOUT > STM32_PLLOUT_MAX) -#error "STM32_PLLCLKOUT outside acceptable range (STM32_PLLOUT_MIN...STM32_PLLOUT_MAX)" -#endif - -/** - * @brief System clock source. - */ -#if (STM32_SW == STM32_SW_PLL) || defined(__DOXYGEN__) -#define STM32_SYSCLK STM32_PLLCLKOUT -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#else -#error "invalid STM32_SYSCLK_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* AHB frequency check.*/ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB frequency. - */ -#if (STM32_PPRE == STM32_PPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK (STM32_HCLK / 1) -#elif STM32_PPRE == STM32_PPRE_DIV2 -#define STM32_PCLK (STM32_HCLK / 2) -#elif STM32_PPRE == STM32_PPRE_DIV4 -#define STM32_PCLK (STM32_HCLK / 4) -#elif STM32_PPRE == STM32_PPRE_DIV8 -#define STM32_PCLK (STM32_HCLK / 8) -#elif STM32_PPRE == STM32_PPRE_DIV16 -#define STM32_PCLK (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE value specified" -#endif - -/* APB frequency check.*/ -#if STM32_PCLK > STM32_PCLK_MAX -#error "STM32_PCLK exceeding maximum frequency (STM32_PCLK_MAX)" -#endif - -/** - * @brief RTC clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_LSE) || defined(__DOXYGEN__) -#define STM32_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM32_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM32_RTCCLK (STM32_HSECLK / 32) -#elif STM32_RTCSEL == STM32_RTCSEL_NOCLOCK -#define STM32_RTCCLK 0 -#else -#error "invalid source selected for RTC clock" -#endif - -/** - * @brief ADC frequency. - */ -#if STM32_ADCSW == STM32_ADCSW_HSI14 -#define STM32_ADCCLK STM32_HSI14CLK -#elif STM32_ADCSW == STM32_ADCSW_PCLK -#if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__) -#define STM32_ADCCLK (STM32_PCLK / 2) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV4 -#define STM32_ADCCLK (STM32_PCLK / 4) -#else -#error "invalid STM32_ADCPRE value specified" -#endif -#else -#error "invalid source selected for ADC clock" -#endif - -/* ADC frequency check.*/ -#if STM32_ADCCLK > STM32_ADCCLK_MAX -#error "STM32_ADCCLK exceeding maximum frequency (STM32_ADCCLK_MAX)" -#endif - -/** - * @brief CEC frequency. - */ -#if STM32_CECSW == STM32_CECSW_HSI -#define STM32_CECCLK STM32_HSICLK -#elif STM32_CECSW == STM32_CECSW_LSE -#define STM32_CECCLK STM32_LSECLK -#else -#error "invalid source selected for CEC clock" -#endif - -/** - * @brief I2C1 frequency. - */ -#if STM32_I2CSW == STM32_I2C1SW_HSI -#define STM32_I2C1CLK STM32_HSICLK -#elif STM32_I2CSW == STM32_I2C1SW_SYSCLK -#define STM32_I2C1CLK STM32_SYSCLK -#else -#error "invalid source selected for I2C1 clock" -#endif - -/** - * @brief USART1 frequency. - */ -#if STM32_USART1SW == STM32_USART1SW_PCLK -#define STM32_USART1CLK STM32_PCLK -#elif STM32_USART1SW == STM32_USART1SW_SYSCLK -#define STM32_USART1CLK STM32_SYSCLK -#elif STM32_USART1SW == STM32_USART1SW_LSECLK -#define STM32_USART1CLK STM32_LSECLK -#elif STM32_USART1SW == STM32_USART1SW_HSICLK -#define STM32_USART1CLK STM32_HSICLK -#else -#error "invalid source selected for USART1 clock" -#endif - -/** - * @brief Timers clock. - */ -#if (STM32_PPRE == STM32_PPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK * 1) -#define STM32_TIMCLK2 (STM32_PCLK * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK * 2) -#define STM32_TIMCLK2 (STM32_PCLK * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= 24000000) || defined(__DOXYGEN__) -#define STM32_FLASHBITS 0x00000010 -#else -#define STM32_FLASHBITS 0x00000011 -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* STM32 ISR, DMA and RCC helpers.*/ -#include "stm32_isr.h" -#include "stm32_dma.h" -#include "stm32_rcc.h" - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void stm32_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/platform.dox b/os/hal/platforms/STM32F0xx/platform.dox deleted file mode 100644 index dcbd78040c..0000000000 --- a/os/hal/platforms/STM32F0xx/platform.dox +++ /dev/null @@ -1,296 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32F0xx_DRIVERS STM32F0xx Drivers - * @details This section describes all the supported drivers on the STM32F0xx - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup STM32F0xx_HAL STM32F0xx Initialization Support - * @details The STM32F0xx HAL support is responsible for system initialization. - * - * @section stm32f0xx_hal_1 Supported HW resources - * - PLL1. - * - RCC. - * - Flash. - * . - * @section stm32f0xx_hal_2 STM32F0xx HAL driver implementation features - * - PLL startup and stabilization. - * - Clock tree initialization. - * - Clock source selection. - * - Flash wait states initialization based on the selected clock options. - * - SYSTICK initialization based on current clock and kernel required rate. - * - DMA support initialization. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_ADC STM32F0xx ADC Support - * @details The STM32F0xx ADC driver supports the ADC peripherals using DMA - * channels for maximum performance. - * - * @section stm32f0xx_adc_1 Supported HW resources - * - ADC1. - * - DMA1. - * . - * @section stm32f0xx_adc_2 STM32F0xx ADC driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Streaming conversion using DMA for maximum performance. - * - Programmable ADC interrupt priority level. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - DMA errors detection. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_EXT STM32F0xx EXT Support - * @details The STM32F0xx EXT driver uses the EXTI peripheral. - * - * @section stm32f0xx_ext_1 Supported HW resources - * - EXTI. - * . - * @section stm32f0xx_ext_2 STM32F0xx EXT driver implementation features - * - Each EXTI channel can be independently enabled and programmed. - * - Programmable EXTI interrupts priority level. - * - Capability to work as event sources (WFE) rather than interrupt sources. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_GPT STM32F0xx GPT Support - * @details The STM32F0xx GPT driver uses the TIMx peripherals. - * - * @section stm32f0xx_gpt_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * . - * @section stm32f0xx_gpt_2 STM32F0xx GPT driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_ICU STM32F0xx ICU Support - * @details The STM32F0xx ICU driver uses the TIMx peripherals. - * - * @section stm32f0xx_icu_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * . - * @section stm32f0xx_icu_2 STM32F0xx ICU driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_PAL STM32F0xx PAL Support - * @details The STM32F0xx PAL driver uses the GPIO peripherals. - * - * @section stm32f0xx_pal_1 Supported HW resources - * - GPIOA. - * - GPIOB. - * - GPIOC. - * - GPIOD. - * - GPIOF. - * . - * @section stm32f0xx_pal_2 STM32F0xx PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 16 bits wide ports. - * - Atomic set/reset functions. - * - Atomic set+reset function (atomic bus operations). - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section stm32f0xx_pal_3 Supported PAL setup modes - * The STM32F0xx PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_INPUT_PULLDOWN. - * - @p PAL_MODE_INPUT_ANALOG. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * - @p PAL_MODE_ALTERNATE (non standard). - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section stm32f0xx_pal_4 Suboptimal behavior - * The STM32F0xx GPIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_PWM STM32F0xx PWM Support - * @details The STM32F0xx PWM driver uses the TIMx peripherals. - * - * @section stm32f0xx_pwm_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * . - * @section stm32f0xx_pwm_2 STM32F0xx PWM driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Four independent PWM channels per timer. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_SERIAL STM32F0xx Serial Support - * @details The STM32F0xx Serial driver uses the USART/UART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section stm32f0xx_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * . - * @section stm32f0xx_serial_2 STM32F0xx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable priority levels for each UART/USART. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_SPI STM32F0xx SPI Support - * @details The SPI driver supports the STM32F0xx SPI peripherals using DMA - * channels for maximum performance. - * - * @section stm32f0xx_spi_1 Supported HW resources - * - SPI1. - * - SPI2. - * - DMA1. - * . - * @section stm32f0xx_spi_2 STM32F0xx SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SPI can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each SPI. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_UART STM32F0xx UART Support - * @details The UART driver supports the STM32F0xx USART peripherals using DMA - * channels for maximum performance. - * - * @section stm32f0xx_uart_1 Supported HW resources - * The UART driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - DMA1. - * . - * @section stm32f0xx_uart_2 STM32F0xx UART driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each UART/USART. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_PLATFORM_DRIVERS STM32F0xx Platform Drivers - * @details Platform support drivers. Platform drivers do not implement HAL - * standard driver templates, their role is to support platform - * specific functionalities. - * - * @ingroup STM32F0xx_DRIVERS - */ - -/** - * @defgroup STM32F0xx_DMA STM32F0xx DMA Support - * @details This DMA helper driver is used by the other drivers in order to - * access the shared DMA resources in a consistent way. - * - * @section stm32f0xx_dma_1 Supported HW resources - * The DMA driver can support any of the following hardware resources: - * - DMA1. - * - DMA2 (where present). - * . - * @section stm32f0xx_dma_2 STM32F0xx DMA driver implementation features - * - Exports helper functions/macros to the other drivers that share the - * DMA resource. - * - Automatic DMA clock stop when not in use by any driver. - * - DMA streams and interrupt vectors sharing among multiple drivers. - * . - * @ingroup STM32F0xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32F0xx_ISR STM32F0xx ISR Support - * @details This ISR helper driver is used by the other drivers in order to - * map ISR names to physical vector names. - * - * @ingroup STM32F0xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32F0xx_RCC STM32F0xx RCC Support - * @details This RCC helper driver is used by the other drivers in order to - * access the shared RCC resources in a consistent way. - * - * @section stm32f0xx_rcc_1 Supported HW resources - * - RCC. - * . - * @section stm32f0xx_rcc_2 STM32F0xx RCC driver implementation features - * - Peripherals reset. - * - Peripherals clock enable. - * - Peripherals clock disable. - * . - * @ingroup STM32F0xx_PLATFORM_DRIVERS - */ diff --git a/os/hal/platforms/STM32F0xx/platform.mk b/os/hal/platforms/STM32F0xx/platform.mk deleted file mode 100644 index 8586a69907..0000000000 --- a/os/hal/platforms/STM32F0xx/platform.mk +++ /dev/null @@ -1,19 +0,0 @@ -# List of all the STM32F0xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F0xx/stm32_dma.c \ - ${CHIBIOS}/os/hal/platforms/STM32F0xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F0xx/adc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F0xx/ext_lld_isr.c \ - ${CHIBIOS}/os/hal/platforms/STM32/ext_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv2/uart_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F0xx \ - ${CHIBIOS}/os/hal/platforms/STM32 \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2 \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv2 diff --git a/os/hal/platforms/STM32F0xx/stm32_dma.c b/os/hal/platforms/STM32F0xx/stm32_dma.c deleted file mode 100644 index f5191f954d..0000000000 --- a/os/hal/platforms/STM32F0xx/stm32_dma.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/stm32_dma.c - * @brief DMA helper driver code. - * - * @addtogroup STM32F0xx_DMA - * @details DMA sharing helper driver. In the STM32 the DMA streams are a - * shared resource, this driver allows to allocate and free DMA - * streams at runtime in order to allow all the other device - * drivers to coordinate the access to the resource. - * @note The DMA ISR handlers are all declared into this module because - * sharing, the various device drivers can associate a callback to - * ISRs when allocating streams. - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/* The following macro is only defined if some driver requiring DMA services - has been enabled.*/ -#if defined(STM32_DMA_REQUIRED) || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/** - * @brief Mask of the DMA1 streams in @p dma_streams_mask. - */ -#define STM32_DMA1_STREAMS_MASK 0x0000007F - -/** - * @brief Mask of the DMA2 streams in @p dma_streams_mask. - */ -#define STM32_DMA2_STREAMS_MASK 0x00000F80 - -/** - * @brief Post-reset value of the stream CCR register. - */ -#define STM32_DMA_CCR_RESET_VALUE 0x00000000 - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief DMA streams descriptors. - * @details This table keeps the association between an unique stream - * identifier and the involved physical registers. - * @note Don't use this array directly, use the appropriate wrapper macros - * instead: @p STM32_DMA1_STREAM1, @p STM32_DMA1_STREAM2 etc. - */ -const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS] = { - {DMA1_Channel1, &DMA1->IFCR, 0, 0, DMA1_Channel1_IRQn}, - {DMA1_Channel2, &DMA1->IFCR, 4, 1, DMA1_Channel2_3_IRQn}, - {DMA1_Channel3, &DMA1->IFCR, 8, 2, DMA1_Channel2_3_IRQn}, - {DMA1_Channel4, &DMA1->IFCR, 12, 3, DMA1_Channel4_5_IRQn}, - {DMA1_Channel5, &DMA1->IFCR, 16, 4, DMA1_Channel4_5_IRQn} -}; - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief DMA ISR redirector type. - */ -typedef struct { - stm32_dmaisr_t dma_func; /**< @brief DMA callback function. */ - void *dma_param; /**< @brief DMA callback parameter. */ -} dma_isr_redir_t; - -/** - * @brief Mask of the allocated streams. - */ -static uint32_t dma_streams_mask; - -/** - * @brief DMA IRQ redirectors. - */ -static dma_isr_redir_t dma_isr_redir[STM32_DMA_STREAMS]; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief DMA1 stream 1 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 0) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[0].dma_func) - dma_isr_redir[0].dma_func(dma_isr_redir[0].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 streams 2 and 3 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch2_3_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - /* Check on channel 2.*/ - flags = (DMA1->ISR >> 4) & STM32_DMA_ISR_MASK; - if (flags & STM32_DMA_ISR_MASK) { - DMA1->IFCR = STM32_DMA_ISR_MASK << 4; - if (dma_isr_redir[1].dma_func) - dma_isr_redir[1].dma_func(dma_isr_redir[1].dma_param, flags); - } - - /* Check on channel 3.*/ - flags = (DMA1->ISR >> 8) & STM32_DMA_ISR_MASK; - if (flags & STM32_DMA_ISR_MASK) { - DMA1->IFCR = STM32_DMA_ISR_MASK << 8; - if (dma_isr_redir[2].dma_func) - dma_isr_redir[2].dma_func(dma_isr_redir[2].dma_param, flags); - } - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 streams 4 and 5 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch4_5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - /* Check on channel 4.*/ - flags = (DMA1->ISR >> 12) & STM32_DMA_ISR_MASK; - if (flags & STM32_DMA_ISR_MASK) { - DMA1->IFCR = STM32_DMA_ISR_MASK << 12; - if (dma_isr_redir[3].dma_func) - dma_isr_redir[3].dma_func(dma_isr_redir[3].dma_param, flags); - } - - /* Check on channel 5.*/ - flags = (DMA1->ISR >> 16) & STM32_DMA_ISR_MASK; - if (flags & STM32_DMA_ISR_MASK) { - DMA1->IFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[4].dma_func) - dma_isr_redir[4].dma_func(dma_isr_redir[4].dma_param, flags); - } - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA helper initialization. - * - * @init - */ -void dmaInit(void) { - int i; - - dma_streams_mask = 0; - for (i = 0; i < STM32_DMA_STREAMS; i++) { - _stm32_dma_streams[i].channel->CCR = 0; - dma_isr_redir[i].dma_func = NULL; - } - DMA1->IFCR = 0xFFFFFFFF; -} - -/** - * @brief Allocates a DMA stream. - * @details The stream is allocated and, if required, the DMA clock enabled. - * The function also enables the IRQ vector associated to the stream - * and initializes its priority. - * @pre The stream must not be already in use or an error is returned. - * @post The stream is allocated and the default ISR handler redirected - * to the specified function. - * @post The stream ISR vector is enabled and its priority configured. - * @post The stream must be freed using @p dmaStreamRelease() before it can - * be reused with another peripheral. - * @post The stream is in its post-reset state. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] priority IRQ priority mask for the DMA stream - * @param[in] func handling function pointer, can be @p NULL - * @param[in] param a parameter to be passed to the handling function - * @return The operation status. - * @retval FALSE no error, stream taken. - * @retval TRUE error, stream already taken. - * - * @special - */ -bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param) { - - chDbgCheck(dmastp != NULL, "dmaAllocate"); - - /* Checks if the stream is already taken.*/ - if ((dma_streams_mask & (1 << dmastp->selfindex)) != 0) - return TRUE; - - /* Marks the stream as allocated.*/ - dma_isr_redir[dmastp->selfindex].dma_func = func; - dma_isr_redir[dmastp->selfindex].dma_param = param; - dma_streams_mask |= (1 << dmastp->selfindex); - - /* Enabling DMA clocks required by the current streams set.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) != 0) - rccEnableDMA1(FALSE); - - /* Putting the stream in a safe state.*/ - dmaStreamDisable(dmastp); - dmastp->channel->CCR = STM32_DMA_CCR_RESET_VALUE; - - /* Enables the associated IRQ vector if a callback is defined.*/ - if (func != NULL) - nvicEnableVector(dmastp->vector, CORTEX_PRIORITY_MASK(priority)); - - return FALSE; -} - -/** - * @brief Releases a DMA stream. - * @details The stream is freed and, if required, the DMA clock disabled. - * Trying to release a unallocated stream is an illegal operation - * and is trapped if assertions are enabled. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post The stream is again available. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -void dmaStreamRelease(const stm32_dma_stream_t *dmastp) { - - chDbgCheck(dmastp != NULL, "dmaRelease"); - - /* Check if the streams is not taken.*/ - chDbgAssert((dma_streams_mask & (1 << dmastp->selfindex)) != 0, - "dmaRelease(), #1", "not allocated"); - - /* Disables the associated IRQ vector.*/ - nvicDisableVector(dmastp->vector); - - /* Marks the stream as not allocated.*/ - dma_streams_mask &= ~(1 << dmastp->selfindex); - - /* Shutting down clocks that are no more required, if any.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) == 0) - rccDisableDMA1(FALSE); -} - -#endif /* STM32_DMA_REQUIRED */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/stm32_dma.h b/os/hal/platforms/STM32F0xx/stm32_dma.h deleted file mode 100644 index b1e06e6b5c..0000000000 --- a/os/hal/platforms/STM32F0xx/stm32_dma.h +++ /dev/null @@ -1,395 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/stm32_dma.h - * @brief DMA helper driver header. - * @note This file requires definitions from the ST header file stm32f0xx.h. - * @note This driver uses the new naming convention used for the STM32F2xx - * so the "DMA channels" are referred as "DMA streams". - * - * @addtogroup STM32F0xx_DMA - * @{ - */ - -#ifndef _STM32_DMA_H_ -#define _STM32_DMA_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Total number of DMA streams. - * @note This is the total number of streams among all the DMA units. - */ -#define STM32_DMA_STREAMS 5 - -/** - * @brief Mask of the ISR bits passed to the DMA callback functions. - */ -#define STM32_DMA_ISR_MASK 0x0F - -/** - * @brief Returns the channel associated to the specified stream. - * - * @param[in] n the stream number (0...STM32_DMA_STREAMS-1) - * @param[in] c a stream/channel association word, one channel per - * nibble, not associated channels must be set to 0xF - * @return Always zero, in this platform there is no dynamic - * association between streams and channels. - */ -#define STM32_DMA_GETCHANNEL(n, c) 0 - -/** - * @brief Checks if a DMA priority is within the valid range. - * @param[in] prio DMA priority - * - * @retval The check result. - * @retval FALSE invalid DMA priority. - * @retval TRUE correct DMA priority. - */ -#define STM32_DMA_IS_VALID_PRIORITY(prio) (((prio) >= 0) && ((prio) <= 3)) - -/** - * @brief Returns an unique numeric identifier for a DMA stream. - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return An unique numeric stream identifier. - */ -#define STM32_DMA_STREAM_ID(dma, stream) ((stream) - 1) - -/** - * @brief Returns a DMA stream identifier mask. - * - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return A DMA stream identifier mask. - */ -#define STM32_DMA_STREAM_ID_MSK(dma, stream) \ - (1 << STM32_DMA_STREAM_ID(dma, stream)) - -/** - * @brief Checks if a DMA stream unique identifier belongs to a mask. - * @param[in] id the stream numeric identifier - * @param[in] mask the stream numeric identifiers mask - * - * @retval The check result. - * @retval FALSE id does not belong to the mask. - * @retval TRUE id belongs to the mask. - */ -#define STM32_DMA_IS_VALID_ID(id, mask) (((1 << (id)) & (mask))) - -/** - * @name DMA streams identifiers - * @{ - */ -/** - * @brief Returns a pointer to a stm32_dma_stream_t structure. - * - * @param[in] id the stream numeric identifier - * @return A pointer to the stm32_dma_stream_t constant structure - * associated to the DMA stream. - */ -#define STM32_DMA_STREAM(id) (&_stm32_dma_streams[id]) - -#define STM32_DMA1_STREAM1 STM32_DMA_STREAM(0) -#define STM32_DMA1_STREAM2 STM32_DMA_STREAM(1) -#define STM32_DMA1_STREAM3 STM32_DMA_STREAM(2) -#define STM32_DMA1_STREAM4 STM32_DMA_STREAM(3) -#define STM32_DMA1_STREAM5 STM32_DMA_STREAM(4) -/** @} */ - -/** - * @name CR register constants common to all DMA types - * @{ - */ -#define STM32_DMA_CR_EN DMA_CCR_EN -#define STM32_DMA_CR_TEIE DMA_CCR_TEIE -#define STM32_DMA_CR_HTIE DMA_CCR_HTIE -#define STM32_DMA_CR_TCIE DMA_CCR_TCIE -#define STM32_DMA_CR_DIR_MASK (DMA_CCR_DIR | DMA_CCR_MEM2MEM) -#define STM32_DMA_CR_DIR_P2M 0 -#define STM32_DMA_CR_DIR_M2P DMA_CCR_DIR -#define STM32_DMA_CR_DIR_M2M DMA_CCR_MEM2MEM -#define STM32_DMA_CR_CIRC DMA_CCR_CIRC -#define STM32_DMA_CR_PINC DMA_CCR_PINC -#define STM32_DMA_CR_MINC DMA_CCR_MINC -#define STM32_DMA_CR_PSIZE_MASK DMA_CCR_PSIZE -#define STM32_DMA_CR_PSIZE_BYTE 0 -#define STM32_DMA_CR_PSIZE_HWORD DMA_CCR_PSIZE_0 -#define STM32_DMA_CR_PSIZE_WORD DMA_CCR_PSIZE_1 -#define STM32_DMA_CR_MSIZE_MASK DMA_CCR_MSIZE -#define STM32_DMA_CR_MSIZE_BYTE 0 -#define STM32_DMA_CR_MSIZE_HWORD DMA_CCR_MSIZE_0 -#define STM32_DMA_CR_MSIZE_WORD DMA_CCR_MSIZE_1 -#define STM32_DMA_CR_SIZE_MASK (STM32_DMA_CR_MSIZE_MASK | \ - STM32_DMA_CR_MSIZE_MASK) -#define STM32_DMA_CR_PL_MASK DMA_CCR_PL -#define STM32_DMA_CR_PL(n) ((n) << 12) -/** @} */ - -/** - * @name CR register constants only found in enhanced DMA - * @{ - */ -#define STM32_DMA_CR_DMEIE 0 /**< @brief Ignored by normal DMA. */ -#define STM32_DMA_CR_CHSEL_MASK 0 /**< @brief Ignored by normal DMA. */ -#define STM32_DMA_CR_CHSEL(n) 0 /**< @brief Ignored by normal DMA. */ -/** @} */ - -/** - * @name Status flags passed to the ISR callbacks - * @{ - */ -#define STM32_DMA_ISR_FEIF 0 -#define STM32_DMA_ISR_DMEIF 0 -#define STM32_DMA_ISR_TEIF DMA_ISR_TEIF1 -#define STM32_DMA_ISR_HTIF DMA_ISR_HTIF1 -#define STM32_DMA_ISR_TCIF DMA_ISR_TCIF1 -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA stream descriptor structure. - */ -typedef struct { - DMA_Channel_TypeDef *channel; /**< @brief Associated DMA channel. */ - volatile uint32_t *ifcr; /**< @brief Associated IFCR reg. */ - uint8_t ishift; /**< @brief Bits offset in xIFCR - register. */ - uint8_t selfindex; /**< @brief Index to self in array. */ - uint8_t vector; /**< @brief Associated IRQ vector. */ -} stm32_dma_stream_t; - -/** - * @brief STM32 DMA ISR function type. - * - * @param[in] p parameter for the registered function - * @param[in] flags pre-shifted content of the ISR register, the bits - * are aligned to bit zero - */ -typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags); - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Macro Functions - * @{ - */ -/** - * @brief Associates a peripheral data register to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the CPAR register - * - * @special - */ -#define dmaStreamSetPeripheral(dmastp, addr) { \ - (dmastp)->channel->CPAR = (uint32_t)(addr); \ -} - -/** - * @brief Associates a memory destination to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the CMAR register - * - * @special - */ -#define dmaStreamSetMemory0(dmastp, addr) { \ - (dmastp)->channel->CMAR = (uint32_t)(addr); \ -} - -/** - * @brief Sets the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] size value to be written in the CNDTR register - * - * @special - */ -#define dmaStreamSetTransactionSize(dmastp, size) { \ - (dmastp)->channel->CNDTR = (uint32_t)(size); \ -} - -/** - * @brief Returns the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @return The number of transfers to be performed. - * - * @special - */ -#define dmaStreamGetTransactionSize(dmastp) ((size_t)((dmastp)->channel->CNDTR)) - -/** - * @brief Programs the stream mode settings. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register - * - * @special - */ -#define dmaStreamSetMode(dmastp, mode) { \ - (dmastp)->channel->CCR = (uint32_t)(mode); \ -} - -/** - * @brief DMA stream enable. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamEnable(dmastp) { \ - (dmastp)->channel->CCR |= STM32_DMA_CR_EN; \ -} - -/** - * @brief DMA stream disable. - * @details The function disables the specified stream and then clears any - * pending interrupt. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamDisable(dmastp) { \ - (dmastp)->channel->CCR &= ~STM32_DMA_CR_EN; \ - dmaStreamClearInterrupt(dmastp); \ -} - -/** - * @brief DMA stream interrupt sources clear. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamClearInterrupt(dmastp) { \ - *(dmastp)->ifcr = STM32_DMA_ISR_MASK << (dmastp)->ishift; \ -} - -/** - * @brief Starts a memory to memory operation using the specified stream. - * @note The default transfer data mode is "byte to byte" but it can be - * changed by specifying extra options in the @p mode parameter. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register, this value - * is implicitly ORed with: - * - @p STM32_DMA_CR_MINC - * - @p STM32_DMA_CR_PINC - * - @p STM32_DMA_CR_DIR_M2M - * - @p STM32_DMA_CR_EN - * . - * @param[in] src source address - * @param[in] dst destination address - * @param[in] n number of data units to copy - */ -#define dmaStartMemCopy(dmastp, mode, src, dst, n) { \ - dmaStreamSetPeripheral(dmastp, src); \ - dmaStreamSetMemory0(dmastp, dst); \ - dmaStreamSetTransactionSize(dmastp, n); \ - dmaStreamSetMode(dmastp, (mode) | \ - STM32_DMA_CR_MINC | STM32_DMA_CR_PINC | \ - STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN); \ -} - -/** - * @brief Polled wait for DMA transfer end. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - */ -#define dmaWaitCompletion(dmastp) { \ - while ((dmastp)->channel->CNDTR > 0) \ - ; \ - dmaStreamDisable(dmastp); \ -} -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS]; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void dmaInit(void); - bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param); - void dmaStreamRelease(const stm32_dma_stream_t *dmastp); -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_DMA_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/stm32_isr.h b/os/hal/platforms/STM32F0xx/stm32_isr.h deleted file mode 100644 index 8d7a2875ac..0000000000 --- a/os/hal/platforms/STM32F0xx/stm32_isr.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/stm32_isr.h - * @brief ISR remapper driver header. - * - * @addtogroup STM32F0xx_ISR - * @{ - */ - -#ifndef _STM32_ISR_H_ -#define _STM32_ISR_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name ISR names and numbers remapping - * @{ - */ -/* - * TIM units. - */ -#define STM32_TIM1_UP_HANDLER TIM1_BRK_UP_TRG_COM_IRQHandler -#define STM32_TIM1_CC_HANDLER TIM1_CC_IRQHandler -#define STM32_TIM2_HANDLER TIM2_IRQHandler -#define STM32_TIM3_HANDLER TIM3_IRQHandler - -#define STM32_TIM1_UP_NUMBER TIM1_BRK_UP_TRG_COM_IRQn -#define STM32_TIM1_CC_NUMBER TIM1_CC_IRQn -#define STM32_TIM2_NUMBER TIM2_IRQn -#define STM32_TIM3_NUMBER TIM3_IRQn - -/* - * USART units. - */ -#define STM32_USART1_HANDLER USART1_IRQHandler -#define STM32_USART2_HANDLER USART2_IRQHandler - -#define STM32_USART1_NUMBER USART1_IRQn -#define STM32_USART2_NUMBER USART2_IRQn -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#endif /* _STM32_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/stm32_rcc.h b/os/hal/platforms/STM32F0xx/stm32_rcc.h deleted file mode 100644 index d10aa6de71..0000000000 --- a/os/hal/platforms/STM32F0xx/stm32_rcc.h +++ /dev/null @@ -1,546 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F0xx/stm32_rcc.h - * @brief RCC helper driver header. - * @note This file requires definitions from the ST header file - * @p stm32f0xx.h. - * - * @addtogroup STM32F0xx_RCC - * @{ - */ - -#ifndef _STM32_RCC_ -#define _STM32_RCC_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Generic RCC operations - * @{ - */ -/** - * @brief Enables the clock of one or more peripheral on the APB1 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB1(mask, lp) { \ - RCC->APB1ENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB1 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB1(mask, lp) { \ - RCC->APB1ENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * - * @api - */ -#define rccResetAPB1(mask) { \ - RCC->APB1RSTR |= (mask); \ - RCC->APB1RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the APB2 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB2(mask, lp) { \ - RCC->APB2ENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB2 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB2(mask, lp) { \ - RCC->APB2ENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * - * @api - */ -#define rccResetAPB2(mask) { \ - RCC->APB2RSTR |= (mask); \ - RCC->APB2RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the AHB bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask AHB peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAHB(mask, lp) { \ - RCC->AHBENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the AHB bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask AHB peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAHB(mask, lp) { \ - RCC->AHBENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the AHB bus. - * - * @param[in] mask AHB peripherals mask - * - * @api - */ -#define rccResetAHB(mask) { \ - RCC->AHBRSTR |= (mask); \ - RCC->AHBRSTR = 0; \ -} -/** @} */ - -/** - * @name ADC peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the ADC1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableADC1(lp) rccEnableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Disables the ADC1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableADC1(lp) rccDisableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Resets the ADC1 peripheral. - * - * @api - */ -#define rccResetADC1() rccResetAPB2(RCC_APB2RSTR_ADC1RST) -/** @} */ - -/** - * @name PWR interface specific RCC operations - * @{ - */ -/** - * @brief Enables the PWR interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnablePWRInterface(lp) rccEnableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Disables PWR interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisablePWRInterface(lp) rccDisableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Resets the PWR interface. - * - * @api - */ -#define rccResetPWRInterface() rccResetAPB1(RCC_APB1RSTR_PWRRST) -/** @} */ - -/** - * @name DMA peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the DMA1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableDMA1(lp) rccEnableAHB(RCC_AHBENR_DMA1EN, lp) - -/** - * @brief Disables the DMA1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableDMA1(lp) rccDisableAHB(RCC_AHBENR_DMA1EN, lp) - -/** - * @brief Resets the DMA1 peripheral. - * @note Not supported in this family, does nothing. - * - * @api - */ -#define rccResetDMA1() -/** @} */ - -/** - * @name I2C peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the I2C1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C1(lp) rccEnableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Disables the I2C1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C1(lp) rccDisableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Resets the I2C1 peripheral. - * - * @api - */ -#define rccResetI2C1() rccResetAPB1(RCC_APB1RSTR_I2C1RST) - -/** - * @brief Enables the I2C2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C2(lp) rccEnableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Disables the I2C2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C2(lp) rccDisableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Resets the I2C2 peripheral. - * - * @api - */ -#define rccResetI2C2() rccResetAPB1(RCC_APB1RSTR_I2C2RST) -/** @} */ - -/** - * @name SPI peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the SPI1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI1(lp) rccEnableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Disables the SPI1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI1(lp) rccDisableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Resets the SPI1 peripheral. - * - * @api - */ -#define rccResetSPI1() rccResetAPB2(RCC_APB2RSTR_SPI1RST) - -/** - * @brief Enables the SPI2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI2(lp) rccEnableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Disables the SPI2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI2(lp) rccDisableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Resets the SPI2 peripheral. - * - * @api - */ -#define rccResetSPI2() rccResetAPB1(RCC_APB1RSTR_SPI2RST) -/** @} */ - -/** - * @name TIM peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the TIM1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM1(lp) rccEnableAPB2(RCC_APB2ENR_TIM1EN, lp) - -/** - * @brief Disables the TIM1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM1(lp) rccDisableAPB2(RCC_APB2ENR_TIM1EN, lp) - -/** - * @brief Resets the TIM1 peripheral. - * - * @api - */ -#define rccResetTIM1() rccResetAPB2(RCC_APB2RSTR_TIM1RST) - -/** - * @brief Enables the TIM2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM2(lp) rccEnableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Disables the TIM2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM2(lp) rccDisableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Resets the TIM2 peripheral. - * - * @api - */ -#define rccResetTIM2() rccResetAPB1(RCC_APB1RSTR_TIM2RST) - -/** - * @brief Enables the TIM3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM3(lp) rccEnableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Disables the TIM3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM3(lp) rccDisableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Resets the TIM3 peripheral. - * - * @api - */ -#define rccResetTIM3() rccResetAPB1(RCC_APB1RSTR_TIM3RST) -/** @} */ - -/** - * @name USART/UART peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the USART1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART1(lp) rccEnableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Disables the USART1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART1(lp) rccDisableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Resets the USART1 peripheral. - * - * @api - */ -#define rccResetUSART1() rccResetAPB2(RCC_APB2RSTR_USART1RST) - -/** - * @brief Enables the USART2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART2(lp) rccEnableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Disables the USART2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART2(lp) rccDisableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Resets the USART2 peripheral. - * - * @api - */ -#define rccResetUSART2() rccResetAPB1(RCC_APB1RSTR_USART2RST) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_RCC_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F0xx/stm32f0xx.h b/os/hal/platforms/STM32F0xx/stm32f0xx.h deleted file mode 100644 index b041e5e12a..0000000000 --- a/os/hal/platforms/STM32F0xx/stm32f0xx.h +++ /dev/null @@ -1,3221 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f0xx.h - * @author MCD Application Team - * @version V1.0.1 - * @date 20-April-2012 - * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32F0xx devices. - * - * The file is the unique include file that the application programmer - * is using in the C source code, usually in main.c. This file contains: - * - Configuration section that allows to select: - * - The device used in the target application - * - To use or not the peripheral’s drivers in application code(i.e. - * code will be based on direct access to peripheral’s registers - * rather than drivers API), this option is controlled by - * "#define USE_STDPERIPH_DRIVER" - * - To change few application-specific parameters such as the HSE - * crystal frequency - * - Data structures and the address mapping for all peripherals - * - Peripheral's registers declarations and bits definition - * - Macros to access peripheral’s registers hardware - * - ****************************************************************************** - * @attention - * - *

    © COPYRIGHT 2012 STMicroelectronics

    - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f0xx - * @{ - */ - -#ifndef __STM32F0XX_H -#define __STM32F0XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32F0 device used in your - application - */ - -#if !defined (STM32F0XX) - #define STM32F0XX /*!< STM32F0XX: STM32F0xx devices */ -#endif -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - - STM32F0xx devices are: - - STM32F050xx microcontrollers where the Flash memory density can go up to 32 Kbytes. - - STM32F051xx microcontrollers where the Flash memory density can go up to 64 Kbytes. - */ - -#if !defined (STM32F0XX) - #error "Please select first the target STM32F0xx device used in your application (in stm32f0xx.h file)" -#endif /* STM32F0XX */ - -#if !defined USE_STDPERIPH_DRIVER -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif /* USE_STDPERIPH_DRIVER */ - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined (HSE_VALUE) -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/ -#endif /* HSE_VALUE */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#if !defined (HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup - Timeout value - */ -#if !defined (HSI_STARTUP_TIMEOUT) -#define HSI_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSI start up */ -#endif /* HSI_STARTUP_TIMEOUT */ - -#if !defined (HSI_VALUE) -#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal High Speed oscillator in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI_VALUE */ - -#if !defined (HSI14_VALUE) -#define HSI14_VALUE ((uint32_t)14000000) /*!< Value of the Internal High Speed oscillator for ADC in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* HSI14_VALUE */ - -#if !defined (LSI_VALUE) -#define LSI_VALUE ((uint32_t)40000) /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -#endif /* LSI_VALUE */ - -#if !defined (LSE_VALUE) -#define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -/** - * @brief STM32F0xx Standard Peripheral Library version number V1.0.1 - */ -#define __STM32F0XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F0XX_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32F0XX_STDPERIPH_VERSION_SUB2 (0x01) /*!< [15:8] sub2 version */ -#define __STM32F0XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F0XX_STDPERIPH_VERSION ((__STM32F0XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F0XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F0XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F0XX_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief STM32F0xx Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -#define __CM0_REV 0 /*!< Core Revision r0p0 */ -#define __MPU_PRESENT 0 /*!< STM32F0xx do not provide MPU */ -#define __NVIC_PRIO_BITS 2 /*!< STM32F0xx uses 2 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/*!< Interrupt Number Definition */ -typedef enum IRQn -{ -/****** Cortex-M0 Processor Exceptions Numbers ******************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - HardFault_IRQn = -13, /*!< 3 Cortex-M0 Hard Fault Interrupt */ - SVC_IRQn = -5, /*!< 11 Cortex-M0 SV Call Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M0 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M0 System Tick Interrupt */ - -/****** STM32F-0 specific Interrupt Numbers *********************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detect Interrupt */ - RTC_IRQn = 2, /*!< RTC through EXTI Line Interrupt */ - FLASH_IRQn = 3, /*!< FLASH Interrupt */ - RCC_IRQn = 4, /*!< RCC Interrupt */ - EXTI0_1_IRQn = 5, /*!< EXTI Line 0 and 1 Interrupts */ - EXTI2_3_IRQn = 6, /*!< EXTI Line 2 and 3 Interrupts */ - EXTI4_15_IRQn = 7, /*!< EXTI Line 4 to 15 Interrupts */ - TS_IRQn = 8, /*!< TS Interrupt */ - DMA1_Channel1_IRQn = 9, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_3_IRQn = 10, /*!< DMA1 Channel 2 and Channel 3 Interrupts */ - DMA1_Channel4_5_IRQn = 11, /*!< DMA1 Channel 4 and Channel 5 Interrupts */ - ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */ - TIM1_BRK_UP_TRG_COM_IRQn = 13, /*!< TIM1 Break, Update, Trigger and Commutation Interrupts */ - TIM1_CC_IRQn = 14, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 15, /*!< TIM2 Interrupt */ - TIM3_IRQn = 16, /*!< TIM3 Interrupt */ - TIM6_DAC_IRQn = 17, /*!< TIM6 and DAC Interrupts */ - TIM14_IRQn = 19, /*!< TIM14 Interrupt */ - TIM15_IRQn = 20, /*!< TIM15 Interrupt */ - TIM16_IRQn = 21, /*!< TIM16 Interrupt */ - TIM17_IRQn = 22, /*!< TIM17 Interrupt */ - I2C1_IRQn = 23, /*!< I2C1 Interrupt */ - I2C2_IRQn = 24, /*!< I2C2 Interrupt */ - SPI1_IRQn = 25, /*!< SPI1 Interrupt */ - SPI2_IRQn = 26, /*!< SPI2 Interrupt */ - USART1_IRQn = 27, /*!< USART1 Interrupt */ - USART2_IRQn = 28, /*!< USART2 Interrupt */ - CEC_IRQn = 30 /*!< CEC Interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm0.h" -/* CHIBIOS FIX */ -/*#include "system_stm32f0xx.h"*/ -#include - -/** @addtogroup Exported_types - * @{ - */ - -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; - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t ISR; /*!< ADC Interrupt and Status register, Address offset:0x00 */ - __IO uint32_t IER; /*!< ADC Interrupt Enable register, Address offset:0x04 */ - __IO uint32_t CR; /*!< ADC Control register, Address offset:0x08 */ - __IO uint32_t CFGR1; /*!< ADC Configuration register 1, Address offset:0x0C */ - __IO uint32_t CFGR2; /*!< ADC Configuration register 2, Address offset:0x10 */ - __IO uint32_t SMPR; /*!< ADC Sampling time register, Address offset:0x14 */ - uint32_t RESERVED1; /*!< Reserved, 0x18 */ - uint32_t RESERVED2; /*!< Reserved, 0x1C */ - __IO uint32_t TR; /*!< ADC watchdog threshold register, Address offset:0x20 */ - uint32_t RESERVED3; /*!< Reserved, 0x24 */ - __IO uint32_t CHSELR; /*!< ADC channel selection register, Address offset:0x28 */ - uint32_t RESERVED4[5]; /*!< Reserved, 0x2C */ - __IO uint32_t DR; /*!< ADC data register, Address offset:0x40 */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CCR; -} ADC_Common_TypeDef; - -/** - * @brief HDMI-CEC - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CEC control register, Address offset:0x00 */ - __IO uint32_t CFGR; /*!< CEC configuration register, Address offset:0x04 */ - __IO uint32_t TXDR; /*!< CEC Tx data register , Address offset:0x08 */ - __IO uint32_t RXDR; /*!< CEC Rx Data Register, Address offset:0x0C */ - __IO uint32_t ISR; /*!< CEC Interrupt and Status Register, Address offset:0x10 */ - __IO uint32_t IER; /*!< CEC interrupt enable register, Address offset:0x14 */ -}CEC_TypeDef; - -/** - * @brief Comparator - */ - -typedef struct -{ - __IO uint32_t CSR; /*!< COMP comparator control and status register, Address offset: 0x1C */ -} COMP_TypeDef; - - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ - uint32_t RESERVED2; /*!< Reserved, 0x0C */ - __IO uint32_t INIT; /*!< Initial CRC value register, Address offset: 0x10 */ -} CRC_TypeDef; - - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - uint32_t RESERVED[6]; /*!< Reserved, 0x14 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - uint32_t RESERVED1; /*!< Reserved, 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CCR; /*!< DMA channel x configuration register */ - __IO uint32_t CNDTR; /*!< DMA channel x number of data register */ - __IO uint32_t CPAR; /*!< DMA channel x peripheral address register */ - __IO uint32_t CMAR; /*!< DMA channel x memory address register */ -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register, Address offset: 0x00 */ - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register, Address offset: 0x04 */ -} DMA_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!. -*/ - -/** - * @file STM32F1xx/adc_lld.c - * @brief STM32F1xx ADC subsystem low level driver source. - * - * @addtogroup ADC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief ADC1 driver identifier.*/ -#if STM32_ADC_USE_ADC1 || defined(__DOXYGEN__) -ADCDriver ADCD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Shared ADC DMA ISR service routine. - * - * @param[in] adcp pointer to the @p ADCDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void adc_lld_serve_rx_interrupt(ADCDriver *adcp, uint32_t flags) { - - /* DMA errors handling.*/ - if ((flags & STM32_DMA_ISR_TEIF) != 0) { - /* DMA, this could help only if the DMA tries to access an unmapped - address space or violates alignment rules.*/ - _adc_isr_error_code(adcp, ADC_ERR_DMAFAILURE); - } - else { - if ((flags & STM32_DMA_ISR_HTIF) != 0) { - /* Half transfer processing.*/ - _adc_isr_half_code(adcp); - } - if ((flags & STM32_DMA_ISR_TCIF) != 0) { - /* Transfer complete processing.*/ - _adc_isr_full_code(adcp); - } - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level ADC driver initialization. - * - * @notapi - */ -void adc_lld_init(void) { - -#if STM32_ADC_USE_ADC1 - /* Driver initialization.*/ - adcObjectInit(&ADCD1); - ADCD1.adc = ADC1; - ADCD1.dmastp = STM32_DMA1_STREAM1; - ADCD1.dmamode = STM32_DMA_CR_PL(STM32_ADC_ADC1_DMA_PRIORITY) | - STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PSIZE_HWORD | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE | - STM32_DMA_CR_TEIE; - - /* Temporary activation.*/ - rccEnableADC1(FALSE); - ADC1->CR1 = 0; - ADC1->CR2 = ADC_CR2_ADON; - - /* Reset calibration just to be safe.*/ - ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_RSTCAL; - while ((ADC1->CR2 & ADC_CR2_RSTCAL) != 0) - ; - - /* Calibration.*/ - ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_CAL; - while ((ADC1->CR2 & ADC_CR2_CAL) != 0) - ; - - /* Return the ADC in low power mode.*/ - ADC1->CR2 = 0; - rccDisableADC1(FALSE); -#endif -} - -/** - * @brief Configures and activates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start(ADCDriver *adcp) { - - /* If in stopped state then enables the ADC and DMA clocks.*/ - if (adcp->state == ADC_STOP) { -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) { - bool_t b; - b = dmaStreamAllocate(adcp->dmastp, - STM32_ADC_ADC1_IRQ_PRIORITY, - (stm32_dmaisr_t)adc_lld_serve_rx_interrupt, - (void *)adcp); - chDbgAssert(!b, "adc_lld_start(), #1", "stream already allocated"); - dmaStreamSetPeripheral(adcp->dmastp, &ADC1->DR); - rccEnableADC1(FALSE); - } -#endif - - /* ADC setup, the calibration procedure has already been performed - during initialization.*/ - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - } -} - -/** - * @brief Deactivates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop(ADCDriver *adcp) { - - /* If in ready state then disables the ADC clock.*/ - if (adcp->state == ADC_READY) { -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) { - ADC1->CR1 = 0; - ADC1->CR2 = 0; - dmaStreamRelease(adcp->dmastp); - rccDisableADC1(FALSE); - } -#endif - } -} - -/** - * @brief Starts an ADC conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start_conversion(ADCDriver *adcp) { - uint32_t mode, n, cr2; - const ADCConversionGroup *grpp = adcp->grpp; - - /* DMA setup.*/ - mode = adcp->dmamode; - if (grpp->circular) - mode |= STM32_DMA_CR_CIRC; - if (adcp->depth > 1) { - /* If the buffer depth is greater than one then the half transfer interrupt - interrupt is enabled in order to allows streaming processing.*/ - mode |= STM32_DMA_CR_HTIE; - n = (uint32_t)grpp->num_channels * (uint32_t)adcp->depth; - } - else - n = (uint32_t)grpp->num_channels; - dmaStreamSetMemory0(adcp->dmastp, adcp->samples); - dmaStreamSetTransactionSize(adcp->dmastp, n); - dmaStreamSetMode(adcp->dmastp, mode); - dmaStreamEnable(adcp->dmastp); - - /* ADC setup.*/ - adcp->adc->CR1 = grpp->cr1 | ADC_CR1_SCAN; - cr2 = grpp->cr2 | ADC_CR2_DMA | ADC_CR2_ADON; - if ((cr2 & (ADC_CR2_EXTTRIG | ADC_CR2_JEXTTRIG)) == 0) - cr2 |= ADC_CR2_CONT; - adcp->adc->CR2 = grpp->cr2 | cr2; - adcp->adc->SMPR1 = grpp->smpr1; - adcp->adc->SMPR2 = grpp->smpr2; - adcp->adc->SQR1 = grpp->sqr1; - adcp->adc->SQR2 = grpp->sqr2; - adcp->adc->SQR3 = grpp->sqr3; - - /* ADC start by writing ADC_CR2_ADON a second time.*/ - adcp->adc->CR2 = cr2; -} - -/** - * @brief Stops an ongoing conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop_conversion(ADCDriver *adcp) { - - dmaStreamDisable(adcp->dmastp); - adcp->adc->CR2 = 0; -} - -#endif /* HAL_USE_ADC */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/adc_lld.h b/os/hal/platforms/STM32F1xx/adc_lld.h deleted file mode 100644 index 9f4227e31d..0000000000 --- a/os/hal/platforms/STM32F1xx/adc_lld.h +++ /dev/null @@ -1,397 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/adc_lld.h - * @brief STM32F1xx ADC subsystem low level driver header. - * - * @addtogroup ADC - * @{ - */ - -#ifndef _ADC_LLD_H_ -#define _ADC_LLD_H_ - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Triggers selection - * @{ - */ -#define ADC_CR2_EXTSEL_SRC(n) ((n) << 17) /**< @brief Trigger source. */ -#define ADC_CR2_EXTSEL_SWSTART (7 << 17) /**< @brief Software trigger. */ -/** @} */ - -/** - * @name Available analog channels - * @{ - */ -#define ADC_CHANNEL_IN0 0 /**< @brief External analog input 0. */ -#define ADC_CHANNEL_IN1 1 /**< @brief External analog input 1. */ -#define ADC_CHANNEL_IN2 2 /**< @brief External analog input 2. */ -#define ADC_CHANNEL_IN3 3 /**< @brief External analog input 3. */ -#define ADC_CHANNEL_IN4 4 /**< @brief External analog input 4. */ -#define ADC_CHANNEL_IN5 5 /**< @brief External analog input 5. */ -#define ADC_CHANNEL_IN6 6 /**< @brief External analog input 6. */ -#define ADC_CHANNEL_IN7 7 /**< @brief External analog input 7. */ -#define ADC_CHANNEL_IN8 8 /**< @brief External analog input 8. */ -#define ADC_CHANNEL_IN9 9 /**< @brief External analog input 9. */ -#define ADC_CHANNEL_IN10 10 /**< @brief External analog input 10. */ -#define ADC_CHANNEL_IN11 11 /**< @brief External analog input 11. */ -#define ADC_CHANNEL_IN12 12 /**< @brief External analog input 12. */ -#define ADC_CHANNEL_IN13 13 /**< @brief External analog input 13. */ -#define ADC_CHANNEL_IN14 14 /**< @brief External analog input 14. */ -#define ADC_CHANNEL_IN15 15 /**< @brief External analog input 15. */ -#define ADC_CHANNEL_SENSOR 16 /**< @brief Internal temperature sensor.*/ -#define ADC_CHANNEL_VREFINT 17 /**< @brief Internal reference. */ -/** @} */ - -/** - * @name Sampling rates - * @{ - */ -#define ADC_SAMPLE_1P5 0 /**< @brief 1.5 cycles sampling time. */ -#define ADC_SAMPLE_7P5 1 /**< @brief 7.5 cycles sampling time. */ -#define ADC_SAMPLE_13P5 2 /**< @brief 13.5 cycles sampling time. */ -#define ADC_SAMPLE_28P5 3 /**< @brief 28.5 cycles sampling time. */ -#define ADC_SAMPLE_41P5 4 /**< @brief 41.5 cycles sampling time. */ -#define ADC_SAMPLE_55P5 5 /**< @brief 55.5 cycles sampling time. */ -#define ADC_SAMPLE_71P5 6 /**< @brief 71.5 cycles sampling time. */ -#define ADC_SAMPLE_239P5 7 /**< @brief 239.5 cycles sampling time. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief ADC1 driver enable switch. - * @details If set to @p TRUE the support for ADC1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ADC_USE_ADC1) || defined(__DOXYGEN__) -#define STM32_ADC_USE_ADC1 FALSE -#endif - -/** - * @brief ADC1 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_ADC_ADC1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#endif - -/** - * @brief ADC1 interrupt priority level setting. - */ -#if !defined(STM32_ADC_ADC1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_IRQ_PRIORITY 5 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !STM32_HAS_ADC1 -#error "ADC1 not present in the selected device" -#endif - -#if !STM32_ADC_USE_ADC1 -#error "ADC driver activated but no ADC peripheral assigned" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief ADC sample data type. - */ -typedef uint16_t adcsample_t; - -/** - * @brief Channels number in a conversion group. - */ -typedef uint16_t adc_channels_num_t; - -/** - * @brief Possible ADC failure causes. - * @note Error codes are architecture dependent and should not relied - * upon. - */ -typedef enum { - ADC_ERR_DMAFAILURE = 0 /**< DMA operations failure. */ -} adcerror_t; - -/** - * @brief Type of a structure representing an ADC driver. - */ -typedef struct ADCDriver ADCDriver; - -/** - * @brief ADC notification callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] buffer pointer to the most recent samples data - * @param[in] n number of buffer rows available starting from @p buffer - */ -typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n); - -/** - * @brief ADC error callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] err ADC error code - */ -typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err); - -/** - * @brief Conversion group configuration structure. - * @details This implementation-dependent structure describes a conversion - * operation. - * @note The use of this configuration structure requires knowledge of - * STM32 ADC cell registers interface, please refer to the STM32 - * reference manual for details. - */ -typedef struct { - /** - * @brief Enables the circular buffer mode for the group. - */ - bool_t circular; - /** - * @brief Number of the analog channels belonging to the conversion group. - */ - adc_channels_num_t num_channels; - /** - * @brief Callback function associated to the group or @p NULL. - */ - adccallback_t end_cb; - /** - * @brief Error callback or @p NULL. - */ - adcerrorcallback_t error_cb; - /* End of the mandatory fields.*/ - /** - * @brief ADC CR1 register initialization data. - * @note All the required bits must be defined into this field except - * @p ADC_CR1_SCAN that is enforced inside the driver. - */ - uint32_t cr1; - /** - * @brief ADC CR2 register initialization data. - * @note All the required bits must be defined into this field except - * @p ADC_CR2_DMA, @p ADC_CR2_CONT and @p ADC_CR2_ADON that are - * enforced inside the driver. - */ - uint32_t cr2; - /** - * @brief ADC SMPR1 register initialization data. - * @details In this field must be specified the sample times for channels - * 10...17. - */ - uint32_t smpr1; - /** - * @brief ADC SMPR2 register initialization data. - * @details In this field must be specified the sample times for channels - * 0...9. - */ - uint32_t smpr2; - /** - * @brief ADC SQR1 register initialization data. - * @details Conversion group sequence 13...16 + sequence length. - */ - uint32_t sqr1; - /** - * @brief ADC SQR2 register initialization data. - * @details Conversion group sequence 7...12. - */ - uint32_t sqr2; - /** - * @brief ADC SQR3 register initialization data. - * @details Conversion group sequence 1...6. - */ - uint32_t sqr3; -} ADCConversionGroup; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - uint32_t dummy; -} ADCConfig; - -/** - * @brief Structure representing an ADC driver. - */ -struct ADCDriver { - /** - * @brief Driver state. - */ - adcstate_t state; - /** - * @brief Current configuration data. - */ - const ADCConfig *config; - /** - * @brief Current samples buffer pointer or @p NULL. - */ - adcsample_t *samples; - /** - * @brief Current samples buffer depth or @p 0. - */ - size_t depth; - /** - * @brief Current conversion group pointer or @p NULL. - */ - const ADCConversionGroup *grpp; -#if ADC_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif -#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the peripheral. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* ADC_USE_MUTUAL_EXCLUSION */ -#if defined(ADC_DRIVER_EXT_FIELDS) - ADC_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the ADCx registers block. - */ - ADC_TypeDef *adc; - /** - * @brief Pointer to associated SMA channel. - */ - const stm32_dma_stream_t *dmastp; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Sequences building helper macros - * @{ - */ -/** - * @brief Number of channels in a conversion sequence. - */ -#define ADC_SQR1_NUM_CH(n) (((n) - 1) << 20) - -#define ADC_SQR3_SQ1_N(n) ((n) << 0) /**< @brief 1st channel in seq. */ -#define ADC_SQR3_SQ2_N(n) ((n) << 5) /**< @brief 2nd channel in seq. */ -#define ADC_SQR3_SQ3_N(n) ((n) << 10) /**< @brief 3rd channel in seq. */ -#define ADC_SQR3_SQ4_N(n) ((n) << 15) /**< @brief 4th channel in seq. */ -#define ADC_SQR3_SQ5_N(n) ((n) << 20) /**< @brief 5th channel in seq. */ -#define ADC_SQR3_SQ6_N(n) ((n) << 25) /**< @brief 6th channel in seq. */ - -#define ADC_SQR2_SQ7_N(n) ((n) << 0) /**< @brief 7th channel in seq. */ -#define ADC_SQR2_SQ8_N(n) ((n) << 5) /**< @brief 8th channel in seq. */ -#define ADC_SQR2_SQ9_N(n) ((n) << 10) /**< @brief 9th channel in seq. */ -#define ADC_SQR2_SQ10_N(n) ((n) << 15) /**< @brief 10th channel in seq.*/ -#define ADC_SQR2_SQ11_N(n) ((n) << 20) /**< @brief 11th channel in seq.*/ -#define ADC_SQR2_SQ12_N(n) ((n) << 25) /**< @brief 12th channel in seq.*/ - -#define ADC_SQR1_SQ13_N(n) ((n) << 0) /**< @brief 13th channel in seq.*/ -#define ADC_SQR1_SQ14_N(n) ((n) << 5) /**< @brief 14th channel in seq.*/ -#define ADC_SQR1_SQ15_N(n) ((n) << 10) /**< @brief 15th channel in seq.*/ -#define ADC_SQR1_SQ16_N(n) ((n) << 15) /**< @brief 16th channel in seq.*/ -/** @} */ - -/** - * @name Sampling rate settings helper macros - * @{ - */ -#define ADC_SMPR2_SMP_AN0(n) ((n) << 0) /**< @brief AN0 sampling time. */ -#define ADC_SMPR2_SMP_AN1(n) ((n) << 3) /**< @brief AN1 sampling time. */ -#define ADC_SMPR2_SMP_AN2(n) ((n) << 6) /**< @brief AN2 sampling time. */ -#define ADC_SMPR2_SMP_AN3(n) ((n) << 9) /**< @brief AN3 sampling time. */ -#define ADC_SMPR2_SMP_AN4(n) ((n) << 12) /**< @brief AN4 sampling time. */ -#define ADC_SMPR2_SMP_AN5(n) ((n) << 15) /**< @brief AN5 sampling time. */ -#define ADC_SMPR2_SMP_AN6(n) ((n) << 18) /**< @brief AN6 sampling time. */ -#define ADC_SMPR2_SMP_AN7(n) ((n) << 21) /**< @brief AN7 sampling time. */ -#define ADC_SMPR2_SMP_AN8(n) ((n) << 24) /**< @brief AN8 sampling time. */ -#define ADC_SMPR2_SMP_AN9(n) ((n) << 27) /**< @brief AN9 sampling time. */ - -#define ADC_SMPR1_SMP_AN10(n) ((n) << 0) /**< @brief AN10 sampling time. */ -#define ADC_SMPR1_SMP_AN11(n) ((n) << 3) /**< @brief AN11 sampling time. */ -#define ADC_SMPR1_SMP_AN12(n) ((n) << 6) /**< @brief AN12 sampling time. */ -#define ADC_SMPR1_SMP_AN13(n) ((n) << 9) /**< @brief AN13 sampling time. */ -#define ADC_SMPR1_SMP_AN14(n) ((n) << 12) /**< @brief AN14 sampling time. */ -#define ADC_SMPR1_SMP_AN15(n) ((n) << 15) /**< @brief AN15 sampling time. */ -#define ADC_SMPR1_SMP_SENSOR(n) ((n) << 18) /**< @brief Temperature Sensor - sampling time. */ -#define ADC_SMPR1_SMP_VREF(n) ((n) << 21) /**< @brief Voltage Reference - sampling time. */ -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !defined(__DOXYGEN__) -extern ADCDriver ADCD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void adc_lld_init(void); - void adc_lld_start(ADCDriver *adcp); - void adc_lld_stop(ADCDriver *adcp); - void adc_lld_start_conversion(ADCDriver *adcp); - void adc_lld_stop_conversion(ADCDriver *adcp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_ADC */ - -#endif /* _ADC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/ext_lld_isr.c b/os/hal/platforms/STM32F1xx/ext_lld_isr.c deleted file mode 100644 index dc9d0f4348..0000000000 --- a/os/hal/platforms/STM32F1xx/ext_lld_isr.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/ext_lld_isr.c - * @brief STM32F1xx EXT subsystem low level driver ISR code. - * - * @addtogroup EXT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -#include "ext_lld_isr.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief EXTI[0] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI0_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 0); - EXTD1.config->channels[0].cb(&EXTD1, 0); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[1] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI1_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 1); - EXTD1.config->channels[1].cb(&EXTD1, 1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[2] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI2_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 2); - EXTD1.config->channels[2].cb(&EXTD1, 2); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[3] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI3_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 3); - EXTD1.config->channels[3].cb(&EXTD1, 3); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[4] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI4_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 4); - EXTD1.config->channels[4].cb(&EXTD1, 4); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[5]...EXTI[9] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI9_5_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9)); - EXTI->PR = pr; - if (pr & (1 << 5)) - EXTD1.config->channels[5].cb(&EXTD1, 5); - if (pr & (1 << 6)) - EXTD1.config->channels[6].cb(&EXTD1, 6); - if (pr & (1 << 7)) - EXTD1.config->channels[7].cb(&EXTD1, 7); - if (pr & (1 << 8)) - EXTD1.config->channels[8].cb(&EXTD1, 8); - if (pr & (1 << 9)) - EXTD1.config->channels[9].cb(&EXTD1, 9); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[10]...EXTI[15] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI15_10_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | - (1 << 15)); - EXTI->PR = pr; - if (pr & (1 << 10)) - EXTD1.config->channels[10].cb(&EXTD1, 10); - if (pr & (1 << 11)) - EXTD1.config->channels[11].cb(&EXTD1, 11); - if (pr & (1 << 12)) - EXTD1.config->channels[12].cb(&EXTD1, 12); - if (pr & (1 << 13)) - EXTD1.config->channels[13].cb(&EXTD1, 13); - if (pr & (1 << 14)) - EXTD1.config->channels[14].cb(&EXTD1, 14); - if (pr & (1 << 15)) - EXTD1.config->channels[15].cb(&EXTD1, 15); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[16] interrupt handler (PVD). - * - * @isr - */ -CH_IRQ_HANDLER(PVD_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 16); - EXTD1.config->channels[16].cb(&EXTD1, 16); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[17] interrupt handler (RTC). - * - * @isr - */ -CH_IRQ_HANDLER(RTCAlarm_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 17); - EXTD1.config->channels[17].cb(&EXTD1, 17); - - CH_IRQ_EPILOGUE(); -} - -#if defined(STM32F10X_CL) -/** - * @brief EXTI[18] interrupt handler (OTG_FS_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(OTG_FS_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 18); - EXTD1.config->channels[18].cb(&EXTD1, 18); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[19] interrupt handler (ETH_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(ETH_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 19); - EXTD1.config->channels[19].cb(&EXTD1, 19); - - CH_IRQ_EPILOGUE(); -} -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) - -#else /* Other STM32F1xx devices.*/ -/** - * @brief EXTI[18] interrupt handler (USB_FS_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(USB_FS_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 18); - EXTD1.config->channels[18].cb(&EXTD1, 18); - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Enables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_enable(void) { - - nvicEnableVector(EXTI0_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI0_IRQ_PRIORITY)); - nvicEnableVector(EXTI1_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI1_IRQ_PRIORITY)); - nvicEnableVector(EXTI2_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI2_IRQ_PRIORITY)); - nvicEnableVector(EXTI3_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI3_IRQ_PRIORITY)); - nvicEnableVector(EXTI4_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI4_IRQ_PRIORITY)); - nvicEnableVector(EXTI9_5_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI5_9_IRQ_PRIORITY)); - nvicEnableVector(EXTI15_10_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI10_15_IRQ_PRIORITY)); - nvicEnableVector(PVD_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI16_IRQ_PRIORITY)); - nvicEnableVector(RTC_Alarm_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI17_IRQ_PRIORITY)); -#if defined(STM32F10X_CL) - /* EXTI vectors specific to STM32F1xx Connectivity Line.*/ - nvicEnableVector(OTG_FS_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI18_IRQ_PRIORITY)); - nvicEnableVector(ETH_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI19_IRQ_PRIORITY)); -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) - /* EXTI vectors specific to STM32F1xx Value Line.*/ -#else - /* EXTI vectors specific to STM32F1xx except Connectivity Line.*/ - nvicEnableVector(USB_FS_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI18_IRQ_PRIORITY)); -#endif -} - -/** - * @brief Disables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_disable(void) { - - nvicDisableVector(EXTI0_IRQn); - nvicDisableVector(EXTI1_IRQn); - nvicDisableVector(EXTI2_IRQn); - nvicDisableVector(EXTI3_IRQn); - nvicDisableVector(EXTI4_IRQn); - nvicDisableVector(EXTI9_5_IRQn); - nvicDisableVector(EXTI15_10_IRQn); - nvicDisableVector(PVD_IRQn); - nvicDisableVector(RTC_Alarm_IRQn); -#if defined(STM32F10X_CL) - /* EXTI vectors specific to STM32F1xx Connectivity Line.*/ - nvicDisableVector(OTG_FS_WKUP_IRQn); - nvicDisableVector(ETH_WKUP_IRQn); -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) - /* EXTI vectors specific to STM32F1xx Value Line.*/ -#else - /* EXTI vectors specific to STM32F1xx except Connectivity Line.*/ - nvicDisableVector(USB_FS_WKUP_IRQn); -#endif -} - -#endif /* HAL_USE_EXT */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/ext_lld_isr.h b/os/hal/platforms/STM32F1xx/ext_lld_isr.h deleted file mode 100644 index 74ea5e0ba5..0000000000 --- a/os/hal/platforms/STM32F1xx/ext_lld_isr.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/ext_lld_isr.h - * @brief STM32F1xx EXT subsystem low level driver ISR header. - * - * @addtogroup EXT - * @{ - */ - -#ifndef _EXT_LLD_ISR_H_ -#define _EXT_LLD_ISR_H_ - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief EXTI0 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI1 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI2 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI3 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI4 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI4_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI9..5 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI5_9_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI15..10 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI10_15_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI16 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI16_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI17 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI17_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI18 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI18_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI19 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI19_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void ext_lld_exti_irq_enable(void); - void ext_lld_exti_irq_disable(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_EXT */ - -#endif /* _EXT_LLD_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/hal_lld.c b/os/hal/platforms/STM32F1xx/hal_lld.c deleted file mode 100644 index 9fda0b3e7a..0000000000 --- a/os/hal/platforms/STM32F1xx/hal_lld.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/hal_lld.c - * @brief STM32F1xx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes the backup domain. - * @note WARNING! Changing clock source impossible without resetting - * of the whole BKP domain. - */ -static void hal_lld_backup_domain_init(void) { - - /* Backup domain access enabled and left open.*/ - PWR->CR |= PWR_CR_DBP; - - /* Reset BKP domain if different clock source selected.*/ - if ((RCC->BDCR & STM32_RTCSEL_MASK) != STM32_RTCSEL){ - /* Backup domain reset.*/ - RCC->BDCR = RCC_BDCR_BDRST; - RCC->BDCR = 0; - } - - /* If enabled then the LSE is started.*/ -#if STM32_LSE_ENABLED - RCC->BDCR |= RCC_BDCR_LSEON; - while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0) - ; /* Waits until LSE is stable. */ -#endif - -#if STM32_RTCSEL != STM32_RTCSEL_NOCLOCK - /* If the backup domain hasn't been initialized yet then proceed with - initialization.*/ - if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0) { - /* Selects clock source.*/ - RCC->BDCR |= STM32_RTCSEL; - - /* RTC clock enabled.*/ - RCC->BDCR |= RCC_BDCR_RTCEN; - } -#endif /* STM32_RTCSEL != STM32_RTCSEL_NOCLOCK */ -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* Reset of all peripherals.*/ - rccResetAPB1(0xFFFFFFFF); - rccResetAPB2(0xFFFFFFFF); - - /* SysTick initialization using the system clock.*/ - SysTick->LOAD = STM32_HCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; - - /* DWT cycle counter enable.*/ - SCS_DEMCR |= SCS_DEMCR_TRCENA; - DWT_CTRL |= DWT_CTRL_CYCCNTENA; - - /* PWR and BD clocks enabled.*/ - rccEnablePWRInterface(FALSE); - rccEnableBKPInterface(FALSE); - - /* Initializes the backup domain.*/ - hal_lld_backup_domain_init(); - -#if defined(STM32_DMA_REQUIRED) - dmaInit(); -#endif - - /* Programmable voltage detector enable.*/ -#if STM32_PVD_ENABLE - PWR->CR |= PWR_CR_PVDE | (STM32_PLS & STM32_PLS_MASK); -#endif /* STM32_PVD_ENABLE */ -} - -/** - * @brief STM32 clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function should be invoked just after the system reset. - * - * @special - */ -#if defined(STM32F10X_LD) || defined(STM32F10X_LD_VL) || \ - defined(STM32F10X_MD) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD) || defined(STM32F10X_XL) || \ - defined(__DOXYGEN__) -/* - * Clocks initialization for all sub-families except CL. - */ -void stm32_clock_init(void) { - -#if !STM32_NO_INIT - /* HSI setup, it enforces the reset situation in order to handle possible - problems with JTAG probes and re-initializations.*/ - RCC->CR |= RCC_CR_HSION; /* Make sure HSI is ON. */ - while (!(RCC->CR & RCC_CR_HSIRDY)) - ; /* Wait until HSI is stable. */ - RCC->CR &= RCC_CR_HSITRIM | RCC_CR_HSION; /* CR Reset value. */ - RCC->CFGR = 0; /* CFGR reset value. */ - while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) - ; /* Waits until HSI is selected. */ - -#if STM32_HSE_ENABLED - /* HSE activation.*/ - RCC->CR |= RCC_CR_HSEON; - while (!(RCC->CR & RCC_CR_HSERDY)) - ; /* Waits until HSE is stable. */ -#endif - -#if STM32_LSI_ENABLED - /* LSI activation.*/ - RCC->CSR |= RCC_CSR_LSION; - while ((RCC->CSR & RCC_CSR_LSIRDY) == 0) - ; /* Waits until LSI is stable. */ -#endif - -#if STM32_ACTIVATE_PLL - /* PLL activation.*/ - RCC->CFGR |= STM32_PLLMUL | STM32_PLLXTPRE | STM32_PLLSRC; - RCC->CR |= RCC_CR_PLLON; - while (!(RCC->CR & RCC_CR_PLLRDY)) - ; /* Waits until PLL is stable. */ -#endif - - /* Clock settings.*/ -#if STM32_HAS_USB - RCC->CFGR = STM32_MCOSEL | STM32_USBPRE | STM32_PLLMUL | STM32_PLLXTPRE | - STM32_PLLSRC | STM32_ADCPRE | STM32_PPRE2 | STM32_PPRE1 | - STM32_HPRE; -#else - RCC->CFGR = STM32_MCOSEL | STM32_PLLMUL | STM32_PLLXTPRE | - STM32_PLLSRC | STM32_ADCPRE | STM32_PPRE2 | STM32_PPRE1 | - STM32_HPRE; -#endif - - /* Flash setup and final clock selection. */ - FLASH->ACR = STM32_FLASHBITS; - - /* Switching to the configured clock source if it is different from HSI.*/ -#if (STM32_SW != STM32_SW_HSI) - /* Switches clock source.*/ - RCC->CFGR |= STM32_SW; - while ((RCC->CFGR & RCC_CFGR_SWS) != (STM32_SW << 2)) - ; /* Waits selection complete. */ -#endif -#endif /* !STM32_NO_INIT */ -} - -#elif defined(STM32F10X_CL) -/* - * Clocks initialization for the CL sub-family. - */ -void stm32_clock_init(void) { - -#if !STM32_NO_INIT - /* HSI setup.*/ - RCC->CR |= RCC_CR_HSION; /* Make sure HSI is ON. */ - while (!(RCC->CR & RCC_CR_HSIRDY)) - ; /* Wait until HSI is stable. */ - RCC->CFGR = 0; - RCC->CR &= RCC_CR_HSITRIM | RCC_CR_HSION; /* CR Reset value. */ - while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) - ; /* Wait until HSI is the source.*/ - -#if STM32_HSE_ENABLED -#if defined(STM32_HSE_BYPASS) - /* HSE Bypass.*/ - RCC->CR |= RCC_CR_HSEBYP; -#endif - /* HSE activation.*/ - RCC->CR |= RCC_CR_HSEON; - while (!(RCC->CR & RCC_CR_HSERDY)) - ; /* Waits until HSE is stable. */ -#endif - -#if STM32_LSI_ENABLED - /* LSI activation.*/ - RCC->CSR |= RCC_CSR_LSION; - while ((RCC->CSR & RCC_CSR_LSIRDY) == 0) - ; /* Waits until LSI is stable. */ -#endif - - /* Settings of various dividers and multipliers in CFGR2.*/ - RCC->CFGR2 = STM32_PLL3MUL | STM32_PLL2MUL | STM32_PREDIV2 | - STM32_PREDIV1 | STM32_PREDIV1SRC; - - /* PLL2 setup, if activated.*/ -#if STM32_ACTIVATE_PLL2 - RCC->CR |= RCC_CR_PLL2ON; - while (!(RCC->CR & RCC_CR_PLL2RDY)) - ; /* Waits until PLL2 is stable. */ -#endif - - /* PLL3 setup, if activated.*/ -#if STM32_ACTIVATE_PLL3 - RCC->CR |= RCC_CR_PLL3ON; - while (!(RCC->CR & RCC_CR_PLL3RDY)) - ; /* Waits until PLL3 is stable. */ -#endif - - /* PLL1 setup, if activated.*/ -#if STM32_ACTIVATE_PLL1 - RCC->CFGR |= STM32_PLLMUL | STM32_PLLSRC; - RCC->CR |= RCC_CR_PLLON; - while (!(RCC->CR & RCC_CR_PLLRDY)) - ; /* Waits until PLL1 is stable. */ -#endif - - /* Clock settings.*/ -#if STM32_HAS_OTG1 - RCC->CFGR = STM32_MCOSEL | STM32_OTGFSPRE | STM32_PLLMUL | STM32_PLLSRC | - STM32_ADCPRE | STM32_PPRE2 | STM32_PPRE1 | STM32_HPRE; -#else - RCC->CFGR = STM32_MCO | STM32_PLLMUL | STM32_PLLSRC | - STM32_ADCPRE | STM32_PPRE2 | STM32_PPRE1 | STM32_HPRE; -#endif - - /* Flash setup and final clock selection. */ - FLASH->ACR = STM32_FLASHBITS; /* Flash wait states depending on clock. */ - - /* Switching to the configured clock source if it is different from HSI.*/ -#if (STM32_SW != STM32_SW_HSI) - RCC->CFGR |= STM32_SW; /* Switches on the selected clock source. */ - while ((RCC->CFGR & RCC_CFGR_SWS) != (STM32_SW << 2)) - ; -#endif -#endif /* !STM32_NO_INIT */ -} -#else -void stm32_clock_init(void) {} -#endif - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/hal_lld.h b/os/hal/platforms/STM32F1xx/hal_lld.h deleted file mode 100644 index 4475c06558..0000000000 --- a/os/hal/platforms/STM32F1xx/hal_lld.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/hal_lld.h - * @brief STM32F1xx HAL subsystem low level driver header. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - STM32_LSECLK. - * - STM32_HSECLK. - * - STM32_HSE_BYPASS (optionally). - * . - * One of the following macros must also be defined: - * - STM32F10X_LD_VL for Value Line Low Density devices. - * - STM32F10X_MD_VL for Value Line Medium Density devices. - * - STM32F10X_LD for Performance Low Density devices. - * - STM32F10X_MD for Performance Medium Density devices. - * - STM32F10X_HD for Performance High Density devices. - * - STM32F10X_XL for Performance eXtra Density devices. - * - STM32F10X_CL for Connectivity Line devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "stm32.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS TRUE - -/** - * @name Internal clock sources - * @{ - */ -#define STM32_HSICLK 8000000 /**< High speed internal clock. */ -#define STM32_LSICLK 40000 /**< Low speed internal clock. */ -/** @} */ - -/** - * @name PWR_CR register bits definitions - * @{ - */ -#define STM32_PLS_MASK (7 << 5) /**< PLS bits mask. */ -#define STM32_PLS_LEV0 (0 << 5) /**< PVD level 0. */ -#define STM32_PLS_LEV1 (1 << 5) /**< PVD level 1. */ -#define STM32_PLS_LEV2 (2 << 5) /**< PVD level 2. */ -#define STM32_PLS_LEV3 (3 << 5) /**< PVD level 3. */ -#define STM32_PLS_LEV4 (4 << 5) /**< PVD level 4. */ -#define STM32_PLS_LEV5 (5 << 5) /**< PVD level 5. */ -#define STM32_PLS_LEV6 (6 << 5) /**< PVD level 6. */ -#define STM32_PLS_LEV7 (7 << 5) /**< PVD level 7. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name STM32F1xx capabilities - * @{ - */ -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTC_HAS_SUBSECONDS TRUE -#define STM32_RTC_IS_CALENDAR FALSE -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Disables the PWR/RCC initialization in the HAL. - */ -#if !defined(STM32_NO_INIT) || defined(__DOXYGEN__) -#define STM32_NO_INIT FALSE -#endif - -/** - * @brief Enables or disables the programmable voltage detector. - */ -#if !defined(STM32_PVD_ENABLE) || defined(__DOXYGEN__) -#define STM32_PVD_ENABLE FALSE -#endif - -/** - * @brief Sets voltage level for programmable voltage detector. - */ -#if !defined(STM32_PLS) || defined(__DOXYGEN__) -#define STM32_PLS STM32_PLS_LEV0 -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM32_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSI_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSE_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSE clock source. - */ -#if !defined(STM32_LSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSE_ENABLED FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if defined(__DOXYGEN__) -/** - * @name Platform identification - * @{ - */ -#define PLATFORM_NAME "STM32" -/** @} */ - -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) || defined(__DOXYGEN__) -#include "hal_lld_f100.h" - -#elif defined(STM32F10X_LD) || defined(STM32F10X_MD) || \ - defined(STM32F10X_HD) || defined(STM32F10X_XL) || \ - defined(__DOXYGEN__) -#include "hal_lld_f103.h" - -#elif defined(STM32F10X_CL) || defined(__DOXYGEN__) -#include "hal_lld_f105_f107.h" - -#else -#error "unspecified, unsupported or invalid STM32 platform" -#endif - -/* There are differences in vector names in the various sub-families, - normalizing.*/ -#if defined(STM32F10X_XL) -#define TIM1_BRK_IRQn TIM1_BRK_TIM9_IRQn -#define TIM1_UP_IRQn TIM1_UP_TIM10_IRQn -#define TIM1_TRG_COM_IRQn TIM1_TRG_COM_TIM11_IRQn -#define TIM8_BRK_IRQn TIM8_BRK_TIM12_IRQn -#define TIM8_UP_IRQn TIM8_UP_TIM13_IRQn -#define TIM8_TRG_COM_IRQn TIM8_TRG_COM_TIM14_IRQn - -#elif defined(STM32F10X_LD_VL)|| defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) -#define TIM1_BRK_IRQn TIM1_BRK_TIM15_IRQn -#define TIM1_UP_IRQn TIM1_UP_TIM16_IRQn -#define TIM1_TRG_COM_IRQn TIM1_TRG_COM_TIM17_IRQn -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type representing a system clock frequency. - */ -typedef uint32_t halclock_t; - -/** - * @brief Type of the realtime free counter value. - */ -typedef uint32_t halrtcnt_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Returns the current value of the system free running counter. - * @note This service is implemented by returning the content of the - * DWT_CYCCNT register. - * - * @return The value of the system free running counter of - * type halrtcnt_t. - * - * @notapi - */ -#define hal_lld_get_counter_value() DWT_CYCCNT - -/** - * @brief Realtime counter frequency. - * @note The DWT_CYCCNT register is incremented directly by the system - * clock so this function returns STM32_HCLK. - * - * @return The realtime counter frequency of type halclock_t. - * - * @notapi - */ -#define hal_lld_get_counter_frequency() STM32_HCLK - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* STM32 ISR, DMA and RCC helpers.*/ -#include "stm32_isr.h" -#include "stm32_dma.h" -#include "stm32_rcc.h" - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void stm32_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/hal_lld_f100.h b/os/hal/platforms/STM32F1xx/hal_lld_f100.h deleted file mode 100644 index 0026464e99..0000000000 --- a/os/hal/platforms/STM32F1xx/hal_lld_f100.h +++ /dev/null @@ -1,952 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32F100_HAL STM32F100 HAL Support - * @details HAL support for STM32 Value Line LD, MD and HD sub-families. - * - * @ingroup HAL - */ - -/** - * @file STM32F1xx/hal_lld_f100.h - * @brief STM32F100 Value Line HAL subsystem low level driver header. - * - * @addtogroup STM32F100_HAL - * @{ - */ - -#ifndef _HAL_LLD_F100_H_ -#define _HAL_LLD_F100_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Platform identification - * @{ - */ -#if defined(__DOXYGEN__) -#define PLATFORM_NAME "STM32F100 Value Line" - -#elif defined(STM32F10X_LD_VL) -#define PLATFORM_NAME "STM32F100 Value Line Low Density" - -#elif defined(STM32F10X_MD_VL) -#define PLATFORM_NAME "STM32F100 Value Line Medium Density" -#else -#error "unsupported STM32 Value Line member" -#endif -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Maximum system clock frequency. - */ -#define STM32_SYSCLK_MAX 24000000 - -/** - * @brief Maximum HSE clock frequency. - */ -#define STM32_HSECLK_MAX 24000000 - -/** - * @brief Minimum HSE clock frequency. - */ -#define STM32_HSECLK_MIN 1000000 - -/** - * @brief Maximum LSE clock frequency. - */ -#define STM32_LSECLK_MAX 1000000 - -/** - * @brief Minimum LSE clock frequency. - */ -#define STM32_LSECLK_MIN 32768 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MAX 24000000 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MIN 1000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MAX 24000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MIN 16000000 - -/** - * @brief Maximum APB1 clock frequency. - */ -#define STM32_PCLK1_MAX 24000000 - -/** - * @brief Maximum APB2 clock frequency. - */ -#define STM32_PCLK2_MAX 24000000 - -/** - * @brief Maximum ADC clock frequency. - */ -#define STM32_ADCCLK_MAX 12000000 -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE1_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE1_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE1_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE1_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE1_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_PPRE2_DIV1 (0 << 11) /**< HCLK divided by 1. */ -#define STM32_PPRE2_DIV2 (4 << 11) /**< HCLK divided by 2. */ -#define STM32_PPRE2_DIV4 (5 << 11) /**< HCLK divided by 4. */ -#define STM32_PPRE2_DIV8 (6 << 11) /**< HCLK divided by 8. */ -#define STM32_PPRE2_DIV16 (7 << 11) /**< HCLK divided by 16. */ - -#define STM32_ADCPRE_DIV2 (0 << 14) /**< PPRE2 divided by 2. */ -#define STM32_ADCPRE_DIV4 (1 << 14) /**< PPRE2 divided by 4. */ -#define STM32_ADCPRE_DIV6 (2 << 14) /**< PPRE2 divided by 6. */ -#define STM32_ADCPRE_DIV8 (3 << 14) /**< PPRE2 divided by 8. */ - -#define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI. */ -#define STM32_PLLSRC_HSE (1 << 16) /**< PLL clock source is HSE. */ - -#define STM32_PLLXTPRE_DIV1 (0 << 17) /**< HSE divided by 1. */ -#define STM32_PLLXTPRE_DIV2 (1 << 17) /**< HSE divided by 2. */ - -#define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ -#define STM32_MCOSEL_SYSCLK (4 << 24) /**< SYSCLK on MCO pin. */ -#define STM32_MCOSEL_HSI (5 << 24) /**< HSI clock on MCO pin. */ -#define STM32_MCOSEL_HSE (6 << 24) /**< HSE clock on MCO pin. */ -#define STM32_MCOSEL_PLLDIV2 (7 << 24) /**< PLL/2 clock on MCO pin. */ -/** @} */ - -/** - * @name RCC_BDCR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 8) /**< RTC clock source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No clock. */ -#define STM32_RTCSEL_LSE (1 << 8) /**< LSE used as RTC clock. */ -#define STM32_RTCSEL_LSI (2 << 8) /**< LSI used as RTC clock. */ -#define STM32_RTCSEL_HSEDIV (3 << 8) /**< HSE divided by 128 used as - RTC clock. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -#if defined(STM32F10X_LD_VL) || defined(__DOXYGEN__) -/** - * @name STM32F100 LD capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 FALSE -#define STM32_HAS_ADC3 FALSE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 FALSE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 0 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 FALSE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 18 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE FALSE -#define STM32_HAS_GPIOF FALSE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 FALSE -#define STM32_I2C2_RX_DMA_MSK 0 -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK 0 -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 FALSE -#define STM32_SPI2_RX_DMA_MSK 0 -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK 0 -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 FALSE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 TRUE -#define STM32_HAS_TIM16 TRUE -#define STM32_HAS_TIM17 TRUE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 FALSE -#define STM32_USART3_RX_DMA_MSK 0 -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK 0 -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK 0 -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK 0 -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB FALSE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ -#endif /* defined(STM32F10X_LD_VL) */ - -#if defined(STM32F10X_MD_VL) || defined(__DOXYGEN__) -/** - * @name STM32F100 MD capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 FALSE -#define STM32_HAS_ADC3 FALSE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 FALSE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 0 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 FALSE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 19 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF FALSE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 TRUE -#define STM32_HAS_TIM16 TRUE -#define STM32_HAS_TIM17 TRUE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK 0 -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK 0 -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB FALSE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ -#endif /* defined(STM32F10X_MD_VL) */ - -/*===========================================================================*/ -/* Platform specific friendly IRQ names. */ -/*===========================================================================*/ - -/** - * @name IRQ VECTOR names - * @{ - */ -#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */ -#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line - detect. */ -#define TAMPER_IRQHandler Vector48 /**< Tamper. */ -#define RTC_IRQHandler Vector4C /**< RTC. */ -#define FLASH_IRQHandler Vector50 /**< Flash. */ -#define RCC_IRQHandler Vector54 /**< RCC. */ -#define EXTI0_IRQHandler Vector58 /**< EXTI Line 0. */ -#define EXTI1_IRQHandler Vector5C /**< EXTI Line 1. */ -#define EXTI2_IRQHandler Vector60 /**< EXTI Line 2. */ -#define EXTI3_IRQHandler Vector64 /**< EXTI Line 3. */ -#define EXTI4_IRQHandler Vector68 /**< EXTI Line 4. */ -#define DMA1_Ch1_IRQHandler Vector6C /**< DMA1 Channel 1. */ -#define DMA1_Ch2_IRQHandler Vector70 /**< DMA1 Channel 2. */ -#define DMA1_Ch3_IRQHandler Vector74 /**< DMA1 Channel 3. */ -#define DMA1_Ch4_IRQHandler Vector78 /**< DMA1 Channel 4. */ -#define DMA1_Ch5_IRQHandler Vector7C /**< DMA1 Channel 5. */ -#define DMA1_Ch6_IRQHandler Vector80 /**< DMA1 Channel 6. */ -#define DMA1_Ch7_IRQHandler Vector84 /**< DMA1 Channel 7. */ -#define ADC1_2_IRQHandler Vector88 /**< ADC1_2. */ -#define EXTI9_5_IRQHandler Vector9C /**< EXTI Line 9..5. */ -#define TIM1_BRK_IRQHandler VectorA0 /**< TIM1 Break. */ -#define TIM1_UP_IRQHandler VectorA4 /**< TIM1 Update. */ -#define TIM1_TRG_COM_IRQHandler VectorA8 /**< TIM1 Trigger and - Commutation. */ -#define TIM1_CC_IRQHandler VectorAC /**< TIM1 Capture Compare. */ -#define TIM2_IRQHandler VectorB0 /**< TIM2. */ -#define TIM3_IRQHandler VectorB4 /**< TIM3. */ -#if !defined(STM32F10X_LD_VL) || defined(__DOXYGEN__) -#define TIM4_IRQHandler VectorB8 /**< TIM4. */ -#endif -#define I2C1_EV_IRQHandler VectorBC /**< I2C1 Event. */ -#define I2C1_ER_IRQHandler VectorC0 /**< I2C1 Error. */ -#if !defined(STM32F10X_LD_VL) || defined(__DOXYGEN__) -#define I2C2_EV_IRQHandler VectorC4 /**< I2C2 Event. */ -#define I2C2_ER_IRQHandler VectorC8 /**< I2C2 Error. */ -#endif -#define SPI1_IRQHandler VectorCC /**< SPI1. */ -#if !defined(STM32F10X_LD_VL) || defined(__DOXYGEN__) -#define SPI2_IRQHandler VectorD0 /**< SPI2. */ -#endif -#define USART1_IRQHandler VectorD4 /**< USART1. */ -#define USART2_IRQHandler VectorD8 /**< USART2. */ -#if !defined(STM32F10X_LD_VL) || defined(__DOXYGEN__) -#define USART3_IRQHandler VectorDC /**< USART3. */ -#endif -#define EXTI15_10_IRQHandler VectorE0 /**< EXTI Line 15..10. */ -#define RTC_Alarm_IRQHandler VectorE4 /**< RTC Alarm through EXTI. */ -#define CEC_IRQHandler VectorE8 /**< CEC. */ -#define TIM12_IRQHandler VectorEC /**< TIM12. */ -#define TIM13_IRQHandler VectorF0 /**< TIM13. */ -#define TIM14_IRQHandler VectorF4 /**< TIM14. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Main clock source selection. - * @note If the selected clock source is not the PLL then the PLL is not - * initialized and started. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -/** - * @brief Clock source for the PLL. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSE -#endif - -/** - * @brief Crystal PLL pre-divider. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLXTPRE) || defined(__DOXYGEN__) -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#endif - -/** - * @brief PLL multiplier value. - * @note The allowed range is 2...16. - * @note The default value is calculated for a 24MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLMUL_VALUE 3 -#endif - -/** - * @brief AHB prescaler value. - * @note The default value is calculated for a 24MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE1) || defined(__DOXYGEN__) -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#endif - -/** - * @brief APB2 prescaler value. - */ -#if !defined(STM32_PPRE2) || defined(__DOXYGEN__) -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#endif - -/** - * @brief ADC prescaler value. - */ -#if !defined(STM32_ADCPRE) || defined(__DOXYGEN__) -#define STM32_ADCPRE STM32_ADCPRE_DIV2 -#endif - -/** - * @brief MCO pin setting. - */ -#if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#endif - -/** - * @brief RTC clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_LSI -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Configuration-related checks. - */ -#if !defined(STM32F100_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F100_MCUCONF not defined" -#endif - -/* - * HSI related checks. - */ -#if STM32_HSI_ENABLED -#else /* !STM32_HSI_ENABLED */ - -#if STM32_SW == STM32_SW_HSI -#error "HSI not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCOSEL" -#endif - -#endif /* !STM32_HSI_ENABLED */ - -/* - * HSE related checks. - */ -#if STM32_HSE_ENABLED - -#if STM32_HSECLK == 0 -#error "HSE frequency not defined" -#elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" -#endif - -#else /* !STM32_HSE_ENABLED */ - -#if STM32_SW == STM32_SW_HSE -#error "HSE not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE) -#error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE)) -#error "HSE not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#error "HSE not enabled, required by STM32_RTCSELSEL" -#endif - -#endif /* !STM32_HSE_ENABLED */ - -/* - * LSI related checks. - */ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSI -#error "LSI not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSI_ENABLED */ - -/* - * LSE related checks. - */ -#if STM32_LSE_ENABLED - -#if (STM32_LSECLK == 0) -#error "LSE frequency not defined" -#endif - -#if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) -#error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" -#endif - -#else /* !STM32_LSE_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSE -#error "LSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSE_ENABLED */ - -/* PLL activation conditions.*/ -#if (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) || \ - defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLL TRUE -#else -#define STM32_ACTIVATE_PLL FALSE -#endif - -/* HSE prescaler setting check.*/ -#if (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV1) && \ - (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV2) -#error "invalid STM32_PLLXTPRE value specified" -#endif - -/** - * @brief PLLMUL field. - */ -#if ((STM32_PLLMUL_VALUE >= 2) && (STM32_PLLMUL_VALUE <= 16)) || \ - defined(__DOXYGEN__) -#define STM32_PLLMUL ((STM32_PLLMUL_VALUE - 2) << 18) -#else -#error "invalid STM32_PLLMUL_VALUE value specified" -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) -#if STM32_PLLXTPRE == STM32_PLLXTPRE_DIV1 -#define STM32_PLLCLKIN (STM32_HSECLK / 1) -#else -#define STM32_PLLCLKIN (STM32_HSECLK / 2) -#endif -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN (STM32_HSICLK / 2) -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* PLL input frequency range check.*/ -#if (STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX) -#error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) - -/* PLL output frequency range check.*/ -#if (STM32_PLLCLKOUT < STM32_PLLOUT_MIN) || (STM32_PLLCLKOUT > STM32_PLLOUT_MAX) -#error "STM32_PLLCLKOUT outside acceptable range (STM32_PLLOUT_MIN...STM32_PLLOUT_MAX)" -#endif - -/** - * @brief System clock source. - */ -#if (STM32_SW == STM32_SW_PLL) || defined(__DOXYGEN__) -#define STM32_SYSCLK STM32_PLLCLKOUT -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#else -#error "invalid STM32_SYSCLK_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* AHB frequency check.*/ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB1 frequency. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK1 (STM32_HCLK / 1) -#elif STM32_PPRE1 == STM32_PPRE1_DIV2 -#define STM32_PCLK1 (STM32_HCLK / 2) -#elif STM32_PPRE1 == STM32_PPRE1_DIV4 -#define STM32_PCLK1 (STM32_HCLK / 4) -#elif STM32_PPRE1 == STM32_PPRE1_DIV8 -#define STM32_PCLK1 (STM32_HCLK / 8) -#elif STM32_PPRE1 == STM32_PPRE1_DIV16 -#define STM32_PCLK1 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE1 value specified" -#endif - -/* APB1 frequency check.*/ -#if STM32_PCLK1 > STM32_PCLK1_MAX -#error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" -#endif - -/** - * @brief APB2 frequency. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK2 (STM32_HCLK / 1) -#elif STM32_PPRE2 == STM32_PPRE2_DIV2 -#define STM32_PCLK2 (STM32_HCLK / 2) -#elif STM32_PPRE2 == STM32_PPRE2_DIV4 -#define STM32_PCLK2 (STM32_HCLK / 4) -#elif STM32_PPRE2 == STM32_PPRE2_DIV8 -#define STM32_PCLK2 (STM32_HCLK / 8) -#elif STM32_PPRE2 == STM32_PPRE2_DIV16 -#define STM32_PCLK2 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE2 value specified" -#endif - -/* APB2 frequency check.*/ -#if STM32_PCLK2 > STM32_PCLK2_MAX -#error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" -#endif - -/** - * @brief RTC clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_LSE) || defined(__DOXYGEN__) -#define STM32_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM32_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM32_RTCCLK (STM32_HSECLK / 128) -#elif STM32_RTCSEL == STM32_RTCSEL_NOCLOCK -#define STM32_RTCCLK 0 -#else -#error "invalid source selected for RTC clock" -#endif - -/** - * @brief ADC frequency. - */ -#if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__) -#define STM32_ADCCLK (STM32_PCLK2 / 2) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV4 -#define STM32_ADCCLK (STM32_PCLK2 / 4) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV6 -#define STM32_ADCCLK (STM32_PCLK2 / 6) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV8 -#define STM32_ADCCLK (STM32_PCLK2 / 8) -#else -#error "invalid STM32_ADCPRE value specified" -#endif - -/* ADC frequency check.*/ -#if STM32_ADCCLK > STM32_ADCCLK_MAX -#error "STM32_ADCCLK exceeding maximum frequency (STM32_ADCCLK_MAX)" -#endif - -/** - * @brief Timers 2, 3, 4, 5, 6, 7, 12, 13, 14 clock. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK1 * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK1 * 2) -#endif - -/** - * @brief Timers 1, 8, 9, 10, 11 clock. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK2 (STM32_PCLK2 * 1) -#else -#define STM32_TIMCLK2 (STM32_PCLK2 * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= 24000000) || defined(__DOXYGEN__) -#define STM32_FLASHBITS 0x00000010 -#elif STM32_HCLK <= 48000000 -#define STM32_FLASHBITS 0x00000011 -#else -#define STM32_FLASHBITS 0x00000012 -#endif - -#endif /* _HAL_LLD_F100_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/hal_lld_f103.h b/os/hal/platforms/STM32F1xx/hal_lld_f103.h deleted file mode 100644 index 4776dcfdde..0000000000 --- a/os/hal/platforms/STM32F1xx/hal_lld_f103.h +++ /dev/null @@ -1,1299 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32F103_HAL STM32F103 HAL Support - * @details HAL support for STM32 Performance Line LD, MD and HD sub-families. - * - * @ingroup HAL - */ - -/** - * @file STM32F1xx/hal_lld_f103.h - * @brief STM32F103 Performance Line HAL subsystem low level driver header. - * - * @addtogroup STM32F103_HAL - * @{ - */ - -#ifndef _HAL_LLD_F103_H_ -#define _HAL_LLD_F103_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Platform identification - * @{ - */ -#if defined(__DOXYGEN__) -#define PLATFORM_NAME "STM32F10x Performance Line" - -#elif defined(STM32F10X_LD) -#define PLATFORM_NAME "STM32F10x Performance Line Low Density" - -#elif defined(STM32F10X_MD) -#define PLATFORM_NAME "STM32F10x Performance Line Medium Density" - -#elif defined(STM32F10X_HD) -#define PLATFORM_NAME "STM32F10x Performance Line High Density" - -#elif defined(STM32F10X_XL) -#define PLATFORM_NAME "STM32F10x Performance Line eXtra Density" - -#else -#error "unsupported STM32 Performance Line member" -#endif -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Maximum system clock frequency. - */ -#define STM32_SYSCLK_MAX 72000000 - -/** - * @brief Maximum HSE clock frequency. - */ -#define STM32_HSECLK_MAX 25000000 - -/** - * @brief Minimum HSE clock frequency. - */ -#define STM32_HSECLK_MIN 1000000 - -/** - * @brief Maximum LSE clock frequency. - */ -#define STM32_LSECLK_MAX 1000000 - -/** - * @brief Minimum LSE clock frequency. - */ -#define STM32_LSECLK_MIN 32768 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MAX 25000000 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MIN 1000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MAX 72000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MIN 16000000 - -/** - * @brief Maximum APB1 clock frequency. - */ -#define STM32_PCLK1_MAX 36000000 - -/** - * @brief Maximum APB2 clock frequency. - */ -#define STM32_PCLK2_MAX 72000000 - -/** - * @brief Maximum ADC clock frequency. - */ -#define STM32_ADCCLK_MAX 14000000 -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE1_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE1_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE1_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE1_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE1_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_PPRE2_DIV1 (0 << 11) /**< HCLK divided by 1. */ -#define STM32_PPRE2_DIV2 (4 << 11) /**< HCLK divided by 2. */ -#define STM32_PPRE2_DIV4 (5 << 11) /**< HCLK divided by 4. */ -#define STM32_PPRE2_DIV8 (6 << 11) /**< HCLK divided by 8. */ -#define STM32_PPRE2_DIV16 (7 << 11) /**< HCLK divided by 16. */ - -#define STM32_ADCPRE_DIV2 (0 << 14) /**< PPRE2 divided by 2. */ -#define STM32_ADCPRE_DIV4 (1 << 14) /**< PPRE2 divided by 4. */ -#define STM32_ADCPRE_DIV6 (2 << 14) /**< PPRE2 divided by 6. */ -#define STM32_ADCPRE_DIV8 (3 << 14) /**< PPRE2 divided by 8. */ - -#define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI. */ -#define STM32_PLLSRC_HSE (1 << 16) /**< PLL clock source is HSE. */ - -#define STM32_PLLXTPRE_DIV1 (0 << 17) /**< HSE divided by 1. */ -#define STM32_PLLXTPRE_DIV2 (1 << 17) /**< HSE divided by 2. */ - -#define STM32_USBPRE_DIV1P5 (0 << 22) /**< PLLOUT divided by 1.5. */ -#define STM32_USBPRE_DIV1 (1 << 22) /**< PLLOUT divided by 1. */ - -#define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ -#define STM32_MCOSEL_SYSCLK (4 << 24) /**< SYSCLK on MCO pin. */ -#define STM32_MCOSEL_HSI (5 << 24) /**< HSI clock on MCO pin. */ -#define STM32_MCOSEL_HSE (6 << 24) /**< HSE clock on MCO pin. */ -#define STM32_MCOSEL_PLLDIV2 (7 << 24) /**< PLL/2 clock on MCO pin. */ -/** @} */ - -/** - * @name RCC_BDCR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 8) /**< RTC clock source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No clock. */ -#define STM32_RTCSEL_LSE (1 << 8) /**< LSE used as RTC clock. */ -#define STM32_RTCSEL_LSI (2 << 8) /**< LSI used as RTC clock. */ -#define STM32_RTCSEL_HSEDIV (3 << 8) /**< HSE divided by 128 used as - RTC clock. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -#if defined(STM32F10X_LD) || defined(__DOXYGEN__) -/** - * @name STM32F103 LD capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 TRUE -#define STM32_HAS_ADC3 FALSE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 14 - -/* DAC attributes.*/ -#define STM32_HAS_DAC FALSE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 FALSE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 19 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE FALSE -#define STM32_HAS_GPIOF FALSE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 FALSE -#define STM32_I2C2_RX_DMA_MSK 0 -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK 0 -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 FALSE -#define STM32_SPI2_RX_DMA_MSK 0 -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK 0 -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 FALSE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 FALSE -#define STM32_HAS_TIM7 FALSE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 FALSE -#define STM32_USART3_RX_DMA_MSK 0 -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK 0 -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK 0 -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK 0 -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB FALSE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ -#endif /* defined(STM32F10X_LD) */ - -#if defined(STM32F10X_MD) || defined(__DOXYGEN__) -/** - * @name STM32F103 MD capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 TRUE -#define STM32_HAS_ADC3 FALSE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 14 - -/* DAC attributes.*/ -#define STM32_HAS_DAC FALSE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 FALSE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 19 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF FALSE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTCSEL_HAS_SUBSECONDS TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 FALSE -#define STM32_HAS_TIM7 FALSE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK 0 -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK 0 -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB TRUE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ -#endif /* defined(STM32F10X_MD) */ - -#if defined(STM32F10X_HD) || defined(__DOXYGEN__) -/** - * @name STM32F103 HD capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 TRUE -#define STM32_HAS_ADC3 TRUE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 14 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 TRUE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 19 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF TRUE -#define STM32_HAS_GPIOG TRUE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTCSEL_HAS_SUBSECONDS TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO TRUE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 TRUE -#define STM32_SPI3_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 1) -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 2) -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 TRUE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 TRUE -#define STM32_HAS_TIM9 TRUE -#define STM32_HAS_TIM10 TRUE -#define STM32_HAS_TIM11 TRUE -#define STM32_HAS_TIM12 TRUE -#define STM32_HAS_TIM13 TRUE -#define STM32_HAS_TIM14 TRUE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 TRUE -#define STM32_UART4_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 3)) -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 TRUE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB TRUE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ -#endif /* defined(STM32F10X_HD) */ - -#if defined(STM32F10X_XL) || defined(__DOXYGEN__) -/** - * @name STM32F103 XL capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 TRUE -#define STM32_HAS_ADC3 TRUE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 14 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 TRUE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 19 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF TRUE -#define STM32_HAS_GPIOG TRUE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTCSEL_HAS_SUBSECONDS TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO TRUE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 TRUE -#define STM32_SPI3_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 1) -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 2) -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 TRUE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 TRUE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 TRUE -#define STM32_UART4_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 3)) -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 TRUE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB TRUE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ -#endif /* defined(STM32F10X_XL) */ - -/*===========================================================================*/ -/* Platform specific friendly IRQ names. */ -/*===========================================================================*/ - -/** - * @name IRQ VECTOR names - * @{ - */ -#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */ -#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line - detect. */ -#define TAMPER_IRQHandler Vector48 /**< Tamper. */ -#define RTC_IRQHandler Vector4C /**< RTC. */ -#define FLASH_IRQHandler Vector50 /**< Flash. */ -#define RCC_IRQHandler Vector54 /**< RCC. */ -#define EXTI0_IRQHandler Vector58 /**< EXTI Line 0. */ -#define EXTI1_IRQHandler Vector5C /**< EXTI Line 1. */ -#define EXTI2_IRQHandler Vector60 /**< EXTI Line 2. */ -#define EXTI3_IRQHandler Vector64 /**< EXTI Line 3. */ -#define EXTI4_IRQHandler Vector68 /**< EXTI Line 4. */ -#define DMA1_Ch1_IRQHandler Vector6C /**< DMA1 Channel 1. */ -#define DMA1_Ch2_IRQHandler Vector70 /**< DMA1 Channel 2. */ -#define DMA1_Ch3_IRQHandler Vector74 /**< DMA1 Channel 3. */ -#define DMA1_Ch4_IRQHandler Vector78 /**< DMA1 Channel 4. */ -#define DMA1_Ch5_IRQHandler Vector7C /**< DMA1 Channel 5. */ -#define DMA1_Ch6_IRQHandler Vector80 /**< DMA1 Channel 6. */ -#define DMA1_Ch7_IRQHandler Vector84 /**< DMA1 Channel 7. */ -#define ADC1_2_IRQHandler Vector88 /**< ADC1_2. */ -#define CAN1_TX_IRQHandler Vector8C /**< CAN1 TX. */ -#define USB_HP_IRQHandler Vector8C /**< USB High Priority, CAN1 TX.*/ -#define CAN1_RX0_IRQHandler Vector90 /**< CAN1 RX0. */ -#define USB_LP_IRQHandler Vector90 /**< USB Low Priority, CAN1 RX0.*/ -#define CAN1_RX1_IRQHandler Vector94 /**< CAN1 RX1. */ -#define CAN1_SCE_IRQHandler Vector98 /**< CAN1 SCE. */ -#define EXTI9_5_IRQHandler Vector9C /**< EXTI Line 9..5. */ -#define TIM1_BRK_IRQHandler VectorA0 /**< TIM1 Break. */ -#define TIM1_UP_IRQHandler VectorA4 /**< TIM1 Update. */ -#define TIM1_TRG_COM_IRQHandler VectorA8 /**< TIM1 Trigger and - Commutation. */ -#define TIM1_CC_IRQHandler VectorAC /**< TIM1 Capture Compare. */ -#define TIM2_IRQHandler VectorB0 /**< TIM2. */ -#define TIM3_IRQHandler VectorB4 /**< TIM3. */ -#define TIM4_IRQHandler VectorB8 /**< TIM4. */ -#define I2C1_EV_IRQHandler VectorBC /**< I2C1 Event. */ -#define I2C1_ER_IRQHandler VectorC0 /**< I2C1 Error. */ -#define I2C2_EV_IRQHandler VectorC4 /**< I2C2 Event. */ -#define I2C2_ER_IRQHandler VectorC8 /**< I2C2 Error. */ -#define SPI1_IRQHandler VectorCC /**< SPI1. */ -#define SPI2_IRQHandler VectorD0 /**< SPI2. */ -#define USART1_IRQHandler VectorD4 /**< USART1. */ -#define USART2_IRQHandler VectorD8 /**< USART2. */ -#define USART3_IRQHandler VectorDC /**< USART3. */ -#define EXTI15_10_IRQHandler VectorE0 /**< EXTI Line 15..10. */ -#define RTC_Alarm_IRQHandler VectorE4 /**< RTC Alarm through EXTI. */ -#define USB_FS_WKUP_IRQHandler VectorE8 /**< USB Wakeup from suspend. */ -#define TIM8_BRK_IRQHandler VectorEC /**< TIM8 Break. */ -#define TIM8_UP_IRQHandler VectorF0 /**< TIM8 Update. */ -#define TIM8_TRG_COM_IRQHandler VectorF4 /**< TIM8 Trigger and - Commutation. */ -#define TIM8_CC_IRQHandler VectorF8 /**< TIM8 Capture Compare. */ -#define ADC3_IRQHandler VectorFC /**< ADC3. */ -#define FSMC_IRQHandler Vector100 /**< FSMC. */ -#define SDIO_IRQHandler Vector104 /**< SDIO. */ -#define TIM5_IRQHandler Vector108 /**< TIM5. */ -#define SPI3_IRQHandler Vector10C /**< SPI3. */ -#define UART4_IRQHandler Vector110 /**< UART4. */ -#define UART5_IRQHandler Vector114 /**< UART5. */ -#define TIM6_IRQHandler Vector118 /**< TIM6. */ -#define TIM7_IRQHandler Vector11C /**< TIM7. */ -#define DMA2_Ch1_IRQHandler Vector120 /**< DMA2 Channel1. */ -#define DMA2_Ch2_IRQHandler Vector124 /**< DMA2 Channel2. */ -#define DMA2_Ch3_IRQHandler Vector128 /**< DMA2 Channel3. */ -#define DMA2_Ch4_5_IRQHandler Vector12C /**< DMA2 Channel4 & Channel5. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Main clock source selection. - * @note If the selected clock source is not the PLL then the PLL is not - * initialized and started. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -/** - * @brief Clock source for the PLL. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSE -#endif - -/** - * @brief Crystal PLL pre-divider. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLXTPRE) || defined(__DOXYGEN__) -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#endif - -/** - * @brief PLL multiplier value. - * @note The allowed range is 2...16. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLMUL_VALUE 9 -#endif - -/** - * @brief AHB prescaler value. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE1) || defined(__DOXYGEN__) -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#endif - -/** - * @brief APB2 prescaler value. - */ -#if !defined(STM32_PPRE2) || defined(__DOXYGEN__) -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#endif - -/** - * @brief ADC prescaler value. - */ -#if !defined(STM32_ADCPRE) || defined(__DOXYGEN__) -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#endif - -/** - * @brief USB clock setting. - */ -#if !defined(STM32_USB_CLOCK_REQUIRED) || defined(__DOXYGEN__) -#define STM32_USB_CLOCK_REQUIRED TRUE -#endif - -/** - * @brief USB prescaler initialization. - */ -#if !defined(STM32_USBPRE) || defined(__DOXYGEN__) -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#endif - -/** - * @brief MCO pin setting. - */ -#if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#endif - -/** - * @brief RTC clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_LSI -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Configuration-related checks. - */ -#if !defined(STM32F103_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F103_MCUCONF not defined" -#endif - -/* - * HSI related checks. - */ -#if STM32_HSI_ENABLED -#else /* !STM32_HSI_ENABLED */ - -#if STM32_SW == STM32_SW_HSI -#error "HSI not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCOSEL" -#endif - -#endif /* !STM32_HSI_ENABLED */ - -/* - * HSE related checks. - */ -#if STM32_HSE_ENABLED - -#if STM32_HSECLK == 0 -#error "HSE frequency not defined" -#elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" -#endif - -#else /* !STM32_HSE_ENABLED */ - -#if STM32_SW == STM32_SW_HSE -#error "HSE not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE) -#error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) -#error "HSE not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#error "HSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_HSE_ENABLED */ - -/* - * LSI related checks. - */ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSI -#error "LSI not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSI_ENABLED */ - -/* - * LSE related checks. - */ -#if STM32_LSE_ENABLED - -#if (STM32_LSECLK == 0) -#error "LSE frequency not defined" -#endif - -#if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) -#error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" -#endif - -#else /* !STM32_LSE_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSE -#error "LSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSE_ENABLED */ - -/* PLL activation conditions.*/ -#if STM32_USB_CLOCK_REQUIRED || \ - (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) || \ - defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLL TRUE -#else -#define STM32_ACTIVATE_PLL FALSE -#endif - -/* HSE prescaler setting check.*/ -#if (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV1) && \ - (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV2) -#error "invalid STM32_PLLXTPRE value specified" -#endif - -/** - * @brief PLLMUL field. - */ -#if ((STM32_PLLMUL_VALUE >= 2) && (STM32_PLLMUL_VALUE <= 16)) || \ - defined(__DOXYGEN__) -#define STM32_PLLMUL ((STM32_PLLMUL_VALUE - 2) << 18) -#else -#error "invalid STM32_PLLMUL_VALUE value specified" -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) -#if STM32_PLLXTPRE == STM32_PLLXTPRE_DIV1 -#define STM32_PLLCLKIN (STM32_HSECLK / 1) -#else -#define STM32_PLLCLKIN (STM32_HSECLK / 2) -#endif -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN (STM32_HSICLK / 2) -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* PLL input frequency range check.*/ -#if (STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX) -#error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) - -/* PLL output frequency range check.*/ -#if (STM32_PLLCLKOUT < STM32_PLLOUT_MIN) || (STM32_PLLCLKOUT > STM32_PLLOUT_MAX) -#error "STM32_PLLCLKOUT outside acceptable range (STM32_PLLOUT_MIN...STM32_PLLOUT_MAX)" -#endif - -/** - * @brief System clock source. - */ -#if (STM32_SW == STM32_SW_PLL) || defined(__DOXYGEN__) -#define STM32_SYSCLK STM32_PLLCLKOUT -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#else -#error "invalid STM32_SYSCLK_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* AHB frequency check.*/ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB1 frequency. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK1 (STM32_HCLK / 1) -#elif STM32_PPRE1 == STM32_PPRE1_DIV2 -#define STM32_PCLK1 (STM32_HCLK / 2) -#elif STM32_PPRE1 == STM32_PPRE1_DIV4 -#define STM32_PCLK1 (STM32_HCLK / 4) -#elif STM32_PPRE1 == STM32_PPRE1_DIV8 -#define STM32_PCLK1 (STM32_HCLK / 8) -#elif STM32_PPRE1 == STM32_PPRE1_DIV16 -#define STM32_PCLK1 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE1 value specified" -#endif - -/* APB1 frequency check.*/ -#if STM32_PCLK1 > STM32_PCLK1_MAX -#error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" -#endif - -/** - * @brief APB2 frequency. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK2 (STM32_HCLK / 1) -#elif STM32_PPRE2 == STM32_PPRE2_DIV2 -#define STM32_PCLK2 (STM32_HCLK / 2) -#elif STM32_PPRE2 == STM32_PPRE2_DIV4 -#define STM32_PCLK2 (STM32_HCLK / 4) -#elif STM32_PPRE2 == STM32_PPRE2_DIV8 -#define STM32_PCLK2 (STM32_HCLK / 8) -#elif STM32_PPRE2 == STM32_PPRE2_DIV16 -#define STM32_PCLK2 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE2 value specified" -#endif - -/* APB2 frequency check.*/ -#if STM32_PCLK2 > STM32_PCLK2_MAX -#error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" -#endif - -/** - * @brief RTC clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_LSE) || defined(__DOXYGEN__) -#define STM32_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM32_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM32_RTCCLK (STM32_HSECLK / 128) -#elif STM32_RTCSEL == STM32_RTCSEL_NOCLOCK -#define STM32_RTCCLK 0 -#else -#error "invalid source selected for RTC clock" -#endif - -/** - * @brief ADC frequency. - */ -#if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__) -#define STM32_ADCCLK (STM32_PCLK2 / 2) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV4 -#define STM32_ADCCLK (STM32_PCLK2 / 4) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV6 -#define STM32_ADCCLK (STM32_PCLK2 / 6) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV8 -#define STM32_ADCCLK (STM32_PCLK2 / 8) -#else -#error "invalid STM32_ADCPRE value specified" -#endif - -/* ADC frequency check.*/ -#if STM32_ADCCLK > STM32_ADCCLK_MAX -#error "STM32_ADCCLK exceeding maximum frequency (STM32_ADCCLK_MAX)" -#endif - -/** - * @brief USB frequency. - */ -#if (STM32_USBPRE == STM32_USBPRE_DIV1P5) || defined(__DOXYGEN__) -#define STM32_USBCLK ((STM32_PLLCLKOUT * 2) / 3) -#elif (STM32_USBPRE == STM32_USBPRE_DIV1) -#define STM32_USBCLK STM32_PLLCLKOUT -#else -#error "invalid STM32_USBPRE value specified" -#endif - -/** - * @brief Timers 2, 3, 4, 5, 6, 7, 12, 13, 14 clock. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK1 * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK1 * 2) -#endif - -/** - * @brief Timers 1, 8, 9, 10, 11 clock. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK2 (STM32_PCLK2 * 1) -#else -#define STM32_TIMCLK2 (STM32_PCLK2 * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= 24000000) || defined(__DOXYGEN__) -#define STM32_FLASHBITS 0x00000010 -#elif STM32_HCLK <= 48000000 -#define STM32_FLASHBITS 0x00000011 -#else -#define STM32_FLASHBITS 0x00000012 -#endif - -#endif /* _HAL_LLD_F103_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/hal_lld_f105_f107.h b/os/hal/platforms/STM32F1xx/hal_lld_f105_f107.h deleted file mode 100644 index 8248d323b8..0000000000 --- a/os/hal/platforms/STM32F1xx/hal_lld_f105_f107.h +++ /dev/null @@ -1,1048 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32F10X_CL_HAL STM32F105/F107 HAL Support - * @details HAL support for STM32 Connectivity Line sub-family. - * - * @ingroup HAL - */ - -/** - * @file STM32F1xx/hal_lld_f105_f107.h - * @brief STM32F10x Connectivity Line HAL subsystem low level driver header. - * - * @addtogroup STM32F10X_CL_HAL - * @{ - */ - -#ifndef _HAL_LLD_F105_F107_H_ -#define _HAL_LLD_F105_F107_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Platform identification - * @{ - */ -#define PLATFORM_NAME "STM32F10x Connectivity Line" -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Maximum system clock frequency. - */ -#define STM32_SYSCLK_MAX 72000000 - -/** - * @brief Maximum HSE clock frequency. - */ -#define STM32_HSECLK_MAX 50000000 - -/** - * @brief Minimum HSE clock frequency. - */ -#define STM32_HSECLK_MIN 1000000 - -/** - * @brief Maximum LSE clock frequency. - */ -#define STM32_LSECLK_MAX 1000000 - -/** - * @brief Minimum LSE clock frequency. - */ -#define STM32_LSECLK_MIN 32768 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLL1IN_MAX 12000000 - -/** - * @brief Maximum PLL1 input clock frequency. - */ -#define STM32_PLL1IN_MIN 3000000 - -/** - * @brief Maximum PLL1 input clock frequency. - */ -#define STM32_PLL23IN_MAX 5000000 - -/** - * @brief Maximum PLL2 and PLL3 input clock frequency. - */ -#define STM32_PLL23IN_MIN 3000000 - -/** - * @brief Maximum PLL1 VCO clock frequency. - */ -#define STM32_PLL1VCO_MAX 144000000 - -/** - * @brief Maximum PLL1 VCO clock frequency. - */ -#define STM32_PLL1VCO_MIN 36000000 - -/** - * @brief Maximum PLL2 and PLL3 VCO clock frequency. - */ -#define STM32_PLL23VCO_MAX 148000000 - -/** - * @brief Maximum PLL2 and PLL3 VCO clock frequency. - */ -#define STM32_PLL23VCO_MIN 80000000 - -/** - * @brief Maximum APB1 clock frequency. - */ -#define STM32_PCLK1_MAX 36000000 - -/** - * @brief Maximum APB2 clock frequency. - */ -#define STM32_PCLK2_MAX 72000000 - -/** - * @brief Maximum ADC clock frequency. - */ -#define STM32_ADCCLK_MAX 14000000 - -/** - * @brief Maximum SPI/I2S clock frequency. - */ -#define STM32_SPII2S_MAX 18000000 -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE1_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE1_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE1_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE1_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE1_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_PPRE2_DIV1 (0 << 11) /**< HCLK divided by 1. */ -#define STM32_PPRE2_DIV2 (4 << 11) /**< HCLK divided by 2. */ -#define STM32_PPRE2_DIV4 (5 << 11) /**< HCLK divided by 4. */ -#define STM32_PPRE2_DIV8 (6 << 11) /**< HCLK divided by 8. */ -#define STM32_PPRE2_DIV16 (7 << 11) /**< HCLK divided by 16. */ - -#define STM32_ADCPRE_DIV2 (0 << 14) /**< PPRE2 divided by 2. */ -#define STM32_ADCPRE_DIV4 (1 << 14) /**< PPRE2 divided by 4. */ -#define STM32_ADCPRE_DIV6 (2 << 14) /**< PPRE2 divided by 6. */ -#define STM32_ADCPRE_DIV8 (3 << 14) /**< PPRE2 divided by 8. */ - -#define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI. */ -#define STM32_PLLSRC_PREDIV1 (1 << 16) /**< PLL clock source is - PREDIV1. */ - -#define STM32_OTGFSPRE_DIV2 (1 << 22) /**< HCLK*2 divided by 2. */ -#define STM32_OTGFSPRE_DIV3 (0 << 22) /**< HCLK*2 divided by 3. */ - -#define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ -#define STM32_MCOSEL_SYSCLK (4 << 24) /**< SYSCLK on MCO pin. */ -#define STM32_MCOSEL_HSI (5 << 24) /**< HSI clock on MCO pin. */ -#define STM32_MCOSEL_HSE (6 << 24) /**< HSE clock on MCO pin. */ -#define STM32_MCOSEL_PLLDIV2 (7 << 24) /**< PLL/2 clock on MCO pin. */ -#define STM32_MCOSEL_PLL2 (8 << 24) /**< PLL2 clock on MCO pin. */ -#define STM32_MCOSEL_PLL3DIV2 (9 << 24) /**< PLL3/2 clock on MCO pin. */ -#define STM32_MCOSEL_XT1 (10 << 24) /**< XT1 clock on MCO pin. */ -#define STM32_MCOSEL_PLL3 (11 << 24) /**< PLL3 clock on MCO pin. */ -/** @} */ - -/** - * @name RCC_BDCR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 8) /**< RTC clock source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No clock. */ -#define STM32_RTCSEL_LSE (1 << 8) /**< LSE used as RTC clock. */ -#define STM32_RTCSEL_LSI (2 << 8) /**< LSI used as RTC clock. */ -#define STM32_RTCSEL_HSEDIV (3 << 8) /**< HSE divided by 128 used as - RTC clock. */ -/** @} */ - -/** - * @name RCC_CFGR2 register bits definitions - * @{ - */ -#define STM32_PREDIV1SRC_HSE (0 << 16) /**< PREDIV1 source is HSE. */ -#define STM32_PREDIV1SRC_PLL2 (1 << 16) /**< PREDIV1 source is PLL2. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name STM32F105/F107 CL capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 TRUE -#define STM32_HAS_ADC3 FALSE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 TRUE -#define STM32_CAN_MAX_FILTERS 28 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 TRUE - -/* ETH attributes.*/ -#define STM32_HAS_ETH TRUE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 20 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF FALSE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 TRUE -#define STM32_SPI3_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 1) -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 2) -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 TRUE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 TRUE -#define STM32_UART4_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 3)) -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 TRUE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB FALSE -#define STM32_HAS_OTG1 TRUE -#define STM32_HAS_OTG2 FALSE -/** @} */ - -/*===========================================================================*/ -/* Platform specific friendly IRQ names. */ -/*===========================================================================*/ - -/** - * @name IRQ VECTOR names - * @{ - */ -#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */ -#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line - detect. */ -#define TAMPER_IRQHandler Vector48 /**< Tamper. */ -#define RTC_IRQHandler Vector4C /**< RTC. */ -#define FLASH_IRQHandler Vector50 /**< Flash. */ -#define RCC_IRQHandler Vector54 /**< RCC. */ -#define EXTI0_IRQHandler Vector58 /**< EXTI Line 0. */ -#define EXTI1_IRQHandler Vector5C /**< EXTI Line 1. */ -#define EXTI2_IRQHandler Vector60 /**< EXTI Line 2. */ -#define EXTI3_IRQHandler Vector64 /**< EXTI Line 3. */ -#define EXTI4_IRQHandler Vector68 /**< EXTI Line 4. */ -#define DMA1_Ch1_IRQHandler Vector6C /**< DMA1 Channel 1. */ -#define DMA1_Ch2_IRQHandler Vector70 /**< DMA1 Channel 2. */ -#define DMA1_Ch3_IRQHandler Vector74 /**< DMA1 Channel 3. */ -#define DMA1_Ch4_IRQHandler Vector78 /**< DMA1 Channel 4. */ -#define DMA1_Ch5_IRQHandler Vector7C /**< DMA1 Channel 5. */ -#define DMA1_Ch6_IRQHandler Vector80 /**< DMA1 Channel 6. */ -#define DMA1_Ch7_IRQHandler Vector84 /**< DMA1 Channel 7. */ -#define ADC1_2_IRQHandler Vector88 /**< ADC1 and ADC2. */ -#define CAN1_TX_IRQHandler Vector8C /**< CAN1 TX. */ -#define CAN1_RX0_IRQHandler Vector90 /**< CAN1 RX0. */ -#define CAN1_RX1_IRQHandler Vector94 /**< CAN1 RX1. */ -#define CAN1_SCE_IRQHandler Vector98 /**< CAN1 SCE. */ -#define EXTI9_5_IRQHandler Vector9C /**< EXTI Line 9..5. */ -#define TIM1_BRK_IRQHandler VectorA0 /**< TIM1 Break. */ -#define TIM1_UP_IRQHandler VectorA4 /**< TIM1 Update. */ -#define TIM1_TRG_COM_IRQHandler VectorA8 /**< TIM1 Trigger and - Commutation. */ -#define TIM1_CC_IRQHandler VectorAC /**< TIM1 Capture Compare. */ -#define TIM2_IRQHandler VectorB0 /**< TIM2. */ -#define TIM3_IRQHandler VectorB4 /**< TIM3. */ -#define TIM4_IRQHandler VectorB8 /**< TIM4. */ -#define I2C1_EV_IRQHandler VectorBC /**< I2C1 Event. */ -#define I2C1_ER_IRQHandler VectorC0 /**< I2C1 Error. */ -#define I2C2_EV_IRQHandler VectorC4 /**< I2C2 Event. */ -#define I2C2_ER_IRQHandler VectorC8 /**< I2C1 Error. */ -#define SPI1_IRQHandler VectorCC /**< SPI1. */ -#define SPI2_IRQHandler VectorD0 /**< SPI2. */ -#define USART1_IRQHandler VectorD4 /**< USART1. */ -#define USART2_IRQHandler VectorD8 /**< USART2. */ -#define USART3_IRQHandler VectorDC /**< USART3. */ -#define EXTI15_10_IRQHandler VectorE0 /**< EXTI Line 15..10. */ -#define RTC_Alarm_IRQHandler VectorE4 /**< RTC alarm through EXTI - line. */ -#define OTG_FS_WKUP_IRQHandler VectorE8 /**< USB OTG FS Wakeup through - EXTI line. */ -#define TIM5_IRQHandler Vector108 /**< TIM5. */ -#define SPI3_IRQHandler Vector10C /**< SPI3. */ -#define UART4_IRQHandler Vector110 /**< UART4. */ -#define UART5_IRQHandler Vector114 /**< UART5. */ -#define TIM6_IRQHandler Vector118 /**< TIM6. */ -#define TIM7_IRQHandler Vector11C /**< TIM7. */ -#define DMA2_Ch1_IRQHandler Vector120 /**< DMA2 Channel1. */ -#define DMA2_Ch2_IRQHandler Vector124 /**< DMA2 Channel2. */ -#define DMA2_Ch3_IRQHandler Vector128 /**< DMA2 Channel3. */ -#define DMA2_Ch4_IRQHandler Vector12C /**< DMA2 Channel4. */ -#define DMA2_Ch5_IRQHandler Vector130 /**< DMA2 Channel5. */ -#define ETH_IRQHandler Vector134 /**< Ethernet. */ -#define ETH_WKUP_IRQHandler Vector138 /**< Ethernet Wakeup through - EXTI line. */ -#define CAN2_TX_IRQHandler Vector13C /**< CAN2 TX. */ -#define CAN2_RX0_IRQHandler Vector140 /**< CAN2 RX0. */ -#define CAN2_RX1_IRQHandler Vector144 /**< CAN2 RX1. */ -#define CAN2_SCE_IRQHandler Vector148 /**< CAN2 SCE. */ -#define OTG_FS_IRQHandler Vector14C /**< USB OTG FS. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Main clock source selection. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -/** - * @brief Clock source for the PLL. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_PREDIV1 -#endif - -/** - * @brief PREDIV1 clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_PREDIV1SRC) || defined(__DOXYGEN__) -#define STM32_PREDIV1SRC STM32_PREDIV1SRC_HSE -#endif - -/** - * @brief PREDIV1 division factor. - * @note The allowed range is 1...16. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_PREDIV1_VALUE) || defined(__DOXYGEN__) -#define STM32_PREDIV1_VALUE 5 -#endif - -/** - * @brief PLL multiplier value. - * @note The allowed range is 4...9. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLMUL_VALUE 9 -#endif - -/** - * @brief PREDIV2 division factor. - * @note The allowed range is 1...16. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_PREDIV2_VALUE) || defined(__DOXYGEN__) -#define STM32_PREDIV2_VALUE 5 -#endif - -/** - * @brief PLL2 multiplier value. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_PLL2MUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLL2MUL_VALUE 8 -#endif - -/** - * @brief PLL3 multiplier value. - * @note The default value is calculated for a 50MHz clock from - * a 25MHz crystal. - */ -#if !defined(STM32_PLL3MUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLL3MUL_VALUE 10 -#endif - -/** - * @brief AHB prescaler value. - * @note The default value is calculated for a 72MHz system clock from - * a 25MHz crystal using both PLL and PLL2. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE1) || defined(__DOXYGEN__) -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#endif - -/** - * @brief APB2 prescaler value. - */ -#if !defined(STM32_PPRE2) || defined(__DOXYGEN__) -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#endif - -/** - * @brief ADC prescaler value. - */ -#if !defined(STM32_ADCPRE) || defined(__DOXYGEN__) -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#endif - -/** - * @brief USB clock setting. - */ -#if !defined(STM32_OTG_CLOCK_REQUIRED) || defined(__DOXYGEN__) -#define STM32_OTG_CLOCK_REQUIRED TRUE -#endif - -/** - * @brief OTG prescaler initialization. - */ -#if !defined(STM32_OTGFSPRE) || defined(__DOXYGEN__) -#define STM32_OTGFSPRE STM32_OTGFSPRE_DIV3 -#endif - -/** - * @brief Dedicated I2S clock setting. - */ -#if !defined(STM32_I2S_CLOCK_REQUIRED) || defined(__DOXYGEN__) -#define STM32_I2S_CLOCK_REQUIRED FALSE -#endif - -/** - * @brief MCO pin setting. - */ -#if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#endif - -/** - * @brief RTC clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Configuration-related checks. - */ -#if !defined(STM32F107_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F107_MCUCONF not defined" -#endif - -/* - * HSI related checks. - */ -#if STM32_HSI_ENABLED -#else /* !STM32_HSI_ENABLED */ - -#if STM32_SW == STM32_SW_HSI -#error "HSI not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCOSEL" -#endif - -#endif /* !STM32_HSI_ENABLED */ - -/* - * HSE related checks. - */ -#if STM32_HSE_ENABLED - -#if STM32_HSECLK == 0 -#error "HSE frequency not defined" -#elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" -#endif - -#else /* !STM32_HSE_ENABLED */ - -#if STM32_SW == STM32_SW_HSE -#error "HSE not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_PREDIV1) -#error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLL2DIV2) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLL3DIV2) || \ - (STM32_MCOSEL == STM32_MCOSEL_XT1) -#error "HSE not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#error "HSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_HSE_ENABLED */ - -/* - * LSI related checks. - */ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSI -#error "LSI not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSI_ENABLED */ - -/* - * LSE related checks. - */ -#if STM32_LSE_ENABLED - -#if (STM32_LSECLK == 0) -#error "LSE frequency not defined" -#endif - -#if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) -#error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" -#endif - -#else /* !STM32_LSE_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSE -#error "LSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSE_ENABLED */ - -/* PLL1 activation conditions.*/ -#if STM32_OTG_CLOCK_REQUIRED || \ - (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) || \ - defined(__DOXYGEN__) -/** - * @brief PLL1 activation flag. - */ -#define STM32_ACTIVATE_PLL1 TRUE -#else -#define STM32_ACTIVATE_PLL1 FALSE -#endif - -/* PLL2 activation conditions.*/ -#if STM32_OTG_CLOCK_REQUIRED || \ - (STM32_PREDIV1SRC == STM32_PREDIV1SRC_PLL2) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLL2DIV2) || \ - defined(__DOXYGEN__) -/** - * @brief PLL2 activation flag. - */ -#define STM32_ACTIVATE_PLL2 TRUE -#else -#define STM32_ACTIVATE_PLL2 FALSE -#endif - -/* PLL3 activation conditions.*/ -#if STM32_I2S_CLOCK_REQUIRED || \ - (STM32_MCOSEL == STM32_MCOSEL_PLL3DIV2) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLL3) || \ - defined(__DOXYGEN__) -/** - * @brief PLL3 activation flag. - */ -#define STM32_ACTIVATE_PLL3 TRUE -#else -#define STM32_ACTIVATE_PLL3 FALSE -#endif - -/** - * @brief PREDIV1 field. - */ -#if (STM32_PREDIV1_VALUE >= 1) && (STM32_PREDIV1_VALUE <= 16) || \ - defined(__DOXYGEN__) -#define STM32_PREDIV1 ((STM32_PREDIV1_VALUE - 1) << 0) -#else -#error "invalid STM32_PREDIV1_VALUE value specified" -#endif - -/** - * @brief PREDIV2 field. - */ -#if (STM32_PREDIV2_VALUE >= 1) && (STM32_PREDIV2_VALUE <= 16) || \ - defined(__DOXYGEN__) -#define STM32_PREDIV2 ((STM32_PREDIV2_VALUE - 1) << 4) -#else -#error "invalid STM32_PREDIV2_VALUE value specified" -#endif - -/** - * @brief PLLMUL field. - */ -#if ((STM32_PLLMUL_VALUE >= 4) && (STM32_PLLMUL_VALUE <= 9)) || \ - defined(__DOXYGEN__) -#define STM32_PLLMUL ((STM32_PLLMUL_VALUE - 2) << 18) -#else -#error "invalid STM32_PLLMUL_VALUE value specified" -#endif - -/** - * @brief PLL2MUL field. - */ -#if ((STM32_PLL2MUL_VALUE >= 8) && (STM32_PLL2MUL_VALUE <= 14)) || \ - defined(__DOXYGEN__) -#define STM32_PLL2MUL ((STM32_PLL2MUL_VALUE - 2) << 8) -#elif (STM32_PLL2MUL_VALUE == 16) -#define STM32_PLL2MUL (14 << 8) -#elif (STM32_PLL2MUL_VALUE == 20) -#define STM32_PLL2MUL (15 << 8) -#else -#error "invalid STM32_PLL2MUL_VALUE value specified" -#endif - -/** - * @brief PLL3MUL field. - */ -#if ((STM32_PLL3MUL_VALUE >= 8) && (STM32_PLL3MUL_VALUE <= 14)) || \ - defined(__DOXYGEN__) -#define STM32_PLL3MUL ((STM32_PLL3MUL_VALUE - 2) << 12) -#elif (STM32_PLL3MUL_VALUE == 16) -#define STM32_PLL3MUL (14 << 12) -#elif (STM32_PLL3MUL_VALUE == 20) -#define STM32_PLL3MUL (15 << 12) -#else -#error "invalid STM32_PLL3MUL_VALUE value specified" -#endif - -/** - * @brief PLL2 input frequency. - */ -#define STM32_PLL2CLKIN (STM32_HSECLK / STM32_PREDIV2_VALUE) - -/* PLL2 input frequency range check.*/ -#if (STM32_PLL2CLKIN < STM32_PLL23IN_MIN) || \ - (STM32_PLL2CLKIN > STM32_PLL23IN_MAX) -#error "STM32_PLL2CLKIN outside acceptable range (STM32_PLL23IN_MIN...STM32_PLL23IN_MAX)" -#endif - -/** - * @brief PLL2 output clock frequency. - */ -#define STM32_PLL2CLKOUT (STM32_PLL2CLKIN * STM32_PLL2MUL_VALUE) - -/** - * @brief PLL2 VCO clock frequency. - */ -#define STM32_PLL2VCO (STM32_PLL2CLKOUT * 2) - -/* PLL2 output frequency range check.*/ -#if (STM32_PLL2VCO < STM32_PLL23VCO_MIN) || \ - (STM32_PLL2VCO > STM32_PLL23VCO_MAX) -#error "STM32_PLL2VCO outside acceptable range (STM32_PLL23VCO_MIN...STM32_PLL23VCO_MAX)" -#endif - -/** - * @brief PLL3 input frequency. - */ -#define STM32_PLL3CLKIN (STM32_HSECLK / STM32_PREDIV2_VALUE) - -/* PLL3 input frequency range check.*/ -#if (STM32_PLL3CLKIN < STM32_PLL23IN_MIN) || \ - (STM32_PLL3CLKIN > STM32_PLL23IN_MAX) -#error "STM32_PLL3CLKIN outside acceptable range (STM32_PLL23IN_MIN...STM32_PLL23IN_MAX)" -#endif - -/** - * @brief PLL3 output clock frequency. - */ -#define STM32_PLL3CLKOUT (STM32_PLL3CLKIN * STM32_PLL3MUL_VALUE) - -/** - * @brief PLL3 VCO clock frequency. - */ -#define STM32_PLL3VCO (STM32_PLL3CLKOUT * 2) - -/* PLL3 output frequency range check.*/ -#if (STM32_PLL3VCO < STM32_PLL23VCO_MIN) || \ - (STM32_PLL3VCO > STM32_PLL23VCO_MAX) -#error "STM32_PLL3CLKOUT outside acceptable range (STM32_PLL23VCO_MIN...STM32_PLL23VCO_MAX)" -#endif - -/** - * @brief PREDIV1 input frequency. - */ -#if (STM32_PREDIV1SRC == STM32_PREDIV1SRC_HSE) || defined(__DOXYGEN__) -#define STM32_PREDIV1CLK STM32_HSECLK -#elif STM32_PREDIV1SRC == STM32_PREDIV1SRC_PLL2 -#define STM32_PREDIV1CLK STM32_PLL2CLKOUT -#else -#error "invalid STM32_PREDIV1SRC value specified" -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_PREDIV1) || defined(__DOXYGEN__) -#define STM32_PLLCLKIN (STM32_PREDIV1CLK / STM32_PREDIV1_VALUE) -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN (STM32_HSICLK / 2) -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* PLL input frequency range check.*/ -#if (STM32_PLLCLKIN < STM32_PLL1IN_MIN) || (STM32_PLLCLKIN > STM32_PLL1IN_MAX) -#error "STM32_PLLCLKIN outside acceptable range (STM32_PLL1IN_MIN...STM32_PLL1IN_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) - -/** - * @brief PLL VCO clock frequency. - */ -#define STM32_PLLVCO (STM32_PLLCLKOUT * 2) - -/* PLL output frequency range check.*/ -#if (STM32_PLLVCO < STM32_PLL1VCO_MIN) || (STM32_PLLVCO > STM32_PLL1VCO_MAX) -#error "STM32_PLLVCO outside acceptable range (STM32_PLL1VCO_MIN...STM32_PLL1VCO_MAX)" -#endif - -/** - * @brief System clock source. - */ -#if (STM32_SW == STM32_SW_PLL) || defined(__DOXYGEN__) -#define STM32_SYSCLK STM32_PLLCLKOUT -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#else -#error "invalid STM32_SYSCLK_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* AHB frequency check.*/ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB1 frequency. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK1 (STM32_HCLK / 1) -#elif STM32_PPRE1 == STM32_PPRE1_DIV2 -#define STM32_PCLK1 (STM32_HCLK / 2) -#elif STM32_PPRE1 == STM32_PPRE1_DIV4 -#define STM32_PCLK1 (STM32_HCLK / 4) -#elif STM32_PPRE1 == STM32_PPRE1_DIV8 -#define STM32_PCLK1 (STM32_HCLK / 8) -#elif STM32_PPRE1 == STM32_PPRE1_DIV16 -#define STM32_PCLK1 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE1 value specified" -#endif - -/* APB1 frequency check.*/ -#if STM32_PCLK1 > STM32_PCLK1_MAX -#error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" -#endif - -/** - * @brief APB2 frequency. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK2 (STM32_HCLK / 1) -#elif STM32_PPRE2 == STM32_PPRE2_DIV2 -#define STM32_PCLK2 (STM32_HCLK / 2) -#elif STM32_PPRE2 == STM32_PPRE2_DIV4 -#define STM32_PCLK2 (STM32_HCLK / 4) -#elif STM32_PPRE2 == STM32_PPRE2_DIV8 -#define STM32_PCLK2 (STM32_HCLK / 8) -#elif STM32_PPRE2 == STM32_PPRE2_DIV16 -#define STM32_PCLK2 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE2 value specified" -#endif - -/* APB2 frequency check.*/ -#if STM32_PCLK2 > STM32_PCLK2_MAX -#error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" -#endif - -/** - * @brief RTC clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_LSE) || defined(__DOXYGEN__) -#define STM32_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM32_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM32_RTCCLK (STM32_HSECLK / 128) -#elif STM32_RTCSEL == STM32_RTCSEL_NOCLOCK -#define STM32_RTCCLK 0 -#else -#error "invalid source selected for RTC clock" -#endif - -/** - * @brief ADC frequency. - */ -#if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__) -#define STM32_ADCCLK (STM32_PCLK2 / 2) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV4 -#define STM32_ADCCLK (STM32_PCLK2 / 4) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV6 -#define STM32_ADCCLK (STM32_PCLK2 / 6) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV8 -#define STM32_ADCCLK (STM32_PCLK2 / 8) -#else -#error "invalid STM32_ADCPRE value specified" -#endif - -/* ADC frequency check.*/ -#if STM32_ADCCLK > STM32_ADCCLK_MAX -#error "STM32_ADCCLK exceeding maximum frequency (STM32_ADCCLK_MAX)" -#endif - -/** - * @brief OTG frequency. - */ -#if (STM32_OTGFSPRE == STM32_OTGFSPRE_DIV3) || defined(__DOXYGEN__) -#define STM32_OTGFSCLK (STM32_PLLVCO / 3) -#elif (STM32_OTGFSPRE == STM32_OTGFSPRE_DIV2) -#define STM32_OTGFSCLK (STM32_PLLVCO / 2) -#else -#error "invalid STM32_OTGFSPRE value specified" -#endif - -/** - * @brief Timers 2, 3, 4, 5, 6, 7 clock. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK1 * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK1 * 2) -#endif - -/** - * @brief Timers 1, 8 clock. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK2 (STM32_PCLK2 * 1) -#else -#define STM32_TIMCLK2 (STM32_PCLK2 * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= 24000000) || defined(__DOXYGEN__) -#define STM32_FLASHBITS 0x00000010 -#elif STM32_HCLK <= 48000000 -#define STM32_FLASHBITS 0x00000011 -#else -#define STM32_FLASHBITS 0x00000012 -#endif - -#endif /* _HAL_LLD_F105_F107_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/platform.dox b/os/hal/platforms/STM32F1xx/platform.dox deleted file mode 100644 index 0504210f60..0000000000 --- a/os/hal/platforms/STM32F1xx/platform.dox +++ /dev/null @@ -1,402 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32F1xx_DRIVERS STM32F1xx Drivers - * @details This section describes all the supported drivers on the STM32F1xx - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup STM32F1xx_HAL STM32F1xx Initialization Support - * @details The STM32F1xx HAL support is responsible for system initialization. - * - * @section stm32f1xx_hal_1 Supported HW resources - * - PLL1. - * - PLL2 (where present). - * - RCC. - * - Flash. - * . - * @section stm32f1xx_hal_2 STM32F1xx HAL driver implementation features - * - PLLs startup and stabilization. - * - Clock tree initialization. - * - Clock source selection. - * - Flash wait states initialization based on the selected clock options. - * - SYSTICK initialization based on current clock and kernel required rate. - * - DMA support initialization. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_ADC STM32F1xx ADC Support - * @details The STM32F1xx ADC driver supports the ADC peripherals using DMA - * channels for maximum performance. - * - * @section stm32f1xx_adc_1 Supported HW resources - * - ADC1. - * - DMA1. - * . - * @section stm32f1xx_adc_2 STM32F1xx ADC driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Streaming conversion using DMA for maximum performance. - * - Programmable ADC interrupt priority level. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - DMA errors detection. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_CAN STM32F1xx CAN Support - * @details The STM32F1xx CAN driver uses the CAN peripherals. - * - * @section stm32f1xx_can_1 Supported HW resources - * - bxCAN1. - * . - * @section stm32f1xx_can_2 STM32F1xx CAN driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Support for bxCAN sleep mode. - * - Programmable bxCAN interrupts priority level. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_EXT STM32F1xx EXT Support - * @details The STM32F1xx EXT driver uses the EXTI peripheral. - * - * @section stm32f1xx_ext_1 Supported HW resources - * - EXTI. - * . - * @section stm32f1xx_ext_2 STM32F1xx EXT driver implementation features - * - Each EXTI channel can be independently enabled and programmed. - * - Programmable EXTI interrupts priority level. - * - Capability to work as event sources (WFE) rather than interrupt sources. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_GPT STM32F1xx GPT Support - * @details The STM32F1xx GPT driver uses the TIMx peripherals. - * - * @section stm32f1xx_gpt_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * - TIM5. - * . - * @section stm32f1xx_gpt_2 STM32F1xx GPT driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_I2C STM32F1xx I2C Support - * @details The STM32F1xx I2C driver uses the I2Cx peripherals. - * - * @section stm32f1xx_i2c_1 Supported HW resources - * - I2C1. - * - I2C2. - * . - * @section stm32f1xx_i2c_2 STM32F1xx I2C driver implementation features - * - Each I2C port can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable I2Cx interrupts priority level. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_ICU STM32F1xx ICU Support - * @details The STM32F1xx ICU driver uses the TIMx peripherals. - * - * @section stm32f1xx_icu_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * - TIM5. - * . - * @section stm32f1xx_icu_2 STM32F1xx ICU driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_MAC STM32F1xx MAC Support - * @details The STM32 MAC driver supports the ETH peripheral. - * - * @section at91sam7_mac_1 Supported HW resources - * - ETH. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_PAL STM32F1xx PAL Support - * @details The STM32F1xx PAL driver uses the GPIO peripherals. - * - * @section stm32f1xx_pal_1 Supported HW resources - * - AFIO. - * - GPIOA. - * - GPIOB. - * - GPIOC. - * - GPIOD. - * - GPIOE (where present). - * - GPIOF (where present). - * - GPIOG (where present). - * . - * @section stm32f1xx_pal_2 STM32F1xx PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 16 bits wide ports. - * - Atomic set/reset functions. - * - Atomic set+reset function (atomic bus operations). - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section stm32f1xx_pal_3 Supported PAL setup modes - * The STM32F1xx PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_INPUT_PULLDOWN. - * - @p PAL_MODE_INPUT_ANALOG. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * - @p PAL_MODE_STM32F1xx_ALTERNATE_PUSHPULL (non standard). - * - @p PAL_MODE_STM32F1xx_ALTERNATE_OPENDRAIN (non standard). - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section stm32f1xx_pal_4 Suboptimal behavior - * The STM32F1xx GPIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * - Writing on pads/groups/ports programmed as input with pull-up/down - * resistor can change the resistor setting because the output latch is - * used for resistor selection. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_PWM STM32F1xx PWM Support - * @details The STM32F1xx PWM driver uses the TIMx peripherals. - * - * @section stm32f1xx_pwm_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * - TIM5. - * . - * @section stm32f1xx_pwm_2 STM32F1xx PWM driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Four independent PWM channels per timer. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_RTC STM32F1xx RTC Support - * @details The STM32F1xx RTC driver uses the RTC peripheral. - * - * @section stm32f1xx_rtc_1 Supported HW resources - * - RTC. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_SDC STM32F1xx SDC Support - * @details The STM32F1xx SDC driver uses the SDIO peripheral. - * - * @section stm32f1xx_sdc_1 Supported HW resources - * - SDIO. - * - DMA2. - * . - * @section stm32f1xx_sdc_2 STM32F1xx SDC driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Programmable interrupt priority. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_SERIAL STM32F1xx Serial Support - * @details The STM32F1xx Serial driver uses the USART/UART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section stm32f1xx_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - USART3 (where present). - * - UART4 (where present). - * - UART5 (where present). - * . - * @section stm32f1xx_serial_2 STM32F1xx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable priority levels for each UART/USART. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_SPI STM32F1xx SPI Support - * @details The SPI driver supports the STM32F1xx SPI peripherals using DMA - * channels for maximum performance. - * - * @section stm32f1xx_spi_1 Supported HW resources - * - SPI1. - * - SPI2. - * - SPI3 (where present). - * - DMA1. - * - DMA2 (where present). - * . - * @section stm32f1xx_spi_2 STM32F1xx SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SPI can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each SPI. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_UART STM32F1xx UART Support - * @details The UART driver supports the STM32F1xx USART peripherals using DMA - * channels for maximum performance. - * - * @section stm32f1xx_uart_1 Supported HW resources - * The UART driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - USART3 (where present). - * - UART4 (where present). - * - DMA1. - * - DMA2 (where present). - * . - * @section stm32f1xx_uart_2 STM32F1xx UART driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each UART/USART. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_USB STM32F1xx USB Support - * @details The USB driver supports the STM32F1xx USB peripheral. - * - * @section stm32f1xx_usb_1 Supported HW resources - * The USB driver can support any of the following hardware resources: - * - USB. - * . - * @section stm32f1xx_usb_2 STM32F1xx USB driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Programmable interrupt priority levels. - * - Each endpoint programmable in Control, Bulk and Interrupt modes. - * . - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_PLATFORM_DRIVERS STM32F1xx Platform Drivers - * @details Platform support drivers. Platform drivers do not implement HAL - * standard driver templates, their role is to support platform - * specific functionalities. - * - * @ingroup STM32F1xx_DRIVERS - */ - -/** - * @defgroup STM32F1xx_DMA STM32F1xx DMA Support - * @details This DMA helper driver is used by the other drivers in order to - * access the shared DMA resources in a consistent way. - * - * @section stm32f1xx_dma_1 Supported HW resources - * The DMA driver can support any of the following hardware resources: - * - DMA1. - * - DMA2 (where present). - * . - * @section stm32f1xx_dma_2 STM32F1xx DMA driver implementation features - * - Exports helper functions/macros to the other drivers that share the - * DMA resource. - * - Automatic DMA clock stop when not in use by any driver. - * - DMA streams and interrupt vectors sharing among multiple drivers. - * . - * @ingroup STM32F1xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32F1xx_ISR STM32F1xx ISR Support - * @details This ISR helper driver is used by the other drivers in order to - * map ISR names to physical vector names. - * - * @ingroup STM32F1xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32F1xx_RCC STM32F1xx RCC Support - * @details This RCC helper driver is used by the other drivers in order to - * access the shared RCC resources in a consistent way. - * - * @section stm32f1xx_rcc_1 Supported HW resources - * - RCC. - * . - * @section stm32f1xx_rcc_2 STM32F1xx RCC driver implementation features - * - Peripherals reset. - * - Peripherals clock enable. - * - Peripherals clock disable. - * . - * @ingroup STM32F1xx_PLATFORM_DRIVERS - */ diff --git a/os/hal/platforms/STM32F1xx/platform.mk b/os/hal/platforms/STM32F1xx/platform.mk deleted file mode 100644 index 80b65fd9ae..0000000000 --- a/os/hal/platforms/STM32F1xx/platform.mk +++ /dev/null @@ -1,29 +0,0 @@ -# List of all the STM32F1xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F1xx/stm32_dma.c \ - ${CHIBIOS}/os/hal/platforms/STM32F1xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F1xx/adc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F1xx/ext_lld_isr.c \ - ${CHIBIOS}/os/hal/platforms/STM32/can_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/ext_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/mac_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/sdc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv1/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1/i2c_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/RTCv1/rtc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1/uart_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USBv1/usb_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F1xx \ - ${CHIBIOS}/os/hal/platforms/STM32 \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/RTCv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/USBv1 - diff --git a/os/hal/platforms/STM32F1xx/platform_f105_f107.mk b/os/hal/platforms/STM32F1xx/platform_f105_f107.mk deleted file mode 100644 index 2967a47622..0000000000 --- a/os/hal/platforms/STM32F1xx/platform_f105_f107.mk +++ /dev/null @@ -1,29 +0,0 @@ -# List of all the STM32F1xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F1xx/stm32_dma.c \ - ${CHIBIOS}/os/hal/platforms/STM32F1xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F1xx/adc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F1xx/ext_lld_isr.c \ - ${CHIBIOS}/os/hal/platforms/STM32/can_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/ext_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/mac_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/sdc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv1/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1/i2c_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/RTCv1/rtc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1/uart_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/OTGv1/usb_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F1xx \ - ${CHIBIOS}/os/hal/platforms/STM32 \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/RTCv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/OTGv1 - diff --git a/os/hal/platforms/STM32F1xx/stm32_dma.c b/os/hal/platforms/STM32F1xx/stm32_dma.c deleted file mode 100644 index 8e0622218e..0000000000 --- a/os/hal/platforms/STM32F1xx/stm32_dma.c +++ /dev/null @@ -1,496 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/stm32_dma.c - * @brief DMA helper driver code. - * - * @addtogroup STM32F1xx_DMA - * @details DMA sharing helper driver. In the STM32 the DMA streams are a - * shared resource, this driver allows to allocate and free DMA - * streams at runtime in order to allow all the other device - * drivers to coordinate the access to the resource. - * @note The DMA ISR handlers are all declared into this module because - * sharing, the various device drivers can associate a callback to - * ISRs when allocating streams. - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/* The following macro is only defined if some driver requiring DMA services - has been enabled.*/ -#if defined(STM32_DMA_REQUIRED) || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/** - * @brief Mask of the DMA1 streams in @p dma_streams_mask. - */ -#define STM32_DMA1_STREAMS_MASK 0x0000007F - -/** - * @brief Mask of the DMA2 streams in @p dma_streams_mask. - */ -#define STM32_DMA2_STREAMS_MASK 0x00000F80 - -/** - * @brief Post-reset value of the stream CCR register. - */ -#define STM32_DMA_CCR_RESET_VALUE 0x00000000 - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief DMA streams descriptors. - * @details This table keeps the association between an unique stream - * identifier and the involved physical registers. - * @note Don't use this array directly, use the appropriate wrapper macros - * instead: @p STM32_DMA1_STREAM1, @p STM32_DMA1_STREAM2 etc. - */ -const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS] = { - {DMA1_Channel1, &DMA1->IFCR, 0, 0, DMA1_Channel1_IRQn}, - {DMA1_Channel2, &DMA1->IFCR, 4, 1, DMA1_Channel2_IRQn}, - {DMA1_Channel3, &DMA1->IFCR, 8, 2, DMA1_Channel3_IRQn}, - {DMA1_Channel4, &DMA1->IFCR, 12, 3, DMA1_Channel4_IRQn}, - {DMA1_Channel5, &DMA1->IFCR, 16, 4, DMA1_Channel5_IRQn}, - {DMA1_Channel6, &DMA1->IFCR, 20, 5, DMA1_Channel6_IRQn}, - {DMA1_Channel7, &DMA1->IFCR, 24, 6, DMA1_Channel7_IRQn}, -#if STM32_HAS_DMA2 || defined(__DOXYGEN__) - {DMA2_Channel1, &DMA2->IFCR, 0, 7, DMA2_Channel1_IRQn}, - {DMA2_Channel2, &DMA2->IFCR, 4, 8, DMA2_Channel2_IRQn}, - {DMA2_Channel3, &DMA2->IFCR, 8, 9, DMA2_Channel3_IRQn}, -#if defined(STM32F10X_CL) || defined(__DOXYGEN__) - {DMA2_Channel4, &DMA2->IFCR, 12, 10, DMA2_Channel4_IRQn}, - {DMA2_Channel5, &DMA2->IFCR, 16, 11, DMA2_Channel5_IRQn}, -#else /* !STM32F10X_CL */ - {DMA2_Channel4, &DMA2->IFCR, 12, 10, DMA2_Channel4_5_IRQn}, - {DMA2_Channel5, &DMA2->IFCR, 16, 11, DMA2_Channel4_5_IRQn}, -#endif /* !STM32F10X_CL */ -#endif /* STM32_HAS_DMA2 */ -}; - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief DMA ISR redirector type. - */ -typedef struct { - stm32_dmaisr_t dma_func; /**< @brief DMA callback function. */ - void *dma_param; /**< @brief DMA callback parameter. */ -} dma_isr_redir_t; - -/** - * @brief Mask of the allocated streams. - */ -static uint32_t dma_streams_mask; - -/** - * @brief DMA IRQ redirectors. - */ -static dma_isr_redir_t dma_isr_redir[STM32_DMA_STREAMS]; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief DMA1 stream 1 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 0) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[0].dma_func) - dma_isr_redir[0].dma_func(dma_isr_redir[0].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 2 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch2_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 4) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 4; - if (dma_isr_redir[1].dma_func) - dma_isr_redir[1].dma_func(dma_isr_redir[1].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 3 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch3_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 8) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 8; - if (dma_isr_redir[2].dma_func) - dma_isr_redir[2].dma_func(dma_isr_redir[2].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 4 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch4_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 12) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 12; - if (dma_isr_redir[3].dma_func) - dma_isr_redir[3].dma_func(dma_isr_redir[3].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 5 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 16) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[4].dma_func) - dma_isr_redir[4].dma_func(dma_isr_redir[4].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 6 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch6_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 20) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 20; - if (dma_isr_redir[5].dma_func) - dma_isr_redir[5].dma_func(dma_isr_redir[5].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 7 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch7_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 24) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 24; - if (dma_isr_redir[6].dma_func) - dma_isr_redir[6].dma_func(dma_isr_redir[6].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -#if STM32_HAS_DMA2 || defined(__DOXYGEN__) -/** - * @brief DMA2 stream 1 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Ch1_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->ISR >> 0) & STM32_DMA_ISR_MASK; - DMA2->IFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[7].dma_func) - dma_isr_redir[7].dma_func(dma_isr_redir[7].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 2 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Ch2_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->ISR >> 4) & STM32_DMA_ISR_MASK; - DMA2->IFCR = STM32_DMA_ISR_MASK << 4; - if (dma_isr_redir[8].dma_func) - dma_isr_redir[8].dma_func(dma_isr_redir[8].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 3 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Ch3_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->ISR >> 8) & STM32_DMA_ISR_MASK; - DMA2->IFCR = STM32_DMA_ISR_MASK << 8; - if (dma_isr_redir[9].dma_func) - dma_isr_redir[9].dma_func(dma_isr_redir[9].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -#if defined(STM32F10X_CL) || defined(__DOXYGEN__) -/** - * @brief DMA2 stream 4 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Ch4_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->ISR >> 12) & STM32_DMA_ISR_MASK; - DMA2->IFCR = STM32_DMA_ISR_MASK << 12; - if (dma_isr_redir[10].dma_func) - dma_isr_redir[10].dma_func(dma_isr_redir[10].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 5 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Ch5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->ISR >> 16) & STM32_DMA_ISR_MASK; - DMA2->IFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[11].dma_func) - dma_isr_redir[11].dma_func(dma_isr_redir[11].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} -#else /* !STM32F10X_CL */ -/** - * @brief DMA2 streams 4 and 5 shared interrupt handler. - * @note This IRQ is shared between DMA2 channels 4 and 5 so it is a - * bit less efficient because an extra check. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Ch4_5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - /* Check on channel 4.*/ - flags = (DMA2->ISR >> 12) & STM32_DMA_ISR_MASK; - if (flags & STM32_DMA_ISR_MASK) { - DMA2->IFCR = STM32_DMA_ISR_MASK << 12; - if (dma_isr_redir[10].dma_func) - dma_isr_redir[10].dma_func(dma_isr_redir[10].dma_param, flags); - } - - /* Check on channel 5.*/ - flags = (DMA2->ISR >> 16) & STM32_DMA_ISR_MASK; - if (flags & STM32_DMA_ISR_MASK) { - DMA2->IFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[11].dma_func) - dma_isr_redir[11].dma_func(dma_isr_redir[11].dma_param, flags); - } - - CH_IRQ_EPILOGUE(); -} -#endif /* !STM32F10X_CL */ -#endif /* STM32_HAS_DMA2 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA helper initialization. - * - * @init - */ -void dmaInit(void) { - int i; - - dma_streams_mask = 0; - for (i = 0; i < STM32_DMA_STREAMS; i++) { - _stm32_dma_streams[i].channel->CCR = 0; - dma_isr_redir[i].dma_func = NULL; - } - DMA1->IFCR = 0xFFFFFFFF; -#if STM32_HAS_DMA2 - DMA2->IFCR = 0xFFFFFFFF; -#endif -} - -/** - * @brief Allocates a DMA stream. - * @details The stream is allocated and, if required, the DMA clock enabled. - * The function also enables the IRQ vector associated to the stream - * and initializes its priority. - * @pre The stream must not be already in use or an error is returned. - * @post The stream is allocated and the default ISR handler redirected - * to the specified function. - * @post The stream ISR vector is enabled and its priority configured. - * @post The stream must be freed using @p dmaStreamRelease() before it can - * be reused with another peripheral. - * @post The stream is in its post-reset state. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] priority IRQ priority mask for the DMA stream - * @param[in] func handling function pointer, can be @p NULL - * @param[in] param a parameter to be passed to the handling function - * @return The operation status. - * @retval FALSE no error, stream taken. - * @retval TRUE error, stream already taken. - * - * @special - */ -bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param) { - - chDbgCheck(dmastp != NULL, "dmaAllocate"); - - /* Checks if the stream is already taken.*/ - if ((dma_streams_mask & (1 << dmastp->selfindex)) != 0) - return TRUE; - - /* Marks the stream as allocated.*/ - dma_isr_redir[dmastp->selfindex].dma_func = func; - dma_isr_redir[dmastp->selfindex].dma_param = param; - dma_streams_mask |= (1 << dmastp->selfindex); - - /* Enabling DMA clocks required by the current streams set.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) != 0) - rccEnableDMA1(FALSE); -#if STM32_HAS_DMA2 - if ((dma_streams_mask & STM32_DMA2_STREAMS_MASK) != 0) - rccEnableDMA2(FALSE); -#endif - - /* Putting the stream in a safe state.*/ - dmaStreamDisable(dmastp); - dmastp->channel->CCR = STM32_DMA_CCR_RESET_VALUE; - - /* Enables the associated IRQ vector if a callback is defined.*/ - if (func != NULL) - nvicEnableVector(dmastp->vector, CORTEX_PRIORITY_MASK(priority)); - - return FALSE; -} - -/** - * @brief Releases a DMA stream. - * @details The stream is freed and, if required, the DMA clock disabled. - * Trying to release a unallocated stream is an illegal operation - * and is trapped if assertions are enabled. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post The stream is again available. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -void dmaStreamRelease(const stm32_dma_stream_t *dmastp) { - - chDbgCheck(dmastp != NULL, "dmaRelease"); - - /* Check if the streams is not taken.*/ - chDbgAssert((dma_streams_mask & (1 << dmastp->selfindex)) != 0, - "dmaRelease(), #1", "not allocated"); - - /* Disables the associated IRQ vector.*/ - nvicDisableVector(dmastp->vector); - - /* Marks the stream as not allocated.*/ - dma_streams_mask &= ~(1 << dmastp->selfindex); - - /* Shutting down clocks that are no more required, if any.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) == 0) - rccDisableDMA1(FALSE); -#if STM32_HAS_DMA2 - if ((dma_streams_mask & STM32_DMA2_STREAMS_MASK) == 0) - rccDisableDMA2(FALSE); -#endif -} - -#endif /* STM32_DMA_REQUIRED */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/stm32_dma.h b/os/hal/platforms/STM32F1xx/stm32_dma.h deleted file mode 100644 index aa612d5929..0000000000 --- a/os/hal/platforms/STM32F1xx/stm32_dma.h +++ /dev/null @@ -1,407 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/stm32_dma.h - * @brief DMA helper driver header. - * @note This file requires definitions from the ST header file stm32f10x.h. - * @note This driver uses the new naming convention used for the STM32F2xx - * so the "DMA channels" are referred as "DMA streams". - * - * @addtogroup STM32F1xx_DMA - * @{ - */ - -#ifndef _STM32_DMA_H_ -#define _STM32_DMA_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Total number of DMA streams. - * @note This is the total number of streams among all the DMA units. - */ -#if STM32_HAS_DMA2 || defined(__DOXYGEN__) -#define STM32_DMA_STREAMS 12 -#else -#define STM32_DMA_STREAMS 7 -#endif - -/** - * @brief Mask of the ISR bits passed to the DMA callback functions. - */ -#define STM32_DMA_ISR_MASK 0x0F - -/** - * @brief Returns the channel associated to the specified stream. - * - * @param[in] n the stream number (0...STM32_DMA_STREAMS-1) - * @param[in] c a stream/channel association word, one channel per - * nibble, not associated channels must be set to 0xF - * @return Always zero, in this platform there is no dynamic - * association between streams and channels. - */ -#define STM32_DMA_GETCHANNEL(n, c) 0 - -/** - * @brief Checks if a DMA priority is within the valid range. - * @param[in] prio DMA priority - * - * @retval The check result. - * @retval FALSE invalid DMA priority. - * @retval TRUE correct DMA priority. - */ -#define STM32_DMA_IS_VALID_PRIORITY(prio) (((prio) >= 0) && ((prio) <= 3)) - -/** - * @brief Returns an unique numeric identifier for a DMA stream. - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return An unique numeric stream identifier. - */ -#define STM32_DMA_STREAM_ID(dma, stream) ((((dma) - 1) * 7) + ((stream) - 1)) - -/** - * @brief Returns a DMA stream identifier mask. - * - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return A DMA stream identifier mask. - */ -#define STM32_DMA_STREAM_ID_MSK(dma, stream) \ - (1 << STM32_DMA_STREAM_ID(dma, stream)) - -/** - * @brief Checks if a DMA stream unique identifier belongs to a mask. - * @param[in] id the stream numeric identifier - * @param[in] mask the stream numeric identifiers mask - * - * @retval The check result. - * @retval FALSE id does not belong to the mask. - * @retval TRUE id belongs to the mask. - */ -#define STM32_DMA_IS_VALID_ID(id, mask) (((1 << (id)) & (mask))) - -/** - * @name DMA streams identifiers - * @{ - */ -/** - * @brief Returns a pointer to a stm32_dma_stream_t structure. - * - * @param[in] id the stream numeric identifier - * @return A pointer to the stm32_dma_stream_t constant structure - * associated to the DMA stream. - */ -#define STM32_DMA_STREAM(id) (&_stm32_dma_streams[id]) - -#define STM32_DMA1_STREAM1 STM32_DMA_STREAM(0) -#define STM32_DMA1_STREAM2 STM32_DMA_STREAM(1) -#define STM32_DMA1_STREAM3 STM32_DMA_STREAM(2) -#define STM32_DMA1_STREAM4 STM32_DMA_STREAM(3) -#define STM32_DMA1_STREAM5 STM32_DMA_STREAM(4) -#define STM32_DMA1_STREAM6 STM32_DMA_STREAM(5) -#define STM32_DMA1_STREAM7 STM32_DMA_STREAM(6) -#define STM32_DMA2_STREAM1 STM32_DMA_STREAM(7) -#define STM32_DMA2_STREAM2 STM32_DMA_STREAM(8) -#define STM32_DMA2_STREAM3 STM32_DMA_STREAM(9) -#define STM32_DMA2_STREAM4 STM32_DMA_STREAM(10) -#define STM32_DMA2_STREAM5 STM32_DMA_STREAM(11) -/** @} */ - -/** - * @name CR register constants common to all DMA types - * @{ - */ -#define STM32_DMA_CR_EN DMA_CCR1_EN -#define STM32_DMA_CR_TEIE DMA_CCR1_TEIE -#define STM32_DMA_CR_HTIE DMA_CCR1_HTIE -#define STM32_DMA_CR_TCIE DMA_CCR1_TCIE -#define STM32_DMA_CR_DIR_MASK (DMA_CCR1_DIR | DMA_CCR1_MEM2MEM) -#define STM32_DMA_CR_DIR_P2M 0 -#define STM32_DMA_CR_DIR_M2P DMA_CCR1_DIR -#define STM32_DMA_CR_DIR_M2M DMA_CCR1_MEM2MEM -#define STM32_DMA_CR_CIRC DMA_CCR1_CIRC -#define STM32_DMA_CR_PINC DMA_CCR1_PINC -#define STM32_DMA_CR_MINC DMA_CCR1_MINC -#define STM32_DMA_CR_PSIZE_MASK DMA_CCR1_PSIZE -#define STM32_DMA_CR_PSIZE_BYTE 0 -#define STM32_DMA_CR_PSIZE_HWORD DMA_CCR1_PSIZE_0 -#define STM32_DMA_CR_PSIZE_WORD DMA_CCR1_PSIZE_1 -#define STM32_DMA_CR_MSIZE_MASK DMA_CCR1_MSIZE -#define STM32_DMA_CR_MSIZE_BYTE 0 -#define STM32_DMA_CR_MSIZE_HWORD DMA_CCR1_MSIZE_0 -#define STM32_DMA_CR_MSIZE_WORD DMA_CCR1_MSIZE_1 -#define STM32_DMA_CR_SIZE_MASK (STM32_DMA_CR_MSIZE_MASK | \ - STM32_DMA_CR_MSIZE_MASK) -#define STM32_DMA_CR_PL_MASK DMA_CCR1_PL -#define STM32_DMA_CR_PL(n) ((n) << 12) -/** @} */ - -/** - * @name CR register constants only found in enhanced DMA - * @{ - */ -#define STM32_DMA_CR_DMEIE 0 /**< @brief Ignored by normal DMA. */ -#define STM32_DMA_CR_CHSEL_MASK 0 /**< @brief Ignored by normal DMA. */ -#define STM32_DMA_CR_CHSEL(n) 0 /**< @brief Ignored by normal DMA. */ -/** @} */ - -/** - * @name Status flags passed to the ISR callbacks - * @{ - */ -#define STM32_DMA_ISR_FEIF 0 -#define STM32_DMA_ISR_DMEIF 0 -#define STM32_DMA_ISR_TEIF DMA_ISR_TEIF1 -#define STM32_DMA_ISR_HTIF DMA_ISR_HTIF1 -#define STM32_DMA_ISR_TCIF DMA_ISR_TCIF1 -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA stream descriptor structure. - */ -typedef struct { - DMA_Channel_TypeDef *channel; /**< @brief Associated DMA channel. */ - volatile uint32_t *ifcr; /**< @brief Associated IFCR reg. */ - uint8_t ishift; /**< @brief Bits offset in xIFCR - register. */ - uint8_t selfindex; /**< @brief Index to self in array. */ - uint8_t vector; /**< @brief Associated IRQ vector. */ -} stm32_dma_stream_t; - -/** - * @brief STM32 DMA ISR function type. - * - * @param[in] p parameter for the registered function - * @param[in] flags pre-shifted content of the ISR register, the bits - * are aligned to bit zero - */ -typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags); - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Macro Functions - * @{ - */ -/** - * @brief Associates a peripheral data register to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the CPAR register - * - * @special - */ -#define dmaStreamSetPeripheral(dmastp, addr) { \ - (dmastp)->channel->CPAR = (uint32_t)(addr); \ -} - -/** - * @brief Associates a memory destination to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the CMAR register - * - * @special - */ -#define dmaStreamSetMemory0(dmastp, addr) { \ - (dmastp)->channel->CMAR = (uint32_t)(addr); \ -} - -/** - * @brief Sets the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] size value to be written in the CNDTR register - * - * @special - */ -#define dmaStreamSetTransactionSize(dmastp, size) { \ - (dmastp)->channel->CNDTR = (uint32_t)(size); \ -} - -/** - * @brief Returns the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @return The number of transfers to be performed. - * - * @special - */ -#define dmaStreamGetTransactionSize(dmastp) ((size_t)((dmastp)->channel->CNDTR)) - -/** - * @brief Programs the stream mode settings. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register - * - * @special - */ -#define dmaStreamSetMode(dmastp, mode) { \ - (dmastp)->channel->CCR = (uint32_t)(mode); \ -} - -/** - * @brief DMA stream enable. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamEnable(dmastp) { \ - (dmastp)->channel->CCR |= STM32_DMA_CR_EN; \ -} - -/** - * @brief DMA stream disable. - * @details The function disables the specified stream and then clears any - * pending interrupt. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamDisable(dmastp) { \ - (dmastp)->channel->CCR &= ~STM32_DMA_CR_EN; \ - dmaStreamClearInterrupt(dmastp); \ -} - -/** - * @brief DMA stream interrupt sources clear. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamClearInterrupt(dmastp) { \ - *(dmastp)->ifcr = STM32_DMA_ISR_MASK << (dmastp)->ishift; \ -} - -/** - * @brief Starts a memory to memory operation using the specified stream. - * @note The default transfer data mode is "byte to byte" but it can be - * changed by specifying extra options in the @p mode parameter. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register, this value - * is implicitly ORed with: - * - @p STM32_DMA_CR_MINC - * - @p STM32_DMA_CR_PINC - * - @p STM32_DMA_CR_DIR_M2M - * - @p STM32_DMA_CR_EN - * . - * @param[in] src source address - * @param[in] dst destination address - * @param[in] n number of data units to copy - */ -#define dmaStartMemCopy(dmastp, mode, src, dst, n) { \ - dmaStreamSetPeripheral(dmastp, src); \ - dmaStreamSetMemory0(dmastp, dst); \ - dmaStreamSetTransactionSize(dmastp, n); \ - dmaStreamSetMode(dmastp, (mode) | \ - STM32_DMA_CR_MINC | STM32_DMA_CR_PINC | \ - STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN); \ -} - -/** - * @brief Polled wait for DMA transfer end. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - */ -#define dmaWaitCompletion(dmastp) { \ - while ((dmastp)->channel->CNDTR > 0) \ - ; \ - dmaStreamDisable(dmastp); \ -} - -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS]; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void dmaInit(void); - bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param); - void dmaStreamRelease(const stm32_dma_stream_t *dmastp); -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_DMA_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/stm32_isr.h b/os/hal/platforms/STM32F1xx/stm32_isr.h deleted file mode 100644 index 9cdc406a39..0000000000 --- a/os/hal/platforms/STM32F1xx/stm32_isr.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/stm32_isr.h - * @brief ISR remapper driver header. - * - * @addtogroup STM32F1xx_ISR - * @{ - */ - -#ifndef _STM32_ISR_H_ -#define _STM32_ISR_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name ISR names and numbers remapping - * @{ - */ -/* - * CAN units. - */ -#define STM32_CAN1_TX_HANDLER CAN1_TX_IRQHandler -#define STM32_CAN1_RX0_HANDLER CAN1_RX0_IRQHandler -#define STM32_CAN1_RX1_HANDLER CAN1_RX1_IRQHandler -#define STM32_CAN1_SCE_HANDLER CAN1_SCE_IRQHandler -#define STM32_CAN2_TX_HANDLER CAN2_TX_IRQHandler -#define STM32_CAN2_RX0_HANDLER CAN2_RX0_IRQHandler -#define STM32_CAN2_RX1_HANDLER CAN2_RX1_IRQHandler -#define STM32_CAN2_SCE_HANDLER CAN2_SCE_IRQHandler - -#ifdef STM32F10X_CL -#define STM32_CAN1_TX_NUMBER CAN1_TX_IRQn -#define STM32_CAN1_RX0_NUMBER CAN1_RX0_IRQn -#else -#define STM32_CAN1_TX_NUMBER USB_HP_CAN1_TX_IRQn -#define STM32_CAN1_RX0_NUMBER USB_LP_CAN1_RX0_IRQn -#endif -#define STM32_CAN1_RX1_NUMBER CAN1_RX1_IRQn -#define STM32_CAN1_SCE_NUMBER CAN1_SCE_IRQn -#define STM32_CAN2_TX_NUMBER CAN2_TX_IRQn -#define STM32_CAN2_RX0_NUMBER CAN2_RX0_IRQn -#define STM32_CAN2_RX1_NUMBER CAN2_RX1_IRQn -#define STM32_CAN2_SCE_NUMBER CAN2_SCE_IRQn - -/* - * OTG units. - */ -#define STM32_OTG1_HANDLER OTG_FS_IRQHandler - -#define STM32_OTG1_NUMBER OTG_FS_IRQn - -/* - * SDIO unit. - */ -#define STM32_SDIO_HANDLER SDIO_IRQHandler - -#define STM32_SDIO_NUMBER SDIO_IRQn - -/* - * TIM units. - */ -#if defined(STM32F10X_XL) -#define STM32_TIM1_UP_HANDLER TIM1_UP_IRQHandler -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) -#define STM32_TIM1_UP_HANDLER TIM1_UP_IRQHandler -#else -#define STM32_TIM1_UP_HANDLER TIM1_UP_IRQHandler -#endif -#define STM32_TIM1_CC_HANDLER TIM1_CC_IRQHandler -#define STM32_TIM2_HANDLER TIM2_IRQHandler -#define STM32_TIM3_HANDLER TIM3_IRQHandler -#define STM32_TIM4_HANDLER TIM4_IRQHandler -#define STM32_TIM5_HANDLER TIM5_IRQHandler -#ifdef STM32F10X_XL -#define STM32_TIM8_UP_HANDLER TIM8_UP_IRQHandler -#else -#define STM32_TIM8_UP_HANDLER TIM8_UP_IRQHandler -#endif -#define STM32_TIM8_CC_HANDLER TIM8_CC_IRQHandler - -#if defined(STM32F10X_XL) -#define STM32_TIM1_UP_NUMBER TIM1_UP_TIM10_IRQn -#elif defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD_VL) -#define STM32_TIM1_UP_NUMBER TIM1_UP_TIM16_IRQn -#else -#define STM32_TIM1_UP_NUMBER TIM1_UP_IRQn -#endif -#define STM32_TIM1_CC_NUMBER TIM1_CC_IRQn -#define STM32_TIM2_NUMBER TIM2_IRQn -#define STM32_TIM3_NUMBER TIM3_IRQn -#define STM32_TIM4_NUMBER TIM4_IRQn -#define STM32_TIM5_NUMBER TIM5_IRQn -#ifdef STM32F10X_XL -#define STM32_TIM8_UP_NUMBER TIM8_UP_TIM13_IRQn -#else -#define STM32_TIM8_UP_NUMBER TIM8_UP_IRQn -#endif -#define STM32_TIM8_CC_NUMBER TIM8_CC_IRQn - -/* - * USART units. - */ -#define STM32_USART1_HANDLER USART1_IRQHandler -#define STM32_USART2_HANDLER USART2_IRQHandler -#define STM32_USART3_HANDLER USART3_IRQHandler -#define STM32_UART4_HANDLER UART4_IRQHandler -#define STM32_UART5_HANDLER UART5_IRQHandler - -#define STM32_USART1_NUMBER USART1_IRQn -#define STM32_USART2_NUMBER USART2_IRQn -#define STM32_USART3_NUMBER USART3_IRQn -#define STM32_UART4_NUMBER UART4_IRQn -#define STM32_UART5_NUMBER UART5_IRQn - -/* - * USB units. - */ -#define STM32_USB1_HP_HANDLER Vector8C -#define STM32_USB1_LP_HANDLER Vector90 - -#define STM32_USB1_HP_NUMBER USB_HP_CAN1_TX_IRQn -#define STM32_USB1_LP_NUMBER USB_LP_CAN1_RX0_IRQn -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#endif /* _STM32_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/stm32_rcc.h b/os/hal/platforms/STM32F1xx/stm32_rcc.h deleted file mode 100644 index bc0a869b65..0000000000 --- a/os/hal/platforms/STM32F1xx/stm32_rcc.h +++ /dev/null @@ -1,965 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F1xx/stm32_rcc.h - * @brief RCC helper driver header. - * @note This file requires definitions from the ST header file - * @p stm32f10x.h. - * - * @addtogroup STM32F1xx_RCC - * @{ - */ - -#ifndef _STM32_RCC_ -#define _STM32_RCC_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Generic RCC operations - * @{ - */ -/** - * @brief Enables the clock of one or more peripheral on the APB1 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB1(mask, lp) { \ - RCC->APB1ENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB1 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB1(mask, lp) { \ - RCC->APB1ENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * - * @api - */ -#define rccResetAPB1(mask) { \ - RCC->APB1RSTR |= (mask); \ - RCC->APB1RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the APB2 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB2(mask, lp) { \ - RCC->APB2ENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB2 bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB2(mask, lp) { \ - RCC->APB2ENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * - * @api - */ -#define rccResetAPB2(mask) { \ - RCC->APB2RSTR |= (mask); \ - RCC->APB2RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the AHB bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask AHB peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAHB(mask, lp) { \ - RCC->AHBENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the AHB bus. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] mask AHB peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAHB(mask, lp) { \ - RCC->AHBENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the AHB bus. - * - * @param[in] mask AHB peripherals mask - * - * @api - */ -#define rccResetAHB(mask) { \ - RCC->AHBRSTR |= (mask); \ - RCC->AHBRSTR = 0; \ -} -/** @} */ - -/** - * @name ADC peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the ADC1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableADC1(lp) rccEnableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Disables the ADC1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableADC1(lp) rccDisableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Resets the ADC1 peripheral. - * - * @api - */ -#define rccResetADC1() rccResetAPB2(RCC_APB2RSTR_ADC1RST) -/** @} */ - -/** - * @name Backup domain interface specific RCC operations - * @{ - */ -/** - * @brief Enables the BKP interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableBKPInterface(lp) rccEnableAPB1((RCC_APB1ENR_BKPEN), lp) - -/** - * @brief Disables BKP interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableBKPInterface(lp) rccDisableAPB1((RCC_APB1ENR_BKPEN), lp) - -/** - * @brief Resets the Backup Domain interface. - * - * @api - */ -#define rccResetBKPInterface() rccResetAPB1(RCC_APB1ENR_BKPRST) - -/** - * @brief Resets the entire Backup Domain. - * - * @api - */ -#define rccResetBKP() (RCC->BDCR |= RCC_BDCR_BDRST) -/** @} */ - -/** - * @name PWR interface specific RCC operations - * @{ - */ -/** - * @brief Enables the PWR interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnablePWRInterface(lp) rccEnableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Disables PWR interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisablePWRInterface(lp) rccDisableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Resets the PWR interface. - * - * @api - */ -#define rccResetPWRInterface() rccResetAPB1(RCC_APB1RSTR_PWRRST) -/** @} */ - -/** - * @name CAN peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the CAN1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableCAN1(lp) rccEnableAPB1(RCC_APB1ENR_CAN1EN, lp) - -/** - * @brief Disables the CAN1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableCAN1(lp) rccDisableAPB1(RCC_APB1ENR_CAN1EN, lp) - -/** - * @brief Resets the CAN1 peripheral. - * - * @api - */ -#define rccResetCAN1() rccResetAPB1(RCC_APB1RSTR_CAN1RST) -/** @} */ - -/** - * @name DMA peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the DMA1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableDMA1(lp) rccEnableAHB(RCC_AHBENR_DMA1EN, lp) - -/** - * @brief Disables the DMA1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableDMA1(lp) rccDisableAHB(RCC_AHBENR_DMA1EN, lp) - -/** - * @brief Resets the DMA1 peripheral. - * @note Not supported in this family, does nothing. - * - * @api - */ -#define rccResetDMA1() - -/** - * @brief Enables the DMA2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableDMA2(lp) rccEnableAHB(RCC_AHBENR_DMA2EN, lp) - -/** - * @brief Disables the DMA2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableDMA2(lp) rccDisableAHB(RCC_AHBENR_DMA2EN, lp) - -/** - * @brief Resets the DMA1 peripheral. - * @note Not supported in this family, does nothing. - * - * @api - */ -#define rccResetDMA2() -/** @} */ - -/** - * @name ETH peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the ETH peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableETH(lp) rccEnableAHB(RCC_AHBENR_ETHMACEN | \ - RCC_AHBENR_ETHMACTXEN | \ - RCC_AHBENR_ETHMACRXEN, lp) - -/** - * @brief Disables the ETH peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableETH(lp) rccDisableAHB(RCC_AHBENR_ETHMACEN | \ - RCC_AHBENR_ETHMACTXEN | \ - RCC_AHBENR_ETHMACRXEN, lp) - -/** - * @brief Resets the ETH peripheral. - * - * @api - */ -#define rccResetETH() rccResetAHB(RCC_AHBRSTR_ETHMACRST) -/** @} */ - -/** - * @name I2C peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the I2C1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C1(lp) rccEnableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Disables the I2C1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C1(lp) rccDisableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Resets the I2C1 peripheral. - * - * @api - */ -#define rccResetI2C1() rccResetAPB1(RCC_APB1RSTR_I2C1RST) - -/** - * @brief Enables the I2C2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C2(lp) rccEnableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Disables the I2C2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C2(lp) rccDisableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Resets the I2C2 peripheral. - * - * @api - */ -#define rccResetI2C2() rccResetAPB1(RCC_APB1RSTR_I2C2RST) -/** @} */ - -/** - * @name OTG peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the OTG_FS peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableOTG_FS(lp) rccEnableAHB(RCC_AHBENR_OTGFSEN, lp) - -/** - * @brief Disables the OTG_FS peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableOTG_FS(lp) rccDisableAHB(RCC_AHBENR_OTGFSEN, lp) - -/** - * @brief Resets the OTG_FS peripheral. - * - * @api - */ -#define rccResetOTG_FS() rccResetAHB(RCC_AHBRSTR_OTGFSRST) -/** @} */ - -/** - * @name SDIO peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the SDIO peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSDIO(lp) rccEnableAHB(RCC_AHBENR_SDIOEN, lp) - -/** - * @brief Disables the SDIO peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSDIO(lp) rccDisableAHB(RCC_AHBENR_SDIOEN, lp) - -/** - * @brief Resets the SDIO peripheral. - * @note Not supported in this family, does nothing. - * - * @api - */ -#define rccResetSDIO() -/** @} */ - -/** - * @name SPI peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the SPI1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI1(lp) rccEnableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Disables the SPI1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI1(lp) rccDisableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Resets the SPI1 peripheral. - * - * @api - */ -#define rccResetSPI1() rccResetAPB2(RCC_APB2RSTR_SPI1RST) - -/** - * @brief Enables the SPI2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI2(lp) rccEnableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Disables the SPI2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI2(lp) rccDisableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Resets the SPI2 peripheral. - * - * @api - */ -#define rccResetSPI2() rccResetAPB1(RCC_APB1RSTR_SPI2RST) - -/** - * @brief Enables the SPI3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI3(lp) rccEnableAPB1(RCC_APB1ENR_SPI3EN, lp) - -/** - * @brief Disables the SPI3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI3(lp) rccDisableAPB1(RCC_APB1ENR_SPI3EN, lp) - -/** - * @brief Resets the SPI3 peripheral. - * - * @api - */ -#define rccResetSPI3() rccResetAPB1(RCC_APB1RSTR_SPI3RST) -/** @} */ - -/** - * @name TIM peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the TIM1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM1(lp) rccEnableAPB2(RCC_APB2ENR_TIM1EN, lp) - -/** - * @brief Disables the TIM1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM1(lp) rccDisableAPB2(RCC_APB2ENR_TIM1EN, lp) - -/** - * @brief Resets the TIM1 peripheral. - * - * @api - */ -#define rccResetTIM1() rccResetAPB2(RCC_APB2RSTR_TIM1RST) - -/** - * @brief Enables the TIM2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM2(lp) rccEnableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Disables the TIM2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM2(lp) rccDisableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Resets the TIM2 peripheral. - * - * @api - */ -#define rccResetTIM2() rccResetAPB1(RCC_APB1RSTR_TIM2RST) - -/** - * @brief Enables the TIM3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM3(lp) rccEnableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Disables the TIM3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM3(lp) rccDisableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Resets the TIM3 peripheral. - * - * @api - */ -#define rccResetTIM3() rccResetAPB1(RCC_APB1RSTR_TIM3RST) - -/** - * @brief Enables the TIM4 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM4(lp) rccEnableAPB1(RCC_APB1ENR_TIM4EN, lp) - -/** - * @brief Disables the TIM4 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM4(lp) rccDisableAPB1(RCC_APB1ENR_TIM4EN, lp) - -/** - * @brief Resets the TIM4 peripheral. - * - * @api - */ -#define rccResetTIM4() rccResetAPB1(RCC_APB1RSTR_TIM4RST) - -/** - * @brief Enables the TIM5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM5(lp) rccEnableAPB1(RCC_APB1ENR_TIM5EN, lp) - -/** - * @brief Disables the TIM5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM5(lp) rccDisableAPB1(RCC_APB1ENR_TIM5EN, lp) - -/** - * @brief Resets the TIM5 peripheral. - * - * @api - */ -#define rccResetTIM5() rccResetAPB1(RCC_APB1RSTR_TIM5RST) - -/** - * @brief Enables the TIM8 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM8(lp) rccEnableAPB2(RCC_APB2ENR_TIM8EN, lp) - -/** - * @brief Disables the TIM8 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM8(lp) rccDisableAPB2(RCC_APB2ENR_TIM8EN, lp) - -/** - * @brief Resets the TIM8 peripheral. - * - * @api - */ -#define rccResetTIM8() rccResetAPB2(RCC_APB2RSTR_TIM8RST) -/** @} */ - -/** - * @name USART/UART peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the USART1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART1(lp) rccEnableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Disables the USART1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART1(lp) rccDisableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Resets the USART1 peripheral. - * - * @api - */ -#define rccResetUSART1() rccResetAPB2(RCC_APB2RSTR_USART1RST) - -/** - * @brief Enables the USART2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART2(lp) rccEnableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Disables the USART2 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART2(lp) rccDisableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Resets the USART2 peripheral. - * - * @api - */ -#define rccResetUSART2() rccResetAPB1(RCC_APB1RSTR_USART2RST) - -/** - * @brief Enables the USART3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART3(lp) rccEnableAPB1(RCC_APB1ENR_USART3EN, lp) - -/** - * @brief Disables the USART3 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART3(lp) rccDisableAPB1(RCC_APB1ENR_USART3EN, lp) - -/** - * @brief Resets the USART3 peripheral. - * - * @api - */ -#define rccResetUSART3() rccResetAPB1(RCC_APB1RSTR_USART3RST) - -/** - * @brief Enables the UART4 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUART4(lp) rccEnableAPB1(RCC_APB1ENR_UART4EN, lp) - -/** - * @brief Disables the UART4 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUART4(lp) rccDisableAPB1(RCC_APB1ENR_UART4EN, lp) - -/** - * @brief Resets the UART4 peripheral. - * - * @api - */ -#define rccResetUART4() rccResetAPB1(RCC_APB1RSTR_UART4RST) - -/** - * @brief Enables the UART5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUART5(lp) rccEnableAPB1(RCC_APB1ENR_UART5EN, lp) - -/** - * @brief Disables the UART5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUART5(lp) rccDisableAPB1(RCC_APB1ENR_UART5EN, lp) - -/** - * @brief Resets the UART5 peripheral. - * - * @api - */ -#define rccResetUART5() rccResetAPB1(RCC_APB1RSTR_UART5RST) -/** @} */ - -/** - * @name USB peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the USB peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSB(lp) rccEnableAPB1(RCC_APB1ENR_USBEN, lp) - -/** - * @brief Disables the USB peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSB(lp) rccDisableAPB1(RCC_APB1ENR_USBEN, lp) - -/** - * @brief Resets the USB peripheral. - * - * @api - */ -#define rccResetUSB() rccResetAPB1(RCC_APB1RSTR_USBRST) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_RCC_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F1xx/stm32f10x.h b/os/hal/platforms/STM32F1xx/stm32f10x.h deleted file mode 100644 index 6697b96488..0000000000 --- a/os/hal/platforms/STM32F1xx/stm32f10x.h +++ /dev/null @@ -1,8357 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x.h - * @author MCD Application Team - * @version V3.5.0 - * @date 11-March-2011 - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32F10x Connectivity line, - * High density, High density value line, Medium density, - * Medium density Value line, Low density, Low density Value line - * and XL-density devices. - * - * The file is the unique include file that the application programmer - * is using in the C source code, usually in main.c. This file contains: - * - Configuration section that allows to select: - * - The device used in the target application - * - To use or not the peripheral�s drivers in application code(i.e. - * code will be based on direct access to peripheral�s registers - * rather than drivers API), this option is controlled by - * "#define USE_STDPERIPH_DRIVER" - * - To change few application-specific parameters such as the HSE - * crystal frequency - * - Data structures and the address mapping for all peripherals - * - Peripheral's registers declarations and bits definition - * - Macros to access peripheral�s registers hardware - * - ****************************************************************************** - * @attention - * - * 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. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f10x - * @{ - */ - -#ifndef __STM32F10x_H -#define __STM32F10x_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) - /* CHIBIOS FIX */ -#include "board.h" - /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ - /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ - /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ - /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ - /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */ - /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ - /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */ - /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */ -#endif -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - - - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers - where the Flash memory density ranges between 16 and 32 Kbytes. - - Low-density value line devices are STM32F100xx microcontrollers where the Flash - memory density ranges between 16 and 32 Kbytes. - - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers - where the Flash memory density ranges between 64 and 128 Kbytes. - - Medium-density value line devices are STM32F100xx microcontrollers where the - Flash memory density ranges between 64 and 128 Kbytes. - - High-density devices are STM32F101xx and STM32F103xx microcontrollers where - the Flash memory density ranges between 256 and 512 Kbytes. - - High-density value line devices are STM32F100xx microcontrollers where the - Flash memory density ranges between 256 and 512 Kbytes. - - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where - the Flash memory density ranges between 512 and 1024 Kbytes. - - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. - */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) - #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" -#endif - -#if !defined USE_STDPERIPH_DRIVER -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined HSE_VALUE - #ifdef STM32F10X_CL - #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ - #else - #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ - #endif /* STM32F10X_CL */ -#endif /* HSE_VALUE */ - - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ - -#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ - -/** - * @brief STM32F10x Standard Peripheral Library version number - */ -#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:24] main version */ -#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x05) /*!< [23:16] sub1 version */ -#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F10X_STDPERIPH_VERSION ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F10X_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#ifdef STM32F10X_XL - #define __MPU_PRESENT 1 /*!< STM32 XL-density devices provide an MPU */ -#else - #define __MPU_PRESENT 0 /*!< Other STM32 devices does not provide an MPU */ -#endif /* STM32F10X_XL */ -#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @brief STM32F10x Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum IRQn -{ -/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ - -/****** STM32 specific Interrupt Numbers *********************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMPER_IRQn = 2, /*!< Tamper Interrupt */ - RTC_IRQn = 3, /*!< RTC global Interrupt */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ - DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ - DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ - DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ - DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ - DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ - DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ - -#ifdef STM32F10X_LD - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - USB_FS_WKUP_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ -#endif /* STM32F10X_LD */ - -#ifdef STM32F10X_LD_VL - ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ - TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ - TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ - TIM7_IRQn = 55 /*!< TIM7 Interrupt */ -#endif /* STM32F10X_LD_VL */ - -#ifdef STM32F10X_MD - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - USB_FS_WKUP_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ -#endif /* STM32F10X_MD */ - -#ifdef STM32F10X_MD_VL - ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ - TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ - TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ - TIM7_IRQn = 55 /*!< TIM7 Interrupt */ -#endif /* STM32F10X_MD_VL */ - -#ifdef STM32F10X_HD - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - USB_FS_WKUP_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ - TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ - TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ - TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ -#endif /* STM32F10X_HD */ - -#ifdef STM32F10X_HD_VL - ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ - TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ - TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ - TIM12_IRQn = 43, /*!< TIM12 global Interrupt */ - TIM13_IRQn = 44, /*!< TIM13 global Interrupt */ - TIM14_IRQn = 45, /*!< TIM14 global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ - DMA2_Channel5_IRQn = 60 /*!< DMA2 Channel 5 global Interrupt (DMA2 Channel 5 is - mapped at position 60 only if the MISC_REMAP bit in - the AFIO_MAPR2 register is set) */ -#endif /* STM32F10X_HD_VL */ - -#ifdef STM32F10X_XL - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break Interrupt and TIM9 global Interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global Interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - USB_FS_WKUP_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global Interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global Interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ -#endif /* STM32F10X_XL */ - -#ifdef STM32F10X_CL - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - /* CHIBIOS FIX (making it compatible with STM32L and STM32F2 headers).*/ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ - DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ -#endif /* STM32F10X_CL */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -/* CHIBIOS FIX */ -/*#include "system_stm32f10x.h"*/ -#include - -/** @addtogroup Exported_types - * @{ - */ - -/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; /*!< Read Only */ -typedef const int16_t sc16; /*!< Read Only */ -typedef const int8_t sc8; /*!< Read Only */ - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; /*!< Read Only */ -typedef __I int16_t vsc16; /*!< Read Only */ -typedef __I int8_t vsc8; /*!< Read Only */ - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; /*!< Read Only */ -typedef const uint16_t uc16; /*!< Read Only */ -typedef const uint8_t uc8; /*!< Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; /*!< Read Only */ -typedef __I uint16_t vuc16; /*!< Read Only */ -typedef __I uint8_t vuc8; /*!< Read Only */ - -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; - -/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */ -#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT -#define HSE_Value HSE_VALUE -#define HSI_Value HSI_VALUE -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; - __IO uint32_t CR1; - __IO uint32_t CR2; - __IO uint32_t SMPR1; - __IO uint32_t SMPR2; - __IO uint32_t JOFR1; - __IO uint32_t JOFR2; - __IO uint32_t JOFR3; - __IO uint32_t JOFR4; - __IO uint32_t HTR; - __IO uint32_t LTR; - __IO uint32_t SQR1; - __IO uint32_t SQR2; - __IO uint32_t SQR3; - __IO uint32_t JSQR; - __IO uint32_t JDR1; - __IO uint32_t JDR2; - __IO uint32_t JDR3; - __IO uint32_t JDR4; - __IO uint32_t DR; -} ADC_TypeDef; - -/** - * @brief Backup Registers - */ - -typedef struct -{ - uint32_t RESERVED0; - __IO uint16_t DR1; - uint16_t RESERVED1; - __IO uint16_t DR2; - uint16_t RESERVED2; - __IO uint16_t DR3; - uint16_t RESERVED3; - __IO uint16_t DR4; - uint16_t RESERVED4; - __IO uint16_t DR5; - uint16_t RESERVED5; - __IO uint16_t DR6; - uint16_t RESERVED6; - __IO uint16_t DR7; - uint16_t RESERVED7; - __IO uint16_t DR8; - uint16_t RESERVED8; - __IO uint16_t DR9; - uint16_t RESERVED9; - __IO uint16_t DR10; - uint16_t RESERVED10; - __IO uint16_t RTCCR; - uint16_t RESERVED11; - __IO uint16_t CR; - uint16_t RESERVED12; - __IO uint16_t CSR; - uint16_t RESERVED13[5]; - __IO uint16_t DR11; - uint16_t RESERVED14; - __IO uint16_t DR12; - uint16_t RESERVED15; - __IO uint16_t DR13; - uint16_t RESERVED16; - __IO uint16_t DR14; - uint16_t RESERVED17; - __IO uint16_t DR15; - uint16_t RESERVED18; - __IO uint16_t DR16; - uint16_t RESERVED19; - __IO uint16_t DR17; - uint16_t RESERVED20; - __IO uint16_t DR18; - uint16_t RESERVED21; - __IO uint16_t DR19; - uint16_t RESERVED22; - __IO uint16_t DR20; - uint16_t RESERVED23; - __IO uint16_t DR21; - uint16_t RESERVED24; - __IO uint16_t DR22; - uint16_t RESERVED25; - __IO uint16_t DR23; - uint16_t RESERVED26; - __IO uint16_t DR24; - uint16_t RESERVED27; - __IO uint16_t DR25; - uint16_t RESERVED28; - __IO uint16_t DR26; - uint16_t RESERVED29; - __IO uint16_t DR27; - uint16_t RESERVED30; - __IO uint16_t DR28; - uint16_t RESERVED31; - __IO uint16_t DR29; - uint16_t RESERVED32; - __IO uint16_t DR30; - uint16_t RESERVED33; - __IO uint16_t DR31; - uint16_t RESERVED34; - __IO uint16_t DR32; - uint16_t RESERVED35; - __IO uint16_t DR33; - uint16_t RESERVED36; - __IO uint16_t DR34; - uint16_t RESERVED37; - __IO uint16_t DR35; - uint16_t RESERVED38; - __IO uint16_t DR36; - uint16_t RESERVED39; - __IO uint16_t DR37; - uint16_t RESERVED40; - __IO uint16_t DR38; - uint16_t RESERVED41; - __IO uint16_t DR39; - uint16_t RESERVED42; - __IO uint16_t DR40; - uint16_t RESERVED43; - __IO uint16_t DR41; - uint16_t RESERVED44; - __IO uint16_t DR42; - uint16_t RESERVED45; -} BKP_TypeDef; - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; - __IO uint32_t TDTR; - __IO uint32_t TDLR; - __IO uint32_t TDHR; -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; - __IO uint32_t RDTR; - __IO uint32_t RDLR; - __IO uint32_t RDHR; -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; - __IO uint32_t FR2; -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; - __IO uint32_t MSR; - __IO uint32_t TSR; - __IO uint32_t RF0R; - __IO uint32_t RF1R; - __IO uint32_t IER; - __IO uint32_t ESR; - __IO uint32_t BTR; - uint32_t RESERVED0[88]; - CAN_TxMailBox_TypeDef sTxMailBox[3]; - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; - uint32_t RESERVED1[12]; - __IO uint32_t FMR; - __IO uint32_t FM1R; - uint32_t RESERVED2; - __IO uint32_t FS1R; - uint32_t RESERVED3; - __IO uint32_t FFA1R; - uint32_t RESERVED4; - __IO uint32_t FA1R; - uint32_t RESERVED5[8]; -#ifndef STM32F10X_CL - CAN_FilterRegister_TypeDef sFilterRegister[14]; -#else - CAN_FilterRegister_TypeDef sFilterRegister[28]; -#endif /* STM32F10X_CL */ -} CAN_TypeDef; - -/** - * @brief Consumer Electronics Control (CEC) - */ -typedef struct -{ - __IO uint32_t CFGR; - __IO uint32_t OAR; - __IO uint32_t PRES; - __IO uint32_t ESR; - __IO uint32_t CSR; - __IO uint32_t TXD; - __IO uint32_t RXD; -} CEC_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; - __IO uint8_t IDR; - uint8_t RESERVED0; - uint16_t RESERVED1; - __IO uint32_t CR; -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t SWTRIGR; - __IO uint32_t DHR12R1; - __IO uint32_t DHR12L1; - __IO uint32_t DHR8R1; - __IO uint32_t DHR12R2; - __IO uint32_t DHR12L2; - __IO uint32_t DHR8R2; - __IO uint32_t DHR12RD; - __IO uint32_t DHR12LD; - __IO uint32_t DHR8RD; - __IO uint32_t DOR1; - __IO uint32_t DOR2; -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) - __IO uint32_t SR; -#endif -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; - __IO uint32_t CR; -}DBGMCU_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CCR; - __IO uint32_t CNDTR; - __IO uint32_t CPAR; - __IO uint32_t CMAR; -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t ISR; - __IO uint32_t IFCR; -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - uint32_t RESERVED8[567]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - uint32_t RESERVED9[9]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; - __IO uint32_t EMR; - __IO uint32_t RTSR; - __IO uint32_t FTSR; - __IO uint32_t SWIER; - __IO uint32_t PR; -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; - __IO uint32_t KEYR; - __IO uint32_t OPTKEYR; - __IO uint32_t SR; - __IO uint32_t CR; - __IO uint32_t AR; - __IO uint32_t RESERVED; - __IO uint32_t OBR; - __IO uint32_t WRPR; -#ifdef STM32F10X_XL - uint32_t RESERVED1[8]; - __IO uint32_t KEYR2; - uint32_t RESERVED2; - __IO uint32_t SR2; - __IO uint32_t CR2; - __IO uint32_t AR2; -#endif /* STM32F10X_XL */ -} FLASH_TypeDef; - -/** - * @brief Option Bytes Registers - */ - -typedef struct -{ - __IO uint16_t RDP; - __IO uint16_t USER; - __IO uint16_t Data0; - __IO uint16_t Data1; - __IO uint16_t WRP0; - __IO uint16_t WRP1; - __IO uint16_t WRP2; - __IO uint16_t WRP3; -} OB_TypeDef; - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; - __IO uint32_t SR2; - __IO uint32_t PMEM2; - __IO uint32_t PATT2; - uint32_t RESERVED0; - __IO uint32_t ECCR2; -} FSMC_Bank2_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank3 - */ - -typedef struct -{ - __IO uint32_t PCR3; - __IO uint32_t SR3; - __IO uint32_t PMEM3; - __IO uint32_t PATT3; - uint32_t RESERVED0; - __IO uint32_t ECCR3; -} FSMC_Bank3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; - __IO uint32_t SR4; - __IO uint32_t PMEM4; - __IO uint32_t PATT4; - __IO uint32_t PIO4; -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t CRL; - __IO uint32_t CRH; - __IO uint32_t IDR; - __IO uint32_t ODR; - __IO uint32_t BSRR; - __IO uint32_t BRR; - __IO uint32_t LCKR; -} GPIO_TypeDef; - -/** - * @brief Alternate Function I/O - */ - -typedef struct -{ - __IO uint32_t EVCR; - __IO uint32_t MAPR; - __IO uint32_t EXTICR[4]; - uint32_t RESERVED0; - __IO uint32_t MAPR2; -} AFIO_TypeDef; -/** - * @brief Inter Integrated Circuit Interface - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t OAR1; - uint16_t RESERVED2; - __IO uint16_t OAR2; - uint16_t RESERVED3; - __IO uint16_t DR; - uint16_t RESERVED4; - __IO uint16_t SR1; - uint16_t RESERVED5; - __IO uint16_t SR2; - uint16_t RESERVED6; - __IO uint16_t CCR; - uint16_t RESERVED7; - __IO uint16_t TRISE; - uint16_t RESERVED8; -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; - __IO uint32_t PR; - __IO uint32_t RLR; - __IO uint32_t SR; -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CSR; -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CFGR; - __IO uint32_t CIR; - __IO uint32_t APB2RSTR; - __IO uint32_t APB1RSTR; - __IO uint32_t AHBENR; - __IO uint32_t APB2ENR; - __IO uint32_t APB1ENR; - __IO uint32_t BDCR; - __IO uint32_t CSR; - -#ifdef STM32F10X_CL - __IO uint32_t AHBRSTR; - __IO uint32_t CFGR2; -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) - uint32_t RESERVED0; - __IO uint32_t CFGR2; -#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint16_t CRH; - uint16_t RESERVED0; - __IO uint16_t CRL; - uint16_t RESERVED1; - __IO uint16_t PRLH; - uint16_t RESERVED2; - __IO uint16_t PRLL; - uint16_t RESERVED3; - __IO uint16_t DIVH; - uint16_t RESERVED4; - __IO uint16_t DIVL; - uint16_t RESERVED5; - __IO uint16_t CNTH; - uint16_t RESERVED6; - __IO uint16_t CNTL; - uint16_t RESERVED7; - __IO uint16_t ALRH; - uint16_t RESERVED8; - __IO uint16_t ALRL; - uint16_t RESERVED9; -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; - __IO uint32_t CLKCR; - __IO uint32_t ARG; - __IO uint32_t CMD; - __I uint32_t RESPCMD; - __I uint32_t RESP1; - __I uint32_t RESP2; - __I uint32_t RESP3; - __I uint32_t RESP4; - __IO uint32_t DTIMER; - __IO uint32_t DLEN; - __IO uint32_t DCTRL; - __I uint32_t DCOUNT; - __I uint32_t STA; - __IO uint32_t ICR; - __IO uint32_t MASK; - uint32_t RESERVED0[2]; - __I uint32_t FIFOCNT; - uint32_t RESERVED1[13]; - __IO uint32_t FIFO; -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t SR; - uint16_t RESERVED2; - __IO uint16_t DR; - uint16_t RESERVED3; - __IO uint16_t CRCPR; - uint16_t RESERVED4; - __IO uint16_t RXCRCR; - uint16_t RESERVED5; - __IO uint16_t TXCRCR; - uint16_t RESERVED6; - __IO uint16_t I2SCFGR; - uint16_t RESERVED7; - __IO uint16_t I2SPR; - uint16_t RESERVED8; -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t SMCR; - uint16_t RESERVED2; - __IO uint16_t DIER; - uint16_t RESERVED3; - __IO uint16_t SR; - uint16_t RESERVED4; - __IO uint16_t EGR; - uint16_t RESERVED5; - __IO uint16_t CCMR1; - uint16_t RESERVED6; - __IO uint16_t CCMR2; - uint16_t RESERVED7; - __IO uint16_t CCER; - uint16_t RESERVED8; - __IO uint16_t CNT; - uint16_t RESERVED9; - __IO uint16_t PSC; - uint16_t RESERVED10; - __IO uint16_t ARR; - uint16_t RESERVED11; - __IO uint16_t RCR; - uint16_t RESERVED12; - __IO uint16_t CCR1; - uint16_t RESERVED13; - __IO uint16_t CCR2; - uint16_t RESERVED14; - __IO uint16_t CCR3; - uint16_t RESERVED15; - __IO uint16_t CCR4; - uint16_t RESERVED16; - __IO uint16_t BDTR; - uint16_t RESERVED17; - __IO uint16_t DCR; - uint16_t RESERVED18; - __IO uint16_t DMAR; - uint16_t RESERVED19; -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint16_t SR; - uint16_t RESERVED0; - __IO uint16_t DR; - uint16_t RESERVED1; - __IO uint16_t BRR; - uint16_t RESERVED2; - __IO uint16_t CR1; - uint16_t RESERVED3; - __IO uint16_t CR2; - uint16_t RESERVED4; - __IO uint16_t CR3; - uint16_t RESERVED5; - __IO uint16_t GTPR; - uint16_t RESERVED6; -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CFR; - __IO uint32_t SR; -} WWDG_TypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ - - -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ -#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ - -#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ - -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) -#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) - -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) -#define CEC_BASE (APB1PERIPH_BASE + 0x7800) - -#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) -#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) -#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) -#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) -#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) -#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) -#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) -#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) -#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) -#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) -#define USART1_BASE (APB2PERIPH_BASE + 0x3800) -#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM15_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM16_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM17_BASE (APB2PERIPH_BASE + 0x4800) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00) -#define TIM10_BASE (APB2PERIPH_BASE + 0x5000) -#define TIM11_BASE (APB2PERIPH_BASE + 0x5400) - -#define SDIO_BASE (PERIPH_BASE + 0x18000) - -#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) -#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) -#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) -#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) -#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) -#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) -#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) -#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) -#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) -#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) -#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) -#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) -#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) -#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) -#define RCC_BASE (AHBPERIPH_BASE + 0x1000) -#define CRC_BASE (AHBPERIPH_BASE + 0x3000) - -#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ -#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ - -#define ETH_BASE (AHBPERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ -#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ -#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ - -#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ - -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define BKP ((BKP_TypeDef *) BKP_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define CEC ((CEC_TypeDef *) CEC_BASE) -#define AFIO ((AFIO_TypeDef *) AFIO_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define TIM15 ((TIM_TypeDef *) TIM15_BASE) -#define TIM16 ((TIM_TypeDef *) TIM16_BASE) -#define TIM17 ((TIM_TypeDef *) TIM17_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) -#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) -#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) -#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) -#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) -#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) -#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) -#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) -#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) -#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) -#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) -#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define OB ((OB_TypeDef *) OB_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) -#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* CRC calculation unit */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for CRC_DR register *********************/ -#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ - - -/******************* Bit definition for CRC_IDR register ********************/ -#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ - - -/******************** Bit definition for CRC_CR register ********************/ -#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ - -/******************************************************************************/ -/* */ -/* Power Control */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for PWR_CR register ********************/ -#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ -#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ -#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ -#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ -#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ - -#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ -#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ -#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ -#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ - -/*!< PVD level configuration */ -#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ -#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ -#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ -#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ -#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ -#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ -#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ -#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ - -#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ - - -/******************* Bit definition for PWR_CSR register ********************/ -#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ -#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ -#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ -#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ - -/******************************************************************************/ -/* */ -/* Backup registers */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for BKP_DR1 register ********************/ -#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR2 register ********************/ -#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR3 register ********************/ -#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR4 register ********************/ -#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR5 register ********************/ -#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR6 register ********************/ -#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR7 register ********************/ -#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR8 register ********************/ -#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR9 register ********************/ -#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR10 register *******************/ -#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR11 register *******************/ -#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR12 register *******************/ -#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR13 register *******************/ -#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR14 register *******************/ -#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR15 register *******************/ -#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR16 register *******************/ -#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR17 register *******************/ -#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/****************** Bit definition for BKP_DR18 register ********************/ -#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR19 register *******************/ -#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR20 register *******************/ -#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR21 register *******************/ -#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR22 register *******************/ -#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR23 register *******************/ -#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR24 register *******************/ -#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR25 register *******************/ -#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR26 register *******************/ -#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR27 register *******************/ -#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR28 register *******************/ -#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR29 register *******************/ -#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR30 register *******************/ -#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR31 register *******************/ -#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR32 register *******************/ -#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR33 register *******************/ -#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR34 register *******************/ -#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR35 register *******************/ -#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR36 register *******************/ -#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR37 register *******************/ -#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR38 register *******************/ -#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR39 register *******************/ -#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR40 register *******************/ -#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR41 register *******************/ -#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR42 register *******************/ -#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/****************** Bit definition for BKP_RTCCR register *******************/ -#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ -#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ -#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ -#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ - -/******************** Bit definition for BKP_CR register ********************/ -#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ -#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ - -/******************* Bit definition for BKP_CSR register ********************/ -#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ -#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ -#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ -#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ -#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ - -/******************************************************************************/ -/* */ -/* Reset and Clock Control */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for RCC_CR register ********************/ -#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ -#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ -#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ -#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ -#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ -#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ -#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ -#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ -#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ -#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ - -#ifdef STM32F10X_CL - #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ - #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ - #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ - #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ -#endif /* STM32F10X_CL */ - -/******************* Bit definition for RCC_CFGR register *******************/ -/*!< SW configuration */ -#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ -#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - -#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ -#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ -#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ - -/*!< SWS configuration */ -#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ -#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ -#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ -#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ - -/*!< HPRE configuration */ -#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ -#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ -#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ -#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ -#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ -#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ -#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ -#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ -#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ -#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ - -/*!< PPRE1 configuration */ -#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ -#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ - -#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ -#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ - -/*!< PPRE2 configuration */ -#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ -#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ -#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ -#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ - -#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ -#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ - -/*!< ADCPPRE configuration */ -#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ -#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ -#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ - -#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ -#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ -#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ -#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ - -#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ - -#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ - -/*!< PLLMUL configuration */ -#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ -#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ -#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ - -#ifdef STM32F10X_CL - #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ - #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ - - #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ - #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ - - #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ - #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ - #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ - #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ - #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ - #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ - #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ - - #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ - -/*!< MCO configuration */ - #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ - #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ - #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - - #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ - #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ - #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ - #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ - #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ - #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ - #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ - #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ - #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) - #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ - #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ - - #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ - #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ - - #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ - #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ - #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ - #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ - #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ - #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ - #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ - #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ - #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ - #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ - #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ - #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ - #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ - #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ - #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ - -/*!< MCO configuration */ - #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ - #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ - #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - - #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ - #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ - #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ - #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ - #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ -#else - #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ - #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ - - #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ - #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ - - #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ - #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ - #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ - #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ - #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ - #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ - #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ - #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ - #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ - #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ - #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ - #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ - #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ - #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ - #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ - #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ - -/*!< MCO configuration */ - #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ - #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ - #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - - #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ - #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ - #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ - #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ - #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ -#endif /* STM32F10X_CL */ - -/*!<****************** Bit definition for RCC_CIR register ********************/ -#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ -#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ -#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ -#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ -#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ -#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ -#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ -#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ -#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ -#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ -#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ -#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ -#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ -#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ -#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ -#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ -#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ - -#ifdef STM32F10X_CL - #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ - #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ - #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ - #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ - #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ - #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ -#endif /* STM32F10X_CL */ - -/***************** Bit definition for RCC_APB2RSTR register *****************/ -#define RCC_APB2RSTR_AFIORST ((uint32_t)0x00000001) /*!< Alternate Function I/O reset */ -#define RCC_APB2RSTR_IOPARST ((uint32_t)0x00000004) /*!< I/O port A reset */ -#define RCC_APB2RSTR_IOPBRST ((uint32_t)0x00000008) /*!< I/O port B reset */ -#define RCC_APB2RSTR_IOPCRST ((uint32_t)0x00000010) /*!< I/O port C reset */ -#define RCC_APB2RSTR_IOPDRST ((uint32_t)0x00000020) /*!< I/O port D reset */ -#define RCC_APB2RSTR_ADC1RST ((uint32_t)0x00000200) /*!< ADC 1 interface reset */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) -#define RCC_APB2RSTR_ADC2RST ((uint32_t)0x00000400) /*!< ADC 2 interface reset */ -#endif - -#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 Timer reset */ -#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI 1 reset */ -#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 reset */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) -#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 Timer reset */ -#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 Timer reset */ -#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 Timer reset */ -#endif - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB2RSTR_IOPERST ((uint32_t)0x00000040) /*!< I/O port E reset */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#if defined (STM32F10X_HD) || defined (STM32F10X_XL) - #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ - #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ - #define RCC_APB2RSTR_TIM8RST ((uint32_t)0x00002000) /*!< TIM8 Timer reset */ - #define RCC_APB2RSTR_ADC3RST ((uint32_t)0x00008000) /*!< ADC3 interface reset */ -#endif - -#if defined (STM32F10X_HD_VL) - #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ - #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ -#endif - -#ifdef STM32F10X_XL - #define RCC_APB2RSTR_TIM9RST ((uint32_t)0x00080000) /*!< TIM9 Timer reset */ - #define RCC_APB2RSTR_TIM10RST ((uint32_t)0x00100000) /*!< TIM10 Timer reset */ - #define RCC_APB2RSTR_TIM11RST ((uint32_t)0x00200000) /*!< TIM11 Timer reset */ -#endif /* STM32F10X_XL */ - -/***************** Bit definition for RCC_APB1RSTR register *****************/ -#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ -#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ -#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ -#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ -#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) -#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ -#endif - -#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ -#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ - #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ - #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< USART 3 reset */ - #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) || defined (STM32F10X_XL) - #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ -#endif - -#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_XL) - #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ - #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ - #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ - #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ - #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ - #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ - #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ -#endif - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) - #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ - #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ - #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ - #define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC interface reset */ -#endif - -#if defined (STM32F10X_HD_VL) - #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ - #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ - #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ - #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ - #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ - #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ - #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ -#endif - -#ifdef STM32F10X_CL - #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x04000000) /*!< CAN2 reset */ -#endif /* STM32F10X_CL */ - -#ifdef STM32F10X_XL - #define RCC_APB1RSTR_TIM12RST ((uint32_t)0x00000040) /*!< TIM12 Timer reset */ - #define RCC_APB1RSTR_TIM13RST ((uint32_t)0x00000080) /*!< TIM13 Timer reset */ - #define RCC_APB1RSTR_TIM14RST ((uint32_t)0x00000100) /*!< TIM14 Timer reset */ -#endif /* STM32F10X_XL */ - -/****************** Bit definition for RCC_AHBENR register ******************/ -#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ -#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ -#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ -#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ - -/* CHIBIOS FIX */ -//#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_HD_VL) -#if defined (STM32F10X_HD) || defined (STM32F10X_CL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_XL) - #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ -#endif - -#if defined (STM32F10X_HD) || defined (STM32F10X_XL) - #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ - #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ -#endif - -#if defined (STM32F10X_HD_VL) - #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ -#endif - -#ifdef STM32F10X_CL - #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ - #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ - #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ - #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ -#endif /* STM32F10X_CL */ - -/****************** Bit definition for RCC_APB2ENR register *****************/ -#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */ -#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */ -#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */ -#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */ -#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */ -#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) -#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */ -#endif - -#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */ -#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */ -#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) -#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */ -#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */ -#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */ -#endif - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#if defined (STM32F10X_HD) || defined (STM32F10X_XL) - #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ - #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ - #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ - #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ -#endif - -#if defined (STM32F10X_HD_VL) - #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ - #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ -#endif - -#ifdef STM32F10X_XL - #define RCC_APB2ENR_TIM9EN ((uint32_t)0x00080000) /*!< TIM9 Timer clock enable */ - #define RCC_APB2ENR_TIM10EN ((uint32_t)0x00100000) /*!< TIM10 Timer clock enable */ - #define RCC_APB2ENR_TIM11EN ((uint32_t)0x00200000) /*!< TIM11 Timer clock enable */ -#endif - -/***************** Bit definition for RCC_APB1ENR register ******************/ -#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ -#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ -#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ -#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ -#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL) -#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ -#endif - -#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ -#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ - #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ - #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ - #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -/* CHIBIOS FIX */ -//#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) -#if defined (STM32F10X_XL) || defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) - #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ -#endif - -/* CHIBIOS FIX */ -//#if defined (STM32F10X_HD) || defined (STM32F10X_CL) -#if defined (STM32F10X_XL) || defined (STM32F10X_HD) || defined (STM32F10X_CL) - #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ - #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ - #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ - #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ - #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ - #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ - #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ -#endif - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) - #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ - #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ - #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ - #define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC interface clock enable */ -#endif - -#ifdef STM32F10X_HD_VL - #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ - #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ - #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ - #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ - #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ - #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ - #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ -#endif /* STM32F10X_HD_VL */ - -#ifdef STM32F10X_CL - #define RCC_APB1ENR_CAN2EN ((uint32_t)0x04000000) /*!< CAN2 clock enable */ -#endif /* STM32F10X_CL */ - -#ifdef STM32F10X_XL - #define RCC_APB1ENR_TIM12EN ((uint32_t)0x00000040) /*!< TIM12 Timer clock enable */ - #define RCC_APB1ENR_TIM13EN ((uint32_t)0x00000080) /*!< TIM13 Timer clock enable */ - #define RCC_APB1ENR_TIM14EN ((uint32_t)0x00000100) /*!< TIM14 Timer clock enable */ -#endif /* STM32F10X_XL */ - -/******************* Bit definition for RCC_BDCR register *******************/ -#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ -#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ -#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ - -#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ -#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -/*!< RTC congiguration */ -#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ -#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ -#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ -#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ - -#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ -#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ - -/******************* Bit definition for RCC_CSR register ********************/ -#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ -#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ -#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ -#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ -#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ -#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ -#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ -#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ -#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ - -#ifdef STM32F10X_CL -/******************* Bit definition for RCC_AHBRSTR register ****************/ - #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ - #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ - -/******************* Bit definition for RCC_CFGR2 register ******************/ -/*!< PREDIV1 configuration */ - #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ - #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ - #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - - #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ - #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ - #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ - #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ - #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ - #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ - #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ - #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ - #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ - #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ - #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ - #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ - #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ - #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ - #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ - #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ - -/*!< PREDIV2 configuration */ - #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ - #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ - #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ - #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - - #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ - #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ - #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ - #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ - #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ - #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ - #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ - #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ - #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ - #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ - #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ - #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ - #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ - #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ - #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ - #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ - -/*!< PLL2MUL configuration */ - #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ - #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ - #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ - #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - - #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ - #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ - #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ - #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ - #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ - #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ - #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ - #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ - #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ - -/*!< PLL3MUL configuration */ - #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ - #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ - #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ - - #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ - #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ - #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ - #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ - #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ - #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ - #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ - #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ - #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ - - #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ - #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ - #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ - #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ - #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) -/******************* Bit definition for RCC_CFGR2 register ******************/ -/*!< PREDIV1 configuration */ - #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ - #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ - #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - - #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ - #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ - #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ - #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ - #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ - #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ - #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ - #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ - #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ - #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ - #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ - #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ - #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ - #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ - #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ - #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ -#endif - -/******************************************************************************/ -/* */ -/* General Purpose and Alternate Function I/O */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for GPIO_CRL register *******************/ -#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ - -#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ -#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - -#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ -#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ -#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ -#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ -#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ -#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ -#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ -#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ - -#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ -#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ -#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ -#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ -#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ -#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ -#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ -#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ -#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ -#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ -#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ -#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ - -/******************* Bit definition for GPIO_CRH register *******************/ -#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ - -#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ -#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - -#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ -#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ -#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ -#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ -#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ -#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ -#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ -#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ - -#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ -#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ -#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ -#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ -#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ -#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ -#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ -#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ -#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ -#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ -#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ -#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ - -/*!<****************** Bit definition for GPIO_IDR register *******************/ -#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ -#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ -#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ -#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ -#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ -#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ -#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ -#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ -#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ -#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ -#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ -#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ -#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ -#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ -#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ -#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ - -/******************* Bit definition for GPIO_ODR register *******************/ -#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ -#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ -#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ -#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ -#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ -#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ -#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ -#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ -#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ -#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ -#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ -#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ -#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ -#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ -#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ -#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ - -/****************** Bit definition for GPIO_BSRR register *******************/ -#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ -#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ -#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ -#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ -#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ -#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ -#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ -#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ -#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ -#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ -#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ -#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ -#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ -#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ -#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ -#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ - -#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ -#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ -#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ -#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ -#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ -#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ -#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ -#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ -#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ -#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ -#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ -#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ -#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ -#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ -#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ -#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ - -/******************* Bit definition for GPIO_BRR register *******************/ -#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ -#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ -#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ -#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ -#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ -#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ -#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ -#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ -#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ -#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ -#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ -#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ -#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ -#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ -#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ -#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ - -/****************** Bit definition for GPIO_LCKR register *******************/ -#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ -#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ -#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ -#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ -#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ -#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ -#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ -#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ -#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ -#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ -#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ -#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ -#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ -#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ -#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ -#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ -#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ - -/*----------------------------------------------------------------------------*/ - -/****************** Bit definition for AFIO_EVCR register *******************/ -#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ -#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ -#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ -#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ -#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ - -/*!< PIN configuration */ -#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ -#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ -#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ -#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ -#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ -#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ -#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ -#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ -#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ -#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ -#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ -#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ -#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ -#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ -#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ -#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ - -#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ -#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ -#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ -#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ - -/*!< PORT configuration */ -#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ -#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ -#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ -#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ -#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ - -#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ - -/****************** Bit definition for AFIO_MAPR register *******************/ -#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ -#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ -#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ -#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ - -#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ -#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -/* USART3_REMAP configuration */ -#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ -#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ -#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ - -#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ -#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -/*!< TIM1_REMAP configuration */ -#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ -#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ -#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ - -#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ -#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -/*!< TIM2_REMAP configuration */ -#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ -#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ -#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ -#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ - -#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ -#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -/*!< TIM3_REMAP configuration */ -#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ -#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ -#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ - -#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ - -#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ -#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ - -/*!< CAN_REMAP configuration */ -#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ -#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ -#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ - -#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ -#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ -#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ -#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ - -/*!< SWJ_CFG configuration */ -#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ -#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - -#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ -#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ -#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ -#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ - -#ifdef STM32F10X_CL -/*!< ETH_REMAP configuration */ - #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ - -/*!< CAN2_REMAP configuration */ - #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ - -/*!< MII_RMII_SEL configuration */ - #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ - -/*!< SPI3_REMAP configuration */ - #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ - -/*!< TIM2ITR1_IREMAP configuration */ - #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ - -/*!< PTP_PPS_REMAP configuration */ - #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x40000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ -#endif - -/***************** Bit definition for AFIO_EXTICR1 register *****************/ -#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ -#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ -#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ -#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ - -/*!< EXTI0 configuration */ -#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ -#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ -#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ -#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ -#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ -#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ -#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ - -/*!< EXTI1 configuration */ -#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ -#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ -#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ -#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ -#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ -#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ -#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ - -/*!< EXTI2 configuration */ -#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ -#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ -#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ -#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ -#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ -#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ -#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ - -/*!< EXTI3 configuration */ -#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ -#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ -#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ -#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ -#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ -#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ -#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ - -/***************** Bit definition for AFIO_EXTICR2 register *****************/ -#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ -#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ -#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ -#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ - -/*!< EXTI4 configuration */ -#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ -#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ -#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ -#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ -#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ -#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ -#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ - -/* EXTI5 configuration */ -#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ -#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ -#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ -#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ -#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ -#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ -#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ - -/*!< EXTI6 configuration */ -#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ -#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ -#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ -#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ -#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ -#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ -#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ - -/*!< EXTI7 configuration */ -#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ -#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ -#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ -#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ -#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ -#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ -#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ - -/***************** Bit definition for AFIO_EXTICR3 register *****************/ -#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ -#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ -#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ -#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ - -/*!< EXTI8 configuration */ -#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ -#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ -#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ -#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ -#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ -#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ -#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ - -/*!< EXTI9 configuration */ -#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ -#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ -#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ -#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ -#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ -#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ -#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ - -/*!< EXTI10 configuration */ -#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ -#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ -#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ -#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ -#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ -#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ -#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ - -/*!< EXTI11 configuration */ -#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ -#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ -#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ -#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ -#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ -#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ -#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ - -/***************** Bit definition for AFIO_EXTICR4 register *****************/ -#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ -#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ -#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ -#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ - -/* EXTI12 configuration */ -#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ -#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ -#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ -#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ -#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ -#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ -#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ - -/* EXTI13 configuration */ -#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ -#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ -#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ -#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ -#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ -#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ -#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ - -/*!< EXTI14 configuration */ -#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ -#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ -#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ -#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ -#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ -#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ -#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ - -/*!< EXTI15 configuration */ -#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ -#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ -#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ -#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ -#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ -#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ -#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) -/****************** Bit definition for AFIO_MAPR2 register ******************/ -#define AFIO_MAPR2_TIM15_REMAP ((uint32_t)0x00000001) /*!< TIM15 remapping */ -#define AFIO_MAPR2_TIM16_REMAP ((uint32_t)0x00000002) /*!< TIM16 remapping */ -#define AFIO_MAPR2_TIM17_REMAP ((uint32_t)0x00000004) /*!< TIM17 remapping */ -#define AFIO_MAPR2_CEC_REMAP ((uint32_t)0x00000008) /*!< CEC remapping */ -#define AFIO_MAPR2_TIM1_DMA_REMAP ((uint32_t)0x00000010) /*!< TIM1_DMA remapping */ -#endif - -#ifdef STM32F10X_HD_VL -#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ -#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ -#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ -#define AFIO_MAPR2_TIM67_DAC_DMA_REMAP ((uint32_t)0x00000800) /*!< TIM6/TIM7 and DAC DMA remapping */ -#define AFIO_MAPR2_TIM12_REMAP ((uint32_t)0x00001000) /*!< TIM12 remapping */ -#define AFIO_MAPR2_MISC_REMAP ((uint32_t)0x00002000) /*!< Miscellaneous remapping */ -#endif - -#ifdef STM32F10X_XL -/****************** Bit definition for AFIO_MAPR2 register ******************/ -#define AFIO_MAPR2_TIM9_REMAP ((uint32_t)0x00000020) /*!< TIM9 remapping */ -#define AFIO_MAPR2_TIM10_REMAP ((uint32_t)0x00000040) /*!< TIM10 remapping */ -#define AFIO_MAPR2_TIM11_REMAP ((uint32_t)0x00000080) /*!< TIM11 remapping */ -#define AFIO_MAPR2_TIM13_REMAP ((uint32_t)0x00000100) /*!< TIM13 remapping */ -#define AFIO_MAPR2_TIM14_REMAP ((uint32_t)0x00000200) /*!< TIM14 remapping */ -#define AFIO_MAPR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) /*!< FSMC NADV remapping */ -#endif - -/******************************************************************************/ -/* */ -/* SystemTick */ -/* */ -/******************************************************************************/ - -/***************** Bit definition for SysTick_CTRL register *****************/ -#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ -#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ -#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ -#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ - -/***************** Bit definition for SysTick_LOAD register *****************/ -#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ - -/***************** Bit definition for SysTick_VAL register ******************/ -#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ - -/***************** Bit definition for SysTick_CALIB register ****************/ -#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ -#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ -#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ - -/******************************************************************************/ -/* */ -/* Nested Vectored Interrupt Controller */ -/* */ -/******************************************************************************/ - -/****************** Bit definition for NVIC_ISER register *******************/ -#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ -#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_ICER register *******************/ -#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ -#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_ISPR register *******************/ -#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ -#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_ICPR register *******************/ -#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ -#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_IABR register *******************/ -#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ -#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_PRI0 register *******************/ -#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ -#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ -#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ -#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ - -/****************** Bit definition for NVIC_PRI1 register *******************/ -#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ -#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ -#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ -#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ - -/****************** Bit definition for NVIC_PRI2 register *******************/ -#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ -#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ -#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ -#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ - -/****************** Bit definition for NVIC_PRI3 register *******************/ -#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ -#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ -#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ -#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ - -/****************** Bit definition for NVIC_PRI4 register *******************/ -#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ -#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ -#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ -#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ - -/****************** Bit definition for NVIC_PRI5 register *******************/ -#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ -#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ -#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ -#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ - -/****************** Bit definition for NVIC_PRI6 register *******************/ -#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ -#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ -#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ -#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ - -/****************** Bit definition for NVIC_PRI7 register *******************/ -#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ -#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ -#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ -#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ - -/****************** Bit definition for SCB_CPUID register *******************/ -#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ -#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ -#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ -#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ -#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ - -/******************* Bit definition for SCB_ICSR register *******************/ -#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ -#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ -#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ -#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ -#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ -#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ -#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ -#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ -#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ -#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ - -/******************* Bit definition for SCB_VTOR register *******************/ -#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ -#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ - -/*!<***************** Bit definition for SCB_AIRCR register *******************/ -#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ -#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ -#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ - -#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ -#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ - -/* prority group configuration */ -#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ -#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ - -#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ -#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ - -/******************* Bit definition for SCB_SCR register ********************/ -#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ -#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ -#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ - -/******************** Bit definition for SCB_CCR register *******************/ -#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ -#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ -#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ -#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ -#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ -#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ - -/******************* Bit definition for SCB_SHPR register ********************/ -#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ -#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ -#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ -#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ - -/****************** Bit definition for SCB_SHCSR register *******************/ -#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ -#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ -#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ -#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ -#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ -#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ -#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ -#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ -#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ -#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ -#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ -#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ -#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ -#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ - -/******************* Bit definition for SCB_CFSR register *******************/ -/*!< MFSR */ -#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ -#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ -#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ -#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ -#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ -/*!< BFSR */ -#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ -#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ -#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ -#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ -#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ -#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ -/*!< UFSR */ -#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to execute an undefined instruction */ -#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ -#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ -#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ -#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ -#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ - -/******************* Bit definition for SCB_HFSR register *******************/ -#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occurs because of vector table read on exception processing */ -#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ -#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ - -/******************* Bit definition for SCB_DFSR register *******************/ -#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ -#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ -#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ -#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ -#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ - -/******************* Bit definition for SCB_MMFAR register ******************/ -#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ - -/******************* Bit definition for SCB_BFAR register *******************/ -#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ - -/******************* Bit definition for SCB_afsr register *******************/ -#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ - -/******************************************************************************/ -/* */ -/* External Interrupt/Event Controller */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for EXTI_IMR register *******************/ -#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ -#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ -#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ -#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ -#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ -#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ -#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ -#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ -#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ -#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ -#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ -#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ -#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ -#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ -#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ -#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ -#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ -#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ -#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ -#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ - -/******************* Bit definition for EXTI_EMR register *******************/ -#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ -#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ -#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ -#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ -#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ -#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ -#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ -#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ -#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ -#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ -#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ -#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ -#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ -#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ -#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ -#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ -#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ -#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ -#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ -#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ - -/****************** Bit definition for EXTI_RTSR register *******************/ -#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ -#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ -#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ -#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ -#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ -#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ -#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ -#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ -#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ -#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ -#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ -#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ -#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ -#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ -#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ -#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ -#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ -#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ -#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ -#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ - -/****************** Bit definition for EXTI_FTSR register *******************/ -#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ -#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ -#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ -#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ -#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ -#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ -#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ -#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ -#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ -#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ -#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ -#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ -#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ -#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ -#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ -#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ -#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ -#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ -#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ -#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ - -/****************** Bit definition for EXTI_SWIER register ******************/ -#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ -#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ -#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ -#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ -#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ -#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ -#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ -#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ -#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ -#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ -#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ -#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ -#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ -#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ -#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ -#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ -#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ -#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ -#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ -#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ - -/******************* Bit definition for EXTI_PR register ********************/ -#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ -#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ -#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ -#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ -#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ -#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ -#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ -#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ -#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ -#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ -#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ -#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ -#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ -#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ -#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ -#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ -#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ -#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ -#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ -#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ - -/******************************************************************************/ -/* */ -/* DMA Controller */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for DMA_ISR register ********************/ -#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ -#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ -#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ -#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ -#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ -#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ -#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ -#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ -#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ -#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ -#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ -#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ -#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ -#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ -#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ -#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ -#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ -#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ -#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ -#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ -#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ -#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ -#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ -#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ -#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ -#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ -#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ -#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ - -/******************* Bit definition for DMA_IFCR register *******************/ -#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clear */ -#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ -#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ -#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ -#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ -#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ -#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ -#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ -#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ -#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ -#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ -#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ -#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ -#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ -#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ -#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ -#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ -#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ -#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ -#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ -#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ -#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ -#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ -#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ -#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ -#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ -#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ -#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ - -/******************* Bit definition for DMA_CCR1 register *******************/ -#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ -#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ -#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/******************* Bit definition for DMA_CCR2 register *******************/ -#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/******************* Bit definition for DMA_CCR3 register *******************/ -#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/*!<****************** Bit definition for DMA_CCR4 register *******************/ -#define DMA_CCR4_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR4_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR4_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR4_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR4_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR4_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR4_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR4_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR4_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR4_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR4_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR4_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR4_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR4_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR4_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR4_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR4_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR4_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/****************** Bit definition for DMA_CCR5 register *******************/ -#define DMA_CCR5_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR5_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR5_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR5_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR5_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR5_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR5_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR5_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR5_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR5_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR5_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR5_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR5_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR5_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR5_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR5_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR5_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR5_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ - -/******************* Bit definition for DMA_CCR6 register *******************/ -#define DMA_CCR6_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR6_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR6_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR6_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR6_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR6_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR6_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR6_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR6_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR6_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR6_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR6_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR6_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR6_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR6_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR6_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR6_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR6_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/******************* Bit definition for DMA_CCR7 register *******************/ -#define DMA_CCR7_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR7_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR7_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR7_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR7_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR7_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR7_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR7_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR7_PSIZE , ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR7_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR7_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR7_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR7_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR7_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR7_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR7_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR7_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR7_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode enable */ - -/****************** Bit definition for DMA_CNDTR1 register ******************/ -#define DMA_CNDTR1_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CNDTR2 register ******************/ -#define DMA_CNDTR2_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CNDTR3 register ******************/ -#define DMA_CNDTR3_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CNDTR4 register ******************/ -#define DMA_CNDTR4_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CNDTR5 register ******************/ -#define DMA_CNDTR5_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CNDTR6 register ******************/ -#define DMA_CNDTR6_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CNDTR7 register ******************/ -#define DMA_CNDTR7_NDT ((uint16_t)0xFFFF) /*!< Number of data to Transfer */ - -/****************** Bit definition for DMA_CPAR1 register *******************/ -#define DMA_CPAR1_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - -/****************** Bit definition for DMA_CPAR2 register *******************/ -#define DMA_CPAR2_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - -/****************** Bit definition for DMA_CPAR3 register *******************/ -#define DMA_CPAR3_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - - -/****************** Bit definition for DMA_CPAR4 register *******************/ -#define DMA_CPAR4_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - -/****************** Bit definition for DMA_CPAR5 register *******************/ -#define DMA_CPAR5_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - -/****************** Bit definition for DMA_CPAR6 register *******************/ -#define DMA_CPAR6_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - - -/****************** Bit definition for DMA_CPAR7 register *******************/ -#define DMA_CPAR7_PA ((uint32_t)0xFFFFFFFF) /*!< Peripheral Address */ - -/****************** Bit definition for DMA_CMAR1 register *******************/ -#define DMA_CMAR1_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/****************** Bit definition for DMA_CMAR2 register *******************/ -#define DMA_CMAR2_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/****************** Bit definition for DMA_CMAR3 register *******************/ -#define DMA_CMAR3_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - - -/****************** Bit definition for DMA_CMAR4 register *******************/ -#define DMA_CMAR4_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/****************** Bit definition for DMA_CMAR5 register *******************/ -#define DMA_CMAR5_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/****************** Bit definition for DMA_CMAR6 register *******************/ -#define DMA_CMAR6_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/****************** Bit definition for DMA_CMAR7 register *******************/ -#define DMA_CMAR7_MA ((uint32_t)0xFFFFFFFF) /*!< Memory Address */ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint8_t)0x01) /*!< Analog watchdog flag */ -#define ADC_SR_EOC ((uint8_t)0x02) /*!< End of conversion */ -#define ADC_SR_JEOC ((uint8_t)0x04) /*!< Injected channel end of conversion */ -#define ADC_SR_JSTRT ((uint8_t)0x08) /*!< Injected channel Start flag */ -#define ADC_SR_STRT ((uint8_t)0x10) /*!< Regular channel Start flag */ - -/******************* Bit definition for ADC_CR1 register ********************/ -#define ADC_CR1_AWDCH ((uint32_t)0x0000001F) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ -#define ADC_CR1_AWDCH_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_CR1_AWDCH_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_CR1_AWDCH_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_CR1_AWDCH_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_CR1_AWDCH_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_CR1_EOCIE ((uint32_t)0x00000020) /*!< Interrupt enable for EOC */ -#define ADC_CR1_AWDIE ((uint32_t)0x00000040) /*!< Analog Watchdog interrupt enable */ -#define ADC_CR1_JEOCIE ((uint32_t)0x00000080) /*!< Interrupt enable for injected channels */ -#define ADC_CR1_SCAN ((uint32_t)0x00000100) /*!< Scan mode */ -#define ADC_CR1_AWDSGL ((uint32_t)0x00000200) /*!< Enable the watchdog on a single channel in scan mode */ -#define ADC_CR1_JAUTO ((uint32_t)0x00000400) /*!< Automatic injected group conversion */ -#define ADC_CR1_DISCEN ((uint32_t)0x00000800) /*!< Discontinuous mode on regular channels */ -#define ADC_CR1_JDISCEN ((uint32_t)0x00001000) /*!< Discontinuous mode on injected channels */ - -#define ADC_CR1_DISCNUM ((uint32_t)0x0000E000) /*!< DISCNUM[2:0] bits (Discontinuous mode channel count) */ -#define ADC_CR1_DISCNUM_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define ADC_CR1_DISCNUM_1 ((uint32_t)0x00004000) /*!< Bit 1 */ -#define ADC_CR1_DISCNUM_2 ((uint32_t)0x00008000) /*!< Bit 2 */ - -#define ADC_CR1_DUALMOD ((uint32_t)0x000F0000) /*!< DUALMOD[3:0] bits (Dual mode selection) */ -#define ADC_CR1_DUALMOD_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define ADC_CR1_DUALMOD_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define ADC_CR1_DUALMOD_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define ADC_CR1_DUALMOD_3 ((uint32_t)0x00080000) /*!< Bit 3 */ - -#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) /*!< Analog watchdog enable on injected channels */ -#define ADC_CR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ - - -/******************* Bit definition for ADC_CR2 register ********************/ -#define ADC_CR2_ADON ((uint32_t)0x00000001) /*!< A/D Converter ON / OFF */ -#define ADC_CR2_CONT ((uint32_t)0x00000002) /*!< Continuous Conversion */ -#define ADC_CR2_CAL ((uint32_t)0x00000004) /*!< A/D Calibration */ -#define ADC_CR2_RSTCAL ((uint32_t)0x00000008) /*!< Reset Calibration */ -#define ADC_CR2_DMA ((uint32_t)0x00000100) /*!< Direct Memory access mode */ -#define ADC_CR2_ALIGN ((uint32_t)0x00000800) /*!< Data Alignment */ - -#define ADC_CR2_JEXTSEL ((uint32_t)0x00007000) /*!< JEXTSEL[2:0] bits (External event select for injected group) */ -#define ADC_CR2_JEXTSEL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define ADC_CR2_JEXTSEL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define ADC_CR2_JEXTSEL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - -#define ADC_CR2_JEXTTRIG ((uint32_t)0x00008000) /*!< External Trigger Conversion mode for injected channels */ - -#define ADC_CR2_EXTSEL ((uint32_t)0x000E0000) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */ -#define ADC_CR2_EXTSEL_0 ((uint32_t)0x00020000) /*!< Bit 0 */ -#define ADC_CR2_EXTSEL_1 ((uint32_t)0x00040000) /*!< Bit 1 */ -#define ADC_CR2_EXTSEL_2 ((uint32_t)0x00080000) /*!< Bit 2 */ - -#define ADC_CR2_EXTTRIG ((uint32_t)0x00100000) /*!< External Trigger Conversion mode for regular channels */ -#define ADC_CR2_JSWSTART ((uint32_t)0x00200000) /*!< Start Conversion of injected channels */ -#define ADC_CR2_SWSTART ((uint32_t)0x00400000) /*!< Start Conversion of regular channels */ -#define ADC_CR2_TSVREFE ((uint32_t)0x00800000) /*!< Temperature Sensor and VREFINT Enable */ - -/****************** Bit definition for ADC_SMPR1 register *******************/ -#define ADC_SMPR1_SMP10 ((uint32_t)0x00000007) /*!< SMP10[2:0] bits (Channel 10 Sample time selection) */ -#define ADC_SMPR1_SMP10_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SMPR1_SMP10_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SMPR1_SMP10_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP11 ((uint32_t)0x00000038) /*!< SMP11[2:0] bits (Channel 11 Sample time selection) */ -#define ADC_SMPR1_SMP11_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define ADC_SMPR1_SMP11_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define ADC_SMPR1_SMP11_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP12 ((uint32_t)0x000001C0) /*!< SMP12[2:0] bits (Channel 12 Sample time selection) */ -#define ADC_SMPR1_SMP12_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define ADC_SMPR1_SMP12_1 ((uint32_t)0x00000080) /*!< Bit 1 */ -#define ADC_SMPR1_SMP12_2 ((uint32_t)0x00000100) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP13 ((uint32_t)0x00000E00) /*!< SMP13[2:0] bits (Channel 13 Sample time selection) */ -#define ADC_SMPR1_SMP13_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define ADC_SMPR1_SMP13_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define ADC_SMPR1_SMP13_2 ((uint32_t)0x00000800) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP14 ((uint32_t)0x00007000) /*!< SMP14[2:0] bits (Channel 14 Sample time selection) */ -#define ADC_SMPR1_SMP14_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define ADC_SMPR1_SMP14_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define ADC_SMPR1_SMP14_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP15 ((uint32_t)0x00038000) /*!< SMP15[2:0] bits (Channel 15 Sample time selection) */ -#define ADC_SMPR1_SMP15_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SMPR1_SMP15_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SMPR1_SMP15_2 ((uint32_t)0x00020000) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP16 ((uint32_t)0x001C0000) /*!< SMP16[2:0] bits (Channel 16 Sample time selection) */ -#define ADC_SMPR1_SMP16_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define ADC_SMPR1_SMP16_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define ADC_SMPR1_SMP16_2 ((uint32_t)0x00100000) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP17 ((uint32_t)0x00E00000) /*!< SMP17[2:0] bits (Channel 17 Sample time selection) */ -#define ADC_SMPR1_SMP17_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define ADC_SMPR1_SMP17_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define ADC_SMPR1_SMP17_2 ((uint32_t)0x00800000) /*!< Bit 2 */ - -/****************** Bit definition for ADC_SMPR2 register *******************/ -#define ADC_SMPR2_SMP0 ((uint32_t)0x00000007) /*!< SMP0[2:0] bits (Channel 0 Sample time selection) */ -#define ADC_SMPR2_SMP0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SMPR2_SMP0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SMPR2_SMP0_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP1 ((uint32_t)0x00000038) /*!< SMP1[2:0] bits (Channel 1 Sample time selection) */ -#define ADC_SMPR2_SMP1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define ADC_SMPR2_SMP1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define ADC_SMPR2_SMP1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP2 ((uint32_t)0x000001C0) /*!< SMP2[2:0] bits (Channel 2 Sample time selection) */ -#define ADC_SMPR2_SMP2_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define ADC_SMPR2_SMP2_1 ((uint32_t)0x00000080) /*!< Bit 1 */ -#define ADC_SMPR2_SMP2_2 ((uint32_t)0x00000100) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP3 ((uint32_t)0x00000E00) /*!< SMP3[2:0] bits (Channel 3 Sample time selection) */ -#define ADC_SMPR2_SMP3_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define ADC_SMPR2_SMP3_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define ADC_SMPR2_SMP3_2 ((uint32_t)0x00000800) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP4 ((uint32_t)0x00007000) /*!< SMP4[2:0] bits (Channel 4 Sample time selection) */ -#define ADC_SMPR2_SMP4_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP4_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP4_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP5 ((uint32_t)0x00038000) /*!< SMP5[2:0] bits (Channel 5 Sample time selection) */ -#define ADC_SMPR2_SMP5_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP5_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP5_2 ((uint32_t)0x00020000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP6 ((uint32_t)0x001C0000) /*!< SMP6[2:0] bits (Channel 6 Sample time selection) */ -#define ADC_SMPR2_SMP6_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP6_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP6_2 ((uint32_t)0x00100000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP7 ((uint32_t)0x00E00000) /*!< SMP7[2:0] bits (Channel 7 Sample time selection) */ -#define ADC_SMPR2_SMP7_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP7_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP7_2 ((uint32_t)0x00800000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP8 ((uint32_t)0x07000000) /*!< SMP8[2:0] bits (Channel 8 Sample time selection) */ -#define ADC_SMPR2_SMP8_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP8_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP8_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP9 ((uint32_t)0x38000000) /*!< SMP9[2:0] bits (Channel 9 Sample time selection) */ -#define ADC_SMPR2_SMP9_0 ((uint32_t)0x08000000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP9_1 ((uint32_t)0x10000000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP9_2 ((uint32_t)0x20000000) /*!< Bit 2 */ - -/****************** Bit definition for ADC_JOFR1 register *******************/ -#define ADC_JOFR1_JOFFSET1 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 1 */ - -/****************** Bit definition for ADC_JOFR2 register *******************/ -#define ADC_JOFR2_JOFFSET2 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 2 */ - -/****************** Bit definition for ADC_JOFR3 register *******************/ -#define ADC_JOFR3_JOFFSET3 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 3 */ - -/****************** Bit definition for ADC_JOFR4 register *******************/ -#define ADC_JOFR4_JOFFSET4 ((uint16_t)0x0FFF) /*!< Data offset for injected channel 4 */ - -/******************* Bit definition for ADC_HTR register ********************/ -#define ADC_HTR_HT ((uint16_t)0x0FFF) /*!< Analog watchdog high threshold */ - -/******************* Bit definition for ADC_LTR register ********************/ -#define ADC_LTR_LT ((uint16_t)0x0FFF) /*!< Analog watchdog low threshold */ - -/******************* Bit definition for ADC_SQR1 register *******************/ -#define ADC_SQR1_SQ13 ((uint32_t)0x0000001F) /*!< SQ13[4:0] bits (13th conversion in regular sequence) */ -#define ADC_SQR1_SQ13_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR1_SQ13_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR1_SQ13_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR1_SQ13_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR1_SQ13_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR1_SQ14 ((uint32_t)0x000003E0) /*!< SQ14[4:0] bits (14th conversion in regular sequence) */ -#define ADC_SQR1_SQ14_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR1_SQ14_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR1_SQ14_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR1_SQ14_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR1_SQ14_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR1_SQ15 ((uint32_t)0x00007C00) /*!< SQ15[4:0] bits (15th conversion in regular sequence) */ -#define ADC_SQR1_SQ15_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR1_SQ15_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR1_SQ15_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR1_SQ15_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR1_SQ15_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR1_SQ16 ((uint32_t)0x000F8000) /*!< SQ16[4:0] bits (16th conversion in regular sequence) */ -#define ADC_SQR1_SQ16_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR1_SQ16_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR1_SQ16_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR1_SQ16_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR1_SQ16_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR1_L ((uint32_t)0x00F00000) /*!< L[3:0] bits (Regular channel sequence length) */ -#define ADC_SQR1_L_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR1_L_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR1_L_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR1_L_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -/******************* Bit definition for ADC_SQR2 register *******************/ -#define ADC_SQR2_SQ7 ((uint32_t)0x0000001F) /*!< SQ7[4:0] bits (7th conversion in regular sequence) */ -#define ADC_SQR2_SQ7_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR2_SQ7_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR2_SQ7_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR2_SQ7_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR2_SQ7_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR2_SQ8 ((uint32_t)0x000003E0) /*!< SQ8[4:0] bits (8th conversion in regular sequence) */ -#define ADC_SQR2_SQ8_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR2_SQ8_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR2_SQ8_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR2_SQ8_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR2_SQ8_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR2_SQ9 ((uint32_t)0x00007C00) /*!< SQ9[4:0] bits (9th conversion in regular sequence) */ -#define ADC_SQR2_SQ9_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR2_SQ9_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR2_SQ9_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR2_SQ9_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR2_SQ9_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR2_SQ10 ((uint32_t)0x000F8000) /*!< SQ10[4:0] bits (10th conversion in regular sequence) */ -#define ADC_SQR2_SQ10_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR2_SQ10_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR2_SQ10_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR2_SQ10_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR2_SQ10_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR2_SQ11 ((uint32_t)0x01F00000) /*!< SQ11[4:0] bits (11th conversion in regular sequence) */ -#define ADC_SQR2_SQ11_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR2_SQ11_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR2_SQ11_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR2_SQ11_3 ((uint32_t)0x00800000) /*!< Bit 3 */ -#define ADC_SQR2_SQ11_4 ((uint32_t)0x01000000) /*!< Bit 4 */ - -#define ADC_SQR2_SQ12 ((uint32_t)0x3E000000) /*!< SQ12[4:0] bits (12th conversion in regular sequence) */ -#define ADC_SQR2_SQ12_0 ((uint32_t)0x02000000) /*!< Bit 0 */ -#define ADC_SQR2_SQ12_1 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define ADC_SQR2_SQ12_2 ((uint32_t)0x08000000) /*!< Bit 2 */ -#define ADC_SQR2_SQ12_3 ((uint32_t)0x10000000) /*!< Bit 3 */ -#define ADC_SQR2_SQ12_4 ((uint32_t)0x20000000) /*!< Bit 4 */ - -/******************* Bit definition for ADC_SQR3 register *******************/ -#define ADC_SQR3_SQ1 ((uint32_t)0x0000001F) /*!< SQ1[4:0] bits (1st conversion in regular sequence) */ -#define ADC_SQR3_SQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR3_SQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR3_SQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR3_SQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR3_SQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR3_SQ2 ((uint32_t)0x000003E0) /*!< SQ2[4:0] bits (2nd conversion in regular sequence) */ -#define ADC_SQR3_SQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR3_SQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR3_SQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR3_SQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR3_SQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR3_SQ3 ((uint32_t)0x00007C00) /*!< SQ3[4:0] bits (3rd conversion in regular sequence) */ -#define ADC_SQR3_SQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR3_SQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR3_SQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR3_SQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR3_SQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR3_SQ4 ((uint32_t)0x000F8000) /*!< SQ4[4:0] bits (4th conversion in regular sequence) */ -#define ADC_SQR3_SQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR3_SQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR3_SQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR3_SQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR3_SQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR3_SQ5 ((uint32_t)0x01F00000) /*!< SQ5[4:0] bits (5th conversion in regular sequence) */ -#define ADC_SQR3_SQ5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR3_SQ5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR3_SQ5_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR3_SQ5_3 ((uint32_t)0x00800000) /*!< Bit 3 */ -#define ADC_SQR3_SQ5_4 ((uint32_t)0x01000000) /*!< Bit 4 */ - -#define ADC_SQR3_SQ6 ((uint32_t)0x3E000000) /*!< SQ6[4:0] bits (6th conversion in regular sequence) */ -#define ADC_SQR3_SQ6_0 ((uint32_t)0x02000000) /*!< Bit 0 */ -#define ADC_SQR3_SQ6_1 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define ADC_SQR3_SQ6_2 ((uint32_t)0x08000000) /*!< Bit 2 */ -#define ADC_SQR3_SQ6_3 ((uint32_t)0x10000000) /*!< Bit 3 */ -#define ADC_SQR3_SQ6_4 ((uint32_t)0x20000000) /*!< Bit 4 */ - -/******************* Bit definition for ADC_JSQR register *******************/ -#define ADC_JSQR_JSQ1 ((uint32_t)0x0000001F) /*!< JSQ1[4:0] bits (1st conversion in injected sequence) */ -#define ADC_JSQR_JSQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_JSQR_JSQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_JSQR_JSQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_JSQR_JSQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_JSQR_JSQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_JSQR_JSQ2 ((uint32_t)0x000003E0) /*!< JSQ2[4:0] bits (2nd conversion in injected sequence) */ -#define ADC_JSQR_JSQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_JSQR_JSQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_JSQR_JSQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_JSQR_JSQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_JSQR_JSQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_JSQR_JSQ3 ((uint32_t)0x00007C00) /*!< JSQ3[4:0] bits (3rd conversion in injected sequence) */ -#define ADC_JSQR_JSQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_JSQR_JSQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_JSQR_JSQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_JSQR_JSQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_JSQR_JSQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_JSQR_JSQ4 ((uint32_t)0x000F8000) /*!< JSQ4[4:0] bits (4th conversion in injected sequence) */ -#define ADC_JSQR_JSQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_JSQR_JSQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_JSQR_JSQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_JSQR_JSQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_JSQR_JSQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_JSQR_JL ((uint32_t)0x00300000) /*!< JL[1:0] bits (Injected Sequence length) */ -#define ADC_JSQR_JL_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_JSQR_JL_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -/******************* Bit definition for ADC_JDR1 register *******************/ -#define ADC_JDR1_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ - -/******************* Bit definition for ADC_JDR2 register *******************/ -#define ADC_JDR2_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ - -/******************* Bit definition for ADC_JDR3 register *******************/ -#define ADC_JDR3_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ - -/******************* Bit definition for ADC_JDR4 register *******************/ -#define ADC_JDR4_JDATA ((uint16_t)0xFFFF) /*!< Injected data */ - -/******************** Bit definition for ADC_DR register ********************/ -#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ -#define ADC_DR_ADC2DATA ((uint32_t)0xFFFF0000) /*!< ADC2 data */ - -/******************************************************************************/ -/* */ -/* Digital to Analog Converter */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for DAC_CR register ********************/ -#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!< DAC channel1 enable */ -#define DAC_CR_BOFF1 ((uint32_t)0x00000002) /*!< DAC channel1 output buffer disable */ -#define DAC_CR_TEN1 ((uint32_t)0x00000004) /*!< DAC channel1 Trigger enable */ - -#define DAC_CR_TSEL1 ((uint32_t)0x00000038) /*!< TSEL1[2:0] (DAC channel1 Trigger selection) */ -#define DAC_CR_TSEL1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define DAC_CR_TSEL1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define DAC_CR_TSEL1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define DAC_CR_WAVE1 ((uint32_t)0x000000C0) /*!< WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */ -#define DAC_CR_WAVE1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define DAC_CR_WAVE1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define DAC_CR_MAMP1 ((uint32_t)0x00000F00) /*!< MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */ -#define DAC_CR_MAMP1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define DAC_CR_MAMP1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define DAC_CR_MAMP1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define DAC_CR_MAMP1_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define DAC_CR_DMAEN1 ((uint32_t)0x00001000) /*!< DAC channel1 DMA enable */ -#define DAC_CR_EN2 ((uint32_t)0x00010000) /*!< DAC channel2 enable */ -#define DAC_CR_BOFF2 ((uint32_t)0x00020000) /*!< DAC channel2 output buffer disable */ -#define DAC_CR_TEN2 ((uint32_t)0x00040000) /*!< DAC channel2 Trigger enable */ - -#define DAC_CR_TSEL2 ((uint32_t)0x00380000) /*!< TSEL2[2:0] (DAC channel2 Trigger selection) */ -#define DAC_CR_TSEL2_0 ((uint32_t)0x00080000) /*!< Bit 0 */ -#define DAC_CR_TSEL2_1 ((uint32_t)0x00100000) /*!< Bit 1 */ -#define DAC_CR_TSEL2_2 ((uint32_t)0x00200000) /*!< Bit 2 */ - -#define DAC_CR_WAVE2 ((uint32_t)0x00C00000) /*!< WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */ -#define DAC_CR_WAVE2_0 ((uint32_t)0x00400000) /*!< Bit 0 */ -#define DAC_CR_WAVE2_1 ((uint32_t)0x00800000) /*!< Bit 1 */ - -#define DAC_CR_MAMP2 ((uint32_t)0x0F000000) /*!< MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */ -#define DAC_CR_MAMP2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define DAC_CR_MAMP2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define DAC_CR_MAMP2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define DAC_CR_MAMP2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define DAC_CR_DMAEN2 ((uint32_t)0x10000000) /*!< DAC channel2 DMA enabled */ - -/***************** Bit definition for DAC_SWTRIGR register ******************/ -#define DAC_SWTRIGR_SWTRIG1 ((uint8_t)0x01) /*!< DAC channel1 software trigger */ -#define DAC_SWTRIGR_SWTRIG2 ((uint8_t)0x02) /*!< DAC channel2 software trigger */ - -/***************** Bit definition for DAC_DHR12R1 register ******************/ -#define DAC_DHR12R1_DACC1DHR ((uint16_t)0x0FFF) /*!< DAC channel1 12-bit Right aligned data */ - -/***************** Bit definition for DAC_DHR12L1 register ******************/ -#define DAC_DHR12L1_DACC1DHR ((uint16_t)0xFFF0) /*!< DAC channel1 12-bit Left aligned data */ - -/****************** Bit definition for DAC_DHR8R1 register ******************/ -#define DAC_DHR8R1_DACC1DHR ((uint8_t)0xFF) /*!< DAC channel1 8-bit Right aligned data */ - -/***************** Bit definition for DAC_DHR12R2 register ******************/ -#define DAC_DHR12R2_DACC2DHR ((uint16_t)0x0FFF) /*!< DAC channel2 12-bit Right aligned data */ - -/***************** Bit definition for DAC_DHR12L2 register ******************/ -#define DAC_DHR12L2_DACC2DHR ((uint16_t)0xFFF0) /*!< DAC channel2 12-bit Left aligned data */ - -/****************** Bit definition for DAC_DHR8R2 register ******************/ -#define DAC_DHR8R2_DACC2DHR ((uint8_t)0xFF) /*!< DAC channel2 8-bit Right aligned data */ - -/***************** Bit definition for DAC_DHR12RD register ******************/ -#define DAC_DHR12RD_DACC1DHR ((uint32_t)0x00000FFF) /*!< DAC channel1 12-bit Right aligned data */ -#define DAC_DHR12RD_DACC2DHR ((uint32_t)0x0FFF0000) /*!< DAC channel2 12-bit Right aligned data */ - -/***************** Bit definition for DAC_DHR12LD register ******************/ -#define DAC_DHR12LD_DACC1DHR ((uint32_t)0x0000FFF0) /*!< DAC channel1 12-bit Left aligned data */ -#define DAC_DHR12LD_DACC2DHR ((uint32_t)0xFFF00000) /*!< DAC channel2 12-bit Left aligned data */ - -/****************** Bit definition for DAC_DHR8RD register ******************/ -#define DAC_DHR8RD_DACC1DHR ((uint16_t)0x00FF) /*!< DAC channel1 8-bit Right aligned data */ -#define DAC_DHR8RD_DACC2DHR ((uint16_t)0xFF00) /*!< DAC channel2 8-bit Right aligned data */ - -/******************* Bit definition for DAC_DOR1 register *******************/ -#define DAC_DOR1_DACC1DOR ((uint16_t)0x0FFF) /*!< DAC channel1 data output */ - -/******************* Bit definition for DAC_DOR2 register *******************/ -#define DAC_DOR2_DACC2DOR ((uint16_t)0x0FFF) /*!< DAC channel2 data output */ - -/******************** Bit definition for DAC_SR register ********************/ -#define DAC_SR_DMAUDR1 ((uint32_t)0x00002000) /*!< DAC channel1 DMA underrun flag */ -#define DAC_SR_DMAUDR2 ((uint32_t)0x20000000) /*!< DAC channel2 DMA underrun flag */ - -/******************************************************************************/ -/* */ -/* CEC */ -/* */ -/******************************************************************************/ -/******************** Bit definition for CEC_CFGR register ******************/ -#define CEC_CFGR_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ -#define CEC_CFGR_IE ((uint16_t)0x0002) /*!< Interrupt Enable */ -#define CEC_CFGR_BTEM ((uint16_t)0x0004) /*!< Bit Timing Error Mode */ -#define CEC_CFGR_BPEM ((uint16_t)0x0008) /*!< Bit Period Error Mode */ - -/******************** Bit definition for CEC_OAR register ******************/ -#define CEC_OAR_OA ((uint16_t)0x000F) /*!< OA[3:0]: Own Address */ -#define CEC_OAR_OA_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define CEC_OAR_OA_1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define CEC_OAR_OA_2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define CEC_OAR_OA_3 ((uint16_t)0x0008) /*!< Bit 3 */ - -/******************** Bit definition for CEC_PRES register ******************/ -#define CEC_PRES_PRES ((uint16_t)0x3FFF) /*!< Prescaler Counter Value */ - -/******************** Bit definition for CEC_ESR register ******************/ -#define CEC_ESR_BTE ((uint16_t)0x0001) /*!< Bit Timing Error */ -#define CEC_ESR_BPE ((uint16_t)0x0002) /*!< Bit Period Error */ -#define CEC_ESR_RBTFE ((uint16_t)0x0004) /*!< Rx Block Transfer Finished Error */ -#define CEC_ESR_SBE ((uint16_t)0x0008) /*!< Start Bit Error */ -#define CEC_ESR_ACKE ((uint16_t)0x0010) /*!< Block Acknowledge Error */ -#define CEC_ESR_LINE ((uint16_t)0x0020) /*!< Line Error */ -#define CEC_ESR_TBTFE ((uint16_t)0x0040) /*!< Tx Block Transfer Finished Error */ - -/******************** Bit definition for CEC_CSR register ******************/ -#define CEC_CSR_TSOM ((uint16_t)0x0001) /*!< Tx Start Of Message */ -#define CEC_CSR_TEOM ((uint16_t)0x0002) /*!< Tx End Of Message */ -#define CEC_CSR_TERR ((uint16_t)0x0004) /*!< Tx Error */ -#define CEC_CSR_TBTRF ((uint16_t)0x0008) /*!< Tx Byte Transfer Request or Block Transfer Finished */ -#define CEC_CSR_RSOM ((uint16_t)0x0010) /*!< Rx Start Of Message */ -#define CEC_CSR_REOM ((uint16_t)0x0020) /*!< Rx End Of Message */ -#define CEC_CSR_RERR ((uint16_t)0x0040) /*!< Rx Error */ -#define CEC_CSR_RBTF ((uint16_t)0x0080) /*!< Rx Block Transfer Finished */ - -/******************** Bit definition for CEC_TXD register ******************/ -#define CEC_TXD_TXD ((uint16_t)0x00FF) /*!< Tx Data register */ - -/******************** Bit definition for CEC_RXD register ******************/ -#define CEC_RXD_RXD ((uint16_t)0x00FF) /*!< Rx Data register */ - -/******************************************************************************/ -/* */ -/* TIM */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for TIM_CR1 register ********************/ -#define TIM_CR1_CEN ((uint16_t)0x0001) /*!< Counter enable */ -#define TIM_CR1_UDIS ((uint16_t)0x0002) /*!< Update disable */ -#define TIM_CR1_URS ((uint16_t)0x0004) /*!< Update request source */ -#define TIM_CR1_OPM ((uint16_t)0x0008) /*!< One pulse mode */ -#define TIM_CR1_DIR ((uint16_t)0x0010) /*!< Direction */ - -#define TIM_CR1_CMS ((uint16_t)0x0060) /*!< CMS[1:0] bits (Center-aligned mode selection) */ -#define TIM_CR1_CMS_0 ((uint16_t)0x0020) /*!< Bit 0 */ -#define TIM_CR1_CMS_1 ((uint16_t)0x0040) /*!< Bit 1 */ - -#define TIM_CR1_ARPE ((uint16_t)0x0080) /*!< Auto-reload preload enable */ - -#define TIM_CR1_CKD ((uint16_t)0x0300) /*!< CKD[1:0] bits (clock division) */ -#define TIM_CR1_CKD_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define TIM_CR1_CKD_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -/******************* Bit definition for TIM_CR2 register ********************/ -#define TIM_CR2_CCPC ((uint16_t)0x0001) /*!< Capture/Compare Preloaded Control */ -#define TIM_CR2_CCUS ((uint16_t)0x0004) /*!< Capture/Compare Control Update Selection */ -#define TIM_CR2_CCDS ((uint16_t)0x0008) /*!< Capture/Compare DMA Selection */ - -#define TIM_CR2_MMS ((uint16_t)0x0070) /*!< MMS[2:0] bits (Master Mode Selection) */ -#define TIM_CR2_MMS_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define TIM_CR2_MMS_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define TIM_CR2_MMS_2 ((uint16_t)0x0040) /*!< Bit 2 */ - -#define TIM_CR2_TI1S ((uint16_t)0x0080) /*!< TI1 Selection */ -#define TIM_CR2_OIS1 ((uint16_t)0x0100) /*!< Output Idle state 1 (OC1 output) */ -#define TIM_CR2_OIS1N ((uint16_t)0x0200) /*!< Output Idle state 1 (OC1N output) */ -#define TIM_CR2_OIS2 ((uint16_t)0x0400) /*!< Output Idle state 2 (OC2 output) */ -#define TIM_CR2_OIS2N ((uint16_t)0x0800) /*!< Output Idle state 2 (OC2N output) */ -#define TIM_CR2_OIS3 ((uint16_t)0x1000) /*!< Output Idle state 3 (OC3 output) */ -#define TIM_CR2_OIS3N ((uint16_t)0x2000) /*!< Output Idle state 3 (OC3N output) */ -#define TIM_CR2_OIS4 ((uint16_t)0x4000) /*!< Output Idle state 4 (OC4 output) */ - -/******************* Bit definition for TIM_SMCR register *******************/ -#define TIM_SMCR_SMS ((uint16_t)0x0007) /*!< SMS[2:0] bits (Slave mode selection) */ -#define TIM_SMCR_SMS_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define TIM_SMCR_SMS_1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define TIM_SMCR_SMS_2 ((uint16_t)0x0004) /*!< Bit 2 */ - -#define TIM_SMCR_TS ((uint16_t)0x0070) /*!< TS[2:0] bits (Trigger selection) */ -#define TIM_SMCR_TS_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define TIM_SMCR_TS_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define TIM_SMCR_TS_2 ((uint16_t)0x0040) /*!< Bit 2 */ - -#define TIM_SMCR_MSM ((uint16_t)0x0080) /*!< Master/slave mode */ - -#define TIM_SMCR_ETF ((uint16_t)0x0F00) /*!< ETF[3:0] bits (External trigger filter) */ -#define TIM_SMCR_ETF_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define TIM_SMCR_ETF_1 ((uint16_t)0x0200) /*!< Bit 1 */ -#define TIM_SMCR_ETF_2 ((uint16_t)0x0400) /*!< Bit 2 */ -#define TIM_SMCR_ETF_3 ((uint16_t)0x0800) /*!< Bit 3 */ - -#define TIM_SMCR_ETPS ((uint16_t)0x3000) /*!< ETPS[1:0] bits (External trigger prescaler) */ -#define TIM_SMCR_ETPS_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define TIM_SMCR_ETPS_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define TIM_SMCR_ECE ((uint16_t)0x4000) /*!< External clock enable */ -#define TIM_SMCR_ETP ((uint16_t)0x8000) /*!< External trigger polarity */ - -/******************* Bit definition for TIM_DIER register *******************/ -#define TIM_DIER_UIE ((uint16_t)0x0001) /*!< Update interrupt enable */ -#define TIM_DIER_CC1IE ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt enable */ -#define TIM_DIER_CC2IE ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt enable */ -#define TIM_DIER_CC3IE ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt enable */ -#define TIM_DIER_CC4IE ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt enable */ -#define TIM_DIER_COMIE ((uint16_t)0x0020) /*!< COM interrupt enable */ -#define TIM_DIER_TIE ((uint16_t)0x0040) /*!< Trigger interrupt enable */ -#define TIM_DIER_BIE ((uint16_t)0x0080) /*!< Break interrupt enable */ -#define TIM_DIER_UDE ((uint16_t)0x0100) /*!< Update DMA request enable */ -#define TIM_DIER_CC1DE ((uint16_t)0x0200) /*!< Capture/Compare 1 DMA request enable */ -#define TIM_DIER_CC2DE ((uint16_t)0x0400) /*!< Capture/Compare 2 DMA request enable */ -#define TIM_DIER_CC3DE ((uint16_t)0x0800) /*!< Capture/Compare 3 DMA request enable */ -#define TIM_DIER_CC4DE ((uint16_t)0x1000) /*!< Capture/Compare 4 DMA request enable */ -#define TIM_DIER_COMDE ((uint16_t)0x2000) /*!< COM DMA request enable */ -#define TIM_DIER_TDE ((uint16_t)0x4000) /*!< Trigger DMA request enable */ - -/******************** Bit definition for TIM_SR register ********************/ -#define TIM_SR_UIF ((uint16_t)0x0001) /*!< Update interrupt Flag */ -#define TIM_SR_CC1IF ((uint16_t)0x0002) /*!< Capture/Compare 1 interrupt Flag */ -#define TIM_SR_CC2IF ((uint16_t)0x0004) /*!< Capture/Compare 2 interrupt Flag */ -#define TIM_SR_CC3IF ((uint16_t)0x0008) /*!< Capture/Compare 3 interrupt Flag */ -#define TIM_SR_CC4IF ((uint16_t)0x0010) /*!< Capture/Compare 4 interrupt Flag */ -#define TIM_SR_COMIF ((uint16_t)0x0020) /*!< COM interrupt Flag */ -#define TIM_SR_TIF ((uint16_t)0x0040) /*!< Trigger interrupt Flag */ -#define TIM_SR_BIF ((uint16_t)0x0080) /*!< Break interrupt Flag */ -#define TIM_SR_CC1OF ((uint16_t)0x0200) /*!< Capture/Compare 1 Overcapture Flag */ -#define TIM_SR_CC2OF ((uint16_t)0x0400) /*!< Capture/Compare 2 Overcapture Flag */ -#define TIM_SR_CC3OF ((uint16_t)0x0800) /*!< Capture/Compare 3 Overcapture Flag */ -#define TIM_SR_CC4OF ((uint16_t)0x1000) /*!< Capture/Compare 4 Overcapture Flag */ - -/******************* Bit definition for TIM_EGR register ********************/ -#define TIM_EGR_UG ((uint8_t)0x01) /*!< Update Generation */ -#define TIM_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation */ -#define TIM_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation */ -#define TIM_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation */ -#define TIM_EGR_CC4G ((uint8_t)0x10) /*!< Capture/Compare 4 Generation */ -#define TIM_EGR_COMG ((uint8_t)0x20) /*!< Capture/Compare Control Update Generation */ -#define TIM_EGR_TG ((uint8_t)0x40) /*!< Trigger Generation */ -#define TIM_EGR_BG ((uint8_t)0x80) /*!< Break Generation */ - -/****************** Bit definition for TIM_CCMR1 register *******************/ -#define TIM_CCMR1_CC1S ((uint16_t)0x0003) /*!< CC1S[1:0] bits (Capture/Compare 1 Selection) */ -#define TIM_CCMR1_CC1S_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define TIM_CCMR1_CC1S_1 ((uint16_t)0x0002) /*!< Bit 1 */ - -#define TIM_CCMR1_OC1FE ((uint16_t)0x0004) /*!< Output Compare 1 Fast enable */ -#define TIM_CCMR1_OC1PE ((uint16_t)0x0008) /*!< Output Compare 1 Preload enable */ - -#define TIM_CCMR1_OC1M ((uint16_t)0x0070) /*!< OC1M[2:0] bits (Output Compare 1 Mode) */ -#define TIM_CCMR1_OC1M_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define TIM_CCMR1_OC1M_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define TIM_CCMR1_OC1M_2 ((uint16_t)0x0040) /*!< Bit 2 */ - -#define TIM_CCMR1_OC1CE ((uint16_t)0x0080) /*!< Output Compare 1Clear Enable */ - -#define TIM_CCMR1_CC2S ((uint16_t)0x0300) /*!< CC2S[1:0] bits (Capture/Compare 2 Selection) */ -#define TIM_CCMR1_CC2S_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define TIM_CCMR1_CC2S_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define TIM_CCMR1_OC2FE ((uint16_t)0x0400) /*!< Output Compare 2 Fast enable */ -#define TIM_CCMR1_OC2PE ((uint16_t)0x0800) /*!< Output Compare 2 Preload enable */ - -#define TIM_CCMR1_OC2M ((uint16_t)0x7000) /*!< OC2M[2:0] bits (Output Compare 2 Mode) */ -#define TIM_CCMR1_OC2M_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define TIM_CCMR1_OC2M_1 ((uint16_t)0x2000) /*!< Bit 1 */ -#define TIM_CCMR1_OC2M_2 ((uint16_t)0x4000) /*!< Bit 2 */ - -#define TIM_CCMR1_OC2CE ((uint16_t)0x8000) /*!< Output Compare 2 Clear Enable */ - -/*----------------------------------------------------------------------------*/ - -#define TIM_CCMR1_IC1PSC ((uint16_t)0x000C) /*!< IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ -#define TIM_CCMR1_IC1PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ -#define TIM_CCMR1_IC1PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ - -#define TIM_CCMR1_IC1F ((uint16_t)0x00F0) /*!< IC1F[3:0] bits (Input Capture 1 Filter) */ -#define TIM_CCMR1_IC1F_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define TIM_CCMR1_IC1F_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define TIM_CCMR1_IC1F_2 ((uint16_t)0x0040) /*!< Bit 2 */ -#define TIM_CCMR1_IC1F_3 ((uint16_t)0x0080) /*!< Bit 3 */ - -#define TIM_CCMR1_IC2PSC ((uint16_t)0x0C00) /*!< IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ -#define TIM_CCMR1_IC2PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define TIM_CCMR1_IC2PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define TIM_CCMR1_IC2F ((uint16_t)0xF000) /*!< IC2F[3:0] bits (Input Capture 2 Filter) */ -#define TIM_CCMR1_IC2F_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define TIM_CCMR1_IC2F_1 ((uint16_t)0x2000) /*!< Bit 1 */ -#define TIM_CCMR1_IC2F_2 ((uint16_t)0x4000) /*!< Bit 2 */ -#define TIM_CCMR1_IC2F_3 ((uint16_t)0x8000) /*!< Bit 3 */ - -/****************** Bit definition for TIM_CCMR2 register *******************/ -#define TIM_CCMR2_CC3S ((uint16_t)0x0003) /*!< CC3S[1:0] bits (Capture/Compare 3 Selection) */ -#define TIM_CCMR2_CC3S_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define TIM_CCMR2_CC3S_1 ((uint16_t)0x0002) /*!< Bit 1 */ - -#define TIM_CCMR2_OC3FE ((uint16_t)0x0004) /*!< Output Compare 3 Fast enable */ -#define TIM_CCMR2_OC3PE ((uint16_t)0x0008) /*!< Output Compare 3 Preload enable */ - -#define TIM_CCMR2_OC3M ((uint16_t)0x0070) /*!< OC3M[2:0] bits (Output Compare 3 Mode) */ -#define TIM_CCMR2_OC3M_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define TIM_CCMR2_OC3M_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define TIM_CCMR2_OC3M_2 ((uint16_t)0x0040) /*!< Bit 2 */ - -#define TIM_CCMR2_OC3CE ((uint16_t)0x0080) /*!< Output Compare 3 Clear Enable */ - -#define TIM_CCMR2_CC4S ((uint16_t)0x0300) /*!< CC4S[1:0] bits (Capture/Compare 4 Selection) */ -#define TIM_CCMR2_CC4S_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define TIM_CCMR2_CC4S_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define TIM_CCMR2_OC4FE ((uint16_t)0x0400) /*!< Output Compare 4 Fast enable */ -#define TIM_CCMR2_OC4PE ((uint16_t)0x0800) /*!< Output Compare 4 Preload enable */ - -#define TIM_CCMR2_OC4M ((uint16_t)0x7000) /*!< OC4M[2:0] bits (Output Compare 4 Mode) */ -#define TIM_CCMR2_OC4M_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define TIM_CCMR2_OC4M_1 ((uint16_t)0x2000) /*!< Bit 1 */ -#define TIM_CCMR2_OC4M_2 ((uint16_t)0x4000) /*!< Bit 2 */ - -#define TIM_CCMR2_OC4CE ((uint16_t)0x8000) /*!< Output Compare 4 Clear Enable */ - -/*----------------------------------------------------------------------------*/ - -#define TIM_CCMR2_IC3PSC ((uint16_t)0x000C) /*!< IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ -#define TIM_CCMR2_IC3PSC_0 ((uint16_t)0x0004) /*!< Bit 0 */ -#define TIM_CCMR2_IC3PSC_1 ((uint16_t)0x0008) /*!< Bit 1 */ - -#define TIM_CCMR2_IC3F ((uint16_t)0x00F0) /*!< IC3F[3:0] bits (Input Capture 3 Filter) */ -#define TIM_CCMR2_IC3F_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define TIM_CCMR2_IC3F_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define TIM_CCMR2_IC3F_2 ((uint16_t)0x0040) /*!< Bit 2 */ -#define TIM_CCMR2_IC3F_3 ((uint16_t)0x0080) /*!< Bit 3 */ - -#define TIM_CCMR2_IC4PSC ((uint16_t)0x0C00) /*!< IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ -#define TIM_CCMR2_IC4PSC_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define TIM_CCMR2_IC4PSC_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define TIM_CCMR2_IC4F ((uint16_t)0xF000) /*!< IC4F[3:0] bits (Input Capture 4 Filter) */ -#define TIM_CCMR2_IC4F_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define TIM_CCMR2_IC4F_1 ((uint16_t)0x2000) /*!< Bit 1 */ -#define TIM_CCMR2_IC4F_2 ((uint16_t)0x4000) /*!< Bit 2 */ -#define TIM_CCMR2_IC4F_3 ((uint16_t)0x8000) /*!< Bit 3 */ - -/******************* Bit definition for TIM_CCER register *******************/ -#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!< Capture/Compare 1 output enable */ -#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!< Capture/Compare 1 output Polarity */ -#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!< Capture/Compare 1 Complementary output enable */ -#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!< Capture/Compare 1 Complementary output Polarity */ -#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!< Capture/Compare 2 output enable */ -#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!< Capture/Compare 2 output Polarity */ -#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!< Capture/Compare 2 Complementary output enable */ -#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!< Capture/Compare 2 Complementary output Polarity */ -#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!< Capture/Compare 3 output enable */ -#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!< Capture/Compare 3 output Polarity */ -#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!< Capture/Compare 3 Complementary output enable */ -#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!< Capture/Compare 3 Complementary output Polarity */ -#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!< Capture/Compare 4 output enable */ -#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!< Capture/Compare 4 output Polarity */ -#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!< Capture/Compare 4 Complementary output Polarity */ - -/******************* Bit definition for TIM_CNT register ********************/ -#define TIM_CNT_CNT ((uint16_t)0xFFFF) /*!< Counter Value */ - -/******************* Bit definition for TIM_PSC register ********************/ -#define TIM_PSC_PSC ((uint16_t)0xFFFF) /*!< Prescaler Value */ - -/******************* Bit definition for TIM_ARR register ********************/ -#define TIM_ARR_ARR ((uint16_t)0xFFFF) /*!< actual auto-reload Value */ - -/******************* Bit definition for TIM_RCR register ********************/ -#define TIM_RCR_REP ((uint8_t)0xFF) /*!< Repetition Counter Value */ - -/******************* Bit definition for TIM_CCR1 register *******************/ -#define TIM_CCR1_CCR1 ((uint16_t)0xFFFF) /*!< Capture/Compare 1 Value */ - -/******************* Bit definition for TIM_CCR2 register *******************/ -#define TIM_CCR2_CCR2 ((uint16_t)0xFFFF) /*!< Capture/Compare 2 Value */ - -/******************* Bit definition for TIM_CCR3 register *******************/ -#define TIM_CCR3_CCR3 ((uint16_t)0xFFFF) /*!< Capture/Compare 3 Value */ - -/******************* Bit definition for TIM_CCR4 register *******************/ -#define TIM_CCR4_CCR4 ((uint16_t)0xFFFF) /*!< Capture/Compare 4 Value */ - -/******************* Bit definition for TIM_BDTR register *******************/ -#define TIM_BDTR_DTG ((uint16_t)0x00FF) /*!< DTG[0:7] bits (Dead-Time Generator set-up) */ -#define TIM_BDTR_DTG_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define TIM_BDTR_DTG_1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define TIM_BDTR_DTG_2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define TIM_BDTR_DTG_3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define TIM_BDTR_DTG_4 ((uint16_t)0x0010) /*!< Bit 4 */ -#define TIM_BDTR_DTG_5 ((uint16_t)0x0020) /*!< Bit 5 */ -#define TIM_BDTR_DTG_6 ((uint16_t)0x0040) /*!< Bit 6 */ -#define TIM_BDTR_DTG_7 ((uint16_t)0x0080) /*!< Bit 7 */ - -#define TIM_BDTR_LOCK ((uint16_t)0x0300) /*!< LOCK[1:0] bits (Lock Configuration) */ -#define TIM_BDTR_LOCK_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define TIM_BDTR_LOCK_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define TIM_BDTR_OSSI ((uint16_t)0x0400) /*!< Off-State Selection for Idle mode */ -#define TIM_BDTR_OSSR ((uint16_t)0x0800) /*!< Off-State Selection for Run mode */ -#define TIM_BDTR_BKE ((uint16_t)0x1000) /*!< Break enable */ -#define TIM_BDTR_BKP ((uint16_t)0x2000) /*!< Break Polarity */ -#define TIM_BDTR_AOE ((uint16_t)0x4000) /*!< Automatic Output enable */ -#define TIM_BDTR_MOE ((uint16_t)0x8000) /*!< Main Output enable */ - -/******************* Bit definition for TIM_DCR register ********************/ -#define TIM_DCR_DBA ((uint16_t)0x001F) /*!< DBA[4:0] bits (DMA Base Address) */ -#define TIM_DCR_DBA_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define TIM_DCR_DBA_1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define TIM_DCR_DBA_2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define TIM_DCR_DBA_3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define TIM_DCR_DBA_4 ((uint16_t)0x0010) /*!< Bit 4 */ - -#define TIM_DCR_DBL ((uint16_t)0x1F00) /*!< DBL[4:0] bits (DMA Burst Length) */ -#define TIM_DCR_DBL_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define TIM_DCR_DBL_1 ((uint16_t)0x0200) /*!< Bit 1 */ -#define TIM_DCR_DBL_2 ((uint16_t)0x0400) /*!< Bit 2 */ -#define TIM_DCR_DBL_3 ((uint16_t)0x0800) /*!< Bit 3 */ -#define TIM_DCR_DBL_4 ((uint16_t)0x1000) /*!< Bit 4 */ - -/******************* Bit definition for TIM_DMAR register *******************/ -#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /*!< DMA register for burst accesses */ - -/******************************************************************************/ -/* */ -/* Real-Time Clock */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for RTC_CRH register ********************/ -#define RTC_CRH_SECIE ((uint8_t)0x01) /*!< Second Interrupt Enable */ -#define RTC_CRH_ALRIE ((uint8_t)0x02) /*!< Alarm Interrupt Enable */ -#define RTC_CRH_OWIE ((uint8_t)0x04) /*!< OverfloW Interrupt Enable */ - -/******************* Bit definition for RTC_CRL register ********************/ -#define RTC_CRL_SECF ((uint8_t)0x01) /*!< Second Flag */ -#define RTC_CRL_ALRF ((uint8_t)0x02) /*!< Alarm Flag */ -#define RTC_CRL_OWF ((uint8_t)0x04) /*!< OverfloW Flag */ -#define RTC_CRL_RSF ((uint8_t)0x08) /*!< Registers Synchronized Flag */ -#define RTC_CRL_CNF ((uint8_t)0x10) /*!< Configuration Flag */ -#define RTC_CRL_RTOFF ((uint8_t)0x20) /*!< RTC operation OFF */ - -/******************* Bit definition for RTC_PRLH register *******************/ -#define RTC_PRLH_PRL ((uint16_t)0x000F) /*!< RTC Prescaler Reload Value High */ - -/******************* Bit definition for RTC_PRLL register *******************/ -#define RTC_PRLL_PRL ((uint16_t)0xFFFF) /*!< RTC Prescaler Reload Value Low */ - -/******************* Bit definition for RTC_DIVH register *******************/ -#define RTC_DIVH_RTC_DIV ((uint16_t)0x000F) /*!< RTC Clock Divider High */ - -/******************* Bit definition for RTC_DIVL register *******************/ -#define RTC_DIVL_RTC_DIV ((uint16_t)0xFFFF) /*!< RTC Clock Divider Low */ - -/******************* Bit definition for RTC_CNTH register *******************/ -#define RTC_CNTH_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter High */ - -/******************* Bit definition for RTC_CNTL register *******************/ -#define RTC_CNTL_RTC_CNT ((uint16_t)0xFFFF) /*!< RTC Counter Low */ - -/******************* Bit definition for RTC_ALRH register *******************/ -#define RTC_ALRH_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm High */ - -/******************* Bit definition for RTC_ALRL register *******************/ -#define RTC_ALRL_RTC_ALR ((uint16_t)0xFFFF) /*!< RTC Alarm Low */ - -/******************************************************************************/ -/* */ -/* Independent WATCHDOG */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for IWDG_KR register ********************/ -#define IWDG_KR_KEY ((uint16_t)0xFFFF) /*!< Key value (write only, read 0000h) */ - -/******************* Bit definition for IWDG_PR register ********************/ -#define IWDG_PR_PR ((uint8_t)0x07) /*!< PR[2:0] (Prescaler divider) */ -#define IWDG_PR_PR_0 ((uint8_t)0x01) /*!< Bit 0 */ -#define IWDG_PR_PR_1 ((uint8_t)0x02) /*!< Bit 1 */ -#define IWDG_PR_PR_2 ((uint8_t)0x04) /*!< Bit 2 */ - -/******************* Bit definition for IWDG_RLR register *******************/ -#define IWDG_RLR_RL ((uint16_t)0x0FFF) /*!< Watchdog counter reload value */ - -/******************* Bit definition for IWDG_SR register ********************/ -#define IWDG_SR_PVU ((uint8_t)0x01) /*!< Watchdog prescaler value update */ -#define IWDG_SR_RVU ((uint8_t)0x02) /*!< Watchdog counter reload value update */ - -/******************************************************************************/ -/* */ -/* Window WATCHDOG */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for WWDG_CR register ********************/ -#define WWDG_CR_T ((uint8_t)0x7F) /*!< T[6:0] bits (7-Bit counter (MSB to LSB)) */ -#define WWDG_CR_T0 ((uint8_t)0x01) /*!< Bit 0 */ -#define WWDG_CR_T1 ((uint8_t)0x02) /*!< Bit 1 */ -#define WWDG_CR_T2 ((uint8_t)0x04) /*!< Bit 2 */ -#define WWDG_CR_T3 ((uint8_t)0x08) /*!< Bit 3 */ -#define WWDG_CR_T4 ((uint8_t)0x10) /*!< Bit 4 */ -#define WWDG_CR_T5 ((uint8_t)0x20) /*!< Bit 5 */ -#define WWDG_CR_T6 ((uint8_t)0x40) /*!< Bit 6 */ - -#define WWDG_CR_WDGA ((uint8_t)0x80) /*!< Activation bit */ - -/******************* Bit definition for WWDG_CFR register *******************/ -#define WWDG_CFR_W ((uint16_t)0x007F) /*!< W[6:0] bits (7-bit window value) */ -#define WWDG_CFR_W0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define WWDG_CFR_W1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define WWDG_CFR_W2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define WWDG_CFR_W3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define WWDG_CFR_W4 ((uint16_t)0x0010) /*!< Bit 4 */ -#define WWDG_CFR_W5 ((uint16_t)0x0020) /*!< Bit 5 */ -#define WWDG_CFR_W6 ((uint16_t)0x0040) /*!< Bit 6 */ - -#define WWDG_CFR_WDGTB ((uint16_t)0x0180) /*!< WDGTB[1:0] bits (Timer Base) */ -#define WWDG_CFR_WDGTB0 ((uint16_t)0x0080) /*!< Bit 0 */ -#define WWDG_CFR_WDGTB1 ((uint16_t)0x0100) /*!< Bit 1 */ - -#define WWDG_CFR_EWI ((uint16_t)0x0200) /*!< Early Wakeup Interrupt */ - -/******************* Bit definition for WWDG_SR register ********************/ -#define WWDG_SR_EWIF ((uint8_t)0x01) /*!< Early Wakeup Interrupt Flag */ - -/******************************************************************************/ -/* */ -/* Flexible Static Memory Controller */ -/* */ -/******************************************************************************/ - -/****************** Bit definition for FSMC_BCR1 register *******************/ -#define FSMC_BCR1_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ -#define FSMC_BCR1_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ - -#define FSMC_BCR1_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ -#define FSMC_BCR1_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define FSMC_BCR1_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define FSMC_BCR1_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ -#define FSMC_BCR1_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BCR1_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_BCR1_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ -#define FSMC_BCR1_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ -#define FSMC_BCR1_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ -#define FSMC_BCR1_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ -#define FSMC_BCR1_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ -#define FSMC_BCR1_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ -#define FSMC_BCR1_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ -#define FSMC_BCR1_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ -#define FSMC_BCR1_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ -#define FSMC_BCR1_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ - -/****************** Bit definition for FSMC_BCR2 register *******************/ -#define FSMC_BCR2_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ -#define FSMC_BCR2_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ - -#define FSMC_BCR2_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ -#define FSMC_BCR2_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define FSMC_BCR2_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define FSMC_BCR2_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ -#define FSMC_BCR2_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BCR2_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_BCR2_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ -#define FSMC_BCR2_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ -#define FSMC_BCR2_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ -#define FSMC_BCR2_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ -#define FSMC_BCR2_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ -#define FSMC_BCR2_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ -#define FSMC_BCR2_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ -#define FSMC_BCR2_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ -#define FSMC_BCR2_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ -#define FSMC_BCR2_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ - -/****************** Bit definition for FSMC_BCR3 register *******************/ -#define FSMC_BCR3_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ -#define FSMC_BCR3_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ - -#define FSMC_BCR3_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ -#define FSMC_BCR3_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define FSMC_BCR3_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define FSMC_BCR3_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ -#define FSMC_BCR3_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BCR3_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_BCR3_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ -#define FSMC_BCR3_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ -#define FSMC_BCR3_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit. */ -#define FSMC_BCR3_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ -#define FSMC_BCR3_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ -#define FSMC_BCR3_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ -#define FSMC_BCR3_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ -#define FSMC_BCR3_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ -#define FSMC_BCR3_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ -#define FSMC_BCR3_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ - -/****************** Bit definition for FSMC_BCR4 register *******************/ -#define FSMC_BCR4_MBKEN ((uint32_t)0x00000001) /*!< Memory bank enable bit */ -#define FSMC_BCR4_MUXEN ((uint32_t)0x00000002) /*!< Address/data multiplexing enable bit */ - -#define FSMC_BCR4_MTYP ((uint32_t)0x0000000C) /*!< MTYP[1:0] bits (Memory type) */ -#define FSMC_BCR4_MTYP_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define FSMC_BCR4_MTYP_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define FSMC_BCR4_MWID ((uint32_t)0x00000030) /*!< MWID[1:0] bits (Memory data bus width) */ -#define FSMC_BCR4_MWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BCR4_MWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_BCR4_FACCEN ((uint32_t)0x00000040) /*!< Flash access enable */ -#define FSMC_BCR4_BURSTEN ((uint32_t)0x00000100) /*!< Burst enable bit */ -#define FSMC_BCR4_WAITPOL ((uint32_t)0x00000200) /*!< Wait signal polarity bit */ -#define FSMC_BCR4_WRAPMOD ((uint32_t)0x00000400) /*!< Wrapped burst mode support */ -#define FSMC_BCR4_WAITCFG ((uint32_t)0x00000800) /*!< Wait timing configuration */ -#define FSMC_BCR4_WREN ((uint32_t)0x00001000) /*!< Write enable bit */ -#define FSMC_BCR4_WAITEN ((uint32_t)0x00002000) /*!< Wait enable bit */ -#define FSMC_BCR4_EXTMOD ((uint32_t)0x00004000) /*!< Extended mode enable */ -#define FSMC_BCR4_ASYNCWAIT ((uint32_t)0x00008000) /*!< Asynchronous wait */ -#define FSMC_BCR4_CBURSTRW ((uint32_t)0x00080000) /*!< Write burst enable */ - -/****************** Bit definition for FSMC_BTR1 register ******************/ -#define FSMC_BTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BTR1_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ -#define FSMC_BTR1_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_BTR1_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_BTR1_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_BTR1_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ - -#define FSMC_BTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_BTR2 register *******************/ -#define FSMC_BTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BTR2_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ -#define FSMC_BTR2_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_BTR2_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_BTR2_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_BTR2_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ - -#define FSMC_BTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/******************* Bit definition for FSMC_BTR3 register *******************/ -#define FSMC_BTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BTR3_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ -#define FSMC_BTR3_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_BTR3_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_BTR3_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_BTR3_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ - -#define FSMC_BTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_BTR4 register *******************/ -#define FSMC_BTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BTR4_BUSTURN ((uint32_t)0x000F0000) /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */ -#define FSMC_BTR4_BUSTURN_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_BTR4_BUSTURN_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_BTR4_BUSTURN_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_BTR4_BUSTURN_3 ((uint32_t)0x00080000) /*!< Bit 3 */ - -#define FSMC_BTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_BWTR1 register ******************/ -#define FSMC_BWTR1_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BWTR1_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BWTR1_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BWTR1_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BWTR1_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BWTR1_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BWTR1_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BWTR1_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BWTR1_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BWTR1_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BWTR1_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BWTR1_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BWTR1_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BWTR1_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BWTR1_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BWTR1_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BWTR1_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BWTR1_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BWTR1_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BWTR1_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BWTR1_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BWTR1_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BWTR1_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BWTR1_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BWTR1_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BWTR1_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BWTR1_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BWTR1_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_BWTR2 register ******************/ -#define FSMC_BWTR2_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BWTR2_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BWTR2_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BWTR2_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BWTR2_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BWTR2_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BWTR2_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BWTR2_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BWTR2_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BWTR2_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BWTR2_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BWTR2_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BWTR2_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BWTR2_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BWTR2_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BWTR2_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BWTR2_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BWTR2_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1*/ -#define FSMC_BWTR2_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BWTR2_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BWTR2_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BWTR2_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BWTR2_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BWTR2_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BWTR2_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BWTR2_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BWTR2_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BWTR2_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_BWTR3 register ******************/ -#define FSMC_BWTR3_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BWTR3_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BWTR3_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BWTR3_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BWTR3_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BWTR3_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BWTR3_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BWTR3_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BWTR3_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BWTR3_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BWTR3_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BWTR3_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BWTR3_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BWTR3_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BWTR3_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BWTR3_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BWTR3_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BWTR3_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BWTR3_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BWTR3_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BWTR3_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BWTR3_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BWTR3_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BWTR3_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BWTR3_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BWTR3_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BWTR3_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BWTR3_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_BWTR4 register ******************/ -#define FSMC_BWTR4_ADDSET ((uint32_t)0x0000000F) /*!< ADDSET[3:0] bits (Address setup phase duration) */ -#define FSMC_BWTR4_ADDSET_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_BWTR4_ADDSET_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_BWTR4_ADDSET_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_BWTR4_ADDSET_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - -#define FSMC_BWTR4_ADDHLD ((uint32_t)0x000000F0) /*!< ADDHLD[3:0] bits (Address-hold phase duration) */ -#define FSMC_BWTR4_ADDHLD_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_BWTR4_ADDHLD_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define FSMC_BWTR4_ADDHLD_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define FSMC_BWTR4_ADDHLD_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define FSMC_BWTR4_DATAST ((uint32_t)0x0000FF00) /*!< DATAST [3:0] bits (Data-phase duration) */ -#define FSMC_BWTR4_DATAST_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_BWTR4_DATAST_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_BWTR4_DATAST_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_BWTR4_DATAST_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - -#define FSMC_BWTR4_CLKDIV ((uint32_t)0x00F00000) /*!< CLKDIV[3:0] bits (Clock divide ratio) */ -#define FSMC_BWTR4_CLKDIV_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define FSMC_BWTR4_CLKDIV_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define FSMC_BWTR4_CLKDIV_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define FSMC_BWTR4_CLKDIV_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -#define FSMC_BWTR4_DATLAT ((uint32_t)0x0F000000) /*!< DATLA[3:0] bits (Data latency) */ -#define FSMC_BWTR4_DATLAT_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_BWTR4_DATLAT_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_BWTR4_DATLAT_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_BWTR4_DATLAT_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define FSMC_BWTR4_ACCMOD ((uint32_t)0x30000000) /*!< ACCMOD[1:0] bits (Access mode) */ -#define FSMC_BWTR4_ACCMOD_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define FSMC_BWTR4_ACCMOD_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -/****************** Bit definition for FSMC_PCR2 register *******************/ -#define FSMC_PCR2_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ -#define FSMC_PCR2_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ -#define FSMC_PCR2_PTYP ((uint32_t)0x00000008) /*!< Memory type */ - -#define FSMC_PCR2_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ -#define FSMC_PCR2_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_PCR2_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_PCR2_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ - -#define FSMC_PCR2_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ -#define FSMC_PCR2_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define FSMC_PCR2_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define FSMC_PCR2_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ -#define FSMC_PCR2_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ - -#define FSMC_PCR2_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ -#define FSMC_PCR2_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define FSMC_PCR2_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ -#define FSMC_PCR2_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ -#define FSMC_PCR2_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ - -#define FSMC_PCR2_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[1:0] bits (ECC page size) */ -#define FSMC_PCR2_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ -#define FSMC_PCR2_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ -#define FSMC_PCR2_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ - -/****************** Bit definition for FSMC_PCR3 register *******************/ -#define FSMC_PCR3_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ -#define FSMC_PCR3_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ -#define FSMC_PCR3_PTYP ((uint32_t)0x00000008) /*!< Memory type */ - -#define FSMC_PCR3_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ -#define FSMC_PCR3_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_PCR3_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_PCR3_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ - -#define FSMC_PCR3_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ -#define FSMC_PCR3_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define FSMC_PCR3_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define FSMC_PCR3_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ -#define FSMC_PCR3_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ - -#define FSMC_PCR3_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ -#define FSMC_PCR3_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define FSMC_PCR3_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ -#define FSMC_PCR3_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ -#define FSMC_PCR3_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ - -#define FSMC_PCR3_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ -#define FSMC_PCR3_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ -#define FSMC_PCR3_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ -#define FSMC_PCR3_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ - -/****************** Bit definition for FSMC_PCR4 register *******************/ -#define FSMC_PCR4_PWAITEN ((uint32_t)0x00000002) /*!< Wait feature enable bit */ -#define FSMC_PCR4_PBKEN ((uint32_t)0x00000004) /*!< PC Card/NAND Flash memory bank enable bit */ -#define FSMC_PCR4_PTYP ((uint32_t)0x00000008) /*!< Memory type */ - -#define FSMC_PCR4_PWID ((uint32_t)0x00000030) /*!< PWID[1:0] bits (NAND Flash databus width) */ -#define FSMC_PCR4_PWID_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define FSMC_PCR4_PWID_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define FSMC_PCR4_ECCEN ((uint32_t)0x00000040) /*!< ECC computation logic enable bit */ - -#define FSMC_PCR4_TCLR ((uint32_t)0x00001E00) /*!< TCLR[3:0] bits (CLE to RE delay) */ -#define FSMC_PCR4_TCLR_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define FSMC_PCR4_TCLR_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define FSMC_PCR4_TCLR_2 ((uint32_t)0x00000800) /*!< Bit 2 */ -#define FSMC_PCR4_TCLR_3 ((uint32_t)0x00001000) /*!< Bit 3 */ - -#define FSMC_PCR4_TAR ((uint32_t)0x0001E000) /*!< TAR[3:0] bits (ALE to RE delay) */ -#define FSMC_PCR4_TAR_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define FSMC_PCR4_TAR_1 ((uint32_t)0x00004000) /*!< Bit 1 */ -#define FSMC_PCR4_TAR_2 ((uint32_t)0x00008000) /*!< Bit 2 */ -#define FSMC_PCR4_TAR_3 ((uint32_t)0x00010000) /*!< Bit 3 */ - -#define FSMC_PCR4_ECCPS ((uint32_t)0x000E0000) /*!< ECCPS[2:0] bits (ECC page size) */ -#define FSMC_PCR4_ECCPS_0 ((uint32_t)0x00020000) /*!< Bit 0 */ -#define FSMC_PCR4_ECCPS_1 ((uint32_t)0x00040000) /*!< Bit 1 */ -#define FSMC_PCR4_ECCPS_2 ((uint32_t)0x00080000) /*!< Bit 2 */ - -/******************* Bit definition for FSMC_SR2 register *******************/ -#define FSMC_SR2_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ -#define FSMC_SR2_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ -#define FSMC_SR2_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ -#define FSMC_SR2_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ -#define FSMC_SR2_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ -#define FSMC_SR2_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ -#define FSMC_SR2_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ - -/******************* Bit definition for FSMC_SR3 register *******************/ -#define FSMC_SR3_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ -#define FSMC_SR3_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ -#define FSMC_SR3_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ -#define FSMC_SR3_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ -#define FSMC_SR3_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ -#define FSMC_SR3_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ -#define FSMC_SR3_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ - -/******************* Bit definition for FSMC_SR4 register *******************/ -#define FSMC_SR4_IRS ((uint8_t)0x01) /*!< Interrupt Rising Edge status */ -#define FSMC_SR4_ILS ((uint8_t)0x02) /*!< Interrupt Level status */ -#define FSMC_SR4_IFS ((uint8_t)0x04) /*!< Interrupt Falling Edge status */ -#define FSMC_SR4_IREN ((uint8_t)0x08) /*!< Interrupt Rising Edge detection Enable bit */ -#define FSMC_SR4_ILEN ((uint8_t)0x10) /*!< Interrupt Level detection Enable bit */ -#define FSMC_SR4_IFEN ((uint8_t)0x20) /*!< Interrupt Falling Edge detection Enable bit */ -#define FSMC_SR4_FEMPT ((uint8_t)0x40) /*!< FIFO empty */ - -/****************** Bit definition for FSMC_PMEM2 register ******************/ -#define FSMC_PMEM2_MEMSET2 ((uint32_t)0x000000FF) /*!< MEMSET2[7:0] bits (Common memory 2 setup time) */ -#define FSMC_PMEM2_MEMSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PMEM2_MEMSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PMEM2_MEMSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PMEM2_MEMSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PMEM2_MEMSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PMEM2_MEMSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PMEM2_MEMSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PMEM2_MEMSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PMEM2_MEMWAIT2 ((uint32_t)0x0000FF00) /*!< MEMWAIT2[7:0] bits (Common memory 2 wait time) */ -#define FSMC_PMEM2_MEMWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PMEM2_MEMWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PMEM2_MEMWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PMEM2_MEMWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PMEM2_MEMWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PMEM2_MEMWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PMEM2_MEMWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PMEM2_MEMWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PMEM2_MEMHOLD2 ((uint32_t)0x00FF0000) /*!< MEMHOLD2[7:0] bits (Common memory 2 hold time) */ -#define FSMC_PMEM2_MEMHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PMEM2_MEMHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PMEM2_MEMHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PMEM2_MEMHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PMEM2_MEMHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PMEM2_MEMHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PMEM2_MEMHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PMEM2_MEMHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PMEM2_MEMHIZ2 ((uint32_t)0xFF000000) /*!< MEMHIZ2[7:0] bits (Common memory 2 databus HiZ time) */ -#define FSMC_PMEM2_MEMHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PMEM2_MEMHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PMEM2_MEMHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PMEM2_MEMHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PMEM2_MEMHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PMEM2_MEMHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PMEM2_MEMHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PMEM2_MEMHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_PMEM3 register ******************/ -#define FSMC_PMEM3_MEMSET3 ((uint32_t)0x000000FF) /*!< MEMSET3[7:0] bits (Common memory 3 setup time) */ -#define FSMC_PMEM3_MEMSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PMEM3_MEMSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PMEM3_MEMSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PMEM3_MEMSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PMEM3_MEMSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PMEM3_MEMSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PMEM3_MEMSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PMEM3_MEMSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PMEM3_MEMWAIT3 ((uint32_t)0x0000FF00) /*!< MEMWAIT3[7:0] bits (Common memory 3 wait time) */ -#define FSMC_PMEM3_MEMWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PMEM3_MEMWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PMEM3_MEMWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PMEM3_MEMWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PMEM3_MEMWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PMEM3_MEMWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PMEM3_MEMWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PMEM3_MEMWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PMEM3_MEMHOLD3 ((uint32_t)0x00FF0000) /*!< MEMHOLD3[7:0] bits (Common memory 3 hold time) */ -#define FSMC_PMEM3_MEMHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PMEM3_MEMHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PMEM3_MEMHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PMEM3_MEMHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PMEM3_MEMHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PMEM3_MEMHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PMEM3_MEMHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PMEM3_MEMHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PMEM3_MEMHIZ3 ((uint32_t)0xFF000000) /*!< MEMHIZ3[7:0] bits (Common memory 3 databus HiZ time) */ -#define FSMC_PMEM3_MEMHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PMEM3_MEMHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PMEM3_MEMHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PMEM3_MEMHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PMEM3_MEMHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PMEM3_MEMHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PMEM3_MEMHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PMEM3_MEMHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_PMEM4 register ******************/ -#define FSMC_PMEM4_MEMSET4 ((uint32_t)0x000000FF) /*!< MEMSET4[7:0] bits (Common memory 4 setup time) */ -#define FSMC_PMEM4_MEMSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PMEM4_MEMSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PMEM4_MEMSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PMEM4_MEMSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PMEM4_MEMSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PMEM4_MEMSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PMEM4_MEMSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PMEM4_MEMSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PMEM4_MEMWAIT4 ((uint32_t)0x0000FF00) /*!< MEMWAIT4[7:0] bits (Common memory 4 wait time) */ -#define FSMC_PMEM4_MEMWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PMEM4_MEMWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PMEM4_MEMWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PMEM4_MEMWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PMEM4_MEMWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PMEM4_MEMWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PMEM4_MEMWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PMEM4_MEMWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PMEM4_MEMHOLD4 ((uint32_t)0x00FF0000) /*!< MEMHOLD4[7:0] bits (Common memory 4 hold time) */ -#define FSMC_PMEM4_MEMHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PMEM4_MEMHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PMEM4_MEMHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PMEM4_MEMHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PMEM4_MEMHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PMEM4_MEMHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PMEM4_MEMHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PMEM4_MEMHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PMEM4_MEMHIZ4 ((uint32_t)0xFF000000) /*!< MEMHIZ4[7:0] bits (Common memory 4 databus HiZ time) */ -#define FSMC_PMEM4_MEMHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PMEM4_MEMHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PMEM4_MEMHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PMEM4_MEMHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PMEM4_MEMHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PMEM4_MEMHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PMEM4_MEMHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PMEM4_MEMHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_PATT2 register ******************/ -#define FSMC_PATT2_ATTSET2 ((uint32_t)0x000000FF) /*!< ATTSET2[7:0] bits (Attribute memory 2 setup time) */ -#define FSMC_PATT2_ATTSET2_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PATT2_ATTSET2_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PATT2_ATTSET2_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PATT2_ATTSET2_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PATT2_ATTSET2_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PATT2_ATTSET2_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PATT2_ATTSET2_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PATT2_ATTSET2_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PATT2_ATTWAIT2 ((uint32_t)0x0000FF00) /*!< ATTWAIT2[7:0] bits (Attribute memory 2 wait time) */ -#define FSMC_PATT2_ATTWAIT2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PATT2_ATTWAIT2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PATT2_ATTWAIT2_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PATT2_ATTWAIT2_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PATT2_ATTWAIT2_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PATT2_ATTWAIT2_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PATT2_ATTWAIT2_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PATT2_ATTWAIT2_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PATT2_ATTHOLD2 ((uint32_t)0x00FF0000) /*!< ATTHOLD2[7:0] bits (Attribute memory 2 hold time) */ -#define FSMC_PATT2_ATTHOLD2_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PATT2_ATTHOLD2_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PATT2_ATTHOLD2_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PATT2_ATTHOLD2_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PATT2_ATTHOLD2_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PATT2_ATTHOLD2_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PATT2_ATTHOLD2_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PATT2_ATTHOLD2_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PATT2_ATTHIZ2 ((uint32_t)0xFF000000) /*!< ATTHIZ2[7:0] bits (Attribute memory 2 databus HiZ time) */ -#define FSMC_PATT2_ATTHIZ2_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PATT2_ATTHIZ2_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PATT2_ATTHIZ2_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PATT2_ATTHIZ2_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PATT2_ATTHIZ2_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PATT2_ATTHIZ2_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PATT2_ATTHIZ2_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PATT2_ATTHIZ2_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_PATT3 register ******************/ -#define FSMC_PATT3_ATTSET3 ((uint32_t)0x000000FF) /*!< ATTSET3[7:0] bits (Attribute memory 3 setup time) */ -#define FSMC_PATT3_ATTSET3_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PATT3_ATTSET3_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PATT3_ATTSET3_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PATT3_ATTSET3_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PATT3_ATTSET3_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PATT3_ATTSET3_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PATT3_ATTSET3_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PATT3_ATTSET3_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PATT3_ATTWAIT3 ((uint32_t)0x0000FF00) /*!< ATTWAIT3[7:0] bits (Attribute memory 3 wait time) */ -#define FSMC_PATT3_ATTWAIT3_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PATT3_ATTWAIT3_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PATT3_ATTWAIT3_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PATT3_ATTWAIT3_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PATT3_ATTWAIT3_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PATT3_ATTWAIT3_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PATT3_ATTWAIT3_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PATT3_ATTWAIT3_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PATT3_ATTHOLD3 ((uint32_t)0x00FF0000) /*!< ATTHOLD3[7:0] bits (Attribute memory 3 hold time) */ -#define FSMC_PATT3_ATTHOLD3_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PATT3_ATTHOLD3_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PATT3_ATTHOLD3_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PATT3_ATTHOLD3_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PATT3_ATTHOLD3_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PATT3_ATTHOLD3_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PATT3_ATTHOLD3_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PATT3_ATTHOLD3_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PATT3_ATTHIZ3 ((uint32_t)0xFF000000) /*!< ATTHIZ3[7:0] bits (Attribute memory 3 databus HiZ time) */ -#define FSMC_PATT3_ATTHIZ3_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PATT3_ATTHIZ3_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PATT3_ATTHIZ3_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PATT3_ATTHIZ3_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PATT3_ATTHIZ3_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PATT3_ATTHIZ3_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PATT3_ATTHIZ3_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PATT3_ATTHIZ3_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_PATT4 register ******************/ -#define FSMC_PATT4_ATTSET4 ((uint32_t)0x000000FF) /*!< ATTSET4[7:0] bits (Attribute memory 4 setup time) */ -#define FSMC_PATT4_ATTSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PATT4_ATTSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PATT4_ATTSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PATT4_ATTSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PATT4_ATTSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PATT4_ATTSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PATT4_ATTSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PATT4_ATTSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PATT4_ATTWAIT4 ((uint32_t)0x0000FF00) /*!< ATTWAIT4[7:0] bits (Attribute memory 4 wait time) */ -#define FSMC_PATT4_ATTWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PATT4_ATTWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PATT4_ATTWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PATT4_ATTWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PATT4_ATTWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PATT4_ATTWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PATT4_ATTWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PATT4_ATTWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PATT4_ATTHOLD4 ((uint32_t)0x00FF0000) /*!< ATTHOLD4[7:0] bits (Attribute memory 4 hold time) */ -#define FSMC_PATT4_ATTHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PATT4_ATTHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PATT4_ATTHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PATT4_ATTHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PATT4_ATTHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PATT4_ATTHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PATT4_ATTHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PATT4_ATTHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PATT4_ATTHIZ4 ((uint32_t)0xFF000000) /*!< ATTHIZ4[7:0] bits (Attribute memory 4 databus HiZ time) */ -#define FSMC_PATT4_ATTHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PATT4_ATTHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PATT4_ATTHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PATT4_ATTHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PATT4_ATTHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PATT4_ATTHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PATT4_ATTHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PATT4_ATTHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_PIO4 register *******************/ -#define FSMC_PIO4_IOSET4 ((uint32_t)0x000000FF) /*!< IOSET4[7:0] bits (I/O 4 setup time) */ -#define FSMC_PIO4_IOSET4_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define FSMC_PIO4_IOSET4_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define FSMC_PIO4_IOSET4_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define FSMC_PIO4_IOSET4_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define FSMC_PIO4_IOSET4_4 ((uint32_t)0x00000010) /*!< Bit 4 */ -#define FSMC_PIO4_IOSET4_5 ((uint32_t)0x00000020) /*!< Bit 5 */ -#define FSMC_PIO4_IOSET4_6 ((uint32_t)0x00000040) /*!< Bit 6 */ -#define FSMC_PIO4_IOSET4_7 ((uint32_t)0x00000080) /*!< Bit 7 */ - -#define FSMC_PIO4_IOWAIT4 ((uint32_t)0x0000FF00) /*!< IOWAIT4[7:0] bits (I/O 4 wait time) */ -#define FSMC_PIO4_IOWAIT4_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define FSMC_PIO4_IOWAIT4_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define FSMC_PIO4_IOWAIT4_2 ((uint32_t)0x00000400) /*!< Bit 2 */ -#define FSMC_PIO4_IOWAIT4_3 ((uint32_t)0x00000800) /*!< Bit 3 */ -#define FSMC_PIO4_IOWAIT4_4 ((uint32_t)0x00001000) /*!< Bit 4 */ -#define FSMC_PIO4_IOWAIT4_5 ((uint32_t)0x00002000) /*!< Bit 5 */ -#define FSMC_PIO4_IOWAIT4_6 ((uint32_t)0x00004000) /*!< Bit 6 */ -#define FSMC_PIO4_IOWAIT4_7 ((uint32_t)0x00008000) /*!< Bit 7 */ - -#define FSMC_PIO4_IOHOLD4 ((uint32_t)0x00FF0000) /*!< IOHOLD4[7:0] bits (I/O 4 hold time) */ -#define FSMC_PIO4_IOHOLD4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define FSMC_PIO4_IOHOLD4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define FSMC_PIO4_IOHOLD4_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define FSMC_PIO4_IOHOLD4_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define FSMC_PIO4_IOHOLD4_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define FSMC_PIO4_IOHOLD4_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define FSMC_PIO4_IOHOLD4_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define FSMC_PIO4_IOHOLD4_7 ((uint32_t)0x00800000) /*!< Bit 7 */ - -#define FSMC_PIO4_IOHIZ4 ((uint32_t)0xFF000000) /*!< IOHIZ4[7:0] bits (I/O 4 databus HiZ time) */ -#define FSMC_PIO4_IOHIZ4_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define FSMC_PIO4_IOHIZ4_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define FSMC_PIO4_IOHIZ4_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define FSMC_PIO4_IOHIZ4_3 ((uint32_t)0x08000000) /*!< Bit 3 */ -#define FSMC_PIO4_IOHIZ4_4 ((uint32_t)0x10000000) /*!< Bit 4 */ -#define FSMC_PIO4_IOHIZ4_5 ((uint32_t)0x20000000) /*!< Bit 5 */ -#define FSMC_PIO4_IOHIZ4_6 ((uint32_t)0x40000000) /*!< Bit 6 */ -#define FSMC_PIO4_IOHIZ4_7 ((uint32_t)0x80000000) /*!< Bit 7 */ - -/****************** Bit definition for FSMC_ECCR2 register ******************/ -#define FSMC_ECCR2_ECC2 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ - -/****************** Bit definition for FSMC_ECCR3 register ******************/ -#define FSMC_ECCR3_ECC3 ((uint32_t)0xFFFFFFFF) /*!< ECC result */ - -/******************************************************************************/ -/* */ -/* SD host Interface */ -/* */ -/******************************************************************************/ - -/****************** Bit definition for SDIO_POWER register ******************/ -#define SDIO_POWER_PWRCTRL ((uint8_t)0x03) /*!< PWRCTRL[1:0] bits (Power supply control bits) */ -#define SDIO_POWER_PWRCTRL_0 ((uint8_t)0x01) /*!< Bit 0 */ -#define SDIO_POWER_PWRCTRL_1 ((uint8_t)0x02) /*!< Bit 1 */ - -/****************** Bit definition for SDIO_CLKCR register ******************/ -#define SDIO_CLKCR_CLKDIV ((uint16_t)0x00FF) /*!< Clock divide factor */ -#define SDIO_CLKCR_CLKEN ((uint16_t)0x0100) /*!< Clock enable bit */ -#define SDIO_CLKCR_PWRSAV ((uint16_t)0x0200) /*!< Power saving configuration bit */ -#define SDIO_CLKCR_BYPASS ((uint16_t)0x0400) /*!< Clock divider bypass enable bit */ - -#define SDIO_CLKCR_WIDBUS ((uint16_t)0x1800) /*!< WIDBUS[1:0] bits (Wide bus mode enable bit) */ -#define SDIO_CLKCR_WIDBUS_0 ((uint16_t)0x0800) /*!< Bit 0 */ -#define SDIO_CLKCR_WIDBUS_1 ((uint16_t)0x1000) /*!< Bit 1 */ - -#define SDIO_CLKCR_NEGEDGE ((uint16_t)0x2000) /*!< SDIO_CK dephasing selection bit */ -#define SDIO_CLKCR_HWFC_EN ((uint16_t)0x4000) /*!< HW Flow Control enable */ - -/******************* Bit definition for SDIO_ARG register *******************/ -#define SDIO_ARG_CMDARG ((uint32_t)0xFFFFFFFF) /*!< Command argument */ - -/******************* Bit definition for SDIO_CMD register *******************/ -#define SDIO_CMD_CMDINDEX ((uint16_t)0x003F) /*!< Command Index */ - -#define SDIO_CMD_WAITRESP ((uint16_t)0x00C0) /*!< WAITRESP[1:0] bits (Wait for response bits) */ -#define SDIO_CMD_WAITRESP_0 ((uint16_t)0x0040) /*!< Bit 0 */ -#define SDIO_CMD_WAITRESP_1 ((uint16_t)0x0080) /*!< Bit 1 */ - -#define SDIO_CMD_WAITINT ((uint16_t)0x0100) /*!< CPSM Waits for Interrupt Request */ -#define SDIO_CMD_WAITPEND ((uint16_t)0x0200) /*!< CPSM Waits for ends of data transfer (CmdPend internal signal) */ -#define SDIO_CMD_CPSMEN ((uint16_t)0x0400) /*!< Command path state machine (CPSM) Enable bit */ -#define SDIO_CMD_SDIOSUSPEND ((uint16_t)0x0800) /*!< SD I/O suspend command */ -#define SDIO_CMD_ENCMDCOMPL ((uint16_t)0x1000) /*!< Enable CMD completion */ -#define SDIO_CMD_NIEN ((uint16_t)0x2000) /*!< Not Interrupt Enable */ -#define SDIO_CMD_CEATACMD ((uint16_t)0x4000) /*!< CE-ATA command */ - -/***************** Bit definition for SDIO_RESPCMD register *****************/ -#define SDIO_RESPCMD_RESPCMD ((uint8_t)0x3F) /*!< Response command index */ - -/****************** Bit definition for SDIO_RESP0 register ******************/ -#define SDIO_RESP0_CARDSTATUS0 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ - -/****************** Bit definition for SDIO_RESP1 register ******************/ -#define SDIO_RESP1_CARDSTATUS1 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ - -/****************** Bit definition for SDIO_RESP2 register ******************/ -#define SDIO_RESP2_CARDSTATUS2 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ - -/****************** Bit definition for SDIO_RESP3 register ******************/ -#define SDIO_RESP3_CARDSTATUS3 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ - -/****************** Bit definition for SDIO_RESP4 register ******************/ -#define SDIO_RESP4_CARDSTATUS4 ((uint32_t)0xFFFFFFFF) /*!< Card Status */ - -/****************** Bit definition for SDIO_DTIMER register *****************/ -#define SDIO_DTIMER_DATATIME ((uint32_t)0xFFFFFFFF) /*!< Data timeout period. */ - -/****************** Bit definition for SDIO_DLEN register *******************/ -#define SDIO_DLEN_DATALENGTH ((uint32_t)0x01FFFFFF) /*!< Data length value */ - -/****************** Bit definition for SDIO_DCTRL register ******************/ -#define SDIO_DCTRL_DTEN ((uint16_t)0x0001) /*!< Data transfer enabled bit */ -#define SDIO_DCTRL_DTDIR ((uint16_t)0x0002) /*!< Data transfer direction selection */ -#define SDIO_DCTRL_DTMODE ((uint16_t)0x0004) /*!< Data transfer mode selection */ -#define SDIO_DCTRL_DMAEN ((uint16_t)0x0008) /*!< DMA enabled bit */ - -#define SDIO_DCTRL_DBLOCKSIZE ((uint16_t)0x00F0) /*!< DBLOCKSIZE[3:0] bits (Data block size) */ -#define SDIO_DCTRL_DBLOCKSIZE_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define SDIO_DCTRL_DBLOCKSIZE_1 ((uint16_t)0x0020) /*!< Bit 1 */ -#define SDIO_DCTRL_DBLOCKSIZE_2 ((uint16_t)0x0040) /*!< Bit 2 */ -#define SDIO_DCTRL_DBLOCKSIZE_3 ((uint16_t)0x0080) /*!< Bit 3 */ - -#define SDIO_DCTRL_RWSTART ((uint16_t)0x0100) /*!< Read wait start */ -#define SDIO_DCTRL_RWSTOP ((uint16_t)0x0200) /*!< Read wait stop */ -#define SDIO_DCTRL_RWMOD ((uint16_t)0x0400) /*!< Read wait mode */ -#define SDIO_DCTRL_SDIOEN ((uint16_t)0x0800) /*!< SD I/O enable functions */ - -/****************** Bit definition for SDIO_DCOUNT register *****************/ -#define SDIO_DCOUNT_DATACOUNT ((uint32_t)0x01FFFFFF) /*!< Data count value */ - -/****************** Bit definition for SDIO_STA register ********************/ -#define SDIO_STA_CCRCFAIL ((uint32_t)0x00000001) /*!< Command response received (CRC check failed) */ -#define SDIO_STA_DCRCFAIL ((uint32_t)0x00000002) /*!< Data block sent/received (CRC check failed) */ -#define SDIO_STA_CTIMEOUT ((uint32_t)0x00000004) /*!< Command response timeout */ -#define SDIO_STA_DTIMEOUT ((uint32_t)0x00000008) /*!< Data timeout */ -#define SDIO_STA_TXUNDERR ((uint32_t)0x00000010) /*!< Transmit FIFO underrun error */ -#define SDIO_STA_RXOVERR ((uint32_t)0x00000020) /*!< Received FIFO overrun error */ -#define SDIO_STA_CMDREND ((uint32_t)0x00000040) /*!< Command response received (CRC check passed) */ -#define SDIO_STA_CMDSENT ((uint32_t)0x00000080) /*!< Command sent (no response required) */ -#define SDIO_STA_DATAEND ((uint32_t)0x00000100) /*!< Data end (data counter, SDIDCOUNT, is zero) */ -#define SDIO_STA_STBITERR ((uint32_t)0x00000200) /*!< Start bit not detected on all data signals in wide bus mode */ -#define SDIO_STA_DBCKEND ((uint32_t)0x00000400) /*!< Data block sent/received (CRC check passed) */ -#define SDIO_STA_CMDACT ((uint32_t)0x00000800) /*!< Command transfer in progress */ -#define SDIO_STA_TXACT ((uint32_t)0x00001000) /*!< Data transmit in progress */ -#define SDIO_STA_RXACT ((uint32_t)0x00002000) /*!< Data receive in progress */ -#define SDIO_STA_TXFIFOHE ((uint32_t)0x00004000) /*!< Transmit FIFO Half Empty: at least 8 words can be written into the FIFO */ -#define SDIO_STA_RXFIFOHF ((uint32_t)0x00008000) /*!< Receive FIFO Half Full: there are at least 8 words in the FIFO */ -#define SDIO_STA_TXFIFOF ((uint32_t)0x00010000) /*!< Transmit FIFO full */ -#define SDIO_STA_RXFIFOF ((uint32_t)0x00020000) /*!< Receive FIFO full */ -#define SDIO_STA_TXFIFOE ((uint32_t)0x00040000) /*!< Transmit FIFO empty */ -#define SDIO_STA_RXFIFOE ((uint32_t)0x00080000) /*!< Receive FIFO empty */ -#define SDIO_STA_TXDAVL ((uint32_t)0x00100000) /*!< Data available in transmit FIFO */ -#define SDIO_STA_RXDAVL ((uint32_t)0x00200000) /*!< Data available in receive FIFO */ -#define SDIO_STA_SDIOIT ((uint32_t)0x00400000) /*!< SDIO interrupt received */ -#define SDIO_STA_CEATAEND ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received for CMD61 */ - -/******************* Bit definition for SDIO_ICR register *******************/ -#define SDIO_ICR_CCRCFAILC ((uint32_t)0x00000001) /*!< CCRCFAIL flag clear bit */ -#define SDIO_ICR_DCRCFAILC ((uint32_t)0x00000002) /*!< DCRCFAIL flag clear bit */ -#define SDIO_ICR_CTIMEOUTC ((uint32_t)0x00000004) /*!< CTIMEOUT flag clear bit */ -#define SDIO_ICR_DTIMEOUTC ((uint32_t)0x00000008) /*!< DTIMEOUT flag clear bit */ -#define SDIO_ICR_TXUNDERRC ((uint32_t)0x00000010) /*!< TXUNDERR flag clear bit */ -#define SDIO_ICR_RXOVERRC ((uint32_t)0x00000020) /*!< RXOVERR flag clear bit */ -#define SDIO_ICR_CMDRENDC ((uint32_t)0x00000040) /*!< CMDREND flag clear bit */ -#define SDIO_ICR_CMDSENTC ((uint32_t)0x00000080) /*!< CMDSENT flag clear bit */ -#define SDIO_ICR_DATAENDC ((uint32_t)0x00000100) /*!< DATAEND flag clear bit */ -#define SDIO_ICR_STBITERRC ((uint32_t)0x00000200) /*!< STBITERR flag clear bit */ -#define SDIO_ICR_DBCKENDC ((uint32_t)0x00000400) /*!< DBCKEND flag clear bit */ -#define SDIO_ICR_SDIOITC ((uint32_t)0x00400000) /*!< SDIOIT flag clear bit */ -#define SDIO_ICR_CEATAENDC ((uint32_t)0x00800000) /*!< CEATAEND flag clear bit */ - -/****************** Bit definition for SDIO_MASK register *******************/ -#define SDIO_MASK_CCRCFAILIE ((uint32_t)0x00000001) /*!< Command CRC Fail Interrupt Enable */ -#define SDIO_MASK_DCRCFAILIE ((uint32_t)0x00000002) /*!< Data CRC Fail Interrupt Enable */ -#define SDIO_MASK_CTIMEOUTIE ((uint32_t)0x00000004) /*!< Command TimeOut Interrupt Enable */ -#define SDIO_MASK_DTIMEOUTIE ((uint32_t)0x00000008) /*!< Data TimeOut Interrupt Enable */ -#define SDIO_MASK_TXUNDERRIE ((uint32_t)0x00000010) /*!< Tx FIFO UnderRun Error Interrupt Enable */ -#define SDIO_MASK_RXOVERRIE ((uint32_t)0x00000020) /*!< Rx FIFO OverRun Error Interrupt Enable */ -#define SDIO_MASK_CMDRENDIE ((uint32_t)0x00000040) /*!< Command Response Received Interrupt Enable */ -#define SDIO_MASK_CMDSENTIE ((uint32_t)0x00000080) /*!< Command Sent Interrupt Enable */ -#define SDIO_MASK_DATAENDIE ((uint32_t)0x00000100) /*!< Data End Interrupt Enable */ -#define SDIO_MASK_STBITERRIE ((uint32_t)0x00000200) /*!< Start Bit Error Interrupt Enable */ -#define SDIO_MASK_DBCKENDIE ((uint32_t)0x00000400) /*!< Data Block End Interrupt Enable */ -#define SDIO_MASK_CMDACTIE ((uint32_t)0x00000800) /*!< Command Acting Interrupt Enable */ -#define SDIO_MASK_TXACTIE ((uint32_t)0x00001000) /*!< Data Transmit Acting Interrupt Enable */ -#define SDIO_MASK_RXACTIE ((uint32_t)0x00002000) /*!< Data receive acting interrupt enabled */ -#define SDIO_MASK_TXFIFOHEIE ((uint32_t)0x00004000) /*!< Tx FIFO Half Empty interrupt Enable */ -#define SDIO_MASK_RXFIFOHFIE ((uint32_t)0x00008000) /*!< Rx FIFO Half Full interrupt Enable */ -#define SDIO_MASK_TXFIFOFIE ((uint32_t)0x00010000) /*!< Tx FIFO Full interrupt Enable */ -#define SDIO_MASK_RXFIFOFIE ((uint32_t)0x00020000) /*!< Rx FIFO Full interrupt Enable */ -#define SDIO_MASK_TXFIFOEIE ((uint32_t)0x00040000) /*!< Tx FIFO Empty interrupt Enable */ -#define SDIO_MASK_RXFIFOEIE ((uint32_t)0x00080000) /*!< Rx FIFO Empty interrupt Enable */ -#define SDIO_MASK_TXDAVLIE ((uint32_t)0x00100000) /*!< Data available in Tx FIFO interrupt Enable */ -#define SDIO_MASK_RXDAVLIE ((uint32_t)0x00200000) /*!< Data available in Rx FIFO interrupt Enable */ -#define SDIO_MASK_SDIOITIE ((uint32_t)0x00400000) /*!< SDIO Mode Interrupt Received interrupt Enable */ -#define SDIO_MASK_CEATAENDIE ((uint32_t)0x00800000) /*!< CE-ATA command completion signal received Interrupt Enable */ - -/***************** Bit definition for SDIO_FIFOCNT register *****************/ -#define SDIO_FIFOCNT_FIFOCOUNT ((uint32_t)0x00FFFFFF) /*!< Remaining number of words to be written to or read from the FIFO */ - -/****************** Bit definition for SDIO_FIFO register *******************/ -#define SDIO_FIFO_FIFODATA ((uint32_t)0xFFFFFFFF) /*!< Receive and transmit FIFO data */ - -/******************************************************************************/ -/* */ -/* USB Device FS */ -/* */ -/******************************************************************************/ - -/*!< Endpoint-specific registers */ -/******************* Bit definition for USB_EP0R register *******************/ -#define USB_EP0R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP0R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP0R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP0R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP0R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP0R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP0R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP0R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP0R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP0R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP0R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP0R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP0R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP0R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP0R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP0R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP1R register *******************/ -#define USB_EP1R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP1R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP1R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP1R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP1R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP1R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP1R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP1R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP1R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP1R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP1R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP1R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP1R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP1R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP1R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP1R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP2R register *******************/ -#define USB_EP2R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP2R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP2R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP2R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP2R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP2R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP2R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP2R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP2R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP2R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP2R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP2R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP2R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP2R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP2R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP2R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP3R register *******************/ -#define USB_EP3R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP3R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP3R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP3R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP3R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP3R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP3R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP3R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP3R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP3R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP3R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP3R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP3R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP3R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP3R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP3R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP4R register *******************/ -#define USB_EP4R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP4R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP4R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP4R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP4R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP4R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP4R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP4R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP4R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP4R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP4R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP4R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP4R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP4R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP4R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP4R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP5R register *******************/ -#define USB_EP5R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP5R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP5R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP5R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP5R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP5R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP5R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP5R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP5R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP5R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP5R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP5R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP5R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP5R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP5R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP5R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP6R register *******************/ -#define USB_EP6R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP6R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP6R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP6R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP6R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP6R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP6R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP6R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP6R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP6R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP6R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP6R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP6R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP6R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP6R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP6R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/******************* Bit definition for USB_EP7R register *******************/ -#define USB_EP7R_EA ((uint16_t)0x000F) /*!< Endpoint Address */ - -#define USB_EP7R_STAT_TX ((uint16_t)0x0030) /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ -#define USB_EP7R_STAT_TX_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define USB_EP7R_STAT_TX_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define USB_EP7R_DTOG_TX ((uint16_t)0x0040) /*!< Data Toggle, for transmission transfers */ -#define USB_EP7R_CTR_TX ((uint16_t)0x0080) /*!< Correct Transfer for transmission */ -#define USB_EP7R_EP_KIND ((uint16_t)0x0100) /*!< Endpoint Kind */ - -#define USB_EP7R_EP_TYPE ((uint16_t)0x0600) /*!< EP_TYPE[1:0] bits (Endpoint type) */ -#define USB_EP7R_EP_TYPE_0 ((uint16_t)0x0200) /*!< Bit 0 */ -#define USB_EP7R_EP_TYPE_1 ((uint16_t)0x0400) /*!< Bit 1 */ - -#define USB_EP7R_SETUP ((uint16_t)0x0800) /*!< Setup transaction completed */ - -#define USB_EP7R_STAT_RX ((uint16_t)0x3000) /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ -#define USB_EP7R_STAT_RX_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USB_EP7R_STAT_RX_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USB_EP7R_DTOG_RX ((uint16_t)0x4000) /*!< Data Toggle, for reception transfers */ -#define USB_EP7R_CTR_RX ((uint16_t)0x8000) /*!< Correct Transfer for reception */ - -/*!< Common registers */ -/******************* Bit definition for USB_CNTR register *******************/ -#define USB_CNTR_FRES ((uint16_t)0x0001) /*!< Force USB Reset */ -#define USB_CNTR_PDWN ((uint16_t)0x0002) /*!< Power down */ -#define USB_CNTR_LP_MODE ((uint16_t)0x0004) /*!< Low-power mode */ -#define USB_CNTR_FSUSP ((uint16_t)0x0008) /*!< Force suspend */ -#define USB_CNTR_RESUME ((uint16_t)0x0010) /*!< Resume request */ -#define USB_CNTR_ESOFM ((uint16_t)0x0100) /*!< Expected Start Of Frame Interrupt Mask */ -#define USB_CNTR_SOFM ((uint16_t)0x0200) /*!< Start Of Frame Interrupt Mask */ -#define USB_CNTR_RESETM ((uint16_t)0x0400) /*!< RESET Interrupt Mask */ -#define USB_CNTR_SUSPM ((uint16_t)0x0800) /*!< Suspend mode Interrupt Mask */ -#define USB_CNTR_WKUPM ((uint16_t)0x1000) /*!< Wakeup Interrupt Mask */ -#define USB_CNTR_ERRM ((uint16_t)0x2000) /*!< Error Interrupt Mask */ -#define USB_CNTR_PMAOVRM ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun Interrupt Mask */ -#define USB_CNTR_CTRM ((uint16_t)0x8000) /*!< Correct Transfer Interrupt Mask */ - -/******************* Bit definition for USB_ISTR register *******************/ -#define USB_ISTR_EP_ID ((uint16_t)0x000F) /*!< Endpoint Identifier */ -#define USB_ISTR_DIR ((uint16_t)0x0010) /*!< Direction of transaction */ -#define USB_ISTR_ESOF ((uint16_t)0x0100) /*!< Expected Start Of Frame */ -#define USB_ISTR_SOF ((uint16_t)0x0200) /*!< Start Of Frame */ -#define USB_ISTR_RESET ((uint16_t)0x0400) /*!< USB RESET request */ -#define USB_ISTR_SUSP ((uint16_t)0x0800) /*!< Suspend mode request */ -#define USB_ISTR_WKUP ((uint16_t)0x1000) /*!< Wake up */ -#define USB_ISTR_ERR ((uint16_t)0x2000) /*!< Error */ -#define USB_ISTR_PMAOVR ((uint16_t)0x4000) /*!< Packet Memory Area Over / Underrun */ -#define USB_ISTR_CTR ((uint16_t)0x8000) /*!< Correct Transfer */ - -/******************* Bit definition for USB_FNR register ********************/ -#define USB_FNR_FN ((uint16_t)0x07FF) /*!< Frame Number */ -#define USB_FNR_LSOF ((uint16_t)0x1800) /*!< Lost SOF */ -#define USB_FNR_LCK ((uint16_t)0x2000) /*!< Locked */ -#define USB_FNR_RXDM ((uint16_t)0x4000) /*!< Receive Data - Line Status */ -#define USB_FNR_RXDP ((uint16_t)0x8000) /*!< Receive Data + Line Status */ - -/****************** Bit definition for USB_DADDR register *******************/ -#define USB_DADDR_ADD ((uint8_t)0x7F) /*!< ADD[6:0] bits (Device Address) */ -#define USB_DADDR_ADD0 ((uint8_t)0x01) /*!< Bit 0 */ -#define USB_DADDR_ADD1 ((uint8_t)0x02) /*!< Bit 1 */ -#define USB_DADDR_ADD2 ((uint8_t)0x04) /*!< Bit 2 */ -#define USB_DADDR_ADD3 ((uint8_t)0x08) /*!< Bit 3 */ -#define USB_DADDR_ADD4 ((uint8_t)0x10) /*!< Bit 4 */ -#define USB_DADDR_ADD5 ((uint8_t)0x20) /*!< Bit 5 */ -#define USB_DADDR_ADD6 ((uint8_t)0x40) /*!< Bit 6 */ - -#define USB_DADDR_EF ((uint8_t)0x80) /*!< Enable Function */ - -/****************** Bit definition for USB_BTABLE register ******************/ -#define USB_BTABLE_BTABLE ((uint16_t)0xFFF8) /*!< Buffer Table */ - -/*!< Buffer descriptor table */ -/***************** Bit definition for USB_ADDR0_TX register *****************/ -#define USB_ADDR0_TX_ADDR0_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 0 */ - -/***************** Bit definition for USB_ADDR1_TX register *****************/ -#define USB_ADDR1_TX_ADDR1_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 1 */ - -/***************** Bit definition for USB_ADDR2_TX register *****************/ -#define USB_ADDR2_TX_ADDR2_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 2 */ - -/***************** Bit definition for USB_ADDR3_TX register *****************/ -#define USB_ADDR3_TX_ADDR3_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 3 */ - -/***************** Bit definition for USB_ADDR4_TX register *****************/ -#define USB_ADDR4_TX_ADDR4_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 4 */ - -/***************** Bit definition for USB_ADDR5_TX register *****************/ -#define USB_ADDR5_TX_ADDR5_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 5 */ - -/***************** Bit definition for USB_ADDR6_TX register *****************/ -#define USB_ADDR6_TX_ADDR6_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 6 */ - -/***************** Bit definition for USB_ADDR7_TX register *****************/ -#define USB_ADDR7_TX_ADDR7_TX ((uint16_t)0xFFFE) /*!< Transmission Buffer Address 7 */ - -/*----------------------------------------------------------------------------*/ - -/***************** Bit definition for USB_COUNT0_TX register ****************/ -#define USB_COUNT0_TX_COUNT0_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 0 */ - -/***************** Bit definition for USB_COUNT1_TX register ****************/ -#define USB_COUNT1_TX_COUNT1_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 1 */ - -/***************** Bit definition for USB_COUNT2_TX register ****************/ -#define USB_COUNT2_TX_COUNT2_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 2 */ - -/***************** Bit definition for USB_COUNT3_TX register ****************/ -#define USB_COUNT3_TX_COUNT3_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 3 */ - -/***************** Bit definition for USB_COUNT4_TX register ****************/ -#define USB_COUNT4_TX_COUNT4_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 4 */ - -/***************** Bit definition for USB_COUNT5_TX register ****************/ -#define USB_COUNT5_TX_COUNT5_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 5 */ - -/***************** Bit definition for USB_COUNT6_TX register ****************/ -#define USB_COUNT6_TX_COUNT6_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 6 */ - -/***************** Bit definition for USB_COUNT7_TX register ****************/ -#define USB_COUNT7_TX_COUNT7_TX ((uint16_t)0x03FF) /*!< Transmission Byte Count 7 */ - -/*----------------------------------------------------------------------------*/ - -/**************** Bit definition for USB_COUNT0_TX_0 register ***************/ -#define USB_COUNT0_TX_0_COUNT0_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 0 (low) */ - -/**************** Bit definition for USB_COUNT0_TX_1 register ***************/ -#define USB_COUNT0_TX_1_COUNT0_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 0 (high) */ - -/**************** Bit definition for USB_COUNT1_TX_0 register ***************/ -#define USB_COUNT1_TX_0_COUNT1_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 1 (low) */ - -/**************** Bit definition for USB_COUNT1_TX_1 register ***************/ -#define USB_COUNT1_TX_1_COUNT1_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 1 (high) */ - -/**************** Bit definition for USB_COUNT2_TX_0 register ***************/ -#define USB_COUNT2_TX_0_COUNT2_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 2 (low) */ - -/**************** Bit definition for USB_COUNT2_TX_1 register ***************/ -#define USB_COUNT2_TX_1_COUNT2_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 2 (high) */ - -/**************** Bit definition for USB_COUNT3_TX_0 register ***************/ -#define USB_COUNT3_TX_0_COUNT3_TX_0 ((uint16_t)0x000003FF) /*!< Transmission Byte Count 3 (low) */ - -/**************** Bit definition for USB_COUNT3_TX_1 register ***************/ -#define USB_COUNT3_TX_1_COUNT3_TX_1 ((uint16_t)0x03FF0000) /*!< Transmission Byte Count 3 (high) */ - -/**************** Bit definition for USB_COUNT4_TX_0 register ***************/ -#define USB_COUNT4_TX_0_COUNT4_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 4 (low) */ - -/**************** Bit definition for USB_COUNT4_TX_1 register ***************/ -#define USB_COUNT4_TX_1_COUNT4_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 4 (high) */ - -/**************** Bit definition for USB_COUNT5_TX_0 register ***************/ -#define USB_COUNT5_TX_0_COUNT5_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 5 (low) */ - -/**************** Bit definition for USB_COUNT5_TX_1 register ***************/ -#define USB_COUNT5_TX_1_COUNT5_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 5 (high) */ - -/**************** Bit definition for USB_COUNT6_TX_0 register ***************/ -#define USB_COUNT6_TX_0_COUNT6_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 6 (low) */ - -/**************** Bit definition for USB_COUNT6_TX_1 register ***************/ -#define USB_COUNT6_TX_1_COUNT6_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 6 (high) */ - -/**************** Bit definition for USB_COUNT7_TX_0 register ***************/ -#define USB_COUNT7_TX_0_COUNT7_TX_0 ((uint32_t)0x000003FF) /*!< Transmission Byte Count 7 (low) */ - -/**************** Bit definition for USB_COUNT7_TX_1 register ***************/ -#define USB_COUNT7_TX_1_COUNT7_TX_1 ((uint32_t)0x03FF0000) /*!< Transmission Byte Count 7 (high) */ - -/*----------------------------------------------------------------------------*/ - -/***************** Bit definition for USB_ADDR0_RX register *****************/ -#define USB_ADDR0_RX_ADDR0_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 0 */ - -/***************** Bit definition for USB_ADDR1_RX register *****************/ -#define USB_ADDR1_RX_ADDR1_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 1 */ - -/***************** Bit definition for USB_ADDR2_RX register *****************/ -#define USB_ADDR2_RX_ADDR2_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 2 */ - -/***************** Bit definition for USB_ADDR3_RX register *****************/ -#define USB_ADDR3_RX_ADDR3_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 3 */ - -/***************** Bit definition for USB_ADDR4_RX register *****************/ -#define USB_ADDR4_RX_ADDR4_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 4 */ - -/***************** Bit definition for USB_ADDR5_RX register *****************/ -#define USB_ADDR5_RX_ADDR5_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 5 */ - -/***************** Bit definition for USB_ADDR6_RX register *****************/ -#define USB_ADDR6_RX_ADDR6_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 6 */ - -/***************** Bit definition for USB_ADDR7_RX register *****************/ -#define USB_ADDR7_RX_ADDR7_RX ((uint16_t)0xFFFE) /*!< Reception Buffer Address 7 */ - -/*----------------------------------------------------------------------------*/ - -/***************** Bit definition for USB_COUNT0_RX register ****************/ -#define USB_COUNT0_RX_COUNT0_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT0_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT0_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT0_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT0_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT0_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT0_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT0_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT1_RX register ****************/ -#define USB_COUNT1_RX_COUNT1_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT1_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT1_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT1_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT1_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT1_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT1_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT1_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT2_RX register ****************/ -#define USB_COUNT2_RX_COUNT2_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT2_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT2_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT2_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT2_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT2_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT2_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT2_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT3_RX register ****************/ -#define USB_COUNT3_RX_COUNT3_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT3_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT3_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT3_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT3_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT3_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT3_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT3_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT4_RX register ****************/ -#define USB_COUNT4_RX_COUNT4_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT4_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT4_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT4_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT4_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT4_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT4_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT4_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT5_RX register ****************/ -#define USB_COUNT5_RX_COUNT5_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT5_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT5_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT5_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT5_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT5_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT5_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT5_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT6_RX register ****************/ -#define USB_COUNT6_RX_COUNT6_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT6_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT6_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT6_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT6_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT6_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT6_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT6_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/***************** Bit definition for USB_COUNT7_RX register ****************/ -#define USB_COUNT7_RX_COUNT7_RX ((uint16_t)0x03FF) /*!< Reception Byte Count */ - -#define USB_COUNT7_RX_NUM_BLOCK ((uint16_t)0x7C00) /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ -#define USB_COUNT7_RX_NUM_BLOCK_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define USB_COUNT7_RX_NUM_BLOCK_1 ((uint16_t)0x0800) /*!< Bit 1 */ -#define USB_COUNT7_RX_NUM_BLOCK_2 ((uint16_t)0x1000) /*!< Bit 2 */ -#define USB_COUNT7_RX_NUM_BLOCK_3 ((uint16_t)0x2000) /*!< Bit 3 */ -#define USB_COUNT7_RX_NUM_BLOCK_4 ((uint16_t)0x4000) /*!< Bit 4 */ - -#define USB_COUNT7_RX_BLSIZE ((uint16_t)0x8000) /*!< BLock SIZE */ - -/*----------------------------------------------------------------------------*/ - -/**************** Bit definition for USB_COUNT0_RX_0 register ***************/ -#define USB_COUNT0_RX_0_COUNT0_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT0_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT0_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT0_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT0_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT0_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT0_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT0_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT0_RX_1 register ***************/ -#define USB_COUNT0_RX_1_COUNT0_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT0_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT0_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define USB_COUNT0_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT0_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT0_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT0_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT0_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/**************** Bit definition for USB_COUNT1_RX_0 register ***************/ -#define USB_COUNT1_RX_0_COUNT1_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT1_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT1_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT1_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT1_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT1_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT1_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT1_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT1_RX_1 register ***************/ -#define USB_COUNT1_RX_1_COUNT1_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT1_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT1_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT1_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT1_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT1_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT1_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT1_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/**************** Bit definition for USB_COUNT2_RX_0 register ***************/ -#define USB_COUNT2_RX_0_COUNT2_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT2_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT2_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT2_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT2_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT2_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT2_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT2_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT2_RX_1 register ***************/ -#define USB_COUNT2_RX_1_COUNT2_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT2_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT2_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT2_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT2_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT2_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT2_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT2_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/**************** Bit definition for USB_COUNT3_RX_0 register ***************/ -#define USB_COUNT3_RX_0_COUNT3_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT3_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT3_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT3_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT3_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT3_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT3_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT3_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT3_RX_1 register ***************/ -#define USB_COUNT3_RX_1_COUNT3_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT3_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT3_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT3_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT3_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT3_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT3_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT3_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/**************** Bit definition for USB_COUNT4_RX_0 register ***************/ -#define USB_COUNT4_RX_0_COUNT4_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT4_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT4_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT4_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT4_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT4_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT4_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT4_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT4_RX_1 register ***************/ -#define USB_COUNT4_RX_1_COUNT4_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT4_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT4_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT4_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT4_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT4_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT4_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT4_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/**************** Bit definition for USB_COUNT5_RX_0 register ***************/ -#define USB_COUNT5_RX_0_COUNT5_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT5_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT5_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT5_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT5_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT5_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT5_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT5_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT5_RX_1 register ***************/ -#define USB_COUNT5_RX_1_COUNT5_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT5_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT5_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT5_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT5_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT5_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT5_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT5_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/*************** Bit definition for USB_COUNT6_RX_0 register ***************/ -#define USB_COUNT6_RX_0_COUNT6_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT6_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT6_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT6_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT6_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT6_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT6_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT6_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/**************** Bit definition for USB_COUNT6_RX_1 register ***************/ -#define USB_COUNT6_RX_1_COUNT6_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT6_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT6_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT6_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT6_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT6_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT6_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT6_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/*************** Bit definition for USB_COUNT7_RX_0 register ****************/ -#define USB_COUNT7_RX_0_COUNT7_RX_0 ((uint32_t)0x000003FF) /*!< Reception Byte Count (low) */ - -#define USB_COUNT7_RX_0_NUM_BLOCK_0 ((uint32_t)0x00007C00) /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ -#define USB_COUNT7_RX_0_NUM_BLOCK_0_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define USB_COUNT7_RX_0_NUM_BLOCK_0_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define USB_COUNT7_RX_0_NUM_BLOCK_0_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define USB_COUNT7_RX_0_NUM_BLOCK_0_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define USB_COUNT7_RX_0_NUM_BLOCK_0_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define USB_COUNT7_RX_0_BLSIZE_0 ((uint32_t)0x00008000) /*!< BLock SIZE (low) */ - -/*************** Bit definition for USB_COUNT7_RX_1 register ****************/ -#define USB_COUNT7_RX_1_COUNT7_RX_1 ((uint32_t)0x03FF0000) /*!< Reception Byte Count (high) */ - -#define USB_COUNT7_RX_1_NUM_BLOCK_1 ((uint32_t)0x7C000000) /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ -#define USB_COUNT7_RX_1_NUM_BLOCK_1_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define USB_COUNT7_RX_1_NUM_BLOCK_1_1 ((uint32_t)0x08000000) /*!< Bit 1 */ -#define USB_COUNT7_RX_1_NUM_BLOCK_1_2 ((uint32_t)0x10000000) /*!< Bit 2 */ -#define USB_COUNT7_RX_1_NUM_BLOCK_1_3 ((uint32_t)0x20000000) /*!< Bit 3 */ -#define USB_COUNT7_RX_1_NUM_BLOCK_1_4 ((uint32_t)0x40000000) /*!< Bit 4 */ - -#define USB_COUNT7_RX_1_BLSIZE_1 ((uint32_t)0x80000000) /*!< BLock SIZE (high) */ - -/******************************************************************************/ -/* */ -/* Controller Area Network */ -/* */ -/******************************************************************************/ - -/*!< CAN control and status registers */ -/******************* Bit definition for CAN_MCR register ********************/ -#define CAN_MCR_INRQ ((uint16_t)0x0001) /*!< Initialization Request */ -#define CAN_MCR_SLEEP ((uint16_t)0x0002) /*!< Sleep Mode Request */ -#define CAN_MCR_TXFP ((uint16_t)0x0004) /*!< Transmit FIFO Priority */ -#define CAN_MCR_RFLM ((uint16_t)0x0008) /*!< Receive FIFO Locked Mode */ -#define CAN_MCR_NART ((uint16_t)0x0010) /*!< No Automatic Retransmission */ -#define CAN_MCR_AWUM ((uint16_t)0x0020) /*!< Automatic Wakeup Mode */ -#define CAN_MCR_ABOM ((uint16_t)0x0040) /*!< Automatic Bus-Off Management */ -#define CAN_MCR_TTCM ((uint16_t)0x0080) /*!< Time Triggered Communication Mode */ -#define CAN_MCR_RESET ((uint16_t)0x8000) /*!< CAN software master reset */ - -/******************* Bit definition for CAN_MSR register ********************/ -#define CAN_MSR_INAK ((uint16_t)0x0001) /*!< Initialization Acknowledge */ -#define CAN_MSR_SLAK ((uint16_t)0x0002) /*!< Sleep Acknowledge */ -#define CAN_MSR_ERRI ((uint16_t)0x0004) /*!< Error Interrupt */ -#define CAN_MSR_WKUI ((uint16_t)0x0008) /*!< Wakeup Interrupt */ -#define CAN_MSR_SLAKI ((uint16_t)0x0010) /*!< Sleep Acknowledge Interrupt */ -#define CAN_MSR_TXM ((uint16_t)0x0100) /*!< Transmit Mode */ -#define CAN_MSR_RXM ((uint16_t)0x0200) /*!< Receive Mode */ -#define CAN_MSR_SAMP ((uint16_t)0x0400) /*!< Last Sample Point */ -#define CAN_MSR_RX ((uint16_t)0x0800) /*!< CAN Rx Signal */ - -/******************* Bit definition for CAN_TSR register ********************/ -#define CAN_TSR_RQCP0 ((uint32_t)0x00000001) /*!< Request Completed Mailbox0 */ -#define CAN_TSR_TXOK0 ((uint32_t)0x00000002) /*!< Transmission OK of Mailbox0 */ -#define CAN_TSR_ALST0 ((uint32_t)0x00000004) /*!< Arbitration Lost for Mailbox0 */ -#define CAN_TSR_TERR0 ((uint32_t)0x00000008) /*!< Transmission Error of Mailbox0 */ -#define CAN_TSR_ABRQ0 ((uint32_t)0x00000080) /*!< Abort Request for Mailbox0 */ -#define CAN_TSR_RQCP1 ((uint32_t)0x00000100) /*!< Request Completed Mailbox1 */ -#define CAN_TSR_TXOK1 ((uint32_t)0x00000200) /*!< Transmission OK of Mailbox1 */ -#define CAN_TSR_ALST1 ((uint32_t)0x00000400) /*!< Arbitration Lost for Mailbox1 */ -#define CAN_TSR_TERR1 ((uint32_t)0x00000800) /*!< Transmission Error of Mailbox1 */ -#define CAN_TSR_ABRQ1 ((uint32_t)0x00008000) /*!< Abort Request for Mailbox 1 */ -#define CAN_TSR_RQCP2 ((uint32_t)0x00010000) /*!< Request Completed Mailbox2 */ -#define CAN_TSR_TXOK2 ((uint32_t)0x00020000) /*!< Transmission OK of Mailbox 2 */ -#define CAN_TSR_ALST2 ((uint32_t)0x00040000) /*!< Arbitration Lost for mailbox 2 */ -#define CAN_TSR_TERR2 ((uint32_t)0x00080000) /*!< Transmission Error of Mailbox 2 */ -#define CAN_TSR_ABRQ2 ((uint32_t)0x00800000) /*!< Abort Request for Mailbox 2 */ -#define CAN_TSR_CODE ((uint32_t)0x03000000) /*!< Mailbox Code */ - -#define CAN_TSR_TME ((uint32_t)0x1C000000) /*!< TME[2:0] bits */ -#define CAN_TSR_TME0 ((uint32_t)0x04000000) /*!< Transmit Mailbox 0 Empty */ -#define CAN_TSR_TME1 ((uint32_t)0x08000000) /*!< Transmit Mailbox 1 Empty */ -#define CAN_TSR_TME2 ((uint32_t)0x10000000) /*!< Transmit Mailbox 2 Empty */ - -#define CAN_TSR_LOW ((uint32_t)0xE0000000) /*!< LOW[2:0] bits */ -#define CAN_TSR_LOW0 ((uint32_t)0x20000000) /*!< Lowest Priority Flag for Mailbox 0 */ -#define CAN_TSR_LOW1 ((uint32_t)0x40000000) /*!< Lowest Priority Flag for Mailbox 1 */ -#define CAN_TSR_LOW2 ((uint32_t)0x80000000) /*!< Lowest Priority Flag for Mailbox 2 */ - -/******************* Bit definition for CAN_RF0R register *******************/ -#define CAN_RF0R_FMP0 ((uint8_t)0x03) /*!< FIFO 0 Message Pending */ -#define CAN_RF0R_FULL0 ((uint8_t)0x08) /*!< FIFO 0 Full */ -#define CAN_RF0R_FOVR0 ((uint8_t)0x10) /*!< FIFO 0 Overrun */ -#define CAN_RF0R_RFOM0 ((uint8_t)0x20) /*!< Release FIFO 0 Output Mailbox */ - -/******************* Bit definition for CAN_RF1R register *******************/ -#define CAN_RF1R_FMP1 ((uint8_t)0x03) /*!< FIFO 1 Message Pending */ -#define CAN_RF1R_FULL1 ((uint8_t)0x08) /*!< FIFO 1 Full */ -#define CAN_RF1R_FOVR1 ((uint8_t)0x10) /*!< FIFO 1 Overrun */ -#define CAN_RF1R_RFOM1 ((uint8_t)0x20) /*!< Release FIFO 1 Output Mailbox */ - -/******************** Bit definition for CAN_IER register *******************/ -#define CAN_IER_TMEIE ((uint32_t)0x00000001) /*!< Transmit Mailbox Empty Interrupt Enable */ -#define CAN_IER_FMPIE0 ((uint32_t)0x00000002) /*!< FIFO Message Pending Interrupt Enable */ -#define CAN_IER_FFIE0 ((uint32_t)0x00000004) /*!< FIFO Full Interrupt Enable */ -#define CAN_IER_FOVIE0 ((uint32_t)0x00000008) /*!< FIFO Overrun Interrupt Enable */ -#define CAN_IER_FMPIE1 ((uint32_t)0x00000010) /*!< FIFO Message Pending Interrupt Enable */ -#define CAN_IER_FFIE1 ((uint32_t)0x00000020) /*!< FIFO Full Interrupt Enable */ -#define CAN_IER_FOVIE1 ((uint32_t)0x00000040) /*!< FIFO Overrun Interrupt Enable */ -#define CAN_IER_EWGIE ((uint32_t)0x00000100) /*!< Error Warning Interrupt Enable */ -#define CAN_IER_EPVIE ((uint32_t)0x00000200) /*!< Error Passive Interrupt Enable */ -#define CAN_IER_BOFIE ((uint32_t)0x00000400) /*!< Bus-Off Interrupt Enable */ -#define CAN_IER_LECIE ((uint32_t)0x00000800) /*!< Last Error Code Interrupt Enable */ -#define CAN_IER_ERRIE ((uint32_t)0x00008000) /*!< Error Interrupt Enable */ -#define CAN_IER_WKUIE ((uint32_t)0x00010000) /*!< Wakeup Interrupt Enable */ -#define CAN_IER_SLKIE ((uint32_t)0x00020000) /*!< Sleep Interrupt Enable */ - -/******************** Bit definition for CAN_ESR register *******************/ -#define CAN_ESR_EWGF ((uint32_t)0x00000001) /*!< Error Warning Flag */ -#define CAN_ESR_EPVF ((uint32_t)0x00000002) /*!< Error Passive Flag */ -#define CAN_ESR_BOFF ((uint32_t)0x00000004) /*!< Bus-Off Flag */ - -#define CAN_ESR_LEC ((uint32_t)0x00000070) /*!< LEC[2:0] bits (Last Error Code) */ -#define CAN_ESR_LEC_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define CAN_ESR_LEC_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define CAN_ESR_LEC_2 ((uint32_t)0x00000040) /*!< Bit 2 */ - -#define CAN_ESR_TEC ((uint32_t)0x00FF0000) /*!< Least significant byte of the 9-bit Transmit Error Counter */ -#define CAN_ESR_REC ((uint32_t)0xFF000000) /*!< Receive Error Counter */ - -/******************* Bit definition for CAN_BTR register ********************/ -#define CAN_BTR_BRP ((uint32_t)0x000003FF) /*!< Baud Rate Prescaler */ -#define CAN_BTR_TS1 ((uint32_t)0x000F0000) /*!< Time Segment 1 */ -#define CAN_BTR_TS2 ((uint32_t)0x00700000) /*!< Time Segment 2 */ -#define CAN_BTR_SJW ((uint32_t)0x03000000) /*!< Resynchronization Jump Width */ -#define CAN_BTR_LBKM ((uint32_t)0x40000000) /*!< Loop Back Mode (Debug) */ -#define CAN_BTR_SILM ((uint32_t)0x80000000) /*!< Silent Mode */ - -/*!< Mailbox registers */ -/****************** Bit definition for CAN_TI0R register ********************/ -#define CAN_TI0R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ -#define CAN_TI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ -#define CAN_TI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ -#define CAN_TI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ -#define CAN_TI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ - -/****************** Bit definition for CAN_TDT0R register *******************/ -#define CAN_TDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ -#define CAN_TDT0R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ -#define CAN_TDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ - -/****************** Bit definition for CAN_TDL0R register *******************/ -#define CAN_TDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ -#define CAN_TDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ -#define CAN_TDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ -#define CAN_TDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ - -/****************** Bit definition for CAN_TDH0R register *******************/ -#define CAN_TDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ -#define CAN_TDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ -#define CAN_TDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ -#define CAN_TDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ - -/******************* Bit definition for CAN_TI1R register *******************/ -#define CAN_TI1R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ -#define CAN_TI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ -#define CAN_TI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ -#define CAN_TI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ -#define CAN_TI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_TDT1R register ******************/ -#define CAN_TDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ -#define CAN_TDT1R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ -#define CAN_TDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ - -/******************* Bit definition for CAN_TDL1R register ******************/ -#define CAN_TDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ -#define CAN_TDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ -#define CAN_TDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ -#define CAN_TDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ - -/******************* Bit definition for CAN_TDH1R register ******************/ -#define CAN_TDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ -#define CAN_TDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ -#define CAN_TDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ -#define CAN_TDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ - -/******************* Bit definition for CAN_TI2R register *******************/ -#define CAN_TI2R_TXRQ ((uint32_t)0x00000001) /*!< Transmit Mailbox Request */ -#define CAN_TI2R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ -#define CAN_TI2R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ -#define CAN_TI2R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ -#define CAN_TI2R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_TDT2R register ******************/ -#define CAN_TDT2R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ -#define CAN_TDT2R_TGT ((uint32_t)0x00000100) /*!< Transmit Global Time */ -#define CAN_TDT2R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ - -/******************* Bit definition for CAN_TDL2R register ******************/ -#define CAN_TDL2R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ -#define CAN_TDL2R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ -#define CAN_TDL2R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ -#define CAN_TDL2R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ - -/******************* Bit definition for CAN_TDH2R register ******************/ -#define CAN_TDH2R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ -#define CAN_TDH2R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ -#define CAN_TDH2R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ -#define CAN_TDH2R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ - -/******************* Bit definition for CAN_RI0R register *******************/ -#define CAN_RI0R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ -#define CAN_RI0R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ -#define CAN_RI0R_EXID ((uint32_t)0x001FFFF8) /*!< Extended Identifier */ -#define CAN_RI0R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_RDT0R register ******************/ -#define CAN_RDT0R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ -#define CAN_RDT0R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ -#define CAN_RDT0R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ - -/******************* Bit definition for CAN_RDL0R register ******************/ -#define CAN_RDL0R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ -#define CAN_RDL0R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ -#define CAN_RDL0R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ -#define CAN_RDL0R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ - -/******************* Bit definition for CAN_RDH0R register ******************/ -#define CAN_RDH0R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ -#define CAN_RDH0R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ -#define CAN_RDH0R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ -#define CAN_RDH0R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ - -/******************* Bit definition for CAN_RI1R register *******************/ -#define CAN_RI1R_RTR ((uint32_t)0x00000002) /*!< Remote Transmission Request */ -#define CAN_RI1R_IDE ((uint32_t)0x00000004) /*!< Identifier Extension */ -#define CAN_RI1R_EXID ((uint32_t)0x001FFFF8) /*!< Extended identifier */ -#define CAN_RI1R_STID ((uint32_t)0xFFE00000) /*!< Standard Identifier or Extended Identifier */ - -/******************* Bit definition for CAN_RDT1R register ******************/ -#define CAN_RDT1R_DLC ((uint32_t)0x0000000F) /*!< Data Length Code */ -#define CAN_RDT1R_FMI ((uint32_t)0x0000FF00) /*!< Filter Match Index */ -#define CAN_RDT1R_TIME ((uint32_t)0xFFFF0000) /*!< Message Time Stamp */ - -/******************* Bit definition for CAN_RDL1R register ******************/ -#define CAN_RDL1R_DATA0 ((uint32_t)0x000000FF) /*!< Data byte 0 */ -#define CAN_RDL1R_DATA1 ((uint32_t)0x0000FF00) /*!< Data byte 1 */ -#define CAN_RDL1R_DATA2 ((uint32_t)0x00FF0000) /*!< Data byte 2 */ -#define CAN_RDL1R_DATA3 ((uint32_t)0xFF000000) /*!< Data byte 3 */ - -/******************* Bit definition for CAN_RDH1R register ******************/ -#define CAN_RDH1R_DATA4 ((uint32_t)0x000000FF) /*!< Data byte 4 */ -#define CAN_RDH1R_DATA5 ((uint32_t)0x0000FF00) /*!< Data byte 5 */ -#define CAN_RDH1R_DATA6 ((uint32_t)0x00FF0000) /*!< Data byte 6 */ -#define CAN_RDH1R_DATA7 ((uint32_t)0xFF000000) /*!< Data byte 7 */ - -/*!< CAN filter registers */ -/******************* Bit definition for CAN_FMR register ********************/ -#define CAN_FMR_FINIT ((uint8_t)0x01) /*!< Filter Init Mode */ - -/******************* Bit definition for CAN_FM1R register *******************/ -#define CAN_FM1R_FBM ((uint16_t)0x3FFF) /*!< Filter Mode */ -#define CAN_FM1R_FBM0 ((uint16_t)0x0001) /*!< Filter Init Mode bit 0 */ -#define CAN_FM1R_FBM1 ((uint16_t)0x0002) /*!< Filter Init Mode bit 1 */ -#define CAN_FM1R_FBM2 ((uint16_t)0x0004) /*!< Filter Init Mode bit 2 */ -#define CAN_FM1R_FBM3 ((uint16_t)0x0008) /*!< Filter Init Mode bit 3 */ -#define CAN_FM1R_FBM4 ((uint16_t)0x0010) /*!< Filter Init Mode bit 4 */ -#define CAN_FM1R_FBM5 ((uint16_t)0x0020) /*!< Filter Init Mode bit 5 */ -#define CAN_FM1R_FBM6 ((uint16_t)0x0040) /*!< Filter Init Mode bit 6 */ -#define CAN_FM1R_FBM7 ((uint16_t)0x0080) /*!< Filter Init Mode bit 7 */ -#define CAN_FM1R_FBM8 ((uint16_t)0x0100) /*!< Filter Init Mode bit 8 */ -#define CAN_FM1R_FBM9 ((uint16_t)0x0200) /*!< Filter Init Mode bit 9 */ -#define CAN_FM1R_FBM10 ((uint16_t)0x0400) /*!< Filter Init Mode bit 10 */ -#define CAN_FM1R_FBM11 ((uint16_t)0x0800) /*!< Filter Init Mode bit 11 */ -#define CAN_FM1R_FBM12 ((uint16_t)0x1000) /*!< Filter Init Mode bit 12 */ -#define CAN_FM1R_FBM13 ((uint16_t)0x2000) /*!< Filter Init Mode bit 13 */ - -/******************* Bit definition for CAN_FS1R register *******************/ -#define CAN_FS1R_FSC ((uint16_t)0x3FFF) /*!< Filter Scale Configuration */ -#define CAN_FS1R_FSC0 ((uint16_t)0x0001) /*!< Filter Scale Configuration bit 0 */ -#define CAN_FS1R_FSC1 ((uint16_t)0x0002) /*!< Filter Scale Configuration bit 1 */ -#define CAN_FS1R_FSC2 ((uint16_t)0x0004) /*!< Filter Scale Configuration bit 2 */ -#define CAN_FS1R_FSC3 ((uint16_t)0x0008) /*!< Filter Scale Configuration bit 3 */ -#define CAN_FS1R_FSC4 ((uint16_t)0x0010) /*!< Filter Scale Configuration bit 4 */ -#define CAN_FS1R_FSC5 ((uint16_t)0x0020) /*!< Filter Scale Configuration bit 5 */ -#define CAN_FS1R_FSC6 ((uint16_t)0x0040) /*!< Filter Scale Configuration bit 6 */ -#define CAN_FS1R_FSC7 ((uint16_t)0x0080) /*!< Filter Scale Configuration bit 7 */ -#define CAN_FS1R_FSC8 ((uint16_t)0x0100) /*!< Filter Scale Configuration bit 8 */ -#define CAN_FS1R_FSC9 ((uint16_t)0x0200) /*!< Filter Scale Configuration bit 9 */ -#define CAN_FS1R_FSC10 ((uint16_t)0x0400) /*!< Filter Scale Configuration bit 10 */ -#define CAN_FS1R_FSC11 ((uint16_t)0x0800) /*!< Filter Scale Configuration bit 11 */ -#define CAN_FS1R_FSC12 ((uint16_t)0x1000) /*!< Filter Scale Configuration bit 12 */ -#define CAN_FS1R_FSC13 ((uint16_t)0x2000) /*!< Filter Scale Configuration bit 13 */ - -/****************** Bit definition for CAN_FFA1R register *******************/ -#define CAN_FFA1R_FFA ((uint16_t)0x3FFF) /*!< Filter FIFO Assignment */ -#define CAN_FFA1R_FFA0 ((uint16_t)0x0001) /*!< Filter FIFO Assignment for Filter 0 */ -#define CAN_FFA1R_FFA1 ((uint16_t)0x0002) /*!< Filter FIFO Assignment for Filter 1 */ -#define CAN_FFA1R_FFA2 ((uint16_t)0x0004) /*!< Filter FIFO Assignment for Filter 2 */ -#define CAN_FFA1R_FFA3 ((uint16_t)0x0008) /*!< Filter FIFO Assignment for Filter 3 */ -#define CAN_FFA1R_FFA4 ((uint16_t)0x0010) /*!< Filter FIFO Assignment for Filter 4 */ -#define CAN_FFA1R_FFA5 ((uint16_t)0x0020) /*!< Filter FIFO Assignment for Filter 5 */ -#define CAN_FFA1R_FFA6 ((uint16_t)0x0040) /*!< Filter FIFO Assignment for Filter 6 */ -#define CAN_FFA1R_FFA7 ((uint16_t)0x0080) /*!< Filter FIFO Assignment for Filter 7 */ -#define CAN_FFA1R_FFA8 ((uint16_t)0x0100) /*!< Filter FIFO Assignment for Filter 8 */ -#define CAN_FFA1R_FFA9 ((uint16_t)0x0200) /*!< Filter FIFO Assignment for Filter 9 */ -#define CAN_FFA1R_FFA10 ((uint16_t)0x0400) /*!< Filter FIFO Assignment for Filter 10 */ -#define CAN_FFA1R_FFA11 ((uint16_t)0x0800) /*!< Filter FIFO Assignment for Filter 11 */ -#define CAN_FFA1R_FFA12 ((uint16_t)0x1000) /*!< Filter FIFO Assignment for Filter 12 */ -#define CAN_FFA1R_FFA13 ((uint16_t)0x2000) /*!< Filter FIFO Assignment for Filter 13 */ - -/******************* Bit definition for CAN_FA1R register *******************/ -#define CAN_FA1R_FACT ((uint16_t)0x3FFF) /*!< Filter Active */ -#define CAN_FA1R_FACT0 ((uint16_t)0x0001) /*!< Filter 0 Active */ -#define CAN_FA1R_FACT1 ((uint16_t)0x0002) /*!< Filter 1 Active */ -#define CAN_FA1R_FACT2 ((uint16_t)0x0004) /*!< Filter 2 Active */ -#define CAN_FA1R_FACT3 ((uint16_t)0x0008) /*!< Filter 3 Active */ -#define CAN_FA1R_FACT4 ((uint16_t)0x0010) /*!< Filter 4 Active */ -#define CAN_FA1R_FACT5 ((uint16_t)0x0020) /*!< Filter 5 Active */ -#define CAN_FA1R_FACT6 ((uint16_t)0x0040) /*!< Filter 6 Active */ -#define CAN_FA1R_FACT7 ((uint16_t)0x0080) /*!< Filter 7 Active */ -#define CAN_FA1R_FACT8 ((uint16_t)0x0100) /*!< Filter 8 Active */ -#define CAN_FA1R_FACT9 ((uint16_t)0x0200) /*!< Filter 9 Active */ -#define CAN_FA1R_FACT10 ((uint16_t)0x0400) /*!< Filter 10 Active */ -#define CAN_FA1R_FACT11 ((uint16_t)0x0800) /*!< Filter 11 Active */ -#define CAN_FA1R_FACT12 ((uint16_t)0x1000) /*!< Filter 12 Active */ -#define CAN_FA1R_FACT13 ((uint16_t)0x2000) /*!< Filter 13 Active */ - -/******************* Bit definition for CAN_F0R1 register *******************/ -#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F1R1 register *******************/ -#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F2R1 register *******************/ -#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F3R1 register *******************/ -#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F4R1 register *******************/ -#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F5R1 register *******************/ -#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F6R1 register *******************/ -#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F7R1 register *******************/ -#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F8R1 register *******************/ -#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F9R1 register *******************/ -#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F10R1 register ******************/ -#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F11R1 register ******************/ -#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F12R1 register ******************/ -#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F13R1 register ******************/ -#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F0R2 register *******************/ -#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F1R2 register *******************/ -#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F2R2 register *******************/ -#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F3R2 register *******************/ -#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F4R2 register *******************/ -#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F5R2 register *******************/ -#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F6R2 register *******************/ -#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F7R2 register *******************/ -#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F8R2 register *******************/ -#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F9R2 register *******************/ -#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F10R2 register ******************/ -#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F11R2 register ******************/ -#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F12R2 register ******************/ -#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************* Bit definition for CAN_F13R2 register ******************/ -#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /*!< Filter bit 0 */ -#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /*!< Filter bit 1 */ -#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /*!< Filter bit 2 */ -#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /*!< Filter bit 3 */ -#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /*!< Filter bit 4 */ -#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /*!< Filter bit 5 */ -#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /*!< Filter bit 6 */ -#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /*!< Filter bit 7 */ -#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /*!< Filter bit 8 */ -#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /*!< Filter bit 9 */ -#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /*!< Filter bit 10 */ -#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /*!< Filter bit 11 */ -#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /*!< Filter bit 12 */ -#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /*!< Filter bit 13 */ -#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /*!< Filter bit 14 */ -#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /*!< Filter bit 15 */ -#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /*!< Filter bit 16 */ -#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /*!< Filter bit 17 */ -#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /*!< Filter bit 18 */ -#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /*!< Filter bit 19 */ -#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /*!< Filter bit 20 */ -#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /*!< Filter bit 21 */ -#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /*!< Filter bit 22 */ -#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /*!< Filter bit 23 */ -#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /*!< Filter bit 24 */ -#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /*!< Filter bit 25 */ -#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /*!< Filter bit 26 */ -#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /*!< Filter bit 27 */ -#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /*!< Filter bit 28 */ -#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /*!< Filter bit 29 */ -#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /*!< Filter bit 30 */ -#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /*!< Filter bit 31 */ - -/******************************************************************************/ -/* */ -/* Serial Peripheral Interface */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for SPI_CR1 register ********************/ -#define SPI_CR1_CPHA ((uint16_t)0x0001) /*!< Clock Phase */ -#define SPI_CR1_CPOL ((uint16_t)0x0002) /*!< Clock Polarity */ -#define SPI_CR1_MSTR ((uint16_t)0x0004) /*!< Master Selection */ - -#define SPI_CR1_BR ((uint16_t)0x0038) /*!< BR[2:0] bits (Baud Rate Control) */ -#define SPI_CR1_BR_0 ((uint16_t)0x0008) /*!< Bit 0 */ -#define SPI_CR1_BR_1 ((uint16_t)0x0010) /*!< Bit 1 */ -#define SPI_CR1_BR_2 ((uint16_t)0x0020) /*!< Bit 2 */ - -#define SPI_CR1_SPE ((uint16_t)0x0040) /*!< SPI Enable */ -#define SPI_CR1_LSBFIRST ((uint16_t)0x0080) /*!< Frame Format */ -#define SPI_CR1_SSI ((uint16_t)0x0100) /*!< Internal slave select */ -#define SPI_CR1_SSM ((uint16_t)0x0200) /*!< Software slave management */ -#define SPI_CR1_RXONLY ((uint16_t)0x0400) /*!< Receive only */ -#define SPI_CR1_DFF ((uint16_t)0x0800) /*!< Data Frame Format */ -#define SPI_CR1_CRCNEXT ((uint16_t)0x1000) /*!< Transmit CRC next */ -#define SPI_CR1_CRCEN ((uint16_t)0x2000) /*!< Hardware CRC calculation enable */ -#define SPI_CR1_BIDIOE ((uint16_t)0x4000) /*!< Output enable in bidirectional mode */ -#define SPI_CR1_BIDIMODE ((uint16_t)0x8000) /*!< Bidirectional data mode enable */ - -/******************* Bit definition for SPI_CR2 register ********************/ -#define SPI_CR2_RXDMAEN ((uint8_t)0x01) /*!< Rx Buffer DMA Enable */ -#define SPI_CR2_TXDMAEN ((uint8_t)0x02) /*!< Tx Buffer DMA Enable */ -#define SPI_CR2_SSOE ((uint8_t)0x04) /*!< SS Output Enable */ -#define SPI_CR2_ERRIE ((uint8_t)0x20) /*!< Error Interrupt Enable */ -#define SPI_CR2_RXNEIE ((uint8_t)0x40) /*!< RX buffer Not Empty Interrupt Enable */ -#define SPI_CR2_TXEIE ((uint8_t)0x80) /*!< Tx buffer Empty Interrupt Enable */ - -/******************** Bit definition for SPI_SR register ********************/ -#define SPI_SR_RXNE ((uint8_t)0x01) /*!< Receive buffer Not Empty */ -#define SPI_SR_TXE ((uint8_t)0x02) /*!< Transmit buffer Empty */ -#define SPI_SR_CHSIDE ((uint8_t)0x04) /*!< Channel side */ -#define SPI_SR_UDR ((uint8_t)0x08) /*!< Underrun flag */ -#define SPI_SR_CRCERR ((uint8_t)0x10) /*!< CRC Error flag */ -#define SPI_SR_MODF ((uint8_t)0x20) /*!< Mode fault */ -#define SPI_SR_OVR ((uint8_t)0x40) /*!< Overrun flag */ -#define SPI_SR_BSY ((uint8_t)0x80) /*!< Busy flag */ - -/******************** Bit definition for SPI_DR register ********************/ -#define SPI_DR_DR ((uint16_t)0xFFFF) /*!< Data Register */ - -/******************* Bit definition for SPI_CRCPR register ******************/ -#define SPI_CRCPR_CRCPOLY ((uint16_t)0xFFFF) /*!< CRC polynomial register */ - -/****************** Bit definition for SPI_RXCRCR register ******************/ -#define SPI_RXCRCR_RXCRC ((uint16_t)0xFFFF) /*!< Rx CRC Register */ - -/****************** Bit definition for SPI_TXCRCR register ******************/ -#define SPI_TXCRCR_TXCRC ((uint16_t)0xFFFF) /*!< Tx CRC Register */ - -/****************** Bit definition for SPI_I2SCFGR register *****************/ -#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /*!< Channel length (number of bits per audio channel) */ - -#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /*!< DATLEN[1:0] bits (Data length to be transferred) */ -#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /*!< Bit 0 */ -#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /*!< Bit 1 */ - -#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /*!< steady state clock polarity */ - -#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /*!< I2SSTD[1:0] bits (I2S standard selection) */ -#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /*!< Bit 0 */ -#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /*!< Bit 1 */ - -#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /*!< PCM frame synchronization */ - -#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /*!< I2SCFG[1:0] bits (I2S configuration mode) */ -#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /*!< I2S Enable */ -#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /*!< I2S mode selection */ - -/****************** Bit definition for SPI_I2SPR register *******************/ -#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /*!< I2S Linear prescaler */ -#define SPI_I2SPR_ODD ((uint16_t)0x0100) /*!< Odd factor for the prescaler */ -#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /*!< Master Clock Output Enable */ - -/******************************************************************************/ -/* */ -/* Inter-integrated Circuit Interface */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for I2C_CR1 register ********************/ -#define I2C_CR1_PE ((uint16_t)0x0001) /*!< Peripheral Enable */ -#define I2C_CR1_SMBUS ((uint16_t)0x0002) /*!< SMBus Mode */ -#define I2C_CR1_SMBTYPE ((uint16_t)0x0008) /*!< SMBus Type */ -#define I2C_CR1_ENARP ((uint16_t)0x0010) /*!< ARP Enable */ -#define I2C_CR1_ENPEC ((uint16_t)0x0020) /*!< PEC Enable */ -#define I2C_CR1_ENGC ((uint16_t)0x0040) /*!< General Call Enable */ -#define I2C_CR1_NOSTRETCH ((uint16_t)0x0080) /*!< Clock Stretching Disable (Slave mode) */ -#define I2C_CR1_START ((uint16_t)0x0100) /*!< Start Generation */ -#define I2C_CR1_STOP ((uint16_t)0x0200) /*!< Stop Generation */ -#define I2C_CR1_ACK ((uint16_t)0x0400) /*!< Acknowledge Enable */ -#define I2C_CR1_POS ((uint16_t)0x0800) /*!< Acknowledge/PEC Position (for data reception) */ -#define I2C_CR1_PEC ((uint16_t)0x1000) /*!< Packet Error Checking */ -#define I2C_CR1_ALERT ((uint16_t)0x2000) /*!< SMBus Alert */ -#define I2C_CR1_SWRST ((uint16_t)0x8000) /*!< Software Reset */ - -/******************* Bit definition for I2C_CR2 register ********************/ -#define I2C_CR2_FREQ ((uint16_t)0x003F) /*!< FREQ[5:0] bits (Peripheral Clock Frequency) */ -#define I2C_CR2_FREQ_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define I2C_CR2_FREQ_1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define I2C_CR2_FREQ_2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define I2C_CR2_FREQ_3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define I2C_CR2_FREQ_4 ((uint16_t)0x0010) /*!< Bit 4 */ -#define I2C_CR2_FREQ_5 ((uint16_t)0x0020) /*!< Bit 5 */ - -#define I2C_CR2_ITERREN ((uint16_t)0x0100) /*!< Error Interrupt Enable */ -#define I2C_CR2_ITEVTEN ((uint16_t)0x0200) /*!< Event Interrupt Enable */ -#define I2C_CR2_ITBUFEN ((uint16_t)0x0400) /*!< Buffer Interrupt Enable */ -#define I2C_CR2_DMAEN ((uint16_t)0x0800) /*!< DMA Requests Enable */ -#define I2C_CR2_LAST ((uint16_t)0x1000) /*!< DMA Last Transfer */ - -/******************* Bit definition for I2C_OAR1 register *******************/ -#define I2C_OAR1_ADD1_7 ((uint16_t)0x00FE) /*!< Interface Address */ -#define I2C_OAR1_ADD8_9 ((uint16_t)0x0300) /*!< Interface Address */ - -#define I2C_OAR1_ADD0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define I2C_OAR1_ADD1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define I2C_OAR1_ADD2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define I2C_OAR1_ADD3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define I2C_OAR1_ADD4 ((uint16_t)0x0010) /*!< Bit 4 */ -#define I2C_OAR1_ADD5 ((uint16_t)0x0020) /*!< Bit 5 */ -#define I2C_OAR1_ADD6 ((uint16_t)0x0040) /*!< Bit 6 */ -#define I2C_OAR1_ADD7 ((uint16_t)0x0080) /*!< Bit 7 */ -#define I2C_OAR1_ADD8 ((uint16_t)0x0100) /*!< Bit 8 */ -#define I2C_OAR1_ADD9 ((uint16_t)0x0200) /*!< Bit 9 */ - -#define I2C_OAR1_ADDMODE ((uint16_t)0x8000) /*!< Addressing Mode (Slave mode) */ - -/******************* Bit definition for I2C_OAR2 register *******************/ -#define I2C_OAR2_ENDUAL ((uint8_t)0x01) /*!< Dual addressing mode enable */ -#define I2C_OAR2_ADD2 ((uint8_t)0xFE) /*!< Interface address */ - -/******************** Bit definition for I2C_DR register ********************/ -#define I2C_DR_DR ((uint8_t)0xFF) /*!< 8-bit Data Register */ - -/******************* Bit definition for I2C_SR1 register ********************/ -#define I2C_SR1_SB ((uint16_t)0x0001) /*!< Start Bit (Master mode) */ -#define I2C_SR1_ADDR ((uint16_t)0x0002) /*!< Address sent (master mode)/matched (slave mode) */ -#define I2C_SR1_BTF ((uint16_t)0x0004) /*!< Byte Transfer Finished */ -#define I2C_SR1_ADD10 ((uint16_t)0x0008) /*!< 10-bit header sent (Master mode) */ -#define I2C_SR1_STOPF ((uint16_t)0x0010) /*!< Stop detection (Slave mode) */ -#define I2C_SR1_RXNE ((uint16_t)0x0040) /*!< Data Register not Empty (receivers) */ -#define I2C_SR1_TXE ((uint16_t)0x0080) /*!< Data Register Empty (transmitters) */ -#define I2C_SR1_BERR ((uint16_t)0x0100) /*!< Bus Error */ -#define I2C_SR1_ARLO ((uint16_t)0x0200) /*!< Arbitration Lost (master mode) */ -#define I2C_SR1_AF ((uint16_t)0x0400) /*!< Acknowledge Failure */ -#define I2C_SR1_OVR ((uint16_t)0x0800) /*!< Overrun/Underrun */ -#define I2C_SR1_PECERR ((uint16_t)0x1000) /*!< PEC Error in reception */ -#define I2C_SR1_TIMEOUT ((uint16_t)0x4000) /*!< Timeout or Tlow Error */ -#define I2C_SR1_SMBALERT ((uint16_t)0x8000) /*!< SMBus Alert */ - -/******************* Bit definition for I2C_SR2 register ********************/ -#define I2C_SR2_MSL ((uint16_t)0x0001) /*!< Master/Slave */ -#define I2C_SR2_BUSY ((uint16_t)0x0002) /*!< Bus Busy */ -#define I2C_SR2_TRA ((uint16_t)0x0004) /*!< Transmitter/Receiver */ -#define I2C_SR2_GENCALL ((uint16_t)0x0010) /*!< General Call Address (Slave mode) */ -#define I2C_SR2_SMBDEFAULT ((uint16_t)0x0020) /*!< SMBus Device Default Address (Slave mode) */ -#define I2C_SR2_SMBHOST ((uint16_t)0x0040) /*!< SMBus Host Header (Slave mode) */ -#define I2C_SR2_DUALF ((uint16_t)0x0080) /*!< Dual Flag (Slave mode) */ -#define I2C_SR2_PEC ((uint16_t)0xFF00) /*!< Packet Error Checking Register */ - -/******************* Bit definition for I2C_CCR register ********************/ -#define I2C_CCR_CCR ((uint16_t)0x0FFF) /*!< Clock Control Register in Fast/Standard mode (Master mode) */ -#define I2C_CCR_DUTY ((uint16_t)0x4000) /*!< Fast Mode Duty Cycle */ -#define I2C_CCR_FS ((uint16_t)0x8000) /*!< I2C Master Mode Selection */ - -/****************** Bit definition for I2C_TRISE register *******************/ -#define I2C_TRISE_TRISE ((uint8_t)0x3F) /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */ - -/******************************************************************************/ -/* */ -/* Universal Synchronous Asynchronous Receiver Transmitter */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for USART_SR register *******************/ -#define USART_SR_PE ((uint16_t)0x0001) /*!< Parity Error */ -#define USART_SR_FE ((uint16_t)0x0002) /*!< Framing Error */ -#define USART_SR_NE ((uint16_t)0x0004) /*!< Noise Error Flag */ -#define USART_SR_ORE ((uint16_t)0x0008) /*!< OverRun Error */ -#define USART_SR_IDLE ((uint16_t)0x0010) /*!< IDLE line detected */ -#define USART_SR_RXNE ((uint16_t)0x0020) /*!< Read Data Register Not Empty */ -#define USART_SR_TC ((uint16_t)0x0040) /*!< Transmission Complete */ -#define USART_SR_TXE ((uint16_t)0x0080) /*!< Transmit Data Register Empty */ -#define USART_SR_LBD ((uint16_t)0x0100) /*!< LIN Break Detection Flag */ -#define USART_SR_CTS ((uint16_t)0x0200) /*!< CTS Flag */ - -/******************* Bit definition for USART_DR register *******************/ -#define USART_DR_DR ((uint16_t)0x01FF) /*!< Data value */ - -/****************** Bit definition for USART_BRR register *******************/ -#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /*!< Fraction of USARTDIV */ -#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /*!< Mantissa of USARTDIV */ - -/****************** Bit definition for USART_CR1 register *******************/ -#define USART_CR1_SBK ((uint16_t)0x0001) /*!< Send Break */ -#define USART_CR1_RWU ((uint16_t)0x0002) /*!< Receiver wakeup */ -#define USART_CR1_RE ((uint16_t)0x0004) /*!< Receiver Enable */ -#define USART_CR1_TE ((uint16_t)0x0008) /*!< Transmitter Enable */ -#define USART_CR1_IDLEIE ((uint16_t)0x0010) /*!< IDLE Interrupt Enable */ -#define USART_CR1_RXNEIE ((uint16_t)0x0020) /*!< RXNE Interrupt Enable */ -#define USART_CR1_TCIE ((uint16_t)0x0040) /*!< Transmission Complete Interrupt Enable */ -#define USART_CR1_TXEIE ((uint16_t)0x0080) /*!< PE Interrupt Enable */ -#define USART_CR1_PEIE ((uint16_t)0x0100) /*!< PE Interrupt Enable */ -#define USART_CR1_PS ((uint16_t)0x0200) /*!< Parity Selection */ -#define USART_CR1_PCE ((uint16_t)0x0400) /*!< Parity Control Enable */ -#define USART_CR1_WAKE ((uint16_t)0x0800) /*!< Wakeup method */ -#define USART_CR1_M ((uint16_t)0x1000) /*!< Word length */ -#define USART_CR1_UE ((uint16_t)0x2000) /*!< USART Enable */ -#define USART_CR1_OVER8 ((uint16_t)0x8000) /*!< USART Oversmapling 8-bits */ - -/****************** Bit definition for USART_CR2 register *******************/ -#define USART_CR2_ADD ((uint16_t)0x000F) /*!< Address of the USART node */ -#define USART_CR2_LBDL ((uint16_t)0x0020) /*!< LIN Break Detection Length */ -#define USART_CR2_LBDIE ((uint16_t)0x0040) /*!< LIN Break Detection Interrupt Enable */ -#define USART_CR2_LBCL ((uint16_t)0x0100) /*!< Last Bit Clock pulse */ -#define USART_CR2_CPHA ((uint16_t)0x0200) /*!< Clock Phase */ -#define USART_CR2_CPOL ((uint16_t)0x0400) /*!< Clock Polarity */ -#define USART_CR2_CLKEN ((uint16_t)0x0800) /*!< Clock Enable */ - -#define USART_CR2_STOP ((uint16_t)0x3000) /*!< STOP[1:0] bits (STOP bits) */ -#define USART_CR2_STOP_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define USART_CR2_STOP_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define USART_CR2_LINEN ((uint16_t)0x4000) /*!< LIN mode enable */ - -/****************** Bit definition for USART_CR3 register *******************/ -#define USART_CR3_EIE ((uint16_t)0x0001) /*!< Error Interrupt Enable */ -#define USART_CR3_IREN ((uint16_t)0x0002) /*!< IrDA mode Enable */ -#define USART_CR3_IRLP ((uint16_t)0x0004) /*!< IrDA Low-Power */ -#define USART_CR3_HDSEL ((uint16_t)0x0008) /*!< Half-Duplex Selection */ -#define USART_CR3_NACK ((uint16_t)0x0010) /*!< Smartcard NACK enable */ -#define USART_CR3_SCEN ((uint16_t)0x0020) /*!< Smartcard mode enable */ -#define USART_CR3_DMAR ((uint16_t)0x0040) /*!< DMA Enable Receiver */ -#define USART_CR3_DMAT ((uint16_t)0x0080) /*!< DMA Enable Transmitter */ -#define USART_CR3_RTSE ((uint16_t)0x0100) /*!< RTS Enable */ -#define USART_CR3_CTSE ((uint16_t)0x0200) /*!< CTS Enable */ -#define USART_CR3_CTSIE ((uint16_t)0x0400) /*!< CTS Interrupt Enable */ -#define USART_CR3_ONEBIT ((uint16_t)0x0800) /*!< One Bit method */ - -/****************** Bit definition for USART_GTPR register ******************/ -#define USART_GTPR_PSC ((uint16_t)0x00FF) /*!< PSC[7:0] bits (Prescaler value) */ -#define USART_GTPR_PSC_0 ((uint16_t)0x0001) /*!< Bit 0 */ -#define USART_GTPR_PSC_1 ((uint16_t)0x0002) /*!< Bit 1 */ -#define USART_GTPR_PSC_2 ((uint16_t)0x0004) /*!< Bit 2 */ -#define USART_GTPR_PSC_3 ((uint16_t)0x0008) /*!< Bit 3 */ -#define USART_GTPR_PSC_4 ((uint16_t)0x0010) /*!< Bit 4 */ -#define USART_GTPR_PSC_5 ((uint16_t)0x0020) /*!< Bit 5 */ -#define USART_GTPR_PSC_6 ((uint16_t)0x0040) /*!< Bit 6 */ -#define USART_GTPR_PSC_7 ((uint16_t)0x0080) /*!< Bit 7 */ - -#define USART_GTPR_GT ((uint16_t)0xFF00) /*!< Guard time value */ - -/******************************************************************************/ -/* */ -/* Debug MCU */ -/* */ -/******************************************************************************/ - -/**************** Bit definition for DBGMCU_IDCODE register *****************/ -#define DBGMCU_IDCODE_DEV_ID ((uint32_t)0x00000FFF) /*!< Device Identifier */ - -#define DBGMCU_IDCODE_REV_ID ((uint32_t)0xFFFF0000) /*!< REV_ID[15:0] bits (Revision Identifier) */ -#define DBGMCU_IDCODE_REV_ID_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define DBGMCU_IDCODE_REV_ID_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define DBGMCU_IDCODE_REV_ID_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define DBGMCU_IDCODE_REV_ID_3 ((uint32_t)0x00080000) /*!< Bit 3 */ -#define DBGMCU_IDCODE_REV_ID_4 ((uint32_t)0x00100000) /*!< Bit 4 */ -#define DBGMCU_IDCODE_REV_ID_5 ((uint32_t)0x00200000) /*!< Bit 5 */ -#define DBGMCU_IDCODE_REV_ID_6 ((uint32_t)0x00400000) /*!< Bit 6 */ -#define DBGMCU_IDCODE_REV_ID_7 ((uint32_t)0x00800000) /*!< Bit 7 */ -#define DBGMCU_IDCODE_REV_ID_8 ((uint32_t)0x01000000) /*!< Bit 8 */ -#define DBGMCU_IDCODE_REV_ID_9 ((uint32_t)0x02000000) /*!< Bit 9 */ -#define DBGMCU_IDCODE_REV_ID_10 ((uint32_t)0x04000000) /*!< Bit 10 */ -#define DBGMCU_IDCODE_REV_ID_11 ((uint32_t)0x08000000) /*!< Bit 11 */ -#define DBGMCU_IDCODE_REV_ID_12 ((uint32_t)0x10000000) /*!< Bit 12 */ -#define DBGMCU_IDCODE_REV_ID_13 ((uint32_t)0x20000000) /*!< Bit 13 */ -#define DBGMCU_IDCODE_REV_ID_14 ((uint32_t)0x40000000) /*!< Bit 14 */ -#define DBGMCU_IDCODE_REV_ID_15 ((uint32_t)0x80000000) /*!< Bit 15 */ - -/****************** Bit definition for DBGMCU_CR register *******************/ -#define DBGMCU_CR_DBG_SLEEP ((uint32_t)0x00000001) /*!< Debug Sleep Mode */ -#define DBGMCU_CR_DBG_STOP ((uint32_t)0x00000002) /*!< Debug Stop Mode */ -#define DBGMCU_CR_DBG_STANDBY ((uint32_t)0x00000004) /*!< Debug Standby mode */ -#define DBGMCU_CR_TRACE_IOEN ((uint32_t)0x00000020) /*!< Trace Pin Assignment Control */ - -#define DBGMCU_CR_TRACE_MODE ((uint32_t)0x000000C0) /*!< TRACE_MODE[1:0] bits (Trace Pin Assignment Control) */ -#define DBGMCU_CR_TRACE_MODE_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define DBGMCU_CR_TRACE_MODE_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define DBGMCU_CR_DBG_IWDG_STOP ((uint32_t)0x00000100) /*!< Debug Independent Watchdog stopped when Core is halted */ -#define DBGMCU_CR_DBG_WWDG_STOP ((uint32_t)0x00000200) /*!< Debug Window Watchdog stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM1_STOP ((uint32_t)0x00000400) /*!< TIM1 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_TIM2_STOP ((uint32_t)0x00000800) /*!< TIM2 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_TIM3_STOP ((uint32_t)0x00001000) /*!< TIM3 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_TIM4_STOP ((uint32_t)0x00002000) /*!< TIM4 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_CAN1_STOP ((uint32_t)0x00004000) /*!< Debug CAN1 stopped when Core is halted */ -#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) /*!< SMBUS timeout mode stopped when Core is halted */ -#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) /*!< SMBUS timeout mode stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM8_STOP ((uint32_t)0x00020000) /*!< TIM8 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_TIM5_STOP ((uint32_t)0x00040000) /*!< TIM5 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_TIM6_STOP ((uint32_t)0x00080000) /*!< TIM6 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_TIM7_STOP ((uint32_t)0x00100000) /*!< TIM7 counter stopped when core is halted */ -#define DBGMCU_CR_DBG_CAN2_STOP ((uint32_t)0x00200000) /*!< Debug CAN2 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM15_STOP ((uint32_t)0x00400000) /*!< Debug TIM15 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM16_STOP ((uint32_t)0x00800000) /*!< Debug TIM16 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM17_STOP ((uint32_t)0x01000000) /*!< Debug TIM17 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM12_STOP ((uint32_t)0x02000000) /*!< Debug TIM12 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM13_STOP ((uint32_t)0x04000000) /*!< Debug TIM13 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM14_STOP ((uint32_t)0x08000000) /*!< Debug TIM14 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM9_STOP ((uint32_t)0x10000000) /*!< Debug TIM9 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM10_STOP ((uint32_t)0x20000000) /*!< Debug TIM10 stopped when Core is halted */ -#define DBGMCU_CR_DBG_TIM11_STOP ((uint32_t)0x40000000) /*!< Debug TIM11 stopped when Core is halted */ - -/******************************************************************************/ -/* */ -/* FLASH and Option Bytes Registers */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for FLASH_ACR register ******************/ -#define FLASH_ACR_LATENCY ((uint8_t)0x03) /*!< LATENCY[2:0] bits (Latency) */ -#define FLASH_ACR_LATENCY_0 ((uint8_t)0x00) /*!< Bit 0 */ -#define FLASH_ACR_LATENCY_1 ((uint8_t)0x01) /*!< Bit 0 */ -#define FLASH_ACR_LATENCY_2 ((uint8_t)0x02) /*!< Bit 1 */ - -#define FLASH_ACR_HLFCYA ((uint8_t)0x08) /*!< Flash Half Cycle Access Enable */ -#define FLASH_ACR_PRFTBE ((uint8_t)0x10) /*!< Prefetch Buffer Enable */ -#define FLASH_ACR_PRFTBS ((uint8_t)0x20) /*!< Prefetch Buffer Status */ - -/****************** Bit definition for FLASH_KEYR register ******************/ -#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /*!< FPEC Key */ - -/***************** Bit definition for FLASH_OPTKEYR register ****************/ -#define FLASH_OPTKEYR_OPTKEYR ((uint32_t)0xFFFFFFFF) /*!< Option Byte Key */ - -/****************** Bit definition for FLASH_SR register *******************/ -#define FLASH_SR_BSY ((uint8_t)0x01) /*!< Busy */ -#define FLASH_SR_PGERR ((uint8_t)0x04) /*!< Programming Error */ -#define FLASH_SR_WRPRTERR ((uint8_t)0x10) /*!< Write Protection Error */ -#define FLASH_SR_EOP ((uint8_t)0x20) /*!< End of operation */ - -/******************* Bit definition for FLASH_CR register *******************/ -#define FLASH_CR_PG ((uint16_t)0x0001) /*!< Programming */ -#define FLASH_CR_PER ((uint16_t)0x0002) /*!< Page Erase */ -#define FLASH_CR_MER ((uint16_t)0x0004) /*!< Mass Erase */ -#define FLASH_CR_OPTPG ((uint16_t)0x0010) /*!< Option Byte Programming */ -#define FLASH_CR_OPTER ((uint16_t)0x0020) /*!< Option Byte Erase */ -#define FLASH_CR_STRT ((uint16_t)0x0040) /*!< Start */ -#define FLASH_CR_LOCK ((uint16_t)0x0080) /*!< Lock */ -#define FLASH_CR_OPTWRE ((uint16_t)0x0200) /*!< Option Bytes Write Enable */ -#define FLASH_CR_ERRIE ((uint16_t)0x0400) /*!< Error Interrupt Enable */ -#define FLASH_CR_EOPIE ((uint16_t)0x1000) /*!< End of operation interrupt enable */ - -/******************* Bit definition for FLASH_AR register *******************/ -#define FLASH_AR_FAR ((uint32_t)0xFFFFFFFF) /*!< Flash Address */ - -/****************** Bit definition for FLASH_OBR register *******************/ -#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /*!< Option Byte Error */ -#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /*!< Read protection */ - -#define FLASH_OBR_USER ((uint16_t)0x03FC) /*!< User Option Bytes */ -#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /*!< WDG_SW */ -#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /*!< nRST_STOP */ -#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /*!< nRST_STDBY */ -#define FLASH_OBR_BFB2 ((uint16_t)0x0020) /*!< BFB2 */ - -/****************** Bit definition for FLASH_WRPR register ******************/ -#define FLASH_WRPR_WRP ((uint32_t)0xFFFFFFFF) /*!< Write Protect */ - -/*----------------------------------------------------------------------------*/ - -/****************** Bit definition for FLASH_RDP register *******************/ -#define FLASH_RDP_RDP ((uint32_t)0x000000FF) /*!< Read protection option byte */ -#define FLASH_RDP_nRDP ((uint32_t)0x0000FF00) /*!< Read protection complemented option byte */ - -/****************** Bit definition for FLASH_USER register ******************/ -#define FLASH_USER_USER ((uint32_t)0x00FF0000) /*!< User option byte */ -#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /*!< User complemented option byte */ - -/****************** Bit definition for FLASH_Data0 register *****************/ -#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /*!< User data storage option byte */ -#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /*!< User data storage complemented option byte */ - -/****************** Bit definition for FLASH_Data1 register *****************/ -#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /*!< User data storage option byte */ -#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /*!< User data storage complemented option byte */ - -/****************** Bit definition for FLASH_WRP0 register ******************/ -#define FLASH_WRP0_WRP0 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ -#define FLASH_WRP0_nWRP0 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ - -/****************** Bit definition for FLASH_WRP1 register ******************/ -#define FLASH_WRP1_WRP1 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ -#define FLASH_WRP1_nWRP1 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ - -/****************** Bit definition for FLASH_WRP2 register ******************/ -#define FLASH_WRP2_WRP2 ((uint32_t)0x000000FF) /*!< Flash memory write protection option bytes */ -#define FLASH_WRP2_nWRP2 ((uint32_t)0x0000FF00) /*!< Flash memory write protection complemented option bytes */ - -/****************** Bit definition for FLASH_WRP3 register ******************/ -#define FLASH_WRP3_WRP3 ((uint32_t)0x00FF0000) /*!< Flash memory write protection option bytes */ -#define FLASH_WRP3_nWRP3 ((uint32_t)0xFF000000) /*!< Flash memory write protection complemented option bytes */ - -#ifdef STM32F10X_CL -/******************************************************************************/ -/* Ethernet MAC Registers bits definitions */ -/******************************************************************************/ -/* Bit definition for Ethernet MAC Control Register register */ -#define ETH_MACCR_WD ((uint32_t)0x00800000) /* Watchdog disable */ -#define ETH_MACCR_JD ((uint32_t)0x00400000) /* Jabber disable */ -#define ETH_MACCR_IFG ((uint32_t)0x000E0000) /* Inter-frame gap */ - #define ETH_MACCR_IFG_96Bit ((uint32_t)0x00000000) /* Minimum IFG between frames during transmission is 96Bit */ - #define ETH_MACCR_IFG_88Bit ((uint32_t)0x00020000) /* Minimum IFG between frames during transmission is 88Bit */ - #define ETH_MACCR_IFG_80Bit ((uint32_t)0x00040000) /* Minimum IFG between frames during transmission is 80Bit */ - #define ETH_MACCR_IFG_72Bit ((uint32_t)0x00060000) /* Minimum IFG between frames during transmission is 72Bit */ - #define ETH_MACCR_IFG_64Bit ((uint32_t)0x00080000) /* Minimum IFG between frames during transmission is 64Bit */ - #define ETH_MACCR_IFG_56Bit ((uint32_t)0x000A0000) /* Minimum IFG between frames during transmission is 56Bit */ - #define ETH_MACCR_IFG_48Bit ((uint32_t)0x000C0000) /* Minimum IFG between frames during transmission is 48Bit */ - #define ETH_MACCR_IFG_40Bit ((uint32_t)0x000E0000) /* Minimum IFG between frames during transmission is 40Bit */ -#define ETH_MACCR_CSD ((uint32_t)0x00010000) /* Carrier sense disable (during transmission) */ -#define ETH_MACCR_FES ((uint32_t)0x00004000) /* Fast ethernet speed */ -#define ETH_MACCR_ROD ((uint32_t)0x00002000) /* Receive own disable */ -#define ETH_MACCR_LM ((uint32_t)0x00001000) /* loopback mode */ -#define ETH_MACCR_DM ((uint32_t)0x00000800) /* Duplex mode */ -#define ETH_MACCR_IPCO ((uint32_t)0x00000400) /* IP Checksum offload */ -#define ETH_MACCR_RD ((uint32_t)0x00000200) /* Retry disable */ -#define ETH_MACCR_APCS ((uint32_t)0x00000080) /* Automatic Pad/CRC stripping */ -#define ETH_MACCR_BL ((uint32_t)0x00000060) /* Back-off limit: random integer number (r) of slot time delays before rescheduling - a transmission attempt during retries after a collision: 0 =< r <2^k */ - #define ETH_MACCR_BL_10 ((uint32_t)0x00000000) /* k = min (n, 10) */ - #define ETH_MACCR_BL_8 ((uint32_t)0x00000020) /* k = min (n, 8) */ - #define ETH_MACCR_BL_4 ((uint32_t)0x00000040) /* k = min (n, 4) */ - #define ETH_MACCR_BL_1 ((uint32_t)0x00000060) /* k = min (n, 1) */ -#define ETH_MACCR_DC ((uint32_t)0x00000010) /* Defferal check */ -#define ETH_MACCR_TE ((uint32_t)0x00000008) /* Transmitter enable */ -#define ETH_MACCR_RE ((uint32_t)0x00000004) /* Receiver enable */ - -/* Bit definition for Ethernet MAC Frame Filter Register */ -#define ETH_MACFFR_RA ((uint32_t)0x80000000) /* Receive all */ -#define ETH_MACFFR_HPF ((uint32_t)0x00000400) /* Hash or perfect filter */ -#define ETH_MACFFR_SAF ((uint32_t)0x00000200) /* Source address filter enable */ -#define ETH_MACFFR_SAIF ((uint32_t)0x00000100) /* SA inverse filtering */ -#define ETH_MACFFR_PCF ((uint32_t)0x000000C0) /* Pass control frames: 3 cases */ - #define ETH_MACFFR_PCF_BlockAll ((uint32_t)0x00000040) /* MAC filters all control frames from reaching the application */ - #define ETH_MACFFR_PCF_ForwardAll ((uint32_t)0x00000080) /* MAC forwards all control frames to application even if they fail the Address Filter */ - #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /* MAC forwards control frames that pass the Address Filter. */ -#define ETH_MACFFR_BFD ((uint32_t)0x00000020) /* Broadcast frame disable */ -#define ETH_MACFFR_PAM ((uint32_t)0x00000010) /* Pass all mutlicast */ -#define ETH_MACFFR_DAIF ((uint32_t)0x00000008) /* DA Inverse filtering */ -#define ETH_MACFFR_HM ((uint32_t)0x00000004) /* Hash multicast */ -#define ETH_MACFFR_HU ((uint32_t)0x00000002) /* Hash unicast */ -#define ETH_MACFFR_PM ((uint32_t)0x00000001) /* Promiscuous mode */ - -/* Bit definition for Ethernet MAC Hash Table High Register */ -#define ETH_MACHTHR_HTH ((uint32_t)0xFFFFFFFF) /* Hash table high */ - -/* Bit definition for Ethernet MAC Hash Table Low Register */ -#define ETH_MACHTLR_HTL ((uint32_t)0xFFFFFFFF) /* Hash table low */ - -/* Bit definition for Ethernet MAC MII Address Register */ -#define ETH_MACMIIAR_PA ((uint32_t)0x0000F800) /* Physical layer address */ -#define ETH_MACMIIAR_MR ((uint32_t)0x000007C0) /* MII register in the selected PHY */ -#define ETH_MACMIIAR_CR ((uint32_t)0x0000001C) /* CR clock range: 6 cases */ - #define ETH_MACMIIAR_CR_Div42 ((uint32_t)0x00000000) /* HCLK:60-72 MHz; MDC clock= HCLK/42 */ - #define ETH_MACMIIAR_CR_Div16 ((uint32_t)0x00000008) /* HCLK:20-35 MHz; MDC clock= HCLK/16 */ - #define ETH_MACMIIAR_CR_Div26 ((uint32_t)0x0000000C) /* HCLK:35-60 MHz; MDC clock= HCLK/26 */ -#define ETH_MACMIIAR_MW ((uint32_t)0x00000002) /* MII write */ -#define ETH_MACMIIAR_MB ((uint32_t)0x00000001) /* MII busy */ - -/* Bit definition for Ethernet MAC MII Data Register */ -#define ETH_MACMIIDR_MD ((uint32_t)0x0000FFFF) /* MII data: read/write data from/to PHY */ - -/* Bit definition for Ethernet MAC Flow Control Register */ -#define ETH_MACFCR_PT ((uint32_t)0xFFFF0000) /* Pause time */ -#define ETH_MACFCR_ZQPD ((uint32_t)0x00000080) /* Zero-quanta pause disable */ -#define ETH_MACFCR_PLT ((uint32_t)0x00000030) /* Pause low threshold: 4 cases */ - #define ETH_MACFCR_PLT_Minus4 ((uint32_t)0x00000000) /* Pause time minus 4 slot times */ - #define ETH_MACFCR_PLT_Minus28 ((uint32_t)0x00000010) /* Pause time minus 28 slot times */ - #define ETH_MACFCR_PLT_Minus144 ((uint32_t)0x00000020) /* Pause time minus 144 slot times */ - #define ETH_MACFCR_PLT_Minus256 ((uint32_t)0x00000030) /* Pause time minus 256 slot times */ -#define ETH_MACFCR_UPFD ((uint32_t)0x00000008) /* Unicast pause frame detect */ -#define ETH_MACFCR_RFCE ((uint32_t)0x00000004) /* Receive flow control enable */ -#define ETH_MACFCR_TFCE ((uint32_t)0x00000002) /* Transmit flow control enable */ -#define ETH_MACFCR_FCBBPA ((uint32_t)0x00000001) /* Flow control busy/backpressure activate */ - -/* Bit definition for Ethernet MAC VLAN Tag Register */ -#define ETH_MACVLANTR_VLANTC ((uint32_t)0x00010000) /* 12-bit VLAN tag comparison */ -#define ETH_MACVLANTR_VLANTI ((uint32_t)0x0000FFFF) /* VLAN tag identifier (for receive frames) */ - -/* Bit definition for Ethernet MAC Remote Wake-UpFrame Filter Register */ -#define ETH_MACRWUFFR_D ((uint32_t)0xFFFFFFFF) /* Wake-up frame filter register data */ -/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers. - Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */ -/* Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask - Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask - Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask - Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask - Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command - - RSVD - Filter1 Command - RSVD - Filter0 Command - Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset - Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16 - Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */ - -/* Bit definition for Ethernet MAC PMT Control and Status Register */ -#define ETH_MACPMTCSR_WFFRPR ((uint32_t)0x80000000) /* Wake-Up Frame Filter Register Pointer Reset */ -#define ETH_MACPMTCSR_GU ((uint32_t)0x00000200) /* Global Unicast */ -#define ETH_MACPMTCSR_WFR ((uint32_t)0x00000040) /* Wake-Up Frame Received */ -#define ETH_MACPMTCSR_MPR ((uint32_t)0x00000020) /* Magic Packet Received */ -#define ETH_MACPMTCSR_WFE ((uint32_t)0x00000004) /* Wake-Up Frame Enable */ -#define ETH_MACPMTCSR_MPE ((uint32_t)0x00000002) /* Magic Packet Enable */ -#define ETH_MACPMTCSR_PD ((uint32_t)0x00000001) /* Power Down */ - -/* Bit definition for Ethernet MAC Status Register */ -#define ETH_MACSR_TSTS ((uint32_t)0x00000200) /* Time stamp trigger status */ -#define ETH_MACSR_MMCTS ((uint32_t)0x00000040) /* MMC transmit status */ -#define ETH_MACSR_MMMCRS ((uint32_t)0x00000020) /* MMC receive status */ -#define ETH_MACSR_MMCS ((uint32_t)0x00000010) /* MMC status */ -#define ETH_MACSR_PMTS ((uint32_t)0x00000008) /* PMT status */ - -/* Bit definition for Ethernet MAC Interrupt Mask Register */ -#define ETH_MACIMR_TSTIM ((uint32_t)0x00000200) /* Time stamp trigger interrupt mask */ -#define ETH_MACIMR_PMTIM ((uint32_t)0x00000008) /* PMT interrupt mask */ - -/* Bit definition for Ethernet MAC Address0 High Register */ -#define ETH_MACA0HR_MACA0H ((uint32_t)0x0000FFFF) /* MAC address0 high */ - -/* Bit definition for Ethernet MAC Address0 Low Register */ -#define ETH_MACA0LR_MACA0L ((uint32_t)0xFFFFFFFF) /* MAC address0 low */ - -/* Bit definition for Ethernet MAC Address1 High Register */ -#define ETH_MACA1HR_AE ((uint32_t)0x80000000) /* Address enable */ -#define ETH_MACA1HR_SA ((uint32_t)0x40000000) /* Source address */ -#define ETH_MACA1HR_MBC ((uint32_t)0x3F000000) /* Mask byte control: bits to mask for comparison of the MAC Address bytes */ - #define ETH_MACA1HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ - #define ETH_MACA1HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ - #define ETH_MACA1HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ - #define ETH_MACA1HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ - #define ETH_MACA1HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ - #define ETH_MACA1HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [7:0] */ -#define ETH_MACA1HR_MACA1H ((uint32_t)0x0000FFFF) /* MAC address1 high */ - -/* Bit definition for Ethernet MAC Address1 Low Register */ -#define ETH_MACA1LR_MACA1L ((uint32_t)0xFFFFFFFF) /* MAC address1 low */ - -/* Bit definition for Ethernet MAC Address2 High Register */ -#define ETH_MACA2HR_AE ((uint32_t)0x80000000) /* Address enable */ -#define ETH_MACA2HR_SA ((uint32_t)0x40000000) /* Source address */ -#define ETH_MACA2HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ - #define ETH_MACA2HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ - #define ETH_MACA2HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ - #define ETH_MACA2HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ - #define ETH_MACA2HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ - #define ETH_MACA2HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ - #define ETH_MACA2HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ -#define ETH_MACA2HR_MACA2H ((uint32_t)0x0000FFFF) /* MAC address1 high */ - -/* Bit definition for Ethernet MAC Address2 Low Register */ -#define ETH_MACA2LR_MACA2L ((uint32_t)0xFFFFFFFF) /* MAC address2 low */ - -/* Bit definition for Ethernet MAC Address3 High Register */ -#define ETH_MACA3HR_AE ((uint32_t)0x80000000) /* Address enable */ -#define ETH_MACA3HR_SA ((uint32_t)0x40000000) /* Source address */ -#define ETH_MACA3HR_MBC ((uint32_t)0x3F000000) /* Mask byte control */ - #define ETH_MACA3HR_MBC_HBits15_8 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ - #define ETH_MACA3HR_MBC_HBits7_0 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ - #define ETH_MACA3HR_MBC_LBits31_24 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ - #define ETH_MACA3HR_MBC_LBits23_16 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ - #define ETH_MACA3HR_MBC_LBits15_8 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ - #define ETH_MACA3HR_MBC_LBits7_0 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ -#define ETH_MACA3HR_MACA3H ((uint32_t)0x0000FFFF) /* MAC address3 high */ - -/* Bit definition for Ethernet MAC Address3 Low Register */ -#define ETH_MACA3LR_MACA3L ((uint32_t)0xFFFFFFFF) /* MAC address3 low */ - -/******************************************************************************/ -/* Ethernet MMC Registers bits definition */ -/******************************************************************************/ - -/* Bit definition for Ethernet MMC Contol Register */ -#define ETH_MMCCR_MCF ((uint32_t)0x00000008) /* MMC Counter Freeze */ -#define ETH_MMCCR_ROR ((uint32_t)0x00000004) /* Reset on Read */ -#define ETH_MMCCR_CSR ((uint32_t)0x00000002) /* Counter Stop Rollover */ -#define ETH_MMCCR_CR ((uint32_t)0x00000001) /* Counters Reset */ - -/* Bit definition for Ethernet MMC Receive Interrupt Register */ -#define ETH_MMCRIR_RGUFS ((uint32_t)0x00020000) /* Set when Rx good unicast frames counter reaches half the maximum value */ -#define ETH_MMCRIR_RFAES ((uint32_t)0x00000040) /* Set when Rx alignment error counter reaches half the maximum value */ -#define ETH_MMCRIR_RFCES ((uint32_t)0x00000020) /* Set when Rx crc error counter reaches half the maximum value */ - -/* Bit definition for Ethernet MMC Transmit Interrupt Register */ -#define ETH_MMCTIR_TGFS ((uint32_t)0x00200000) /* Set when Tx good frame count counter reaches half the maximum value */ -#define ETH_MMCTIR_TGFMSCS ((uint32_t)0x00008000) /* Set when Tx good multi col counter reaches half the maximum value */ -#define ETH_MMCTIR_TGFSCS ((uint32_t)0x00004000) /* Set when Tx good single col counter reaches half the maximum value */ - -/* Bit definition for Ethernet MMC Receive Interrupt Mask Register */ -#define ETH_MMCRIMR_RGUFM ((uint32_t)0x00020000) /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */ -#define ETH_MMCRIMR_RFAEM ((uint32_t)0x00000040) /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */ -#define ETH_MMCRIMR_RFCEM ((uint32_t)0x00000020) /* Mask the interrupt when Rx crc error counter reaches half the maximum value */ - -/* Bit definition for Ethernet MMC Transmit Interrupt Mask Register */ -#define ETH_MMCTIMR_TGFM ((uint32_t)0x00200000) /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */ -#define ETH_MMCTIMR_TGFMSCM ((uint32_t)0x00008000) /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */ -#define ETH_MMCTIMR_TGFSCM ((uint32_t)0x00004000) /* Mask the interrupt when Tx good single col counter reaches half the maximum value */ - -/* Bit definition for Ethernet MMC Transmitted Good Frames after Single Collision Counter Register */ -#define ETH_MMCTGFSCCR_TGFSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */ - -/* Bit definition for Ethernet MMC Transmitted Good Frames after More than a Single Collision Counter Register */ -#define ETH_MMCTGFMSCCR_TGFMSCC ((uint32_t)0xFFFFFFFF) /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */ - -/* Bit definition for Ethernet MMC Transmitted Good Frames Counter Register */ -#define ETH_MMCTGFCR_TGFC ((uint32_t)0xFFFFFFFF) /* Number of good frames transmitted. */ - -/* Bit definition for Ethernet MMC Received Frames with CRC Error Counter Register */ -#define ETH_MMCRFCECR_RFCEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with CRC error. */ - -/* Bit definition for Ethernet MMC Received Frames with Alignement Error Counter Register */ -#define ETH_MMCRFAECR_RFAEC ((uint32_t)0xFFFFFFFF) /* Number of frames received with alignment (dribble) error */ - -/* Bit definition for Ethernet MMC Received Good Unicast Frames Counter Register */ -#define ETH_MMCRGUFCR_RGUFC ((uint32_t)0xFFFFFFFF) /* Number of good unicast frames received. */ - -/******************************************************************************/ -/* Ethernet PTP Registers bits definition */ -/******************************************************************************/ - -/* Bit definition for Ethernet PTP Time Stamp Contol Register */ -#define ETH_PTPTSCR_TSARU ((uint32_t)0x00000020) /* Addend register update */ -#define ETH_PTPTSCR_TSITE ((uint32_t)0x00000010) /* Time stamp interrupt trigger enable */ -#define ETH_PTPTSCR_TSSTU ((uint32_t)0x00000008) /* Time stamp update */ -#define ETH_PTPTSCR_TSSTI ((uint32_t)0x00000004) /* Time stamp initialize */ -#define ETH_PTPTSCR_TSFCU ((uint32_t)0x00000002) /* Time stamp fine or coarse update */ -#define ETH_PTPTSCR_TSE ((uint32_t)0x00000001) /* Time stamp enable */ - -/* Bit definition for Ethernet PTP Sub-Second Increment Register */ -#define ETH_PTPSSIR_STSSI ((uint32_t)0x000000FF) /* System time Sub-second increment value */ - -/* Bit definition for Ethernet PTP Time Stamp High Register */ -#define ETH_PTPTSHR_STS ((uint32_t)0xFFFFFFFF) /* System Time second */ - -/* Bit definition for Ethernet PTP Time Stamp Low Register */ -#define ETH_PTPTSLR_STPNS ((uint32_t)0x80000000) /* System Time Positive or negative time */ -#define ETH_PTPTSLR_STSS ((uint32_t)0x7FFFFFFF) /* System Time sub-seconds */ - -/* Bit definition for Ethernet PTP Time Stamp High Update Register */ -#define ETH_PTPTSHUR_TSUS ((uint32_t)0xFFFFFFFF) /* Time stamp update seconds */ - -/* Bit definition for Ethernet PTP Time Stamp Low Update Register */ -#define ETH_PTPTSLUR_TSUPNS ((uint32_t)0x80000000) /* Time stamp update Positive or negative time */ -#define ETH_PTPTSLUR_TSUSS ((uint32_t)0x7FFFFFFF) /* Time stamp update sub-seconds */ - -/* Bit definition for Ethernet PTP Time Stamp Addend Register */ -#define ETH_PTPTSAR_TSA ((uint32_t)0xFFFFFFFF) /* Time stamp addend */ - -/* Bit definition for Ethernet PTP Target Time High Register */ -#define ETH_PTPTTHR_TTSH ((uint32_t)0xFFFFFFFF) /* Target time stamp high */ - -/* Bit definition for Ethernet PTP Target Time Low Register */ -#define ETH_PTPTTLR_TTSL ((uint32_t)0xFFFFFFFF) /* Target time stamp low */ - -/******************************************************************************/ -/* Ethernet DMA Registers bits definition */ -/******************************************************************************/ - -/* Bit definition for Ethernet DMA Bus Mode Register */ -#define ETH_DMABMR_AAB ((uint32_t)0x02000000) /* Address-Aligned beats */ -#define ETH_DMABMR_FPM ((uint32_t)0x01000000) /* 4xPBL mode */ -#define ETH_DMABMR_USP ((uint32_t)0x00800000) /* Use separate PBL */ -#define ETH_DMABMR_RDP ((uint32_t)0x007E0000) /* RxDMA PBL */ - #define ETH_DMABMR_RDP_1Beat ((uint32_t)0x00020000) /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ - #define ETH_DMABMR_RDP_2Beat ((uint32_t)0x00040000) /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ - #define ETH_DMABMR_RDP_4Beat ((uint32_t)0x00080000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ - #define ETH_DMABMR_RDP_8Beat ((uint32_t)0x00100000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ - #define ETH_DMABMR_RDP_16Beat ((uint32_t)0x00200000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ - #define ETH_DMABMR_RDP_32Beat ((uint32_t)0x00400000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ - #define ETH_DMABMR_RDP_4xPBL_4Beat ((uint32_t)0x01020000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ - #define ETH_DMABMR_RDP_4xPBL_8Beat ((uint32_t)0x01040000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ - #define ETH_DMABMR_RDP_4xPBL_16Beat ((uint32_t)0x01080000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ - #define ETH_DMABMR_RDP_4xPBL_32Beat ((uint32_t)0x01100000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ - #define ETH_DMABMR_RDP_4xPBL_64Beat ((uint32_t)0x01200000) /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ - #define ETH_DMABMR_RDP_4xPBL_128Beat ((uint32_t)0x01400000) /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ -#define ETH_DMABMR_FB ((uint32_t)0x00010000) /* Fixed Burst */ -#define ETH_DMABMR_RTPR ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ - #define ETH_DMABMR_RTPR_1_1 ((uint32_t)0x00000000) /* Rx Tx priority ratio */ - #define ETH_DMABMR_RTPR_2_1 ((uint32_t)0x00004000) /* Rx Tx priority ratio */ - #define ETH_DMABMR_RTPR_3_1 ((uint32_t)0x00008000) /* Rx Tx priority ratio */ - #define ETH_DMABMR_RTPR_4_1 ((uint32_t)0x0000C000) /* Rx Tx priority ratio */ -#define ETH_DMABMR_PBL ((uint32_t)0x00003F00) /* Programmable burst length */ - #define ETH_DMABMR_PBL_1Beat ((uint32_t)0x00000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ - #define ETH_DMABMR_PBL_2Beat ((uint32_t)0x00000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ - #define ETH_DMABMR_PBL_4Beat ((uint32_t)0x00000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ - #define ETH_DMABMR_PBL_8Beat ((uint32_t)0x00000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ - #define ETH_DMABMR_PBL_16Beat ((uint32_t)0x00001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ - #define ETH_DMABMR_PBL_32Beat ((uint32_t)0x00002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ - #define ETH_DMABMR_PBL_4xPBL_4Beat ((uint32_t)0x01000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ - #define ETH_DMABMR_PBL_4xPBL_8Beat ((uint32_t)0x01000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ - #define ETH_DMABMR_PBL_4xPBL_16Beat ((uint32_t)0x01000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ - #define ETH_DMABMR_PBL_4xPBL_32Beat ((uint32_t)0x01000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ - #define ETH_DMABMR_PBL_4xPBL_64Beat ((uint32_t)0x01001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ - #define ETH_DMABMR_PBL_4xPBL_128Beat ((uint32_t)0x01002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ -#define ETH_DMABMR_DSL ((uint32_t)0x0000007C) /* Descriptor Skip Length */ -#define ETH_DMABMR_DA ((uint32_t)0x00000002) /* DMA arbitration scheme */ -#define ETH_DMABMR_SR ((uint32_t)0x00000001) /* Software reset */ - -/* Bit definition for Ethernet DMA Transmit Poll Demand Register */ -#define ETH_DMATPDR_TPD ((uint32_t)0xFFFFFFFF) /* Transmit poll demand */ - -/* Bit definition for Ethernet DMA Receive Poll Demand Register */ -#define ETH_DMARPDR_RPD ((uint32_t)0xFFFFFFFF) /* Receive poll demand */ - -/* Bit definition for Ethernet DMA Receive Descriptor List Address Register */ -#define ETH_DMARDLAR_SRL ((uint32_t)0xFFFFFFFF) /* Start of receive list */ - -/* Bit definition for Ethernet DMA Transmit Descriptor List Address Register */ -#define ETH_DMATDLAR_STL ((uint32_t)0xFFFFFFFF) /* Start of transmit list */ - -/* Bit definition for Ethernet DMA Status Register */ -#define ETH_DMASR_TSTS ((uint32_t)0x20000000) /* Time-stamp trigger status */ -#define ETH_DMASR_PMTS ((uint32_t)0x10000000) /* PMT status */ -#define ETH_DMASR_MMCS ((uint32_t)0x08000000) /* MMC status */ -#define ETH_DMASR_EBS ((uint32_t)0x03800000) /* Error bits status */ - /* combination with EBS[2:0] for GetFlagStatus function */ - #define ETH_DMASR_EBS_DescAccess ((uint32_t)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ - #define ETH_DMASR_EBS_ReadTransf ((uint32_t)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ - #define ETH_DMASR_EBS_DataTransfTx ((uint32_t)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ -#define ETH_DMASR_TPS ((uint32_t)0x00700000) /* Transmit process state */ - #define ETH_DMASR_TPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ - #define ETH_DMASR_TPS_Fetching ((uint32_t)0x00100000) /* Running - fetching the Tx descriptor */ - #define ETH_DMASR_TPS_Waiting ((uint32_t)0x00200000) /* Running - waiting for status */ - #define ETH_DMASR_TPS_Reading ((uint32_t)0x00300000) /* Running - reading the data from host memory */ - #define ETH_DMASR_TPS_Suspended ((uint32_t)0x00600000) /* Suspended - Tx Descriptor unavailabe */ - #define ETH_DMASR_TPS_Closing ((uint32_t)0x00700000) /* Running - closing Rx descriptor */ -#define ETH_DMASR_RPS ((uint32_t)0x000E0000) /* Receive process state */ - #define ETH_DMASR_RPS_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ - #define ETH_DMASR_RPS_Fetching ((uint32_t)0x00020000) /* Running - fetching the Rx descriptor */ - #define ETH_DMASR_RPS_Waiting ((uint32_t)0x00060000) /* Running - waiting for packet */ - #define ETH_DMASR_RPS_Suspended ((uint32_t)0x00080000) /* Suspended - Rx Descriptor unavailable */ - #define ETH_DMASR_RPS_Closing ((uint32_t)0x000A0000) /* Running - closing descriptor */ - #define ETH_DMASR_RPS_Queuing ((uint32_t)0x000E0000) /* Running - queuing the recieve frame into host memory */ -#define ETH_DMASR_NIS ((uint32_t)0x00010000) /* Normal interrupt summary */ -#define ETH_DMASR_AIS ((uint32_t)0x00008000) /* Abnormal interrupt summary */ -#define ETH_DMASR_ERS ((uint32_t)0x00004000) /* Early receive status */ -#define ETH_DMASR_FBES ((uint32_t)0x00002000) /* Fatal bus error status */ -#define ETH_DMASR_ETS ((uint32_t)0x00000400) /* Early transmit status */ -#define ETH_DMASR_RWTS ((uint32_t)0x00000200) /* Receive watchdog timeout status */ -#define ETH_DMASR_RPSS ((uint32_t)0x00000100) /* Receive process stopped status */ -#define ETH_DMASR_RBUS ((uint32_t)0x00000080) /* Receive buffer unavailable status */ -#define ETH_DMASR_RS ((uint32_t)0x00000040) /* Receive status */ -#define ETH_DMASR_TUS ((uint32_t)0x00000020) /* Transmit underflow status */ -#define ETH_DMASR_ROS ((uint32_t)0x00000010) /* Receive overflow status */ -#define ETH_DMASR_TJTS ((uint32_t)0x00000008) /* Transmit jabber timeout status */ -#define ETH_DMASR_TBUS ((uint32_t)0x00000004) /* Transmit buffer unavailable status */ -#define ETH_DMASR_TPSS ((uint32_t)0x00000002) /* Transmit process stopped status */ -#define ETH_DMASR_TS ((uint32_t)0x00000001) /* Transmit status */ - -/* Bit definition for Ethernet DMA Operation Mode Register */ -#define ETH_DMAOMR_DTCEFD ((uint32_t)0x04000000) /* Disable Dropping of TCP/IP checksum error frames */ -#define ETH_DMAOMR_RSF ((uint32_t)0x02000000) /* Receive store and forward */ -#define ETH_DMAOMR_DFRF ((uint32_t)0x01000000) /* Disable flushing of received frames */ -#define ETH_DMAOMR_TSF ((uint32_t)0x00200000) /* Transmit store and forward */ -#define ETH_DMAOMR_FTF ((uint32_t)0x00100000) /* Flush transmit FIFO */ -#define ETH_DMAOMR_TTC ((uint32_t)0x0001C000) /* Transmit threshold control */ - #define ETH_DMAOMR_TTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Transmit FIFO is 64 Bytes */ - #define ETH_DMAOMR_TTC_128Bytes ((uint32_t)0x00004000) /* threshold level of the MTL Transmit FIFO is 128 Bytes */ - #define ETH_DMAOMR_TTC_192Bytes ((uint32_t)0x00008000) /* threshold level of the MTL Transmit FIFO is 192 Bytes */ - #define ETH_DMAOMR_TTC_256Bytes ((uint32_t)0x0000C000) /* threshold level of the MTL Transmit FIFO is 256 Bytes */ - #define ETH_DMAOMR_TTC_40Bytes ((uint32_t)0x00010000) /* threshold level of the MTL Transmit FIFO is 40 Bytes */ - #define ETH_DMAOMR_TTC_32Bytes ((uint32_t)0x00014000) /* threshold level of the MTL Transmit FIFO is 32 Bytes */ - #define ETH_DMAOMR_TTC_24Bytes ((uint32_t)0x00018000) /* threshold level of the MTL Transmit FIFO is 24 Bytes */ - #define ETH_DMAOMR_TTC_16Bytes ((uint32_t)0x0001C000) /* threshold level of the MTL Transmit FIFO is 16 Bytes */ -#define ETH_DMAOMR_ST ((uint32_t)0x00002000) /* Start/stop transmission command */ -#define ETH_DMAOMR_FEF ((uint32_t)0x00000080) /* Forward error frames */ -#define ETH_DMAOMR_FUGF ((uint32_t)0x00000040) /* Forward undersized good frames */ -#define ETH_DMAOMR_RTC ((uint32_t)0x00000018) /* receive threshold control */ - #define ETH_DMAOMR_RTC_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Receive FIFO is 64 Bytes */ - #define ETH_DMAOMR_RTC_32Bytes ((uint32_t)0x00000008) /* threshold level of the MTL Receive FIFO is 32 Bytes */ - #define ETH_DMAOMR_RTC_96Bytes ((uint32_t)0x00000010) /* threshold level of the MTL Receive FIFO is 96 Bytes */ - #define ETH_DMAOMR_RTC_128Bytes ((uint32_t)0x00000018) /* threshold level of the MTL Receive FIFO is 128 Bytes */ -#define ETH_DMAOMR_OSF ((uint32_t)0x00000004) /* operate on second frame */ -#define ETH_DMAOMR_SR ((uint32_t)0x00000002) /* Start/stop receive */ - -/* Bit definition for Ethernet DMA Interrupt Enable Register */ -#define ETH_DMAIER_NISE ((uint32_t)0x00010000) /* Normal interrupt summary enable */ -#define ETH_DMAIER_AISE ((uint32_t)0x00008000) /* Abnormal interrupt summary enable */ -#define ETH_DMAIER_ERIE ((uint32_t)0x00004000) /* Early receive interrupt enable */ -#define ETH_DMAIER_FBEIE ((uint32_t)0x00002000) /* Fatal bus error interrupt enable */ -#define ETH_DMAIER_ETIE ((uint32_t)0x00000400) /* Early transmit interrupt enable */ -#define ETH_DMAIER_RWTIE ((uint32_t)0x00000200) /* Receive watchdog timeout interrupt enable */ -#define ETH_DMAIER_RPSIE ((uint32_t)0x00000100) /* Receive process stopped interrupt enable */ -#define ETH_DMAIER_RBUIE ((uint32_t)0x00000080) /* Receive buffer unavailable interrupt enable */ -#define ETH_DMAIER_RIE ((uint32_t)0x00000040) /* Receive interrupt enable */ -#define ETH_DMAIER_TUIE ((uint32_t)0x00000020) /* Transmit Underflow interrupt enable */ -#define ETH_DMAIER_ROIE ((uint32_t)0x00000010) /* Receive Overflow interrupt enable */ -#define ETH_DMAIER_TJTIE ((uint32_t)0x00000008) /* Transmit jabber timeout interrupt enable */ -#define ETH_DMAIER_TBUIE ((uint32_t)0x00000004) /* Transmit buffer unavailable interrupt enable */ -#define ETH_DMAIER_TPSIE ((uint32_t)0x00000002) /* Transmit process stopped interrupt enable */ -#define ETH_DMAIER_TIE ((uint32_t)0x00000001) /* Transmit interrupt enable */ - -/* Bit definition for Ethernet DMA Missed Frame and Buffer Overflow Counter Register */ -#define ETH_DMAMFBOCR_OFOC ((uint32_t)0x10000000) /* Overflow bit for FIFO overflow counter */ -#define ETH_DMAMFBOCR_MFA ((uint32_t)0x0FFE0000) /* Number of frames missed by the application */ -#define ETH_DMAMFBOCR_OMFC ((uint32_t)0x00010000) /* Overflow bit for missed frame counter */ -#define ETH_DMAMFBOCR_MFC ((uint32_t)0x0000FFFF) /* Number of frames missed by the controller */ - -/* Bit definition for Ethernet DMA Current Host Transmit Descriptor Register */ -#define ETH_DMACHTDR_HTDAP ((uint32_t)0xFFFFFFFF) /* Host transmit descriptor address pointer */ - -/* Bit definition for Ethernet DMA Current Host Receive Descriptor Register */ -#define ETH_DMACHRDR_HRDAP ((uint32_t)0xFFFFFFFF) /* Host receive descriptor address pointer */ - -/* Bit definition for Ethernet DMA Current Host Transmit Buffer Address Register */ -#define ETH_DMACHTBAR_HTBAP ((uint32_t)0xFFFFFFFF) /* Host transmit buffer address pointer */ - -/* Bit definition for Ethernet DMA Current Host Receive Buffer Address Register */ -#define ETH_DMACHRBAR_HRBAP ((uint32_t)0xFFFFFFFF) /* Host receive buffer address pointer */ -#endif /* STM32F10X_CL */ - -/** - * @} - */ - - /** - * @} - */ - -#ifdef USE_STDPERIPH_DRIVER - #include "stm32f10x_conf.h" -#endif - -/** @addtogroup Exported_macro - * @{ - */ - -#define SET_BIT(REG, BIT) ((REG) |= (BIT)) - -#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) - -#define READ_BIT(REG, BIT) ((REG) & (BIT)) - -#define CLEAR_REG(REG) ((REG) = (0x0)) - -#define WRITE_REG(REG, VAL) ((REG) = (VAL)) - -#define READ_REG(REG) ((REG)) - -#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_H */ - -/** - * @} - */ - - /** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/os/hal/platforms/STM32F3xx/hal_lld.h b/os/hal/platforms/STM32F3xx/hal_lld.h deleted file mode 100644 index df9d144ef1..0000000000 --- a/os/hal/platforms/STM32F3xx/hal_lld.h +++ /dev/null @@ -1,997 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F3xx/hal_lld.h - * @brief STM32F3xx HAL subsystem low level driver header. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - STM32_LSECLK. - * - STM32_HSECLK. - * - STM32_HSE_BYPASS (optionally). - * . - * One of the following macros must also be defined: - * - STM32F30X for Analog & DSP devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "stm32.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS TRUE - -/** - * @name Platform identification - * @{ - */ -#define PLATFORM_NAME "STM32F30x Analog & DSP" -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Maximum system clock frequency. - */ -#define STM32_SYSCLK_MAX 72000000 - -/** - * @brief Maximum HSE clock frequency. - */ -#define STM32_HSECLK_MAX 32000000 - -/** - * @brief Minimum HSE clock frequency. - */ -#define STM32_HSECLK_MIN 1000000 - -/** - * @brief Maximum LSE clock frequency. - */ -#define STM32_LSECLK_MAX 1000000 - -/** - * @brief Minimum LSE clock frequency. - */ -#define STM32_LSECLK_MIN 32768 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MAX 24000000 - -/** - * @brief Minimum PLLs input clock frequency. - */ -#define STM32_PLLIN_MIN 1000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MAX 72000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MIN 16000000 - -/** - * @brief Maximum APB1 clock frequency. - */ -#define STM32_PCLK1_MAX 36000000 - -/** - * @brief Maximum APB2 clock frequency. - */ -#define STM32_PCLK2_MAX 72000000 - -/** - * @brief Maximum ADC clock frequency. - */ -#define STM32_ADCCLK_MAX 72000000 -/** @} */ - -/** - * @name Internal clock sources - * @{ - */ -#define STM32_HSICLK 8000000 /**< High speed internal clock. */ -#define STM32_LSICLK 40000 /**< Low speed internal clock. */ -/** @} */ - -/** - * @name PWR_CR register bits definitions - * @{ - */ -#define STM32_PLS_MASK (7 << 5) /**< PLS bits mask. */ -#define STM32_PLS_LEV0 (0 << 5) /**< PVD level 0. */ -#define STM32_PLS_LEV1 (1 << 5) /**< PVD level 1. */ -#define STM32_PLS_LEV2 (2 << 5) /**< PVD level 2. */ -#define STM32_PLS_LEV3 (3 << 5) /**< PVD level 3. */ -#define STM32_PLS_LEV4 (4 << 5) /**< PVD level 4. */ -#define STM32_PLS_LEV5 (5 << 5) /**< PVD level 5. */ -#define STM32_PLS_LEV6 (6 << 5) /**< PVD level 6. */ -#define STM32_PLS_LEV7 (7 << 5) /**< PVD level 7. */ -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE1_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE1_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE1_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE1_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE1_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_PPRE2_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE2_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE2_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE2_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE2_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI/2. */ -#define STM32_PLLSRC_HSE (1 << 16) /**< PLL clock source is - HSE/PREDIV. */ - -#define STM32_PLLXTPRE_DIV1 (0 << 17) /**< HSE divided by 1. */ -#define STM32_PLLXTPRE_DIV2 (1 << 17) /**< HSE divided by 2. */ - -#define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ -#define STM32_MCOSEL_LSI (2 << 24) /**< LSI clock on MCO pin. */ -#define STM32_MCOSEL_LSE (3 << 24) /**< LSE clock on MCO pin. */ -#define STM32_MCOSEL_SYSCLK (4 << 24) /**< SYSCLK on MCO pin. */ -#define STM32_MCOSEL_HSI (5 << 24) /**< HSI clock on MCO pin. */ -#define STM32_MCOSEL_HSE (6 << 24) /**< HSE clock on MCO pin. */ -#define STM32_MCOSEL_PLLDIV2 (7 << 24) /**< PLL/2 clock on MCO pin. */ -/** @} */ - -/** - * @name RCC_BDCR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 8) /**< RTC clock source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No clock. */ -#define STM32_RTCSEL_LSE (1 << 8) /**< LSE used as RTC clock. */ -#define STM32_RTCSEL_LSI (2 << 8) /**< LSI used as RTC clock. */ -#define STM32_RTCSEL_HSEDIV (3 << 8) /**< HSE divided by 32 used as - RTC clock. */ -/** @} */ - -/** - * @name RCC_CFGR2 register bits definitions - * @{ - */ -#define STM32_PREDIV_MASK (15 << 0) /**< PREDIV divisor mask. */ -#define STM32_PREDIV_DIV(n) (((n)-1) << 0)/**< PREDIV divisor. */ -#define STM32_ADC12PRES_MASK (31 << 4) /**< ADC12 clock source mask. */ -#define STM32_ADC12PRES_AHB (0 << 4) /**< ADC12 clock is AHB. */ -#define STM32_ADC12PRES_DIV1 (16 << 4) /**< ADC12 clock is PLL/1. */ -#define STM32_ADC12PRES_DIV2 (17 << 4) /**< ADC12 clock is PLL/2. */ -#define STM32_ADC12PRES_DIV4 (18 << 4) /**< ADC12 clock is PLL/4. */ -#define STM32_ADC12PRES_DIV6 (19 << 4) /**< ADC12 clock is PLL/6. */ -#define STM32_ADC12PRES_DIV8 (20 << 4) /**< ADC12 clock is PLL/8. */ -#define STM32_ADC12PRES_DIV10 (21 << 4) /**< ADC12 clock is PLL/10. */ -#define STM32_ADC12PRES_DIV12 (22 << 4) /**< ADC12 clock is PLL/12. */ -#define STM32_ADC12PRES_DIV16 (23 << 4) /**< ADC12 clock is PLL/16. */ -#define STM32_ADC12PRES_DIV32 (24 << 4) /**< ADC12 clock is PLL/32. */ -#define STM32_ADC12PRES_DIV64 (25 << 4) /**< ADC12 clock is PLL/64. */ -#define STM32_ADC12PRES_DIV128 (26 << 4) /**< ADC12 clock is PLL/128. */ -#define STM32_ADC12PRES_DIV256 (27 << 4) /**< ADC12 clock is PLL/256. */ -#define STM32_ADC34PRES_MASK (31 << 4) /**< ADC34 clock source mask. */ -#define STM32_ADC34PRES_AHB (0 << 4) /**< ADC34 clock is AHB. */ -#define STM32_ADC34PRES_DIV1 (16 << 4) /**< ADC34 clock is PLL/1. */ -#define STM32_ADC34PRES_DIV2 (17 << 4) /**< ADC34 clock is PLL/2. */ -#define STM32_ADC34PRES_DIV4 (18 << 4) /**< ADC34 clock is PLL/4. */ -#define STM32_ADC34PRES_DIV6 (19 << 4) /**< ADC34 clock is PLL/6. */ -#define STM32_ADC34PRES_DIV8 (20 << 4) /**< ADC34 clock is PLL/8. */ -#define STM32_ADC34PRES_DIV10 (21 << 4) /**< ADC34 clock is PLL/10. */ -#define STM32_ADC34PRES_DIV12 (22 << 4) /**< ADC34 clock is PLL/12. */ -#define STM32_ADC34PRES_DIV16 (23 << 4) /**< ADC34 clock is PLL/16. */ -#define STM32_ADC34PRES_DIV32 (24 << 4) /**< ADC34 clock is PLL/32. */ -#define STM32_ADC34PRES_DIV64 (25 << 4) /**< ADC34 clock is PLL/64. */ -#define STM32_ADC34PRES_DIV128 (26 << 4) /**< ADC34 clock is PLL/128. */ -#define STM32_ADC34PRES_DIV256 (27 << 4) /**< ADC34 clock is PLL/256. */ -/** @} */ - -/** - * @name RCC_CFGR3 register bits definitions - * @{ - */ -#define STM32_USART1SW_MASK (3 << 0) /**< USART1 clock source mask. */ -#define STM32_USART1SW_PCLK (0 << 0) /**< USART1 clock is PCLK. */ -#define STM32_USART1SW_SYSCLK (1 << 0) /**< USART1 clock is SYSCLK. */ -#define STM32_USART1SW_LSE (2 << 0) /**< USART1 clock is LSE. */ -#define STM32_USART1SW_HSI (3 << 0) /**< USART1 clock is HSI. */ -#define STM32_I2C1SW_MASK (1 << 4) /**< I2C clock source mask. */ -#define STM32_I2C1SW_HSI (0 << 4) /**< I2C clock is HSI. */ -#define STM32_I2C1SW_SYSCLK (1 << 4) /**< I2C clock is SYSCLK. */ -#define STM32_TIM1SW_MASK (1 << 8) /**< TIM1 clock source mask. */ -#define STM32_TIM1SW_PCLK2 (0 << 8) /**< TIM1 clock is PCLK2. */ -#define STM32_TIM1SW_PLLX2 (1 << 10) /**< TIM1 clock is PLL*2. */ -#define STM32_TIM8SW_MASK (1 << 10) /**< TIM8 clock source mask. */ -#define STM32_TIM8SW_PCLK2 (0 << 10) /**< TIM8 clock is PCLK2. */ -#define STM32_TIM8SW_PLLX2 (1 << 10) /**< TIM8 clock is PLL*2. */ -#define STM32_USART2SW_MASK (3 << 16) /**< USART2 clock source mask. */ -#define STM32_USART2SW_PCLK (0 << 16) /**< USART2 clock is PCLK. */ -#define STM32_USART2SW_SYSCLK (1 << 16) /**< USART2 clock is SYSCLK. */ -#define STM32_USART2SW_LSE (2 << 16) /**< USART2 clock is LSE. */ -#define STM32_USART2SW_HSI (3 << 16) /**< USART2 clock is HSI. */ -#define STM32_USART3SW_MASK (3 << 18) /**< USART3 clock source mask. */ -#define STM32_USART3SW_PCLK (0 << 18) /**< USART3 clock is PCLK. */ -#define STM32_USART3SW_SYSCLK (1 << 18) /**< USART3 clock is SYSCLK. */ -#define STM32_USART3SW_LSE (2 << 18) /**< USART3 clock is LSE. */ -#define STM32_USART3SW_HSI (3 << 18) /**< USART3 clock is HSI. */ -#define STM32_UART4SW_MASK (3 << 20) /**< USART4 clock source mask. */ -#define STM32_UART4SW_PCLK (0 << 20) /**< USART4 clock is PCLK. */ -#define STM32_UART4SW_SYSCLK (1 << 20) /**< USART4 clock is SYSCLK. */ -#define STM32_UART4SW_LSE (2 << 20) /**< USART4 clock is LSE. */ -#define STM32_UART4SW_HSI (3 << 20) /**< USART4 clock is HSI. */ -#define STM32_UART5SW_MASK (3 << 22) /**< USART5 clock source mask. */ -#define STM32_UART5SW_PCLK (0 << 22) /**< USART5 clock is PCLK. */ -#define STM32_UART5SW_SYSCLK (1 << 22) /**< USART5 clock is SYSCLK. */ -#define STM32_UART5SW_LSE (2 << 22) /**< USART5 clock is LSE. */ -#define STM32_UART5SW_HSI (3 << 22) /**< USART5 clock is HSI. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name STM32F30x capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_ADC1_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 1)) -#define STM32_ADC1_DMA_CHN 0x00000000 - -#define STM32_HAS_ADC2 TRUE -#define STM32_ADC2_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 1) | \ - STM32_DMA_STREAM_ID_MSK(2, 3)) -#define STM32_ADC2_DMA_CHN 0x00000000 - -#define STM32_HAS_ADC3 TRUE -#define STM32_ADC3_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_ADC3_DMA_CHN 0x00000000 - -#define STM32_HAS_ADC4 TRUE -#define STM32_ADC4_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 2) | \ - STM32_DMA_STREAM_ID_MSK(2, 4)) -#define STM32_ADC4_DMA_CHN 0x00000000 - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 14 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 TRUE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 36 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF TRUE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH FALSE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTC_HAS_SUBSECONDS TRUE -#define STM32_RTC_IS_CALENDAR TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO FALSE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 TRUE -#define STM32_SPI3_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 1) -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(2, 2) -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 TRUE -#define STM32_HAS_TIM9 FALSE -#define STM32_HAS_TIM10 FALSE -#define STM32_HAS_TIM11 FALSE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 TRUE -#define STM32_HAS_TIM16 TRUE -#define STM32_HAS_TIM17 TRUE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 3)) -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB TRUE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Disables the PWR/RCC initialization in the HAL. - */ -#if !defined(STM32_NO_INIT) || defined(__DOXYGEN__) -#define STM32_NO_INIT FALSE -#endif - -/** - * @brief Enables or disables the programmable voltage detector. - */ -#if !defined(STM32_PVD_ENABLE) || defined(__DOXYGEN__) -#define STM32_PVD_ENABLE FALSE -#endif - -/** - * @brief Sets voltage level for programmable voltage detector. - */ -#if !defined(STM32_PLS) || defined(__DOXYGEN__) -#define STM32_PLS STM32_PLS_LEV0 -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM32_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSI_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSE_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSE clock source. - */ -#if !defined(STM32_LSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSE_ENABLED FALSE -#endif - -/** - * @brief Main clock source selection. - * @note If the selected clock source is not the PLL then the PLL is not - * initialized and started. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -/** - * @brief Clock source for the PLL. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSE -#endif - -/** - * @brief Crystal PLL pre-divider. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PREDIV) || defined(__DOXYGEN__) -#define STM32_PREDIV STM32_PREDIV_DIV(1) -#endif - -/** - * @brief PLL multiplier value. - * @note The allowed range is 2...16. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLMUL_VALUE 8 -#endif - -/** - * @brief AHB prescaler value. - * @note The default value is calculated for a 72MHz system clock from - * a 8MHz crystal using the PLL. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE1) || defined(__DOXYGEN__) -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#endif - -/** - * @brief APB2 prescaler value. - */ -#if !defined(STM32_PPRE2) || defined(__DOXYGEN__) -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#endif - -/** - * @brief MCO pin setting. - */ -#if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#endif - -/** - * @brief ADC12 prescaler value. - */ -#if !defined(STM32_ADC12PRES) || defined(__DOXYGEN__) -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#endif - -/** - * @brief ADC34 prescaler value. - */ -#if !defined(STM32_ADC34PRES) || defined(__DOXYGEN__) -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#endif - -/** - * @brief I2C1 clock source. - */ -#if !defined(STM32_I2C1SW) || defined(__DOXYGEN__) -#define STM32_I2C1SW STM32_I2C1SW_HSI -#endif - -/** - * @brief USART1 clock source. - */ -#if !defined(STM32_USART1SW) || defined(__DOXYGEN__) -#define STM32_USART1SW STM32_USART1SW_PCLK -#endif - -/** - * @brief RTC clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_LSI -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Configuration-related checks. - */ -#if !defined(STM32F0xx_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F0xx_MCUCONF not defined" -#endif - -/* - * HSI related checks. - */ -#if STM32_HSI_ENABLED -#else /* !STM32_HSI_ENABLED */ - -#if STM32_SW == STM32_SW_HSI -#error "HSI not enabled, required by STM32_SW" -#endif - -#if STM32_CECSW == STM32_CECSW_HSI -#error "HSI not enabled, required by STM32_CECSW" -#endif - -#if STM32_I2C1SW == STM32_I2C1SW_HSI -#error "HSI not enabled, required by STM32_I2C1SW" -#endif - -#if STM32_USART1SW == STM32_USART1SW_HSI -#error "HSI not enabled, required by STM32_USART1SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCOSEL" -#endif - -#endif /* !STM32_HSI_ENABLED */ - -/* - * HSI14 related checks. - */ -#if STM32_HSI14_ENABLED -#else /* !STM32_HSI14_ENABLED */ - -#if STM32_MCOSEL == STM32_MCOSEL_HSI14 -#error "HSI14 not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_ADCSW == STM32_ADCSW_HSI14 -#error "HSI14 not enabled, required by STM32_ADCSW" -#endif - -#endif /* !STM32_HSI14_ENABLED */ - -/* - * HSE related checks. - */ -#if STM32_HSE_ENABLED - -#if STM32_HSECLK == 0 -#error "HSE frequency not defined" -#elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" -#endif - -#else /* !STM32_HSE_ENABLED */ - -#if STM32_SW == STM32_SW_HSE -#error "HSE not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE) -#error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) -#error "HSE not enabled, required by STM32_MCOSEL" -#endif - -#if STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#error "HSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_HSE_ENABLED */ - -/* - * LSI related checks. - */ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSI -#error "LSI not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSI_ENABLED */ - -/* - * LSE related checks. - */ -#if STM32_LSE_ENABLED - -#if (STM32_LSECLK == 0) -#error "LSE frequency not defined" -#endif - -#if STM32_CECSW == STM32_CECSW_LSE -#error "LSE not enabled, required by STM32_CECSW" -#endif - -#if STM32_USART1SW == STM32_USART1SW_LSE -#error "LSE not enabled, required by STM32_USART1SW" -#endif - -#if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) -#error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" -#endif - -#else /* !STM32_LSE_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSE -#error "LSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSE_ENABLED */ - -/* PLL activation conditions.*/ -#if (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLLDIV2) || \ - defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLL TRUE -#else -#define STM32_ACTIVATE_PLL FALSE -#endif - -/* HSE prescaler setting check.*/ -#if (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV1) && \ - (STM32_PLLXTPRE != STM32_PLLXTPRE_DIV2) -#error "invalid STM32_PLLXTPRE value specified" -#endif - -/** - * @brief PLLMUL field. - */ -#if ((STM32_PLLMUL_VALUE >= 2) && (STM32_PLLMUL_VALUE <= 16)) || \ - defined(__DOXYGEN__) -#define STM32_PLLMUL ((STM32_PLLMUL_VALUE - 2) << 18) -#else -#error "invalid STM32_PLLMUL_VALUE value specified" -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) -#if STM32_PLLXTPRE == STM32_PLLXTPRE_DIV1 -#define STM32_PLLCLKIN (STM32_HSECLK / 1) -#else -#define STM32_PLLCLKIN (STM32_HSECLK / 2) -#endif -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN (STM32_HSICLK / 2) -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* PLL input frequency range check.*/ -#if (STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX) -#error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) - -/* PLL output frequency range check.*/ -#if (STM32_PLLCLKOUT < STM32_PLLOUT_MIN) || (STM32_PLLCLKOUT > STM32_PLLOUT_MAX) -#error "STM32_PLLCLKOUT outside acceptable range (STM32_PLLOUT_MIN...STM32_PLLOUT_MAX)" -#endif - -/** - * @brief System clock source. - */ -#if (STM32_SW == STM32_SW_PLL) || defined(__DOXYGEN__) -#define STM32_SYSCLK STM32_PLLCLKOUT -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#else -#error "invalid STM32_SYSCLK_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* AHB frequency check.*/ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB frequency. - */ -#if (STM32_PPRE == STM32_PPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK (STM32_HCLK / 1) -#elif STM32_PPRE == STM32_PPRE_DIV2 -#define STM32_PCLK (STM32_HCLK / 2) -#elif STM32_PPRE == STM32_PPRE_DIV4 -#define STM32_PCLK (STM32_HCLK / 4) -#elif STM32_PPRE == STM32_PPRE_DIV8 -#define STM32_PCLK (STM32_HCLK / 8) -#elif STM32_PPRE == STM32_PPRE_DIV16 -#define STM32_PCLK (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE value specified" -#endif - -/* APB frequency check.*/ -#if STM32_PCLK > STM32_PCLK_MAX -#error "STM32_PCLK exceeding maximum frequency (STM32_PCLK_MAX)" -#endif - -/** - * @brief RTC clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_LSE) || defined(__DOXYGEN__) -#define STM32_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM32_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM32_RTCCLK (STM32_HSECLK / 32) -#elif STM32_RTCSEL == STM32_RTCSEL_NOCLOCK -#define STM32_RTCCLK 0 -#else -#error "invalid source selected for RTC clock" -#endif - -/** - * @brief ADC frequency. - */ -#if STM32_ADCSW == STM32_ADCSW_HSI14 -#define STM32_ADCCLK STM32_HSI14CLK -#elif STM32_ADCSW == STM32_ADCSW_PCLK -#if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__) -#define STM32_ADCCLK (STM32_PCLK / 2) -#elif STM32_ADCPRE == STM32_ADCPRE_DIV4 -#define STM32_ADCCLK (STM32_PCLK / 4) -#else -#error "invalid STM32_ADCPRE value specified" -#endif -#else -#error "invalid source selected for ADC clock" -#endif - -/* ADC frequency check.*/ -#if STM32_ADCCLK > STM32_ADCCLK_MAX -#error "STM32_ADCCLK exceeding maximum frequency (STM32_ADCCLK_MAX)" -#endif - -/** - * @brief CEC frequency. - */ -#if STM32_CECSW == STM32_CECSW_HSI -#define STM32_CECCLK STM32_HSICLK -#elif STM32_CECSW == STM32_CECSW_LSE -#define STM32_CECCLK STM32_LSECLK -#else -#error "invalid source selected for CEC clock" -#endif - -/** - * @brief I2C1 frequency. - */ -#if STM32_I2CSW == STM32_I2C1SW_HSI -#define STM32_I2C1CLK STM32_HSICLK -#elif STM32_I2CSW == STM32_I2C1SW_SYSCLK -#define STM32_I2C1CLK STM32_SYSCLK -#else -#error "invalid source selected for I2C1 clock" -#endif - -/** - * @brief USART1 frequency. - */ -#if STM32_USART1SW == STM32_USART1SW_PCLK -#define STM32_USART1CLK STM32_PCLK -#elif STM32_USART1SW == STM32_USART1SW_SYSCLK -#define STM32_USART1CLK STM32_SYSCLK -#elif STM32_USART1SW == STM32_USART1SW_LSECLK -#define STM32_USART1CLK STM32_LSECLK -#elif STM32_USART1SW == STM32_USART1SW_HSICLK -#define STM32_USART1CLK STM32_HSICLK -#else -#error "invalid source selected for USART1 clock" -#endif - -/** - * @brief Timers clock. - */ -#if (STM32_PPRE == STM32_PPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK * 1) -#define STM32_TIMCLK2 (STM32_PCLK * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK * 2) -#define STM32_TIMCLK2 (STM32_PCLK * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= 24000000) || defined(__DOXYGEN__) -#define STM32_FLASHBITS 0x00000010 -#else -#define STM32_FLASHBITS 0x00000011 -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* STM32 ISR, DMA and RCC helpers.*/ -#include "stm32_isr.h" -#include "stm32_dma.h" -#include "stm32_rcc.h" - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void stm32_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F3xx/platform.mk b/os/hal/platforms/STM32F3xx/platform.mk deleted file mode 100644 index 77418721a1..0000000000 --- a/os/hal/platforms/STM32F3xx/platform.mk +++ /dev/null @@ -1,9 +0,0 @@ -# List of all the STM32F3xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F3xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2/pal_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F3xx \ - ${CHIBIOS}/os/hal/platforms/STM32 \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2 diff --git a/os/hal/platforms/STM32F3xx/stm32f30x.h b/os/hal/platforms/STM32F3xx/stm32f30x.h deleted file mode 100644 index 8ca340f485..0000000000 --- a/os/hal/platforms/STM32F3xx/stm32f30x.h +++ /dev/null @@ -1,6206 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f30x.h - * @author MCD Application Team - * @version V1.0.0 - * @date 04-September-2012 - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer Header File. - * This file contains all the peripheral registers definitions, bits - * definitions and memory mapping for STM32F30x devices. - * - * The file is the unique include file that the application programmer - * is using in the C source code, usually in main.c. This file contains: - * - Configuration section that allows to select: - * - The device used in the target application - * - To use or not the peripheral’s drivers in application code(i.e. - * code will be based on direct access to peripheral’s registers - * rather than drivers API), this option is controlled by - * "#define USE_STDPERIPH_DRIVER" - * - To change few application-specific parameters such as the HSE - * crystal frequency - * - Data structures and the address mapping for all peripherals - * - Peripheral registers declarations and bits definition - * - Macros to access peripheral registers hardware - * - ****************************************************************************** - * @attention - * - *

    © COPYRIGHT 2012 STMicroelectronics

    - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f30x - * @{ - */ - -#ifndef __STM32F30x_H -#define __STM32F30x_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ - -#if !defined (STM32F30X) - #define STM32F30X -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ - -#if !defined (STM32F30X) - #error "Please select first the target STM32F30X device used in your application (in stm32f30x.h file)" -#endif - -#if !defined (USE_STDPERIPH_DRIVER) -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif /* USE_STDPERIPH_DRIVER */ - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup - Timeout value - */ -#if !defined (HSI_STARTUP_TIMEOUT) - #define HSI_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSI start up */ -#endif /* HSI_STARTUP_TIMEOUT */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)8000000) -#endif /* HSI_VALUE */ /*!< Value of the Internal High Speed oscillator in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)40000) -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - - -/** - * @brief STM32F30x Standard Peripherals Library version number V1.0.0 - */ -#define __STM32F30X_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F30X_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32F30X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F30X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F30X_STDPERIPH_VERSION ( (__STM32F30X_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F30X_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F30X_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F30X_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F30X provide an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F30X uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1 /*!< STM32F30X provide an FPU */ - - -/** - * @brief STM32F30X Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum IRQn -{ -/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMPER_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI lines 17, 19 & 20 */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_TS_IRQn = 8, /*!< EXTI Line2 Interrupt and Touch Sense Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 Interrupt */ - DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 Interrupt */ - DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 Interrupt */ - DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 Interrupt */ - DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 Interrupt */ - DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 Interrupt */ - DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 Interrupt */ - ADC1_2_IRQn = 18, /*!< ADC1 & ADC2 Interrupts */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ - TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ - TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - USBWakeUp_IRQn = 42, /*!< USB Wakeup Interrupt */ - TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ - TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ - TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ - DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ - ADC4_IRQn = 61, /*!< ADC4 global Interrupt */ - COMP1_2_3_IRQn = 64, /*!< COMP1, COMP2 and COMP3 global Interrupt */ - COMP4_5_6_IRQn = 65, /*!< COMP5, COMP6 and COMP4 global Interrupt */ - COMP7_IRQn = 66, /*!< COMP7 global Interrupt */ - USB_HP_IRQn = 74, /*!< USB High Priority global Interrupt remap */ - USB_LP_IRQn = 75, /*!< USB Low Priority global Interrupt remap */ - USBWakeUp_RMP_IRQn = 76, /*!< USB Wakeup Interrupt remap */ - FPU_IRQn = 81 /*!< Floating point Interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -/* CHIBIOS FIX */ -/*#include "system_stm32f30x.h"*/ /* STM32F30x System Header */ -#include - -/** @addtogroup Exported_types - * @{ - */ -/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; /*!< Read Only */ -typedef const int16_t sc16; /*!< Read Only */ -typedef const int8_t sc8; /*!< Read Only */ - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; /*!< Read Only */ -typedef __I int16_t vsc16; /*!< Read Only */ -typedef __I int8_t vsc8; /*!< Read Only */ - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; /*!< Read Only */ -typedef const uint16_t uc16; /*!< Read Only */ -typedef const uint8_t uc8; /*!< Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; /*!< Read Only */ -typedef __I uint16_t vuc16; /*!< Read Only */ -typedef __I uint8_t vuc8; /*!< Read Only */ - -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; - -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t ISR; /*!< ADC Interrupt and Status Register, Address offset: 0x00 */ - __IO uint32_t IER; /*!< ADC Interrupt Enable Register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< ADC control register, Address offset: 0x08 */ - __IO uint32_t CFGR; /*!< ADC Configuration register, Address offset: 0x0C */ - uint32_t RESERVED0; /*!< Reserved, 0x010 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x14 */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x18 */ - uint32_t RESERVED1; /*!< Reserved, 0x01C */ - __IO uint32_t TR1; /*!< ADC watchdog threshold register 1, Address offset: 0x20 */ - __IO uint32_t TR2; /*!< ADC watchdog threshold register 2, Address offset: 0x24 */ - __IO uint32_t TR3; /*!< ADC watchdog threshold register 3, Address offset: 0x28 */ - uint32_t RESERVED2; /*!< Reserved, 0x02C */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x30 */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x34 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x38 */ - __IO uint32_t SQR4; /*!< ADC regular sequence register 4, Address offset: 0x3C */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x40 */ - uint32_t RESERVED3; /*!< Reserved, 0x044 */ - uint32_t RESERVED4; /*!< Reserved, 0x048 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x4C */ - uint32_t RESERVED5[4]; /*!< Reserved, 0x050 - 0x05C */ - __IO uint32_t OFR1; /*!< ADC offset register 1, Address offset: 0x60 */ - __IO uint32_t OFR2; /*!< ADC offset register 2, Address offset: 0x64 */ - __IO uint32_t OFR3; /*!< ADC offset register 3, Address offset: 0x68 */ - __IO uint32_t OFR4; /*!< ADC offset register 4, Address offset: 0x6C */ - uint32_t RESERVED6[4]; /*!< Reserved, 0x070 - 0x07C */ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x80 */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x84 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x88 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x8C */ - uint32_t RESERVED7[4]; /*!< Reserved, 0x090 - 0x09C */ - __IO uint32_t AWD2CR; /*!< ADC Analog Watchdog 2 Configuration Register, Address offset: 0xA0 */ - __IO uint32_t AWD3CR; /*!< ADC Analog Watchdog 3 Configuration Register, Address offset: 0xA4 */ - uint32_t RESERVED8; /*!< Reserved, 0x0A8 */ - uint32_t RESERVED9; /*!< Reserved, 0x0AC */ - __IO uint32_t DIFSEL; /*!< ADC Differential Mode Selection Register, Address offset: 0xB0 */ - __IO uint32_t CALFACT; /*!< ADC Calibration Factors, Address offset: 0xB4 */ - -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1/3 base address + 0x300 */ - uint32_t RESERVED; /*!< Reserved, ADC1/3 base address + 0x304 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1/3 base address + 0x308 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1/3 base address + 0x30C */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - - -/** - * @brief Analog Comparators - */ - -typedef struct -{ - __IO uint32_t CSR; /*!< Comparator control Status register, Address offset: 0x00 */ -} COMP_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ - uint32_t RESERVED2; /*!< Reserved, 0x0C */ - __IO uint32_t INIT; /*!< Initial CRC value register, Address offset: 0x10 */ - __IO uint32_t POL; /*!< CRC polynomial register, Address offset: 0x14 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CCR; /*!< DMA channel x configuration register */ - __IO uint32_t CNDTR; /*!< DMA channel x number of data register */ - __IO uint32_t CPAR; /*!< DMA channel x peripheral address register */ - __IO uint32_t CMAR; /*!< DMA channel x memory address register */ -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register, Address offset: 0x00 */ - __IO uint32_t IFCR; /*!< DMA interrupt clear flag register, Address offset: 0x04 */ -} DMA_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ - uint32_t RESERVED1; /*!< Reserved, 0x18 */ - uint32_t RESERVED2; /*!< Reserved, 0x1C */ - __IO uint32_t IMR2; /*!< EXTI Interrupt mask register, Address offset: 0x20 */ - __IO uint32_t EMR2; /*!< EXTI Event mask register, Address offset: 0x24 */ - __IO uint32_t RTSR2; /*!< EXTI Rising trigger selection register, Address offset: 0x28 */ - __IO uint32_t FTSR2; /*!< EXTI Falling trigger selection register, Address offset: 0x2C */ - __IO uint32_t SWIER2; /*!< EXTI Software interrupt event register, Address offset: 0x30 */ - __IO uint32_t PR2; /*!< EXTI Pending register, Address offset: 0x34 */ -}EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t AR; /*!< FLASH address register, Address offset: 0x14 */ - uint32_t RESERVED; /*!< Reserved, 0x18 */ - __IO uint32_t OBR; /*!< FLASH Option byte register, Address offset: 0x1C */ - __IO uint32_t WRPR; /*!< FLASH Write register, Address offset: 0x20 */ - -} FLASH_TypeDef; - -/** - * @brief Option Bytes Registers - */ -typedef struct -{ - __IO uint16_t RDP; /*!. -*/ - -/** - * @file STM32F4xx/adc_lld.c - * @brief STM32F4xx/STM32F2xx ADC subsystem low level driver source. - * - * @addtogroup ADC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -#define ADC1_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_ADC_ADC1_DMA_STREAM, STM32_ADC1_DMA_CHN) - -#define ADC2_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_ADC_ADC2_DMA_STREAM, STM32_ADC2_DMA_CHN) - -#define ADC3_DMA_CHANNEL \ - STM32_DMA_GETCHANNEL(STM32_ADC_ADC3_DMA_STREAM, STM32_ADC3_DMA_CHN) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief ADC1 driver identifier.*/ -#if STM32_ADC_USE_ADC1 || defined(__DOXYGEN__) -ADCDriver ADCD1; -#endif - -/** @brief ADC2 driver identifier.*/ -#if STM32_ADC_USE_ADC2 || defined(__DOXYGEN__) -ADCDriver ADCD2; -#endif - -/** @brief ADC3 driver identifier.*/ -#if STM32_ADC_USE_ADC3 || defined(__DOXYGEN__) -ADCDriver ADCD3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief ADC DMA ISR service routine. - * - * @param[in] adcp pointer to the @p ADCDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void adc_lld_serve_rx_interrupt(ADCDriver *adcp, uint32_t flags) { - - /* DMA errors handling.*/ - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - /* DMA, this could help only if the DMA tries to access an unmapped - address space or violates alignment rules.*/ - _adc_isr_error_code(adcp, ADC_ERR_DMAFAILURE); - } - else { - /* It is possible that the conversion group has already be reset by the - ADC error handler, in this case this interrupt is spurious.*/ - if (adcp->grpp != NULL) { - if ((flags & STM32_DMA_ISR_HTIF) != 0) { - /* Half transfer processing.*/ - _adc_isr_half_code(adcp); - } - if ((flags & STM32_DMA_ISR_TCIF) != 0) { - /* Transfer complete processing.*/ - _adc_isr_full_code(adcp); - } - } - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 || STM32_ADC_USE_ADC2 || STM32_ADC_USE_ADC3 || \ - defined(__DOXYGEN__) -/** - * @brief ADC interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(ADC1_2_3_IRQHandler) { - uint32_t sr; - - CH_IRQ_PROLOGUE(); - -#if STM32_ADC_USE_ADC1 - sr = ADC1->SR; - ADC1->SR = 0; - /* Note, an overflow may occur after the conversion ended before the driver - is able to stop the ADC, this is why the DMA channel is checked too.*/ - if ((sr & ADC_SR_OVR) && (dmaStreamGetTransactionSize(ADCD1.dmastp) > 0)) { - /* ADC overflow condition, this could happen only if the DMA is unable - to read data fast enough.*/ - if (ADCD1.grpp != NULL) - _adc_isr_error_code(&ADCD1, ADC_ERR_OVERFLOW); - } - /* TODO: Add here analog watchdog handling.*/ -#endif /* STM32_ADC_USE_ADC1 */ - -#if STM32_ADC_USE_ADC2 - sr = ADC2->SR; - ADC2->SR = 0; - /* Note, an overflow may occur after the conversion ended before the driver - is able to stop the ADC, this is why the DMA channel is checked too.*/ - if ((sr & ADC_SR_OVR) && (dmaStreamGetTransactionSize(ADCD2.dmastp) > 0)) { - /* ADC overflow condition, this could happen only if the DMA is unable - to read data fast enough.*/ - if (ADCD2.grpp != NULL) - _adc_isr_error_code(&ADCD2, ADC_ERR_OVERFLOW); - } - /* TODO: Add here analog watchdog handling.*/ -#endif /* STM32_ADC_USE_ADC2 */ - -#if STM32_ADC_USE_ADC3 - sr = ADC3->SR; - ADC3->SR = 0; - /* Note, an overflow may occur after the conversion ended before the driver - is able to stop the ADC, this is why the DMA channel is checked too.*/ - if ((sr & ADC_SR_OVR) && (dmaStreamGetTransactionSize(ADCD3.dmastp) > 0)) { - /* ADC overflow condition, this could happen only if the DMA is unable - to read data fast enough.*/ - if (ADCD3.grpp != NULL) - _adc_isr_error_code(&ADCD3, ADC_ERR_OVERFLOW); - } - /* TODO: Add here analog watchdog handling.*/ -#endif /* STM32_ADC_USE_ADC3 */ - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level ADC driver initialization. - * - * @notapi - */ -void adc_lld_init(void) { - -#if STM32_ADC_USE_ADC1 - /* Driver initialization.*/ - adcObjectInit(&ADCD1); - ADCD1.adc = ADC1; - ADCD1.dmastp = STM32_DMA_STREAM(STM32_ADC_ADC1_DMA_STREAM); - ADCD1.dmamode = STM32_DMA_CR_CHSEL(ADC1_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_ADC_ADC1_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PSIZE_HWORD | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; -#endif - -#if STM32_ADC_USE_ADC2 - /* Driver initialization.*/ - adcObjectInit(&ADCD2); - ADCD2.adc = ADC2; - ADCD2.dmastp = STM32_DMA_STREAM(STM32_ADC_ADC2_DMA_STREAM); - ADCD2.dmamode = STM32_DMA_CR_CHSEL(ADC2_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_ADC_ADC2_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PSIZE_HWORD | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; -#endif - -#if STM32_ADC_USE_ADC3 - /* Driver initialization.*/ - adcObjectInit(&ADCD3); - ADCD3.adc = ADC3; - ADCD3.dmastp = STM32_DMA_STREAM(STM32_ADC_ADC3_DMA_STREAM); - ADCD3.dmamode = STM32_DMA_CR_CHSEL(ADC3_DMA_CHANNEL) | - STM32_DMA_CR_PL(STM32_ADC_ADC3_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PSIZE_HWORD | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; -#endif - - /* The shared vector is initialized on driver initialization and never - disabled.*/ - nvicEnableVector(ADC_IRQn, CORTEX_PRIORITY_MASK(STM32_ADC_IRQ_PRIORITY)); -} - -/** - * @brief Configures and activates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start(ADCDriver *adcp) { - - /* If in stopped state then enables the ADC and DMA clocks.*/ - if (adcp->state == ADC_STOP) { -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) { - bool_t b; - b = dmaStreamAllocate(adcp->dmastp, - STM32_ADC_ADC1_DMA_IRQ_PRIORITY, - (stm32_dmaisr_t)adc_lld_serve_rx_interrupt, - (void *)adcp); - chDbgAssert(!b, "adc_lld_start(), #1", "stream already allocated"); - dmaStreamSetPeripheral(adcp->dmastp, &ADC1->DR); - rccEnableADC1(FALSE); - } -#endif /* STM32_ADC_USE_ADC1 */ - -#if STM32_ADC_USE_ADC2 - if (&ADCD2 == adcp) { - bool_t b; - b = dmaStreamAllocate(adcp->dmastp, - STM32_ADC_ADC2_DMA_IRQ_PRIORITY, - (stm32_dmaisr_t)adc_lld_serve_rx_interrupt, - (void *)adcp); - chDbgAssert(!b, "adc_lld_start(), #2", "stream already allocated"); - dmaStreamSetPeripheral(adcp->dmastp, &ADC2->DR); - rccEnableADC2(FALSE); - } -#endif /* STM32_ADC_USE_ADC2 */ - -#if STM32_ADC_USE_ADC3 - if (&ADCD3 == adcp) { - bool_t b; - b = dmaStreamAllocate(adcp->dmastp, - STM32_ADC_ADC3_DMA_IRQ_PRIORITY, - (stm32_dmaisr_t)adc_lld_serve_rx_interrupt, - (void *)adcp); - chDbgAssert(!b, "adc_lld_start(), #3", "stream already allocated"); - dmaStreamSetPeripheral(adcp->dmastp, &ADC3->DR); - rccEnableADC3(FALSE); - } -#endif /* STM32_ADC_USE_ADC3 */ - - /* This is a common register but apparently it requires that at least one - of the ADCs is clocked in order to allow writing, see bug 3575297.*/ - ADC->CCR = STM32_ADC_ADCPRE << 16; - - /* ADC initial setup, starting the analog part here in order to reduce - the latency when starting a conversion.*/ - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - adcp->adc->CR2 = ADC_CR2_ADON; - } -} - -/** - * @brief Deactivates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop(ADCDriver *adcp) { - - /* If in ready state then disables the ADC clock.*/ - if (adcp->state == ADC_READY) { - dmaStreamRelease(adcp->dmastp); - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) - rccDisableADC1(FALSE); -#endif - -#if STM32_ADC_USE_ADC2 - if (&ADCD2 == adcp) - rccDisableADC2(FALSE); -#endif - -#if STM32_ADC_USE_ADC3 - if (&ADCD3 == adcp) - rccDisableADC3(FALSE); -#endif - } -} - -/** - * @brief Starts an ADC conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start_conversion(ADCDriver *adcp) { - uint32_t mode; - const ADCConversionGroup *grpp = adcp->grpp; - - /* DMA setup.*/ - mode = adcp->dmamode; - if (grpp->circular) { - mode |= STM32_DMA_CR_CIRC; - } - if (adcp->depth > 1) { - /* If the buffer depth is greater than one then the half transfer interrupt - interrupt is enabled in order to allows streaming processing.*/ - mode |= STM32_DMA_CR_HTIE; - } - dmaStreamSetMemory0(adcp->dmastp, adcp->samples); - dmaStreamSetTransactionSize(adcp->dmastp, (uint32_t)grpp->num_channels * - (uint32_t)adcp->depth); - dmaStreamSetMode(adcp->dmastp, mode); - dmaStreamEnable(adcp->dmastp); - - /* ADC setup.*/ - adcp->adc->SR = 0; - adcp->adc->SMPR1 = grpp->smpr1; - adcp->adc->SMPR2 = grpp->smpr2; - adcp->adc->SQR1 = grpp->sqr1; - adcp->adc->SQR2 = grpp->sqr2; - adcp->adc->SQR3 = grpp->sqr3; - - /* ADC configuration and start, the start is performed using the method - specified in the CR2 configuration, usually ADC_CR2_SWSTART.*/ - adcp->adc->CR1 = grpp->cr1 | ADC_CR1_OVRIE | ADC_CR1_SCAN; - if ((grpp->cr2 & ADC_CR2_SWSTART) != 0) - adcp->adc->CR2 = grpp->cr2 | ADC_CR2_CONT | ADC_CR2_DMA | - ADC_CR2_DDS | ADC_CR2_ADON; - else - adcp->adc->CR2 = grpp->cr2 | ADC_CR2_DMA | - ADC_CR2_DDS | ADC_CR2_ADON; -} - -/** - * @brief Stops an ongoing conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop_conversion(ADCDriver *adcp) { - - dmaStreamDisable(adcp->dmastp); - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - adcp->adc->CR2 = ADC_CR2_ADON; -} - -/** - * @brief Enables the TSVREFE bit. - * @details The TSVREFE bit is required in order to sample the internal - * temperature sensor and internal reference voltage. - * @note This is an STM32-only functionality. - */ -void adcSTM32EnableTSVREFE(void) { - - ADC->CCR |= ADC_CCR_TSVREFE; -} - -/** - * @brief Disables the TSVREFE bit. - * @details The TSVREFE bit is required in order to sample the internal - * temperature sensor and internal reference voltage. - * @note This is an STM32-only functionality. - */ -void adcSTM32DisableTSVREFE(void) { - - ADC->CCR &= ~ADC_CCR_TSVREFE; -} - -/** - * @brief Enables the VBATE bit. - * @details The VBATE bit is required in order to sample the VBAT channel. - * @note This is an STM32-only functionality. - */ -void adcSTM32EnableVBATE(void) { - - ADC->CCR |= ADC_CCR_VBATE; -} - -/** - * @brief Disables the VBATE bit. - * @details The VBATE bit is required in order to sample the VBAT channel. - * @note This is an STM32-only functionality. - */ -void adcSTM32DisableVBATE(void) { - - ADC->CCR &= ~ADC_CCR_VBATE; -} - -#endif /* HAL_USE_ADC */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/adc_lld.h b/os/hal/platforms/STM32F4xx/adc_lld.h deleted file mode 100644 index f54b20ecba..0000000000 --- a/os/hal/platforms/STM32F4xx/adc_lld.h +++ /dev/null @@ -1,571 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/adc_lld.h - * @brief STM32F4xx/STM32F2xx ADC subsystem low level driver header. - * - * @addtogroup ADC - * @{ - */ - -#ifndef _ADC_LLD_H_ -#define _ADC_LLD_H_ - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -/** - * @brief Minimum ADC clock frequency. - */ -#define STM32_ADCCLK_MIN 600000 - -/** - * @brief Maximum ADC clock frequency. - */ -#if defined(STM32F4XX) || defined(__DOXYGEN__) -#define STM32_ADCCLK_MAX 36000000 -#else -#define STM32_ADCCLK_MAX 30000000 -#endif -/** @} */ - -/** - * @name Triggers selection - * @{ - */ -#define ADC_CR2_EXTSEL_SRC(n) ((n) << 24) /**< @brief Trigger source. */ -/** @} */ - -/** - * @name ADC clock divider settings - * @{ - */ -#define ADC_CCR_ADCPRE_DIV2 0 -#define ADC_CCR_ADCPRE_DIV4 1 -#define ADC_CCR_ADCPRE_DIV6 2 -#define ADC_CCR_ADCPRE_DIV8 3 -/** @} */ - -/** - * @name Available analog channels - * @{ - */ -#define ADC_CHANNEL_IN0 0 /**< @brief External analog input 0. */ -#define ADC_CHANNEL_IN1 1 /**< @brief External analog input 1. */ -#define ADC_CHANNEL_IN2 2 /**< @brief External analog input 2. */ -#define ADC_CHANNEL_IN3 3 /**< @brief External analog input 3. */ -#define ADC_CHANNEL_IN4 4 /**< @brief External analog input 4. */ -#define ADC_CHANNEL_IN5 5 /**< @brief External analog input 5. */ -#define ADC_CHANNEL_IN6 6 /**< @brief External analog input 6. */ -#define ADC_CHANNEL_IN7 7 /**< @brief External analog input 7. */ -#define ADC_CHANNEL_IN8 8 /**< @brief External analog input 8. */ -#define ADC_CHANNEL_IN9 9 /**< @brief External analog input 9. */ -#define ADC_CHANNEL_IN10 10 /**< @brief External analog input 10. */ -#define ADC_CHANNEL_IN11 11 /**< @brief External analog input 11. */ -#define ADC_CHANNEL_IN12 12 /**< @brief External analog input 12. */ -#define ADC_CHANNEL_IN13 13 /**< @brief External analog input 13. */ -#define ADC_CHANNEL_IN14 14 /**< @brief External analog input 14. */ -#define ADC_CHANNEL_IN15 15 /**< @brief External analog input 15. */ -#define ADC_CHANNEL_SENSOR 16 /**< @brief Internal temperature sensor. - @note Available onADC1 only. */ -#define ADC_CHANNEL_VREFINT 17 /**< @brief Internal reference. - @note Available onADC1 only. */ -#define ADC_CHANNEL_VBAT 18 /**< @brief VBAT. - @note Available onADC1 only. */ -/** @} */ - -/** - * @name Sampling rates - * @{ - */ -#define ADC_SAMPLE_3 0 /**< @brief 3 cycles sampling time. */ -#define ADC_SAMPLE_15 1 /**< @brief 15 cycles sampling time. */ -#define ADC_SAMPLE_28 2 /**< @brief 28 cycles sampling time. */ -#define ADC_SAMPLE_56 3 /**< @brief 56 cycles sampling time. */ -#define ADC_SAMPLE_84 4 /**< @brief 84 cycles sampling time. */ -#define ADC_SAMPLE_112 5 /**< @brief 112 cycles sampling time. */ -#define ADC_SAMPLE_144 6 /**< @brief 144 cycles sampling time. */ -#define ADC_SAMPLE_480 7 /**< @brief 480 cycles sampling time. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief ADC common clock divider. - * @note This setting is influenced by the VDDA voltage and other - * external conditions, please refer to the datasheet for more - * info.
    - * See section 5.3.20 "12-bit ADC characteristics". - */ -#if !defined(STM32_ADC_ADCPRE) || defined(__DOXYGEN__) -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV2 -#endif - -/** - * @brief ADC1 driver enable switch. - * @details If set to @p TRUE the support for ADC1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ADC_USE_ADC1) || defined(__DOXYGEN__) -#define STM32_ADC_USE_ADC1 FALSE -#endif - -/** - * @brief ADC2 driver enable switch. - * @details If set to @p TRUE the support for ADC2 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ADC_USE_ADC2) || defined(__DOXYGEN__) -#define STM32_ADC_USE_ADC2 FALSE -#endif - -/** - * @brief ADC3 driver enable switch. - * @details If set to @p TRUE the support for ADC3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ADC_USE_ADC3) || defined(__DOXYGEN__) -#define STM32_ADC_USE_ADC3 FALSE -#endif - -/** - * @brief DMA stream used for ADC1 operations. - */ -#if !defined(STM32_ADC_ADC1_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#endif - -/** - * @brief DMA stream used for ADC2 operations. - */ -#if !defined(STM32_ADC_ADC2_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#endif - -/** - * @brief DMA stream used for ADC3 operations. - */ -#if !defined(STM32_ADC_ADC3_DMA_STREAM) || defined(__DOXYGEN__) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#endif - -/** - * @brief ADC1 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_ADC_ADC1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#endif - -/** - * @brief ADC2 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_ADC_ADC2_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#endif - -/** - * @brief ADC3 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_ADC_ADC3_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#endif - -/** - * @brief ADC interrupt priority level setting. - * @note This setting is shared among ADC1, ADC2 and ADC3 because - * all ADCs share the same vector. - */ -#if !defined(STM32_ADC_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_IRQ_PRIORITY 5 -#endif - -/** - * @brief ADC1 DMA interrupt priority level setting. - */ -#if !defined(STM32_ADC_ADC1_DMA_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 -#endif - -/** - * @brief ADC2 DMA interrupt priority level setting. - */ -#if !defined(STM32_ADC_ADC2_DMA_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 5 -#endif - -/** - * @brief ADC3 DMA interrupt priority level setting. - */ -#if !defined(STM32_ADC_ADC3_DMA_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 5 -#endif - -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !STM32_HAS_ADC1 -#error "ADC1 not present in the selected device" -#endif - -#if STM32_ADC_USE_ADC2 && !STM32_HAS_ADC2 -#error "ADC2 not present in the selected device" -#endif - -#if STM32_ADC_USE_ADC3 && !STM32_HAS_ADC3 -#error "ADC3 not present in the selected device" -#endif - -#if !STM32_ADC_USE_ADC1 && !STM32_ADC_USE_ADC2 && !STM32_ADC_USE_ADC3 -#error "ADC driver activated but no ADC peripheral assigned" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !STM32_DMA_IS_VALID_ID(STM32_ADC_ADC1_DMA_STREAM, STM32_ADC1_DMA_MSK) -#error "invalid DMA stream associated to ADC1" -#endif - -#if STM32_ADC_USE_ADC2 && \ - !STM32_DMA_IS_VALID_ID(STM32_ADC_ADC2_DMA_STREAM, STM32_ADC2_DMA_MSK) -#error "invalid DMA stream associated to ADC2" -#endif - -#if STM32_ADC_USE_ADC3 && \ - !STM32_DMA_IS_VALID_ID(STM32_ADC_ADC3_DMA_STREAM, STM32_ADC3_DMA_MSK) -#error "invalid DMA stream associated to ADC3" -#endif - -/* ADC clock related settings and checks.*/ -#if STM32_ADC_ADCPRE == ADC_CCR_ADCPRE_DIV2 -#define STM32_ADCCLK (STM32_PCLK2 / 2) -#elif STM32_ADC_ADCPRE == ADC_CCR_ADCPRE_DIV4 -#define STM32_ADCCLK (STM32_PCLK2 / 4) -#elif STM32_ADC_ADCPRE == ADC_CCR_ADCPRE_DIV6 -#define STM32_ADCCLK (STM32_PCLK2 / 6) -#elif STM32_ADC_ADCPRE == ADC_CCR_ADCPRE_DIV8 -#define STM32_ADCCLK (STM32_PCLK2 / 8) -#else -#error "invalid STM32_ADC_ADCPRE value specified" -#endif - -#if (STM32_ADCCLK < STM32_ADCCLK_MIN) || (STM32_ADCCLK > STM32_ADCCLK_MAX) -#error "STM32_ADCCLK outside acceptable range (STM32_ADCCLK_MIN...STM32_ADCCLK_MAX)" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief ADC sample data type. - */ -typedef uint16_t adcsample_t; - -/** - * @brief Channels number in a conversion group. - */ -typedef uint16_t adc_channels_num_t; - -/** - * @brief Possible ADC failure causes. - * @note Error codes are architecture dependent and should not relied - * upon. - */ -typedef enum { - ADC_ERR_DMAFAILURE = 0, /**< DMA operations failure. */ - ADC_ERR_OVERFLOW = 1 /**< ADC overflow condition. */ -} adcerror_t; - -/** - * @brief Type of a structure representing an ADC driver. - */ -typedef struct ADCDriver ADCDriver; - -/** - * @brief ADC notification callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] buffer pointer to the most recent samples data - * @param[in] n number of buffer rows available starting from @p buffer - */ -typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n); - -/** - * @brief ADC error callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] err ADC error code - */ -typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err); - -/** - * @brief Conversion group configuration structure. - * @details This implementation-dependent structure describes a conversion - * operation. - * @note The use of this configuration structure requires knowledge of - * STM32 ADC cell registers interface, please refer to the STM32 - * reference manual for details. - */ -typedef struct { - /** - * @brief Enables the circular buffer mode for the group. - */ - bool_t circular; - /** - * @brief Number of the analog channels belonging to the conversion group. - */ - adc_channels_num_t num_channels; - /** - * @brief Callback function associated to the group or @p NULL. - */ - adccallback_t end_cb; - /** - * @brief Error callback or @p NULL. - */ - adcerrorcallback_t error_cb; - /* End of the mandatory fields.*/ - /** - * @brief ADC CR1 register initialization data. - * @note All the required bits must be defined into this field except - * @p ADC_CR1_SCAN that is enforced inside the driver. - */ - uint32_t cr1; - /** - * @brief ADC CR2 register initialization data. - * @note All the required bits must be defined into this field except - * @p ADC_CR2_DMA, @p ADC_CR2_CONT and @p ADC_CR2_ADON that are - * enforced inside the driver. - */ - uint32_t cr2; - /** - * @brief ADC SMPR1 register initialization data. - * @details In this field must be specified the sample times for channels - * 10...18. - */ - uint32_t smpr1; - /** - * @brief ADC SMPR2 register initialization data. - * @details In this field must be specified the sample times for channels - * 0...9. - */ - uint32_t smpr2; - /** - * @brief ADC SQR1 register initialization data. - * @details Conversion group sequence 13...16 + sequence length. - */ - uint32_t sqr1; - /** - * @brief ADC SQR2 register initialization data. - * @details Conversion group sequence 7...12. - */ - uint32_t sqr2; - /** - * @brief ADC SQR3 register initialization data. - * @details Conversion group sequence 1...6. - */ - uint32_t sqr3; -} ADCConversionGroup; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - uint32_t dummy; -} ADCConfig; - -/** - * @brief Structure representing an ADC driver. - */ -struct ADCDriver { - /** - * @brief Driver state. - */ - adcstate_t state; - /** - * @brief Current configuration data. - */ - const ADCConfig *config; - /** - * @brief Current samples buffer pointer or @p NULL. - */ - adcsample_t *samples; - /** - * @brief Current samples buffer depth or @p 0. - */ - size_t depth; - /** - * @brief Current conversion group pointer or @p NULL. - */ - const ADCConversionGroup *grpp; -#if ADC_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif -#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the peripheral. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* ADC_USE_MUTUAL_EXCLUSION */ -#if defined(ADC_DRIVER_EXT_FIELDS) - ADC_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the ADCx registers block. - */ - ADC_TypeDef *adc; - /** - * @brief Pointer to associated SMA channel. - */ - const stm32_dma_stream_t *dmastp; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Sequences building helper macros - * @{ - */ -/** - * @brief Number of channels in a conversion sequence. - */ -#define ADC_SQR1_NUM_CH(n) (((n) - 1) << 20) - -#define ADC_SQR3_SQ1_N(n) ((n) << 0) /**< @brief 1st channel in seq. */ -#define ADC_SQR3_SQ2_N(n) ((n) << 5) /**< @brief 2nd channel in seq. */ -#define ADC_SQR3_SQ3_N(n) ((n) << 10) /**< @brief 3rd channel in seq. */ -#define ADC_SQR3_SQ4_N(n) ((n) << 15) /**< @brief 4th channel in seq. */ -#define ADC_SQR3_SQ5_N(n) ((n) << 20) /**< @brief 5th channel in seq. */ -#define ADC_SQR3_SQ6_N(n) ((n) << 25) /**< @brief 6th channel in seq. */ - -#define ADC_SQR2_SQ7_N(n) ((n) << 0) /**< @brief 7th channel in seq. */ -#define ADC_SQR2_SQ8_N(n) ((n) << 5) /**< @brief 8th channel in seq. */ -#define ADC_SQR2_SQ9_N(n) ((n) << 10) /**< @brief 9th channel in seq. */ -#define ADC_SQR2_SQ10_N(n) ((n) << 15) /**< @brief 10th channel in seq.*/ -#define ADC_SQR2_SQ11_N(n) ((n) << 20) /**< @brief 11th channel in seq.*/ -#define ADC_SQR2_SQ12_N(n) ((n) << 25) /**< @brief 12th channel in seq.*/ - -#define ADC_SQR1_SQ13_N(n) ((n) << 0) /**< @brief 13th channel in seq.*/ -#define ADC_SQR1_SQ14_N(n) ((n) << 5) /**< @brief 14th channel in seq.*/ -#define ADC_SQR1_SQ15_N(n) ((n) << 10) /**< @brief 15th channel in seq.*/ -#define ADC_SQR1_SQ16_N(n) ((n) << 15) /**< @brief 16th channel in seq.*/ -/** @} */ - -/** - * @name Sampling rate settings helper macros - * @{ - */ -#define ADC_SMPR2_SMP_AN0(n) ((n) << 0) /**< @brief AN0 sampling time. */ -#define ADC_SMPR2_SMP_AN1(n) ((n) << 3) /**< @brief AN1 sampling time. */ -#define ADC_SMPR2_SMP_AN2(n) ((n) << 6) /**< @brief AN2 sampling time. */ -#define ADC_SMPR2_SMP_AN3(n) ((n) << 9) /**< @brief AN3 sampling time. */ -#define ADC_SMPR2_SMP_AN4(n) ((n) << 12) /**< @brief AN4 sampling time. */ -#define ADC_SMPR2_SMP_AN5(n) ((n) << 15) /**< @brief AN5 sampling time. */ -#define ADC_SMPR2_SMP_AN6(n) ((n) << 18) /**< @brief AN6 sampling time. */ -#define ADC_SMPR2_SMP_AN7(n) ((n) << 21) /**< @brief AN7 sampling time. */ -#define ADC_SMPR2_SMP_AN8(n) ((n) << 24) /**< @brief AN8 sampling time. */ -#define ADC_SMPR2_SMP_AN9(n) ((n) << 27) /**< @brief AN9 sampling time. */ - -#define ADC_SMPR1_SMP_AN10(n) ((n) << 0) /**< @brief AN10 sampling time. */ -#define ADC_SMPR1_SMP_AN11(n) ((n) << 3) /**< @brief AN11 sampling time. */ -#define ADC_SMPR1_SMP_AN12(n) ((n) << 6) /**< @brief AN12 sampling time. */ -#define ADC_SMPR1_SMP_AN13(n) ((n) << 9) /**< @brief AN13 sampling time. */ -#define ADC_SMPR1_SMP_AN14(n) ((n) << 12) /**< @brief AN14 sampling time. */ -#define ADC_SMPR1_SMP_AN15(n) ((n) << 15) /**< @brief AN15 sampling time. */ -#define ADC_SMPR1_SMP_SENSOR(n) ((n) << 18) /**< @brief Temperature Sensor - sampling time. */ -#define ADC_SMPR1_SMP_VREF(n) ((n) << 21) /**< @brief Voltage Reference - sampling time. */ -#define ADC_SMPR1_SMP_VBAT(n) ((n) << 24) /**< @brief VBAT sampling time. */ -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !defined(__DOXYGEN__) -extern ADCDriver ADCD1; -#endif - -#if STM32_ADC_USE_ADC2 && !defined(__DOXYGEN__) -extern ADCDriver ADCD2; -#endif - -#if STM32_ADC_USE_ADC3 && !defined(__DOXYGEN__) -extern ADCDriver ADCD3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void adc_lld_init(void); - void adc_lld_start(ADCDriver *adcp); - void adc_lld_stop(ADCDriver *adcp); - void adc_lld_start_conversion(ADCDriver *adcp); - void adc_lld_stop_conversion(ADCDriver *adcp); - void adcSTM32EnableTSVREFE(void); - void adcSTM32DisableTSVREFE(void); - void adcSTM32EnableVBATE(void); - void adcSTM32DisableVBATE(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_ADC */ - -#endif /* _ADC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/ext_lld_isr.c b/os/hal/platforms/STM32F4xx/ext_lld_isr.c deleted file mode 100644 index a5e518bf65..0000000000 --- a/os/hal/platforms/STM32F4xx/ext_lld_isr.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/ext_lld_isr.c - * @brief STM32F4xx/STM32F2xx EXT subsystem low level driver ISR code. - * - * @addtogroup EXT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -#include "ext_lld_isr.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief EXTI[0] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI0_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 0); - EXTD1.config->channels[0].cb(&EXTD1, 0); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[1] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI1_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 1); - EXTD1.config->channels[1].cb(&EXTD1, 1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[2] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI2_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 2); - EXTD1.config->channels[2].cb(&EXTD1, 2); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[3] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI3_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 3); - EXTD1.config->channels[3].cb(&EXTD1, 3); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[4] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI4_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 4); - EXTD1.config->channels[4].cb(&EXTD1, 4); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[5]...EXTI[9] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI9_5_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9)); - EXTI->PR = pr; - if (pr & (1 << 5)) - EXTD1.config->channels[5].cb(&EXTD1, 5); - if (pr & (1 << 6)) - EXTD1.config->channels[6].cb(&EXTD1, 6); - if (pr & (1 << 7)) - EXTD1.config->channels[7].cb(&EXTD1, 7); - if (pr & (1 << 8)) - EXTD1.config->channels[8].cb(&EXTD1, 8); - if (pr & (1 << 9)) - EXTD1.config->channels[9].cb(&EXTD1, 9); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[10]...EXTI[15] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI15_10_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | - (1 << 15)); - EXTI->PR = pr; - if (pr & (1 << 10)) - EXTD1.config->channels[10].cb(&EXTD1, 10); - if (pr & (1 << 11)) - EXTD1.config->channels[11].cb(&EXTD1, 11); - if (pr & (1 << 12)) - EXTD1.config->channels[12].cb(&EXTD1, 12); - if (pr & (1 << 13)) - EXTD1.config->channels[13].cb(&EXTD1, 13); - if (pr & (1 << 14)) - EXTD1.config->channels[14].cb(&EXTD1, 14); - if (pr & (1 << 15)) - EXTD1.config->channels[15].cb(&EXTD1, 15); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[16] interrupt handler (PVD). - * - * @isr - */ -CH_IRQ_HANDLER(PVD_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 16); - EXTD1.config->channels[16].cb(&EXTD1, 16); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[17] interrupt handler (RTC). - * - * @isr - */ -CH_IRQ_HANDLER(RTCAlarm_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 17); - EXTD1.config->channels[17].cb(&EXTD1, 17); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[18] interrupt handler (OTG_FS_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(OTG_FS_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 18); - EXTD1.config->channels[18].cb(&EXTD1, 18); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[19] interrupt handler (ETH_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(ETH_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 19); - EXTD1.config->channels[19].cb(&EXTD1, 19); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[20] interrupt handler (OTG_HS_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(OTG_HS_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 20); - EXTD1.config->channels[20].cb(&EXTD1, 20); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[21] interrupt handler (TAMPER_STAMP). - * - * @isr - */ -CH_IRQ_HANDLER(TAMPER_STAMP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 21); - EXTD1.config->channels[21].cb(&EXTD1, 21); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[22] interrupt handler (RTC_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(RTC_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 22); - EXTD1.config->channels[22].cb(&EXTD1, 22); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Enables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_enable(void) { - - nvicEnableVector(EXTI0_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI0_IRQ_PRIORITY)); - nvicEnableVector(EXTI1_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI1_IRQ_PRIORITY)); - nvicEnableVector(EXTI2_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI2_IRQ_PRIORITY)); - nvicEnableVector(EXTI3_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI3_IRQ_PRIORITY)); - nvicEnableVector(EXTI4_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI4_IRQ_PRIORITY)); - nvicEnableVector(EXTI9_5_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI5_9_IRQ_PRIORITY)); - nvicEnableVector(EXTI15_10_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI10_15_IRQ_PRIORITY)); - nvicEnableVector(PVD_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI16_IRQ_PRIORITY)); - nvicEnableVector(RTC_Alarm_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI17_IRQ_PRIORITY)); - nvicEnableVector(OTG_FS_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI18_IRQ_PRIORITY)); - nvicEnableVector(ETH_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI19_IRQ_PRIORITY)); - nvicEnableVector(OTG_HS_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI20_IRQ_PRIORITY)); - nvicEnableVector(TAMP_STAMP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI21_IRQ_PRIORITY)); - nvicEnableVector(RTC_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI22_IRQ_PRIORITY)); -} - -/** - * @brief Disables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_disable(void) { - - nvicDisableVector(EXTI0_IRQn); - nvicDisableVector(EXTI1_IRQn); - nvicDisableVector(EXTI2_IRQn); - nvicDisableVector(EXTI3_IRQn); - nvicDisableVector(EXTI4_IRQn); - nvicDisableVector(EXTI9_5_IRQn); - nvicDisableVector(EXTI15_10_IRQn); - nvicDisableVector(PVD_IRQn); - nvicDisableVector(RTC_Alarm_IRQn); - nvicDisableVector(OTG_FS_WKUP_IRQn); - nvicDisableVector(ETH_WKUP_IRQn); - nvicDisableVector(OTG_HS_WKUP_IRQn); - nvicDisableVector(TAMP_STAMP_IRQn); - nvicDisableVector(RTC_WKUP_IRQn); -} - -#endif /* HAL_USE_EXT */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/ext_lld_isr.h b/os/hal/platforms/STM32F4xx/ext_lld_isr.h deleted file mode 100644 index fa18c60a88..0000000000 --- a/os/hal/platforms/STM32F4xx/ext_lld_isr.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/ext_lld_isr.h - * @brief STM32F4xx/STM32F2xx EXT subsystem low level driver ISR header. - * - * @addtogroup EXT - * @{ - */ - -#ifndef _EXT_LLD_ISR_H_ -#define _EXT_LLD_ISR_H_ - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief EXTI0 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI1 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI2 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI3 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI4 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI4_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI9..5 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI5_9_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI15..10 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI10_15_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI16 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI16_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI17 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI17_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI18 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI18_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI19 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI19_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI20 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI20_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI21 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI21_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI21_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI22 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI22_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI22_IRQ_PRIORITY 6 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void ext_lld_exti_irq_enable(void); - void ext_lld_exti_irq_disable(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_EXT */ - -#endif /* _EXT_LLD_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/hal_lld.c b/os/hal/platforms/STM32F4xx/hal_lld.c deleted file mode 100644 index a1d3d3d79b..0000000000 --- a/os/hal/platforms/STM32F4xx/hal_lld.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/hal_lld.c - * @brief STM32F4xx/STM32F2xx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes the backup domain. - */ -static void hal_lld_backup_domain_init(void) { - - /* Backup domain access enabled and left open.*/ - PWR->CR |= PWR_CR_DBP; - - /* Reset BKP domain if different clock source selected.*/ - if ((RCC->BDCR & STM32_RTCSEL_MASK) != STM32_RTCSEL) { - /* Backup domain reset.*/ - RCC->BDCR = RCC_BDCR_BDRST; - RCC->BDCR = 0; - } - - /* If enabled then the LSE is started.*/ -#if STM32_LSE_ENABLED - RCC->BDCR |= RCC_BDCR_LSEON; - while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0) - ; /* Waits until LSE is stable. */ -#endif - -#if STM32_RTCSEL != STM32_RTCSEL_NOCLOCK - /* If the backup domain hasn't been initialized yet then proceed with - initialization.*/ - if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0) { - /* Selects clock source.*/ - RCC->BDCR |= STM32_RTCSEL; - - /* RTC clock enabled.*/ - RCC->BDCR |= RCC_BDCR_RTCEN; - } -#endif /* STM32_RTCSEL != STM32_RTCSEL_NOCLOCK */ -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* Reset of all peripherals. AHB3 is not reseted because it could have - been initialized in the board initialization file (board.c).*/ - rccResetAHB1(!0); - rccResetAHB2(!0); - rccResetAHB3(!0); - rccResetAPB1(!RCC_APB1RSTR_PWRRST); - rccResetAPB2(!0); - - /* SysTick initialization using the system clock.*/ - SysTick->LOAD = STM32_HCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; - - /* DWT cycle counter enable.*/ - SCS_DEMCR |= SCS_DEMCR_TRCENA; - DWT_CTRL |= DWT_CTRL_CYCCNTENA; - - /* PWR clock enabled.*/ - rccEnablePWRInterface(FALSE); - - /* Initializes the backup domain.*/ - hal_lld_backup_domain_init(); - -#if defined(STM32_DMA_REQUIRED) - dmaInit(); -#endif - - /* Programmable voltage detector enable.*/ -#if STM32_PVD_ENABLE - PWR->CR |= PWR_CR_PVDE | (STM32_PLS & STM32_PLS_MASK); -#endif /* STM32_PVD_ENABLE */ -} - -/** - * @brief STM32F2xx clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function should be invoked just after the system reset. - * - * @special - */ -void stm32_clock_init(void) { - -#if !STM32_NO_INIT - /* PWR clock enable.*/ - RCC->APB1ENR = RCC_APB1ENR_PWREN; - - /* PWR initialization.*/ -#if defined(STM32F4XX) || defined(__DOXYGEN__) - PWR->CR = STM32_VOS; - while ((PWR->CSR & PWR_CSR_VOSRDY) == 0) - ; /* Waits until power regulator is stable. */ -#else - PWR->CR = 0; -#endif - - /* Initial clocks setup and wait for HSI stabilization, the MSI clock is - always enabled because it is the fallback clock when PLL the fails.*/ - RCC->CR |= RCC_CR_HSION; - while ((RCC->CR & RCC_CR_HSIRDY) == 0) - ; /* Waits until HSI is stable. */ - -#if STM32_HSE_ENABLED -#if defined(STM32_HSE_BYPASS) - /* HSE Bypass.*/ - RCC->CR |= RCC_CR_HSEBYP; -#endif - /* HSE activation.*/ - RCC->CR |= RCC_CR_HSEON; - while ((RCC->CR & RCC_CR_HSERDY) == 0) - ; /* Waits until HSE is stable. */ -#endif - -#if STM32_LSI_ENABLED - /* LSI activation.*/ - RCC->CSR |= RCC_CSR_LSION; - while ((RCC->CSR & RCC_CSR_LSIRDY) == 0) - ; /* Waits until LSI is stable. */ -#endif - -#if STM32_LSE_ENABLED - /* LSE activation, have to unlock the register.*/ - if ((RCC->BDCR & RCC_BDCR_LSEON) == 0) { - PWR->CR |= PWR_CR_DBP; - RCC->BDCR |= RCC_BDCR_LSEON; - PWR->CR &= ~PWR_CR_DBP; - } - while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0) - ; /* Waits until LSE is stable. */ -#endif - -#if STM32_ACTIVATE_PLL - /* PLL activation.*/ - RCC->PLLCFGR = STM32_PLLQ | STM32_PLLSRC | STM32_PLLP | STM32_PLLN | STM32_PLLM; - RCC->CR |= RCC_CR_PLLON; - while (!(RCC->CR & RCC_CR_PLLRDY)) - ; /* Waits until PLL is stable. */ -#endif - -#if STM32_ACTIVATE_PLLI2S - /* PLLI2S activation.*/ - RCC->PLLI2SCFGR = STM32_PLLI2SR | STM32_PLLI2SN; - RCC->CR |= RCC_CR_PLLI2SON; - while (!(RCC->CR & RCC_CR_PLLI2SRDY)) - ; /* Waits until PLLI2S is stable. */ -#endif - - /* Other clock-related settings (dividers, MCO etc).*/ - RCC->CFGR |= STM32_MCO2PRE | STM32_MCO2SEL | STM32_MCO1PRE | STM32_MCO1SEL | - STM32_RTCPRE | STM32_PPRE2 | STM32_PPRE1 | STM32_HPRE; - - /* Flash setup.*/ - FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | - STM32_FLASHBITS; - - /* Switching to the configured clock source if it is different from MSI.*/ -#if (STM32_SW != STM32_SW_HSI) - RCC->CFGR |= STM32_SW; /* Switches on the selected clock source. */ - while ((RCC->CFGR & RCC_CFGR_SWS) != (STM32_SW << 2)) - ; -#endif -#endif /* STM32_NO_INIT */ - - /* SYSCFG clock enabled here because it is a multi-functional unit shared - among multiple drivers.*/ - rccEnableAPB2(RCC_APB2ENR_SYSCFGEN, TRUE); -} - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/hal_lld.h b/os/hal/platforms/STM32F4xx/hal_lld.h deleted file mode 100644 index 6638b8f7f1..0000000000 --- a/os/hal/platforms/STM32F4xx/hal_lld.h +++ /dev/null @@ -1,1564 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/hal_lld.h - * @brief STM32F4xx/STM32F2xx HAL subsystem low level driver header. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - STM32_LSECLK. - * - STM32_HSECLK. - * - STM32_HSE_BYPASS (optionally). - * - STM32_VDD (as hundredths of Volt). - * . - * One of the following macros must also be defined: - * - STM32F2XX for High-performance STM32 F-2 devices. - * - STM32F4XX for High-performance STM32 F-4 devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "stm32.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS TRUE - -/** - * @name Platform identification - * @{ - */ -#if defined(STM32F4XX) || defined(__DOXYGEN__) -#define PLATFORM_NAME "STM32F4xx High Performance" -#else /* !defined(STM32F4XX) */ -#define PLATFORM_NAME "STM32F2xx High Performance" -#endif /* !defined(STM32F4XX) */ -/** @} */ - -/** - * @name Absolute Maximum Ratings - * @{ - */ -#if defined(STM32F4XX) || defined(__DOXYGEN__) -/** - * @brief Maximum HSE clock frequency. - */ -#define STM32_HSECLK_MAX 26000000 - -/** - * @brief Minimum HSE clock frequency. - */ -#define STM32_HSECLK_MIN 1000000 - -/** - * @brief Maximum LSE clock frequency. - */ -#define STM32_LSECLK_MAX 1000000 - -/** - * @brief Minimum LSE clock frequency. - */ -#define STM32_LSECLK_MIN 32768 - -/** - * @brief Maximum PLLs input clock frequency. - */ -#define STM32_PLLIN_MAX 2000000 - -/** - * @brief Minimum PLLs input clock frequency. - */ -#define STM32_PLLIN_MIN 950000 - -/** - * @brief Maximum PLLs VCO clock frequency. - */ -#define STM32_PLLVCO_MAX 432000000 - -/** - * @brief Maximum PLLs VCO clock frequency. - */ -#define STM32_PLLVCO_MIN 192000000 - -/** - * @brief Maximum PLL output clock frequency. - */ -#define STM32_PLLOUT_MAX 168000000 - -/** - * @brief Minimum PLL output clock frequency. - */ -#define STM32_PLLOUT_MIN 24000000 - -/** - * @brief Maximum APB1 clock frequency. - */ -#define STM32_PCLK1_MAX 42000000 - -/** - * @brief Maximum APB2 clock frequency. - */ -#define STM32_PCLK2_MAX 84000000 - -/** - * @brief Maximum SPI/I2S clock frequency. - */ -#define STM32_SPII2S_MAX 37500000 - -#else /* !defined(STM32F4XX) */ -#define STM32_SYSCLK_MAX 120000000 -#define STM32_HSECLK_MAX 26000000 -#define STM32_HSECLK_MIN 1000000 -#define STM32_LSECLK_MAX 1000000 -#define STM32_LSECLK_MIN 32768 -#define STM32_PLLIN_MAX 2000000 -#define STM32_PLLIN_MIN 950000 -#define STM32_PLLVCO_MAX 432000000 -#define STM32_PLLVCO_MIN 192000000 -#define STM32_PLLOUT_MAX 120000000 -#define STM32_PLLOUT_MIN 24000000 -#define STM32_PCLK1_MAX 30000000 -#define STM32_PCLK2_MAX 60000000 -#define STM32_SPII2S_MAX 37500000 -#endif /* !defined(STM32F4XX) */ -/** @} */ - -/** - * @name Internal clock sources - * @{ - */ -#define STM32_HSICLK 16000000 /**< High speed internal clock. */ -#define STM32_LSICLK 32000 /**< Low speed internal clock. */ -/** @} */ - -/** - * @name PWR_CR register bits definitions - * @{ - */ -#if defined(STM32F4XX) || defined(__DOXYGEN__) -#define STM32_VOS_MASK (1 << 14) /**< Core voltage mask. */ -#define STM32_VOS_LOW (0 << 14) /**< Core voltage set to low. */ -#define STM32_VOS_HIGH (1 << 14) /**< Core voltage set to high. */ -#endif -#define STM32_PLS_MASK (7 << 5) /**< PLS bits mask. */ -#define STM32_PLS_LEV0 (0 << 5) /**< PVD level 0. */ -#define STM32_PLS_LEV1 (1 << 5) /**< PVD level 1. */ -#define STM32_PLS_LEV2 (2 << 5) /**< PVD level 2. */ -#define STM32_PLS_LEV3 (3 << 5) /**< PVD level 3. */ -#define STM32_PLS_LEV4 (4 << 5) /**< PVD level 4. */ -#define STM32_PLS_LEV5 (5 << 5) /**< PVD level 5. */ -#define STM32_PLS_LEV6 (6 << 5) /**< PVD level 6. */ -#define STM32_PLS_LEV7 (7 << 5) /**< PVD level 7. */ -/** @} */ - -/** - * @name RCC_PLLCFGR register bits definitions - * @{ - */ -#define STM32_PLLP_MASK (3 << 16) /**< PLLP mask. */ -#define STM32_PLLP_DIV2 (0 << 16) /**< PLL clock divided by 2. */ -#define STM32_PLLP_DIV4 (1 << 16) /**< PLL clock divided by 4. */ -#define STM32_PLLP_DIV6 (2 << 16) /**< PLL clock divided by 6. */ -#define STM32_PLLP_DIV8 (3 << 16) /**< PLL clock divided by 8. */ - -#define STM32_PLLSRC_HSI (0 << 22) /**< PLL clock source is HSI. */ -#define STM32_PLLSRC_HSE (1 << 22) /**< PLL clock source is HSE. */ -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_MASK (3 << 0) /**< SW mask. */ -#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_MASK (15 << 4) /**< HPRE mask. */ -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE1_MASK (7 << 10) /**< PPRE1 mask. */ -#define STM32_PPRE1_DIV1 (0 << 10) /**< HCLK divided by 1. */ -#define STM32_PPRE1_DIV2 (4 << 10) /**< HCLK divided by 2. */ -#define STM32_PPRE1_DIV4 (5 << 10) /**< HCLK divided by 4. */ -#define STM32_PPRE1_DIV8 (6 << 10) /**< HCLK divided by 8. */ -#define STM32_PPRE1_DIV16 (7 << 10) /**< HCLK divided by 16. */ - -#define STM32_PPRE2_MASK (7 << 13) /**< PPRE2 mask. */ -#define STM32_PPRE2_DIV1 (0 << 13) /**< HCLK divided by 1. */ -#define STM32_PPRE2_DIV2 (4 << 13) /**< HCLK divided by 2. */ -#define STM32_PPRE2_DIV4 (5 << 13) /**< HCLK divided by 4. */ -#define STM32_PPRE2_DIV8 (6 << 13) /**< HCLK divided by 8. */ -#define STM32_PPRE2_DIV16 (7 << 13) /**< HCLK divided by 16. */ - -#define STM32_RTCPRE_MASK (31 << 16) /**< RTCPRE mask. */ - -#define STM32_MCO1SEL_MASK (3 << 21) /**< MCO1 mask. */ -#define STM32_MCO1SEL_HSI (0 << 21) /**< HSI clock on MCO1 pin. */ -#define STM32_MCO1SEL_LSE (1 << 21) /**< LSE clock on MCO1 pin. */ -#define STM32_MCO1SEL_HSE (2 << 21) /**< HSE clock on MCO1 pin. */ -#define STM32_MCO1SEL_PLL (3 << 21) /**< PLL clock on MCO1 pin. */ - -#define STM32_I2SSRC_MASK (1 << 23) /**< I2CSRC mask. */ -#define STM32_I2SSRC_PLLI2S (0 << 23) /**< I2SSRC is PLLI2S. */ -#define STM32_I2SSRC_CKIN (1 << 23) /**< I2S_CKIN is PLLI2S. */ - -#define STM32_MCO1PRE_MASK (7 << 24) /**< MCO1PRE mask. */ -#define STM32_MCO1PRE_DIV1 (0 << 24) /**< MCO1 divided by 1. */ -#define STM32_MCO1PRE_DIV2 (4 << 24) /**< MCO1 divided by 2. */ -#define STM32_MCO1PRE_DIV3 (5 << 24) /**< MCO1 divided by 3. */ -#define STM32_MCO1PRE_DIV4 (6 << 24) /**< MCO1 divided by 4. */ -#define STM32_MCO1PRE_DIV5 (7 << 24) /**< MCO1 divided by 5. */ - -#define STM32_MCO2PRE_MASK (7 << 27) /**< MCO2PRE mask. */ -#define STM32_MCO2PRE_DIV1 (0 << 27) /**< MCO2 divided by 1. */ -#define STM32_MCO2PRE_DIV2 (4 << 27) /**< MCO2 divided by 2. */ -#define STM32_MCO2PRE_DIV3 (5 << 27) /**< MCO2 divided by 3. */ -#define STM32_MCO2PRE_DIV4 (6 << 27) /**< MCO2 divided by 4. */ -#define STM32_MCO2PRE_DIV5 (7 << 27) /**< MCO2 divided by 5. */ - -#define STM32_MCO2SEL_MASK (3U << 30) /**< MCO2 mask. */ -#define STM32_MCO2SEL_SYSCLK (0U << 30) /**< SYSCLK clock on MCO2 pin. */ -#define STM32_MCO2SEL_PLLI2S (1U << 30) /**< PLLI2S clock on MCO2 pin. */ -#define STM32_MCO2SEL_HSE (2U << 30) /**< HSE clock on MCO2 pin. */ -#define STM32_MCO2SEL_PLL (3U << 30) /**< PLL clock on MCO2 pin. */ - -#define STM32_RTC_NOCLOCK (0 << 8) /**< No clock. */ -#define STM32_RTC_LSE (1 << 8) /**< LSE used as RTC clock. */ -#define STM32_RTC_LSI (2 << 8) /**< LSI used as RTC clock. */ -#define STM32_RTC_HSE (3 << 8) /**< HSE divided by programmable - prescaler used as RTC clock*/ - -/** - * @name RCC_PLLI2SCFGR register bits definitions - * @{ - */ -#define STM32_PLLI2SN_MASK (511 << 6) /**< PLLI2SN mask. */ -#define STM32_PLLI2SR_MASK (7 << 28) /**< PLLI2SR mask. */ -/** @} */ - -/** - * @name RCC_BDCR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 8) /**< RTC source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 8) /**< No RTC source. */ -#define STM32_RTCSEL_LSE (1 << 8) /**< RTC source is LSE. */ -#define STM32_RTCSEL_LSI (2 << 8) /**< RTC source is LSI. */ -#define STM32_RTCSEL_HSEDIV (3 << 8) /**< RTC source is HSE divided. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name STM32F4xx capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_ADC1_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 0) | \ - STM32_DMA_STREAM_ID_MSK(2, 4)) -#define STM32_ADC1_DMA_CHN 0x00000000 - -#define STM32_HAS_ADC2 TRUE -#define STM32_ADC2_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 2) | \ - STM32_DMA_STREAM_ID_MSK(2, 3)) -#define STM32_ADC2_DMA_CHN 0x00001100 - -#define STM32_HAS_ADC3 TRUE -#define STM32_ADC3_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 0) | \ - STM32_DMA_STREAM_ID_MSK(2, 1)) -#define STM32_ADC3_DMA_CHN 0x00000022 - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 TRUE -#define STM32_HAS_CAN2 TRUE -#define STM32_CAN_MAX_FILTERS 28 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA TRUE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 TRUE - -/* ETH attributes.*/ -#define STM32_HAS_ETH TRUE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 23 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF TRUE -#define STM32_HAS_GPIOG TRUE -#define STM32_HAS_GPIOH TRUE -#define STM32_HAS_GPIOI TRUE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 0) | \ - STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C1_RX_DMA_CHN 0x00100001 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) | \ - (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x11000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2) | \ - STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_I2C2_RX_DMA_CHN 0x00007700 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C2_TX_DMA_CHN 0x70000000 - -#define STM32_HAS_I2C3 TRUE -#define STM32_I2C3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_I2C3_RX_DMA_CHN 0x00000300 -#define STM32_I2C3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C3_TX_DMA_CHN 0x00030000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#if defined(STM32F4XX) || defined(__DOXYGEN__) -#define STM32_RTC_HAS_SUBSECONDS TRUE -#else -#define STM32_RTC_HAS_SUBSECONDS FALSE -#endif -#define STM32_RTC_IS_CALENDAR TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO TRUE -#define STM32_SDC_SDIO_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 3) | \ - STM32_DMA_STREAM_ID_MSK(2, 6)) -#define STM32_SDC_SDIO_DMA_CHN 0x04004000 - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 0) | \ - STM32_DMA_STREAM_ID_MSK(2, 2)) -#define STM32_SPI1_RX_DMA_CHN 0x00000303 -#define STM32_SPI1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 3) | \ - STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_SPI1_TX_DMA_CHN 0x00303000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 TRUE -#define STM32_SPI3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 0) | \ - STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5) | \ - STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 TRUE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 TRUE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 TRUE -#define STM32_HAS_TIM9 TRUE -#define STM32_HAS_TIM10 TRUE -#define STM32_HAS_TIM11 TRUE -#define STM32_HAS_TIM12 TRUE -#define STM32_HAS_TIM13 TRUE -#define STM32_HAS_TIM14 TRUE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 2) | \ - STM32_DMA_STREAM_ID_MSK(2, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00400400 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 7)) -#define STM32_USART1_TX_DMA_CHN 0x40000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART2_RX_DMA_CHN 0x00400000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_TX_DMA_CHN 0x04000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 1)) -#define STM32_USART3_RX_DMA_CHN 0x00000040 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3) | \ - STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART3_TX_DMA_CHN 0x00074000 - -#define STM32_HAS_UART4 TRUE -#define STM32_UART4_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_UART4_RX_DMA_CHN 0x00000400 -#define STM32_UART4_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_UART4_TX_DMA_CHN 0x00040000 - -#define STM32_HAS_UART5 TRUE -#define STM32_UART5_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 0)) -#define STM32_UART5_RX_DMA_CHN 0x00000004 -#define STM32_UART5_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_UART5_TX_DMA_CHN 0x40000000 - -#define STM32_HAS_USART6 TRUE -#define STM32_USART6_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 1) | \ - STM32_DMA_STREAM_ID_MSK(2, 2)) -#define STM32_USART6_RX_DMA_CHN 0x00000550 -#define STM32_USART6_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(2, 6) | \ - STM32_DMA_STREAM_ID_MSK(2, 7)) -#define STM32_USART6_TX_DMA_CHN 0x55000000 - -/* USB attributes.*/ -#define STM32_HAS_USB FALSE -#define STM32_HAS_OTG1 TRUE -#define STM32_HAS_OTG2 TRUE -/** @} */ - -/*===========================================================================*/ -/* Platform specific friendly IRQ names. */ -/*===========================================================================*/ - -/** - * @name IRQ VECTOR names - * @{ - */ -#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */ -#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line - detect. */ -#define TAMP_STAMP_IRQHandler Vector48 /**< Tamper and TimeStamp - through EXTI Line. */ -#define RTC_WKUP_IRQHandler Vector4C /**< RTC wakeup EXTI Line. */ -#define FLASH_IRQHandler Vector50 /**< Flash. */ -#define RCC_IRQHandler Vector54 /**< RCC. */ -#define EXTI0_IRQHandler Vector58 /**< EXTI Line 0. */ -#define EXTI1_IRQHandler Vector5C /**< EXTI Line 1. */ -#define EXTI2_IRQHandler Vector60 /**< EXTI Line 2. */ -#define EXTI3_IRQHandler Vector64 /**< EXTI Line 3. */ -#define EXTI4_IRQHandler Vector68 /**< EXTI Line 4. */ -#define DMA1_Stream0_IRQHandler Vector6C /**< DMA1 Stream 0. */ -#define DMA1_Stream1_IRQHandler Vector70 /**< DMA1 Stream 1. */ -#define DMA1_Stream2_IRQHandler Vector74 /**< DMA1 Stream 2. */ -#define DMA1_Stream3_IRQHandler Vector78 /**< DMA1 Stream 3. */ -#define DMA1_Stream4_IRQHandler Vector7C /**< DMA1 Stream 4. */ -#define DMA1_Stream5_IRQHandler Vector80 /**< DMA1 Stream 5. */ -#define DMA1_Stream6_IRQHandler Vector84 /**< DMA1 Stream 6. */ -#define ADC1_2_3_IRQHandler Vector88 /**< ADC1, ADC2 and ADC3. */ -#define CAN1_TX_IRQHandler Vector8C /**< CAN1 TX. */ -#define CAN1_RX0_IRQHandler Vector90 /**< CAN1 RX0. */ -#define CAN1_RX1_IRQHandler Vector94 /**< CAN1 RX1. */ -#define CAN1_SCE_IRQHandler Vector98 /**< CAN1 SCE. */ -#define EXTI9_5_IRQHandler Vector9C /**< EXTI Line 9..5. */ -#define TIM1_BRK_IRQHandler VectorA0 /**< TIM1 Break. */ -#define TIM1_UP_IRQHandler VectorA4 /**< TIM1 Update. */ -#define TIM1_TRG_COM_IRQHandler VectorA8 /**< TIM1 Trigger and - Commutation. */ -#define TIM1_CC_IRQHandler VectorAC /**< TIM1 Capture Compare. */ -#define TIM2_IRQHandler VectorB0 /**< TIM2. */ -#define TIM3_IRQHandler VectorB4 /**< TIM3. */ -#define TIM4_IRQHandler VectorB8 /**< TIM4. */ -#define I2C1_EV_IRQHandler VectorBC /**< I2C1 Event. */ -#define I2C1_ER_IRQHandler VectorC0 /**< I2C1 Error. */ -#define I2C2_EV_IRQHandler VectorC4 /**< I2C2 Event. */ -#define I2C2_ER_IRQHandler VectorC8 /**< I2C1 Error. */ -#define SPI1_IRQHandler VectorCC /**< SPI1. */ -#define SPI2_IRQHandler VectorD0 /**< SPI2. */ -#define USART1_IRQHandler VectorD4 /**< USART1. */ -#define USART2_IRQHandler VectorD8 /**< USART2. */ -#define USART3_IRQHandler VectorDC /**< USART3. */ -#define EXTI15_10_IRQHandler VectorE0 /**< EXTI Line 15..10. */ -#define RTC_Alarm_IRQHandler VectorE4 /**< RTC alarms (A and B) - through EXTI line. */ -#define OTG_FS_WKUP_IRQHandler VectorE8 /**< USB OTG FS Wakeup through - EXTI line. */ -#define TIM8_BRK_IRQHandler VectorEC /**< TIM8 Break. */ -#define TIM8_UP_IRQHandler VectorF0 /**< TIM8 Update. */ -#define TIM8_TRG_COM_IRQHandler VectorF4 /**< TIM8 Trigger and - Commutation. */ -#define TIM8_CC_IRQHandler VectorF8 /**< TIM8 Capture Compare. */ -#define DMA1_Stream7_IRQHandler VectorFC /**< DMA1 Stream 7. */ -#define FSMC_IRQHandler Vector100 /**< FSMC. */ -#define SDIO_IRQHandler Vector104 /**< SDIO. */ -#define TIM5_IRQHandler Vector108 /**< TIM5. */ -#define SPI3_IRQHandler Vector10C /**< SPI3. */ -#define UART4_IRQHandler Vector110 /**< UART4. */ -#define UART5_IRQHandler Vector114 /**< UART5. */ -#define TIM6_IRQHandler Vector118 /**< TIM6. */ -#define TIM7_IRQHandler Vector11C /**< TIM7. */ -#define DMA2_Stream0_IRQHandler Vector120 /**< DMA2 Stream0. */ -#define DMA2_Stream1_IRQHandler Vector124 /**< DMA2 Stream1. */ -#define DMA2_Stream2_IRQHandler Vector128 /**< DMA2 Stream2. */ -#define DMA2_Stream3_IRQHandler Vector12C /**< DMA2 Stream3. */ -#define DMA2_Stream4_IRQHandler Vector130 /**< DMA2 Stream4. */ -#define ETH_IRQHandler Vector134 /**< Ethernet. */ -#define ETH_WKUP_IRQHandler Vector138 /**< Ethernet Wakeup through - EXTI line. */ -#define CAN2_TX_IRQHandler Vector13C /**< CAN2 TX. */ -#define CAN2_RX0_IRQHandler Vector140 /**< CAN2 RX0. */ -#define CAN2_RX1_IRQHandler Vector144 /**< CAN2 RX1. */ -#define CAN2_SCE_IRQHandler Vector148 /**< CAN2 SCE. */ -#define OTG_FS_IRQHandler Vector14C /**< USB OTG FS. */ -#define DMA2_Stream5_IRQHandler Vector150 /**< DMA2 Stream5. */ -#define DMA2_Stream6_IRQHandler Vector154 /**< DMA2 Stream6. */ -#define DMA2_Stream7_IRQHandler Vector158 /**< DMA2 Stream7. */ -#define USART6_IRQHandler Vector15C /**< USART6. */ -#define I2C3_EV_IRQHandler Vector160 /**< I2C3 Event. */ -#define I2C3_ER_IRQHandler Vector164 /**< I2C3 Error. */ -#define OTG_HS_EP1_OUT_IRQHandler Vector168 /**< USB OTG HS End Point 1 Out.*/ -#define OTG_HS_EP1_IN_IRQHandler Vector16C /**< USB OTG HS End Point 1 In. */ -#define OTG_HS_WKUP_IRQHandler Vector170 /**< USB OTG HS Wakeup through - EXTI line. */ -#define OTG_HS_IRQHandler Vector174 /**< USB OTG HS. */ -#define DCMI_IRQHandler Vector178 /**< DCMI. */ -#define CRYP_IRQHandler Vector17C /**< CRYP. */ -#define HASH_RNG_IRQHandler Vector180 /**< Hash and Rng. */ -#if defined(STM32F4XX) || defined(__DOXYGEN__) -#define FPU_IRQHandler Vector184 /**< Floating Point Unit. */ -#endif -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Disables the PWR/RCC initialization in the HAL. - */ -#if !defined(STM32_NO_INIT) || defined(__DOXYGEN__) -#define STM32_NO_INIT FALSE -#endif - -/** - * @brief Enables or disables the programmable voltage detector. - */ -#if !defined(STM32_PVD_ENABLE) || defined(__DOXYGEN__) -#define STM32_PVD_ENABLE FALSE -#endif - -/** - * @brief Sets voltage level for programmable voltage detector. - */ -#if !defined(STM32_PLS) || defined(__DOXYGEN__) -#define STM32_PLS STM32_PLS_LEV0 -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM32_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSI_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSE_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSE clock source. - */ -#if !defined(STM32_LSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSE_ENABLED FALSE -#endif - -/** - * @brief USB/SDIO clock setting. - */ -#if !defined(STM32_CLOCK48_REQUIRED) || defined(__DOXYGEN__) -#define STM32_CLOCK48_REQUIRED TRUE -#endif - -/** - * @brief Main clock source selection. - * @note If the selected clock source is not the PLL then the PLL is not - * initialized and started. - * @note The default value is calculated for a 168MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -#if defined(STM32F4XX) || defined(__DOXYGEN__) -/** - * @brief Core voltage selection. - * @note This setting affects all the performance and clock related - * settings, the maximum performance is only obtainable selecting - * the maximum voltage. - */ -#if !defined(STM32_VOS) || defined(__DOXYGEN__) -#define STM32_VOS STM32_VOS_HIGH -#endif - -/** - * @brief Clock source for the PLLs. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 168MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSE -#endif - -/** - * @brief PLLM divider value. - * @note The allowed values are 2..63. - * @note The default value is calculated for a 168MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLM_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLM_VALUE 8 -#endif - -/** - * @brief PLLN multiplier value. - * @note The allowed values are 192..432. - * @note The default value is calculated for a 168MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLN_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLN_VALUE 336 -#endif - -/** - * @brief PLLP divider value. - * @note The allowed values are 2, 4, 6, 8. - * @note The default value is calculated for a 168MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLP_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLP_VALUE 2 -#endif - -/** - * @brief PLLQ multiplier value. - * @note The allowed values are 2..15. - * @note The default value is calculated for a 168MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLQ_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLQ_VALUE 7 -#endif - -#else /* !defined(STM32F4XX) */ -/** - * @brief Clock source for the PLLs. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 120MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSE -#endif - -/** - * @brief PLLM divider value. - * @note The allowed values are 2..63. - * @note The default value is calculated for a 120MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLM_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLM_VALUE 8 -#endif - -/** - * @brief PLLN multiplier value. - * @note The allowed values are 192..432. - * @note The default value is calculated for a 120MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLN_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLN_VALUE 240 -#endif - -/** - * @brief PLLP divider value. - * @note The allowed values are 2, 4, 6, 8. - * @note The default value is calculated for a 120MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLP_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLP_VALUE 2 -#endif - -/** - * @brief PLLQ multiplier value. - * @note The allowed values are 2..15. - * @note The default value is calculated for a 120MHz system clock from - * an external 8MHz HSE clock. - */ -#if !defined(STM32_PLLQ_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLQ_VALUE 5 -#endif -#endif /* !defined(STM32F4XX) */ - -/** - * @brief AHB prescaler value. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE1) || defined(__DOXYGEN__) -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#endif - -/** - * @brief APB2 prescaler value. - */ -#if !defined(STM32_PPRE2) || defined(__DOXYGEN__) -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#endif - -/** - * @brief RTC clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_LSE -#endif - -/** - * @brief RTC HSE prescaler value. - */ -#if !defined(STM32_RTCPRE_VALUE) || defined(__DOXYGEN__) -#define STM32_RTCPRE_VALUE 8 -#endif - -/** - * @brief MC01 clock source value. - * @note The default value outputs HSI clock on MC01 pin. - */ -#if !defined(STM32_MCO1SEL) || defined(__DOXYGEN__) -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#endif - -/** - * @brief MC01 prescaler value. - * @note The default value outputs HSI clock on MC01 pin. - */ -#if !defined(STM32_MCO1PRE) || defined(__DOXYGEN__) -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#endif - -/** - * @brief MC02 clock source value. - * @note The default value outputs SYSCLK / 5 on MC02 pin. - */ -#if !defined(STM32_MCO2SEL) || defined(__DOXYGEN__) -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#endif - -/** - * @brief MC02 prescaler value. - * @note The default value outputs SYSCLK / 5 on MC02 pin. - */ -#if !defined(STM32_MCO2PRE) || defined(__DOXYGEN__) -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#endif - -/** - * @brief I2S clock source. - */ -#if !defined(STM32_I2SSRC) || defined(__DOXYGEN__) -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#endif - -/** - * @brief PLLI2SN multiplier value. - * @note The allowed values are 192..432. - */ -#if !defined(STM32_PLLI2SN_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLI2SN_VALUE 192 -#endif - -/** - * @brief PLLI2SR multiplier value. - * @note The allowed values are 2..7. - */ -#if !defined(STM32_PLLI2SR_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLI2SR_VALUE 5 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if defined(STM32F4XX) || defined(__DOXYGEN__) -/* - * Configuration-related checks. - */ -#if !defined(STM32F4xx_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F4xx_MCUCONF not defined" -#endif - -/** - * @brief Maximum SYSCLK. - * @note It is a function of the core voltage setting. - */ -#if (STM32_VOS == STM32_VOS_HIGH) || defined(__DOXYGEN__) -#define STM32_SYSCLK_MAX 168000000 -#else -#define STM32_SYSCLK_MAX 144000000 -#endif - -#else /* !defined(STM32F4XX) */ -/* - * Configuration-related checks. - */ -#if !defined(STM32F2xx_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32F2xx_MCUCONF not defined" -#endif -#endif /* !defined(STM32F4XX) */ - -/** - * @brief Maximum frequency thresholds and wait states for flash access. - * @note The values are valid for 2.7V to 3.6V supply range. - */ -#if defined(STM32F4XX) || defined(__DOXYGEN__) -#if ((STM32_VDD >= 270) && (STM32_VDD <= 360)) || defined(__DOXYGEN__) -#define STM32_0WS_THRESHOLD 30000000 -#define STM32_1WS_THRESHOLD 60000000 -#define STM32_2WS_THRESHOLD 90000000 -#define STM32_3WS_THRESHOLD 120000000 -#define STM32_4WS_THRESHOLD 150000000 -#define STM32_5WS_THRESHOLD 168000000 -#define STM32_6WS_THRESHOLD 0 -#define STM32_7WS_THRESHOLD 0 -#elif (STM32_VDD >= 240) && (STM32_VDD < 270) -#define STM32_0WS_THRESHOLD 24000000 -#define STM32_1WS_THRESHOLD 48000000 -#define STM32_2WS_THRESHOLD 72000000 -#define STM32_3WS_THRESHOLD 96000000 -#define STM32_4WS_THRESHOLD 120000000 -#define STM32_5WS_THRESHOLD 144000000 -#define STM32_6WS_THRESHOLD 168000000 -#define STM32_7WS_THRESHOLD 0 -#elif (STM32_VDD >= 210) && (STM32_VDD < 240) -#define STM32_0WS_THRESHOLD 18000000 -#define STM32_1WS_THRESHOLD 36000000 -#define STM32_2WS_THRESHOLD 54000000 -#define STM32_3WS_THRESHOLD 72000000 -#define STM32_4WS_THRESHOLD 90000000 -#define STM32_5WS_THRESHOLD 108000000 -#define STM32_6WS_THRESHOLD 120000000 -#define STM32_7WS_THRESHOLD 138000000 -#elif (STM32_VDD >= 180) && (STM32_VDD < 210) -#define STM32_0WS_THRESHOLD 16000000 -#define STM32_1WS_THRESHOLD 32000000 -#define STM32_2WS_THRESHOLD 48000000 -#define STM32_3WS_THRESHOLD 64000000 -#define STM32_4WS_THRESHOLD 80000000 -#define STM32_5WS_THRESHOLD 96000000 -#define STM32_6WS_THRESHOLD 112000000 -#define STM32_7WS_THRESHOLD 128000000 -#else -#error "invalid VDD voltage specified" -#endif - -#else /* !defined(STM32F4XX) */ -#if ((STM32_VDD >= 270) && (STM32_VDD <= 360)) || defined(__DOXYGEN__) -#define STM32_0WS_THRESHOLD 30000000 -#define STM32_1WS_THRESHOLD 60000000 -#define STM32_2WS_THRESHOLD 90000000 -#define STM32_3WS_THRESHOLD 120000000 -#define STM32_4WS_THRESHOLD 0 -#define STM32_5WS_THRESHOLD 0 -#define STM32_6WS_THRESHOLD 0 -#define STM32_7WS_THRESHOLD 0 -#elif (STM32_VDD >= 240) && (STM32_VDD < 270) -#define STM32_0WS_THRESHOLD 24000000 -#define STM32_1WS_THRESHOLD 48000000 -#define STM32_2WS_THRESHOLD 72000000 -#define STM32_3WS_THRESHOLD 96000000 -#define STM32_4WS_THRESHOLD 120000000 -#define STM32_5WS_THRESHOLD 0 -#define STM32_6WS_THRESHOLD 0 -#define STM32_7WS_THRESHOLD 0 -#elif (STM32_VDD >= 210) && (STM32_VDD < 240) -#define STM32_0WS_THRESHOLD 18000000 -#define STM32_1WS_THRESHOLD 36000000 -#define STM32_2WS_THRESHOLD 54000000 -#define STM32_3WS_THRESHOLD 72000000 -#define STM32_4WS_THRESHOLD 90000000 -#define STM32_5WS_THRESHOLD 108000000 -#define STM32_6WS_THRESHOLD 120000000 -#define STM32_7WS_THRESHOLD 0 -#elif (STM32_VDD >= 180) && (STM32_VDD < 210) -#define STM32_0WS_THRESHOLD 16000000 -#define STM32_1WS_THRESHOLD 32000000 -#define STM32_2WS_THRESHOLD 48000000 -#define STM32_3WS_THRESHOLD 64000000 -#define STM32_4WS_THRESHOLD 80000000 -#define STM32_5WS_THRESHOLD 96000000 -#define STM32_6WS_THRESHOLD 112000000 -#define STM32_7WS_THRESHOLD 120000000 -#else -#error "invalid VDD voltage specified" -#endif -#endif /* !defined(STM32F4XX) */ - -/* - * HSI related checks. - */ -#if STM32_HSI_ENABLED -#else /* !STM32_HSI_ENABLED */ - -#if STM32_SW == STM32_SW_HSI -#error "HSI not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCO1SEL == STM32_MCO1SEL_HSI) || \ - ((STM32_MCO1SEL == STM32_MCO1SEL_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCO1SEL" -#endif - -#if (STM32_MCO2SEL == STM32_MCO2SEL_HSI) || \ - ((STM32_MCO2SEL == STM32_MCO2SEL_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "HSI not enabled, required by STM32_MCO2SEL" -#endif - -#if (STM32_I2SSRC == STM32_I2SSRC_PLLI2S) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI) -#error "HSI not enabled, required by STM32_I2SSRC" -#endif - -#endif /* !STM32_HSI_ENABLED */ - -/* - * HSE related checks. - */ -#if STM32_HSE_ENABLED - -#if STM32_HSECLK == 0 -#error "HSE frequency not defined" -#elif (STM32_HSECLK < STM32_HSECLK_MIN) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (STM32_HSECLK_MIN...STM32_HSECLK_MAX)" -#endif - -#else /* !STM32_HSE_ENABLED */ - -#if STM32_SW == STM32_SW_HSE -#error "HSE not enabled, required by STM32_SW" -#endif - -#if (STM32_SW == STM32_SW_PLL) && (STM32_PLLSRC == STM32_PLLSRC_HSE) -#error "HSE not enabled, required by STM32_SW and STM32_PLLSRC" -#endif - -#if (STM32_MCO1SEL == STM32_MCO1SEL_HSE) || \ - ((STM32_MCO1SEL == STM32_MCO1SEL_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) -#error "HSE not enabled, required by STM32_MCO1SEL" -#endif - -#if (STM32_MCO2SEL == STM32_MCO2SEL_HSE) || \ - ((STM32_MCO2SEL == STM32_MCO2SEL_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) -#error "HSE not enabled, required by STM32_MCO2SEL" -#endif - -#if (STM32_I2SSRC == STM32_I2SSRC_PLLI2S) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE) -#error "HSE not enabled, required by STM32_I2SSRC" -#endif - -#if STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#error "HSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_HSE_ENABLED */ - -/* - * LSI related checks. - */ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSI -#error "LSI not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSI_ENABLED */ - -/* - * LSE related checks. - */ -#if STM32_LSE_ENABLED - -#if (STM32_LSECLK == 0) -#error "LSE frequency not defined" -#endif - -#if (STM32_LSECLK < STM32_LSECLK_MIN) || (STM32_LSECLK > STM32_LSECLK_MAX) -#error "STM32_LSECLK outside acceptable range (STM32_LSECLK_MIN...STM32_LSECLK_MAX)" -#endif - -#else /* !STM32_LSE_ENABLED */ - -#if STM32_RTCSEL == STM32_RTCSEL_LSE -#error "LSE not enabled, required by STM32_RTCSEL" -#endif - -#endif /* !STM32_LSE_ENABLED */ - -/** - * @brief STM32_PLLM field. - */ -#if ((STM32_PLLM_VALUE >= 2) && (STM32_PLLM_VALUE <= 63)) || \ - defined(__DOXYGEN__) -#define STM32_PLLM (STM32_PLLM_VALUE << 0) -#else -#error "invalid STM32_PLLM_VALUE value specified" -#endif - -/** - * @brief PLLs input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) -#define STM32_PLLCLKIN (STM32_HSECLK / STM32_PLLM_VALUE) -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN (STM32_HSICLK / STM32_PLLM_VALUE) -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* - * PLLs input frequency range check. - */ -#if (STM32_PLLCLKIN < STM32_PLLIN_MIN) || (STM32_PLLCLKIN > STM32_PLLIN_MAX) -#error "STM32_PLLCLKIN outside acceptable range (STM32_PLLIN_MIN...STM32_PLLIN_MAX)" -#endif - -/* - * PLL enable check. - */ -#if STM32_CLOCK48_REQUIRED || \ - (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCO1SEL == STM32_MCO1SEL_PLL) || \ - (STM32_MCO2SEL == STM32_MCO2SEL_PLL) || \ - defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLL TRUE -#else -#define STM32_ACTIVATE_PLL FALSE -#endif - -/** - * @brief STM32_PLLN field. - */ -#if ((STM32_PLLN_VALUE >= 64) && (STM32_PLLN_VALUE <= 432)) || \ - defined(__DOXYGEN__) -#define STM32_PLLN (STM32_PLLN_VALUE << 6) -#else -#error "invalid STM32_PLLN_VALUE value specified" -#endif - -/** - * @brief STM32_PLLP field. - */ -#if (STM32_PLLP_VALUE == 2) || defined(__DOXYGEN__) -#define STM32_PLLP (0 << 16) -#elif STM32_PLLP_VALUE == 4 -#define STM32_PLLP (1 << 16) -#elif STM32_PLLP_VALUE == 6 -#define STM32_PLLP (2 << 16) -#elif STM32_PLLP_VALUE == 8 -#define STM32_PLLP (3 << 16) -#else -#error "invalid STM32_PLLP_VALUE value specified" -#endif - -/** - * @brief STM32_PLLQ field. - */ -#if ((STM32_PLLQ_VALUE >= 2) && (STM32_PLLQ_VALUE <= 15)) || \ - defined(__DOXYGEN__) -#define STM32_PLLQ (STM32_PLLQ_VALUE << 24) -#else -#error "invalid STM32_PLLQ_VALUE value specified" -#endif - -/** - * @brief PLL VCO frequency. - */ -#define STM32_PLLVCO (STM32_PLLCLKIN * STM32_PLLN_VALUE) - -/* - * PLL VCO frequency range check. - */ -#if (STM32_PLLVCO < STM32_PLLVCO_MIN) || (STM32_PLLVCO > STM32_PLLVCO_MAX) -#error "STM32_PLLVCO outside acceptable range (STM32_PLLVCO_MIN...STM32_PLLVCO_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLVCO / STM32_PLLP_VALUE) - -/* - * PLL output frequency range check. - */ -#if (STM32_PLLCLKOUT < STM32_PLLOUT_MIN) || (STM32_PLLCLKOUT > STM32_PLLOUT_MAX) -#error "STM32_PLLCLKOUT outside acceptable range (STM32_PLLOUT_MIN...STM32_PLLOUT_MAX)" -#endif - -/** - * @brief System clock source. - */ -#if STM32_NO_INIT || defined(__DOXYGEN__) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#elif (STM32_SW == STM32_SW_PLL) -#define STM32_SYSCLK STM32_PLLCLKOUT -#else -#error "invalid STM32_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* - * AHB frequency check. - */ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB1 frequency. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK1 (STM32_HCLK / 1) -#elif STM32_PPRE1 == STM32_PPRE1_DIV2 -#define STM32_PCLK1 (STM32_HCLK / 2) -#elif STM32_PPRE1 == STM32_PPRE1_DIV4 -#define STM32_PCLK1 (STM32_HCLK / 4) -#elif STM32_PPRE1 == STM32_PPRE1_DIV8 -#define STM32_PCLK1 (STM32_HCLK / 8) -#elif STM32_PPRE1 == STM32_PPRE1_DIV16 -#define STM32_PCLK1 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE1 value specified" -#endif - -/* - * APB1 frequency check. - */ -#if STM32_PCLK1 > STM32_PCLK1_MAX -#error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" -#endif - -/** - * @brief APB2 frequency. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK2 (STM32_HCLK / 1) -#elif STM32_PPRE2 == STM32_PPRE2_DIV2 -#define STM32_PCLK2 (STM32_HCLK / 2) -#elif STM32_PPRE2 == STM32_PPRE2_DIV4 -#define STM32_PCLK2 (STM32_HCLK / 4) -#elif STM32_PPRE2 == STM32_PPRE2_DIV8 -#define STM32_PCLK2 (STM32_HCLK / 8) -#elif STM32_PPRE2 == STM32_PPRE2_DIV16 -#define STM32_PCLK2 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE2 value specified" -#endif - -/* - * APB2 frequency check. - */ -#if STM32_PCLK2 > STM32_PCLK2_MAX -#error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" -#endif - -/* - * PLLI2S enable check. - */ -#if (STM32_I2SSRC == STM32_I2SSRC_PLLI2S) || defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLLI2S TRUE -#else -#define STM32_ACTIVATE_PLLI2S FALSE -#endif - -/** - * @brief STM32_PLLI2SN field. - */ -#if ((STM32_PLLI2SN_VALUE >= 192) && (STM32_PLLI2SN_VALUE <= 432)) || \ - defined(__DOXYGEN__) -#define STM32_PLLI2SN (STM32_PLLI2SN_VALUE << 6) -#else -#error "invalid STM32_PLLI2SN_VALUE value specified" -#endif - -/** - * @brief STM32_PLLI2SR field. - */ -#if ((STM32_PLLI2SR_VALUE >= 2) && (STM32_PLLI2SR_VALUE <= 7)) || \ - defined(__DOXYGEN__) -#define STM32_PLLI2SR (STM32_PLLI2SR_VALUE << 28) -#else -#error "invalid STM32_PLLI2SR_VALUE value specified" -#endif - -/** - * @brief PLL VCO frequency. - */ -#define STM32_PLLI2SVCO (STM32_PLLCLKIN * STM32_PLLI2SN_VALUE) - -/* - * PLLI2S VCO frequency range check. - */ -#if (STM32_PLLI2SVCO < STM32_PLLVCO_MIN) || \ - (STM32_PLLI2SVCO > STM32_PLLVCO_MAX) -#error "STM32_PLLI2SVCO outside acceptable range (STM32_PLLVCO_MIN...STM32_PLLVCO_MAX)" -#endif - -/** - * @brief PLLI2S output clock frequency. - */ -#define STM32_PLLI2SCLKOUT (STM32_PLLI2SVCO / STM32_PLLI2SR) - -/* - * PLLI2S output frequency range check. - */ -#if STM32_PLLI2SCLKOUT > STM32_SPII2S_MAX -#error "STM32_PLLI2SCLKOUT outside acceptable range (STM32_SPII2S_MAX)" -#endif - -/** - * @brief MCO1 divider clock. - */ -#if (STM32_MCO1SEL == STM32_MCO1SEL_HSI) || defined(__DOXYGEN__) -#define STM32_MCO1DIVCLK STM32_HSICLK -#elif STM32_MCO1SEL == STM32_MCO1SEL_LSE -#define STM32_MCO1DIVCLK STM32_LSECLK -#elif STM32_MCO1SEL == STM32_MCO1SEL_HSE -#define STM32_MCO1DIVCLK STM32_HSECLK -#elif STM32_MCO1SEL == STM32_MCO1SEL_PLL -#define STM32_MCO1DIVCLK STM32_PLLCLKOUT -#else -#error "invalid STM32_MCO1SEL value specified" -#endif - -/** - * @brief MCO1 output pin clock. - */ -#if (STM32_MCO1PRE == STM32_MCO1PRE_DIV1) || defined(__DOXYGEN__) -#define STM32_MCO1CLK STM32_MCO1DIVCLK -#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV2 -#define STM32_MCO1CLK (STM32_MCO1DIVCLK / 2) -#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV3 -#define STM32_MCO1CLK (STM32_MCO1DIVCLK / 3) -#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV4 -#define STM32_MCO1CLK (STM32_MCO1DIVCLK / 4) -#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV5 -#define STM32_MCO1CLK (STM32_MCO1DIVCLK / 5) -#else -#error "invalid STM32_MCO1PRE value specified" -#endif - -/** - * @brief MCO2 divider clock. - */ -#if (STM32_MCO2SEL == STM32_MCO2SEL_HSE) || defined(__DOXYGEN__) -#define STM32_MCO2DIVCLK STM32_HSECLK -#elif STM32_MCO2SEL == STM32_MCO2SEL_PLL -#define STM32_MCO2DIVCLK STM32_PLLCLKOUT -#elif STM32_MCO2SEL == STM32_MCO2SEL_SYSCLK -#define STM32_MCO2DIVCLK STM32_SYSCLK -#elif STM32_MCO2SEL == STM32_MCO2SEL_PLLI2S -#define STM32_MCO2DIVCLK STM32_PLLI2S -#else -#error "invalid STM32_MCO2SEL value specified" -#endif - -/** - * @brief MCO2 output pin clock. - */ -#if (STM32_MCO2PRE == STM32_MCO2PRE_DIV1) || defined(__DOXYGEN__) -#define STM32_MCO2CLK STM32_MCO2DIVCLK -#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV2 -#define STM32_MCO2CLK (STM32_MCO2DIVCLK / 2) -#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV3 -#define STM32_MCO2CLK (STM32_MCO2DIVCLK / 3) -#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV4 -#define STM32_MCO2CLK (STM32_MCO2DIVCLK / 4) -#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV5 -#define STM32_MCO2CLK (STM32_MCO2DIVCLK / 5) -#else -#error "invalid STM32_MCO2PRE value specified" -#endif - -/** - * @brief RTC HSE divider setting. - */ -#if ((STM32_RTCPRE_VALUE >= 2) && (STM32_RTCPRE_VALUE <= 31)) || \ - defined(__DOXYGEN__) -#define STM32_RTCPRE (STM32_RTCPRE_VALUE << 16) -#else -#error "invalid STM32_RTCPRE value specified" -#endif - -/** - * @brief HSE divider toward RTC clock. - */ -#if ((STM32_RTCPRE_VALUE >= 2) && (STM32_RTCPRE_VALUE <= 31)) || \ - defined(__DOXYGEN__) -#define STM32_HSEDIVCLK (STM32_HSECLK / STM32_RTCPRE_VALUE) -#else -#error "invalid STM32_RTCPRE value specified" -#endif - -/** - * @brief RTC clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_NOCLOCK) || defined(__DOXYGEN__) -#define STM32_RTCCLK 0 -#elif STM32_RTCSEL == STM32_RTCSEL_LSE -#define STM32_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM32_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM32_RTCCLK STM32_HSEDIVCLK -#else -#error "invalid STM32_RTCSEL value specified" -#endif - -/** - * @brief RTC HSE divider setting. - */ -#if ((STM32_RTCPRE_VALUE >= 2) && (STM32_RTCPRE_VALUE <= 31)) || \ - defined(__DOXYGEN__) -#define STM32_RTCPRE (STM32_RTCPRE_VALUE << 16) -#else -#error "invalid STM32_RTCPRE value specified" -#endif - -/** - * @brief 48MHz frequency. - */ -#if STM32_CLOCK48_REQUIRED || defined(__DOXYGEN__) -#define STM32_PLL48CLK (STM32_PLLVCO / STM32_PLLQ_VALUE) -#else -#define STM32_PLL48CLK 0 -#endif - -/** - * @brief Timers 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14 clock. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK1 * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK1 * 2) -#endif - -/** - * @brief Timers 1, 8 clock. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK2 (STM32_PCLK2 * 1) -#else -#define STM32_TIMCLK2 (STM32_PCLK2 * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= STM32_0WS_THRESHOLD) || defined(__DOXYGEN__) -#define STM32_FLASHBITS 0x00000000 -#elif STM32_HCLK <= STM32_1WS_THRESHOLD -#define STM32_FLASHBITS 0x00000001 -#elif STM32_HCLK <= STM32_2WS_THRESHOLD -#define STM32_FLASHBITS 0x00000002 -#elif STM32_HCLK <= STM32_3WS_THRESHOLD -#define STM32_FLASHBITS 0x00000003 -#elif STM32_HCLK <= STM32_4WS_THRESHOLD -#define STM32_FLASHBITS 0x00000004 -#elif STM32_HCLK <= STM32_5WS_THRESHOLD -#define STM32_FLASHBITS 0x00000005 -#elif STM32_HCLK <= STM32_6WS_THRESHOLD -#define STM32_FLASHBITS 0x00000006 -#else -#define STM32_FLASHBITS 0x00000007 -#endif - -/* There are differences in vector names in the various sub-families, - normalizing.*/ -#define TIM1_BRK_IRQn TIM1_BRK_TIM9_IRQn -#define TIM1_UP_IRQn TIM1_UP_TIM10_IRQn -#define TIM1_TRG_COM_IRQn TIM1_TRG_COM_TIM11_IRQn -#define TIM8_BRK_IRQn TIM8_BRK_TIM12_IRQn -#define TIM8_UP_IRQn TIM8_UP_TIM13_IRQn -#define TIM8_TRG_COM_IRQn TIM8_TRG_COM_TIM14_IRQn - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type representing a system clock frequency. - */ -typedef uint32_t halclock_t; - -/** - * @brief Type of the realtime free counter value. - */ -typedef uint32_t halrtcnt_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Returns the current value of the system free running counter. - * @note This service is implemented by returning the content of the - * DWT_CYCCNT register. - * - * @return The value of the system free running counter of - * type halrtcnt_t. - * - * @notapi - */ -#define hal_lld_get_counter_value() DWT_CYCCNT - -/** - * @brief Realtime counter frequency. - * @note The DWT_CYCCNT register is incremented directly by the system - * clock so this function returns STM32_HCLK. - * - * @return The realtime counter frequency of type halclock_t. - * - * @notapi - */ -#define hal_lld_get_counter_frequency() STM32_HCLK - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* STM32 ISR, DMA and RCC helpers.*/ -#include "stm32_isr.h" -#include "stm32_dma.h" -#include "stm32_rcc.h" - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void stm32_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/platform.dox b/os/hal/platforms/STM32F4xx/platform.dox deleted file mode 100644 index 9b733a1dc5..0000000000 --- a/os/hal/platforms/STM32F4xx/platform.dox +++ /dev/null @@ -1,368 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32F4xx_DRIVERS STM32F4xx/STM32F2xx Drivers - * @details This section describes all the supported drivers on the STM32F4xx - * and STM32F2xx platform and the implementation details of the single - * drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup STM32F4xx_HAL STM32F4xx Initialization Support - * @details The STM32F4xx HAL support is responsible for system initialization. - * - * @section stm32f4xx_hal_1 Supported HW resources - * - PLL1. - * - PLL2. - * - RCC. - * - Flash. - * . - * @section stm32f4xx_hal_2 STM32F4xx HAL driver implementation features - * - PLL startup and stabilization. - * - Clock tree initialization. - * - Clock source selection. - * - Flash wait states initialization based on the selected clock options. - * - SYSTICK initialization based on current clock and kernel required rate. - * - DMA support initialization. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_ADC STM32F4xx ADC Support - * @details The STM32F4xx ADC driver supports the ADC peripherals using DMA - * channels for maximum performance. - * - * @section stm32f4xx_adc_1 Supported HW resources - * - ADC1. - * - ADC2. - * - ADC3. - * - DMA2. - * . - * @section stm32f4xx_adc_2 STM32F4xx ADC driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Streaming conversion using DMA for maximum performance. - * - Programmable ADC interrupt priority level. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - DMA and ADC errors detection. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_CAN STM32F4xx CAN Support - * @details The STM32F4xx CAN driver uses the CAN peripherals. - * - * @section stm32f4xx_can_1 Supported HW resources - * - bxCAN1. - * . - * @section stm32f4xx_can_2 STM32F4xx CAN driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Support for bxCAN sleep mode. - * - Programmable bxCAN interrupts priority level. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_EXT STM32F4xx EXT Support - * @details The STM32F4xx EXT driver uses the EXTI peripheral. - * - * @section stm32f4xx_ext_1 Supported HW resources - * - EXTI. - * . - * @section stm32f4xx_ext_2 STM32F4xx EXT driver implementation features - * - Each EXTI channel can be independently enabled and programmed. - * - Programmable EXTI interrupts priority level. - * - Capability to work as event sources (WFE) rather than interrupt sources. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_GPT STM32F4xx GPT Support - * @details The STM32F4xx GPT driver uses the TIMx peripherals. - * - * @section stm32f4xx_gpt_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * - TIM5. - * - TIM8. - * . - * @section stm32f4xx_gpt_2 STM32F4xx GPT driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_ICU STM32F4xx ICU Support - * @details The STM32F4xx ICU driver uses the TIMx peripherals. - * - * @section stm32f4xx_icu_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * - TIM5. - * - TIM8. - * . - * @section stm32f4xx_icu_2 STM32F4xx ICU driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_MAC STM32F4xx MAC Support - * @details The STM32F4xx MAC driver supports the ETH peripheral. - * - * @section stm32f4xx_mac_1 Supported HW resources - * - ETH. - * - PHY (external). - * . - * @section stm32f4xx_mac_2 STM32F4xx MAC driver implementation features - * - Dedicated DMA operations. - * - Support for checksum off-loading. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_PAL STM32F4xx PAL Support - * @details The STM32F4xx PAL driver uses the GPIO peripherals. - * - * @section stm32f4xx_pal_1 Supported HW resources - * - GPIOA. - * - GPIOB. - * - GPIOC. - * - GPIOD. - * - GPIOE. - * - GPIOF. - * - GPIOG. - * - GPIOH. - * - GPIOI. - * . - * @section stm32f4xx_pal_2 STM32F4xx PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 16 bits wide ports. - * - Atomic set/reset functions. - * - Atomic set+reset function (atomic bus operations). - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section stm32f4xx_pal_3 Supported PAL setup modes - * The STM32F4xx PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_INPUT_PULLDOWN. - * - @p PAL_MODE_INPUT_ANALOG. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * - @p PAL_MODE_ALTERNATE (non standard). - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section stm32f4xx_pal_4 Suboptimal behavior - * The STM32F4xx GPIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_PWM STM32F4xx PWM Support - * @details The STM32F4xx PWM driver uses the TIMx peripherals. - * - * @section stm32f4xx_pwm_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * - TIM5. - * - TIM8. - * . - * @section stm32f4xx_pwm_2 STM32F4xx PWM driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Four independent PWM channels per timer. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_SDC STM32F4xx SDC Support - * @details The STM32F4xx SDC driver uses the SDIO peripheral. - * - * @section stm32f4xx_sdc_1 Supported HW resources - * - SDIO. - * - DMA2. - * . - * @section stm32f4xx_sdc_2 STM32F4xx SDC driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Programmable interrupt priority. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_SERIAL STM32F4xx Serial Support - * @details The STM32F4xx Serial driver uses the USART/UART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section stm32f4xx_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - USART3. - * - UART4. - * - UART5. - * - USART6. - * . - * @section stm32f4xx_serial_2 STM32F4xx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable priority levels for each UART/USART. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_SPI STM32F4xx SPI Support - * @details The SPI driver supports the STM32F4xx SPI peripherals using DMA - * channels for maximum performance. - * - * @section stm32f4xx_spi_1 Supported HW resources - * - SPI1. - * - SPI2. - * - SPI3. - * - DMA1. - * - DMA2. - * . - * @section stm32f4xx_spi_2 STM32F4xx SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SPI can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each SPI. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_UART STM32F4xx UART Support - * @details The UART driver supports the STM32F4xx USART peripherals using DMA - * channels for maximum performance. - * - * @section stm32f4xx_uart_1 Supported HW resources - * The UART driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - USART3. - * - DMA1. - * - DMA2. - * . - * @section stm32f4xx_uart_2 STM32F4xx UART driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each UART/USART. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_PLATFORM_DRIVERS STM32F4xx Platform Drivers - * @details Platform support drivers. Platform drivers do not implement HAL - * standard driver templates, their role is to support platform - * specific functionalities. - * - * @ingroup STM32F4xx_DRIVERS - */ - -/** - * @defgroup STM32F4xx_DMA STM32F4xx DMA Support - * @details This DMA helper driver is used by the other drivers in order to - * access the shared DMA resources in a consistent way. - * - * @section stm32f4xx_dma_1 Supported HW resources - * The DMA driver can support any of the following hardware resources: - * - DMA1. - * - DMA2. - * . - * @section stm32f4xx_dma_2 STM32F4xx DMA driver implementation features - * - Exports helper functions/macros to the other drivers that share the - * DMA resource. - * - Automatic DMA clock stop when not in use by any driver. - * - DMA streams and interrupt vectors sharing among multiple drivers. - * . - * @ingroup STM32F4xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32F4xx_ISR STM32F4xx ISR Support - * @details This ISR helper driver is used by the other drivers in order to - * map ISR names to physical vector names. - * - * @ingroup STM32F4xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32F4xx_RCC STM32F4xx RCC Support - * @details This RCC helper driver is used by the other drivers in order to - * access the shared RCC resources in a consistent way. - * - * @section stm32f4xx_rcc_1 Supported HW resources - * - RCC. - * . - * @section stm32f4xx_rcc_2 STM32F4xx RCC driver implementation features - * - Peripherals reset. - * - Peripherals clock enable. - * - Peripherals clock disable. - * . - * @ingroup STM32F4xx_PLATFORM_DRIVERS - */ diff --git a/os/hal/platforms/STM32F4xx/platform.mk b/os/hal/platforms/STM32F4xx/platform.mk deleted file mode 100644 index e39dbda59d..0000000000 --- a/os/hal/platforms/STM32F4xx/platform.mk +++ /dev/null @@ -1,28 +0,0 @@ -# List of all the STM32F2xx/STM32F4xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F4xx/stm32_dma.c \ - ${CHIBIOS}/os/hal/platforms/STM32F4xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F4xx/adc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32F4xx/ext_lld_isr.c \ - ${CHIBIOS}/os/hal/platforms/STM32/can_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/ext_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/mac_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/sdc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1/i2c_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/OTGv1/usb_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/RTCv2/rtc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1/uart_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F4xx \ - ${CHIBIOS}/os/hal/platforms/STM32 \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2 \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/OTGv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/RTCv2 \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1 diff --git a/os/hal/platforms/STM32F4xx/stm32_dma.c b/os/hal/platforms/STM32F4xx/stm32_dma.c deleted file mode 100644 index 283e02ca85..0000000000 --- a/os/hal/platforms/STM32F4xx/stm32_dma.c +++ /dev/null @@ -1,532 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/stm32_dma.c - * @brief Enhanced DMA helper driver code. - * - * @addtogroup STM32F4xx_DMA - * @details DMA sharing helper driver. In the STM32 the DMA streams are a - * shared resource, this driver allows to allocate and free DMA - * streams at runtime in order to allow all the other device - * drivers to coordinate the access to the resource. - * @note The DMA ISR handlers are all declared into this module because - * sharing, the various device drivers can associate a callback to - * ISRs when allocating streams. - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/* The following macro is only defined if some driver requiring DMA services - has been enabled.*/ -#if defined(STM32_DMA_REQUIRED) || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/** - * @brief Mask of the DMA1 streams in @p dma_streams_mask. - */ -#define STM32_DMA1_STREAMS_MASK 0x000000FF - -/** - * @brief Mask of the DMA2 streams in @p dma_streams_mask. - */ -#define STM32_DMA2_STREAMS_MASK 0x0000FF00 - -/** - * @brief Post-reset value of the stream CR register. - */ -#define STM32_DMA_CR_RESET_VALUE 0x00000000 - -/** - * @brief Post-reset value of the stream FCR register. - */ -#define STM32_DMA_FCR_RESET_VALUE 0x00000021 - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief DMA streams descriptors. - * @details This table keeps the association between an unique stream - * identifier and the involved physical registers. - * @note Don't use this array directly, use the appropriate wrapper macros - * instead: @p STM32_DMA1_STREAM0, @p STM32_DMA1_STREAM1 etc. - */ -const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS] = { - {DMA1_Stream0, &DMA1->LIFCR, 0, 0, DMA1_Stream0_IRQn}, - {DMA1_Stream1, &DMA1->LIFCR, 6, 1, DMA1_Stream1_IRQn}, - {DMA1_Stream2, &DMA1->LIFCR, 16, 2, DMA1_Stream2_IRQn}, - {DMA1_Stream3, &DMA1->LIFCR, 22, 3, DMA1_Stream3_IRQn}, - {DMA1_Stream4, &DMA1->HIFCR, 0, 4, DMA1_Stream4_IRQn}, - {DMA1_Stream5, &DMA1->HIFCR, 6, 5, DMA1_Stream5_IRQn}, - {DMA1_Stream6, &DMA1->HIFCR, 16, 6, DMA1_Stream6_IRQn}, - {DMA1_Stream7, &DMA1->HIFCR, 22, 7, DMA1_Stream7_IRQn}, - {DMA2_Stream0, &DMA2->LIFCR, 0, 8, DMA2_Stream0_IRQn}, - {DMA2_Stream1, &DMA2->LIFCR, 6, 9, DMA2_Stream1_IRQn}, - {DMA2_Stream2, &DMA2->LIFCR, 16, 10, DMA2_Stream2_IRQn}, - {DMA2_Stream3, &DMA2->LIFCR, 22, 11, DMA2_Stream3_IRQn}, - {DMA2_Stream4, &DMA2->HIFCR, 0, 12, DMA2_Stream4_IRQn}, - {DMA2_Stream5, &DMA2->HIFCR, 6, 13, DMA2_Stream5_IRQn}, - {DMA2_Stream6, &DMA2->HIFCR, 16, 14, DMA2_Stream6_IRQn}, - {DMA2_Stream7, &DMA2->HIFCR, 22, 15, DMA2_Stream7_IRQn}, -}; - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief DMA ISR redirector type. - */ -typedef struct { - stm32_dmaisr_t dma_func; /**< @brief DMA callback function. */ - void *dma_param; /**< @brief DMA callback parameter. */ -} dma_isr_redir_t; - -/** - * @brief Mask of the allocated streams. - */ -static uint32_t dma_streams_mask; - -/** - * @brief DMA IRQ redirectors. - */ -static dma_isr_redir_t dma_isr_redir[STM32_DMA_STREAMS]; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief DMA1 stream 0 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream0_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->LISR >> 0) & STM32_DMA_ISR_MASK; - DMA1->LIFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[0].dma_func) - dma_isr_redir[0].dma_func(dma_isr_redir[0].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 1 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream1_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->LISR >> 6) & STM32_DMA_ISR_MASK; - DMA1->LIFCR = STM32_DMA_ISR_MASK << 6; - if (dma_isr_redir[1].dma_func) - dma_isr_redir[1].dma_func(dma_isr_redir[1].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 2 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream2_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->LISR >> 16) & STM32_DMA_ISR_MASK; - DMA1->LIFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[2].dma_func) - dma_isr_redir[2].dma_func(dma_isr_redir[2].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 3 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream3_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->LISR >> 22) & STM32_DMA_ISR_MASK; - DMA1->LIFCR = STM32_DMA_ISR_MASK << 22; - if (dma_isr_redir[3].dma_func) - dma_isr_redir[3].dma_func(dma_isr_redir[3].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 4 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream4_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->HISR >> 0) & STM32_DMA_ISR_MASK; - DMA1->HIFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[4].dma_func) - dma_isr_redir[4].dma_func(dma_isr_redir[4].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 5 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->HISR >> 6) & STM32_DMA_ISR_MASK; - DMA1->HIFCR = STM32_DMA_ISR_MASK << 6; - if (dma_isr_redir[5].dma_func) - dma_isr_redir[5].dma_func(dma_isr_redir[5].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 6 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream6_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->HISR >> 16) & STM32_DMA_ISR_MASK; - DMA1->HIFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[6].dma_func) - dma_isr_redir[6].dma_func(dma_isr_redir[6].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 7 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Stream7_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->HISR >> 22) & STM32_DMA_ISR_MASK; - DMA1->HIFCR = STM32_DMA_ISR_MASK << 22; - if (dma_isr_redir[7].dma_func) - dma_isr_redir[7].dma_func(dma_isr_redir[7].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 0 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream0_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->LISR >> 0) & STM32_DMA_ISR_MASK; - DMA2->LIFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[8].dma_func) - dma_isr_redir[8].dma_func(dma_isr_redir[8].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 1 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream1_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->LISR >> 6) & STM32_DMA_ISR_MASK; - DMA2->LIFCR = STM32_DMA_ISR_MASK << 6; - if (dma_isr_redir[9].dma_func) - dma_isr_redir[9].dma_func(dma_isr_redir[9].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 2 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream2_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->LISR >> 16) & STM32_DMA_ISR_MASK; - DMA2->LIFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[10].dma_func) - dma_isr_redir[10].dma_func(dma_isr_redir[10].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 3 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream3_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->LISR >> 22) & STM32_DMA_ISR_MASK; - DMA2->LIFCR = STM32_DMA_ISR_MASK << 22; - if (dma_isr_redir[11].dma_func) - dma_isr_redir[11].dma_func(dma_isr_redir[11].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 4 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream4_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->HISR >> 0) & STM32_DMA_ISR_MASK; - DMA2->HIFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[12].dma_func) - dma_isr_redir[12].dma_func(dma_isr_redir[12].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 5 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->HISR >> 6) & STM32_DMA_ISR_MASK; - DMA2->HIFCR = STM32_DMA_ISR_MASK << 6; - if (dma_isr_redir[13].dma_func) - dma_isr_redir[13].dma_func(dma_isr_redir[13].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 6 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream6_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->HISR >> 16) & STM32_DMA_ISR_MASK; - DMA2->HIFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[14].dma_func) - dma_isr_redir[14].dma_func(dma_isr_redir[14].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA2 stream 7 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA2_Stream7_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA2->HISR >> 22) & STM32_DMA_ISR_MASK; - DMA2->HIFCR = STM32_DMA_ISR_MASK << 22; - if (dma_isr_redir[15].dma_func) - dma_isr_redir[15].dma_func(dma_isr_redir[15].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA helper initialization. - * - * @init - */ -void dmaInit(void) { - int i; - - dma_streams_mask = 0; - for (i = 0; i < STM32_DMA_STREAMS; i++) { - _stm32_dma_streams[i].stream->CR = 0; - dma_isr_redir[i].dma_func = NULL; - } - DMA1->LIFCR = 0xFFFFFFFF; - DMA1->HIFCR = 0xFFFFFFFF; - DMA2->LIFCR = 0xFFFFFFFF; - DMA2->HIFCR = 0xFFFFFFFF; -} - -/** - * @brief Allocates a DMA stream. - * @details The stream is allocated and, if required, the DMA clock enabled. - * The function also enables the IRQ vector associated to the stream - * and initializes its priority. - * @pre The stream must not be already in use or an error is returned. - * @post The stream is allocated and the default ISR handler redirected - * to the specified function. - * @post The stream ISR vector is enabled and its priority configured. - * @post The stream must be freed using @p dmaStreamRelease() before it can - * be reused with another peripheral. - * @post The stream is in its post-reset state. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] priority IRQ priority mask for the DMA stream - * @param[in] func handling function pointer, can be @p NULL - * @param[in] param a parameter to be passed to the handling function - * @return The operation status. - * @retval FALSE no error, stream taken. - * @retval TRUE error, stream already taken. - * - * @special - */ -bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param) { - - chDbgCheck(dmastp != NULL, "dmaAllocate"); - - /* Checks if the stream is already taken.*/ - if ((dma_streams_mask & (1 << dmastp->selfindex)) != 0) - return TRUE; - - /* Marks the stream as allocated.*/ - dma_isr_redir[dmastp->selfindex].dma_func = func; - dma_isr_redir[dmastp->selfindex].dma_param = param; - dma_streams_mask |= (1 << dmastp->selfindex); - - /* Enabling DMA clocks required by the current streams set.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) != 0) - rccEnableDMA1(FALSE); - if ((dma_streams_mask & STM32_DMA2_STREAMS_MASK) != 0) - rccEnableDMA2(FALSE); - - /* Putting the stream in a safe state.*/ - dmaStreamDisable(dmastp); - dmastp->stream->CR = STM32_DMA_CR_RESET_VALUE; - dmastp->stream->FCR = STM32_DMA_FCR_RESET_VALUE; - - /* Enables the associated IRQ vector if a callback is defined.*/ - if (func != NULL) - nvicEnableVector(dmastp->vector, CORTEX_PRIORITY_MASK(priority)); - - return FALSE; -} - -/** - * @brief Releases a DMA stream. - * @details The stream is freed and, if required, the DMA clock disabled. - * Trying to release a unallocated stream is an illegal operation - * and is trapped if assertions are enabled. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post The stream is again available. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -void dmaStreamRelease(const stm32_dma_stream_t *dmastp) { - - chDbgCheck(dmastp != NULL, "dmaRelease"); - - /* Check if the streams is not taken.*/ - chDbgAssert((dma_streams_mask & (1 << dmastp->selfindex)) != 0, - "dmaRelease(), #1", "not allocated"); - - /* Disables the associated IRQ vector.*/ - nvicDisableVector(dmastp->vector); - - /* Marks the stream as not allocated.*/ - dma_streams_mask &= ~(1 << dmastp->selfindex); - - /* Shutting down clocks that are no more required, if any.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) == 0) - rccDisableDMA1(FALSE); - if ((dma_streams_mask & STM32_DMA2_STREAMS_MASK) == 0) - rccDisableDMA2(FALSE); -} - -#endif /* STM32_DMA_REQUIRED */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/stm32_dma.h b/os/hal/platforms/STM32F4xx/stm32_dma.h deleted file mode 100644 index af466b01db..0000000000 --- a/os/hal/platforms/STM32F4xx/stm32_dma.h +++ /dev/null @@ -1,461 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/stm32_dma.h - * @brief Enhanced-DMA helper driver header. - * @note This file requires definitions from the ST STM32F4xx header file - * stm32f4xx.h. - * - * @addtogroup STM32F4xx_DMA - * @{ - */ - -#ifndef _STM32_DMA_H_ -#define _STM32_DMA_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Total number of DMA streams. - * @note This is the total number of streams among all the DMA units. - */ -#define STM32_DMA_STREAMS 16 - -/** - * @brief Mask of the ISR bits passed to the DMA callback functions. - */ -#define STM32_DMA_ISR_MASK 0x3D - -/** - * @brief Returns the channel associated to the specified stream. - * - * @param[in] id the unique numeric stream identifier - * @param[in] c a stream/channel association word, one channel per - * nibble - * @return Returns the channel associated to the stream. - */ -#define STM32_DMA_GETCHANNEL(id, c) (((c) >> (((id) & 7) * 4)) & 7) - -/** - * @brief Checks if a DMA priority is within the valid range. - * @param[in] prio DMA priority - * - * @retval The check result. - * @retval FALSE invalid DMA priority. - * @retval TRUE correct DMA priority. - */ -#define STM32_DMA_IS_VALID_PRIORITY(prio) (((prio) >= 0) && ((prio) <= 3)) - -/** - * @brief Returns an unique numeric identifier for a DMA stream. - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return An unique numeric stream identifier. - */ -#define STM32_DMA_STREAM_ID(dma, stream) ((((dma) - 1) * 8) + (stream)) - -/** - * @brief Returns a DMA stream identifier mask. - * - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return A DMA stream identifier mask. - */ -#define STM32_DMA_STREAM_ID_MSK(dma, stream) \ - (1 << STM32_DMA_STREAM_ID(dma, stream)) - -/** - * @brief Checks if a DMA stream unique identifier belongs to a mask. - * @param[in] id the stream numeric identifier - * @param[in] mask the stream numeric identifiers mask - * - * @retval The check result. - * @retval FALSE id does not belong to the mask. - * @retval TRUE id belongs to the mask. - */ -#define STM32_DMA_IS_VALID_ID(id, mask) (((1 << (id)) & (mask))) - -/** - * @name DMA streams identifiers - * @{ - */ -/** - * @brief Returns a pointer to a stm32_dma_stream_t structure. - * - * @param[in] id the stream numeric identifier - * @return A pointer to the stm32_dma_stream_t constant structure - * associated to the DMA stream. - */ -#define STM32_DMA_STREAM(id) (&_stm32_dma_streams[id]) - -#define STM32_DMA1_STREAM0 STM32_DMA_STREAM(0) -#define STM32_DMA1_STREAM1 STM32_DMA_STREAM(1) -#define STM32_DMA1_STREAM2 STM32_DMA_STREAM(2) -#define STM32_DMA1_STREAM3 STM32_DMA_STREAM(3) -#define STM32_DMA1_STREAM4 STM32_DMA_STREAM(4) -#define STM32_DMA1_STREAM5 STM32_DMA_STREAM(5) -#define STM32_DMA1_STREAM6 STM32_DMA_STREAM(6) -#define STM32_DMA1_STREAM7 STM32_DMA_STREAM(7) -#define STM32_DMA2_STREAM0 STM32_DMA_STREAM(8) -#define STM32_DMA2_STREAM1 STM32_DMA_STREAM(9) -#define STM32_DMA2_STREAM2 STM32_DMA_STREAM(10) -#define STM32_DMA2_STREAM3 STM32_DMA_STREAM(11) -#define STM32_DMA2_STREAM4 STM32_DMA_STREAM(12) -#define STM32_DMA2_STREAM5 STM32_DMA_STREAM(13) -#define STM32_DMA2_STREAM6 STM32_DMA_STREAM(14) -#define STM32_DMA2_STREAM7 STM32_DMA_STREAM(15) -/** @} */ - -/** - * @name CR register constants common to all DMA types - * @{ - */ -#define STM32_DMA_CR_EN DMA_SxCR_EN -#define STM32_DMA_CR_TEIE DMA_SxCR_TEIE -#define STM32_DMA_CR_HTIE DMA_SxCR_HTIE -#define STM32_DMA_CR_TCIE DMA_SxCR_TCIE -#define STM32_DMA_CR_DIR_MASK DMA_SxCR_DIR -#define STM32_DMA_CR_DIR_P2M 0 -#define STM32_DMA_CR_DIR_M2P DMA_SxCR_DIR_0 -#define STM32_DMA_CR_DIR_M2M DMA_SxCR_DIR_1 -#define STM32_DMA_CR_CIRC DMA_SxCR_CIRC -#define STM32_DMA_CR_PINC DMA_SxCR_PINC -#define STM32_DMA_CR_MINC DMA_SxCR_MINC -#define STM32_DMA_CR_PSIZE_MASK DMA_SxCR_PSIZE -#define STM32_DMA_CR_PSIZE_BYTE 0 -#define STM32_DMA_CR_PSIZE_HWORD DMA_SxCR_PSIZE_0 -#define STM32_DMA_CR_PSIZE_WORD DMA_SxCR_PSIZE_1 -#define STM32_DMA_CR_MSIZE_MASK DMA_SxCR_MSIZE -#define STM32_DMA_CR_MSIZE_BYTE 0 -#define STM32_DMA_CR_MSIZE_HWORD DMA_SxCR_MSIZE_0 -#define STM32_DMA_CR_MSIZE_WORD DMA_SxCR_MSIZE_1 -#define STM32_DMA_CR_SIZE_MASK (STM32_DMA_CR_MSIZE_MASK | \ - STM32_DMA_CR_MSIZE_MASK) -#define STM32_DMA_CR_PL_MASK DMA_SxCR_PL -#define STM32_DMA_CR_PL(n) ((n) << 16) -/** @} */ - -/** - * @name CR register constants only found in STM32F2xx/STM32F4xx - * @{ - */ -#define STM32_DMA_CR_DMEIE DMA_SxCR_DMEIE -#define STM32_DMA_CR_PFCTRL DMA_SxCR_PFCTRL -#define STM32_DMA_CR_PINCOS DMA_SxCR_PINCOS -#define STM32_DMA_CR_DBM DMA_SxCR_DBM -#define STM32_DMA_CR_CT DMA_SxCR_CT -#define STM32_DMA_CR_PBURST_MASK DMA_SxCR_PBURST -#define STM32_DMA_CR_PBURST_SINGLE 0 -#define STM32_DMA_CR_PBURST_INCR4 DMA_SxCR_PBURST_0 -#define STM32_DMA_CR_PBURST_INCR8 DMA_SxCR_PBURST_1 -#define STM32_DMA_CR_PBURST_INCR16 (DMA_SxCR_PBURST_0 | DMA_SxCR_PBURST_1) -#define STM32_DMA_CR_MBURST_MASK DMA_SxCR_MBURST -#define STM32_DMA_CR_MBURST_SINGLE 0 -#define STM32_DMA_CR_MBURST_INCR4 DMA_SxCR_MBURST_0 -#define STM32_DMA_CR_MBURST_INCR8 DMA_SxCR_MBURST_1 -#define STM32_DMA_CR_MBURST_INCR16 (DMA_SxCR_MBURST_0 | DMA_SxCR_MBURST_1) -#define STM32_DMA_CR_CHSEL_MASK DMA_SxCR_CHSEL -#define STM32_DMA_CR_CHSEL(n) ((n) << 25) -/** @} */ - -/** - * @name FCR register constants only found in STM32F2xx/STM32F4xx - * @{ - */ -#define STM32_DMA_FCR_FEIE DMA_SxFCR_FEIE -#define STM32_DMA_FCR_FS_MASK DMA_SxFCR_FS -#define STM32_DMA_FCR_DMDIS DMA_SxFCR_DMDIS -#define STM32_DMA_FCR_FTH_MASK DMA_SxFCR_FTH -#define STM32_DMA_FCR_FTH_1Q 0 -#define STM32_DMA_FCR_FTH_HALF DMA_SxFCR_FTH_0 -#define STM32_DMA_FCR_FTH_3Q DMA_SxFCR_FTH_1 -#define STM32_DMA_FCR_FTH_FULL (DMA_SxFCR_FTH_0 | DMA_SxFCR_FTH_1) -/** @} */ - -/** - * @name Status flags passed to the ISR callbacks - */ -#define STM32_DMA_ISR_FEIF DMA_LISR_FEIF0 -#define STM32_DMA_ISR_DMEIF DMA_LISR_DMEIF0 -#define STM32_DMA_ISR_TEIF DMA_LISR_TEIF0 -#define STM32_DMA_ISR_HTIF DMA_LISR_HTIF0 -#define STM32_DMA_ISR_TCIF DMA_LISR_TCIF0 -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA stream descriptor structure. - */ -typedef struct { - DMA_Stream_TypeDef *stream; /**< @brief Associated DMA stream. */ - volatile uint32_t *ifcr; /**< @brief Associated IFCR reg. */ - uint8_t ishift; /**< @brief Bits offset in xIFCR - register. */ - uint8_t selfindex; /**< @brief Index to self in array. */ - uint8_t vector; /**< @brief Associated IRQ vector. */ -} stm32_dma_stream_t; - -/** - * @brief STM32 DMA ISR function type. - * - * @param[in] p parameter for the registered function - * @param[in] flags pre-shifted content of the xISR register, the bits - * are aligned to bit zero - */ -typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags); - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Macro Functions - * @{ - */ -/** - * @brief Associates a peripheral data register to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the PAR register - * - * @special - */ -#define dmaStreamSetPeripheral(dmastp, addr) { \ - (dmastp)->stream->PAR = (uint32_t)(addr); \ -} - -/** - * @brief Associates a memory destination to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the M0AR register - * - * @special - */ -#define dmaStreamSetMemory0(dmastp, addr) { \ - (dmastp)->stream->M0AR = (uint32_t)(addr); \ -} - -/** - * @brief Associates an alternate memory destination to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the M1AR register - * - * @special - */ -#define dmaStreamSetMemory1(dmastp, addr) { \ - (dmastp)->stream->M1AR = (uint32_t)(addr); \ -} - -/** - * @brief Sets the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] size value to be written in the CNDTR register - * - * @special - */ -#define dmaStreamSetTransactionSize(dmastp, size) { \ - (dmastp)->stream->NDTR = (uint32_t)(size); \ -} - -/** - * @brief Returns the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @return The number of transfers to be performed. - * - * @special - */ -#define dmaStreamGetTransactionSize(dmastp) ((size_t)((dmastp)->stream->NDTR)) - -/** - * @brief Programs the stream mode settings. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CR register - * - * @special - */ -#define dmaStreamSetMode(dmastp, mode) { \ - (dmastp)->stream->CR = (uint32_t)(mode); \ -} - -/** - * @brief Programs the stream FIFO settings. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the FCR register - * - * @special - */ -#define dmaStreamSetFIFO(dmastp, mode) { \ - (dmastp)->stream->FCR = (uint32_t)(mode); \ -} - -/** - * @brief DMA stream enable. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamEnable(dmastp) { \ - (dmastp)->stream->CR |= STM32_DMA_CR_EN; \ -} - -/** - * @brief DMA stream disable. - * @details The function disables the specified stream, waits for the disable - * operation to complete and then clears any pending interrupt. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamDisable(dmastp) { \ - (dmastp)->stream->CR &= ~STM32_DMA_CR_EN; \ - while (((dmastp)->stream->CR & STM32_DMA_CR_EN) != 0) \ - ; \ - dmaStreamClearInterrupt(dmastp); \ -} - -/** - * @brief DMA stream interrupt sources clear. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamClearInterrupt(dmastp) { \ - *(dmastp)->ifcr = STM32_DMA_ISR_MASK << (dmastp)->ishift; \ -} - -/** - * @brief Starts a memory to memory operation using the specified stream. - * @note The default transfer data mode is "byte to byte" but it can be - * changed by specifying extra options in the @p mode parameter. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register, this value - * is implicitly ORed with: - * - @p STM32_DMA_CR_MINC - * - @p STM32_DMA_CR_PINC - * - @p STM32_DMA_CR_DIR_M2M - * - @p STM32_DMA_CR_EN - * . - * @param[in] src source address - * @param[in] dst destination address - * @param[in] n number of data units to copy - */ -#define dmaStartMemCopy(dmastp, mode, src, dst, n) { \ - dmaStreamSetPeripheral(dmastp, src); \ - dmaStreamSetMemory0(dmastp, dst); \ - dmaStreamSetTransactionSize(dmastp, n); \ - dmaStreamSetMode(dmastp, (mode) | \ - STM32_DMA_CR_MINC | STM32_DMA_CR_PINC | \ - STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN); \ -} - -/** - * @brief Polled wait for DMA transfer end. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - */ -#define dmaWaitCompletion(dmastp) { \ - while ((dmastp)->stream->NDTR > 0) \ - ; \ - dmaStreamDisable(dmastp); \ -} -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS]; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void dmaInit(void); - bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param); - void dmaStreamRelease(const stm32_dma_stream_t *dmastp); -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_DMA_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/stm32_isr.h b/os/hal/platforms/STM32F4xx/stm32_isr.h deleted file mode 100644 index 9a8fa4b254..0000000000 --- a/os/hal/platforms/STM32F4xx/stm32_isr.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/stm32_isr.h - * @brief ISR remapper driver header. - * - * @addtogroup STM32F4xx_ISR - * @{ - */ - -#ifndef _STM32_ISR_H_ -#define _STM32_ISR_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name ISR names and numbers remapping - * @{ - */ -/* - * CAN units. - */ -#define STM32_CAN1_TX_HANDLER CAN1_TX_IRQHandler -#define STM32_CAN1_RX0_HANDLER CAN1_RX0_IRQHandler -#define STM32_CAN1_RX1_HANDLER CAN1_RX1_IRQHandler -#define STM32_CAN1_SCE_HANDLER CAN1_SCE_IRQHandler -#define STM32_CAN2_TX_HANDLER CAN2_TX_IRQHandler -#define STM32_CAN2_RX0_HANDLER CAN2_RX0_IRQHandler -#define STM32_CAN2_RX1_HANDLER CAN2_RX1_IRQHandler -#define STM32_CAN2_SCE_HANDLER CAN2_SCE_IRQHandler - -#define STM32_CAN1_TX_NUMBER CAN1_TX_IRQn -#define STM32_CAN1_RX0_NUMBER CAN1_RX0_IRQn -#define STM32_CAN1_RX1_NUMBER CAN1_RX1_IRQn -#define STM32_CAN1_SCE_NUMBER CAN2_SCE_IRQn -#define STM32_CAN2_TX_NUMBER CAN2_TX_IRQn -#define STM32_CAN2_RX0_NUMBER CAN2_RX0_IRQn -#define STM32_CAN2_RX1_NUMBER CAN2_RX1_IRQn -#define STM32_CAN2_SCE_NUMBER CAN2_SCE_IRQn - -/* - * OTG units. - */ -#define STM32_OTG1_HANDLER Vector14C -#define STM32_OTG2_HANDLER Vector174 -#define STM32_OTG2_EP1OUT_HANDLER Vector168 -#define STM32_OTG2_EP1IN_HANDLER Vector16C - -#define STM32_OTG1_NUMBER OTG_FS_IRQn -#define STM32_OTG2_NUMBER OTG_HS_IRQn -#define STM32_OTG2_EP1OUT_NUMBER OTG_HS_EP1_OUT_IRQn -#define STM32_OTG2_EP1IN_NUMBER OTG_HS_EP1_IN_IRQn - -/* - * SDIO unit. - */ -#define STM32_SDIO_HANDLER SDIO_IRQHandler - -#define STM32_SDIO_NUMBER SDIO_IRQn - -/* - * TIM units. - */ -#define STM32_TIM1_UP_HANDLER TIM1_UP_IRQHandler -#define STM32_TIM1_CC_HANDLER TIM1_CC_IRQHandler -#define STM32_TIM2_HANDLER TIM2_IRQHandler -#define STM32_TIM3_HANDLER TIM3_IRQHandler -#define STM32_TIM4_HANDLER TIM4_IRQHandler -#define STM32_TIM5_HANDLER TIM5_IRQHandler -#define STM32_TIM8_UP_HANDLER TIM8_UP_IRQHandler -#define STM32_TIM8_CC_HANDLER TIM8_CC_IRQHandler - -#define STM32_TIM1_UP_NUMBER TIM1_UP_TIM10_IRQn -#define STM32_TIM1_CC_NUMBER TIM1_CC_IRQn -#define STM32_TIM2_NUMBER TIM2_IRQn -#define STM32_TIM3_NUMBER TIM3_IRQn -#define STM32_TIM4_NUMBER TIM4_IRQn -#define STM32_TIM5_NUMBER TIM5_IRQn -#define STM32_TIM8_UP_NUMBER TIM8_UP_TIM13_IRQn -#define STM32_TIM8_CC_NUMBER TIM8_CC_IRQn - -/* - * USART units. - */ -#define STM32_USART1_HANDLER USART1_IRQHandler -#define STM32_USART2_HANDLER USART2_IRQHandler -#define STM32_USART3_HANDLER USART3_IRQHandler -#define STM32_UART4_HANDLER UART4_IRQHandler -#define STM32_UART5_HANDLER UART5_IRQHandler -#define STM32_USART6_HANDLER USART6_IRQHandler - -#define STM32_USART1_NUMBER USART1_IRQn -#define STM32_USART2_NUMBER USART2_IRQn -#define STM32_USART3_NUMBER USART3_IRQn -#define STM32_UART4_NUMBER UART4_IRQn -#define STM32_UART5_NUMBER UART5_IRQn -#define STM32_USART6_NUMBER USART6_IRQn -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#endif /* _STM32_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/stm32_rcc.h b/os/hal/platforms/STM32F4xx/stm32_rcc.h deleted file mode 100644 index 4f27f935c7..0000000000 --- a/os/hal/platforms/STM32F4xx/stm32_rcc.h +++ /dev/null @@ -1,1096 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32F4xx/stm32_rcc.h - * @brief RCC helper driver header. - * @note This file requires definitions from the ST header file - * @p stm32f4xx.h. - * - * @addtogroup STM32F4xx_RCC - * @{ - */ -#ifndef _STM32_RCC_ -#define _STM32_RCC_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Generic RCC operations - * @{ - */ -/** - * @brief Enables the clock of one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB1(mask, lp) { \ - RCC->APB1ENR |= (mask); \ - if (lp) \ - RCC->APB1LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB1(mask, lp) { \ - RCC->APB1ENR &= ~(mask); \ - if (lp) \ - RCC->APB1LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * - * @api - */ -#define rccResetAPB1(mask) { \ - RCC->APB1RSTR |= (mask); \ - RCC->APB1RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB2(mask, lp) { \ - RCC->APB2ENR |= (mask); \ - if (lp) \ - RCC->APB2LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB2(mask, lp) { \ - RCC->APB2ENR &= ~(mask); \ - if (lp) \ - RCC->APB2LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * - * @api - */ -#define rccResetAPB2(mask) { \ - RCC->APB2RSTR |= (mask); \ - RCC->APB2RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the AHB1 bus. - * - * @param[in] mask AHB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAHB1(mask, lp) { \ - RCC->AHB1ENR |= (mask); \ - if (lp) \ - RCC->AHB1LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the AHB1 bus. - * - * @param[in] mask AHB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAHB1(mask, lp) { \ - RCC->AHB1ENR &= ~(mask); \ - if (lp) \ - RCC->AHB1LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the AHB1 bus. - * - * @param[in] mask AHB1 peripherals mask - * - * @api - */ -#define rccResetAHB1(mask) { \ - RCC->AHB1RSTR |= (mask); \ - RCC->AHB1RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the AHB2 bus. - * - * @param[in] mask AHB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAHB2(mask, lp) { \ - RCC->AHB2ENR |= (mask); \ - if (lp) \ - RCC->AHB2LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the AHB2 bus. - * - * @param[in] mask AHB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAHB2(mask, lp) { \ - RCC->AHB2ENR &= ~(mask); \ - if (lp) \ - RCC->AHB2LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the AHB2 bus. - * - * @param[in] mask AHB2 peripherals mask - * - * @api - */ -#define rccResetAHB2(mask) { \ - RCC->AHB2RSTR |= (mask); \ - RCC->AHB2RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the AHB3 (FSMC) bus. - * - * @param[in] mask AHB3 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAHB3(mask, lp) { \ - RCC->AHB3ENR |= (mask); \ - if (lp) \ - RCC->AHB3LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the AHB3 (FSMC) bus. - * - * @param[in] mask AHB3 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAHB3(mask, lp) { \ - RCC->AHB3ENR &= ~(mask); \ - if (lp) \ - RCC->AHB3LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the AHB3 (FSMC) bus. - * - * @param[in] mask AHB3 peripherals mask - * - * @api - */ -#define rccResetAHB3(mask) { \ - RCC->AHB3RSTR |= (mask); \ - RCC->AHB3RSTR = 0; \ -} -/** @} */ - -/** - * @name ADC peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the ADC1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableADC1(lp) rccEnableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Disables the ADC1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableADC1(lp) rccDisableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Resets the ADC1 peripheral. - * - * @api - */ -#define rccResetADC1() rccResetAPB2(RCC_APB2RSTR_ADC1RST) - -/** - * @brief Enables the ADC2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableADC2(lp) rccEnableAPB2(RCC_APB2ENR_ADC2EN, lp) - -/** - * @brief Disables the ADC2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableADC2(lp) rccDisableAPB2(RCC_APB2ENR_ADC2EN, lp) - -/** - * @brief Resets the ADC2 peripheral. - * - * @api - */ -#define rccResetADC2() rccResetAPB2(RCC_APB2RSTR_ADC2RST) - -/** - * @brief Enables the ADC3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableADC3(lp) rccEnableAPB2(RCC_APB2ENR_ADC3EN, lp) - -/** - * @brief Disables the ADC3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableADC3(lp) rccDisableAPB2(RCC_APB2ENR_ADC3EN, lp) - -/** - * @brief Resets the ADC3 peripheral. - * - * @api - */ -#define rccResetADC3() rccResetAPB2(RCC_APB2RSTR_ADC3RST) -/** @} */ - -/** - * @name DMA peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the DMA1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableDMA1(lp) rccEnableAHB1(RCC_AHB1ENR_DMA1EN, lp) - -/** - * @brief Disables the DMA1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableDMA1(lp) rccDisableAHB1(RCC_AHB1ENR_DMA1EN, lp) - -/** - * @brief Resets the DMA1 peripheral. - * - * @api - */ -#define rccResetDMA1() rccResetAHB1(RCC_AHB1RSTR_DMA1RST) - -/** - * @brief Enables the DMA2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableDMA2(lp) rccEnableAHB1(RCC_AHB1ENR_DMA2EN, lp) - -/** - * @brief Disables the DMA2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableDMA2(lp) rccDisableAHB1(RCC_AHB1ENR_DMA2EN, lp) - -/** - * @brief Resets the DMA2 peripheral. - * - * @api - */ -#define rccResetDMA2() rccResetAHB1(RCC_AHB1RSTR_DMA2RST) -/** @} */ - -/** - * @name PWR interface specific RCC operations - * @{ - */ -/** - * @brief Enables the PWR interface clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnablePWRInterface(lp) rccEnableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Disables PWR interface clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisablePWRInterface(lp) rccDisableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Resets the PWR interface. - * - * @api - */ -#define rccResetPWRInterface() rccResetAPB1(RCC_APB1RSTR_PWRRST) -/** @} */ - - -/** - * @name CAN peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the CAN1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableCAN1(lp) rccEnableAPB1(RCC_APB1ENR_CAN1EN, lp) - -/** - * @brief Disables the CAN1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableCAN1(lp) rccDisableAPB1(RCC_APB1ENR_CAN1EN, lp) - -/** - * @brief Resets the CAN1 peripheral. - * - * @api - */ -#define rccResetCAN1() rccResetAPB1(RCC_APB1RSTR_CAN1RST) - -/** - * @brief Enables the CAN2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableCAN2(lp) rccEnableAPB1(RCC_APB1ENR_CAN2EN, lp) - -/** - * @brief Disables the CAN2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableCAN2(lp) rccDisableAPB1(RCC_APB1ENR_CAN2EN, lp) - -/** - * @brief Resets the CAN2 peripheral. - * - * @api - */ -#define rccResetCAN2() rccResetAPB1(RCC_APB1RSTR_CAN2RST) -/** @} */ - -/** - * @name ETH peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the ETH peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableETH(lp) rccEnableAHB1(RCC_AHB1ENR_ETHMACEN | \ - RCC_AHB1ENR_ETHMACTXEN | \ - RCC_AHB1ENR_ETHMACRXEN, lp) - -/** - * @brief Disables the ETH peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableETH(lp) rccDisableAHB1(RCC_AHB1ENR_ETHMACEN | \ - RCC_AHB1ENR_ETHMACTXEN | \ - RCC_AHB1ENR_ETHMACRXEN, lp) - -/** - * @brief Resets the ETH peripheral. - * - * @api - */ -#define rccResetETH() rccResetAHB1(RCC_AHB1RSTR_ETHMACRST) -/** @} */ - -/** - * @name I2C peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the I2C1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C1(lp) rccEnableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Disables the I2C1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C1(lp) rccDisableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Resets the I2C1 peripheral. - * - * @api - */ -#define rccResetI2C1() rccResetAPB1(RCC_APB1RSTR_I2C1RST) - -/** - * @brief Enables the I2C2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C2(lp) rccEnableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Disables the I2C2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C2(lp) rccDisableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Resets the I2C2 peripheral. - * - * @api - */ -#define rccResetI2C2() rccResetAPB1(RCC_APB1RSTR_I2C2RST) - -/** - * @brief Enables the I2C3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C3(lp) rccEnableAPB1(RCC_APB1ENR_I2C3EN, lp) - -/** - * @brief Disables the I2C3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C3(lp) rccDisableAPB1(RCC_APB1ENR_I2C3EN, lp) - -/** - * @brief Resets the I2C3 peripheral. - * - * @api - */ -#define rccResetI2C3() rccResetAPB1(RCC_APB1RSTR_I2C3RST) -/** @} */ - -/** - * @name OTG peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the OTG_FS peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableOTG_FS(lp) rccEnableAHB2(RCC_AHB2ENR_OTGFSEN, lp) - -/** - * @brief Disables the OTG_FS peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableOTG_FS(lp) rccDisableAHB2(RCC_AHB2ENR_OTGFSEN, lp) - -/** - * @brief Resets the OTG_FS peripheral. - * - * @api - */ -#define rccResetOTG_FS() rccResetAHB2(RCC_AHB2RSTR_OTGFSRST) - -/** - * @brief Enables the OTG_HS peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableOTG_HS(lp) rccEnableAHB1(RCC_AHB1ENR_OTGHSEN, lp) - -/** - * @brief Disables the OTG_HS peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableOTG_HS(lp) rccDisableAHB1(RCC_AHB1ENR_OTGHSEN, lp) - -/** - * @brief Resets the OTG_HS peripheral. - * - * @api - */ -#define rccResetOTG_HS() rccResetAHB1(RCC_AHB1RSTR_OTGHSRST) -/** @} */ - -/** - * @name SDIO peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the SDIO peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSDIO(lp) rccEnableAPB2(RCC_APB2ENR_SDIOEN, lp) - -/** - * @brief Disables the SDIO peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSDIO(lp) rccDisableAPB2(RCC_APB2ENR_SDIOEN, lp) - -/** - * @brief Resets the SDIO peripheral. - * @note Not supported in this family, does nothing. - * - * @api - */ -#define rccResetSDIO() rccResetAPB2(RCC_APB2RSTR_SDIORST) -/** @} */ - -/** - * @name SPI peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the SPI1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI1(lp) rccEnableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Disables the SPI1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI1(lp) rccDisableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Resets the SPI1 peripheral. - * - * @api - */ -#define rccResetSPI1() rccResetAPB2(RCC_APB2RSTR_SPI1RST) - -/** - * @brief Enables the SPI2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI2(lp) rccEnableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Disables the SPI2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI2(lp) rccDisableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Resets the SPI2 peripheral. - * - * @api - */ -#define rccResetSPI2() rccResetAPB1(RCC_APB1RSTR_SPI2RST) - -/** - * @brief Enables the SPI3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI3(lp) rccEnableAPB1(RCC_APB1ENR_SPI3EN, lp) - -/** - * @brief Disables the SPI3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI3(lp) rccDisableAPB1(RCC_APB1ENR_SPI3EN, lp) - -/** - * @brief Resets the SPI3 peripheral. - * - * @api - */ -#define rccResetSPI3() rccResetAPB1(RCC_APB1RSTR_SPI3RST) -/** @} */ - -/** - * @name TIM peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the TIM1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM1(lp) rccEnableAPB2(RCC_APB2ENR_TIM1EN, lp) - -/** - * @brief Disables the TIM1 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM1(lp) rccDisableAPB2(RCC_APB2ENR_TIM1EN, lp) - -/** - * @brief Resets the TIM1 peripheral. - * - * @api - */ -#define rccResetTIM1() rccResetAPB2(RCC_APB2RSTR_TIM1RST) - -/** - * @brief Enables the TIM2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM2(lp) rccEnableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Disables the TIM2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM2(lp) rccDisableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Resets the TIM2 peripheral. - * - * @api - */ -#define rccResetTIM2() rccResetAPB1(RCC_APB1RSTR_TIM2RST) - -/** - * @brief Enables the TIM3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM3(lp) rccEnableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Disables the TIM3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM3(lp) rccDisableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Resets the TIM3 peripheral. - * - * @api - */ -#define rccResetTIM3() rccResetAPB1(RCC_APB1RSTR_TIM3RST) - -/** - * @brief Enables the TIM4 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM4(lp) rccEnableAPB1(RCC_APB1ENR_TIM4EN, lp) - -/** - * @brief Disables the TIM4 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM4(lp) rccDisableAPB1(RCC_APB1ENR_TIM4EN, lp) - -/** - * @brief Resets the TIM4 peripheral. - * - * @api - */ -#define rccResetTIM4() rccResetAPB1(RCC_APB1RSTR_TIM4RST) - -/** - * @brief Enables the TIM5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM5(lp) rccEnableAPB1(RCC_APB1ENR_TIM5EN, lp) - -/** - * @brief Disables the TIM5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM5(lp) rccDisableAPB1(RCC_APB1ENR_TIM5EN, lp) - -/** - * @brief Resets the TIM5 peripheral. - * - * @api - */ -#define rccResetTIM5() rccResetAPB1(RCC_APB1RSTR_TIM5RST) - -/** - * @brief Enables the TIM8 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM8(lp) rccEnableAPB2(RCC_APB2ENR_TIM8EN, lp) - -/** - * @brief Disables the TIM8 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM8(lp) rccDisableAPB2(RCC_APB2ENR_TIM8EN, lp) - -/** - * @brief Resets the TIM8 peripheral. - * - * @api - */ -#define rccResetTIM8() rccResetAPB2(RCC_APB2RSTR_TIM8RST) -/** @} */ - -/** - * @name USART/UART peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the USART1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART1(lp) rccEnableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Disables the USART1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART1(lp) rccDisableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Resets the USART1 peripheral. - * - * @api - */ -#define rccResetUSART1() rccResetAPB2(RCC_APB2RSTR_USART1RST) - -/** - * @brief Enables the USART2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART2(lp) rccEnableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Disables the USART2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART2(lp) rccDisableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Resets the USART2 peripheral. - * - * @api - */ -#define rccResetUSART2() rccResetAPB1(RCC_APB1RSTR_USART2RST) - -/** - * @brief Enables the USART3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART3(lp) rccEnableAPB1(RCC_APB1ENR_USART3EN, lp) - -/** - * @brief Disables the USART3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART3(lp) rccDisableAPB1(RCC_APB1ENR_USART3EN, lp) - -/** - * @brief Resets the USART3 peripheral. - * - * @api - */ -#define rccResetUSART3() rccResetAPB1(RCC_APB1RSTR_USART3RST) - -/** - * @brief Enables the USART6 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART6(lp) rccEnableAPB2(RCC_APB2ENR_USART6EN, lp) - -/** - * @brief Disables the USART6 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART6(lp) rccDisableAPB2(RCC_APB2ENR_USART6EN, lp) - -/** - * @brief Enables the UART4 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUART4(lp) rccEnableAPB1(RCC_APB1ENR_UART4EN, lp) - -/** - * @brief Disables the UART4 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUART4(lp) rccDisableAPB1(RCC_APB1ENR_UART4EN, lp) - -/** - * @brief Resets the UART4 peripheral. - * - * @api - */ -#define rccResetUART4() rccResetAPB1(RCC_APB1RSTR_UART4RST) - -/** - * @brief Enables the UART5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUART5(lp) rccEnableAPB1(RCC_APB1ENR_UART5EN, lp) - -/** - * @brief Disables the UART5 peripheral clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUART5(lp) rccDisableAPB1(RCC_APB1ENR_UART5EN, lp) - -/** - * @brief Resets the UART5 peripheral. - * - * @api - */ -#define rccResetUART5() rccResetAPB1(RCC_APB1RSTR_UART5RST) - -/** - * @brief Resets the USART6 peripheral. - * - * @api - */ -#define rccResetUSART6() rccResetAPB2(RCC_APB2RSTR_USART6RST) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_RCC_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32F4xx/stm32f2xx.h b/os/hal/platforms/STM32F4xx/stm32f2xx.h deleted file mode 100644 index f4506b2fe7..0000000000 --- a/os/hal/platforms/STM32F4xx/stm32f2xx.h +++ /dev/null @@ -1,6881 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx.h - * @author MCD Application Team - * @version V1.0.0 - * @date 18-April-2011 - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32F2xx devices. - * - * The file is the unique include file that the application programmer - * is using in the C source code, usually in main.c. This file contains: - * - Configuration section that allows to select: - * - The device used in the target application - * - To use or not the peripheral�s drivers in application code(i.e. - * code will be based on direct access to peripheral�s registers - * rather than drivers API), this option is controlled by - * "#define USE_STDPERIPH_DRIVER" - * - To change few application-specific parameters such as the HSE - * crystal frequency - * - Data structures and the address mapping for all peripherals - * - Peripheral's registers declarations and bits definition - * - Macros to access peripheral�s registers hardware - * - ****************************************************************************** - * @attention - * - * 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. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f2xx - * @{ - */ - -#ifndef __STM32F2xx_H -#define __STM32F2xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ - -#if !defined (STM32F2XX) - #define STM32F2XX -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ - -#if !defined (STM32F2XX) - #error "Please select first the target STM32F2XX device used in your application (in stm32f2xx.h file)" -#endif - -#if !defined (USE_STDPERIPH_DRIVER) -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif /* USE_STDPERIPH_DRIVER */ - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ -#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ - -/** - * @brief STM32F2Xxx Standard Peripherals Library version number V1.0.0 - */ -#define __STM32F2XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F2XX_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32F2XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F2XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F2XX_STDPERIPH_VERSION ((__STM32F2XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F2XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F2XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F2XX_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#define __MPU_PRESENT 1 /*!< STM32F2XX provide an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F2XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @brief STM32F2XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum IRQn -{ -/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ - HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -/* CHIBIOS FIX */ -/* #include "system_stm32f2xx.h" */ -#include - -/** @addtogroup Exported_types - * @{ - */ -/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; /*!< Read Only */ -typedef const int16_t sc16; /*!< Read Only */ -typedef const int8_t sc8; /*!< Read Only */ - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; /*!< Read Only */ -typedef __I int16_t vsc16; /*!< Read Only */ -typedef __I int8_t vsc8; /*!< Read Only */ - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; /*!< Read Only */ -typedef const uint16_t uc16; /*!< Read Only */ -typedef const uint8_t uc8; /*!< Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; /*!< Read Only */ -typedef __I uint16_t vuc16; /*!< Read Only */ -typedef __I uint8_t vuc8; /*!< Read Only */ - -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; - -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; /* added for STM32F2xx */ - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; /* added for STM32F2xx */ - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ -} FSMC_Bank2_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank3 - */ - -typedef struct -{ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED0; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ -/* CHIBIOS FIX */ -#if 0 -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ - __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x24-0x28 */ -} GPIO_TypeDef; -#endif - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t DR; /*!< I2C Data register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - uint32_t RESERVED1; /*!< Reserved, 0x28 */ - uint32_t RESERVED2; /*!< Reserved, 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - uint32_t RESERVED3; /*!< Reserved, 0x38 */ - uint32_t RESERVED4; /*!< Reserved, 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - uint32_t RESERVED5; /*!< Reserved, 0x44 */ - uint32_t RESERVED6; /*!< Reserved, 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __I uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __I uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __I uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __I uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __I uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __I uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __I uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __I uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SR; /*!< SPI status register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DR; /*!< SPI data register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t SR; /*!< TIM status register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint16_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - uint16_t RESERVED9; /*!< Reserved, 0x2A */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint16_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - uint16_t RESERVED10; /*!< Reserved, 0x32 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint16_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - uint16_t RESERVED11; /*!< Reserved, 0x46 */ - __IO uint16_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - uint16_t RESERVED12; /*!< Reserved, 0x4A */ - __IO uint16_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - uint16_t RESERVED13; /*!< Reserved, 0x4E */ - __IO uint16_t OR; /*!< TIM option register, Address offset: 0x50 */ - uint16_t RESERVED14; /*!< Reserved, 0x52 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint16_t SR; /*!< USART Status register, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t DR; /*!< USART Data register, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief Crypto Processor - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< CRYP data input register, Address offset: 0x08 */ - __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ - __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ - __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ - __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ - __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ - __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ - __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ - __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ - __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ - __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ - __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ - __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ - __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ - __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ - __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ - __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ - __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ -} CRYP_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ - __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ - __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ - __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ - __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ - __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ - uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ - __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ -} HASH_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ - -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ -#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ - -#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ - -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define BKPSRAM_BASE (AHB1PERIPH_BASE + 0x4000) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000) -#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000) -#define HASH_BASE (AHB2PERIPH_BASE + 0x60400) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define CRYP ((CRYP_TypeDef *) CRYP_BASE) -#define HASH ((HASH_TypeDef *) HASH_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) -#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint8_t)0x01) /*!
    © COPYRIGHT 2011 STMicroelectronics
    - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx - * @{ - */ - -#ifndef __STM32F4xx_H -#define __STM32F4xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ - -#if !defined (STM32F4XX) - #define STM32F4XX -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ - -#if !defined (STM32F4XX) - #error "Please select first the target STM32F4XX device used in your application (in stm32f4xx.h file)" -#endif - -#if !defined (USE_STDPERIPH_DRIVER) -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif /* USE_STDPERIPH_DRIVER */ - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ -#endif /* HSE_STARTUP_TIMEOUT */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief STM32F4XX Standard Peripherals Library version number V1.0.0 - */ -#define __STM32F4XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F4XX_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32F4XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F4XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F4XX_STDPERIPH_VERSION ((__STM32F4XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F4XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F4XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F4XX_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1 /*!< FPU present */ - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum IRQn -{ -/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ - HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ - FPU_IRQn = 81 /*!< FPU global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -/* CHIBIOS FIX */ -/*#include "system_stm32f4xx.h"*/ -#include - -/** @addtogroup Exported_types - * @{ - */ -/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; /*!< Read Only */ -typedef const int16_t sc16; /*!< Read Only */ -typedef const int8_t sc8; /*!< Read Only */ - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; /*!< Read Only */ -typedef __I int16_t vsc16; /*!< Read Only */ -typedef __I int8_t vsc8; /*!< Read Only */ - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; /*!< Read Only */ -typedef const uint16_t uc16; /*!< Read Only */ -typedef const uint8_t uc8; /*!< Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; /*!< Read Only */ -typedef __I uint16_t vuc16; /*!< Read Only */ -typedef __I uint8_t vuc8; /*!< Read Only */ - -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; - -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ -} FSMC_Bank2_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank3 - */ - -typedef struct -{ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED0; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ -/* CHIBIOS FIX */ -#if 0 -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ - __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; -#endif - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t DR; /*!< I2C Data register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __I uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __I uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __I uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __I uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __I uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __I uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __I uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __I uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SR; /*!< SPI status register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DR; /*!< SPI data register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t SR; /*!< TIM status register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint16_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - uint16_t RESERVED9; /*!< Reserved, 0x2A */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint16_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - uint16_t RESERVED10; /*!< Reserved, 0x32 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint16_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - uint16_t RESERVED11; /*!< Reserved, 0x46 */ - __IO uint16_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - uint16_t RESERVED12; /*!< Reserved, 0x4A */ - __IO uint16_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - uint16_t RESERVED13; /*!< Reserved, 0x4E */ - __IO uint16_t OR; /*!< TIM option register, Address offset: 0x50 */ - uint16_t RESERVED14; /*!< Reserved, 0x52 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint16_t SR; /*!< USART Status register, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t DR; /*!< USART Data register, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief Crypto Processor - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< CRYP data input register, Address offset: 0x08 */ - __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ - __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ - __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ - __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ - __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ - __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ - __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ - __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ - __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ - __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ - __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ - __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ - __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ - __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ - __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ - __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ - __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ -} CRYP_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ - __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ - __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ - __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ - __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ - __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ - uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ - __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ -} HASH_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ -#define CCMDATARAM_BASE ((uint32_t)0x10000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ -#define SRAM1_BASE ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ - -#define CCMDATARAM_BB_BASE ((uint32_t)0x12000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the bit-band region */ -#define SRAM1_BB_BASE ((uint32_t)0x22000000) /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE ((uint32_t)0x2201C000) /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE ((uint32_t)0x42024000) /*!< Backup SRAM(4 KB) base address in the bit-band region */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000) -#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000) -#define HASH_BASE (AHB2PERIPH_BASE + 0x60400) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define CRYP ((CRYP_TypeDef *) CRYP_BASE) -#define HASH ((HASH_TypeDef *) HASH_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) -#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint8_t)0x01) /*!. -*/ - -/** - * @file STM32L1xx/adc_lld.c - * @brief STM32L1xx ADC subsystem low level driver source. - * - * @addtogroup ADC - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief ADC1 driver identifier.*/ -#if STM32_ADC_USE_ADC1 || defined(__DOXYGEN__) -ADCDriver ADCD1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief ADC DMA ISR service routine. - * - * @param[in] adcp pointer to the @p ADCDriver object - * @param[in] flags pre-shifted content of the ISR register - */ -static void adc_lld_serve_rx_interrupt(ADCDriver *adcp, uint32_t flags) { - - /* DMA errors handling.*/ - if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { - /* DMA, this could help only if the DMA tries to access an unmapped - address space or violates alignment rules.*/ - _adc_isr_error_code(adcp, ADC_ERR_DMAFAILURE); - } - else { - /* It is possible that the conversion group has already be reset by the - ADC error handler, in this case this interrupt is spurious.*/ - if (adcp->grpp != NULL) { - if ((flags & STM32_DMA_ISR_HTIF) != 0) { - /* Half transfer processing.*/ - _adc_isr_half_code(adcp); - } - if ((flags & STM32_DMA_ISR_TCIF) != 0) { - /* Transfer complete processing.*/ - _adc_isr_full_code(adcp); - } - } - } -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 || defined(__DOXYGEN__) -/** - * @brief ADC interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(ADC1_IRQHandler) { - uint32_t sr; - - CH_IRQ_PROLOGUE(); - - sr = ADC1->SR; - ADC1->SR = 0; - /* Note, an overflow may occur after the conversion ended before the driver - is able to stop the ADC, this is why the DMA channel is checked too.*/ - if ((sr & ADC_SR_OVR) && (dmaStreamGetTransactionSize(ADCD1.dmastp) > 0)) { - /* ADC overflow condition, this could happen only if the DMA is unable - to read data fast enough.*/ - if (ADCD1.grpp != NULL) - _adc_isr_error_code(&ADCD1, ADC_ERR_OVERFLOW); - } - /* TODO: Add here analog watchdog handling.*/ - - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level ADC driver initialization. - * - * @notapi - */ -void adc_lld_init(void) { - -#if STM32_ADC_USE_ADC1 - /* Driver initialization.*/ - adcObjectInit(&ADCD1); - ADCD1.adc = ADC1; - ADCD1.dmastp = STM32_DMA1_STREAM1; - ADCD1.dmamode = STM32_DMA_CR_PL(STM32_ADC_ADC1_DMA_PRIORITY) | - STM32_DMA_CR_DIR_P2M | - STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PSIZE_HWORD | - STM32_DMA_CR_MINC | STM32_DMA_CR_TCIE | - STM32_DMA_CR_DMEIE | STM32_DMA_CR_TEIE; -#endif - - /* The shared vector is initialized on driver initialization and never - disabled.*/ - nvicEnableVector(ADC1_IRQn, CORTEX_PRIORITY_MASK(STM32_ADC_IRQ_PRIORITY)); -} - -/** - * @brief Configures and activates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start(ADCDriver *adcp) { - - /* If in stopped state then enables the ADC and DMA clocks.*/ - if (adcp->state == ADC_STOP) { -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) { - bool_t b; - b = dmaStreamAllocate(adcp->dmastp, - STM32_ADC_ADC1_DMA_IRQ_PRIORITY, - (stm32_dmaisr_t)adc_lld_serve_rx_interrupt, - (void *)adcp); - chDbgAssert(!b, "adc_lld_start(), #1", "stream already allocated"); - dmaStreamSetPeripheral(adcp->dmastp, &ADC1->DR); - rccEnableADC1(FALSE); - } -#endif /* STM32_ADC_USE_ADC1 */ - - /* ADC initial setup, starting the analog part here in order to reduce - the latency when starting a conversion.*/ - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - adcp->adc->CR2 = ADC_CR2_ADON; - } -} - -/** - * @brief Deactivates the ADC peripheral. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop(ADCDriver *adcp) { - - /* If in ready state then disables the ADC clock and analog part.*/ - if (adcp->state == ADC_READY) { - dmaStreamRelease(adcp->dmastp); - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - -#if STM32_ADC_USE_ADC1 - if (&ADCD1 == adcp) - rccDisableADC1(FALSE); -#endif - } -} - -/** - * @brief Starts an ADC conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_start_conversion(ADCDriver *adcp) { - uint32_t mode; - const ADCConversionGroup *grpp = adcp->grpp; - - /* DMA setup.*/ - mode = adcp->dmamode; - if (grpp->circular) { - mode |= STM32_DMA_CR_CIRC; - } - if (adcp->depth > 1) { - /* If the buffer depth is greater than one then the half transfer interrupt - interrupt is enabled in order to allows streaming processing.*/ - mode |= STM32_DMA_CR_HTIE; - } - dmaStreamSetMemory0(adcp->dmastp, adcp->samples); - dmaStreamSetTransactionSize(adcp->dmastp, (uint32_t)grpp->num_channels * - (uint32_t)adcp->depth); - dmaStreamSetMode(adcp->dmastp, mode); - dmaStreamEnable(adcp->dmastp); - - /* ADC setup.*/ - adcp->adc->SR = 0; - adcp->adc->SMPR1 = grpp->smpr1; - adcp->adc->SMPR2 = grpp->smpr2; - adcp->adc->SMPR3 = grpp->smpr3; - adcp->adc->SQR1 = grpp->sqr1; - adcp->adc->SQR2 = grpp->sqr2; - adcp->adc->SQR3 = grpp->sqr3; - adcp->adc->SQR4 = grpp->sqr4; - adcp->adc->SQR5 = grpp->sqr5; - - /* ADC configuration and start, the start is performed using the method - specified in the CR2 configuration, usually ADC_CR2_SWSTART.*/ - adcp->adc->CR1 = grpp->cr1 | ADC_CR1_OVRIE | ADC_CR1_SCAN; - if ((grpp->cr2 & ADC_CR2_SWSTART) != 0) - adcp->adc->CR2 = grpp->cr2 | ADC_CR2_CONT | ADC_CR2_DMA | - ADC_CR2_DDS | ADC_CR2_ADON; - else - adcp->adc->CR2 = grpp->cr2 | ADC_CR2_DMA | - ADC_CR2_DDS | ADC_CR2_ADON; -} - -/** - * @brief Stops an ongoing conversion. - * - * @param[in] adcp pointer to the @p ADCDriver object - * - * @notapi - */ -void adc_lld_stop_conversion(ADCDriver *adcp) { - - dmaStreamDisable(adcp->dmastp); - adcp->adc->CR1 = 0; - adcp->adc->CR2 = 0; - adcp->adc->CR2 = ADC_CR2_ADON; -} - -/** - * @brief Enables the TSVREFE bit. - * @details The TSVREFE bit is required in order to sample the internal - * temperature sensor and internal reference voltage. - * @note This is an STM32-only functionality. - */ -void adcSTM32EnableTSVREFE(void) { - - ADC->CCR |= ADC_CCR_TSVREFE; -} - -/** - * @brief Disables the TSVREFE bit. - * @details The TSVREFE bit is required in order to sample the internal - * temperature sensor and internal reference voltage. - * @note This is an STM32-only functionality. - */ -void adcSTM32DisableTSVREFE(void) { - - ADC->CCR &= ~ADC_CCR_TSVREFE; -} - -#endif /* HAL_USE_ADC */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/adc_lld.h b/os/hal/platforms/STM32L1xx/adc_lld.h deleted file mode 100644 index 1ce9444abc..0000000000 --- a/os/hal/platforms/STM32L1xx/adc_lld.h +++ /dev/null @@ -1,488 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/adc_lld.h - * @brief STM32L1xx ADC subsystem low level driver header. - * - * @addtogroup ADC - * @{ - */ - -#ifndef _ADC_LLD_H_ -#define _ADC_LLD_H_ - -#if HAL_USE_ADC || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name Triggers selection - * @{ - */ -#define ADC_CR2_EXTSEL_SRC(n) ((n) << 24) /**< @brief Trigger source. */ -/** @} */ - -/** - * @name ADC clock divider settings - * @{ - */ -#define ADC_CCR_ADCPRE_DIV1 0 -#define ADC_CCR_ADCPRE_DIV2 1 -#define ADC_CCR_ADCPRE_DIV4 2 -/** @} */ - -/** - * @name Available analog channels - * @{ - */ -#define ADC_CHANNEL_IN0 0 /**< @brief External analog input 0. */ -#define ADC_CHANNEL_IN1 1 /**< @brief External analog input 1. */ -#define ADC_CHANNEL_IN2 2 /**< @brief External analog input 2. */ -#define ADC_CHANNEL_IN3 3 /**< @brief External analog input 3. */ -#define ADC_CHANNEL_IN4 4 /**< @brief External analog input 4. */ -#define ADC_CHANNEL_IN5 5 /**< @brief External analog input 5. */ -#define ADC_CHANNEL_IN6 6 /**< @brief External analog input 6. */ -#define ADC_CHANNEL_IN7 7 /**< @brief External analog input 7. */ -#define ADC_CHANNEL_IN8 8 /**< @brief External analog input 8. */ -#define ADC_CHANNEL_IN9 9 /**< @brief External analog input 9. */ -#define ADC_CHANNEL_IN10 10 /**< @brief External analog input 10. */ -#define ADC_CHANNEL_IN11 11 /**< @brief External analog input 11. */ -#define ADC_CHANNEL_IN12 12 /**< @brief External analog input 12. */ -#define ADC_CHANNEL_IN13 13 /**< @brief External analog input 13. */ -#define ADC_CHANNEL_IN14 14 /**< @brief External analog input 14. */ -#define ADC_CHANNEL_IN15 15 /**< @brief External analog input 15. */ -#define ADC_CHANNEL_SENSOR 16 /**< @brief Internal temperature sensor.*/ -#define ADC_CHANNEL_VREFINT 17 /**< @brief Internal reference. */ -#define ADC_CHANNEL_IN18 18 /**< @brief External analog input 18. */ -#define ADC_CHANNEL_IN19 19 /**< @brief External analog input 19. */ -#define ADC_CHANNEL_IN20 20 /**< @brief External analog input 20. */ -#define ADC_CHANNEL_IN21 21 /**< @brief External analog input 21. */ -#define ADC_CHANNEL_IN22 22 /**< @brief External analog input 22. */ -#define ADC_CHANNEL_IN23 23 /**< @brief External analog input 23. */ -#define ADC_CHANNEL_IN24 24 /**< @brief External analog input 24. */ -#define ADC_CHANNEL_IN25 25 /**< @brief External analog input 25. */ -/** @} */ - -/** - * @name Sampling rates - * @{ - */ -#define ADC_SAMPLE_4 0 /**< @brief 4 cycles sampling time. */ -#define ADC_SAMPLE_9 1 /**< @brief 9 cycles sampling time. */ -#define ADC_SAMPLE_16 2 /**< @brief 16 cycles sampling time. */ -#define ADC_SAMPLE_24 3 /**< @brief 24 cycles sampling time. */ -#define ADC_SAMPLE_48 4 /**< @brief 48 cycles sampling time. */ -#define ADC_SAMPLE_96 5 /**< @brief 96 cycles sampling time. */ -#define ADC_SAMPLE_192 6 /**< @brief 192 cycles sampling time. */ -#define ADC_SAMPLE_384 7 /**< @brief 384 cycles sampling time. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief ADC1 driver enable switch. - * @details If set to @p TRUE the support for ADC1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM32_ADC_USE_ADC1) || defined(__DOXYGEN__) -#define STM32_ADC_USE_ADC1 FALSE -#endif - -/** - * @brief ADC common clock divider. - * @note This setting is influenced by the VDDA voltage and other - * external conditions, please refer to the STM32L15x datasheet - * for more info.
    - * See section 6.3.15 "12-bit ADC characteristics". - */ -#if !defined(STM32_ADC_ADCPRE) || defined(__DOXYGEN__) -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV1 -#endif - -/** - * @brief ADC1 DMA priority (0..3|lowest..highest). - */ -#if !defined(STM32_ADC_ADC1_DMA_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#endif - -/** - * @brief ADC interrupt priority level setting. - */ -#if !defined(STM32_ADC_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_IRQ_PRIORITY 5 -#endif - -/** - * @brief ADC1 DMA interrupt priority level setting. - */ -#if !defined(STM32_ADC_ADC1_DMA_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 -#endif - -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !STM32_HAS_ADC1 -#error "ADC1 not present in the selected device" -#endif - -#if !STM32_ADC_USE_ADC1 -#error "ADC driver activated but no ADC peripheral assigned" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ADC_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to ADC1" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !CORTEX_IS_VALID_KERNEL_PRIORITY(STM32_ADC_ADC1_DMA_IRQ_PRIORITY) -#error "Invalid IRQ priority assigned to ADC1 DMA" -#endif - -#if STM32_ADC_USE_ADC1 && \ - !STM32_DMA_IS_VALID_PRIORITY(STM32_ADC_ADC1_DMA_PRIORITY) -#error "Invalid DMA priority assigned to ADC1" -#endif - -#if !defined(STM32_DMA_REQUIRED) -#define STM32_DMA_REQUIRED -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief ADC sample data type. - */ -typedef uint16_t adcsample_t; - -/** - * @brief Channels number in a conversion group. - */ -typedef uint16_t adc_channels_num_t; - -/** - * @brief Possible ADC failure causes. - * @note Error codes are architecture dependent and should not relied - * upon. - */ -typedef enum { - ADC_ERR_DMAFAILURE = 0, /**< DMA operations failure. */ - ADC_ERR_OVERFLOW = 1 /**< ADC overflow condition. */ -} adcerror_t; - -/** - * @brief Type of a structure representing an ADC driver. - */ -typedef struct ADCDriver ADCDriver; - -/** - * @brief ADC notification callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] buffer pointer to the most recent samples data - * @param[in] n number of buffer rows available starting from @p buffer - */ -typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n); - -/** - * @brief ADC error callback type. - * - * @param[in] adcp pointer to the @p ADCDriver object triggering the - * callback - * @param[in] err ADC error code - */ -typedef void (*adcerrorcallback_t)(ADCDriver *adcp, adcerror_t err); - -/** - * @brief Conversion group configuration structure. - * @details This implementation-dependent structure describes a conversion - * operation. - * @note The use of this configuration structure requires knowledge of - * STM32 ADC cell registers interface, please refer to the STM32 - * reference manual for details. - */ -typedef struct { - /** - * @brief Enables the circular buffer mode for the group. - */ - bool_t circular; - /** - * @brief Number of the analog channels belonging to the conversion group. - */ - adc_channels_num_t num_channels; - /** - * @brief Callback function associated to the group or @p NULL. - */ - adccallback_t end_cb; - /** - * @brief Error callback or @p NULL. - */ - adcerrorcallback_t error_cb; - /* End of the mandatory fields.*/ - /** - * @brief ADC CR1 register initialization data. - * @note All the required bits must be defined into this field except - * @p ADC_CR1_SCAN that is enforced inside the driver. - */ - uint32_t cr1; - /** - * @brief ADC CR2 register initialization data. - * @note All the required bits must be defined into this field except - * @p ADC_CR2_DMA, @p ADC_CR2_CONT and @p ADC_CR2_ADON that are - * enforced inside the driver. - */ - uint32_t cr2; - /** - * @brief ADC SMPR1 register initialization data. - * @details In this field must be specified the sample times for channels - * 20...25. - */ - uint32_t smpr1; - /** - * @brief ADC SMPR2 register initialization data. - * @details In this field must be specified the sample times for channels - * 10...19. - */ - uint32_t smpr2; - /** - * @brief ADC SMPR3 register initialization data. - * @details In this field must be specified the sample times for channels - * 0...9. - */ - uint32_t smpr3; - /** - * @brief ADC SQR1 register initialization data. - * @details Conversion group sequence 25...27 + sequence length. - */ - uint32_t sqr1; - /** - * @brief ADC SQR2 register initialization data. - * @details Conversion group sequence 19...24. - */ - uint32_t sqr2; - /** - * @brief ADC SQR3 register initialization data. - * @details Conversion group sequence 13...18. - */ - uint32_t sqr3; - /** - * @brief ADC SQR3 register initialization data. - * @details Conversion group sequence 7...12. - */ - uint32_t sqr4; - /** - * @brief ADC SQR3 register initialization data. - * @details Conversion group sequence 1...6. - */ - uint32_t sqr5; -} ADCConversionGroup; - -/** - * @brief Driver configuration structure. - * @note It could be empty on some architectures. - */ -typedef struct { - uint32_t dummy; -} ADCConfig; - -/** - * @brief Structure representing an ADC driver. - */ -struct ADCDriver { - /** - * @brief Driver state. - */ - adcstate_t state; - /** - * @brief Current configuration data. - */ - const ADCConfig *config; - /** - * @brief Current samples buffer pointer or @p NULL. - */ - adcsample_t *samples; - /** - * @brief Current samples buffer depth or @p 0. - */ - size_t depth; - /** - * @brief Current conversion group pointer or @p NULL. - */ - const ADCConversionGroup *grpp; -#if ADC_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif -#if ADC_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the peripheral. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* ADC_USE_MUTUAL_EXCLUSION */ -#if defined(ADC_DRIVER_EXT_FIELDS) - ADC_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Pointer to the ADCx registers block. - */ - ADC_TypeDef *adc; - /** - * @brief Pointer to associated SMA channel. - */ - const stm32_dma_stream_t *dmastp; - /** - * @brief DMA mode bit mask. - */ - uint32_t dmamode; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Sequences building helper macros - * @{ - */ -/** - * @brief Number of channels in a conversion sequence. - */ -#define ADC_SQR1_NUM_CH(n) (((n) - 1) << 20) - -#define ADC_SQR5_SQ1_N(n) ((n) << 0) /**< @brief 1st channel in seq. */ -#define ADC_SQR5_SQ2_N(n) ((n) << 5) /**< @brief 2nd channel in seq. */ -#define ADC_SQR5_SQ3_N(n) ((n) << 10) /**< @brief 3rd channel in seq. */ -#define ADC_SQR5_SQ4_N(n) ((n) << 15) /**< @brief 4th channel in seq. */ -#define ADC_SQR5_SQ5_N(n) ((n) << 20) /**< @brief 5th channel in seq. */ -#define ADC_SQR5_SQ6_N(n) ((n) << 25) /**< @brief 6th channel in seq. */ - -#define ADC_SQR4_SQ7_N(n) ((n) << 0) /**< @brief 7th channel in seq. */ -#define ADC_SQR4_SQ8_N(n) ((n) << 5) /**< @brief 8th channel in seq. */ -#define ADC_SQR4_SQ9_N(n) ((n) << 10) /**< @brief 9th channel in seq. */ -#define ADC_SQR4_SQ10_N(n) ((n) << 15) /**< @brief 10th channel in seq.*/ -#define ADC_SQR4_SQ11_N(n) ((n) << 20) /**< @brief 11th channel in seq.*/ -#define ADC_SQR4_SQ12_N(n) ((n) << 25) /**< @brief 12th channel in seq.*/ - -#define ADC_SQR3_SQ13_N(n) ((n) << 0) /**< @brief 13th channel in seq.*/ -#define ADC_SQR3_SQ14_N(n) ((n) << 5) /**< @brief 14th channel in seq.*/ -#define ADC_SQR3_SQ15_N(n) ((n) << 10) /**< @brief 15th channel in seq.*/ -#define ADC_SQR3_SQ16_N(n) ((n) << 15) /**< @brief 16th channel in seq.*/ -#define ADC_SQR3_SQ17_N(n) ((n) << 20) /**< @brief 17th channel in seq.*/ -#define ADC_SQR3_SQ18_N(n) ((n) << 25) /**< @brief 18th channel in seq.*/ - -#define ADC_SQR2_SQ19_N(n) ((n) << 0) /**< @brief 19th channel in seq.*/ -#define ADC_SQR2_SQ20_N(n) ((n) << 5) /**< @brief 20th channel in seq.*/ -#define ADC_SQR2_SQ21_N(n) ((n) << 10) /**< @brief 21th channel in seq.*/ -#define ADC_SQR2_SQ22_N(n) ((n) << 15) /**< @brief 22th channel in seq.*/ -#define ADC_SQR2_SQ23_N(n) ((n) << 20) /**< @brief 23th channel in seq.*/ -#define ADC_SQR2_SQ24_N(n) ((n) << 25) /**< @brief 24th channel in seq.*/ - -#define ADC_SQR1_SQ25_N(n) ((n) << 0) /**< @brief 25th channel in seq.*/ -#define ADC_SQR1_SQ26_N(n) ((n) << 5) /**< @brief 26th channel in seq.*/ -#define ADC_SQR1_SQ27_N(n) ((n) << 10) /**< @brief 27th channel in seq.*/ -/** @} */ - -/** - * @name Sampling rate settings helper macros - * @{ - */ -#define ADC_SMPR3_SMP_AN0(n) ((n) << 0) /**< @brief AN0 sampling time. */ -#define ADC_SMPR3_SMP_AN1(n) ((n) << 3) /**< @brief AN1 sampling time. */ -#define ADC_SMPR3_SMP_AN2(n) ((n) << 6) /**< @brief AN2 sampling time. */ -#define ADC_SMPR3_SMP_AN3(n) ((n) << 9) /**< @brief AN3 sampling time. */ -#define ADC_SMPR3_SMP_AN4(n) ((n) << 12) /**< @brief AN4 sampling time. */ -#define ADC_SMPR3_SMP_AN5(n) ((n) << 15) /**< @brief AN5 sampling time. */ -#define ADC_SMPR3_SMP_AN6(n) ((n) << 18) /**< @brief AN6 sampling time. */ -#define ADC_SMPR3_SMP_AN7(n) ((n) << 21) /**< @brief AN7 sampling time. */ -#define ADC_SMPR3_SMP_AN8(n) ((n) << 24) /**< @brief AN8 sampling time. */ -#define ADC_SMPR3_SMP_AN9(n) ((n) << 27) /**< @brief AN9 sampling time. */ - -#define ADC_SMPR2_SMP_AN10(n) ((n) << 0) /**< @brief AN10 sampling time. */ -#define ADC_SMPR2_SMP_AN11(n) ((n) << 3) /**< @brief AN11 sampling time. */ -#define ADC_SMPR2_SMP_AN12(n) ((n) << 6) /**< @brief AN12 sampling time. */ -#define ADC_SMPR2_SMP_AN13(n) ((n) << 9) /**< @brief AN13 sampling time. */ -#define ADC_SMPR2_SMP_AN14(n) ((n) << 12) /**< @brief AN14 sampling time. */ -#define ADC_SMPR2_SMP_AN15(n) ((n) << 15) /**< @brief AN15 sampling time. */ -#define ADC_SMPR2_SMP_SENSOR(n) ((n) << 18) /**< @brief Temperature Sensor - sampling time. */ -#define ADC_SMPR2_SMP_VREF(n) ((n) << 21) /**< @brief Voltage Reference - sampling time. */ -#define ADC_SMPR2_SMP_AN18(n) ((n) << 24) /**< @brief AN18 sampling time. */ -#define ADC_SMPR2_SMP_AN19(n) ((n) << 27) /**< @brief AN19 sampling time. */ - -#define ADC_SMPR1_SMP_AN20(n) ((n) << 0) /**< @brief AN20 sampling time. */ -#define ADC_SMPR1_SMP_AN21(n) ((n) << 3) /**< @brief AN21 sampling time. */ -#define ADC_SMPR1_SMP_AN22(n) ((n) << 6) /**< @brief AN22 sampling time. */ -#define ADC_SMPR1_SMP_AN23(n) ((n) << 9) /**< @brief AN23 sampling time. */ -#define ADC_SMPR1_SMP_AN24(n) ((n) << 12) /**< @brief AN24 sampling time. */ -#define ADC_SMPR1_SMP_AN25(n) ((n) << 15) /**< @brief AN25 sampling time. */ -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM32_ADC_USE_ADC1 && !defined(__DOXYGEN__) -extern ADCDriver ADCD1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void adc_lld_init(void); - void adc_lld_start(ADCDriver *adcp); - void adc_lld_stop(ADCDriver *adcp); - void adc_lld_start_conversion(ADCDriver *adcp); - void adc_lld_stop_conversion(ADCDriver *adcp); - void adcSTM32EnableTSVREFE(void); - void adcSTM32DisableTSVREFE(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_ADC */ - -#endif /* _ADC_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/ext_lld_isr.c b/os/hal/platforms/STM32L1xx/ext_lld_isr.c deleted file mode 100644 index 64c1e16f1e..0000000000 --- a/os/hal/platforms/STM32L1xx/ext_lld_isr.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/ext_lld_isr.c - * @brief STM32L1xx EXT subsystem low level driver ISR code. - * - * @addtogroup EXT - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -#include "ext_lld_isr.h" - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief EXTI[0] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI0_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 0); - EXTD1.config->channels[0].cb(&EXTD1, 0); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[1] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI1_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 1); - EXTD1.config->channels[1].cb(&EXTD1, 1); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[2] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI2_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 2); - EXTD1.config->channels[2].cb(&EXTD1, 2); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[3] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI3_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 3); - EXTD1.config->channels[3].cb(&EXTD1, 3); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[4] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI4_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 4); - EXTD1.config->channels[4].cb(&EXTD1, 4); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[5]...EXTI[9] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI9_5_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 9)); - EXTI->PR = pr; - if (pr & (1 << 5)) - EXTD1.config->channels[5].cb(&EXTD1, 5); - if (pr & (1 << 6)) - EXTD1.config->channels[6].cb(&EXTD1, 6); - if (pr & (1 << 7)) - EXTD1.config->channels[7].cb(&EXTD1, 7); - if (pr & (1 << 8)) - EXTD1.config->channels[8].cb(&EXTD1, 8); - if (pr & (1 << 9)) - EXTD1.config->channels[9].cb(&EXTD1, 9); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[10]...EXTI[15] interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(EXTI15_10_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | - (1 << 15)); - EXTI->PR = pr; - if (pr & (1 << 10)) - EXTD1.config->channels[10].cb(&EXTD1, 10); - if (pr & (1 << 11)) - EXTD1.config->channels[11].cb(&EXTD1, 11); - if (pr & (1 << 12)) - EXTD1.config->channels[12].cb(&EXTD1, 12); - if (pr & (1 << 13)) - EXTD1.config->channels[13].cb(&EXTD1, 13); - if (pr & (1 << 14)) - EXTD1.config->channels[14].cb(&EXTD1, 14); - if (pr & (1 << 15)) - EXTD1.config->channels[15].cb(&EXTD1, 15); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[16] interrupt handler (PVD). - * - * @isr - */ -CH_IRQ_HANDLER(PVD_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 16); - EXTD1.config->channels[16].cb(&EXTD1, 16); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[17] interrupt handler (RTC). - * - * @isr - */ -CH_IRQ_HANDLER(RTCAlarm_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 17); - EXTD1.config->channels[17].cb(&EXTD1, 17); - - CH_IRQ_EPILOGUE(); -} -/** - * @brief EXTI[18] interrupt handler (USB_FS_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(USB_FS_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 18); - EXTD1.config->channels[18].cb(&EXTD1, 18); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[19] interrupt handler (TAMPER_STAMP). - * - * @isr - */ -CH_IRQ_HANDLER(TAMPER_STAMP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 19); - EXTD1.config->channels[19].cb(&EXTD1, 19); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[20] interrupt handler (RTC_WKUP). - * - * @isr - */ -CH_IRQ_HANDLER(RTC_WKUP_IRQHandler) { - - CH_IRQ_PROLOGUE(); - - EXTI->PR = (1 << 20); - EXTD1.config->channels[20].cb(&EXTD1, 20); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief EXTI[21]...EXTI[22] interrupt handler (COMP). - * - * @isr - */ -CH_IRQ_HANDLER(COMP_IRQHandler) { - uint32_t pr; - - CH_IRQ_PROLOGUE(); - - pr = EXTI->PR & ((1 << 21) | (1 << 22)); - EXTI->PR = pr; - if (pr & (1 << 21)) - EXTD1.config->channels[21].cb(&EXTD1, 21); - if (pr & (1 << 22)) - EXTD1.config->channels[22].cb(&EXTD1, 22); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Enables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_enable(void) { - - nvicEnableVector(EXTI0_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI0_IRQ_PRIORITY)); - nvicEnableVector(EXTI1_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI1_IRQ_PRIORITY)); - nvicEnableVector(EXTI2_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI2_IRQ_PRIORITY)); - nvicEnableVector(EXTI3_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI3_IRQ_PRIORITY)); - nvicEnableVector(EXTI4_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI4_IRQ_PRIORITY)); - nvicEnableVector(EXTI9_5_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI5_9_IRQ_PRIORITY)); - nvicEnableVector(EXTI15_10_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI10_15_IRQ_PRIORITY)); - nvicEnableVector(PVD_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI16_IRQ_PRIORITY)); - nvicEnableVector(RTC_Alarm_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI17_IRQ_PRIORITY)); - nvicEnableVector(USB_FS_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI18_IRQ_PRIORITY)); - nvicEnableVector(TAMPER_STAMP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI19_IRQ_PRIORITY)); - nvicEnableVector(RTC_WKUP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI20_IRQ_PRIORITY)); - nvicEnableVector(COMP_IRQn, - CORTEX_PRIORITY_MASK(STM32_EXT_EXTI21_22_IRQ_PRIORITY)); -} - -/** - * @brief Disables EXTI IRQ sources. - * - * @notapi - */ -void ext_lld_exti_irq_disable(void) { - - nvicDisableVector(EXTI0_IRQn); - nvicDisableVector(EXTI1_IRQn); - nvicDisableVector(EXTI2_IRQn); - nvicDisableVector(EXTI3_IRQn); - nvicDisableVector(EXTI4_IRQn); - nvicDisableVector(EXTI9_5_IRQn); - nvicDisableVector(EXTI15_10_IRQn); - nvicDisableVector(PVD_IRQn); - nvicDisableVector(RTC_Alarm_IRQn); - nvicDisableVector(USB_FS_WKUP_IRQn); - nvicDisableVector(TAMPER_STAMP_IRQn); - nvicDisableVector(RTC_WKUP_IRQn); - nvicDisableVector(COMP_IRQn); -} - -#endif /* HAL_USE_EXT */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/ext_lld_isr.h b/os/hal/platforms/STM32L1xx/ext_lld_isr.h deleted file mode 100644 index cc0f15649e..0000000000 --- a/os/hal/platforms/STM32L1xx/ext_lld_isr.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/ext_lld_isr.h - * @brief STM32L1xx EXT subsystem low level driver ISR header. - * - * @addtogroup EXT - * @{ - */ - -#ifndef _EXT_LLD_ISR_H_ -#define _EXT_LLD_ISR_H_ - -#if HAL_USE_EXT || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief EXTI0 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI0_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI1 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI1_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI2 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI2_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI3 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI3_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI4 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI4_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI9..5 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI5_9_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI15..10 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI10_15_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI16 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI16_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI17 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI17_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI18 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI18_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI19 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI19_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI20 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI20_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#endif - -/** - * @brief EXTI21..22 interrupt priority level setting. - */ -#if !defined(STM32_EXT_EXTI21_22_IRQ_PRIORITY) || defined(__DOXYGEN__) -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void ext_lld_exti_irq_enable(void); - void ext_lld_exti_irq_disable(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_EXT */ - -#endif /* _EXT_LLD_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/hal_lld.c b/os/hal/platforms/STM32L1xx/hal_lld.c deleted file mode 100644 index 43ba6832d5..0000000000 --- a/os/hal/platforms/STM32L1xx/hal_lld.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/hal_lld.c - * @brief STM32L1xx HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/** - * @brief Initializes the backup domain. - */ -static void hal_lld_backup_domain_init(void) { - - /* Backup domain access enabled and left open.*/ - PWR->CR |= PWR_CR_DBP; - - /* Reset BKP domain if different clock source selected.*/ - if ((RCC->CSR & STM32_RTCSEL_MASK) != STM32_RTCSEL){ - /* Backup domain reset.*/ - RCC->CSR |= RCC_CSR_RTCRST; - RCC->CSR &= ~RCC_CSR_RTCRST; - } - - /* If enabled then the LSE is started.*/ -#if STM32_LSE_ENABLED - RCC->CSR |= RCC_CSR_LSEON; - while ((RCC->CSR & RCC_CSR_LSERDY) == 0) - ; /* Waits until LSE is stable. */ -#endif - -#if STM32_RTCSEL != STM32_RTCSEL_NOCLOCK - /* If the backup domain hasn't been initialized yet then proceed with - initialization.*/ - if ((RCC->CSR & RCC_CSR_RTCEN) == 0) { - /* Selects clock source.*/ - RCC->CSR |= STM32_RTCSEL; - - /* RTC clock enabled.*/ - RCC->CSR |= RCC_CSR_RTCEN; - } -#endif /* STM32_RTCSEL != STM32_RTCSEL_NOCLOCK */ -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * - * @notapi - */ -void hal_lld_init(void) { - - /* Reset of all peripherals.*/ - rccResetAHB(!RCC_AHBRSTR_FLITFRST); - rccResetAPB1(!RCC_APB1RSTR_PWRRST); - rccResetAPB2(!0); - - /* SysTick initialization using the system clock.*/ - SysTick->LOAD = STM32_HCLK / CH_FREQUENCY - 1; - SysTick->VAL = 0; - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_ENABLE_Msk | - SysTick_CTRL_TICKINT_Msk; - - /* DWT cycle counter enable.*/ - SCS_DEMCR |= SCS_DEMCR_TRCENA; - DWT_CTRL |= DWT_CTRL_CYCCNTENA; - - /* PWR clock enabled.*/ - rccEnablePWRInterface(FALSE); - - /* Initializes the backup domain.*/ - hal_lld_backup_domain_init(); - -#if defined(STM32_DMA_REQUIRED) - dmaInit(); -#endif - - /* Programmable voltage detector enable.*/ -#if STM32_PVD_ENABLE - PWR->CR |= PWR_CR_PVDE | (STM32_PLS & STM32_PLS_MASK); -#endif /* STM32_PVD_ENABLE */ -} - -/** - * @brief STM32L1xx voltage, clocks and PLL initialization. - * @note All the involved constants come from the file @p board.h. - * @note This function should be invoked just after the system reset. - * - * @special - */ -#if defined(STM32L1XX_MD) || defined(__DOXYGEN__) -/** - * @brief Clocks and internal voltage initialization. - */ -void stm32_clock_init(void) { - -#if !STM32_NO_INIT - /* PWR clock enable.*/ - RCC->APB1ENR = RCC_APB1ENR_PWREN; - - /* Core voltage setup.*/ - while ((PWR->CSR & PWR_CSR_VOSF) != 0) - ; /* Waits until regulator is stable. */ - PWR->CR = STM32_VOS; - while ((PWR->CSR & PWR_CSR_VOSF) != 0) - ; /* Waits until regulator is stable. */ - - /* Initial clocks setup and wait for MSI stabilization, the MSI clock is - always enabled because it is the fallback clock when PLL the fails. - Trim fields are not altered from reset values.*/ - RCC->CFGR = 0; - RCC->ICSCR = (RCC->ICSCR & ~STM32_MSIRANGE_MASK) | STM32_MSIRANGE; - RCC->CSR = RCC_CSR_RMVF; - RCC->CR = RCC_CR_MSION; - while ((RCC->CR & RCC_CR_MSIRDY) == 0) - ; /* Waits until MSI is stable. */ - -#if STM32_HSI_ENABLED - /* HSI activation.*/ - RCC->CR |= RCC_CR_HSION; - while ((RCC->CR & RCC_CR_HSIRDY) == 0) - ; /* Waits until HSI is stable. */ -#endif - -#if STM32_HSE_ENABLED -#if defined(STM32_HSE_BYPASS) - /* HSE Bypass.*/ - RCC->CR |= RCC_CR_HSEBYP; -#endif - /* HSE activation.*/ - RCC->CR |= RCC_CR_HSEON; - while ((RCC->CR & RCC_CR_HSERDY) == 0) - ; /* Waits until HSE is stable. */ -#endif - -#if STM32_LSI_ENABLED - /* LSI activation.*/ - RCC->CSR |= RCC_CSR_LSION; - while ((RCC->CSR & RCC_CSR_LSIRDY) == 0) - ; /* Waits until LSI is stable. */ -#endif - -#if STM32_LSE_ENABLED - /* LSE activation, have to unlock the register.*/ - if ((RCC->CSR & RCC_CSR_LSEON) == 0) { - PWR->CR |= PWR_CR_DBP; - RCC->CSR |= RCC_CSR_LSEON; - PWR->CR &= ~PWR_CR_DBP; - } - while ((RCC->CSR & RCC_CSR_LSERDY) == 0) - ; /* Waits until LSE is stable. */ -#endif - -#if STM32_ACTIVATE_PLL - /* PLL activation.*/ - RCC->CFGR |= STM32_PLLDIV | STM32_PLLMUL | STM32_PLLSRC; - RCC->CR |= RCC_CR_PLLON; - while (!(RCC->CR & RCC_CR_PLLRDY)) - ; /* Waits until PLL is stable. */ -#endif - - /* Other clock-related settings (dividers, MCO etc).*/ - RCC->CR |= STM32_RTCPRE; - RCC->CFGR |= STM32_MCOPRE | STM32_MCOSEL | - STM32_PPRE2 | STM32_PPRE1 | STM32_HPRE; - RCC->CSR |= STM32_RTCSEL; - - /* Flash setup and final clock selection.*/ -#if defined(STM32_FLASHBITS1) - FLASH->ACR = STM32_FLASHBITS1; -#endif -#if defined(STM32_FLASHBITS2) - FLASH->ACR = STM32_FLASHBITS2; -#endif - - /* Switching to the configured clock source if it is different from MSI.*/ -#if (STM32_SW != STM32_SW_MSI) - RCC->CFGR |= STM32_SW; /* Switches on the selected clock source. */ - while ((RCC->CFGR & RCC_CFGR_SWS) != (STM32_SW << 2)) - ; -#endif -#endif /* STM32_NO_INIT */ - - /* SYSCFG clock enabled here because it is a multi-functional unit shared - among multiple drivers.*/ - rccEnableAPB2(RCC_APB2ENR_SYSCFGEN, TRUE); -} -#else -void stm32_clock_init(void) {} -#endif - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/hal_lld.h b/os/hal/platforms/STM32L1xx/hal_lld.h deleted file mode 100644 index 297b9553bd..0000000000 --- a/os/hal/platforms/STM32L1xx/hal_lld.h +++ /dev/null @@ -1,1070 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/hal_lld.h - * @brief STM32L1xx HAL subsystem low level driver header. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - STM32_LSECLK. - * - STM32_HSECLK. - * - STM32_HSE_BYPASS (optionally). - * . - * One of the following macros must also be defined: - * - STM32L1XX_MD for Ultra Low Power Medium-density devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include "stm32.h" - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS TRUE - -/** - * @name Platform identification - * @{ - */ -#define PLATFORM_NAME "STM32L1xx Ultra Low Power Medium Density" -/** @} */ - -/** - * @name Internal clock sources - * @{ - */ -#define STM32_HSICLK 16000000 /**< High speed internal clock. */ -#define STM32_LSICLK 38000 /**< Low speed internal clock. */ -/** @} */ - -/** - * @name PWR_CR register bits definitions - * @{ - */ -#define STM32_VOS_MASK (3 << 11) /**< Core voltage mask. */ -#define STM32_VOS_1P8 (1 << 11) /**< Core voltage 1.8 Volts. */ -#define STM32_VOS_1P5 (2 << 11) /**< Core voltage 1.5 Volts. */ -#define STM32_VOS_1P2 (3 << 11) /**< Core voltage 1.2 Volts. */ - -#define STM32_PLS_MASK (7 << 5) /**< PLS bits mask. */ -#define STM32_PLS_LEV0 (0 << 5) /**< PVD level 0. */ -#define STM32_PLS_LEV1 (1 << 5) /**< PVD level 1. */ -#define STM32_PLS_LEV2 (2 << 5) /**< PVD level 2. */ -#define STM32_PLS_LEV3 (3 << 5) /**< PVD level 3. */ -#define STM32_PLS_LEV4 (4 << 5) /**< PVD level 4. */ -#define STM32_PLS_LEV5 (5 << 5) /**< PVD level 5. */ -#define STM32_PLS_LEV6 (6 << 5) /**< PVD level 6. */ -#define STM32_PLS_LEV7 (7 << 5) /**< PVD level 7. */ -/** @} */ - -/** - * @name RCC_CR register bits definitions - * @{ - */ -#define STM32_RTCPRE_MASK (3 << 29) /**< RTCPRE mask. */ -#define STM32_RTCPRE_DIV2 (0 << 29) /**< HSE divided by 2. */ -#define STM32_RTCPRE_DIV4 (1 << 29) /**< HSE divided by 4. */ -#define STM32_RTCPRE_DIV8 (2 << 29) /**< HSE divided by 2. */ -#define STM32_RTCPRE_DIV16 (3 << 29) /**< HSE divided by 16. */ -/** @} */ - -/** - * @name RCC_CFGR register bits definitions - * @{ - */ -#define STM32_SW_MSI (0 << 0) /**< SYSCLK source is MSI. */ -#define STM32_SW_HSI (1 << 0) /**< SYSCLK source is HSI. */ -#define STM32_SW_HSE (2 << 0) /**< SYSCLK source is HSE. */ -#define STM32_SW_PLL (3 << 0) /**< SYSCLK source is PLL. */ - -#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */ -#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */ -#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */ -#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */ -#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */ -#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */ -#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */ -#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */ -#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */ - -#define STM32_PPRE1_DIV1 (0 << 8) /**< HCLK divided by 1. */ -#define STM32_PPRE1_DIV2 (4 << 8) /**< HCLK divided by 2. */ -#define STM32_PPRE1_DIV4 (5 << 8) /**< HCLK divided by 4. */ -#define STM32_PPRE1_DIV8 (6 << 8) /**< HCLK divided by 8. */ -#define STM32_PPRE1_DIV16 (7 << 8) /**< HCLK divided by 16. */ - -#define STM32_PPRE2_DIV1 (0 << 11) /**< HCLK divided by 1. */ -#define STM32_PPRE2_DIV2 (4 << 11) /**< HCLK divided by 2. */ -#define STM32_PPRE2_DIV4 (5 << 11) /**< HCLK divided by 4. */ -#define STM32_PPRE2_DIV8 (6 << 11) /**< HCLK divided by 8. */ -#define STM32_PPRE2_DIV16 (7 << 11) /**< HCLK divided by 16. */ - -#define STM32_PLLSRC_HSI (0 << 16) /**< PLL clock source is HSI. */ -#define STM32_PLLSRC_HSE (1 << 16) /**< PLL clock source is HSE. */ - -#define STM32_MCOSEL_NOCLOCK (0 << 24) /**< No clock on MCO pin. */ -#define STM32_MCOSEL_SYSCLK (1 << 24) /**< SYSCLK on MCO pin. */ -#define STM32_MCOSEL_HSI (2 << 24) /**< HSI clock on MCO pin. */ -#define STM32_MCOSEL_MSI (3 << 24) /**< MSI clock on MCO pin. */ -#define STM32_MCOSEL_HSE (4 << 24) /**< HSE clock on MCO pin. */ -#define STM32_MCOSEL_PLL (5 << 24) /**< PLL clock on MCO pin. */ -#define STM32_MCOSEL_LSI (6 << 24) /**< LSI clock on MCO pin. */ -#define STM32_MCOSEL_LSE (7 << 24) /**< LSE clock on MCO pin. */ - -#define STM32_MCOPRE_DIV1 (0 << 28) /**< MCO divided by 1. */ -#define STM32_MCOPRE_DIV2 (1 << 28) /**< MCO divided by 1. */ -#define STM32_MCOPRE_DIV4 (2 << 28) /**< MCO divided by 1. */ -#define STM32_MCOPRE_DIV8 (3 << 28) /**< MCO divided by 1. */ -#define STM32_MCOPRE_DIV16 (4 << 28) /**< MCO divided by 1. */ -/** @} */ - -/** - * @name RCC_ICSCR register bits definitions - * @{ - */ -#define STM32_MSIRANGE_MASK (7 << 13) /**< MSIRANGE field mask. */ -#define STM32_MSIRANGE_64K (0 << 13) /**< 64kHz nominal. */ -#define STM32_MSIRANGE_128K (1 << 13) /**< 128kHz nominal. */ -#define STM32_MSIRANGE_256K (2 << 13) /**< 256kHz nominal. */ -#define STM32_MSIRANGE_512K (3 << 13) /**< 512kHz nominal. */ -#define STM32_MSIRANGE_1M (4 << 13) /**< 1MHz nominal. */ -#define STM32_MSIRANGE_2M (5 << 13) /**< 2MHz nominal. */ -#define STM32_MSIRANGE_4M (6 << 13) /**< 4MHz nominal */ -/** @} */ - -/** - * @name RCC_CSR register bits definitions - * @{ - */ -#define STM32_RTCSEL_MASK (3 << 16) /**< RTC source mask. */ -#define STM32_RTCSEL_NOCLOCK (0 << 16) /**< No RTC source. */ -#define STM32_RTCSEL_LSE (1 << 16) /**< RTC source is LSE. */ -#define STM32_RTCSEL_LSI (2 << 16) /**< RTC source is LSI. */ -#define STM32_RTCSEL_HSEDIV (3 << 16) /**< RTC source is HSE divided. */ -/** @} */ - -/*===========================================================================*/ -/* Platform capabilities. */ -/*===========================================================================*/ - -/** - * @name STM32L1xx capabilities - * @{ - */ -/* ADC attributes.*/ -#define STM32_HAS_ADC1 TRUE -#define STM32_HAS_ADC2 FALSE -#define STM32_HAS_ADC3 FALSE - -/* CAN attributes.*/ -#define STM32_HAS_CAN1 FALSE -#define STM32_HAS_CAN2 FALSE -#define STM32_CAN_MAX_FILTERS 0 - -/* DAC attributes.*/ -#define STM32_HAS_DAC TRUE - -/* DMA attributes.*/ -#define STM32_ADVANCED_DMA FALSE -#define STM32_HAS_DMA1 TRUE -#define STM32_HAS_DMA2 FALSE - -/* ETH attributes.*/ -#define STM32_HAS_ETH FALSE - -/* EXTI attributes.*/ -#define STM32_EXTI_NUM_CHANNELS 23 - -/* GPIO attributes.*/ -#define STM32_HAS_GPIOA TRUE -#define STM32_HAS_GPIOB TRUE -#define STM32_HAS_GPIOC TRUE -#define STM32_HAS_GPIOD TRUE -#define STM32_HAS_GPIOE TRUE -#define STM32_HAS_GPIOF FALSE -#define STM32_HAS_GPIOG FALSE -#define STM32_HAS_GPIOH TRUE -#define STM32_HAS_GPIOI FALSE - -/* I2C attributes.*/ -#define STM32_HAS_I2C1 TRUE -#define STM32_I2C1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_I2C1_RX_DMA_CHN 0x00000000 -#define STM32_I2C1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_I2C1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C2 TRUE -#define STM32_I2C2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_I2C2_RX_DMA_CHN 0x00000000 -#define STM32_I2C2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_I2C2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_I2C3 FALSE -#define STM32_I2C3_RX_DMA_MSK 0 -#define STM32_I2C3_RX_DMA_CHN 0x00000000 -#define STM32_I2C3_TX_DMA_MSK 0 -#define STM32_I2C3_TX_DMA_CHN 0x00000000 - -/* RTC attributes.*/ -#define STM32_HAS_RTC TRUE -#define STM32_RTC_HAS_SUBSECONDS FALSE -#define STM32_RTC_IS_CALENDAR TRUE - -/* SDIO attributes.*/ -#define STM32_HAS_SDIO TRUE - -/* SPI attributes.*/ -#define STM32_HAS_SPI1 TRUE -#define STM32_SPI1_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 2) -#define STM32_SPI1_RX_DMA_CHN 0x00000000 -#define STM32_SPI1_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 3) -#define STM32_SPI1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI2 TRUE -#define STM32_SPI2_RX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 4) -#define STM32_SPI2_RX_DMA_CHN 0x00000000 -#define STM32_SPI2_TX_DMA_MSK STM32_DMA_STREAM_ID_MSK(1, 5) -#define STM32_SPI2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_SPI3 FALSE -#define STM32_SPI3_RX_DMA_MSK 0 -#define STM32_SPI3_RX_DMA_CHN 0x00000000 -#define STM32_SPI3_TX_DMA_MSK 0 -#define STM32_SPI3_TX_DMA_CHN 0x00000000 - -/* TIM attributes.*/ -#define STM32_HAS_TIM1 FALSE -#define STM32_HAS_TIM2 TRUE -#define STM32_HAS_TIM3 TRUE -#define STM32_HAS_TIM4 TRUE -#define STM32_HAS_TIM5 FALSE -#define STM32_HAS_TIM6 TRUE -#define STM32_HAS_TIM7 TRUE -#define STM32_HAS_TIM8 FALSE -#define STM32_HAS_TIM9 TRUE -#define STM32_HAS_TIM10 TRUE -#define STM32_HAS_TIM11 TRUE -#define STM32_HAS_TIM12 FALSE -#define STM32_HAS_TIM13 FALSE -#define STM32_HAS_TIM14 FALSE -#define STM32_HAS_TIM15 FALSE -#define STM32_HAS_TIM16 FALSE -#define STM32_HAS_TIM17 FALSE - -/* USART attributes.*/ -#define STM32_HAS_USART1 TRUE -#define STM32_USART1_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 5)) -#define STM32_USART1_RX_DMA_CHN 0x00000000 -#define STM32_USART1_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 4)) -#define STM32_USART1_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART2 TRUE -#define STM32_USART2_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 6)) -#define STM32_USART2_RX_DMA_CHN 0x00000000 -#define STM32_USART2_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 7)) -#define STM32_USART2_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART3 TRUE -#define STM32_USART3_RX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 3)) -#define STM32_USART3_RX_DMA_CHN 0x00000000 -#define STM32_USART3_TX_DMA_MSK (STM32_DMA_STREAM_ID_MSK(1, 2)) -#define STM32_USART3_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART4 FALSE -#define STM32_UART4_RX_DMA_MSK 0 -#define STM32_UART4_RX_DMA_CHN 0x00000000 -#define STM32_UART4_TX_DMA_MSK 0 -#define STM32_UART4_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_UART5 FALSE -#define STM32_UART5_RX_DMA_MSK 0 -#define STM32_UART5_RX_DMA_CHN 0x00000000 -#define STM32_UART5_TX_DMA_MSK 0 -#define STM32_UART5_TX_DMA_CHN 0x00000000 - -#define STM32_HAS_USART6 FALSE -#define STM32_USART6_RX_DMA_MSK 0 -#define STM32_USART6_RX_DMA_CHN 0x00000000 -#define STM32_USART6_TX_DMA_MSK 0 -#define STM32_USART6_TX_DMA_CHN 0x00000000 - -/* USB attributes.*/ -#define STM32_HAS_USB TRUE -#define STM32_HAS_OTG1 FALSE -#define STM32_HAS_OTG2 FALSE -/** @} */ - -/*===========================================================================*/ -/* Platform specific friendly IRQ names. */ -/*===========================================================================*/ - -/** - * @name IRQ VECTOR names - * @{ - */ -#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */ -#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line - detect. */ -#define TAMPER_STAMP_IRQHandler Vector48 /**< Tamper and Time Stamp - through EXTI. */ -#define RTC_WKUP_IRQHandler Vector4C /**< RTC Wakeup Timer through - EXTI. */ -#define FLASH_IRQHandler Vector50 /**< Flash. */ -#define RCC_IRQHandler Vector54 /**< RCC. */ -#define EXTI0_IRQHandler Vector58 /**< EXTI Line 0. */ -#define EXTI1_IRQHandler Vector5C /**< EXTI Line 1. */ -#define EXTI2_IRQHandler Vector60 /**< EXTI Line 2. */ -#define EXTI3_IRQHandler Vector64 /**< EXTI Line 3. */ -#define EXTI4_IRQHandler Vector68 /**< EXTI Line 4. */ -#define DMA1_Ch1_IRQHandler Vector6C /**< DMA1 Channel 1. */ -#define DMA1_Ch2_IRQHandler Vector70 /**< DMA1 Channel 2. */ -#define DMA1_Ch3_IRQHandler Vector74 /**< DMA1 Channel 3. */ -#define DMA1_Ch4_IRQHandler Vector78 /**< DMA1 Channel 4. */ -#define DMA1_Ch5_IRQHandler Vector7C /**< DMA1 Channel 5. */ -#define DMA1_Ch6_IRQHandler Vector80 /**< DMA1 Channel 6. */ -#define DMA1_Ch7_IRQHandler Vector84 /**< DMA1 Channel 7. */ -#define ADC1_IRQHandler Vector88 /**< ADC1. */ -#define USB_HP_IRQHandler Vector8C /**< USB High Priority. */ -#define USB_LP_IRQHandler Vector90 /**< USB Low Priority. */ -#define DAC_IRQHandler Vector94 /**< DAC. */ -#define COMP_IRQHandler Vector98 /**< Comparator through EXTI. */ -#define EXTI9_5_IRQHandler Vector9C /**< EXTI Line 9..5. */ -#define TIM9_IRQHandler VectorA0 /**< TIM9. */ -#define TIM10_IRQHandler VectorA4 /**< TIM10. */ -#define TIM11_IRQHandler VectorA8 /**< TIM11. */ -#define LCD_IRQHandler VectorAC /**< LCD. */ -#define TIM2_IRQHandler VectorB0 /**< TIM2. */ -#define TIM3_IRQHandler VectorB4 /**< TIM3. */ -#define TIM4_IRQHandler VectorB8 /**< TIM4. */ -#define I2C1_EV_IRQHandler VectorBC /**< I2C1 Event. */ -#define I2C1_ER_IRQHandler VectorC0 /**< I2C1 Error. */ -#define I2C2_EV_IRQHandler VectorC4 /**< I2C2 Event. */ -#define I2C2_ER_IRQHandler VectorC8 /**< I2C2 Error. */ -#define SPI1_IRQHandler VectorCC /**< SPI1. */ -#define SPI2_IRQHandler VectorD0 /**< SPI2. */ -#define USART1_IRQHandler VectorD4 /**< USART1. */ -#define USART2_IRQHandler VectorD8 /**< USART2. */ -#define USART3_IRQHandler VectorDC /**< USART3. */ -#define EXTI15_10_IRQHandler VectorE0 /**< EXTI Line 15..10. */ -#define RTC_Alarm_IRQHandler VectorE4 /**< RTC Alarm through EXTI. */ -#define USB_FS_WKUP_IRQHandler VectorE8 /**< USB Wakeup from suspend. */ -#define TIM6_IRQHandler VectorEC /**< TIM6. */ -#define TIM7_IRQHandler VectorF0 /**< TIM7. */ -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name Configuration options - * @{ - */ -/** - * @brief Disables the PWR/RCC initialization in the HAL. - */ -#if !defined(STM32_NO_INIT) || defined(__DOXYGEN__) -#define STM32_NO_INIT FALSE -#endif - -/** - * @brief Core voltage selection. - * @note This setting affects all the performance and clock related - * settings, the maximum performance is only obtainable selecting - * the maximum voltage. - */ -#if !defined(STM32_VOS) || defined(__DOXYGEN__) -#define STM32_VOS STM32_VOS_1P8 -#endif - -/** - * @brief Enables or disables the programmable voltage detector. - */ -#if !defined(STM32_PVD_ENABLE) || defined(__DOXYGEN__) -#define STM32_PVD_ENABLE FALSE -#endif - -/** - * @brief Sets voltage level for programmable voltage detector. - */ -#if !defined(STM32_PLS) || defined(__DOXYGEN__) -#define STM32_PLS STM32_PLS_LEV0 -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM32_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_HSE_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the LSE clock source. - */ -#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM32_LSE_ENABLED FALSE -#endif - -/** - * @brief ADC clock setting. - */ -#if !defined(STM32_ADC_CLOCK_ENABLED) || defined(__DOXYGEN__) -#define STM32_ADC_CLOCK_ENABLED TRUE -#endif - -/** - * @brief USB clock setting. - */ -#if !defined(STM32_USB_CLOCK_ENABLED) || defined(__DOXYGEN__) -#define STM32_USB_CLOCK_ENABLED TRUE -#endif - -/** - * @brief MSI frequency setting. - */ -#if !defined(STM32_MSIRANGE) || defined(__DOXYGEN__) -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#endif - -/** - * @brief Main clock source selection. - * @note If the selected clock source is not the PLL then the PLL is not - * initialized and started. - * @note The default value is calculated for a 32MHz system clock from - * the internal 16MHz HSI clock. - */ -#if !defined(STM32_SW) || defined(__DOXYGEN__) -#define STM32_SW STM32_SW_PLL -#endif - -/** - * @brief Clock source for the PLL. - * @note This setting has only effect if the PLL is selected as the - * system clock source. - * @note The default value is calculated for a 32MHz system clock from - * the internal 16MHz HSI clock. - */ -#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__) -#define STM32_PLLSRC STM32_PLLSRC_HSI -#endif - -/** - * @brief PLL multiplier value. - * @note The allowed values are 3, 4, 6, 8, 12, 16, 32, 48. - * @note The default value is calculated for a 32MHz system clock from - * the internal 16MHz HSI clock. - */ -#if !defined(STM32_PLLMUL_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLMUL_VALUE 6 -#endif - -/** - * @brief PLL divider value. - * @note The allowed values are 2, 3, 4. - * @note The default value is calculated for a 32MHz system clock from - * the internal 16MHz HSI clock. - */ -#if !defined(STM32_PLLDIV_VALUE) || defined(__DOXYGEN__) -#define STM32_PLLDIV_VALUE 3 -#endif - -/** - * @brief AHB prescaler value. - * @note The default value is calculated for a 32MHz system clock from - * the internal 16MHz HSI clock. - */ -#if !defined(STM32_HPRE) || defined(__DOXYGEN__) -#define STM32_HPRE STM32_HPRE_DIV1 -#endif - -/** - * @brief APB1 prescaler value. - */ -#if !defined(STM32_PPRE1) || defined(__DOXYGEN__) -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#endif - -/** - * @brief APB2 prescaler value. - */ -#if !defined(STM32_PPRE2) || defined(__DOXYGEN__) -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#endif - -/** - * @brief MCO clock source. - */ -#if !defined(STM32_MCOSEL) || defined(__DOXYGEN__) -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#endif - -/** - * @brief MCO divider setting. - */ -#if !defined(STM32_MCOPRE) || defined(__DOXYGEN__) -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#endif - -/** - * @brief RTC/LCD clock source. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCSEL STM32_RTCSEL_LSE -#endif - -/** - * @brief HSE divider toward RTC setting. - */ -#if !defined(STM32_RTCSEL) || defined(__DOXYGEN__) -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#endif -/** @} */ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/* - * Configuration-related checks. - */ -#if !defined(STM32L1xx_MCUCONF) -#error "Using a wrong mcuconf.h file, STM32L1xx_MCUCONF not defined" -#endif - -/* Voltage related limits.*/ -#if (STM32_VOS == STM32_VOS_1P8) || defined(__DOXYGEN__) -/** - * @brief Maximum HSE clock frequency at current voltage setting. - */ -#define STM32_HSECLK_MAX 32000000 - -/** - * @brief Maximum SYSCLK clock frequency at current voltage setting. - */ -#define STM32_SYSCLK_MAX 32000000 - -/** - * @brief Maximum VCO clock frequency at current voltage setting. - */ -#define STM32_PLLVCO_MAX 96000000 - -/** - * @brief Minimum VCO clock frequency at current voltage setting. - */ -#define STM32_PLLVCO_MIN 6000000 - -/** - * @brief Maximum APB1 clock frequency. - */ -#define STM32_PCLK1_MAX 32000000 - -/** - * @brief Maximum APB2 clock frequency. - */ -#define STM32_PCLK2_MAX 32000000 - -/** - * @brief Maximum frequency not requiring a wait state for flash accesses. - */ -#define STM32_0WS_THRESHOLD 16000000 - -/** - * @brief HSI availability at current voltage settings. - */ -#define STM32_HSI_AVAILABLE TRUE - -#elif STM32_VOS == STM32_VOS_1P5 -#define STM32_HSECLK_MAX 16000000 -#define STM32_SYSCLK_MAX 16000000 -#define STM32_PLLVCO_MAX 48000000 -#define STM32_PLLVCO_MIN 6000000 -#define STM32_PCLK1_MAX 16000000 -#define STM32_PCLK2_MAX 16000000 -#define STM32_0WS_THRESHOLD 8000000 -#define STM32_HSI_AVAILABLE TRUE -#elif STM32_VOS == STM32_VOS_1P2 -#define STM32_HSECLK_MAX 4000000 -#define STM32_SYSCLK_MAX 4000000 -#define STM32_PLLVCO_MAX 24000000 -#define STM32_PLLVCO_MIN 6000000 -#define STM32_PCLK1_MAX 4000000 -#define STM32_PCLK2_MAX 4000000 -#define STM32_0WS_THRESHOLD 2000000 -#define STM32_HSI_AVAILABLE FALSE -#else -#error "invalid STM32_VOS value specified" -#endif - -/* HSI related checks.*/ -#if STM32_HSI_ENABLED -#if !STM32_HSI_AVAILABLE - #error "impossible to activate HSI under the current voltage settings" -#endif -#else /* !STM32_HSI_ENABLED */ -#if STM32_ADC_CLOCK_ENABLED || \ - (STM32_SW == STM32_SW_HSI) || \ - ((STM32_SW == STM32_SW_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) || \ - (STM32_MCOSEL == STM32_MCOSEL_HSI) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSI)) -#error "required HSI clock is not enabled" -#endif -#endif /* !STM32_HSI_ENABLED */ - -/* HSE related checks.*/ -#if STM32_HSE_ENABLED -#if STM32_HSECLK == 0 -#error "impossible to activate HSE" -#endif -#if (STM32_HSECLK < 1000000) || (STM32_HSECLK > STM32_HSECLK_MAX) -#error "STM32_HSECLK outside acceptable range (1MHz...STM32_HSECLK_MAX)" -#endif -#else /* !STM32_HSE_ENABLED */ -#if (STM32_SW == STM32_SW_HSE) || \ - ((STM32_SW == STM32_SW_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) || \ - (STM32_MCOSEL == STM32_MCOSEL_HSE) || \ - ((STM32_MCOSEL == STM32_MCOSEL_PLL) && \ - (STM32_PLLSRC == STM32_PLLSRC_HSE)) || \ - (STM_RTC_SOURCE == STM32_RTCSEL_HSEDIV) -#error "required HSE clock is not enabled" -#endif -#endif /* !STM32_HSE_ENABLED */ - -/* LSI related checks.*/ -#if STM32_LSI_ENABLED -#else /* !STM32_LSI_ENABLED */ -#if STM_RTCCLK == STM32_LSICLK -#error "required LSI clock is not enabled" -#endif -#endif /* !STM32_LSI_ENABLED */ - -/* LSE related checks.*/ -#if STM32_LSE_ENABLED -#if (STM32_LSECLK == 0) -#error "impossible to activate LSE" -#endif -#if (STM32_LSECLK < 1000) || (STM32_LSECLK > 1000000) -#error "STM32_LSECLK outside acceptable range (1...1000kHz)" -#endif -#else /* !STM32_LSE_ENABLED */ -#if STM_RTCCLK == STM32_LSECLK -#error "required LSE clock is not enabled" -#endif -#endif /* !STM32_LSE_ENABLED */ - -/* PLL related checks.*/ -#if STM32_USB_CLOCK_ENABLED || \ - (STM32_SW == STM32_SW_PLL) || \ - (STM32_MCOSEL == STM32_MCOSEL_PLL) || \ - defined(__DOXYGEN__) -/** - * @brief PLL activation flag. - */ -#define STM32_ACTIVATE_PLL TRUE -#else -#define STM32_ACTIVATE_PLL FALSE -#endif - -/** - * @brief PLLMUL field. - */ -#if (STM32_PLLMUL_VALUE == 3) || defined(__DOXYGEN__) -#define STM32_PLLMUL (0 << 18) -#elif STM32_PLLMUL_VALUE == 4 -#define STM32_PLLMUL (1 << 18) -#elif STM32_PLLMUL_VALUE == 6 -#define STM32_PLLMUL (2 << 18) -#elif STM32_PLLMUL_VALUE == 8 -#define STM32_PLLMUL (3 << 18) -#elif STM32_PLLMUL_VALUE == 12 -#define STM32_PLLMUL (4 << 18) -#elif STM32_PLLMUL_VALUE == 16 -#define STM32_PLLMUL (5 << 18) -#elif STM32_PLLMUL_VALUE == 24 -#define STM32_PLLMUL (6 << 18) -#elif STM32_PLLMUL_VALUE == 32 -#define STM32_PLLMUL (7 << 18) -#elif STM32_PLLMUL_VALUE == 48 -#define STM32_PLLMUL (8 << 18) -#else -#error "invalid STM32_PLLMUL_VALUE value specified" -#endif - -/** - * @brief PLLDIV field. - */ -#if (STM32_PLLDIV_VALUE == 2) || defined(__DOXYGEN__) -#define STM32_PLLDIV (1 << 22) -#elif STM32_PLLDIV_VALUE == 3 -#define STM32_PLLDIV (2 << 22) -#elif STM32_PLLDIV_VALUE == 4 -#define STM32_PLLDIV (3 << 22) -#else -#error "invalid STM32_PLLDIV_VALUE value specified" -#endif - -/** - * @brief PLL input clock frequency. - */ -#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__) -#define STM32_PLLCLKIN STM32_HSECLK -#elif STM32_PLLSRC == STM32_PLLSRC_HSI -#define STM32_PLLCLKIN STM32_HSICLK -#else -#error "invalid STM32_PLLSRC value specified" -#endif - -/* PLL input frequency range check.*/ -#if (STM32_PLLCLKIN < 2000000) || (STM32_PLLCLKIN > 24000000) -#error "STM32_PLLCLKIN outside acceptable range (2...24MHz)" -#endif - -/** - * @brief PLL VCO frequency. - */ -#define STM32_PLLVCO (STM32_PLLCLKIN * STM32_PLLMUL_VALUE) - -/* PLL output frequency range check.*/ -#if (STM32_PLLVCO < STM32_PLLVCO_MIN) || (STM32_PLLVCO > STM32_PLLVCO_MAX) -#error "STM32_PLLVCO outside acceptable range (STM32_PLLVCO_MIN...STM32_PLLVCO_MAX)" -#endif - -/** - * @brief PLL output clock frequency. - */ -#define STM32_PLLCLKOUT (STM32_PLLVCO / STM32_PLLDIV_VALUE) - -/* PLL output frequency range check.*/ -#if (STM32_PLLCLKOUT < 2000000) || (STM32_PLLCLKOUT > 32000000) -#error "STM32_PLLCLKOUT outside acceptable range (2...32MHz)" -#endif - -/** - * @brief MSI frequency. - * @note Values are taken from the STM8Lxx datasheet. - */ -#if STM32_MSIRANGE == STM32_MSIRANGE_64K -#define STM32_MSICLK 65500 -#elif STM32_MSIRANGE == STM32_MSIRANGE_128K -#define STM32_MSICLK 131000 -#elif STM32_MSIRANGE == STM32_MSIRANGE_256K -#define STM32_MSICLK 262000 -#elif STM32_MSIRANGE == STM32_MSIRANGE_512K -#define STM32_MSICLK 524000 -#elif STM32_MSIRANGE == STM32_MSIRANGE_1M -#define STM32_MSICLK 1050000 -#elif STM32_MSIRANGE == STM32_MSIRANGE_2M -#define STM32_MSICLK 2100000 -#elif STM32_MSIRANGE == STM32_MSIRANGE_4M -#define STM32_MSICLK 4200000 -#else -#error "invalid STM32_MSIRANGE value specified" -#endif - -/** - * @brief System clock source. - */ -#if STM32_NO_INIT || defined(__DOXYGEN__) -#define STM32_SYSCLK 2100000 -#elif (STM32_SW == STM32_SW_MSI) -#define STM32_SYSCLK STM32_MSICLK -#elif (STM32_SW == STM32_SW_HSI) -#define STM32_SYSCLK STM32_HSICLK -#elif (STM32_SW == STM32_SW_HSE) -#define STM32_SYSCLK STM32_HSECLK -#elif (STM32_SW == STM32_SW_PLL) -#define STM32_SYSCLK STM32_PLLCLKOUT -#else -#error "invalid STM32_SW value specified" -#endif - -/* Check on the system clock.*/ -#if STM32_SYSCLK > STM32_SYSCLK_MAX -#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief AHB frequency. - */ -#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__) -#define STM32_HCLK (STM32_SYSCLK / 1) -#elif STM32_HPRE == STM32_HPRE_DIV2 -#define STM32_HCLK (STM32_SYSCLK / 2) -#elif STM32_HPRE == STM32_HPRE_DIV4 -#define STM32_HCLK (STM32_SYSCLK / 4) -#elif STM32_HPRE == STM32_HPRE_DIV8 -#define STM32_HCLK (STM32_SYSCLK / 8) -#elif STM32_HPRE == STM32_HPRE_DIV16 -#define STM32_HCLK (STM32_SYSCLK / 16) -#elif STM32_HPRE == STM32_HPRE_DIV64 -#define STM32_HCLK (STM32_SYSCLK / 64) -#elif STM32_HPRE == STM32_HPRE_DIV128 -#define STM32_HCLK (STM32_SYSCLK / 128) -#elif STM32_HPRE == STM32_HPRE_DIV256 -#define STM32_HCLK (STM32_SYSCLK / 256) -#elif STM32_HPRE == STM32_HPRE_DIV512 -#define STM32_HCLK (STM32_SYSCLK / 512) -#else -#error "invalid STM32_HPRE value specified" -#endif - -/* AHB frequency check.*/ -#if STM32_HCLK > STM32_SYSCLK_MAX -#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)" -#endif - -/** - * @brief APB1 frequency. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK1 (STM32_HCLK / 1) -#elif STM32_PPRE1 == STM32_PPRE1_DIV2 -#define STM32_PCLK1 (STM32_HCLK / 2) -#elif STM32_PPRE1 == STM32_PPRE1_DIV4 -#define STM32_PCLK1 (STM32_HCLK / 4) -#elif STM32_PPRE1 == STM32_PPRE1_DIV8 -#define STM32_PCLK1 (STM32_HCLK / 8) -#elif STM32_PPRE1 == STM32_PPRE1_DIV16 -#define STM32_PCLK1 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE1 value specified" -#endif - -/* APB1 frequency check.*/ -#if STM32_PCLK1 > STM32_PCLK1_MAX -#error "STM32_PCLK1 exceeding maximum frequency (STM32_PCLK1_MAX)" -#endif - -/** - * @brief APB2 frequency. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_PCLK2 (STM32_HCLK / 1) -#elif STM32_PPRE2 == STM32_PPRE2_DIV2 -#define STM32_PCLK2 (STM32_HCLK / 2) -#elif STM32_PPRE2 == STM32_PPRE2_DIV4 -#define STM32_PCLK2 (STM32_HCLK / 4) -#elif STM32_PPRE2 == STM32_PPRE2_DIV8 -#define STM32_PCLK2 (STM32_HCLK / 8) -#elif STM32_PPRE2 == STM32_PPRE2_DIV16 -#define STM32_PCLK2 (STM32_HCLK / 16) -#else -#error "invalid STM32_PPRE2 value specified" -#endif - -/* APB2 frequency check.*/ -#if STM32_PCLK2 > STM32_PCLK2_MAX -#error "STM32_PCLK2 exceeding maximum frequency (STM32_PCLK2_MAX)" -#endif - -/** - * @brief MCO divider clock. - */ -#if (STM32_MCOSEL == STM32_MCOSEL_NOCLOCK) || defined(__DOXYGEN__) -#define STM_MCODIVCLK 0 -#elif STM32_MCOSEL == STM32_MCOSEL_HSI -#define STM_MCODIVCLK STM32_HSICLK -#elif STM32_MCOSEL == STM32_MCOSEL_MSI -#define STM_MCODIVCLK STM32_MSICLK -#elif STM32_MCOSEL == STM32_MCOSEL_HSE -#define STM_MCODIVCLK STM32_HSECLK -#elif STM32_MCOSEL == STM32_MCOSEL_PLL -#define STM_MCODIVCLK STM32_PLLCLKOUT -#elif STM32_MCOSEL == STM32_MCOSEL_LSI -#define STM_MCODIVCLK STM32_LSICLK -#elif STM32_MCOSEL == STM32_MCOSEL_LSE -#define STM_MCODIVCLK STM32_LSECLK -#else -#error "invalid STM32_MCOSEL value specified" -#endif - -/** - * @brief MCO output pin clock. - */ -#if (STM32_MCOPRE == STM32_MCOPRE_DIV1) || defined(__DOXYGEN__) -#define STM_MCOCLK STM_MCODIVCLK -#elif STM32_MCOPRE == STM32_MCOPRE_DIV2 -#define STM_MCOCLK (STM_MCODIVCLK / 2) -#elif STM32_MCOPRE == STM32_MCOPRE_DIV4 -#define STM_MCOCLK (STM_MCODIVCLK / 4) -#elif STM32_MCOPRE == STM32_MCOPRE_DIV8 -#define STM_MCOCLK (STM_MCODIVCLK / 8) -#elif STM32_MCOPRE == STM32_MCOPRE_DIV16 -#define STM_MCOCLK (STM_MCODIVCLK / 16) -#else -#error "invalid STM32_MCOPRE value specified" -#endif - -/** - * @brief HSE divider toward RTC clock. - */ -#if (STM32_RTCPRE == STM32_RTCPRE_DIV2) || defined(__DOXYGEN__) -#define STM32_HSEDIVCLK (STM32_HSECLK / 2) -#elif (STM32_RTCPRE == STM32_RTCPRE_DIV4) || defined(__DOXYGEN__) -#define STM32_HSEDIVCLK (STM32_HSECLK / 4) -#elif (STM32_RTCPRE == STM32_RTCPRE_DIV8) || defined(__DOXYGEN__) -#define STM32_HSEDIVCLK (STM32_HSECLK / 8) -#elif (STM32_RTCPRE == STM32_RTCPRE_DIV16) || defined(__DOXYGEN__) -#define STM32_HSEDIVCLK (STM32_HSECLK / 16) -#else -#error "invalid STM32_RTCPRE value specified" -#endif - -/** - * @brief RTC/LCD clock. - */ -#if (STM32_RTCSEL == STM32_RTCSEL_NOCLOCK) || defined(__DOXYGEN__) -#define STM_RTCCLK 0 -#elif STM32_RTCSEL == STM32_RTCSEL_LSE -#define STM_RTCCLK STM32_LSECLK -#elif STM32_RTCSEL == STM32_RTCSEL_LSI -#define STM_RTCCLK STM32_LSICLK -#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV -#define STM_RTCCLK STM32_HSEDIVCLK -#else -#error "invalid STM32_RTCSEL value specified" -#endif - -/** - * @brief ADC frequency. - */ -#define STM32_ADCCLK STM32_HSICLK - -/** - * @brief USB frequency. - */ -#define STM32_USBCLK (STM32_PLLVCO / 2) - -/** - * @brief Timers 2, 3, 4, 6, 7 clock. - */ -#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK1 (STM32_PCLK1 * 1) -#else -#define STM32_TIMCLK1 (STM32_PCLK1 * 2) -#endif - -/** - * @brief Timers 9, 10, 11 clock. - */ -#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__) -#define STM32_TIMCLK2 (STM32_PCLK2 * 1) -#else -#define STM32_TIMCLK2 (STM32_PCLK2 * 2) -#endif - -/** - * @brief Flash settings. - */ -#if (STM32_HCLK <= STM32_0WS_THRESHOLD) || defined(__DOXYGEN__) -#define STM32_FLASHBITS1 0x00000000 -#else -#define STM32_FLASHBITS1 0x00000004 -#define STM32_FLASHBITS2 0x00000007 -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type representing a system clock frequency. - */ -typedef uint32_t halclock_t; - -/** - * @brief Type of the realtime free counter value. - */ -typedef uint32_t halrtcnt_t; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Returns the current value of the system free running counter. - * @note This service is implemented by returning the content of the - * DWT_CYCCNT register. - * - * @return The value of the system free running counter of - * type halrtcnt_t. - * - * @notapi - */ -#define hal_lld_get_counter_value() DWT_CYCCNT - -/** - * @brief Realtime counter frequency. - * @note The DWT_CYCCNT register is incremented directly by the system - * clock so this function returns STM32_HCLK. - * - * @return The realtime counter frequency of type halclock_t. - * - * @notapi - */ -#define hal_lld_get_counter_frequency() STM32_HCLK - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -/* STM32 ISR, DMA and RCC helpers.*/ -#include "stm32_isr.h" -#include "stm32_dma.h" -#include "stm32_rcc.h" - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void stm32_clock_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/platform.dox b/os/hal/platforms/STM32L1xx/platform.dox deleted file mode 100644 index 6b2b26a424..0000000000 --- a/os/hal/platforms/STM32L1xx/platform.dox +++ /dev/null @@ -1,319 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM32L1xx_DRIVERS STM32L1xx Drivers - * @details This section describes all the supported drivers on the STM32L1xx - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup STM32L1xx_HAL STM32L1xx Initialization Support - * @details The STM32L1xx HAL support is responsible for system initialization. - * - * @section stm32l1xx_hal_1 Supported HW resources - * - PLL1. - * - RCC. - * - Flash. - * . - * @section stm32l1xx_hal_2 STM32L1xx HAL driver implementation features - * - PLL startup and stabilization. - * - Clock tree initialization. - * - Clock source selection. - * - Flash wait states initialization based on the selected clock options. - * - SYSTICK initialization based on current clock and kernel required rate. - * - DMA support initialization. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_ADC STM32L1xx ADC Support - * @details The STM32L1xx ADC driver supports the ADC peripherals using DMA - * channels for maximum performance. - * - * @section stm32l1xx_adc_1 Supported HW resources - * - ADC1. - * - DMA1. - * . - * @section stm32l1xx_adc_2 STM32L1xx ADC driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Streaming conversion using DMA for maximum performance. - * - Programmable ADC interrupt priority level. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - DMA and ADC errors detection. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_EXT STM32L1xx EXT Support - * @details The STM32L1xx EXT driver uses the EXTI peripheral. - * - * @section stm32l1xx_ext_1 Supported HW resources - * - EXTI. - * . - * @section stm32l1xx_ext_2 STM32L1xx EXT driver implementation features - * - Each EXTI channel can be independently enabled and programmed. - * - Programmable EXTI interrupts priority level. - * - Capability to work as event sources (WFE) rather than interrupt sources. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_GPT STM32L1xx GPT Support - * @details The STM32L1xx GPT driver uses the TIMx peripherals. - * - * @section stm32l1xx_gpt_1 Supported HW resources - * - TIM2. - * - TIM3. - * - TIM4. - * . - * @section stm32l1xx_gpt_2 STM32L1xx GPT driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_ICU STM32L1xx ICU Support - * @details The STM32L1xx ICU driver uses the TIMx peripherals. - * - * @section stm32l1xx_icu_1 Supported HW resources - * - TIM2. - * - TIM3. - * - TIM4. - * . - * @section stm32l1xx_icu_2 STM32L1xx ICU driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_PAL STM32L1xx PAL Support - * @details The STM32L1xx PAL driver uses the GPIO peripherals. - * - * @section stm32l1xx_pal_1 Supported HW resources - * - GPIOA. - * - GPIOB. - * - GPIOC. - * - GPIOD. - * - GPIOE. - * - GPIOH. - * . - * @section stm32l1xx_pal_2 STM32L1xx PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 16 bits wide ports. - * - Atomic set/reset functions. - * - Atomic set+reset function (atomic bus operations). - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section stm32l1xx_pal_3 Supported PAL setup modes - * The STM32L1xx PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_INPUT_PULLDOWN. - * - @p PAL_MODE_INPUT_ANALOG. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * - @p PAL_MODE_ALTERNATE (non standard). - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section stm32l1xx_pal_4 Suboptimal behavior - * The STM32L1xx GPIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Pad/port toggling operations are not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_PWM STM32L1xx PWM Support - * @details The STM32L1xx PWM driver uses the TIMx peripherals. - * - * @section stm32l1xx_pwm_1 Supported HW resources - * - TIM1. - * - TIM2. - * - TIM3. - * - TIM4. - * . - * @section stm32l1xx_pwm_2 STM32L1xx PWM driver implementation features - * - Each timer can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Four independent PWM channels per timer. - * - Programmable TIMx interrupts priority level. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_SERIAL STM32L1xx Serial Support - * @details The STM32L1xx Serial driver uses the USART/UART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section stm32l1xx_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - USART3 (where present). - * - UART4 (where present). - * - UART5 (where present). - * . - * @section stm32l1xx_serial_2 STM32L1xx Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * - Programmable priority levels for each UART/USART. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_SPI STM32L1xx SPI Support - * @details The SPI driver supports the STM32L1xx SPI peripherals using DMA - * channels for maximum performance. - * - * @section stm32l1xx_spi_1 Supported HW resources - * - SPI1. - * - SPI2. - * - SPI3 (where present). - * - DMA1. - * - DMA2 (where present). - * . - * @section stm32l1xx_spi_2 STM32L1xx SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each SPI can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each SPI. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_UART STM32L1xx UART Support - * @details The UART driver supports the STM32L1xx USART peripherals using DMA - * channels for maximum performance. - * - * @section stm32l1xx_uart_1 Supported HW resources - * The UART driver can support any of the following hardware resources: - * - USART1. - * - USART2. - * - USART3 (where present). - * - DMA1. - * . - * @section stm32l1xx_uart_2 STM32L1xx UART driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART/USART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Programmable interrupt priority levels for each UART/USART. - * - DMA is used for receiving and transmitting. - * - Programmable DMA bus priority for each DMA channel. - * - Programmable DMA interrupt priority for each DMA channel. - * - Programmable DMA error hook. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_USB STM32L1xx USB Support - * @details The USB driver supports the STM32L1xx USB peripheral. - * - * @section stm32l1xx_usb_1 Supported HW resources - * The USB driver can support any of the following hardware resources: - * - USB. - * . - * @section stm32l1xx_usb_2 STM32L1xx USB driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Programmable interrupt priority levels. - * - Each endpoint programmable in Control, Bulk and Interrupt modes. - * . - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_PLATFORM_DRIVERS STM32L1xx Platform Drivers - * @details Platform support drivers. Platform drivers do not implement HAL - * standard driver templates, their role is to support platform - * specific functionalities. - * - * @ingroup STM32L1xx_DRIVERS - */ - -/** - * @defgroup STM32L1xx_DMA STM32L1xx DMA Support - * @details This DMA helper driver is used by the other drivers in order to - * access the shared DMA resources in a consistent way. - * - * @section stm32l1xx_dma_1 Supported HW resources - * The DMA driver can support any of the following hardware resources: - * - DMA1. - * . - * @section stm32l1xx_dma_2 STM32L1xx DMA driver implementation features - * - Exports helper functions/macros to the other drivers that share the - * DMA resource. - * - Automatic DMA clock stop when not in use by any driver. - * - DMA streams and interrupt vectors sharing among multiple drivers. - * . - * @ingroup STM32L1xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32L1xx_ISR STM32L1xx ISR Support - * @details This ISR helper driver is used by the other drivers in order to - * map ISR names to physical vector names. - * - * @ingroup STM32L1xx_PLATFORM_DRIVERS - */ - -/** - * @defgroup STM32L1xx_RCC STM32L1xx RCC Support - * @details This RCC helper driver is used by the other drivers in order to - * access the shared RCC resources in a consistent way. - * - * @section stm32f1xx_rcc_1 Supported HW resources - * - RCC. - * . - * @section stm32l1xx_rcc_2 STM32L1xx RCC driver implementation features - * - Peripherals reset. - * - Peripherals clock enable. - * - Peripherals clock disable. - * . - * @ingroup STM32L1xx_PLATFORM_DRIVERS - */ diff --git a/os/hal/platforms/STM32L1xx/platform.mk b/os/hal/platforms/STM32L1xx/platform.mk deleted file mode 100644 index f54f5fec3c..0000000000 --- a/os/hal/platforms/STM32L1xx/platform.mk +++ /dev/null @@ -1,23 +0,0 @@ -# List of all the STM32L1xx platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32L1xx/stm32_dma.c \ - ${CHIBIOS}/os/hal/platforms/STM32L1xx/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32L1xx/adc_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32L1xx/ext_lld_isr.c \ - ${CHIBIOS}/os/hal/platforms/STM32/ext_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/spi_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1/i2c_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1/uart_lld.c \ - ${CHIBIOS}/os/hal/platforms/STM32/USBv1/usb_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32L1xx \ - ${CHIBIOS}/os/hal/platforms/STM32 \ - ${CHIBIOS}/os/hal/platforms/STM32/GPIOv2 \ - ${CHIBIOS}/os/hal/platforms/STM32/I2Cv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/USARTv1 \ - ${CHIBIOS}/os/hal/platforms/STM32/USBv1 diff --git a/os/hal/platforms/STM32L1xx/stm32_dma.c b/os/hal/platforms/STM32L1xx/stm32_dma.c deleted file mode 100644 index 0e6d524046..0000000000 --- a/os/hal/platforms/STM32L1xx/stm32_dma.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/stm32_dma.c - * @brief DMA helper driver code. - * - * @addtogroup STM32L1xx_DMA - * @details DMA sharing helper driver. In the STM32 the DMA streams are a - * shared resource, this driver allows to allocate and free DMA - * streams at runtime in order to allow all the other device - * drivers to coordinate the access to the resource. - * @note The DMA ISR handlers are all declared into this module because - * sharing, the various device drivers can associate a callback to - * ISRs when allocating streams. - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/* The following macro is only defined if some driver requiring DMA services - has been enabled.*/ -#if defined(STM32_DMA_REQUIRED) || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver local definitions. */ -/*===========================================================================*/ - -/** - * @brief Mask of the DMA1 streams in @p dma_streams_mask. - */ -#define STM32_DMA1_STREAMS_MASK 0x0000007F - -/** - * @brief Mask of the DMA2 streams in @p dma_streams_mask. - */ -#define STM32_DMA2_STREAMS_MASK 0x00000F80 - -/** - * @brief Post-reset value of the stream CCR register. - */ -#define STM32_DMA_CCR_RESET_VALUE 0x00000000 - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief DMA streams descriptors. - * @details This table keeps the association between an unique stream - * identifier and the involved physical registers. - * @note Don't use this array directly, use the appropriate wrapper macros - * instead: @p STM32_DMA1_STREAM1, @p STM32_DMA1_STREAM2 etc. - */ -const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS] = { - {DMA1_Channel1, &DMA1->IFCR, 0, 0, DMA1_Channel1_IRQn}, - {DMA1_Channel2, &DMA1->IFCR, 4, 1, DMA1_Channel2_IRQn}, - {DMA1_Channel3, &DMA1->IFCR, 8, 2, DMA1_Channel3_IRQn}, - {DMA1_Channel4, &DMA1->IFCR, 12, 3, DMA1_Channel4_IRQn}, - {DMA1_Channel5, &DMA1->IFCR, 16, 4, DMA1_Channel5_IRQn}, - {DMA1_Channel6, &DMA1->IFCR, 20, 5, DMA1_Channel6_IRQn}, - {DMA1_Channel7, &DMA1->IFCR, 24, 6, DMA1_Channel7_IRQn} -}; - -/*===========================================================================*/ -/* Driver local variables and types. */ -/*===========================================================================*/ - -/** - * @brief DMA ISR redirector type. - */ -typedef struct { - stm32_dmaisr_t dma_func; /**< @brief DMA callback function. */ - void *dma_param; /**< @brief DMA callback parameter. */ -} dma_isr_redir_t; - -/** - * @brief Mask of the allocated streams. - */ -static uint32_t dma_streams_mask; - -/** - * @brief DMA IRQ redirectors. - */ -static dma_isr_redir_t dma_isr_redir[STM32_DMA_STREAMS]; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief DMA1 stream 1 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 0) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 0; - if (dma_isr_redir[0].dma_func) - dma_isr_redir[0].dma_func(dma_isr_redir[0].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 2 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch2_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 4) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 4; - if (dma_isr_redir[1].dma_func) - dma_isr_redir[1].dma_func(dma_isr_redir[1].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 3 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch3_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 8) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 8; - if (dma_isr_redir[2].dma_func) - dma_isr_redir[2].dma_func(dma_isr_redir[2].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 4 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch4_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 12) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 12; - if (dma_isr_redir[3].dma_func) - dma_isr_redir[3].dma_func(dma_isr_redir[3].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 5 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch5_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 16) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 16; - if (dma_isr_redir[4].dma_func) - dma_isr_redir[4].dma_func(dma_isr_redir[4].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 6 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch6_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 20) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 20; - if (dma_isr_redir[5].dma_func) - dma_isr_redir[5].dma_func(dma_isr_redir[5].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief DMA1 stream 7 shared interrupt handler. - * - * @isr - */ -CH_IRQ_HANDLER(DMA1_Ch7_IRQHandler) { - uint32_t flags; - - CH_IRQ_PROLOGUE(); - - flags = (DMA1->ISR >> 24) & STM32_DMA_ISR_MASK; - DMA1->IFCR = STM32_DMA_ISR_MASK << 24; - if (dma_isr_redir[6].dma_func) - dma_isr_redir[6].dma_func(dma_isr_redir[6].dma_param, flags); - - CH_IRQ_EPILOGUE(); -} - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA helper initialization. - * - * @init - */ -void dmaInit(void) { - int i; - - dma_streams_mask = 0; - for (i = 0; i < STM32_DMA_STREAMS; i++) { - _stm32_dma_streams[i].channel->CCR = 0; - dma_isr_redir[i].dma_func = NULL; - } - DMA1->IFCR = 0xFFFFFFFF; -} - -/** - * @brief Allocates a DMA stream. - * @details The stream is allocated and, if required, the DMA clock enabled. - * The function also enables the IRQ vector associated to the stream - * and initializes its priority. - * @pre The stream must not be already in use or an error is returned. - * @post The stream is allocated and the default ISR handler redirected - * to the specified function. - * @post The stream ISR vector is enabled and its priority configured. - * @post The stream must be freed using @p dmaStreamRelease() before it can - * be reused with another peripheral. - * @post The stream is in its post-reset state. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] priority IRQ priority mask for the DMA stream - * @param[in] func handling function pointer, can be @p NULL - * @param[in] param a parameter to be passed to the handling function - * @return The operation status. - * @retval FALSE no error, stream taken. - * @retval TRUE error, stream already taken. - * - * @special - */ -bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param) { - - chDbgCheck(dmastp != NULL, "dmaAllocate"); - - /* Checks if the stream is already taken.*/ - if ((dma_streams_mask & (1 << dmastp->selfindex)) != 0) - return TRUE; - - /* Marks the stream as allocated.*/ - dma_isr_redir[dmastp->selfindex].dma_func = func; - dma_isr_redir[dmastp->selfindex].dma_param = param; - dma_streams_mask |= (1 << dmastp->selfindex); - - /* Enabling DMA clocks required by the current streams set.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) != 0) - rccEnableDMA1(FALSE); - - /* Putting the stream in a safe state.*/ - dmaStreamDisable(dmastp); - dmastp->channel->CCR = STM32_DMA_CCR_RESET_VALUE; - - /* Enables the associated IRQ vector if a callback is defined.*/ - if (func != NULL) - nvicEnableVector(dmastp->vector, CORTEX_PRIORITY_MASK(priority)); - - return FALSE; -} - -/** - * @brief Releases a DMA stream. - * @details The stream is freed and, if required, the DMA clock disabled. - * Trying to release a unallocated stream is an illegal operation - * and is trapped if assertions are enabled. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post The stream is again available. - * @note This function can be invoked in both ISR or thread context. - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -void dmaStreamRelease(const stm32_dma_stream_t *dmastp) { - - chDbgCheck(dmastp != NULL, "dmaRelease"); - - /* Check if the streams is not taken.*/ - chDbgAssert((dma_streams_mask & (1 << dmastp->selfindex)) != 0, - "dmaRelease(), #1", "not allocated"); - - /* Disables the associated IRQ vector.*/ - nvicDisableVector(dmastp->vector); - - /* Marks the stream as not allocated.*/ - dma_streams_mask &= ~(1 << dmastp->selfindex); - - /* Shutting down clocks that are no more required, if any.*/ - if ((dma_streams_mask & STM32_DMA1_STREAMS_MASK) == 0) - rccDisableDMA1(FALSE); -} - -#endif /* STM32_DMA_REQUIRED */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/stm32_dma.h b/os/hal/platforms/STM32L1xx/stm32_dma.h deleted file mode 100644 index 71af4a339a..0000000000 --- a/os/hal/platforms/STM32L1xx/stm32_dma.h +++ /dev/null @@ -1,397 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/stm32_dma.h - * @brief DMA helper driver header. - * @note This file requires definitions from the ST header file stm32l1xx.h. - * @note This driver uses the new naming convention used for the STM32F2xx - * so the "DMA channels" are referred as "DMA streams". - * - * @addtogroup STM32L1xx_DMA - * @{ - */ - -#ifndef _STM32_DMA_H_ -#define _STM32_DMA_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Total number of DMA streams. - * @note This is the total number of streams among all the DMA units. - */ -#define STM32_DMA_STREAMS 7 - -/** - * @brief Mask of the ISR bits passed to the DMA callback functions. - */ -#define STM32_DMA_ISR_MASK 0x0F - -/** - * @brief Returns the channel associated to the specified stream. - * - * @param[in] n the stream number (0...STM32_DMA_STREAMS-1) - * @param[in] c a stream/channel association word, one channel per - * nibble, not associated channels must be set to 0xF - * @return Always zero, in this platform there is no dynamic - * association between streams and channels. - */ -#define STM32_DMA_GETCHANNEL(n, c) 0 - -/** - * @brief Checks if a DMA priority is within the valid range. - * @param[in] prio DMA priority - * - * @retval The check result. - * @retval FALSE invalid DMA priority. - * @retval TRUE correct DMA priority. - */ -#define STM32_DMA_IS_VALID_PRIORITY(prio) (((prio) >= 0) && ((prio) <= 3)) - -/** - * @brief Returns an unique numeric identifier for a DMA stream. - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return An unique numeric stream identifier. - */ -#define STM32_DMA_STREAM_ID(dma, stream) ((stream) - 1) - -/** - * @brief Returns a DMA stream identifier mask. - * - * - * @param[in] dma the DMA unit number - * @param[in] stream the stream number - * @return A DMA stream identifier mask. - */ -#define STM32_DMA_STREAM_ID_MSK(dma, stream) \ - (1 << STM32_DMA_STREAM_ID(dma, stream)) - -/** - * @brief Checks if a DMA stream unique identifier belongs to a mask. - * @param[in] id the stream numeric identifier - * @param[in] mask the stream numeric identifiers mask - * - * @retval The check result. - * @retval FALSE id does not belong to the mask. - * @retval TRUE id belongs to the mask. - */ -#define STM32_DMA_IS_VALID_ID(id, mask) (((1 << (id)) & (mask))) - -/** - * @name DMA streams identifiers - * @{ - */ -/** - * @brief Returns a pointer to a stm32_dma_stream_t structure. - * - * @param[in] id the stream numeric identifier - * @return A pointer to the stm32_dma_stream_t constant structure - * associated to the DMA stream. - */ -#define STM32_DMA_STREAM(id) (&_stm32_dma_streams[id]) - -#define STM32_DMA1_STREAM1 STM32_DMA_STREAM(0) -#define STM32_DMA1_STREAM2 STM32_DMA_STREAM(1) -#define STM32_DMA1_STREAM3 STM32_DMA_STREAM(2) -#define STM32_DMA1_STREAM4 STM32_DMA_STREAM(3) -#define STM32_DMA1_STREAM5 STM32_DMA_STREAM(4) -#define STM32_DMA1_STREAM6 STM32_DMA_STREAM(5) -#define STM32_DMA1_STREAM7 STM32_DMA_STREAM(6) -/** @} */ - -/** - * @name CR register constants common to all DMA types - * @{ - */ -#define STM32_DMA_CR_EN DMA_CCR1_EN -#define STM32_DMA_CR_TEIE DMA_CCR1_TEIE -#define STM32_DMA_CR_HTIE DMA_CCR1_HTIE -#define STM32_DMA_CR_TCIE DMA_CCR1_TCIE -#define STM32_DMA_CR_DIR_MASK (DMA_CCR1_DIR | DMA_CCR1_MEM2MEM) -#define STM32_DMA_CR_DIR_P2M 0 -#define STM32_DMA_CR_DIR_M2P DMA_CCR1_DIR -#define STM32_DMA_CR_DIR_M2M DMA_CCR1_MEM2MEM -#define STM32_DMA_CR_CIRC DMA_CCR1_CIRC -#define STM32_DMA_CR_PINC DMA_CCR1_PINC -#define STM32_DMA_CR_MINC DMA_CCR1_MINC -#define STM32_DMA_CR_PSIZE_MASK DMA_CCR1_PSIZE -#define STM32_DMA_CR_PSIZE_BYTE 0 -#define STM32_DMA_CR_PSIZE_HWORD DMA_CCR1_PSIZE_0 -#define STM32_DMA_CR_PSIZE_WORD DMA_CCR1_PSIZE_1 -#define STM32_DMA_CR_MSIZE_MASK DMA_CCR1_MSIZE -#define STM32_DMA_CR_MSIZE_BYTE 0 -#define STM32_DMA_CR_MSIZE_HWORD DMA_CCR1_MSIZE_0 -#define STM32_DMA_CR_MSIZE_WORD DMA_CCR1_MSIZE_1 -#define STM32_DMA_CR_SIZE_MASK (STM32_DMA_CR_MSIZE_MASK | \ - STM32_DMA_CR_MSIZE_MASK) -#define STM32_DMA_CR_PL_MASK DMA_CCR1_PL -#define STM32_DMA_CR_PL(n) ((n) << 12) -/** @} */ - -/** - * @name CR register constants only found in enhanced DMA - * @{ - */ -#define STM32_DMA_CR_DMEIE 0 /**< @brief Ignored by normal DMA. */ -#define STM32_DMA_CR_CHSEL_MASK 0 /**< @brief Ignored by normal DMA. */ -#define STM32_DMA_CR_CHSEL(n) 0 /**< @brief Ignored by normal DMA. */ -/** @} */ - -/** - * @name Status flags passed to the ISR callbacks - * @{ - */ -#define STM32_DMA_ISR_FEIF 0 -#define STM32_DMA_ISR_DMEIF 0 -#define STM32_DMA_ISR_TEIF DMA_ISR_TEIF1 -#define STM32_DMA_ISR_HTIF DMA_ISR_HTIF1 -#define STM32_DMA_ISR_TCIF DMA_ISR_TCIF1 -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief STM32 DMA stream descriptor structure. - */ -typedef struct { - DMA_Channel_TypeDef *channel; /**< @brief Associated DMA channel. */ - volatile uint32_t *ifcr; /**< @brief Associated IFCR reg. */ - uint8_t ishift; /**< @brief Bits offset in xIFCR - register. */ - uint8_t selfindex; /**< @brief Index to self in array. */ - uint8_t vector; /**< @brief Associated IRQ vector. */ -} stm32_dma_stream_t; - -/** - * @brief STM32 DMA ISR function type. - * - * @param[in] p parameter for the registered function - * @param[in] flags pre-shifted content of the ISR register, the bits - * are aligned to bit zero - */ -typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags); - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Macro Functions - * @{ - */ -/** - * @brief Associates a peripheral data register to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the CPAR register - * - * @special - */ -#define dmaStreamSetPeripheral(dmastp, addr) { \ - (dmastp)->channel->CPAR = (uint32_t)(addr); \ -} - -/** - * @brief Associates a memory destination to a DMA stream. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] addr value to be written in the CMAR register - * - * @special - */ -#define dmaStreamSetMemory0(dmastp, addr) { \ - (dmastp)->channel->CMAR = (uint32_t)(addr); \ -} - -/** - * @brief Sets the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] size value to be written in the CNDTR register - * - * @special - */ -#define dmaStreamSetTransactionSize(dmastp, size) { \ - (dmastp)->channel->CNDTR = (uint32_t)(size); \ -} - -/** - * @brief Returns the number of transfers to be performed. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @return The number of transfers to be performed. - * - * @special - */ -#define dmaStreamGetTransactionSize(dmastp) ((size_t)((dmastp)->channel->CNDTR)) - -/** - * @brief Programs the stream mode settings. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register - * - * @special - */ -#define dmaStreamSetMode(dmastp, mode) { \ - (dmastp)->channel->CCR = (uint32_t)(mode); \ -} - -/** - * @brief DMA stream enable. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamEnable(dmastp) { \ - (dmastp)->channel->CCR |= STM32_DMA_CR_EN; \ -} - -/** - * @brief DMA stream disable. - * @details The function disables the specified stream and then clears any - * pending interrupt. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamDisable(dmastp) { \ - (dmastp)->channel->CCR &= ~STM32_DMA_CR_EN; \ - dmaStreamClearInterrupt(dmastp); \ -} - -/** - * @brief DMA stream interrupt sources clear. - * @note This function can be invoked in both ISR or thread context. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * - * @special - */ -#define dmaStreamClearInterrupt(dmastp) { \ - *(dmastp)->ifcr = STM32_DMA_ISR_MASK << (dmastp)->ishift; \ -} - -/** - * @brief Starts a memory to memory operation using the specified stream. - * @note The default transfer data mode is "byte to byte" but it can be - * changed by specifying extra options in the @p mode parameter. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - * @param[in] mode value to be written in the CCR register, this value - * is implicitly ORed with: - * - @p STM32_DMA_CR_MINC - * - @p STM32_DMA_CR_PINC - * - @p STM32_DMA_CR_DIR_M2M - * - @p STM32_DMA_CR_EN - * . - * @param[in] src source address - * @param[in] dst destination address - * @param[in] n number of data units to copy - */ -#define dmaStartMemCopy(dmastp, mode, src, dst, n) { \ - dmaStreamSetPeripheral(dmastp, src); \ - dmaStreamSetMemory0(dmastp, dst); \ - dmaStreamSetTransactionSize(dmastp, n); \ - dmaStreamSetMode(dmastp, (mode) | \ - STM32_DMA_CR_MINC | STM32_DMA_CR_PINC | \ - STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN); \ -} - -/** - * @brief Polled wait for DMA transfer end. - * @pre The stream must have been allocated using @p dmaStreamAllocate(). - * @post After use the stream can be released using @p dmaStreamRelease(). - * - * @param[in] dmastp pointer to a stm32_dma_stream_t structure - */ -#define dmaWaitCompletion(dmastp) { \ - while ((dmastp)->channel->CNDTR > 0) \ - ; \ - dmaStreamDisable(dmastp); \ -} -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) -extern const stm32_dma_stream_t _stm32_dma_streams[STM32_DMA_STREAMS]; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void dmaInit(void); - bool_t dmaStreamAllocate(const stm32_dma_stream_t *dmastp, - uint32_t priority, - stm32_dmaisr_t func, - void *param); - void dmaStreamRelease(const stm32_dma_stream_t *dmastp); -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_DMA_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/stm32_isr.h b/os/hal/platforms/STM32L1xx/stm32_isr.h deleted file mode 100644 index bbb45141f4..0000000000 --- a/os/hal/platforms/STM32L1xx/stm32_isr.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/stm32_isr.h - * @brief ISR remapper driver header. - * - * @addtogroup STM32L1xx_ISR - * @{ - */ - -#ifndef _STM32_ISR_H_ -#define _STM32_ISR_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @name ISR names and numbers remapping - * @{ - */ -/* - * TIM units. - */ -#define STM32_TIM2_HANDLER TIM2_IRQHandler -#define STM32_TIM3_HANDLER TIM3_IRQHandler -#define STM32_TIM4_HANDLER TIM4_IRQHandler - -#define STM32_TIM2_NUMBER TIM2_IRQn -#define STM32_TIM3_NUMBER TIM3_IRQn -#define STM32_TIM4_NUMBER TIM4_IRQn - -/* - * USART units. - */ -#define STM32_USART1_HANDLER USART1_IRQHandler -#define STM32_USART2_HANDLER USART2_IRQHandler -#define STM32_USART3_HANDLER USART3_IRQHandler - -#define STM32_USART1_NUMBER USART1_IRQn -#define STM32_USART2_NUMBER USART2_IRQn -#define STM32_USART3_NUMBER USART3_IRQn - -/* - * USB units. - */ -#define STM32_USB1_HP_HANDLER Vector8C -#define STM32_USB1_LP_HANDLER Vector90 - -#define STM32_USB1_HP_NUMBER USB_HP_IRQn -#define STM32_USB1_LP_NUMBER USB_LP_IRQn -/** @} */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#endif /* _STM32_ISR_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/stm32_rcc.h b/os/hal/platforms/STM32L1xx/stm32_rcc.h deleted file mode 100644 index 9d9c1cb9c4..0000000000 --- a/os/hal/platforms/STM32L1xx/stm32_rcc.h +++ /dev/null @@ -1,584 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM32L1xx/stm32_rcc.h - * @brief RCC helper driver header. - * @note This file requires definitions from the ST header file - * @p stm32l1xx.h. - * - * @addtogroup STM32L1xx_RCC - * @{ - */ - -#ifndef _STM32_RCC_ -#define _STM32_RCC_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @name Generic RCC operations - * @{ - */ -/** - * @brief Enables the clock of one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB1(mask, lp) { \ - RCC->APB1ENR |= (mask); \ - if (lp) \ - RCC->APB1LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB1(mask, lp) { \ - RCC->APB1ENR &= ~(mask); \ - if (lp) \ - RCC->APB1LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB1 bus. - * - * @param[in] mask APB1 peripherals mask - * - * @api - */ -#define rccResetAPB1(mask) { \ - RCC->APB1RSTR |= (mask); \ - RCC->APB1RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAPB2(mask, lp) { \ - RCC->APB2ENR |= (mask); \ - if (lp) \ - RCC->APB2LPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAPB2(mask, lp) { \ - RCC->APB2ENR &= ~(mask); \ - if (lp) \ - RCC->APB2LPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the APB2 bus. - * - * @param[in] mask APB2 peripherals mask - * - * @api - */ -#define rccResetAPB2(mask) { \ - RCC->APB2RSTR |= (mask); \ - RCC->APB2RSTR = 0; \ -} - -/** - * @brief Enables the clock of one or more peripheral on the AHB bus. - * - * @param[in] mask AHB peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableAHB(mask, lp) { \ - RCC->AHBENR |= (mask); \ - if (lp) \ - RCC->AHBLPENR |= (mask); \ -} - -/** - * @brief Disables the clock of one or more peripheral on the AHB bus. - * - * @param[in] mask AHB peripherals mask - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableAHB(mask, lp) { \ - RCC->AHBENR &= ~(mask); \ - if (lp) \ - RCC->AHBLPENR &= ~(mask); \ -} - -/** - * @brief Resets one or more peripheral on the AHB bus. - * - * @param[in] mask AHB peripherals mask - * - * @api - */ -#define rccResetAHB(mask) { \ - RCC->AHBRSTR |= (mask); \ - RCC->AHBRSTR = 0; \ -} -/** @} */ - -/** - * @name ADC peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the ADC1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableADC1(lp) rccEnableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Disables the ADC1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableADC1(lp) rccDisableAPB2(RCC_APB2ENR_ADC1EN, lp) - -/** - * @brief Resets the ADC1 peripheral. - * - * @api - */ -#define rccResetADC1() rccResetAPB2(RCC_APB2RSTR_ADC1RST) -/** @} */ - -/** - * @name DMA peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the DMA1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableDMA1(lp) rccEnableAHB(RCC_AHBENR_DMA1EN, lp) - -/** - * @brief Disables the DMA1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableDMA1(lp) rccDisableAHB(RCC_AHBENR_DMA1EN, lp) - -/** - * @brief Resets the DMA1 peripheral. - * - * @api - */ -#define rccResetDMA1() rccResetAHB(RCC_AHBRSTR_DMA1RST) -/** @} */ - -/** - * @name PWR interface specific RCC operations - * @{ - */ -/** - * @brief Enables the PWR interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnablePWRInterface(lp) rccEnableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Disables PWR interface clock. - * @note The @p lp parameter is ignored in this family. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisablePWRInterface(lp) rccDisableAPB1(RCC_APB1ENR_PWREN, lp) - -/** - * @brief Resets the PWR interface. - * - * @api - */ -#define rccResetPWRInterface() rccResetAPB1(RCC_APB1RSTR_PWRRST) -/** @} */ - -/** - * @name I2C peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the I2C1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C1(lp) rccEnableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Disables the I2C1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C1(lp) rccDisableAPB1(RCC_APB1ENR_I2C1EN, lp) - -/** - * @brief Resets the I2C1 peripheral. - * - * @api - */ -#define rccResetI2C1() rccResetAPB1(RCC_APB1RSTR_I2C1RST) - -/** - * @brief Enables the I2C2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableI2C2(lp) rccEnableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Disables the I2C2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableI2C2(lp) rccDisableAPB1(RCC_APB1ENR_I2C2EN, lp) - -/** - * @brief Resets the I2C2 peripheral. - * - * @api - */ -#define rccResetI2C2() rccResetAPB1(RCC_APB1RSTR_I2C2RST) -/** @} */ - -/** - * @name SPI peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the SPI1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI1(lp) rccEnableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Disables the SPI1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI1(lp) rccDisableAPB2(RCC_APB2ENR_SPI1EN, lp) - -/** - * @brief Resets the SPI1 peripheral. - * - * @api - */ -#define rccResetSPI1() rccResetAPB2(RCC_APB2RSTR_SPI1RST) - -/** - * @brief Enables the SPI2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableSPI2(lp) rccEnableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Disables the SPI2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableSPI2(lp) rccDisableAPB1(RCC_APB1ENR_SPI2EN, lp) - -/** - * @brief Resets the SPI2 peripheral. - * - * @api - */ -#define rccResetSPI2() rccResetAPB1(RCC_APB1RSTR_SPI2RST) -/** @} */ - -/** - * @name TIM peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the TIM2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM2(lp) rccEnableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Disables the TIM2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM2(lp) rccDisableAPB1(RCC_APB1ENR_TIM2EN, lp) - -/** - * @brief Resets the TIM2 peripheral. - * - * @api - */ -#define rccResetTIM2() rccResetAPB1(RCC_APB1RSTR_TIM2RST) - -/** - * @brief Enables the TIM3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM3(lp) rccEnableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Disables the TIM3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM3(lp) rccDisableAPB1(RCC_APB1ENR_TIM3EN, lp) - -/** - * @brief Resets the TIM3 peripheral. - * - * @api - */ -#define rccResetTIM3() rccResetAPB1(RCC_APB1RSTR_TIM3RST) - -/** - * @brief Enables the TIM4 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableTIM4(lp) rccEnableAPB1(RCC_APB1ENR_TIM4EN, lp) - -/** - * @brief Disables the TIM4 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableTIM4(lp) rccDisableAPB1(RCC_APB1ENR_TIM4EN, lp) - -/** - * @brief Resets the TIM4 peripheral. - * - * @api - */ -#define rccResetTIM4() rccResetAPB1(RCC_APB1RSTR_TIM4RST) -/** @} */ - -/** - * @name USART/UART peripherals specific RCC operations - * @{ - */ -/** - * @brief Enables the USART1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART1(lp) rccEnableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Disables the USART1 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART1(lp) rccDisableAPB2(RCC_APB2ENR_USART1EN, lp) - -/** - * @brief Resets the USART1 peripheral. - * - * @api - */ -#define rccResetUSART1() rccResetAPB2(RCC_APB2RSTR_USART1RST) - -/** - * @brief Enables the USART2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART2(lp) rccEnableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Disables the USART2 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART2(lp) rccDisableAPB1(RCC_APB1ENR_USART2EN, lp) - -/** - * @brief Resets the USART2 peripheral. - * - * @api - */ -#define rccResetUSART2() rccResetAPB1(RCC_APB1RSTR_USART2RST) - -/** - * @brief Enables the USART3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSART3(lp) rccEnableAPB1(RCC_APB1ENR_USART3EN, lp) - -/** - * @brief Disables the USART3 peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSART3(lp) rccDisableAPB1(RCC_APB1ENR_USART3EN, lp) - -/** - * @brief Resets the USART3 peripheral. - * - * @api - */ -#define rccResetUSART3() rccResetAPB1(RCC_APB1RSTR_USART3RST) -/** @} */ - -/** - * @name USB peripheral specific RCC operations - * @{ - */ -/** - * @brief Enables the USB peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccEnableUSB(lp) rccEnableAPB1(RCC_APB1ENR_USBEN, lp) - -/** - * @brief Disables the USB peripheral clock. - * - * @param[in] lp low power enable flag - * - * @api - */ -#define rccDisableUSB(lp) rccDisableAPB1(RCC_APB1ENR_USBEN, lp) - -/** - * @brief Resets the USB peripheral. - * - * @api - */ -#define rccResetUSB() rccResetAPB1(RCC_APB1RSTR_USBRST) -/** @} */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _STM32_RCC_ */ - -/** @} */ diff --git a/os/hal/platforms/STM32L1xx/stm32l1xx.h b/os/hal/platforms/STM32L1xx/stm32l1xx.h deleted file mode 100644 index 0870e768e5..0000000000 --- a/os/hal/platforms/STM32L1xx/stm32l1xx.h +++ /dev/null @@ -1,5141 +0,0 @@ -/** - ****************************************************************************** - * @file stm32l1xx.h - * @author MCD Application Team - * @version V1.0.0 - * @date 31-December-2010 - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32L1xx devices. - ****************************************************************************** - * @attention - * - * 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. - * - *

    © COPYRIGHT 2010 STMicroelectronics

    - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32l1xx - * @{ - */ - -#ifndef __STM32L1XX_H -#define __STM32L1XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32L device used in your - application - */ - -#if !defined (STM32L1XX_MD) - #define STM32L1XX_MD /*!< STM32L1XX_MD: STM32L Ultra Low Power Medium-density devices */ -#endif -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - - - Ultra Low Power Medium-density devices are STM32L151xx and STM32L152xx - microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes. - - */ - -#if !defined (STM32L1XX_MD) - #error "Please select first the target STM32L1xx device used in your application (in stm32l1xx.h file)" -#endif - -#if !defined USE_STDPERIPH_DRIVER -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ - -/** - * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup - Timeout value - */ -#define HSI_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSI start up */ - -#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal High Speed oscillator in Hz. - The real value may vary depending on the variations - in voltage and temperature. */ -#define LSI_VALUE ((uint32_t)37000) /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -#define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ - -/** - * @brief STM32L1xx Standard Peripheral Library version number - */ -#define __STM32L1XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32L1XX_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32L1XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32L1XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32L1XX_STDPERIPH_VERSION ( (__STM32L1XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32L1XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32L1XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32L1XX_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief STM32L1xx Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -#define __MPU_PRESENT 1 /*!< STM32L provides MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/*!< Interrupt Number Definition */ -typedef enum IRQn -{ -/****** Cortex-M3 Processor Exceptions Numbers ******************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ - -/****** STM32L specific Interrupt Numbers ***********************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMPER_STAMP_IRQn = 2, /*!< Tamper and Time Stamp through EXTI Line Interrupts */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup Timer through EXTI Line Interrupt */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ - DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ - DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ - DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ - DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ - DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ - DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ - ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ - USB_HP_IRQn = 19, /*!< USB High Priority Interrupt */ - USB_LP_IRQn = 20, /*!< USB Low Priority Interrupt */ - DAC_IRQn = 21, /*!< DAC Interrupt */ - COMP_IRQn = 22, /*!< Comparator through EXTI Line Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - LCD_IRQn = 24, /*!< LCD Interrupt */ - TIM9_IRQn = 25, /*!< TIM9 global Interrupt */ - TIM10_IRQn = 26, /*!< TIM10 global Interrupt */ - TIM11_IRQn = 27, /*!< TIM11 global Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - USB_FS_WKUP_IRQn = 42, /*!< USB FS WakeUp from suspend through EXTI Line Interrupt */ - TIM6_IRQn = 43, /*!< TIM6 global Interrupt */ - TIM7_IRQn = 44 /*!< TIM7 global Interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -/* CHIBIOS FIX */ -/*#include "system_stm32l1xx.h"*/ -#include - -/** @addtogroup Exported_types - * @{ - */ - -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; - -/** - * @brief __RAM_FUNC definition - */ -#if defined ( __CC_ARM ) -/* ARM Compiler - ------------ - RAM functions are defined using the toolchain options. - Functions that are executed in RAM should reside in a separate source - module. Using the 'Options for File' dialog you can simply change the - 'Code / Const' area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the - 'Options for Target' dialog. -*/ - #define __RAM_FUNC FLASH_Status - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- - RAM functions are defined using a specific toolchain keyword "__ramfunc". -*/ - #define __RAM_FUNC __ramfunc FLASH_Status - -#elif defined ( __GNUC__ ) -/* GNU Compiler - ------------ - RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".data")))". -*/ - #define __RAM_FUNC FLASH_Status __attribute__((section(".data"))) - -#elif defined ( __TASKING__ ) -/* TASKING Compiler - ---------------- - RAM functions are defined using a specific toolchain pragma. This pragma is - defined in the stm32l1xx_flash_ramfunc.c -*/ - #define __RAM_FUNC FLASH_Status - -#endif - -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; - __IO uint32_t CR1; - __IO uint32_t CR2; - __IO uint32_t SMPR1; - __IO uint32_t SMPR2; - __IO uint32_t SMPR3; - __IO uint32_t JOFR1; - __IO uint32_t JOFR2; - __IO uint32_t JOFR3; - __IO uint32_t JOFR4; - __IO uint32_t HTR; - __IO uint32_t LTR; - __IO uint32_t SQR1; - __IO uint32_t SQR2; - __IO uint32_t SQR3; - __IO uint32_t SQR4; - __IO uint32_t SQR5; - __IO uint32_t JSQR; - __IO uint32_t JDR1; - __IO uint32_t JDR2; - __IO uint32_t JDR3; - __IO uint32_t JDR4; - __IO uint32_t DR; -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; - __IO uint32_t CCR; -} ADC_Common_TypeDef; - - -/** - * @brief Comparator - */ - -typedef struct -{ - __IO uint32_t CSR; -} COMP_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; - __IO uint8_t IDR; - uint8_t RESERVED0; - uint16_t RESERVED1; - __IO uint32_t CR; -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t SWTRIGR; - __IO uint32_t DHR12R1; - __IO uint32_t DHR12L1; - __IO uint32_t DHR8R1; - __IO uint32_t DHR12R2; - __IO uint32_t DHR12L2; - __IO uint32_t DHR8R2; - __IO uint32_t DHR12RD; - __IO uint32_t DHR12LD; - __IO uint32_t DHR8RD; - __IO uint32_t DOR1; - __IO uint32_t DOR2; - __IO uint32_t SR; -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; - __IO uint32_t CR; - __IO uint32_t APB1FZ; - __IO uint32_t APB2FZ; -}DBGMCU_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CCR; - __IO uint32_t CNDTR; - __IO uint32_t CPAR; - __IO uint32_t CMAR; -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t ISR; - __IO uint32_t IFCR; -} DMA_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; - __IO uint32_t EMR; - __IO uint32_t RTSR; - __IO uint32_t FTSR; - __IO uint32_t SWIER; - __IO uint32_t PR; -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; - __IO uint32_t PECR; - __IO uint32_t PDKEYR; - __IO uint32_t PEKEYR; - __IO uint32_t PRGKEYR; - __IO uint32_t OPTKEYR; - __IO uint32_t SR; - __IO uint32_t OBR; - __IO uint32_t WRPR; -} FLASH_TypeDef; - -/** - * @brief Option Bytes Registers - */ - -typedef struct -{ - __IO uint32_t RDP; - __IO uint32_t USER; - __IO uint32_t WRP01; - __IO uint32_t WRP23; -} OB_TypeDef; - -/** - * @brief General Purpose IO - */ -/* CHIBIOS FIX */ -#if 0 -typedef struct -{ - __IO uint32_t MODER; - __IO uint16_t OTYPER; - uint16_t RESERVED0; - __IO uint32_t OSPEEDR; - __IO uint32_t PUPDR; - __IO uint16_t IDR; - uint16_t RESERVED1; - __IO uint16_t ODR; - uint16_t RESERVED2; - __IO uint16_t BSRRL; /* BSRR register is split to 2 * 16-bit fields BSRRL */ - __IO uint16_t BSRRH; /* BSRR register is split to 2 * 16-bit fields BSRRH */ - __IO uint32_t LCKR; - __IO uint32_t AFR[2]; -} GPIO_TypeDef; -#endif - -/** - * @brief SysTem Configuration - */ - -typedef struct -{ - __IO uint32_t MEMRMP; - __IO uint32_t PMC; - __IO uint32_t EXTICR[4]; -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t OAR1; - uint16_t RESERVED2; - __IO uint16_t OAR2; - uint16_t RESERVED3; - __IO uint16_t DR; - uint16_t RESERVED4; - __IO uint16_t SR1; - uint16_t RESERVED5; - __IO uint16_t SR2; - uint16_t RESERVED6; - __IO uint16_t CCR; - uint16_t RESERVED7; - __IO uint16_t TRISE; - uint16_t RESERVED8; -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; - __IO uint32_t PR; - __IO uint32_t RLR; - __IO uint32_t SR; -} IWDG_TypeDef; - - -/** - * @brief LCD - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t FCR; - __IO uint32_t SR; - __IO uint32_t CLR; - uint32_t RESERVED; - __IO uint32_t RAM[16]; -} LCD_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CSR; -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t ICSCR; - __IO uint32_t CFGR; - __IO uint32_t CIR; - __IO uint32_t AHBRSTR; - __IO uint32_t APB2RSTR; - __IO uint32_t APB1RSTR; - __IO uint32_t AHBENR; - __IO uint32_t APB2ENR; - __IO uint32_t APB1ENR; - __IO uint32_t AHBLPENR; - __IO uint32_t APB2LPENR; - __IO uint32_t APB1LPENR; - __IO uint32_t CSR; -} RCC_TypeDef; - -/** - * @brief Routing Interface - */ - -typedef struct -{ - __IO uint32_t ICR; - __IO uint32_t ASCR1; - __IO uint32_t ASCR2; - __IO uint32_t HYSCR1; - __IO uint32_t HYSCR2; - __IO uint32_t HYSCR3; -} RI_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; - __IO uint32_t DR; - __IO uint32_t CR; - __IO uint32_t ISR; - __IO uint32_t PRER; - __IO uint32_t WUTR; - __IO uint32_t CALIBR; - __IO uint32_t ALRMAR; - __IO uint32_t ALRMBR; - __IO uint32_t WPR; - uint32_t RESERVED1; - uint32_t RESERVED2; - __IO uint32_t TSTR; - __IO uint32_t TSDR; - uint32_t RESERVED3; - uint32_t RESERVED4; - __IO uint32_t TAFCR; - uint32_t RESERVED5; - uint32_t RESERVED6; - uint32_t RESERVED7; - __IO uint32_t BKP0R; - __IO uint32_t BKP1R; - __IO uint32_t BKP2R; - __IO uint32_t BKP3R; - __IO uint32_t BKP4R; - __IO uint32_t BKP5R; - __IO uint32_t BKP6R; - __IO uint32_t BKP7R; - __IO uint32_t BKP8R; - __IO uint32_t BKP9R; - __IO uint32_t BKP10R; - __IO uint32_t BKP11R; - __IO uint32_t BKP12R; - __IO uint32_t BKP13R; - __IO uint32_t BKP14R; - __IO uint32_t BKP15R; - __IO uint32_t BKP16R; - __IO uint32_t BKP17R; - __IO uint32_t BKP18R; - __IO uint32_t BKP19R; -} RTC_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t SR; - uint16_t RESERVED2; - __IO uint16_t DR; - uint16_t RESERVED3; - __IO uint16_t CRCPR; - uint16_t RESERVED4; - __IO uint16_t RXCRCR; - uint16_t RESERVED5; - __IO uint16_t TXCRCR; - uint16_t RESERVED6; -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t SMCR; - uint16_t RESERVED2; - __IO uint16_t DIER; - uint16_t RESERVED3; - __IO uint16_t SR; - uint16_t RESERVED4; - __IO uint16_t EGR; - uint16_t RESERVED5; - __IO uint16_t CCMR1; - uint16_t RESERVED6; - __IO uint16_t CCMR2; - uint16_t RESERVED7; - __IO uint16_t CCER; - uint16_t RESERVED8; - __IO uint16_t CNT; - uint16_t RESERVED9; - __IO uint16_t PSC; - uint16_t RESERVED10; - __IO uint16_t ARR; - uint16_t RESERVED11; - uint32_t RESERVED12; - __IO uint16_t CCR1; - uint16_t RESERVED13; - __IO uint16_t CCR2; - uint16_t RESERVED14; - __IO uint16_t CCR3; - uint16_t RESERVED15; - __IO uint16_t CCR4; - uint16_t RESERVED16; - uint32_t RESERVED17; - __IO uint16_t DCR; - uint16_t RESERVED18; - __IO uint16_t DMAR; - uint16_t RESERVED19; - __IO uint16_t OR; - uint16_t RESERVED20; -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint16_t SR; - uint16_t RESERVED0; - __IO uint16_t DR; - uint16_t RESERVED1; - __IO uint16_t BRR; - uint16_t RESERVED2; - __IO uint16_t CR1; - uint16_t RESERVED3; - __IO uint16_t CR2; - uint16_t RESERVED4; - __IO uint16_t CR3; - uint16_t RESERVED5; - __IO uint16_t GTPR; - uint16_t RESERVED6; -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CFR; - __IO uint32_t SR; -} WWDG_TypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ - -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */ -#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ - -#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) -#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) - -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define LCD_BASE (APB1PERIPH_BASE + 0x2400) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) -#define COMP_BASE (APB1PERIPH_BASE + 0x7C00) -#define RI_BASE (APB1PERIPH_BASE + 0x7C04) - -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x0000) -#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) -#define TIM9_BASE (APB2PERIPH_BASE + 0x0800) -#define TIM10_BASE (APB2PERIPH_BASE + 0x0C00) -#define TIM11_BASE (APB2PERIPH_BASE + 0x1000) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) -#define ADC_BASE (APB2PERIPH_BASE + 0x2700) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define USART1_BASE (APB2PERIPH_BASE + 0x3800) - -#define GPIOA_BASE (AHBPERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHBPERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHBPERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHBPERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHBPERIPH_BASE + 0x1000) -#define GPIOH_BASE (AHBPERIPH_BASE + 0x1400) -#define CRC_BASE (AHBPERIPH_BASE + 0x3000) -#define RCC_BASE (AHBPERIPH_BASE + 0x3800) - - -#define FLASH_R_BASE (AHBPERIPH_BASE + 0x3C00) /*!< FLASH registers base address */ -#define OB_BASE ((uint32_t)0x1FF80000) /*!< FLASH Option Bytes base address */ - -#define DMA1_BASE (AHBPERIPH_BASE + 0x6000) -#define DMA1_Channel1_BASE (DMA1_BASE + 0x0008) -#define DMA1_Channel2_BASE (DMA1_BASE + 0x001C) -#define DMA1_Channel3_BASE (DMA1_BASE + 0x0030) -#define DMA1_Channel4_BASE (DMA1_BASE + 0x0044) -#define DMA1_Channel5_BASE (DMA1_BASE + 0x0058) -#define DMA1_Channel6_BASE (DMA1_BASE + 0x006C) -#define DMA1_Channel7_BASE (DMA1_BASE + 0x0080) - - -#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ - -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define LCD ((LCD_TypeDef *) LCD_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define COMP ((COMP_TypeDef *) COMP_BASE) -#define RI ((RI_TypeDef *) RI_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) - -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) -#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) -#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) -#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) -#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) -#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) -#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) - -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) - -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define OB ((OB_TypeDef *) OB_BASE) - -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers Bits Definition */ -/******************************************************************************/ -/******************************************************************************/ -/* */ -/* Analog to Digital Converter (ADC) */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint32_t)0x00000001) /*!< Analog watchdog flag */ -#define ADC_SR_EOC ((uint32_t)0x00000002) /*!< End of conversion */ -#define ADC_SR_JEOC ((uint32_t)0x00000004) /*!< Injected channel end of conversion */ -#define ADC_SR_JSTRT ((uint32_t)0x00000008) /*!< Injected channel Start flag */ -#define ADC_SR_STRT ((uint32_t)0x00000010) /*!< Regular channel Start flag */ -#define ADC_SR_OVR ((uint32_t)0x00000020) /*!< Overrun flag */ -#define ADC_SR_ADONS ((uint32_t)0x00000040) /*!< ADC ON status */ -#define ADC_SR_RCNR ((uint32_t)0x00000100) /*!< Regular channel not ready flag */ -#define ADC_SR_JCNR ((uint32_t)0x00000200) /*!< Injected channel not ready flag */ - -/******************* Bit definition for ADC_CR1 register ********************/ -#define ADC_CR1_AWDCH ((uint32_t)0x0000001F) /*!< AWDCH[4:0] bits (Analog watchdog channel select bits) */ -#define ADC_CR1_AWDCH_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_CR1_AWDCH_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_CR1_AWDCH_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_CR1_AWDCH_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_CR1_AWDCH_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_CR1_EOCIE ((uint32_t)0x00000020) /*!< Interrupt enable for EOC */ -#define ADC_CR1_AWDIE ((uint32_t)0x00000040) /*!< Analog Watchdog interrupt enable */ -#define ADC_CR1_JEOCIE ((uint32_t)0x00000080) /*!< Interrupt enable for injected channels */ -#define ADC_CR1_SCAN ((uint32_t)0x00000100) /*!< Scan mode */ -#define ADC_CR1_AWDSGL ((uint32_t)0x00000200) /*!< Enable the watchdog on a single channel in scan mode */ -#define ADC_CR1_JAUTO ((uint32_t)0x00000400) /*!< Automatic injected group conversion */ -#define ADC_CR1_DISCEN ((uint32_t)0x00000800) /*!< Discontinuous mode on regular channels */ -#define ADC_CR1_JDISCEN ((uint32_t)0x00001000) /*!< Discontinuous mode on injected channels */ - -#define ADC_CR1_DISCNUM ((uint32_t)0x0000E000) /*!< DISCNUM[2:0] bits (Discontinuous mode channel count) */ -#define ADC_CR1_DISCNUM_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define ADC_CR1_DISCNUM_1 ((uint32_t)0x00004000) /*!< Bit 1 */ -#define ADC_CR1_DISCNUM_2 ((uint32_t)0x00008000) /*!< Bit 2 */ - -#define ADC_CR1_PDD ((uint32_t)0x00010000) /*!< Power Down during Delay phase */ -#define ADC_CR1_PDI ((uint32_t)0x00020000) /*!< Power Down during Idle phase */ - -#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) /*!< Analog watchdog enable on injected channels */ -#define ADC_CR1_AWDEN ((uint32_t)0x00800000) /*!< Analog watchdog enable on regular channels */ - -#define ADC_CR1_RES ((uint32_t)0x03000000) /*!< RES[1:0] bits (Resolution) */ -#define ADC_CR1_RES_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define ADC_CR1_RES_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - -#define ADC_CR1_OVRIE ((uint32_t)0x04000000) /*!< Overrun interrupt enable */ - -/******************* Bit definition for ADC_CR2 register ********************/ -#define ADC_CR2_ADON ((uint32_t)0x00000001) /*!< A/D Converter ON / OFF */ -#define ADC_CR2_CONT ((uint32_t)0x00000002) /*!< Continuous Conversion */ - -#define ADC_CR2_DELS ((uint32_t)0x00000070) /*!< DELS[2:0] bits (Delay selection) */ -#define ADC_CR2_DELS_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define ADC_CR2_DELS_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define ADC_CR2_DELS_2 ((uint32_t)0x00000040) /*!< Bit 2 */ - -#define ADC_CR2_DMA ((uint32_t)0x00000100) /*!< Direct Memory access mode */ -#define ADC_CR2_DDS ((uint32_t)0x00000200) /*!< DMA disable selection (Single ADC) */ -#define ADC_CR2_EOCS ((uint32_t)0x00000400) /*!< End of conversion selection */ -#define ADC_CR2_ALIGN ((uint32_t)0x00000800) /*!< Data Alignment */ - -#define ADC_CR2_JEXTSEL ((uint32_t)0x000F0000) /*!< JEXTSEL[3:0] bits (External event select for injected group) */ -#define ADC_CR2_JEXTSEL_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define ADC_CR2_JEXTSEL_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define ADC_CR2_JEXTSEL_2 ((uint32_t)0x00040000) /*!< Bit 2 */ -#define ADC_CR2_JEXTSEL_3 ((uint32_t)0x00080000) /*!< Bit 3 */ - -#define ADC_CR2_JEXTEN ((uint32_t)0x00300000) /*!< JEXTEN[1:0] bits (External Trigger Conversion mode for injected channels) */ -#define ADC_CR2_JEXTEN_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_CR2_JEXTEN_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -#define ADC_CR2_JSWSTART ((uint32_t)0x00400000) /*!< Start Conversion of injected channels */ - -#define ADC_CR2_EXTSEL ((uint32_t)0x0F000000) /*!< EXTSEL[3:0] bits (External Event Select for regular group) */ -#define ADC_CR2_EXTSEL_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define ADC_CR2_EXTSEL_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define ADC_CR2_EXTSEL_2 ((uint32_t)0x04000000) /*!< Bit 2 */ -#define ADC_CR2_EXTSEL_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - -#define ADC_CR2_EXTEN ((uint32_t)0x30000000) /*!< EXTEN[1:0] bits (External Trigger Conversion mode for regular channels) */ -#define ADC_CR2_EXTEN_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define ADC_CR2_EXTEN_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -#define ADC_CR2_SWSTART ((uint32_t)0x40000000) /*!< Start Conversion of regular channels */ - -/****************** Bit definition for ADC_SMPR1 register *******************/ -#define ADC_SMPR1_SMP20 ((uint32_t)0x00000007) /*!< SMP20[2:0] bits (Channel 20 Sample time selection) */ -#define ADC_SMPR1_SMP20_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SMPR1_SMP20_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SMPR1_SMP20_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP21 ((uint32_t)0x00000038) /*!< SMP21[2:0] bits (Channel 21 Sample time selection) */ -#define ADC_SMPR1_SMP21_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define ADC_SMPR1_SMP21_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define ADC_SMPR1_SMP21_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP22 ((uint32_t)0x000001C0) /*!< SMP22[2:0] bits (Channel 22 Sample time selection) */ -#define ADC_SMPR1_SMP22_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define ADC_SMPR1_SMP22_1 ((uint32_t)0x00000080) /*!< Bit 1 */ -#define ADC_SMPR1_SMP22_2 ((uint32_t)0x00000100) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP23 ((uint32_t)0x00000E00) /*!< SMP23[2:0] bits (Channel 23 Sample time selection) */ -#define ADC_SMPR1_SMP23_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define ADC_SMPR1_SMP23_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define ADC_SMPR1_SMP23_2 ((uint32_t)0x00000800) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP24 ((uint32_t)0x00007000) /*!< SMP24[2:0] bits (Channel 24 Sample time selection) */ -#define ADC_SMPR1_SMP24_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define ADC_SMPR1_SMP24_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define ADC_SMPR1_SMP24_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - -#define ADC_SMPR1_SMP25 ((uint32_t)0x00038000) /*!< SMP25[2:0] bits (Channel 25 Sample time selection) */ -#define ADC_SMPR1_SMP25_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SMPR1_SMP25_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SMPR1_SMP25_2 ((uint32_t)0x00020000) /*!< Bit 2 */ - -/****************** Bit definition for ADC_SMPR2 register *******************/ -#define ADC_SMPR2_SMP10 ((uint32_t)0x00000007) /*!< SMP10[2:0] bits (Channel 10 Sample time selection) */ -#define ADC_SMPR2_SMP10_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SMPR2_SMP10_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SMPR2_SMP10_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP11 ((uint32_t)0x00000038) /*!< SMP11[2:0] bits (Channel 11 Sample time selection) */ -#define ADC_SMPR2_SMP11_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define ADC_SMPR2_SMP11_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define ADC_SMPR2_SMP11_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP12 ((uint32_t)0x000001C0) /*!< SMP12[2:0] bits (Channel 12 Sample time selection) */ -#define ADC_SMPR2_SMP12_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define ADC_SMPR2_SMP12_1 ((uint32_t)0x00000080) /*!< Bit 1 */ -#define ADC_SMPR2_SMP12_2 ((uint32_t)0x00000100) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP13 ((uint32_t)0x00000E00) /*!< SMP13[2:0] bits (Channel 13 Sample time selection) */ -#define ADC_SMPR2_SMP13_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define ADC_SMPR2_SMP13_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define ADC_SMPR2_SMP13_2 ((uint32_t)0x00000800) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP14 ((uint32_t)0x00007000) /*!< SMP14[2:0] bits (Channel 14 Sample time selection) */ -#define ADC_SMPR2_SMP14_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP14_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP14_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP15 ((uint32_t)0x00038000) /*!< SMP15[2:0] bits (Channel 5 Sample time selection) */ -#define ADC_SMPR2_SMP15_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP15_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP15_2 ((uint32_t)0x00020000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP16 ((uint32_t)0x001C0000) /*!< SMP16[2:0] bits (Channel 16 Sample time selection) */ -#define ADC_SMPR2_SMP16_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP16_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP16_2 ((uint32_t)0x00100000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP17 ((uint32_t)0x00E00000) /*!< SMP17[2:0] bits (Channel 17 Sample time selection) */ -#define ADC_SMPR2_SMP17_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP17_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP17_2 ((uint32_t)0x00800000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP18 ((uint32_t)0x07000000) /*!< SMP18[2:0] bits (Channel 18 Sample time selection) */ -#define ADC_SMPR2_SMP18_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP18_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP18_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - -#define ADC_SMPR2_SMP19 ((uint32_t)0x38000000) /*!< SMP19[2:0] bits (Channel 19 Sample time selection) */ -#define ADC_SMPR2_SMP19_0 ((uint32_t)0x08000000) /*!< Bit 0 */ -#define ADC_SMPR2_SMP19_1 ((uint32_t)0x10000000) /*!< Bit 1 */ -#define ADC_SMPR2_SMP19_2 ((uint32_t)0x20000000) /*!< Bit 2 */ - -/****************** Bit definition for ADC_SMPR3 register *******************/ -#define ADC_SMPR3_SMP0 ((uint32_t)0x00000007) /*!< SMP0[2:0] bits (Channel 0 Sample time selection) */ -#define ADC_SMPR3_SMP0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SMPR3_SMP0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SMPR3_SMP0_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP1 ((uint32_t)0x00000038) /*!< SMP1[2:0] bits (Channel 1 Sample time selection) */ -#define ADC_SMPR3_SMP1_0 ((uint32_t)0x00000008) /*!< Bit 0 */ -#define ADC_SMPR3_SMP1_1 ((uint32_t)0x00000010) /*!< Bit 1 */ -#define ADC_SMPR3_SMP1_2 ((uint32_t)0x00000020) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP2 ((uint32_t)0x000001C0) /*!< SMP2[2:0] bits (Channel 2 Sample time selection) */ -#define ADC_SMPR3_SMP2_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define ADC_SMPR3_SMP2_1 ((uint32_t)0x00000080) /*!< Bit 1 */ -#define ADC_SMPR3_SMP2_2 ((uint32_t)0x00000100) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP3 ((uint32_t)0x00000E00) /*!< SMP3[2:0] bits (Channel 3 Sample time selection) */ -#define ADC_SMPR3_SMP3_0 ((uint32_t)0x00000200) /*!< Bit 0 */ -#define ADC_SMPR3_SMP3_1 ((uint32_t)0x00000400) /*!< Bit 1 */ -#define ADC_SMPR3_SMP3_2 ((uint32_t)0x00000800) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP4 ((uint32_t)0x00007000) /*!< SMP4[2:0] bits (Channel 4 Sample time selection) */ -#define ADC_SMPR3_SMP4_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define ADC_SMPR3_SMP4_1 ((uint32_t)0x00002000) /*!< Bit 1 */ -#define ADC_SMPR3_SMP4_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP5 ((uint32_t)0x00038000) /*!< SMP5[2:0] bits (Channel 5 Sample time selection) */ -#define ADC_SMPR3_SMP5_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SMPR3_SMP5_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SMPR3_SMP5_2 ((uint32_t)0x00020000) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP6 ((uint32_t)0x001C0000) /*!< SMP6[2:0] bits (Channel 6 Sample time selection) */ -#define ADC_SMPR3_SMP6_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define ADC_SMPR3_SMP6_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define ADC_SMPR3_SMP6_2 ((uint32_t)0x00100000) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP7 ((uint32_t)0x00E00000) /*!< SMP7[2:0] bits (Channel 7 Sample time selection) */ -#define ADC_SMPR3_SMP7_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define ADC_SMPR3_SMP7_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define ADC_SMPR3_SMP7_2 ((uint32_t)0x00800000) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP8 ((uint32_t)0x07000000) /*!< SMP8[2:0] bits (Channel 8 Sample time selection) */ -#define ADC_SMPR3_SMP8_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define ADC_SMPR3_SMP8_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define ADC_SMPR3_SMP8_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - -#define ADC_SMPR3_SMP9 ((uint32_t)0x38000000) /*!< SMP9[2:0] bits (Channel 9 Sample time selection) */ -#define ADC_SMPR3_SMP9_0 ((uint32_t)0x08000000) /*!< Bit 0 */ -#define ADC_SMPR3_SMP9_1 ((uint32_t)0x10000000) /*!< Bit 1 */ -#define ADC_SMPR3_SMP9_2 ((uint32_t)0x20000000) /*!< Bit 2 */ - - -/****************** Bit definition for ADC_JOFR1 register *******************/ -#define ADC_JOFR1_JOFFSET1 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 1 */ - -/****************** Bit definition for ADC_JOFR2 register *******************/ -#define ADC_JOFR2_JOFFSET2 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 2 */ - -/****************** Bit definition for ADC_JOFR3 register *******************/ -#define ADC_JOFR3_JOFFSET3 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 3 */ - -/****************** Bit definition for ADC_JOFR4 register *******************/ -#define ADC_JOFR4_JOFFSET4 ((uint32_t)0x00000FFF) /*!< Data offset for injected channel 4 */ - -/******************* Bit definition for ADC_HTR register ********************/ -#define ADC_HTR_HT ((uint32_t)0x00000FFF) /*!< Analog watchdog high threshold */ - -/******************* Bit definition for ADC_LTR register ********************/ -#define ADC_LTR_LT ((uint32_t)0x00000FFF) /*!< Analog watchdog low threshold */ - -/******************* Bit definition for ADC_SQR1 register *******************/ -#define ADC_SQR1_SQ25 ((uint32_t)0x0000001F) /*!< SQ25[4:0] bits (25th conversion in regular sequence) */ -#define ADC_SQR1_SQ25_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR1_SQ25_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR1_SQ25_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR1_SQ25_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR1_SQ25_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR1_SQ26 ((uint32_t)0x000003E0) /*!< SQ26[4:0] bits (26th conversion in regular sequence) */ -#define ADC_SQR1_SQ26_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR1_SQ26_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR1_SQ26_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR1_SQ26_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR1_SQ26_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR1_SQ27 ((uint32_t)0x00007C00) /*!< SQ27[4:0] bits (27th conversion in regular sequence) */ -#define ADC_SQR1_SQ27_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR1_SQ27_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR1_SQ27_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR1_SQ27_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR1_SQ27_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR1_L ((uint32_t)0x00F00000) /*!< L[3:0] bits (Regular channel sequence length) */ -#define ADC_SQR1_L_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR1_L_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR1_L_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR1_L_3 ((uint32_t)0x00800000) /*!< Bit 3 */ - -/******************* Bit definition for ADC_SQR2 register *******************/ -#define ADC_SQR2_SQ19 ((uint32_t)0x0000001F) /*!< SQ19[4:0] bits (19th conversion in regular sequence) */ -#define ADC_SQR2_SQ19_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR2_SQ19_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR2_SQ19_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR2_SQ19_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR2_SQ19_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR2_SQ20 ((uint32_t)0x000003E0) /*!< SQ20[4:0] bits (20th conversion in regular sequence) */ -#define ADC_SQR2_SQ20_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR2_SQ20_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR2_SQ20_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR2_SQ20_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR2_SQ20_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR2_SQ21 ((uint32_t)0x00007C00) /*!< SQ21[4:0] bits (21th conversion in regular sequence) */ -#define ADC_SQR2_SQ21_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR2_SQ21_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR2_SQ21_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR2_SQ21_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR2_SQ21_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR2_SQ22 ((uint32_t)0x000F8000) /*!< SQ22[4:0] bits (22th conversion in regular sequence) */ -#define ADC_SQR2_SQ22_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR2_SQ22_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR2_SQ22_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR2_SQ22_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR2_SQ22_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR2_SQ23 ((uint32_t)0x01F00000) /*!< SQ23[4:0] bits (23th conversion in regular sequence) */ -#define ADC_SQR2_SQ23_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR2_SQ23_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR2_SQ23_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR2_SQ23_3 ((uint32_t)0x00800000) /*!< Bit 3 */ -#define ADC_SQR2_SQ23_4 ((uint32_t)0x01000000) /*!< Bit 4 */ - -#define ADC_SQR2_SQ24 ((uint32_t)0x3E000000) /*!< SQ24[4:0] bits (24th conversion in regular sequence) */ -#define ADC_SQR2_SQ24_0 ((uint32_t)0x02000000) /*!< Bit 0 */ -#define ADC_SQR2_SQ24_1 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define ADC_SQR2_SQ24_2 ((uint32_t)0x08000000) /*!< Bit 2 */ -#define ADC_SQR2_SQ24_3 ((uint32_t)0x10000000) /*!< Bit 3 */ -#define ADC_SQR2_SQ24_4 ((uint32_t)0x20000000) /*!< Bit 4 */ - -/******************* Bit definition for ADC_SQR3 register *******************/ -#define ADC_SQR3_SQ13 ((uint32_t)0x0000001F) /*!< SQ13[4:0] bits (13th conversion in regular sequence) */ -#define ADC_SQR3_SQ13_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR3_SQ13_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR3_SQ13_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR3_SQ13_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR3_SQ13_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR3_SQ14 ((uint32_t)0x000003E0) /*!< SQ14[4:0] bits (14th conversion in regular sequence) */ -#define ADC_SQR3_SQ14_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR3_SQ14_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR3_SQ14_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR3_SQ14_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR3_SQ14_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR3_SQ15 ((uint32_t)0x00007C00) /*!< SQ15[4:0] bits (15th conversion in regular sequence) */ -#define ADC_SQR3_SQ15_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR3_SQ15_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR3_SQ15_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR3_SQ15_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR3_SQ15_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR3_SQ16 ((uint32_t)0x000F8000) /*!< SQ16[4:0] bits (16th conversion in regular sequence) */ -#define ADC_SQR3_SQ16_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR3_SQ16_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR3_SQ16_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR3_SQ16_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR3_SQ16_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR3_SQ17 ((uint32_t)0x01F00000) /*!< SQ17[4:0] bits (17th conversion in regular sequence) */ -#define ADC_SQR3_SQ17_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR3_SQ17_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR3_SQ17_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR3_SQ17_3 ((uint32_t)0x00800000) /*!< Bit 3 */ -#define ADC_SQR3_SQ17_4 ((uint32_t)0x01000000) /*!< Bit 4 */ - -#define ADC_SQR3_SQ18 ((uint32_t)0x3E000000) /*!< SQ18[4:0] bits (18th conversion in regular sequence) */ -#define ADC_SQR3_SQ18_0 ((uint32_t)0x02000000) /*!< Bit 0 */ -#define ADC_SQR3_SQ18_1 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define ADC_SQR3_SQ18_2 ((uint32_t)0x08000000) /*!< Bit 2 */ -#define ADC_SQR3_SQ18_3 ((uint32_t)0x10000000) /*!< Bit 3 */ -#define ADC_SQR3_SQ18_4 ((uint32_t)0x20000000) /*!< Bit 4 */ - -/******************* Bit definition for ADC_SQR4 register *******************/ -#define ADC_SQR4_SQ7 ((uint32_t)0x0000001F) /*!< SQ7[4:0] bits (7th conversion in regular sequence) */ -#define ADC_SQR4_SQ7_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR4_SQ7_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR4_SQ7_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR4_SQ7_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR4_SQ7_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR4_SQ8 ((uint32_t)0x000003E0) /*!< SQ8[4:0] bits (8th conversion in regular sequence) */ -#define ADC_SQR4_SQ8_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR4_SQ8_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR4_SQ8_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR4_SQ8_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR4_SQ8_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR4_SQ9 ((uint32_t)0x00007C00) /*!< SQ9[4:0] bits (9th conversion in regular sequence) */ -#define ADC_SQR4_SQ9_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR4_SQ9_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR4_SQ9_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR4_SQ9_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR4_SQ9_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR4_SQ10 ((uint32_t)0x000F8000) /*!< SQ10[4:0] bits (10th conversion in regular sequence) */ -#define ADC_SQR4_SQ10_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR4_SQ10_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR4_SQ10_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR4_SQ10_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR4_SQ10_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR4_SQ11 ((uint32_t)0x01F00000) /*!< SQ11[4:0] bits (11th conversion in regular sequence) */ -#define ADC_SQR4_SQ11_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR4_SQ11_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR4_SQ11_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR4_SQ11_3 ((uint32_t)0x00800000) /*!< Bit 3 */ -#define ADC_SQR4_SQ11_4 ((uint32_t)0x01000000) /*!< Bit 4 */ - -#define ADC_SQR4_SQ12 ((uint32_t)0x3E000000) /*!< SQ12[4:0] bits (12th conversion in regular sequence) */ -#define ADC_SQR4_SQ12_0 ((uint32_t)0x02000000) /*!< Bit 0 */ -#define ADC_SQR4_SQ12_1 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define ADC_SQR4_SQ12_2 ((uint32_t)0x08000000) /*!< Bit 2 */ -#define ADC_SQR4_SQ12_3 ((uint32_t)0x10000000) /*!< Bit 3 */ -#define ADC_SQR4_SQ12_4 ((uint32_t)0x20000000) /*!< Bit 4 */ - -/******************* Bit definition for ADC_SQR5 register *******************/ -#define ADC_SQR5_SQ1 ((uint32_t)0x0000001F) /*!< SQ1[4:0] bits (1st conversion in regular sequence) */ -#define ADC_SQR5_SQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_SQR5_SQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_SQR5_SQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_SQR5_SQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_SQR5_SQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_SQR5_SQ2 ((uint32_t)0x000003E0) /*!< SQ2[4:0] bits (2nd conversion in regular sequence) */ -#define ADC_SQR5_SQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_SQR5_SQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_SQR5_SQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_SQR5_SQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_SQR5_SQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_SQR5_SQ3 ((uint32_t)0x00007C00) /*!< SQ3[4:0] bits (3rd conversion in regular sequence) */ -#define ADC_SQR5_SQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_SQR5_SQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_SQR5_SQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_SQR5_SQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_SQR5_SQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_SQR5_SQ4 ((uint32_t)0x000F8000) /*!< SQ4[4:0] bits (4th conversion in regular sequence) */ -#define ADC_SQR5_SQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_SQR5_SQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_SQR5_SQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_SQR5_SQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_SQR5_SQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_SQR5_SQ5 ((uint32_t)0x01F00000) /*!< SQ5[4:0] bits (5th conversion in regular sequence) */ -#define ADC_SQR5_SQ5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_SQR5_SQ5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ -#define ADC_SQR5_SQ5_2 ((uint32_t)0x00400000) /*!< Bit 2 */ -#define ADC_SQR5_SQ5_3 ((uint32_t)0x00800000) /*!< Bit 3 */ -#define ADC_SQR5_SQ5_4 ((uint32_t)0x01000000) /*!< Bit 4 */ - -#define ADC_SQR5_SQ6 ((uint32_t)0x3E000000) /*!< SQ6[4:0] bits (6th conversion in regular sequence) */ -#define ADC_SQR5_SQ6_0 ((uint32_t)0x02000000) /*!< Bit 0 */ -#define ADC_SQR5_SQ6_1 ((uint32_t)0x04000000) /*!< Bit 1 */ -#define ADC_SQR5_SQ6_2 ((uint32_t)0x08000000) /*!< Bit 2 */ -#define ADC_SQR5_SQ6_3 ((uint32_t)0x10000000) /*!< Bit 3 */ -#define ADC_SQR5_SQ6_4 ((uint32_t)0x20000000) /*!< Bit 4 */ - - -/******************* Bit definition for ADC_JSQR register *******************/ -#define ADC_JSQR_JSQ1 ((uint32_t)0x0000001F) /*!< JSQ1[4:0] bits (1st conversion in injected sequence) */ -#define ADC_JSQR_JSQ1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define ADC_JSQR_JSQ1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ -#define ADC_JSQR_JSQ1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ -#define ADC_JSQR_JSQ1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ -#define ADC_JSQR_JSQ1_4 ((uint32_t)0x00000010) /*!< Bit 4 */ - -#define ADC_JSQR_JSQ2 ((uint32_t)0x000003E0) /*!< JSQ2[4:0] bits (2nd conversion in injected sequence) */ -#define ADC_JSQR_JSQ2_0 ((uint32_t)0x00000020) /*!< Bit 0 */ -#define ADC_JSQR_JSQ2_1 ((uint32_t)0x00000040) /*!< Bit 1 */ -#define ADC_JSQR_JSQ2_2 ((uint32_t)0x00000080) /*!< Bit 2 */ -#define ADC_JSQR_JSQ2_3 ((uint32_t)0x00000100) /*!< Bit 3 */ -#define ADC_JSQR_JSQ2_4 ((uint32_t)0x00000200) /*!< Bit 4 */ - -#define ADC_JSQR_JSQ3 ((uint32_t)0x00007C00) /*!< JSQ3[4:0] bits (3rd conversion in injected sequence) */ -#define ADC_JSQR_JSQ3_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define ADC_JSQR_JSQ3_1 ((uint32_t)0x00000800) /*!< Bit 1 */ -#define ADC_JSQR_JSQ3_2 ((uint32_t)0x00001000) /*!< Bit 2 */ -#define ADC_JSQR_JSQ3_3 ((uint32_t)0x00002000) /*!< Bit 3 */ -#define ADC_JSQR_JSQ3_4 ((uint32_t)0x00004000) /*!< Bit 4 */ - -#define ADC_JSQR_JSQ4 ((uint32_t)0x000F8000) /*!< JSQ4[4:0] bits (4th conversion in injected sequence) */ -#define ADC_JSQR_JSQ4_0 ((uint32_t)0x00008000) /*!< Bit 0 */ -#define ADC_JSQR_JSQ4_1 ((uint32_t)0x00010000) /*!< Bit 1 */ -#define ADC_JSQR_JSQ4_2 ((uint32_t)0x00020000) /*!< Bit 2 */ -#define ADC_JSQR_JSQ4_3 ((uint32_t)0x00040000) /*!< Bit 3 */ -#define ADC_JSQR_JSQ4_4 ((uint32_t)0x00080000) /*!< Bit 4 */ - -#define ADC_JSQR_JL ((uint32_t)0x00300000) /*!< JL[1:0] bits (Injected Sequence length) */ -#define ADC_JSQR_JL_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define ADC_JSQR_JL_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -/******************* Bit definition for ADC_JDR1 register *******************/ -#define ADC_JDR1_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ - -/******************* Bit definition for ADC_JDR2 register *******************/ -#define ADC_JDR2_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ - -/******************* Bit definition for ADC_JDR3 register *******************/ -#define ADC_JDR3_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ - -/******************* Bit definition for ADC_JDR4 register *******************/ -#define ADC_JDR4_JDATA ((uint32_t)0x0000FFFF) /*!< Injected data */ - -/******************** Bit definition for ADC_DR register ********************/ -#define ADC_DR_DATA ((uint32_t)0x0000FFFF) /*!< Regular data */ - - -/******************* Bit definition for ADC_CSR register ********************/ -#define ADC_CSR_AWD1 ((uint32_t)0x00000001) /*!< ADC1 Analog watchdog flag */ -#define ADC_CSR_EOC1 ((uint32_t)0x00000002) /*!< ADC1 End of conversion */ -#define ADC_CSR_JEOC1 ((uint32_t)0x00000004) /*!< ADC1 Injected channel end of conversion */ -#define ADC_CSR_JSTRT1 ((uint32_t)0x00000008) /*!< ADC1 Injected channel Start flag */ -#define ADC_CSR_STRT1 ((uint32_t)0x00000010) /*!< ADC1 Regular channel Start flag */ -#define ADC_CSR_OVR1 ((uint32_t)0x00000020) /*!< ADC1 overrun flag */ -#define ADC_CSR_ADONS1 ((uint32_t)0x00000040) /*!< ADON status of ADC1 */ - -/******************* Bit definition for ADC_CCR register ********************/ -#define ADC_CCR_ADCPRE ((uint32_t)0x00030000) /*!< ADC prescaler*/ -#define ADC_CCR_ADCPRE_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define ADC_CCR_ADCPRE_1 ((uint32_t)0x00020000) /*!< Bit 1 */ -#define ADC_CCR_TSVREFE ((uint32_t)0x00800000) /*!< Temperature Sensor and VREFINT Enable */ - -/******************************************************************************/ -/* */ -/* Analog Comparators (COMP) */ -/* */ -/******************************************************************************/ - -/****************** Bit definition for COMP_CSR register ********************/ -#define COMP_CSR_10KPU ((uint32_t)0x00000001) /*!< 10K pull-up resistor */ -#define COMP_CSR_400KPU ((uint32_t)0x00000002) /*!< 400K pull-up resistor */ -#define COMP_CSR_10KPD ((uint32_t)0x00000004) /*!< 10K pull-down resistor */ -#define COMP_CSR_400KPD ((uint32_t)0x00000008) /*!< 400K pull-down resistor */ - -#define COMP_CSR_CMP1EN ((uint32_t)0x00000010) /*!< Comparator 1 enable */ -#define COMP_CSR_CMP1OUT ((uint32_t)0x00000080) /*!< Comparator 1 output */ - -#define COMP_CSR_SPEED ((uint32_t)0x00001000) /*!< Comparator 2 speed */ -#define COMP_CSR_CMP2OUT ((uint32_t)0x00002000) /*!< Comparator 2 ouput */ - -#define COMP_CSR_VREFOUTEN ((uint32_t)0x00010000) /*!< Comparator Vref Enable */ -#define COMP_CSR_WNDWE ((uint32_t)0x00020000) /*!< Window mode enable */ - -#define COMP_CSR_INSEL ((uint32_t)0x001C0000) /*!< INSEL[2:0] Inversion input Selection */ -#define COMP_CSR_INSEL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define COMP_CSR_INSEL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define COMP_CSR_INSEL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ - -#define COMP_CSR_OUTSEL ((uint32_t)0x00E00000) /*!< OUTSEL[2:0] comparator 2 output redirection */ -#define COMP_CSR_OUTSEL_0 ((uint32_t)0x00200000) /*!< Bit 0 */ -#define COMP_CSR_OUTSEL_1 ((uint32_t)0x00400000) /*!< Bit 1 */ -#define COMP_CSR_OUTSEL_2 ((uint32_t)0x00800000) /*!< Bit 2 */ - -/******************************************************************************/ -/* */ -/* CRC calculation unit (CRC) */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for CRC_DR register *********************/ -#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ - -/******************* Bit definition for CRC_IDR register ********************/ -#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ - -/******************** Bit definition for CRC_CR register ********************/ -#define CRC_CR_RESET ((uint32_t)0x00000001) /*!< RESET bit */ - -/******************************************************************************/ -/* */ -/* Digital to Analog Converter (DAC) */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for DAC_CR register ********************/ -#define DAC_CR_EN1 ((uint32_t)0x00000001) /*!. -*/ - -/** - * @file STM8L/hal_lld.c - * @brief STM8L HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * @details Clock sources initialization, HSI is assumed to be already - * started after reset. - * @note If the @p STM8L_CLOCK_INIT option is set to @p FALSE then the - * initialization is not performed and is left to the application. - * - * @notapi - */ -void hal_lld_init(void) { - -#if !STM8L_NO_CLOCK_INIT - /* Makes sure that HSI is stable before proceeding.*/ - CLK->ICKCR |= CLK_ICKCR_HSION; - while ((CLK->ICKCR & CLK_ICKCR_HSIRDY) == 0) - ; - - /* LSI startup and stabilization if required.*/ -#if STM8L_LSI_ENABLED - CLK->ICKCR |= CLK_ICKCR_LSION; - while ((CLK->ICKCR & CLK_ICKCR_LSIRDY) == 0) - ; -#endif - - /* HSE startup and stabilization if required.*/ -#if STM8L_HSE_ENABLED -#if HSEBYPASS - CLK->ECKCR |= CLK_ECKCR_HSEON | CLK_ECKCR_HSEBYP; -#else - CLK->ECKCR |= CLK_ECKCR_HSEON; -#endif - while ((CLK->ECKCR & CLK_ECKCR_HSERDY) == 0) - ; -#endif - - /* LSE startup and stabilization if required.*/ -#if STM8L_LSE_ENABLED -#if LSEBYPASS - CLK->ECKCR |= CLK_ECKCR_LSEON | CLK_ECKCR_LSEBYP; -#else - CLK->ECKCR |= CLK_ECKCR_LSEON; -#endif - while ((CLK->ECKCR & CLK_ECKCR_LSERDY) == 0) - ; -#endif - - /* Setting up clock dividers.*/ - CLK->CKDIVR = STM8L_SYSCLK_DIVIDER << 0; - - /* SYSCLK switch to the selected source, not necessary if it is HSI.*/ -#if STM8L_SYSCLK_SOURCE != CLK_SYSSEL_HSI - /* Switching clock (manual switch mode).*/ - CLK->SWR = STM8L_SYSCLK_SOURCE; - while ((CLK->SWCR & CLK_SWCR_SWIF) == 0) - ; - CLK->SWCR = CLK_SWCR_SWEN; -#endif - - /* Clocks initially all disabled, note the boot ROM clock is disabled - because the boot loader is no more required and it draws precious uAs.*/ - CLK->PCKENR1 = 0; - CLK->PCKENR2 = 0; - CLK->PCKENR3 = 0; - - /* Other clock related initializations.*/ - CLK->CSSR = 0; - CLK->CCOR = 0; - - /* HSI disabled if it is no more required.*/ -#if !STM8L_HSI_ENABLED - CLK->ICKCR &= ~CLK_ICKCR_HSION; -#endif -#endif /* !STM8L_NO_CLOCK_INIT */ -} - -/** @} */ diff --git a/os/hal/platforms/STM8L/hal_lld.h b/os/hal/platforms/STM8L/hal_lld.h deleted file mode 100644 index 67f32b8a49..0000000000 --- a/os/hal/platforms/STM8L/hal_lld.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8L/hal_lld.h - * @brief STM8L HAL subsystem low level driver source. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - HSECLK (@p 0 if disabled or frequency in Hertz). - * - HSEBYPASS (@p TRUE if external oscillator rather than a crystal). - * - LSECLK (@p 0 if disabled or frequency in Hertz). - * - LSEBYPASS (@p TRUE if external oscillator rather than a crystal). - * . - * One of the following macros must also be defined: - * - STM8L15X_MD for Medium Density devices. - * - STM8L15X_MDP for Medium Density Plus devices. - * - STM8L15X_HD for High Density devices. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#undef FALSE -#undef TRUE -#include "stm8l15x.h" -#define FALSE 0 -#define TRUE (!FALSE) - -#if defined (STM8L15X_MD) -#include "hal_lld_stm8l_md.h" -#elif defined (STM8L15X_MDP) -#include "hal_lld_stm8l_mdp.h" -#elif defined (STM8L15X_HD) -#include "hal_lld_stm8l_hd.h" -#else -#error "unspecified, unsupported or invalid STM8L platform" -#endif - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "STM8L" - -#define LSICLK 38000 /**< Low speed internal clock. */ -#define HSICLK 16000000 /**< High speed internal clock. */ - -#define CLK_SYSSEL_HSI 1 /**< HSI system clock selector. */ -#define CLK_SYSSEL_LSI 2 /**< LSI system clock selector. */ -#define CLK_SYSSEL_HSE 4 /**< HSE system clock selector. */ -#define CLK_SYSSEL_LSE 8 /**< LSE system clock selector. */ - -#define CLK_SYSCLK_DIV1 0 /**< Source clock divided by 1. */ -#define CLK_SYSCLK_DIV2 1 /**< Source clock divided by 2. */ -#define CLK_SYSCLK_DIV4 2 /**< Source clock divided by 4. */ -#define CLK_SYSCLK_DIV8 3 /**< Source clock divided by 8. */ -#define CLK_SYSCLK_DIV16 4 /**< Source clock divided by 16. */ -#define CLK_SYSCLK_DIV32 5 /**< Source clock divided by 32. */ -#define CLK_SYSCLK_DIV64 6 /**< Source clock divided by 64. */ -#define CLK_SYSCLK_DIV128 7 /**< Source clock divided by 128. */ - -#define CLK_RTCSEL_HSI 1 /**< HSI RTC clock selector. */ -#define CLK_RTCSEL_LSI 2 /**< LSI RTC clock selector. */ -#define CLK_RTCSEL_HSE 4 /**< HSE RTC clock selector. */ -#define CLK_RTCSEL_LSE 8 /**< LSE RTC clock selector. */ - -#define CLK_RTCCLK_DIV1 0 /**< Source clock divided by 1. */ -#define CLK_RTCCLK_DIV2 1 /**< Source clock divided by 2. */ -#define CLK_RTCCLK_DIV4 2 /**< Source clock divided by 4. */ -#define CLK_RTCCLK_DIV8 3 /**< Source clock divided by 8. */ -#define CLK_RTCCLK_DIV16 4 /**< Source clock divided by 16. */ -#define CLK_RTCCLK_DIV32 5 /**< Source clock divided by 32. */ -#define CLK_RTCCLK_DIV64 6 /**< Source clock divided by 64. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Disables the clock initialization in the HAL. - */ -#if !defined(STM8L_NO_CLOCK_INIT) || defined(__DOXYGEN__) -#define STM8L_NO_CLOCK_INIT FALSE -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM8L_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM8L_HSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM8L_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM8L_LSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM8L_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM8L_HSE_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the LSE clock source. - */ -#if !defined(STM8L_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM8L_LSE_ENABLED FALSE -#endif - -/** - * @brief System clock source selection. - */ -#if !defined(STM8L_SYSCLK_SOURCE) || defined(__DOXYGEN__) -#define STM8L_SYSCLK_SOURCE CLK_SYSSEL_HSI -#endif - -/** - * @brief System clock divider. - */ -#if !defined(STM8L_SYSCLK_DIVIDER) || defined(__DOXYGEN__) -#define STM8L_SYSCLK_DIVIDER CLK_SYSCLK_DIV1 -#endif - -/** - * @brief RTC clock source selection. - */ -#if !defined(STM8L_RTCCLK_SOURCE) || defined(__DOXYGEN__) -#define STM8L_RTCCLK_SOURCE CLK_RTCSEL_HSI -#endif - -/** - * @brief RTC clock divider. - */ -#if !defined(STM8L_RTCCLK_DIVIDER) || defined(__DOXYGEN__) -#define STM8L_RTCCLK_DIVIDER CLK_RTCCLK_DIV1 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV1) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV2) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV4) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV8) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV16) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV32) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV64) && \ - (STM8L_SYSCLK_DIVIDER != CLK_SYSCLK_DIV128) -#error "specified invalid SYSCLK divider" -#endif - -#if (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV1) && \ - (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV2) && \ - (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV4) && \ - (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV8) && \ - (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV16) && \ - (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV32) && \ - (STM8L_RTCCLK_DIVIDER != CLK_RTCCLK_DIV64) -#error "specified invalid RTCCLK divider" -#endif - -#if STM8L_HSE_ENABLED && (HSECLK == 0) -#error "impossible to activate HSE" -#endif - -#if STM8L_LSE_ENABLED && (LSECLK == 0) -#error "impossible to activate LSE" -#endif - -#if !STM8L_HSI_ENABLED && ((STM8L_SYSCLK_SOURCE == CLK_SYSSEL_HSI) || \ - (STM8L_RTCCLK_SOURCE == CLK_RTCSEL_HSI)) -#error "requested HSI clock is not enabled" -#endif - -#if !STM8L_LSI_ENABLED && ((STM8L_SYSCLK_SOURCE == CLK_SYSSEL_LSI) || \ - (STM8L_RTCCLK_SOURCE == CLK_RTCSEL_LSI)) -#error "requested LSI clock is not enabled" -#endif - -#if !STM8L_HSE_ENABLED && ((STM8L_SYSCLK_SOURCE == CLK_SYSSEL_HSE) || \ - (STM8L_RTCCLK_SOURCE == CLK_RTCSEL_HSE)) -#error "requested HSE clock is not enabled" -#endif - -#if !STM8L_LSE_ENABLED && ((STM8L_SYSCLK_SOURCE == CLK_SYSSEL_LSE) || \ - (STM8L_RTCCLK_SOURCE == CLK_RTCSEL_LSE)) -#error "requested LSE clock is not enabled" -#endif - -/** - * @brief System clock. - */ -#if STM8L_NO_CLOCK_INIT || defined(__DOXYGEN__) -#define SYSCLK (HSICLK / 8) -#elif STM8L_SYSCLK_SOURCE == CLK_SYSSEL_HSI -#define SYSCLK (HSICLK / (1 << STM8L_SYSCLK_DIVIDER)) -#elif STM8L_SYSCLK_SOURCE == CLK_SYSSEL_LSI -#define SYSCLK (LSICLK / (1 << STM8L_SYSCLK_DIVIDER)) -#elif STM8L_SYSCLK_SOURCE == CLK_SYSSEL_HSE -#define SYSCLK (HSECLK / (1 << STM8L_SYSCLK_DIVIDER)) -#elif STM8L_SYSCLK_SOURCE == CLK_SYSSEL_LSE -#define SYSCLK (LSECLK / (1 << STM8L_SYSCLK_DIVIDER)) -#else -#error "specified invalid SYSCLK source" -#endif - -/** - * @brief RTC clock. - */ -#if STM8L_NO_CLOCK_INIT || defined(__DOXYGEN__) -#define RTCCLK 0 -#elif STM8L_RTCCLK_SOURCE == CLK_RTCSEL_HSI -#define RTCCLK (HSICLK / (1 << STM8L_RTCCLK_DIVIDER)) -#elif STM8L_RTCCLK_SOURCE == CLK_RTCSEL_LSI -#define RTCCLK (LSICLK / (1 << STM8L_RTCCLK_DIVIDER)) -#elif STM8L_RTCCLK_SOURCE == CLK_RTCSEL_HSE -#define RTCCLK (HSECLK / (1 << STM8L_RTCCLK_DIVIDER)) -#elif STM8L_RTCCLK_SOURCE == CLK_RTCSEL_LSE -#define RTCCLK (LSECLK / (1 << STM8L_RTCCLK_DIVIDER)) -#else -#error "specified invalid RTCCLK source" -#endif - -/** - * @brief CPU clock. - * @details On the STM8L the CPU clock is always equal to the system clock. - */ -#define CPUCLK SYSCLK - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/hal_lld_stm8l_hd.h b/os/hal/platforms/STM8L/hal_lld_stm8l_hd.h deleted file mode 100644 index d62df3a1c1..0000000000 --- a/os/hal/platforms/STM8L/hal_lld_stm8l_hd.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8L_HD_HAL STM8L High Density sub-family - * - * @ingroup HAL - */ - -/** - * @file STM8L/hal_lld_stm8l_hd.h - * @brief STM8L High Density sub-family capabilities descriptor. - * - * @addtogroup STM8L_HD_HAL - * @{ - */ - -#ifndef _HAL_LLD_STM8L_HD_H_ -#define _HAL_LLD_STM8L_HD_H_ - -/*===========================================================================*/ -/* Sub-family capabilities. */ -/*===========================================================================*/ - -#define STM8L_HAS_ADC1 TRUE - -#define STM8L_HAS_BEEP TRUE - -#define STM8L_HAS_COMP1 TRUE -#define STM8L_HAS_COMP2 TRUE - -#define STM8L_HAS_DAC1 TRUE - -#define STM8L_HAS_DMA1 TRUE - -#define STM8L_HAS_GPIOA TRUE -#define STM8L_HAS_GPIOB TRUE -#define STM8L_HAS_GPIOC TRUE -#define STM8L_HAS_GPIOD TRUE -#define STM8L_HAS_GPIOE TRUE -#define STM8L_HAS_GPIOF TRUE -#define STM8L_HAS_GPIOG TRUE -#define STM8L_HAS_GPIOH TRUE -#define STM8L_HAS_GPIOI TRUE - -#define STM8L_HAS_I2C1 TRUE - -#define STM8L_HAS_LCD TRUE - -#define STM8L_HAS_SPI1 TRUE -#define STM8L_HAS_SPI2 TRUE - -#define STM8L_HAS_TIM1 TRUE -#define STM8L_HAS_TIM2 TRUE -#define STM8L_HAS_TIM3 TRUE -#define STM8L_HAS_TIM4 TRUE -#define STM8L_HAS_TIM5 TRUE - -#define STM8L_HAS_USART1 TRUE -#define STM8L_HAS_USART2 TRUE -#define STM8L_HAS_USART3 TRUE - -#endif /* _HAL_LLD_STM8L_HD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/hal_lld_stm8l_md.h b/os/hal/platforms/STM8L/hal_lld_stm8l_md.h deleted file mode 100644 index 574e2f37cb..0000000000 --- a/os/hal/platforms/STM8L/hal_lld_stm8l_md.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8L_MD_HAL STM8L Medium Density sub-family - * - * @ingroup HAL - */ - -/** - * @file STM8L/hal_lld_stm8l_md.h - * @brief STM8L Medium Density sub-family capabilities descriptor. - * - * @addtogroup STM8L_MD_HAL - * @{ - */ - -#ifndef _HAL_LLD_STM8L_MD_H_ -#define _HAL_LLD_STM8L_MD_H_ - -/*===========================================================================*/ -/* Sub-family capabilities. */ -/*===========================================================================*/ - -#define STM8L_HAS_ADC1 TRUE - -#define STM8L_HAS_BEEP TRUE - -#define STM8L_HAS_COMP1 TRUE -#define STM8L_HAS_COMP2 TRUE - -#define STM8L_HAS_DAC1 TRUE - -#define STM8L_HAS_DMA1 TRUE - -#define STM8L_HAS_GPIOA TRUE -#define STM8L_HAS_GPIOB TRUE -#define STM8L_HAS_GPIOC TRUE -#define STM8L_HAS_GPIOD TRUE -#define STM8L_HAS_GPIOE TRUE -#define STM8L_HAS_GPIOF TRUE -#define STM8L_HAS_GPIOG FALSE -#define STM8L_HAS_GPIOH FALSE -#define STM8L_HAS_GPIOI FALSE - -#define STM8L_HAS_I2C1 TRUE - -#define STM8L_HAS_LCD TRUE - -#define STM8L_HAS_SPI1 TRUE -#define STM8L_HAS_SPI2 FALSE - -#define STM8L_HAS_TIM1 TRUE -#define STM8L_HAS_TIM2 TRUE -#define STM8L_HAS_TIM3 TRUE -#define STM8L_HAS_TIM4 TRUE -#define STM8L_HAS_TIM5 FALSE - -#define STM8L_HAS_USART1 TRUE -#define STM8L_HAS_USART2 FALSE -#define STM8L_HAS_USART3 FALSE - -#endif /* _HAL_LLD_STM8L_MD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/hal_lld_stm8l_mdp.h b/os/hal/platforms/STM8L/hal_lld_stm8l_mdp.h deleted file mode 100644 index e5a5872306..0000000000 --- a/os/hal/platforms/STM8L/hal_lld_stm8l_mdp.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8L_MDP_HAL STM8L Medium Density Plus sub-family - * - * @ingroup HAL - */ - -/** - * @file STM8L/hal_lld_stm8l_mdp.h - * @brief STM8L Medium Density Plus sub-family capabilities descriptor. - * - * @addtogroup STM8L_MDP_HAL - * @{ - */ - -#ifndef _HAL_LLD_STM8L_MDP_H_ -#define _HAL_LLD_STM8L_MDP_H_ - -/*===========================================================================*/ -/* Sub-family capabilities. */ -/*===========================================================================*/ - -#define STM8L_HAS_ADC1 TRUE - -#define STM8L_HAS_BEEP TRUE - -#define STM8L_HAS_COMP1 TRUE -#define STM8L_HAS_COMP2 TRUE - -#define STM8L_HAS_DAC1 TRUE - -#define STM8L_HAS_DMA1 TRUE - -#define STM8L_HAS_GPIOA TRUE -#define STM8L_HAS_GPIOB TRUE -#define STM8L_HAS_GPIOC TRUE -#define STM8L_HAS_GPIOD TRUE -#define STM8L_HAS_GPIOE TRUE -#define STM8L_HAS_GPIOF TRUE -#define STM8L_HAS_GPIOG TRUE -#define STM8L_HAS_GPIOH TRUE -#define STM8L_HAS_GPIOI TRUE - -#define STM8L_HAS_I2C1 TRUE - -#define STM8L_HAS_LCD TRUE - -#define STM8L_HAS_SPI1 TRUE -#define STM8L_HAS_SPI2 TRUE - -#define STM8L_HAS_TIM1 TRUE -#define STM8L_HAS_TIM2 TRUE -#define STM8L_HAS_TIM3 TRUE -#define STM8L_HAS_TIM4 TRUE -#define STM8L_HAS_TIM5 TRUE - -#define STM8L_HAS_USART1 TRUE -#define STM8L_HAS_USART2 TRUE -#define STM8L_HAS_USART3 TRUE - -#endif /* _HAL_LLD_STM8L_MDP_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/pal_lld.c b/os/hal/platforms/STM8L/pal_lld.c deleted file mode 100644 index 24eccf34dc..0000000000 --- a/os/hal/platforms/STM8L/pal_lld.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8L/pal_lld.c - * @brief STM8L GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output at 2MHz. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT_PULLUP: - port->DDR &= ~mask; - port->CR1 |= mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_INPUT: - case PAL_MODE_INPUT_ANALOG: - port->DDR &= ~mask; - port->CR1 &= ~mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - case PAL_MODE_OUTPUT_PUSHPULL_SLOW: - port->DDR |= mask; - port->CR1 |= mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_OUTPUT_PUSHPULL: - port->DDR |= mask; - port->CR1 |= mask; - port->CR2 |= mask; - break; - case PAL_MODE_OUTPUT_OPENDRAIN_SLOW: - port->DDR |= mask; - port->CR1 &= ~mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_OUTPUT_OPENDRAIN: - port->DDR |= mask; - port->CR1 &= ~mask; - port->CR2 |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/pal_lld.h b/os/hal/platforms/STM8L/pal_lld.h deleted file mode 100644 index 8658de52ee..0000000000 --- a/os/hal/platforms/STM8L/pal_lld.h +++ /dev/null @@ -1,248 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8L/pal_lld.h - * @brief STM8L GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLDOWN - -/** - * @brief STM8L specific alternate push-pull slow output mode. - */ -#define PAL_MODE_OUTPUT_PUSHPULL_SLOW 16 - -/** - * @brief STM8L specific alternate open-drain slow output mode. - */ -#define PAL_MODE_OUTPUT_OPENDRAIN_SLOW 17 - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief Generic I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { -#if STM8L_HAS_GPIOI || defined(__DOXYGEN__) - GPIO_TypeDef P[9]; -#elif STM8L_HAS_GPIOH || defined(__DOXYGEN__) - GPIO_TypeDef P[8]; -#elif STM8L_HAS_GPIOG || defined(__DOXYGEN__) - GPIO_TypeDef P[7]; -#else - GPIO_TypeDef P[6]; -#endif -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 8 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint8_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint8_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef GPIO_TypeDef *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief GPIO ports as a whole. - */ -#define IOPORTS ((PALConfig *)0x5000) - -#if STM8L_HAS_GPIOA || defined(__DOXYGEN__) -/** - * @brief GPIO port A identifier. - */ -#define IOPORT1 GPIOA -#endif - -#if STM8L_HAS_GPIOB || defined(__DOXYGEN__) -/** - * @brief GPIO port B identifier. - */ -#define IOPORT2 GPIOB -#endif - -#if STM8L_HAS_GPIOC || defined(__DOXYGEN__) -/** - * @brief GPIO port C identifier. - */ -#define IOPORT3 GPIOC -#endif - -#if STM8L_HAS_GPIOD || defined(__DOXYGEN__) -/** - * @brief GPIO port D identifier. - */ -#define IOPORT4 GPIOD -#endif - -#if STM8L_HAS_GPIOE || defined(__DOXYGEN__) -/** - * @brief GPIO port E identifier. - */ -#define IOPORT5 GPIOE -#endif - -#if STM8L_HAS_GPIOF || defined(__DOXYGEN__) -/** - * @brief GPIO port F identifier. - */ -#define IOPORT6 GPIOF -#endif - -#if STM8L_HAS_GPIOG || defined(__DOXYGEN__) -/** - * @brief GPIO port G identifier. - */ -#define IOPORT7 GPIOG -#endif - -#if STM8L_HAS_GPIOH || defined(__DOXYGEN__) -/** - * @brief GPIO port H identifier. - */ -#define IOPORT8 GPIOH -#endif - -#if STM8L_HAS_GPIOI || defined(__DOXYGEN__) -/** - * @brief GPIO port I identifier. - */ -#define IOPORT9 GPIOI -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) (*IOPORTS = *(config)) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->IDR) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->ODR) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->ODR = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -extern ROMCONST PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/platform.dox b/os/hal/platforms/STM8L/platform.dox deleted file mode 100644 index 02c5e2cc68..0000000000 --- a/os/hal/platforms/STM8L/platform.dox +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8L_DRIVERS STM8L Drivers - * @details This section describes all the supported drivers on the STM8L - * and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup STM8L_HAL STM8L Initialization Support - * @details The STM8L HAL support is responsible for system initialization. - * - * @section stm8l_hal_1 Supported HW resources - * - CLK. - * . - * @section stm8l_hal_2 STM8L HAL driver implementation features - * - Board related initializations. - * - Clock tree initialization. - * - Clock source selection. - * . - * @ingroup STM8L_DRIVERS - */ - -/** - * @defgroup STM8L_PAL STM8L PAL Support - * @details The STM8L PAL driver uses the GPIO peripherals. - * - * @section stm8l_pal_1 Supported HW resources - * - GPIOA. - * - GPIOB. - * - GPIOC. - * - GPIOD. - * - GPIOE. - * - GPIOF. - * - GPIOG. - * - GPIOH (where present). - * - GPIOI (where present). - * . - * @section stm8l_pal_2 STM8L PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 8 bits wide ports. - * - Atomic set/reset/toggle functions because special STM8L instruction set. - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section stm8l_pal_3 Supported PAL setup modes - * The STM8L PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section stm8l_pal_4 Suboptimal behavior - * The STM8L GPIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Bus/group writing is not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup STM8L_DRIVERS - */ - -/** - * @defgroup STM8L_SERIAL STM8L Serial Support - * @details The STM8L Serial driver uses the USART1 peripheral in a - * buffered, interrupt driven, implementation. - * - * @section stm8l_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - USART1. - * - USART2 (where present). - * - USART3 (where present). - * . - * @section stm8l_serial_2 STM8L Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Fully interrupt driven. - * . - * @ingroup STM8L_DRIVERS - */ diff --git a/os/hal/platforms/STM8L/serial_lld.c b/os/hal/platforms/STM8L/serial_lld.c deleted file mode 100644 index 4392ee94c0..0000000000 --- a/os/hal/platforms/STM8L/serial_lld.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8L/serial_lld.c - * @brief STM8L low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief USART1 serial driver identifier. - */ -#if STM8L_SERIAL_USE_USART1 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif - -/** - * @brief USART2 serial driver identifier. - */ -#if STM8L_SERIAL_USE_USART2 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/** - * @brief USART3 serial driver identifier. - */ -#if STM8L_SERIAL_USE_USART3 || defined(__DOXYGEN__) -SerialDriver SD3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief Driver default configuration. - */ -static ROMCONST SerialConfig default_config = { - BRR(SERIAL_DEFAULT_BITRATE), - SD_MODE_PARITY_NONE | SD_MODE_STOP_1 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -#if STM8L_SERIAL_USE_USART1 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - USART1->CR2 |= USART_CR2_TIEN; -} -#endif /* STM8L_SERIAL_USE_USART1 */ - -#if STM8L_SERIAL_USE_USART2 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - USART2->CR2 |= USART_CR2_TIEN; -} -#endif /* STM8L_SERIAL_USE_USART1 */ - -#if STM8L_SERIAL_USE_USART3 || defined(__DOXYGEN__) -static void notify3(GenericQueue *qp) { - - (void)qp; - USART3->CR2 |= USART_CR2_TIEN; -} -#endif /* STM8L_SERIAL_USE_USART3 */ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/* See in serial_lld.h.*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Error handling routine. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] sr USART SR register value - * - * @notapi - */ -void sd_lld_set_error(SerialDriver *sdp, uint8_t sr) { - flagsmask_t sts = 0; - - if (sr & USART_SR_OR) - sts |= SD_OVERRUN_ERROR; - if (sr & USART_SR_NF) - sts |= SD_NOISE_ERROR; - if (sr & USART_SR_FE) - sts |= SD_FRAMING_ERROR; - if (sr & USART_SR_PE) - sts |= SD_PARITY_ERROR; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if STM8L_SERIAL_USE_USART1 - sdObjectInit(&SD1, NULL, notify1); - CLK->PCKENR1 |= CLK_PCKENR1_USART1; /* PCKEN12, clock source. */ - USART1->CR1 = USART_CR1_USARTD; /* USARTD (low power). */ - SD1.usart = USART1; -#endif - -#if STM8L_SERIAL_USE_USART2 - sdObjectInit(&SD2, NULL, notify2); - CLK->PCKENR3 |= CLK_PCKENR3_USART2; /* PCKEN13, clock source. */ - USART2->CR1 = USART_CR1_USARTD; /* USARTD (low power). */ - SD2.usart = USART2; -#endif - -#if STM8L_SERIAL_USE_USART3 - sdObjectInit(&SD3, NULL, notify3); - CLK->PCKENR3 |= CLK_PCKENR3_USART3; /* PCKEN13, clock source. */ - USART3->CR1 = USART_CR1_USARTD; /* USARTD (low power). */ - SD3.usart = USART3; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - USART_TypeDef *u = sdp->usart; - - if (config == NULL) - config = &default_config; - - u->BRR2 = (uint8_t)(((uint8_t)(config->sc_brr >> 8) & (uint8_t)0xF0) | - ((uint8_t)config->sc_brr & (uint8_t)0x0F)); - u->BRR1 = (uint8_t)(config->sc_brr >> 4); - u->CR1 = (uint8_t)(config->sc_mode & SD_MODE_PARITY); - u->CR2 = USART_CR2_RIEN | USART_CR2_TEN | USART_CR2_REN; - u->CR3 = (uint8_t)(config->sc_mode & SD_MODE_STOP); - u->CR4 = 0; - u->CR5 = 0; - u->PSCR = 1; - (void)u->SR; - (void)u->DR; -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - USART_TypeDef *u = sdp->usart; - - u->CR1 = USART_CR1_USARTD; - u->CR2 = 0; - u->CR3 = 0; - u->CR4 = 0; - u->CR5 = 0; - u->PSCR = 0; -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/serial_lld.h b/os/hal/platforms/STM8L/serial_lld.h deleted file mode 100644 index f2831c6828..0000000000 --- a/os/hal/platforms/STM8L/serial_lld.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8L/serial_lld.h - * @brief STM8L low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define SD_MODE_PARITY 0x07 /**< @brief Parity field mask. */ -#define SD_MODE_PARITY_NONE 0x00 /**< @brief No parity. */ -#define SD_MODE_PARITY_EVEN 0x05 /**< @brief Even parity. */ -#define SD_MODE_PARITY_ODD 0x07 /**< @brief Odd parity. */ - -#define SD_MODE_STOP 0x30 /**< @brief Stop bits mask. */ -#define SD_MODE_STOP_1 0x00 /**< @brief One stop bit. */ -#define SD_MODE_STOP_2 0x20 /**< @brief Two stop bits. */ -#define SD_MODE_STOP_1P5 0x30 /**< @brief 1.5 stop bits. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief USART1 driver enable switch. - * @details If set to @p TRUE the support for USART1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8L_SERIAL_USE_USART1) || defined(__DOXYGEN__) -#define STM8L_SERIAL_USE_USART1 TRUE -#endif - -/** - * @brief USART2 driver enable switch. - * @details If set to @p TRUE the support for USART3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8L_SERIAL_USE_USART2) || defined(__DOXYGEN__) -#define STM8L_SERIAL_USE_USART2 TRUE -#endif - -/** - * @brief USART3 driver enable switch. - * @details If set to @p TRUE the support for USART3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8L_SERIAL_USE_USART3) || defined(__DOXYGEN__) -#define STM8L_SERIAL_USE_USART3 TRUE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM8L_SERIAL_USE_USART1 && !STM8L_HAS_USART1 -#error "USART1 not present in the selected device" -#endif - -#if STM8L_SERIAL_USE_USART2 && !STM8L_HAS_USART2 -#error "USART2 not present in the selected device" -#endif - -#if STM8L_SERIAL_USE_USART3 && !STM8L_HAS_USART3 -#error "USART3 not present in the selected device" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Generic Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { - /** - * @brief Bit rate register. - */ - uint16_t sc_brr; - /** - * @brief Mode flags. - */ - uint8_t sc_mode; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - USART_TypeDef *usart; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Macro for baud rate computation. - * @note Make sure the final baud rate is within tolerance. - */ -#define BRR(b) (SYSCLK / (b)) - -#if STM8L_SERIAL_USE_USART1 || defined(__DOXYGEN__) -/** - * @brief USART1 RX interrupt handler segment. - */ -#define _USART1_RECEIVE_ISR() { \ - uint8_t sr = USART1->SR; \ - if (sr & (USART_SR_RXNE | USART_SR_OR | USART_SR_NF | \ - USART_SR_FE | USART_SR_PE)) { \ - if (sr & (USART_SR_OR | USART_SR_NF | USART_SR_FE | USART_SR_PE)) \ - sd_lld_set_error(&SD1, sr); \ - chSysLockFromIsr(); \ - sdIncomingDataI(&SD1, USART1->DR); \ - chSysUnlockFromIsr(); \ - } \ -} - -/** - * @brief USART1 TX interrupt handler segment. - */ -#define _USART1_TRANSMIT_ISR() { \ - if (USART1->SR & USART_SR_TXE) { \ - msg_t b; \ - chSysLockFromIsr(); \ - b = sdRequestDataI(&SD1); \ - chSysUnlockFromIsr(); \ - if (b < Q_OK) \ - USART1->CR2 &= (uint8_t)~USART_CR2_TIEN; \ - else \ - USART1->DR = (uint8_t)b; \ - } \ -} -#endif /* STM8L_SERIAL_USE_USART1 */ - -#if STM8L_SERIAL_USE_USART2 || defined(__DOXYGEN__) -/** - * @brief USART2 RX interrupt handler segment. - */ -#define _USART2_RECEIVE_ISR() { \ - uint8_t sr = USART2->SR; \ - if (sr & (USART_SR_RXNE | USART_SR_OR | USART_SR_NF | \ - USART_SR_FE | USART_SR_PE)) { \ - if (sr & (USART_SR_OR | USART_SR_NF | USART_SR_FE | USART_SR_PE)) \ - sd_lld_set_error(&SD2, sr); \ - chSysLockFromIsr(); \ - sdIncomingDataI(&SD2, USART2->DR); \ - chSysUnlockFromIsr(); \ - } \ -} - -/** - * @brief USART2 TX interrupt handler segment. - */ -#define _USART2_TRANSMIT_ISR() { \ - if (USART2->SR & USART_SR_TXE) { \ - msg_t b; \ - chSysLockFromIsr(); \ - b = sdRequestDataI(&SD2); \ - chSysUnlockFromIsr(); \ - if (b < Q_OK) \ - USART2->CR2 &= (uint8_t)~USART_CR2_TIEN; \ - else \ - USART2->DR = (uint8_t)b; \ - } \ -} -#endif /* STM8L_SERIAL_USE_USART2 */ - -#if STM8L_SERIAL_USE_USART3 || defined(__DOXYGEN__) -/** - * @brief USART3 RX interrupt handler segment. - */ -#define _USART3_RECEIVE_ISR() { \ - uint8_t sr = USART3->SR; \ - if (sr & (USART_SR_RXNE | USART_SR_OR | USART_SR_NF | \ - USART_SR_FE | USART_SR_PE)) { \ - if (sr & (USART_SR_OR | USART_SR_NF | USART_SR_FE | USART_SR_PE)) \ - sd_lld_set_error(&SD3, sr); \ - chSysLockFromIsr(); \ - sdIncomingDataI(&SD3, USART3->DR); \ - chSysUnlockFromIsr(); \ - } \ -} - -/** - * @brief USART3 TX interrupt handler segment. - */ -#define _USART3_TRANSMIT_ISR() { \ - if (USART3->SR & USART_SR_TXE) { \ - msg_t b; \ - chSysLockFromIsr(); \ - b = sdRequestDataI(&SD3); \ - chSysUnlockFromIsr(); \ - if (b < Q_OK) \ - USART3->CR2 &= (uint8_t)~USART_CR2_TIEN; \ - else \ - USART3->DR = (uint8_t)b; \ - } \ -} -#endif /* STM8L_SERIAL_USE_USART3 */ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM8L_SERIAL_USE_USART1 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if STM8L_SERIAL_USE_USART2 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif -#if STM8L_SERIAL_USE_USART3 && !defined(__DOXYGEN__) -extern SerialDriver SD3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); - void sd_lld_set_error(SerialDriver *sdp, uint8_t sr); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/shared_isr.c b/os/hal/platforms/STM8L/shared_isr.c deleted file mode 100644 index 70a8ea7e5c..0000000000 --- a/os/hal/platforms/STM8L/shared_isr.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8L/shared_isr.c - * @brief STM8L shared interrupt code source. - * @details The STM8L shares some interrupt handlers among several sources. - * This module includes all the interrupt handlers that are - * used by more than one peripheral. - * @note Only the interrupt handlers that are used by the HAL are defined - * in this module. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/* This inclusion allows user ISR to be added to the HAL.*/ -#if defined(_USER_ISR_) -#include "user_isr.h" -#endif - -#if defined(_TIM2_UPDATE_ISR) || defined(_USART2_TRANSMIT_ISR) || \ - defined(__DOXYGEN__) -/** - * @brief IRQ 19 service routine. - * @details This handler is shared between the following sources: - * - TIM2 update/overflow/trigger/break. - * - USART2 transmit. - * . - * - * @isr - */ -CH_IRQ_HANDLER(19) { - CH_IRQ_PROLOGUE(); - -#if defined(_TIM2_UPDATE_ISR) - _TIM2_UPDATE_ISR(); -#endif -#if defined(_USART2_TRANSMIT_ISR) - _USART2_TRANSMIT_ISR(); -#endif - - CH_IRQ_EPILOGUE(); -} -#endif /* defined(_TIM2_UPDATE_ISR) || defined(_USART2_TRANSMIT_ISR) */ - -#if defined(_TIM2_COMPARE_ISR) || defined(_USART2_RECEIVE_ISR) || \ - defined(__DOXYGEN__) -/** - * @brief IRQ 20 service routine. - * @details This handler is shared between the following sources: - * - TIM2 compare/capture - * - USART2 receive. - * . - * - * @isr - */ -CH_IRQ_HANDLER(20) { - CH_IRQ_PROLOGUE(); - -#if defined(_TIM2_COMPARE_ISR) - _TIM2_COMPARE_ISR(); -#endif -#if defined(_USART2_RECEIVE_ISR) - _USART2_RECEIVE_ISR(); -#endif - - CH_IRQ_EPILOGUE(); -} -#endif /* defined(_TIM2_COMPARE_ISR) || defined(_USART2_RECEIVE_ISR) */ - -#if defined(_TIM3_UPDATE_ISR) || defined(_USART3_TRANSMIT_ISR) || \ - defined(__DOXYGEN__) -/** - * @brief IRQ 21 service routine. - * @details This handler is shared between the following sources: - * - TIM3 update/overflow/trigger/break. - * - USART3 transmit. - * . - * - * @isr - */ -CH_IRQ_HANDLER(21) { - CH_IRQ_PROLOGUE(); - -#if defined(_TIM3_UPDATE_ISR) - _TIM3_UPDATE_ISR(); -#endif -#if defined(_USART3_TRANSMIT_ISR) - _USART3_TRANSMIT_ISR(); -#endif - - CH_IRQ_EPILOGUE(); -} -#endif /* defined(_TIM3_UPDATE_ISR) || defined(_USART3_TRANSMIT_ISR) */ - -#if defined(_TIM3_COMPARE_ISR) || defined(_USART3_RECEIVE_ISR) || \ - defined(__DOXYGEN__) -/** - * @brief IRQ 22 service routine. - * @details This handler is shared between the following sources: - * - TIM3 compare/capture - * - USART3 receive. - * . - * - * @isr - */ -CH_IRQ_HANDLER(22) { - CH_IRQ_PROLOGUE(); - -#if defined(_TIM3_COMPARE_ISR) - _TIM3_COMPARE_ISR(); -#endif -#if defined(_USART3_RECEIVE_ISR) - _USART3_RECEIVE_ISR(); -#endif - - CH_IRQ_EPILOGUE(); -} -#endif /* defined(_TIM3_COMPARE_ISR) || defined(_USART3_RECEIVE_ISR) */ - -#if defined(_TIM5_UPDATE_ISR) || defined(_USART1_TRANSMIT_ISR) || \ - defined(__DOXYGEN__) -/** - * @brief IRQ 27 service routine. - * @details This handler is shared between the following sources: - * - TIM5 update/overflow/trigger/break. - * - USART1 transmit. - * . - * - * @isr - */ -CH_IRQ_HANDLER(27) { - CH_IRQ_PROLOGUE(); - -#if defined(_TIM5_UPDATE_ISR) - _TIM5_UPDATE_ISR(); -#endif -#if defined(_USART1_TRANSMIT_ISR) - _USART1_TRANSMIT_ISR(); -#endif - - CH_IRQ_EPILOGUE(); -} -#endif /* defined(_TIM5_UPDATE_ISR) || defined(_USART1_TRANSMIT_ISR) */ - -#if defined(_TIM5_COMPARE_ISR) || defined(_USART1_RECEIVE_ISR) || \ - defined(__DOXYGEN__) -/** - * @brief IRQ 28 service routine. - * @details This handler is shared between the following sources: - * - TIM5 compare/capture - * - USART1 receive. - * . - * - * @isr - */ -CH_IRQ_HANDLER(28) { - CH_IRQ_PROLOGUE(); - -#if defined(_TIM5_COMPARE_ISR) - _TIM5_COMPARE_ISR(); -#endif -#if defined(_USART1_RECEIVE_ISR) - _USART1_RECEIVE_ISR(); -#endif - - CH_IRQ_EPILOGUE(); -} -#endif /* defined(_TIM5_COMPARE_ISR) || defined(_USART1_RECEIVE_ISR) */ - -/** @} */ diff --git a/os/hal/platforms/STM8L/stm8l15x.h b/os/hal/platforms/STM8L/stm8l15x.h deleted file mode 100644 index 6971a9da5d..0000000000 --- a/os/hal/platforms/STM8L/stm8l15x.h +++ /dev/null @@ -1,3000 +0,0 @@ -/** - ****************************************************************************** - * @file stm8l15x.h - * @author MCD Application Team - * @version V1.5.0 - * @date 13-May-2011 - * @brief This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM8L15x devices. - ****************************************************************************** - * @attention - * - * 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. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM8L15x_H - #define __STM8L15x_H - -/** @addtogroup STM8L15x_StdPeriph_Driver - * @{ - */ -/* Uncomment the line below according to the target STM8L15x device used in your - application - */ -/* #define STM8L15X_LD */ /*!< STM8L15X_LD: STM8L15x Low density devices */ -/* #define STM8L15X_MD */ /*!< STM8L15X_MD: STM8L15x Medium density devices */ -/* #define STM8L15X_MDP */ /*!< STM8L15X_MDP: STM8L15x Medium density plus devices */ -/* #define STM8L15X_HD */ /*!< STM8L15X_HD: STM8L15x/16x High density devices */ - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - - - Low density STM8L15x devices are STM8L151C3, STM8L151K3, STM8L151G3, STM8L151F3, - STM8L151C2, STM8L151K2, STM8L151G2 and STM8L151F2 microcontrollers where the - Flash memory density ranges between 4 and 8 Kbytes. - - Medium density STM8L15x devices are STM8L151C4, STM8L151C6, STM8L152C4, - STM8L152C6, STM8L151K4, STM8L151K6, STM8L152K4, STM8L152K6, STM8L151G4, - STM8L151G6, STM8L152G4 and STM8L152G6 microcontrollers where the Flash memory - density ranges between 16 and 32 Kbytes. - - Medium density Plus devices are STM8L151R6, STM8L152R6 microcontrollers where - the Flash memory density is fixed and equal to 32 Kbytes and a wider range of - peripheral than the medium density devices. - - High density STM8L15x devices are STM8L151x8, STM8L152x8, STM8L162R8 and STM8L162M8 - microcontrollers where the Flash memory density is fixed and equal to 64 Kbytes with - the same peripheral set than Medium Density Plus devices. - - */ - -#if !defined (STM8L15X_MD) && !defined (STM8L15X_MDP) && !defined (STM8L15X_HD) && !defined (STM8L15X_LD) - #error "Please select first the target STM8L device used in your application (in stm8l15x.h file)" -#endif - -/******************************************************************************/ -/* Library configuration section */ -/******************************************************************************/ -/* Check the used compiler */ -#if defined(__CSMC__) - #define _COSMIC_ -#elif defined(__RCST7__) - #define _RAISONANCE_ -#elif defined(__ICCSTM8__) - #define _IAR_ -#else - #error "Unsupported Compiler!" /* Compiler defines not found */ -#endif - -#if !defined USE_STDPERIPH_DRIVER -/* Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will be - based on direct access to peripherals registers */ -/* CHIBIOS FIX */ -/* #define USE_STDPERIPH_DRIVER*/ -#endif - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined HSE_Value - #define HSE_VALUE ((uint32_t)16000000) /*!< Typical Value of the HSE in Hz */ -#endif /* HSE_Value */ - -/** - * @brief Definition of External Low Speed oscillator (LSE) frequency - */ -#define LSE_VALUE ((uint32_t)32768) /*!< Typical Value of the LSE in Hz */ - -/** - * @brief Definition of Device on-chip RC oscillator frequencies - */ -#define HSI_VALUE ((uint32_t)16000000) /*!< Typical Value of the HSI in Hz */ -#define LSI_VALUE ((uint32_t)38000) /*!< Typical Value of the LSI in Hz */ - -#ifdef _COSMIC_ - #define FAR @far - #define NEAR @near - #define TINY @tiny - #define EEPROM @eeprom - #define CONST const -#elif defined (_RAISONANCE_) /* __RCST7__ */ - #define FAR far - #define NEAR data - #define TINY page0 - #define EEPROM eeprom - #define CONST code - #if defined (STM8L15X_MD) || defined (STM8L15X_MDP) - /*!< Used with memory Models for code less than 64K */ - #define MEMCPY memcpy - #else /* STM8L15X_HD */ - /*!< Used with memory Models for code higher than 64K */ - #define MEMCPY fmemcpy - #endif /* STM8L15X_MD or STM8L15X_MDP */ -#else /*_IAR_*/ - #define FAR __far - #define NEAR __near - #define TINY __tiny - #define EEPROM __eeprom - #define CONST const -#endif /* __CSMC__ */ - -/** - * @brief Legacy definition - */ -#define __CONST CONST - -#if defined (STM8L15X_MD) || defined (STM8L15X_MDP) || defined (STM8L15X_LD) -/*!< Used with memory Models for code smaller than 64K */ - #define PointerAttr NEAR -#else /* STM8L15X_HD */ -/*!< Used with memory Models for code higher than 64K */ - #define PointerAttr FAR -#endif /* STM8L15X_MD or STM8L15X_MDP or STM8L15X_LD*/ - -/* Uncomment the line below to enable the FLASH functions execution from RAM */ -#if !defined (RAM_EXECUTION) -/* #define RAM_EXECUTION (1) */ -#endif /* RAM_EXECUTION */ - -#ifdef RAM_EXECUTION - #ifdef _COSMIC_ - #define IN_RAM(a) a - #elif defined (_RAISONANCE_) /* __RCST7__ */ - #define IN_RAM(a) a inram - #else /*_IAR_*/ - #define IN_RAM(a) __ramfunc a - #endif /* _COSMIC_ */ -#else - #define IN_RAM(a) a -#endif /* RAM_EXECUTION */ - -/*!< [31:16] STM8L15X Standard Peripheral Library main version */ -#define __STM8L15X_STDPERIPH_VERSION_MAIN ((uint8_t)0x01) /*!< [31:24] main version */ -#define __STM8L15X_STDPERIPH_VERSION_SUB1 ((uint8_t)0x05) /*!< [23:16] sub1 version */ -#define __STM8L15X_STDPERIPH_VERSION_SUB2 ((uint8_t)0x00) /*!< [15:8] sub2 version */ -#define __STM8L15X_STDPERIPH_VERSION_RC ((uint8_t)0x00) /*!< [7:0] release candidate */ -#define __STM8L15X_STDPERIPH_VERSION ( (__STM8L15X_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM8L15X_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM8L15X_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM8L15X_STDPERIPH_VERSION_RC)) - -/******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ - -/* Exported types and constants ----------------------------------------------*/ - -/** @addtogroup Exported_types - * @{ - */ - -/** - * IO definitions - * - * define access restrictions to peripheral registers - */ -#define __I volatile const /*!< defines 'read only' permissions */ -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/* CHIBIOS FIX */ -#if 0 -/*!< Signed integer types */ -typedef signed char int8_t; -typedef signed short int16_t; -typedef signed long int32_t; - -/*!< Unsigned integer types */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned long uint32_t; -#endif - -/*!< STM8Lx Standard Peripheral Library old types (maintained for legacy purpose) */ - -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - - -typedef enum {FALSE = 0, TRUE = !FALSE} bool; - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction; - -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 (255) -#define S8_MAX (127) -#define S8_MIN (-128) -#define U16_MAX (65535u) -#define S16_MAX (32767) -#define S16_MIN (-32768) -#define U32_MAX (4294967295uL) -#define S32_MAX (2147483647) -#define S32_MIN (-2147483648uL) - -/** - * @} - */ - -/** @addtogroup MAP_FILE_Exported_Types_and_Constants - * @{ - */ - -/******************************************************************************/ -/* IP registers structures */ -/******************************************************************************/ - -/*----------------------------------------------------------------------------*/ -/** - * @brief General Purpose I/Os (GPIO) - */ -typedef struct GPIO_struct -{ - __IO uint8_t ODR; /*!< Output Data Register */ - __IO uint8_t IDR; /*!< Input Data Register */ - __IO uint8_t DDR; /*!< Data Direction Register */ - __IO uint8_t CR1; /*!< Configuration Register 1 */ - __IO uint8_t CR2; /*!< Configuration Register 2 */ -} -GPIO_TypeDef; - -/** @addtogroup GPIO_Registers_Reset_Value - * @{ - */ -#define GPIO_ODR_RESET_VALUE ((uint8_t)0x00) -#define GPIO_DDR_RESET_VALUE ((uint8_t)0x00) -#define GPIO_CR1_RESET_VALUE ((uint8_t)0x00) -#define GPIO_CR2_RESET_VALUE ((uint8_t)0x00) -/** - * @} - */ -/*----------------------------------------------------------------------------*/ - -/** - * @brief Real-Time Clock (RTC) peripheral registers. - */ -typedef struct RTC_struct -{ - __IO uint8_t TR1; /*!< Time Register 1*/ - __IO uint8_t TR2; /*!< Time Register 2*/ - __IO uint8_t TR3; /*!< Time Register 3*/ - - uint8_t RESERVED0; - - __IO uint8_t DR1; /*!< Date Register 1*/ - __IO uint8_t DR2; /*!< Date Register 2*/ - __IO uint8_t DR3; /*!< Date Register 3*/ - - uint8_t RESERVED1; - - __IO uint8_t CR1; /*!< Control Register 1*/ - __IO uint8_t CR2; /*!< Control Register 2*/ - __IO uint8_t CR3; /*!< Control Register 3*/ - - uint8_t RESERVED2; - - __IO uint8_t ISR1; /*!< Initialisation and Status Register 1 */ - __IO uint8_t ISR2; /*!< Initialisation and Status Register 2 */ - - uint8_t RESERVED3; - uint8_t RESERVED4; - - __IO uint8_t SPRERH; /*!< Synchronous Prediv high Register */ - __IO uint8_t SPRERL; /*!< Synchronous Prediv Low Register */ - __IO uint8_t APRER; /*!< Asynchronous Prediv Register */ - - uint8_t RESERVED5; - - __IO uint8_t WUTRH; /*!< Wake-Up Timer High Register */ - __IO uint8_t WUTRL; /*!< Wake-Up Timer Low Register */ - - uint8_t RESERVED6; - - __IO uint8_t SSRH; /*!< Sub Second High Register */ - __IO uint8_t SSRL; /*!< Sub Second Low Register */ - - __IO uint8_t WPR; /*!< Write Protection Register */ - - __IO uint8_t SHIFTRH; /*!< Shift control High Register */ - __IO uint8_t SHIFTRL; /*!< Shift control Low Register */ - - __IO uint8_t ALRMAR1; /*!< ALARM A Register 1 */ - __IO uint8_t ALRMAR2; /*!< ALARM A Register 2 */ - __IO uint8_t ALRMAR3; /*!< ALARM A Register 3 */ - __IO uint8_t ALRMAR4; /*!< ALARM A Register 4 */ - - uint8_t RESERVED7[4]; - - __IO uint8_t ALRMASSRH; /*!< ALARM A Subsecond Register High */ - __IO uint8_t ALRMASSRL; /*!< ALARM A Subsecond Register Low */ - __IO uint8_t ALRMASSMSKR; /*!< ALARM A Subsecond Mask Register */ - - uint8_t RESERVED8[3]; - - __IO uint8_t CALRH; /*!< Calibration register high */ - __IO uint8_t CALRL; /*!< Calibration register low */ - - __IO uint8_t TCR1; /*!< Tamper control register 1 */ - __IO uint8_t TCR2; /*!< Tamper control register 2 */ -} -RTC_TypeDef; - -/** @addtogroup RTC_Registers_Reset_Value - * @{ - */ -#define RTC_TR1_RESET_VALUE ((uint8_t)0x00) -#define RTC_TR2_RESET_VALUE ((uint8_t)0x00) -#define RTC_TR3_RESET_VALUE ((uint8_t)0x00) - -#define RTC_DR1_RESET_VALUE ((uint8_t)0x01) -#define RTC_DR2_RESET_VALUE ((uint8_t)0x21) -#define RTC_DR3_RESET_VALUE ((uint8_t)0x00) - -#define RTC_CR1_RESET_VALUE ((uint8_t)0x00) -#define RTC_CR2_RESET_VALUE ((uint8_t)0x00) -#define RTC_CR3_RESET_VALUE ((uint8_t)0x00) - -#define RTC_ISR1_RESET_VALUE ((uint8_t)0x07) -#define RTC_ISR2_RESET_VALUE ((uint8_t)0x00) - -#define RTC_SPRERH_RESET_VALUE ((uint8_t)0x00) -#define RTC_SPRERL_RESET_VALUE ((uint8_t)0xFF) -#define RTC_APRER_RESET_VALUE ((uint8_t)0x7F) - -#define RTC_WUTRH_RESET_VALUE ((uint8_t)0xFF) -#define RTC_WUTRL_RESET_VALUE ((uint8_t)0xFF) - -#define RTC_WPR_RESET_VALUE ((uint8_t)0x00) - -#define RTC_ALRMAR1_RESET_VALUE ((uint8_t)0x00) -#define RTC_ALRMAR2_RESET_VALUE ((uint8_t)0x00) -#define RTC_ALRMAR3_RESET_VALUE ((uint8_t)0x00) -#define RTC_ALRMAR4_RESET_VALUE ((uint8_t)0x00) - -#define RTC_SHIFTRH_RESET_VALUE ((uint8_t)0x00) -#define RTC_SHIFTRL_RESET_VALUE ((uint8_t)0x00) - -#define RTC_ALRMASSRH_RESET_VALUE ((uint8_t)0x00) -#define RTC_ALRMASSRL_RESET_VALUE ((uint8_t)0x00) -#define RTC_ALRMASSMSKR_RESET_VALUE ((uint8_t)0x00) - -#define RTC_CALRH_RESET_VALUE ((uint8_t)0x00) -#define RTC_CALRL_RESET_VALUE ((uint8_t)0x00) - -#define RTC_TCR1_RESET_VALUE ((uint8_t)0x00) -#define RTC_TCR2_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup RTC_Registers_Bits_Definition - * @{ - */ - -/* Bits definition for RTC_TR1 register*/ -#define RTC_TR1_ST ((uint8_t)0x70) -#define RTC_TR1_SU ((uint8_t)0x0F) - -/* Bits definition for RTC_TR2 register*/ -#define RTC_TR2_MNT ((uint8_t)0x70) -#define RTC_TR2_MNU ((uint8_t)0x0F) - -/* Bits definition for RTC_TR3 register*/ -#define RTC_TR3_PM ((uint8_t)0x40) -#define RTC_TR3_HT ((uint8_t)0x30) -#define RTC_TR3_HU ((uint8_t)0x0F) - -/* Bits definition for RTC_DR1 register*/ -#define RTC_DR1_DT ((uint8_t)0x30) -#define RTC_DR1_DU ((uint8_t)0x0F) - -/* Bits definition for RTC_DR2 register*/ -#define RTC_DR2_WDU ((uint8_t)0xE0) -#define RTC_DR2_MT ((uint8_t)0x10) -#define RTC_DR2_MU ((uint8_t)0x0F) - -/* Bits definition for RTC_DR3 register*/ -#define RTC_DR3_YT ((uint8_t)0xF0) -#define RTC_DR3_YU ((uint8_t)0x0F) - -/* Bits definition for RTC_CR1 register*/ -#define RTC_CR1_FMT ((uint8_t)0x40) -#define RTC_CR1_RATIO ((uint8_t)0x20) -#define RTC_CR1_WUCKSEL ((uint8_t)0x07) -#define RTC_CR1_BYPSHAD ((uint8_t)0x10) - - -/* Bits definition for RTC_CR2 register*/ -#define RTC_CR2_WUTIE ((uint8_t)0x40) -#define RTC_CR2_ALRAIE ((uint8_t)0x10) -#define RTC_CR2_WUTE ((uint8_t)0x04) -#define RTC_CR2_ALRAE ((uint8_t)0x01) -#define RTC_CR2_ALRIE ((uint8_t)0x20) - - - -/* Bits definition for RTC_CR3 register*/ -#define RTC_CR3_COE ((uint8_t)0x80) -#define RTC_CR3_OSEL ((uint8_t)0x60) -#define RTC_CR3_POL ((uint8_t)0x10) -#define RTC_CR3_COSEL ((uint8_t)0x08) -#define RTC_CR3_BCK ((uint8_t)0x04) -#define RTC_CR3_SUB1H ((uint8_t)0x02) -#define RTC_CR3_ADD1H ((uint8_t)0x01) - - -/* Bits definition for RTC_ISR1 register*/ -#define RTC_ISR1_INIT ((uint8_t)0x80) -#define RTC_ISR1_INITF ((uint8_t)0x40) -#define RTC_ISR1_RSF ((uint8_t)0x20) -#define RTC_ISR1_INITS ((uint8_t)0x10) -#define RTC_ISR1_SHPF ((uint8_t)0x08) -#define RTC_ISR1_WUTWF ((uint8_t)0x04) -#define RTC_ISR1_RECALPF ((uint8_t)0x02) -#define RTC_ISR1_ALRAWF ((uint8_t)0x01) - - -/* Bits definition for RTC_ISR2 register*/ -#define RTC_ISR2_WUTF ((uint8_t)0x04) -#define RTC_ISR2_ALRAF ((uint8_t)0x01) -#define RTC_ISR2_TAMP3F ((uint8_t)0x80) -#define RTC_ISR2_TAMP2F ((uint8_t)0x40) -#define RTC_ISR2_TAMP1F ((uint8_t)0x20) - -/* Bits definition for RTC_SHIFTRH register*/ -#define RTC_SHIFTRH_ADD1S ((uint8_t)0x80) -#define RTC_SHIFTRH_SUBFS ((uint8_t)0x7F) - -/* Bits definition for RTC_SHIFTRL register*/ -#define RTC_SHIFTRL_SUBFS ((uint8_t)0xFF) - - -/* Bits definition for RTC_ALRMAR1 register*/ -#define RTC_ALRMAR1_MSK1 ((uint8_t)0x80) -#define RTC_ALRMAR1_ST ((uint8_t)0x70) -#define RTC_ALRMAR1_SU ((uint8_t)0x0F) - -/* Bits definition for RTC_ALRMAR2 register*/ -#define RTC_ALRMAR2_MSK2 ((uint8_t)0x80) -#define RTC_ALRMAR2_MNT ((uint8_t)0x70) -#define RTC_ALRMAR2_MNU ((uint8_t)0x0F) - -/* Bits definition for RTC_ALRMAR3 register*/ -#define RTC_ALRMAR3_MSK3 ((uint8_t)0x80) -#define RTC_ALRMAR3_PM ((uint8_t)0x40) -#define RTC_ALRMAR3_HT ((uint8_t)0x30) -#define RTC_ALRMAR3_HU ((uint8_t)0x0F) - -/* Bits definition for RTC_ALRMAR4 register*/ -#define RTC_ALRMAR4_MSK4 ((uint8_t)0x80) -#define RTC_ALRMAR4_WDSEL ((uint8_t)0x40) -#define RTC_ALRMAR4_DT ((uint8_t)0x30) -#define RTC_ALRMAR4_DU ((uint8_t)0x0F) - -/* Bits definition for RTC_ALRMASSRH register*/ -#define RTC_ALRMASSRH_ALSS ((uint8_t)0x7F) - -/* Bits definition for RTC_ALRMASSRL register*/ -#define RTC_ALRMASSRL_ALSS ((uint8_t)0xFF) - -/* Bits definition for RTC_ALRMASSMSKR register*/ -#define RTC_ALRMASSMSKR_MASKSS ((uint8_t)0x1F) - - -/* Bits definition for RTC_CALRH register*/ -#define RTC_CALRH_CALP ((uint8_t)0x80) -#define RTC_CALRH_CALW8 ((uint8_t)0x40) -#define RTC_CALRH_CALW16 ((uint8_t)0x20) -#define RTC_CALRH_CALWx ((uint8_t)0x60) -#define RTC_CALRH_CALM ((uint8_t)0x01) - -/* Bits definition for RTC_CALRL register*/ -#define RTC_CALRL_CALM ((uint8_t)0xFF) - -/* Bits definition for RTC_TCR1 register*/ -#define RTC_TCR1_TAMP3LEVEL ((uint8_t)0x40) -#define RTC_TCR1_TAMP3E ((uint8_t)0x20) -#define RTC_TCR1_TAMP2LEVEL ((uint8_t)0x10) -#define RTC_TCR1_TAMP2E ((uint8_t)0x08) -#define RTC_TCR1_TAMP1LEVEL ((uint8_t)0x04) -#define RTC_TCR1_TAMP1E ((uint8_t)0x02) -#define RTC_TCR1_TAMPIE ((uint8_t)0x01) - -/* Bits definition for RTC_TCR2 register*/ -#define RTC_TCR2_TAMPPUDIS ((uint8_t)0x80) -#define RTC_TCR2_TAMPPRCH ((uint8_t)0x60) -#define RTC_TCR2_TAMPFLT ((uint8_t)0x18) -#define RTC_TCR2_TAMPFREQ ((uint8_t)0x07) - - -/*RTC special defines */ -#define RTC_WPR_EnableKey ((uint8_t)0xFF) -#define RTC_WPR_DisableKey1 ((uint8_t)0xCA) -#define RTC_WPR_DisableKey2 ((uint8_t)0x53) - -/** - * @} - */ - -/** - * @brief CSS on LSE registers. - */ -typedef struct CSSLSE_struct -{ - __IO uint8_t CSR; /*!< Control and Status Register*/ -} -CSSLSE_TypeDef; - -/** @addtogroup CSSLSE_Registers_Reset_Value - * @{ - */ -#define CSSLSE_CSR_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup CSSLSE_Registers_Bits_Definition - * @{ - */ - -/* Bits definition for CSSLSE_CSR register*/ -#define CSSLSE_CSR_SWITCHF ((uint8_t)0x10) -#define CSSLSE_CSR_CSSF ((uint8_t)0x08) -#define CSSLSE_CSR_CSSIE ((uint8_t)0x04) -#define CSSLSE_CSR_SWITCHEN ((uint8_t)0x02) -#define CSSLSE_CSR_CSSEN ((uint8_t)0x01) - -/** - * @} - */ -/*----------------------------------------------------------------------------*/ -/** - * @brief Beeper (BEEP) peripheral registers. - */ - -typedef struct BEEP_struct -{ - __IO uint8_t CSR1; /*!< BEEP Control status register1 */ - uint8_t RSERVED1; - uint8_t RESERVED2; - __IO uint8_t CSR2; /*!< BEEP Control status register2 */ -} -BEEP_TypeDef; - -/** @addtogroup BEEP_Registers_Reset_Value - * @{ - */ -#define BEEP_CSR1_RESET_VALUE ((uint8_t)0x00) -#define BEEP_CSR2_RESET_VALUE ((uint8_t)0x1F) - -/** - * @} - */ - -/** @addtogroup BEEP_Registers_Bits_Definition - * @{ - */ - -#define BEEP_CSR1_MSR ((uint8_t)0x01) /*!< Measurement enable mask */ - -#define BEEP_CSR2_BEEPSEL ((uint8_t)0xC0) /*!< Beeper frequency selection mask */ -#define BEEP_CSR2_BEEPEN ((uint8_t)0x20) /*!< Beeper enable mask */ -#define BEEP_CSR2_BEEPDIV ((uint8_t)0x1F) /*!< Beeper Divider prescalar mask */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------ok*/ - -/** - * @brief Configuration Registers (CFG) - */ - -typedef struct CFG_struct -{ - __IO uint8_t GCR; /*!< Global Configuration register */ -} -CFG_TypeDef; - -/** @addtogroup CFG_Registers_Reset_Value - * @{ - */ - -#define CFG_GCR_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup CFG_Registers_Bits_Definition - * @{ - */ - -#define CFG_GCR_SWD ((uint8_t)0x01) /*!< Swim disable bit mask */ -#define CFG_GCR_AL ((uint8_t)0x02) /*!< Activation Level bit mask */ - -/** - * @} - */ -/*----------------------------------------------------------------------------ok*/ - -/** - * @brief SYSCFG - */ - -typedef struct SYSCFG_struct -{ - __IO uint8_t RMPCR3; /*!< Remap control register 3 */ - __IO uint8_t RMPCR1; /*!< Remap control register 1 */ - __IO uint8_t RMPCR2; /*!< Remap control register 2 */ -} -SYSCFG_TypeDef; - -/** @addtogroup SYSCFG_Registers_Reset_Value - * @{ - */ -#define SYSCFG_RMPCR1_RESET_VALUE ((uint8_t)0x0C) -#define SYSCFG_RMPCR2_RESET_VALUE ((uint8_t)0x00) -#define SYSCFG_RMPCR3_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup SYSCFG_Registers_Bits_Definition - * @{ - */ - -/* For DMA Channel Mapping*/ -#define SYSCFG_RMPCR1_ADC1DMA_REMAP ((uint8_t)0x03) /*!< ADC1 DMA channel remapping */ -#define SYSCFG_RMPCR1_TIM4DMA_REMAP ((uint8_t)0x0C) /*!< TIM4 DMA channel remapping */ - - -/* For GPIO Reapping*/ -#define SYSCFG_RMPCR1_USART1TR_REMAP ((uint8_t)0x30) /*!< USART1_TX and USART1_RX remapping */ -#define SYSCFG_RMPCR1_USART1CK_REMAP ((uint8_t)0x40) /*!< USART1_CK remapping */ -#define SYSCFG_RMPCR1_SPI1_REMAP ((uint8_t)0x80) /*!< SPI1 remapping */ - -#define SYSCFG_RMPCR2_ADC1TRIG_REMAP ((uint8_t)0x01) /*!< ADC1 External Trigger remap */ -#define SYSCFG_RMPCR2_TIM2TRIG_REMAP ((uint8_t)0x02) /*!< TIM2 Trigger remap */ -#define SYSCFG_RMPCR2_TIM3TRIG_REMAP1 ((uint8_t)0x04) /*!< TIM3 Trigger remap 1 */ -#define SYSCFG_RMPCR2_TIM2TRIG_LSE ((uint8_t)0x08) /*!< TIM2 Trigger remap to LSE */ -#define SYSCFG_RMPCR2_TIM3TRIG_LSE ((uint8_t)0x10) /*!< TIM3 Trigger remap to LSE */ -#define SYSCFG_RMPCR2_SPI2_REMAP ((uint8_t)0x20) /*!< SPI2 remapping */ -#define SYSCFG_RMPCR2_TIM3TRIG_REMAP2 ((uint8_t)0x40) /*!< TIM3 Trigger remap 2 */ -#define SYSCFG_RMPCR2_TIM23BKIN_REMAP ((uint8_t)0x80) /*!< TIM2 & TIM3 Break input remap */ - -#define SYSCFG_RMPCR3_SPI1_REMAP ((uint8_t)0x01) /*!< SPI1 remapping */ -#define SYSCFG_RMPCR3_USART3TR_REMAP ((uint8_t)0x02) /*!< USART3_TX and USART3_RX remapping */ -#define SYSCFG_RMPCR3_USART3CK_REMAP ((uint8_t)0x04) /*!< USART3_CK remapping */ -#define SYSCFG_RMPCR3_TIM3CH1_REMAP ((uint8_t)0x08) /*!< TIM3 channel 1 remapping */ -#define SYSCFG_RMPCR3_TIM3CH2_REMAP ((uint8_t)0x10) /*!< TIM3 channel 2 remapping */ -#define SYSCFG_RMPCR3_CCO_REMAP ((uint8_t)0x20) /*!< CCO remapping */ - -/** - * @} - */ -/*----------------------------------------------------------------------------ok*/ - -/** - * @brief Clock Controller (CLK) - */ -typedef struct CLK_struct -{ - __IO uint8_t CKDIVR; /*!< Clock Master Divider Register */ - __IO uint8_t CRTCR; /*!< RTC Clock selection Register */ - __IO uint8_t ICKCR; /*!< Internal Clocks Control Register */ - __IO uint8_t PCKENR1; /*!< Peripheral Clock Gating Register 1 */ - __IO uint8_t PCKENR2; /*!< Peripheral Clock Gating Register 2 */ - __IO uint8_t CCOR; /*!< Configurable Clock Output Register */ - __IO uint8_t ECKCR; /*!< External Clocks Control Register */ - __IO uint8_t SCSR; /*!< System clock status Register */ - __IO uint8_t SWR; /*!< System clock Switch Register */ - __IO uint8_t SWCR; /*!< Switch Control Register */ - __IO uint8_t CSSR; /*!< Clock Security Sytem Register */ - __IO uint8_t CBEEPR; /*!< Clock BEEP Register */ - __IO uint8_t HSICALR; /*!< HSI Calibration Register */ - __IO uint8_t HSITRIMR; /*!< HSI clock Calibration Trimmer Register */ - __IO uint8_t HSIUNLCKR; /*!< HSI Unlock Register */ - __IO uint8_t REGCSR; /*!< Main regulator control status register */ - __IO uint8_t PCKENR3; /*!< Peripheral Clock Gating Register 3 */ -} -CLK_TypeDef; - -/** @addtogroup CLK_Registers_Reset_Value - * @{ - */ -#define CLK_CKDIVR_RESET_VALUE ((uint8_t)0x03) -#define CLK_CRTCR_RESET_VALUE ((uint8_t)0x00) -#define CLK_ICKCR_RESET_VALUE ((uint8_t)0x11) -#define CLK_PCKENR1_RESET_VALUE ((uint8_t)0x00) -#define CLK_PCKENR2_RESET_VALUE ((uint8_t)0x80) -#define CLK_PCKENR3_RESET_VALUE ((uint8_t)0x00) -#define CLK_CCOR_RESET_VALUE ((uint8_t)0x00) -#define CLK_ECKCR_RESET_VALUE ((uint8_t)0x00) -#define CLK_SCSR_RESET_VALUE ((uint8_t)0x01) -#define CLK_SWR_RESET_VALUE ((uint8_t)0x01) -#define CLK_SWCR_RESET_VALUE ((uint8_t)0x00) -#define CLK_CSSR_RESET_VALUE ((uint8_t)0x00) -#define CLK_CBEEPR_RESET_VALUE ((uint8_t)0x00) -#define CLK_HSICALR_RESET_VALUE ((uint8_t)0x00) -#define CLK_HSITRIMR_RESET_VALUE ((uint8_t)0x00) -#define CLK_HSIUNLCKR_RESET_VALUE ((uint8_t)0x00) -#define CLK_REGCSR_RESET_VALUE ((uint8_t)0xB9) -/** - * @} - */ - -/** @addtogroup CLK_Registers_Bits_Definition - * @{ - */ - -#define CLK_CKDIVR_CKM ((uint8_t)0x07) /*!< System clock prescaler mask */ - -#define CLK_CRTCR_RTCDIV ((uint8_t)0xE0) /*!< RTC clock prescaler mask*/ -#define CLK_CRTCR_RTCSEL ((uint8_t)0x1E) /*!< RTC clock output selection mask */ -#define CLK_CRTCR_RTCSWBSY ((uint8_t)0x01) /*!< RTC clock switch busy */ - -#define CLK_ICKCR_BEEPAHALT ((uint8_t)0x40) /*!< BEEP clock Active Halt/Halt mode */ -#define CLK_ICKCR_FHWU ((uint8_t)0x20) /*!< Fast Wake-up from Active Halt/Halt mode */ -#define CLK_ICKCR_SAHALT ((uint8_t)0x10) /*!< Slow Active-halt mode */ -#define CLK_ICKCR_LSIRDY ((uint8_t)0x08) /*!< Low speed internal RC oscillator ready */ -#define CLK_ICKCR_LSION ((uint8_t)0x04) /*!< Low speed internal RC oscillator enable */ -#define CLK_ICKCR_HSIRDY ((uint8_t)0x02) /*!< High speed internal RC oscillator ready */ -#define CLK_ICKCR_HSION ((uint8_t)0x01) /*!< High speed internal RC oscillator enable */ - -#define CLK_PCKENR1_TIM2 ((uint8_t)0x01) /*!< Timer 2 clock enable */ -#define CLK_PCKENR1_TIM3 ((uint8_t)0x02) /*!< Timer 3 clock enable */ -#define CLK_PCKENR1_TIM4 ((uint8_t)0x04) /*!< Timer 4 clock enable */ -#define CLK_PCKENR1_I2C1 ((uint8_t)0x08) /*!< I2C1 clock enable */ -#define CLK_PCKENR1_SPI1 ((uint8_t)0x10) /*!< SPI1 clock enable */ -#define CLK_PCKENR1_USART1 ((uint8_t)0x20) /*!< USART1 clock enable */ -#define CLK_PCKENR1_BEEP ((uint8_t)0x40) /*!< BEEP clock enable */ -#define CLK_PCKENR1_DAC ((uint8_t)0x80) /*!< DAC clock enable */ - -#define CLK_PCKENR2_ADC1 ((uint8_t)0x01) /*!< ADC1 clock enable */ -#define CLK_PCKENR2_TIM1 ((uint8_t)0x02) /*!< TIM1 clock enable */ -#define CLK_PCKENR2_RTC ((uint8_t)0x04) /*!< RTC clock enable */ -#define CLK_PCKENR2_LCD ((uint8_t)0x08) /*!< LCD clock enable */ -#define CLK_PCKENR2_DMA1 ((uint8_t)0x10) /*!< DMA1 clock enable */ -#define CLK_PCKENR2_COMP ((uint8_t)0x20) /*!< Comparator clock enable */ -#define CLK_PCKENR2_BOOTROM ((uint8_t)0x80) /*!< Boot ROM clock enable */ - -#define CLK_PCKENR3_AES ((uint8_t)0x01) /*!< AES clock enable */ -#define CLK_PCKENR3_TIM5 ((uint8_t)0x02) /*!< Timer 5 clock enable */ -#define CLK_PCKENR3_SPI2 ((uint8_t)0x04) /*!< SPI2 clock enable */ -#define CLK_PCKENR3_UASRT2 ((uint8_t)0x08) /*!< USART2 clock enable */ -#define CLK_PCKENR3_USART3 ((uint8_t)0x10) /*!< USART3 clock enable */ - -#define CLK_CCOR_CCODIV ((uint8_t)0xE0) /*!< Configurable Clock output prescaler */ -#define CLK_CCOR_CCOSEL ((uint8_t)0x1E) /*!< Configurable clock output selection */ -#define CLK_CCOR_CCOSWBSY ((uint8_t)0x01) /*!< Configurable clock output switch busy flag */ - -#define CLK_ECKCR_LSEBYP ((uint8_t)0x20) /*!< Low speed external clock bypass */ -#define CLK_ECKCR_HSEBYP ((uint8_t)0x10) /*!< High speed external clock bypass */ -#define CLK_ECKCR_LSERDY ((uint8_t)0x08) /*!< Low speed external crystal oscillator ready */ -#define CLK_ECKCR_LSEON ((uint8_t)0x04) /*!< Low speed external crystal oscillator enable */ -#define CLK_ECKCR_HSERDY ((uint8_t)0x02) /*!< High speed external crystal oscillator ready */ -#define CLK_ECKCR_HSEON ((uint8_t)0x01) /*!< High speed external crystal oscillator enable */ - -#define CLK_SCSR_CKM ((uint8_t)0x0F) /*!< System clock status bits */ - -#define CLK_SWR_SWI ((uint8_t)0x0F) /*!< System clock selection bits */ - -#define CLK_SWCR_SWIF ((uint8_t)0x08) /*!< Clock switch interrupt flag */ -#define CLK_SWCR_SWIEN ((uint8_t)0x04) /*!< Clock switch interrupt enable */ -#define CLK_SWCR_SWEN ((uint8_t)0x02) /*!< Switch start/stop */ -#define CLK_SWCR_SWBSY ((uint8_t)0x01) /*!< Switch busy */ - -#define CLK_CSSR_CSSDGON ((uint8_t)0x10) /*!< Clock security sytem deglitcher system */ -#define CLK_CSSR_CSSD ((uint8_t)0x08) /*!< Clock security sytem detection */ -#define CLK_CSSR_CSSDIE ((uint8_t)0x04) /*!< Clock security system detection interrupt enable */ -#define CLK_CSSR_AUX ((uint8_t)0x02) /*!< Auxiliary oscillator connected to master clock */ -#define CLK_CSSR_CSSEN ((uint8_t)0x01) /*!< Clock security system enable */ - -#define CLK_CBEEPR_CLKBEEPSEL ((uint8_t)0x06) /*!< Configurable BEEP clock source selection */ -#define CLK_CBEEPR_BEEPSWBSY ((uint8_t)0x01) /*!< BEEP clock busy in switch */ - -#define CLK_HSICALR_HSICAL ((uint8_t)0xFF) /*!< Copy of otpion byte trimming HSI oscillator */ - -#define CLK_HSITRIMR_HSITRIM ((uint8_t)0xFF) /*!< High speed internal oscillator trimmer */ - -#define CLK_HSIUNLCKR_HSIUNLCK ((uint8_t)0xFF) /*!< High speed internal oscillator trimmer unlock */ - -#define CLK_REGCSR_EEREADY ((uint8_t)0x80) /*!< Flash program memory and Data EEPROM ready */ -#define CLK_REGCSR_EEBUSY ((uint8_t)0x40) /*!< Flash program memory and Data EEPROM busy */ -#define CLK_REGCSR_LSEPD ((uint8_t)0x20) /*!< LSE power-down */ -#define CLK_REGCSR_HSEPD ((uint8_t)0x10) /*!< HSE power-down */ -#define CLK_REGCSR_LSIPD ((uint8_t)0x08) /*!< LSI power-down */ -#define CLK_REGCSR_HSIPD ((uint8_t)0x04) /*!< HSI power-down */ -#define CLK_REGCSR_REGOFF ((uint8_t)0x02) /*!< Main regulator OFF */ -#define CLK_REGCSR_REGREADY ((uint8_t)0x01) /*!< Main regulator ready */ - -/** - * @} - */ -/*----------------------------------------------------------------------------ok*/ - -/** - * @brief Comparator interface (COMP) - */ - -typedef struct COMP_struct -{ - __IO uint8_t CSR1; /*!< Control status register 1 */ - __IO uint8_t CSR2; /*!< Control status register 2 */ - __IO uint8_t CSR3; /*!< Control status register 3 */ - __IO uint8_t CSR4; /*!< Control status register 4 */ - __IO uint8_t CSR5; /*!< Control status register 5 */ -} -COMP_TypeDef; - - -/** @addtogroup COMP_Registers_Reset_Value - * @{ - */ -#define COMP_CSR1_RESET_VALUE ((uint8_t)0x00) -#define COMP_CSR2_RESET_VALUE ((uint8_t)0x00) -#define COMP_CSR3_RESET_VALUE ((uint8_t)0xC0) -#define COMP_CSR4_RESET_VALUE ((uint8_t)0x00) -#define COMP_CSR5_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup COMP_Registers_Bits_Definition - * @{ - */ - -/* CSR1 */ -#define COMP_CSR1_IE1 ((uint8_t)0x20) /*!< Comparator 1 Interrupt Enable Mask. */ -#define COMP_CSR1_EF1 ((uint8_t)0x10) /*!< Comparator 1 Event Flag Mask. */ -#define COMP_CSR1_CMP1OUT ((uint8_t)0x08) /*!< Comparator 1 Ouptput Mask. */ -#define COMP_CSR1_STE ((uint8_t)0x04) /*!< Schmitt trigger enable Mask. */ -#define COMP_CSR1_CMP1 ((uint8_t)0x03) /*!< Comparator 1 Configuration Mask. */ - -/* CSR2 */ -#define COMP_CSR2_IE2 ((uint8_t)0x20) /*!< Comparator 2 Interrupt Enable Mask. */ -#define COMP_CSR2_EF2 ((uint8_t)0x10) /*!< Comparator 2 Event Flag Mask. */ -#define COMP_CSR2_CMP2OUT ((uint8_t)0x08) /*!< Comparator 2 Ouptput Mask. */ -#define COMP_CSR2_SPEED ((uint8_t)0x04) /*!< Comparator 2 speed modeMask. */ -#define COMP_CSR2_CMP2 ((uint8_t)0x03) /*!< Comparator 2 Configuration Mask. */ - -/* CSR3 */ -#define COMP_CSR3_OUTSEL ((uint8_t)0xC0) /*!< Comparator 2 output selection Mask. */ -#define COMP_CSR3_INSEL ((uint8_t)0x38) /*!< Inversion input selection Mask. */ -#define COMP_CSR3_VREFEN ((uint8_t)0x04) /*!< Internal reference voltage Enable Mask. */ -#define COMP_CSR3_WNDWE ((uint8_t)0x02) /*!< Window Mode Enable Mask. */ -#define COMP_CSR3_VREFOUTEN ((uint8_t)0x01) /*!< VREF Output Enable Mask. */ - -/* CSR4 */ -#define COMP_CSR4_NINVTRIG ((uint8_t)0x38) /*!< COMP2 non-inverting input Mask. */ -#define COMP_CSR4_INVTRIG ((uint8_t)0x07) /*!< COMP2 inverting input Mask. */ - -/* CSR5 */ -#define COMP_CSR5_DACTRIG ((uint8_t)0x38) /*!< DAC outputs Mask. */ -#define COMP_CSR5_VREFTRIG ((uint8_t)0x07) /*!< VREF outputs Mask. */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------ok*/ - -/** - * @brief External Interrupt Controller (EXTI) - */ -typedef struct EXTI_struct -{ - __IO uint8_t CR1; /*!< The four LSB EXTI pin sensitivity */ - __IO uint8_t CR2; /*!< The four MSB EXTI pin sensitivity */ - __IO uint8_t CR3; /*!< EXTI port B & port D sensitivity */ - __IO uint8_t SR1; /*!< Pins Status flag register 1 */ - __IO uint8_t SR2; /*!< Ports Status flage register 2 */ - __IO uint8_t CONF1; /*!< Port interrupt selector */ - uint8_t RESERVED[4]; /*!< reserved area */ - __IO uint8_t CR4; /*!< EXTI port G & port H sensitivity */ - __IO uint8_t CONF2; /*!< Port interrupt selector */ -} -EXTI_TypeDef; - -/** @addtogroup EXTI_Registers_Reset_Value - * @{ - */ - -#define EXTI_CR1_RESET_VALUE ((uint8_t)0x00) -#define EXTI_CR2_RESET_VALUE ((uint8_t)0x00) -#define EXTI_CR3_RESET_VALUE ((uint8_t)0x00) -#define EXTI_CONF1_RESET_VALUE ((uint8_t)0x00) -#define EXTI_SR1_RESET_VALUE ((uint8_t)0x00) -#define EXTI_SR2_RESET_VALUE ((uint8_t)0x00) -#define EXTI_CR4_RESET_VALUE ((uint8_t)0x00) -#define EXTI_CONF2_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup EXTI_Registers_Bits_Definition - * @{ - */ -/* CR1 */ -#define EXTI_CR1_P3IS ((uint8_t)0xC0) /*!< EXTI Pin 3 external interrupt sensitivity bit Mask */ -#define EXTI_CR1_P2IS ((uint8_t)0x30) /*!< EXTI Pin 2 external interrupt sensitivity bit Mask */ -#define EXTI_CR1_P1IS ((uint8_t)0x0C) /*!< EXTI Pin 1 external interrupt sensitivity bit Mask */ -#define EXTI_CR1_P0IS ((uint8_t)0x03) /*!< EXTI Pin 0 external interrupt sensitivity bit Mask */ - -/* CR2 */ -#define EXTI_CR2_P7IS ((uint8_t)0xC0) /*!< EXTI Pin 7 external interrupt sensitivity bit Mask */ -#define EXTI_CR2_P6IS ((uint8_t)0x30) /*!< EXTI Pin 6 external interrupt sensitivity bit Mask */ -#define EXTI_CR2_P5IS ((uint8_t)0x0C) /*!< EXTI Pin 5 external interrupt sensitivity bit Mask */ -#define EXTI_CR2_P4IS ((uint8_t)0x03) /*!< EXTI Pin 4 external interrupt sensitivity bit Mask */ - -/* CR3 */ -#define EXTI_CR3_PBIS ((uint8_t)0x03) /*!< EXTI PORTB external interrupt sensitivity bits Mask */ -#define EXTI_CR3_PDIS ((uint8_t)0x0C) /*!< EXTI PORTD external interrupt sensitivity bits Mask */ -#define EXTI_CR3_PEIS ((uint8_t)0x30) /*!< EXTI PORTE external interrupt sensitivity bits Mask */ -#define EXTI_CR3_PFIS ((uint8_t)0xC0) /*!< EXTI PORTF external interrupt sensitivity bits Mask */ - -/* CONF1 */ -#define EXTI_CONF1_PBLIS ((uint8_t)0x01) /*!< EXTI PORTB low interrupt selector bit Mask */ -#define EXTI_CONF1_PBHIS ((uint8_t)0x02) /*!< EXTI PORTB high interrupt selector bit Mask */ -#define EXTI_CONF1_PDLIS ((uint8_t)0x04) /*!< EXTI PORTD low interrupt selector bit Mask */ -#define EXTI_CONF1_PDHIS ((uint8_t)0x08) /*!< EXTI PORTD high interrupt selector bit Mask */ -#define EXTI_CONF1_PELIS ((uint8_t)0x10) /*!< EXTI PORTE low interrupt selector bit Mask */ -#define EXTI_CONF1_PEHIS ((uint8_t)0x20) /*!< EXTI PORTE high interrupt selector bit Mask */ -#define EXTI_CONF1_PFLIS ((uint8_t)0x40) /*!< EXTI PORTF low interrupt selector bit Mask */ -#define EXTI_CONF1_PFES ((uint8_t)0x80) /*!< EXTI PORTF or PORTE interrupt selector bit Mask */ - -/* CR4 */ -#define EXTI_CR4_PGIS ((uint8_t)0x03) /*!< EXTI PORTG external interrupt sensitivity bits Mask */ -#define EXTI_CR4_PHIS ((uint8_t)0x0C) /*!< EXTI PORTH external interrupt sensitivity bits Mask */ - -/* CONF2 */ -#define EXTI_CONF2_PFHIS ((uint8_t)0x01) /*!< EXTI PORTF high interrupt selector bit Mask */ -#define EXTI_CONF2_PGLIS ((uint8_t)0x02) /*!< EXTI PORTG low interrupt selector bit Mask */ -#define EXTI_CONF2_PGHIS ((uint8_t)0x04) /*!< EXTI PORTG high interrupt selector bit Mask */ -#define EXTI_CONF2_PHLIS ((uint8_t)0x08) /*!< EXTI PORTH low interrupt selector bit Mask */ -#define EXTI_CONF2_PHHIS ((uint8_t)0x10) /*!< EXTI PORTH high interrupt selector bit Mask */ -#define EXTI_CONF2_PGBS ((uint8_t)0x20) /*!< EXTI PORTB or PORTG interrupt selector bit Mask */ -#define EXTI_CONF2_PHDS ((uint8_t)0x40) /*!< EXTI PORTD or PORTH interrupt selector bit Mask */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------ok*/ - -/** - * @brief FLASH and Data EEPROM - */ -typedef struct FLASH_struct -{ - __IO uint8_t CR1; /*!< Flash control register 1 */ - __IO uint8_t CR2; /*!< Flash control register 2 */ - __IO uint8_t PUKR; /*!< Flash program memory unprotection register */ - __IO uint8_t DUKR; /*!< Data EEPROM unprotection register */ - __IO uint8_t IAPSR; /*!< Flash in-application programming status register */ -} -FLASH_TypeDef; - -/** @addtogroup FLASH_Registers_Reset_Value - * @{ - */ -#define FLASH_CR1_RESET_VALUE ((uint8_t)0x00) -#define FLASH_CR2_RESET_VALUE ((uint8_t)0x00) -#define FLASH_PUKR_RESET_VALUE ((uint8_t)0xAE) -#define FLASH_DUKR_RESET_VALUE ((uint8_t)0x56) -#define FLASH_IAPSR_RESET_VALUE ((uint8_t)0x40) - - -/** - * @} - */ - -/** @addtogroup FLASH_Registers_Bits_Definition - * @{ - */ -#define FLASH_CR1_EEPM ((uint8_t)0x08) /*!< Flash low power selection during Run and Low power run mode Mask */ -#define FLASH_CR1_WAITM ((uint8_t)0x04) /*!< Flash low power selection during Wait and Low power wait mode Mask */ -#define FLASH_CR1_IE ((uint8_t)0x02) /*!< Flash Interrupt enable Mask */ -#define FLASH_CR1_FIX ((uint8_t)0x01) /*!< Fix programming time Mask */ - -#define FLASH_CR2_OPT ((uint8_t)0x80) /*!< Enable write access to option bytes*/ -#define FLASH_CR2_WPRG ((uint8_t)0x40) /*!< Word write once Mask */ -#define FLASH_CR2_ERASE ((uint8_t)0x20) /*!< Erase block Mask */ -#define FLASH_CR2_FPRG ((uint8_t)0x10) /*!< Fast programming mode Mask */ -#define FLASH_CR2_PRG ((uint8_t)0x01) /*!< Program block Mask */ - -#define FLASH_IAPSR_HVOFF ((uint8_t)0x40) /*!< End of high voltage flag Mask */ -#define FLASH_IAPSR_DUL ((uint8_t)0x08) /*!< Data EEPROM unlocked flag Mask */ -#define FLASH_IAPSR_EOP ((uint8_t)0x04) /*!< End of operation flag Mask */ -#define FLASH_IAPSR_PUL ((uint8_t)0x02) /*!< Program memory unlocked flag Mask */ -#define FLASH_IAPSR_WR_PG_DIS ((uint8_t)0x01) /*!< Write attempted to protected page Mask */ - -#define FLASH_PUKR_PUK ((uint8_t)0xFF) /*!< Flash Program memory unprotection mask */ - -#define FLASH_DUKR_DUK ((uint8_t)0xFF) /*!< Data EEPROM unprotection mask */ - - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ - -/** - * @brief Inter-Integrated Circuit (I2C) - */ -typedef struct I2C_struct -{ - __IO uint8_t CR1; /*!< I2C control register 1 */ - __IO uint8_t CR2; /*!< I2C control register 2 */ - __IO uint8_t FREQR; /*!< I2C frequency register */ - __IO uint8_t OARL; /*!< I2C own address register 1 LSB */ - __IO uint8_t OARH; /*!< I2C own address register 1 MSB */ - __IO uint8_t OAR2; /*!< I2C own address register 2 */ - __IO uint8_t DR; /*!< I2C data register */ - __IO uint8_t SR1; /*!< I2C status register 1 */ - __IO uint8_t SR2; /*!< I2C status register 2 */ - __IO uint8_t SR3; /*!< I2C status register 3 */ - __IO uint8_t ITR; /*!< I2C interrupt & DMA register */ - __IO uint8_t CCRL; /*!< I2C clock control register low */ - __IO uint8_t CCRH; /*!< I2C clock control register high */ - __IO uint8_t TRISER; /*!< I2C maximum rise time register */ - __IO uint8_t PECR; /*!< I2CPacket Error Checking register */ -} -I2C_TypeDef; - -/** @addtogroup I2C_Registers_Reset_Value - * @{ - */ -#define I2C_CR1_RESET_VALUE ((uint8_t)0x00) -#define I2C_CR2_RESET_VALUE ((uint8_t)0x00) -#define I2C_FREQR_RESET_VALUE ((uint8_t)0x00) -#define I2C_OARL_RESET_VALUE ((uint8_t)0x00) -#define I2C_OARH_RESET_VALUE ((uint8_t)0x00) -#define I2C_OAR2_RESET_VALUE ((uint8_t)0x00) -#define I2C_DR_RESET_VALUE ((uint8_t)0x00) -#define I2C_SR1_RESET_VALUE ((uint8_t)0x00) -#define I2C_SR2_RESET_VALUE ((uint8_t)0x00) -#define I2C_SR3_RESET_VALUE ((uint8_t)0x00) -#define I2C_ITR_RESET_VALUE ((uint8_t)0x00) -#define I2C_CCRL_RESET_VALUE ((uint8_t)0x00) -#define I2C_CCRH_RESET_VALUE ((uint8_t)0x00) -#define I2C_TRISER_RESET_VALUE ((uint8_t)0x02) -#define I2C_PECR_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup I2C_Registers_Bits_Definition - * @{ - */ - -#define I2C_CR1_NOSTRETCH ((uint8_t)0x80) /*!< Clock Stretching Disable (Slave mode) */ -#define I2C_CR1_ENGC ((uint8_t)0x40) /*!< General Call Enable */ -#define I2C_CR1_ENPEC ((uint8_t)0x20) /*!< PEC Enable */ -#define I2C_CR1_ARP ((uint8_t)0x10) /*!< ARP Enable */ -#define I2C_CR1_SMBTYPE ((uint8_t)0x08) /*!< SMBus type */ -#define I2C_CR1_SMBUS ((uint8_t)0x02) /*!< SMBus mode */ -#define I2C_CR1_PE ((uint8_t)0x01) /*!< Peripheral Enable */ - -#define I2C_CR2_SWRST ((uint8_t)0x80) /*!< Software Reset */ -#define I2C_CR2_ALERT ((uint8_t)0x20) /*!< SMBus Alert*/ -#define I2C_CR2_PEC ((uint8_t)0x10) /*!< Packet Error Checking */ -#define I2C_CR2_POS ((uint8_t)0x08) /*!< Acknowledge */ -#define I2C_CR2_ACK ((uint8_t)0x04) /*!< Acknowledge Enable */ -#define I2C_CR2_STOP ((uint8_t)0x02) /*!< Stop Generation */ -#define I2C_CR2_START ((uint8_t)0x01) /*!< Start Generation */ - -#define I2C_FREQR_FREQ ((uint8_t)0x3F) /*!< Peripheral Clock Frequency */ - -#define I2C_OARL_ADD ((uint8_t)0xFE) /*!< Interface Address bits [7..1] */ -#define I2C_OARL_ADD0 ((uint8_t)0x01) /*!< Interface Address bit0 */ - -#define I2C_OARH_ADDMODE ((uint8_t)0x80) /*!< Addressing Mode (Slave mode) */ -#define I2C_OARH_ADDCONF ((uint8_t)0x40) /*!< Address mode configuration */ -#define I2C_OARH_ADD ((uint8_t)0x06) /*!< Interface Address bits [9..8] */ - -#define I2C_OAR2_ADD2 ((uint8_t)0xFE) /*!< Interface Address bits [7..1] */ -#define I2C_OAR2_ENDUAL ((uint8_t)0x01) /*!< Dual addressing mode enable */ - -#define I2C_DR_DR ((uint8_t)0xFF) /*!< Data Register */ - -#define I2C_SR1_TXE ((uint8_t)0x80) /*!< Data Register Empty (transmitters) */ -#define I2C_SR1_RXNE ((uint8_t)0x40) /*!< Data Register not Empty (receivers) */ -#define I2C_SR1_STOPF ((uint8_t)0x10) /*!< Stop detection (Slave mode) */ -#define I2C_SR1_ADD10 ((uint8_t)0x08) /*!< 10-bit header sent (Master mode) */ -#define I2C_SR1_BTF ((uint8_t)0x04) /*!< Byte Transfer Finished */ -#define I2C_SR1_ADDR ((uint8_t)0x02) /*!< Address sent (master mode)/matched (slave mode) */ -#define I2C_SR1_SB ((uint8_t)0x01) /*!< Start Bit (Master mode) */ - -#define I2C_SR2_SMBALERT ((uint8_t)0x80) /*!< SMBus Alert */ -#define I2C_SR2_TIMEOUT ((uint8_t)0x40) /*!< Time out or TLow error */ -#define I2C_SR2_WUFH ((uint8_t)0x20) /*!< Wake-up from Halt */ -#define I2C_SR2_PECERR ((uint8_t)0x10) /*!< PEC error in reception */ -#define I2C_SR2_OVR ((uint8_t)0x08) /*!< Overrun/Underrun */ -#define I2C_SR2_AF ((uint8_t)0x04) /*!< Acknowledge Failure */ -#define I2C_SR2_ARLO ((uint8_t)0x02) /*!< Arbitration Lost (master mode) */ -#define I2C_SR2_BERR ((uint8_t)0x01) /*!< Bus Error */ - -#define I2C_SR3_DUALF ((uint8_t)0x80) /*!< Dual flag (Slave mode) */ -#define I2C_SR3_SMBHOST ((uint8_t)0x40) /*!< SMBus Host Header (Slave mode) */ -#define I2C_SR3_SMBDEFAULT ((uint8_t)0x20) /*!< SMBus Default Header (Slave mode) */ -#define I2C_SR3_GENCALL ((uint8_t)0x10) /*!< General Call Header (Slave mode) */ -#define I2C_SR3_TRA ((uint8_t)0x04) /*!< Transmitter/Receiver */ -#define I2C_SR3_BUSY ((uint8_t)0x02) /*!< Bus Busy */ -#define I2C_SR3_MSL ((uint8_t)0x01) /*!< Master/Slave */ - -#define I2C_ITR_LAST ((uint8_t)0x10) /*!< DMA Last transfer */ -#define I2C_ITR_DMAEN ((uint8_t)0x08) /*!< DMA request Enable */ -#define I2C_ITR_ITBUFEN ((uint8_t)0x04) /*!< Buffer Interrupt Enable */ -#define I2C_ITR_ITEVTEN ((uint8_t)0x02) /*!< Event Interrupt Enable */ -#define I2C_ITR_ITERREN ((uint8_t)0x01) /*!< Error Interrupt Enable */ - -#define I2C_CCRL_CCR ((uint8_t)0xFF) /*!< Clock Control Register (Master mode) */ - -#define I2C_CCRH_FS ((uint8_t)0x80) /*!< Master Mode Selection */ -#define I2C_CCRH_DUTY ((uint8_t)0x40) /*!< Fast Mode Duty Cycle */ -#define I2C_CCRH_CCR ((uint8_t)0x0F) /*!< Clock Control Register in Fast/Standard mode (Master mode) bits [11..8] */ - -#define I2C_TRISER_TRISE ((uint8_t)0x3F) /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */ - -#define I2C_PECR_PEC ((uint8_t)0xFF) /*!< Packet error checking */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ - -/** - * @brief IR digital interface (IRTIM) - */ -typedef struct IRTIM_struct -{ - __IO uint8_t CR; /*!< control register */ -} -IRTIM_TypeDef; -/** @addtogroup IRTIM_Registers_Reset_Value - * @{ - */ -#define IRTIM_CR_RESET_VALUE ((uint8_t)0x00) - - -/** -* @} -*/ - -/** @addtogroup IRTIM_Registers_Bits_Definition - * @{ - */ -/* CR*/ -#define IRTIM_CR_EN ((uint8_t)0x01) /*!< IRTIM_OUT enable Mask. */ -#define IRTIM_CR_HSEN ((uint8_t)0x02) /*!< High sink open drain buffer enable Mask */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ - -/** - * @brief Interrupt Controller (ITC) - */ -typedef struct ITC_struct -{ - __IO uint8_t ISPR1; /*!< Interrupt Software Priority register 1 */ - __IO uint8_t ISPR2; /*!< Interrupt Software Priority register 2 */ - __IO uint8_t ISPR3; /*!< Interrupt Software Priority register 3 */ - __IO uint8_t ISPR4; /*!< Interrupt Software Priority register 4 */ - __IO uint8_t ISPR5; /*!< Interrupt Software Priority register 5 */ - __IO uint8_t ISPR6; /*!< Interrupt Software Priority register 6 */ - __IO uint8_t ISPR7; /*!< Interrupt Software Priority register 7 */ - __IO uint8_t ISPR8; /*!< Interrupt Software Priority register 8 */ -} -ITC_TypeDef; - -/** @addtogroup ITC_Registers_Reset_Value - * @{ - */ -#define ITC_SPRX_RESET_VALUE ((uint8_t)0xFF) /*!< Reset value of Software Priority registers 0 to 7 */ -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ - -/** - * @brief Internal Low Speed Watchdog (IWDG) - */ -typedef struct IWDG_struct -{ - __IO uint8_t KR; /*!< Low Speed Watchdog Key Register */ - __IO uint8_t PR; /*!< Low Speed Watchdog Prescaler Register */ - __IO uint8_t RLR; /*!< Low Speed Watchdog Reload Register */ -} -IWDG_TypeDef; - -/** @addtogroup IWDG_Registers_Reset_Value - * @{ - */ -#define IWDG_RLR_RESET_VALUE ((uint8_t)0xFF) /*! - #define enableInterrupts() _rim_() /*! - #define enableInterrupts() __enable_interrupt() /* enable interrupts */ - #define disableInterrupts() __disable_interrupt() /* disable interrupts */ - #define rim() __enable_interrupt() /* enable interrupts */ - #define sim() __disable_interrupt() /* disable interrupts */ - #define nop() __no_operation() /* No Operation */ - #define trap() __trap() /* Trap (soft IT) */ - #define wfi() __wait_for_interrupt() /* Wait For Interrupt */ - #define wfe() __wait_for_event(); /* Wait for event */ - #define halt() __halt() /* Halt */ -#endif /* _RAISONANCE_ */ - -/*============================== Interrupt vector Handling ========================*/ - -#ifdef _COSMIC_ - #define INTERRUPT_HANDLER(a,b) @far @interrupt void a(void) - #define INTERRUPT_HANDLER_TRAP(a) void @far @interrupt a(void) -#endif /* _COSMIC_ */ - -#ifdef _RAISONANCE_ - #define INTERRUPT_HANDLER(a,b) void a(void) interrupt b - #define INTERRUPT_HANDLER_TRAP(a) void a(void) trap -#endif /* _RAISONANCE_ */ - -#ifdef _IAR_ - #define STRINGVECTOR(x) #x - #define VECTOR_ID(x) STRINGVECTOR( vector = (x) ) - #define INTERRUPT_HANDLER( a, b ) \ - _Pragma( VECTOR_ID( (b)+2 ) ) \ - __interrupt void (a)( void ) - #define INTERRUPT_HANDLER_TRAP(a) \ - _Pragma( VECTOR_ID( 1 ) ) \ - __interrupt void (a) (void) -#endif /* _IAR_ */ - -/*============================== Interrupt Handler declaration ========================*/ -#ifdef _COSMIC_ - #define INTERRUPT @far @interrupt -#elif defined(_IAR_) - #define INTERRUPT __interrupt -#endif /* _COSMIC_ */ - -/*============================== Handling bits ====================================*/ -/*----------------------------------------------------------------------------- -Method : I -Description : Handle the bit from the character variables. -Comments : The different parameters of commands are - - VAR : Name of the character variable where the bit is located. - - Place : Bit position in the variable (7 6 5 4 3 2 1 0) - - Value : Can be 0 (reset bit) or not 0 (set bit) - The "MskBit" command allows to select some bits in a source - variables and copy it in a destination var (return the value). - The "ValBit" command returns the value of a bit in a char - variable: the bit is reseted if it returns 0 else the bit is set. - This method generates not an optimised code yet. ------------------------------------------------------------------------------*/ -#define SetBit(VAR,Place) ( (VAR) |= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) ) -#define ClrBit(VAR,Place) ( (VAR) &= (uint8_t)((uint8_t)((uint8_t)1<<(uint8_t)(Place))^(uint8_t)255) ) - -#define ChgBit(VAR,Place) ( (VAR) ^= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) ) -#define AffBit(VAR,Place,Value) ((Value) ? \ - ((VAR) |= ((uint8_t)1<<(Place))) : \ - ((VAR) &= (((uint8_t)1<<(Place))^(uint8_t)255))) -#define MskBit(Dest,Msk,Src) ( (Dest) = ((Msk) & (Src)) | ((~(Msk)) & (Dest)) ) - -#define ValBit(VAR,Place) ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place))) - -#define BYTE_0(n) ((uint8_t)((n) & (uint8_t)0xFF)) /*!< Returns the low byte of the 32-bit value */ -#define BYTE_1(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)8))) /*!< Returns the second byte of the 32-bit value */ -#define BYTE_2(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)16))) /*!< Returns the third byte of the 32-bit value */ -#define BYTE_3(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)24))) /*!< Returns the high byte of the 32-bit value */ - -/*============================== Assert Macros ====================================*/ -#define IS_STATE_VALUE(STATE) \ - (((STATE) == SET) || \ - ((STATE) == RESET)) - -/*----------------------------------------------------------------------------- -Method : II -Description : Handle directly the bit. -Comments : The idea is to handle directly with the bit name. For that, it is - necessary to have RAM area descriptions (example: HW register...) - and the following command line for each area. - This method generates the most optimized code. ------------------------------------------------------------------------------*/ - -#define AREA 0x00 /* The area of bits begins at address 0x10. */ - -#define BitClr(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) &= (~(1<<(7-(BIT)%8))) ) -#define BitSet(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) |= (1<<(7-(BIT)%8)) ) -#define BitVal(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) & (1<<(7-(BIT)%8)) ) - - -#endif /* __STM8L15x_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/os/hal/platforms/STM8S/hal_lld.c b/os/hal/platforms/STM8S/hal_lld.c deleted file mode 100644 index 3780b86788..0000000000 --- a/os/hal/platforms/STM8S/hal_lld.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/hal_lld.c - * @brief STM8S HAL subsystem low level driver source. - * - * @addtogroup HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - * @details Clock sources initialization, HSI is assumed to be already - * started after reset. - * @note If the @p STM8S_CLOCK_INIT option is set to @p FALSE then the - * initialization is not performed and is left to the application. - * - * @notapi - */ -void hal_lld_init(void) { - -#if !STM8S_NO_CLOCK_INIT - /* Makes sure that HSI is stable before proceeding.*/ - CLK->ICKR |= CLK_ICKR_HSIEN; - while ((CLK->ICKR & CLK_ICKR_HSIRDY) == 0) - ; - - /* LSI startup and stabilization if required.*/ -#if STM8S_LSI_ENABLED - CLK->ICKR |= CLK_ICKR_LSIEN; - while ((CLK->ICKR & CLK_ICKR_LSIRDY) == 0) - ; -#endif - - /* HSE startup and stabilization if required.*/ -#if STM8S_HSE_ENABLED - CLK->ECKR |= CLK_ECKR_HSEEN; - while ((CLK->ECKR & CLK_ECKR_HSERDY) == 0) - ; -#endif - - /* Setting up clock dividers.*/ - CLK->CKDIVR = (STM8S_HSI_DIVIDER << 3) | (STM8S_CPU_DIVIDER << 0); - - /* SYSCLK switch to the selected source, not necessary if it is HSI.*/ -#if STM8S_SYSCLK_SOURCE != CLK_SYSSEL_HSI - /* Switching clock (manual switch mode).*/ - CLK->SWR = STM8S_SYSCLK_SOURCE; - while ((CLK->SWCR & CLK_SWCR_SWIF) == 0) - ; - CLK->SWCR = CLK_SWCR_SWEN; -#endif - - /* Clocks initially all disabled.*/ - CLK->PCKENR1 = 0; - CLK->PCKENR2 = 0; - - /* Other clock related initializations.*/ - CLK->CSSR = 0; - CLK->CCOR = 0; - - /* HSI disabled if it is no more required.*/ -#if !STM8S_HSI_ENABLED - CLK->ICKR &= ~CLK_ICKR_HSIEN; -#endif -#endif /* !STM8S_NO_CLOCK_INIT */ -} - -/** @} */ diff --git a/os/hal/platforms/STM8S/hal_lld.h b/os/hal/platforms/STM8S/hal_lld.h deleted file mode 100644 index dc55a1a72e..0000000000 --- a/os/hal/platforms/STM8S/hal_lld.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/hal_lld.h - * @brief STM8S HAL subsystem low level driver source. - * @pre This module requires the following macros to be defined in the - * @p board.h file: - * - HSECLK (@p 0 if disabled or frequency in Hertz). - * . - * One of the following macros must also be defined: - * - STM8S103. - * - STM8S105. - * - STM8S207. - * - STM8S208. - * - STM8S903. - * . - * - * @addtogroup HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#undef FALSE -#undef TRUE - -#if defined(STM8S208) || defined(STM8S207) || defined(STM8S105) || \ - defined(STM8S103) || defined(STM8S903) -#include "stm8s.h" -#else -#error "unsupported or invalid STM8 platform" -#endif - -#define FALSE 0 -#define TRUE (!FALSE) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "STM8S" - -#define LSICLK 128000 /**< Low speed internal clock. */ -#define HSICLK 16000000 /**< High speed internal clock. */ - -#define CLK_SYSSEL_HSI 0xE1 /**< HSI clock selector. */ -#define CLK_SYSSEL_LSI 0xD2 /**< LSI clock selector. */ -#define CLK_SYSSEL_HSE 0xB4 /**< HSE clock selector. */ - -#define CLK_HSI_DIV1 0 /**< HSI clock divided by 1. */ -#define CLK_HSI_DIV2 1 /**< HSI clock divided by 2. */ -#define CLK_HSI_DIV4 2 /**< HSI clock divided by 4. */ -#define CLK_HSI_DIV8 3 /**< HSI clock divided by 8. */ - -#define CLK_CPU_DIV1 0 /**< CPU clock divided by 1. */ -#define CLK_CPU_DIV2 1 /**< CPU clock divided by 2. */ -#define CLK_CPU_DIV4 2 /**< CPU clock divided by 4. */ -#define CLK_CPU_DIV8 3 /**< CPU clock divided by 8. */ -#define CLK_CPU_DIV16 4 /**< CPU clock divided by 16. */ -#define CLK_CPU_DIV32 5 /**< CPU clock divided by 32. */ -#define CLK_CPU_DIV64 6 /**< CPU clock divided by 64. */ -#define CLK_CPU_DIV128 7 /**< CPU clock divided by 128. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Disables the clock initialization in the HAL. - */ -#if !defined(STM8S_NO_CLOCK_INIT) || defined(__DOXYGEN__) -#define STM8S_NO_CLOCK_INIT FALSE -#endif - -/** - * @brief Enables or disables the HSI clock source. - */ -#if !defined(STM8S_HSI_ENABLED) || defined(__DOXYGEN__) -#define STM8S_HSI_ENABLED FALSE -#endif - -/** - * @brief Enables or disables the LSI clock source. - */ -#if !defined(STM8S_LSI_ENABLED) || defined(__DOXYGEN__) -#define STM8S_LSI_ENABLED TRUE -#endif - -/** - * @brief Enables or disables the HSE clock source. - */ -#if !defined(STM8S_HSE_ENABLED) || defined(__DOXYGEN__) -#define STM8S_HSE_ENABLED TRUE -#endif - -/** - * @brief Clock source setting. - */ -#if !defined(STM8S_SYSCLK_SOURCE) || defined(__DOXYGEN__) -#define STM8S_SYSCLK_SOURCE CLK_SYSSEL_HSE -#endif - -/** - * @brief HSI clock divider. - */ -#if !defined(STM8S_HSI_DIVIDER) || defined(__DOXYGEN__) -#define STM8S_HSI_DIVIDER CLK_HSI_DIV8 -#endif - -/** - * @brief CPU clock divider. - */ -#if !defined(STM8S_CPU_DIVIDER) || defined(__DOXYGEN__) -#define STM8S_CPU_DIVIDER CLK_CPU_DIV1 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if (STM8S_HSI_DIVIDER != CLK_HSI_DIV1) && \ - (STM8S_HSI_DIVIDER != CLK_HSI_DIV2) && \ - (STM8S_HSI_DIVIDER != CLK_HSI_DIV4) && \ - (STM8S_HSI_DIVIDER != CLK_HSI_DIV8) -#error "specified invalid HSI divider" -#endif - -#if (STM8S_CPU_DIVIDER != CLK_CPU_DIV1) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV2) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV4) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV8) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV16) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV32) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV64) && \ - (STM8S_CPU_DIVIDER != CLK_CPU_DIV128) -#error "specified invalid CPU divider" -#endif - -#if STM8S_HSE_ENABLED && (HSECLK == 0) -#error "impossible to activate HSE" -#endif - -#if !STM8S_HSI_ENABLED && (STM8S_SYSCLK_SOURCE == CLK_SYSSEL_HSI) -#error "requested HSI clock is not enabled" -#endif - -#if !STM8S_LSI_ENABLED && (STM8S_SYSCLK_SOURCE == CLK_SYSSEL_LSI) -#error "requested LSI clock is not enabled" -#endif - -#if !STM8S_HSE_ENABLED && (STM8S_SYSCLK_SOURCE == CLK_SYSSEL_HSE) -#error "requested HSE clock is not enabled" -#endif - -/** - * @brief System clock. - */ -#if STM8SL_NO_CLOCK_INIT || defined(__DOXYGEN__) -#define SYSCLK (HSICLK / 8) -#elif STM8S_SYSCLK_SOURCE == CLK_SYSSEL_HSI -#define SYSCLK (HSICLK / (1 << STM8S_HSI_DIVIDER)) -#elif STM8S_SYSCLK_SOURCE == CLK_SYSSEL_LSI -#define SYSCLK LSICLK -#elif STM8S_SYSCLK_SOURCE == CLK_SYSSEL_HSE -#define SYSCLK HSECLK -#else -#error "specified invalid clock source" -#endif - -/** - * @brief CPU clock. - * @details On the STM8SS the CPU clock can be programmed to be a fraction of - * the system clock. - */ -#define CPUCLK (SYSCLK / (1 << STM8S_CPU_DIVIDER)) - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/pal_lld.c b/os/hal/platforms/STM8S/pal_lld.c deleted file mode 100644 index 02ae6e2204..0000000000 --- a/os/hal/platforms/STM8S/pal_lld.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/pal_lld.c - * @brief STM8S GPIO low level driver code. - * - * @addtogroup PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output at 2MHz. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @notapi - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT_PULLUP: - port->DDR &= ~mask; - port->CR1 |= mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_INPUT: - case PAL_MODE_INPUT_ANALOG: - port->DDR &= ~mask; - port->CR1 &= ~mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - case PAL_MODE_OUTPUT_PUSHPULL_SLOW: - port->DDR |= mask; - port->CR1 |= mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_OUTPUT_PUSHPULL: - port->DDR |= mask; - port->CR1 |= mask; - port->CR2 |= mask; - break; - case PAL_MODE_OUTPUT_OPENDRAIN_SLOW: - port->DDR |= mask; - port->CR1 &= ~mask; - port->CR2 &= ~mask; - break; - case PAL_MODE_OUTPUT_OPENDRAIN: - port->DDR |= mask; - port->CR1 &= ~mask; - port->CR2 |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/pal_lld.h b/os/hal/platforms/STM8S/pal_lld.h deleted file mode 100644 index bb9c6cc79f..0000000000 --- a/os/hal/platforms/STM8S/pal_lld.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/pal_lld.h - * @brief STM8S GPIO low level driver header. - * - * @addtogroup PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLDOWN - -/** - * @brief STM8S specific alternate push-pull slow output mode. - */ -#define PAL_MODE_OUTPUT_PUSHPULL_SLOW 16 - -/** - * @brief STM8S specific alternate open-drain slow output mode. - */ -#define PAL_MODE_OUTPUT_OPENDRAIN_SLOW 17 - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief Generic I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { -#if defined(STM8S105) || defined(__DOXYGEN__) - GPIO_TypeDef P[7]; -#elif defined(STM8S207) || defined(STM8S208) - GPIO_TypeDef P[9]; -#else - GPIO_TypeDef P[6]; -#endif -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 8 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint8_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint8_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef GPIO_TypeDef *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief GPIO ports as a whole. - */ -#define IOPORTS ((PALConfig *)0x5000) - -/** - * @brief GPIO port A identifier. - */ -#define IOPORT1 GPIOA - -/** - * @brief GPIO port B identifier. - */ -#define IOPORT2 GPIOB - -/** - * @brief GPIO port C identifier. - */ -#define IOPORT3 GPIOC - -/** - * @brief GPIO port D identifier. - */ -#define IOPORT4 GPIOD - -/** - * @brief GPIO port E identifier. - */ -#define IOPORT5 GPIOE - -/** - * @brief GPIO port F identifier. - */ -#define IOPORT6 GPIOF - -#if defined(STM8S207) || defined(STM8S208) || defined(STM8S105) || \ - defined(__DOXYGEN__) -/** - * @brief GPIO port G identifier. - */ -#define IOPORT7 GPIOG -#endif - -#if defined(STM8S207) || defined(STM8S208) || defined(__DOXYGEN__) -/** - * @brief GPIO port H identifier. - */ -#define IOPORT8 GPIOH - -/** - * @brief GPIO port I identifier. - */ -#define IOPORT9 GPIOI -#endif - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) (*IOPORTS = *(config)) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->IDR) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->ODR) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->ODR = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -extern ROMCONST PALConfig pal_default_config; - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/platform.dox b/os/hal/platforms/STM8S/platform.dox deleted file mode 100644 index 7b38efc28a..0000000000 --- a/os/hal/platforms/STM8S/platform.dox +++ /dev/null @@ -1,123 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8S STM8S Drivers - * @details This section describes all the supported drivers on the STM8S - * platform and the implementation details of the single drivers. - * - * @ingroup platforms - */ - -/** - * @defgroup STM8S_HAL STM8S Initialization Support - * @details The STM8S HAL support is responsible for system initialization. - * - * @section stm8s_hal_1 Supported HW resources - * - CLK. - * . - * @section stm8s_hal_2 STM8S HAL driver implementation features - * - Clock tree initialization. - * - Clock source selection. - * . - * @ingroup STM8S - */ - -/** - * @defgroup STM8S_PAL STM8S PAL Support - * @details The STM8S PAL driver uses the GPIO peripherals. - * - * @section stm8s_pal_1 Supported HW resources - * - GPIOA. - * - GPIOB. - * - GPIOC. - * - GPIOD. - * - GPIOE. - * - GPIOF. - * - GPIOG (where present). - * - GPIOH (where present). - * - GPIOI (where present). - * . - * @section stm8s_pal_2 STM8S PAL driver implementation features - * The PAL driver implementation fully supports the following hardware - * capabilities: - * - 8 bits wide ports. - * - Atomic set/reset/toggle functions because special STM8S instruction set. - * - Output latched regardless of the pad setting. - * - Direct read of input pads regardless of the pad setting. - * . - * @section stm8s_pal_3 Supported PAL setup modes - * The STM8S PAL driver supports the following I/O modes: - * - @p PAL_MODE_RESET. - * - @p PAL_MODE_UNCONNECTED. - * - @p PAL_MODE_INPUT. - * - @p PAL_MODE_INPUT_PULLUP. - * - @p PAL_MODE_OUTPUT_PUSHPULL. - * - @p PAL_MODE_OUTPUT_OPENDRAIN. - * . - * Any attempt to setup an invalid mode is ignored. - * - * @section stm8s_pal_4 Suboptimal behavior - * The STM8S GPIO is less than optimal in several areas, the limitations - * should be taken in account while using the PAL driver: - * - Bus/group writing is not atomic. - * - Pad/group mode setup is not atomic. - * . - * @ingroup STM8S - */ - -/** - * @defgroup STM8S_SERIAL STM8S Serial Support - * @details The STM8S Serial driver uses the UART peripherals in a - * buffered, interrupt driven, implementation. - * - * @section stm8s_serial_1 Supported HW resources - * The serial driver can support any of the following hardware resources: - * - UART1. - * - UART2 (where present). - * - UART3 (where present). - * . - * @section stm8s_serial_2 STM8S Serial driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Each UART can be independently enabled and programmed. Unused - * peripherals are left in low power mode. - * - Fully interrupt driven. - * . - * @ingroup STM8S - */ - -/** - * @defgroup STM8S_SPI STM8S SPI Support - * @details The SPI driver supports the STM8S SPI peripheral in an interrupt - * driven implementation. - * @note Being the SPI a fast peripheral, much care must be taken to - * not saturate the CPU bandwidth with an excessive IRQ rate. The - * maximum transfer bit rate is likely limited by the IRQ - * handling. - * - * @section stm8s_spi_1 Supported HW resources - * - SPI. - * . - * @section stm8s_spi_2 STM8S SPI driver implementation features - * - Clock stop for reduced power usage when the driver is in stop state. - * - Fully interrupt driven. - * . - * @ingroup STM8S - */ diff --git a/os/hal/platforms/STM8S/serial_lld.c b/os/hal/platforms/STM8S/serial_lld.c deleted file mode 100644 index 6904ac6ab8..0000000000 --- a/os/hal/platforms/STM8S/serial_lld.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/serial_lld.c - * @brief STM8S low level serial driver code. - * - * @addtogroup SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief UART1 serial driver identifier. - */ -#if STM8S_SERIAL_USE_UART1 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif - -/** - * @brief UART2 serial driver identifier. - */ -#if STM8S_SERIAL_USE_UART2 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/** - * @brief UART3 serial driver identifier. - */ -#if STM8S_SERIAL_USE_UART3 || defined(__DOXYGEN__) -SerialDriver SD3; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** - * @brief Driver default configuration. - */ -static ROMCONST SerialConfig default_config = { - BRR(SERIAL_DEFAULT_BITRATE), - SD_MODE_PARITY_NONE | SD_MODE_STOP_1 -}; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void set_error(SerialDriver *sdp, uint8_t sr) { - flagsmask_t sts = 0; - - /* Note, SR register bit definitions are equal for all UARTs so using - the UART1 definitions is fine.*/ - if (sr & UART1_SR_OR) - sts |= SD_OVERRUN_ERROR; - if (sr & UART1_SR_NF) - sts |= SD_NOISE_ERROR; - if (sr & UART1_SR_FE) - sts |= SD_FRAMING_ERROR; - if (sr & UART1_SR_PE) - sts |= SD_PARITY_ERROR; - chSysLockFromIsr(); - chnAddFlagsI(sdp, sts); - chSysUnlockFromIsr(); -} - -#if STM8S_SERIAL_USE_UART1 || defined(__DOXYGEN__) -static void notify1(GenericQueue *qp) { - - (void)qp; - UART1->CR2 |= UART1_CR2_TIEN; -} - -/** - * @brief UART1 initialization. - * - * @param[in] config architecture-dependent serial driver configuration - */ -static void uart1_init(const SerialConfig *config) { - - UART1->BRR2 = (uint8_t)(((uint8_t)(config->sc_brr >> 8) & (uint8_t)0xF0) | - ((uint8_t)config->sc_brr & (uint8_t)0x0F)); - UART1->BRR1 = (uint8_t)(config->sc_brr >> 4); - UART1->CR1 = (uint8_t)(config->sc_mode & - SD_MODE_PARITY); /* PIEN included. */ - UART1->CR2 = UART1_CR2_RIEN | UART1_CR2_TEN | UART1_CR2_REN; - UART1->CR3 = (uint8_t)(config->sc_mode & SD_MODE_STOP); - UART1->CR4 = 0; - UART1->CR5 = 0; - UART1->PSCR = 1; - (void)UART1->SR; - (void)UART1->DR; -} - -/** - * @brief UART1 de-initialization. - */ -static void uart1_deinit(void) { - - UART1->CR1 = UART1_CR1_UARTD; - UART1->CR2 = 0; - UART1->CR3 = 0; - UART1->CR4 = 0; - UART1->CR5 = 0; - UART1->PSCR = 0; -} -#endif /* STM8S_SERIAL_USE_UART1 */ - -#if STM8S_SERIAL_USE_UART2 || defined(__DOXYGEN__) -static void notify2(GenericQueue *qp) { - - (void)qp; - UART2->CR2 |= UART2_CR2_TIEN; -} - -/** - * @brief UART2 initialization. - * - * @param[in] config architecture-dependent serial driver configuration - */ -static void uart2_init(const SerialConfig *config) { - - UART2->BRR2 = (uint8_t)(((uint8_t)(config->sc_brr >> 8) & (uint8_t)0xF0) | - ((uint8_t)config->sc_brr & (uint8_t)0x0F)); - UART2->BRR1 = (uint8_t)(config->sc_brr >> 4); - UART2->CR1 = (uint8_t)(config->sc_mode & - SD_MODE_PARITY); /* PIEN included. */ - UART2->CR2 = UART2_CR2_RIEN | UART2_CR2_TEN | UART2_CR2_REN; - UART2->CR3 = (uint8_t)(config->sc_mode & SD_MODE_STOP); - UART2->CR4 = 0; - UART2->CR5 = 0; - UART2->CR6 = 0; - UART2->PSCR = 1; - (void)UART2->SR; - (void)UART2->DR; -} - -/** - * @brief UART1 de-initialization. - */ -static void uart2_deinit(void) { - - UART2->CR1 = UART2_CR1_UARTD; - UART2->CR2 = 0; - UART2->CR3 = 0; - UART2->CR4 = 0; - UART2->CR5 = 0; - UART2->CR6 = 0; - UART2->PSCR = 0; -} -#endif /* STM8S_SERIAL_USE_UART1 */ - -#if STM8S_SERIAL_USE_UART3 || defined(__DOXYGEN__) -static void notify3(GenericQueue *qp) { - - (void)qp; - UART3->CR2 |= UART3_CR2_TIEN; -} - -/** - * @brief UART3 initialization. - * - * @param[in] config architecture-dependent serial driver configuration - */ -static void uart3_init(const SerialConfig *config) { - - UART3->BRR2 = (uint8_t)(((uint8_t)(config->sc_brr >> 8) & (uint8_t)0xF0) | - ((uint8_t)config->sc_brr & (uint8_t)0x0F)); - UART3->BRR1 = (uint8_t)(config->sc_brr >> 4); - UART3->CR1 = (uint8_t)(config->sc_mode & - SD_MODE_PARITY); /* PIEN included. */ - UART3->CR2 = UART3_CR2_RIEN | UART3_CR2_TEN | UART3_CR2_REN; - UART3->CR3 = (uint8_t)(config->sc_mode & SD_MODE_STOP); - UART3->CR4 = 0; - UART3->CR6 = 0; - (void)UART3->SR; - (void)UART3->DR; -} - -/** - * @brief UART3 de-initialization. - */ -static void uart3_deinit(void) { - - UART3->CR1 = UART3_CR1_UARTD; - UART3->CR2 = 0; - UART3->CR3 = 0; - UART3->CR4 = 0; - UART3->CR6 = 0; -} -#endif /* STM8S_SERIAL_USE_UART3 */ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM8S_SERIAL_USE_UART1 || defined(__DOXYGEN__) -/** - * @brief IRQ 17 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(17) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD1); - chSysUnlockFromIsr(); - if (b < Q_OK) - UART1->CR2 &= (uint8_t)~UART1_CR2_TIEN; - else - UART1->DR = (uint8_t)b; - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief IRQ 18 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(18) { - uint8_t sr = UART1->SR; - - CH_IRQ_PROLOGUE(); - - if ((sr = UART1->SR) & (UART1_SR_OR | UART1_SR_NF | - UART1_SR_FE | UART1_SR_PE)) - set_error(&SD1, sr); - chSysLockFromIsr(); - sdIncomingDataI(&SD1, UART1->DR); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM8S_SERIAL_USE_UART1 */ - -#if STM8S_SERIAL_USE_UART2 || defined(__DOXYGEN__) -/** - * @brief IRQ 20 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(20) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD2); - chSysUnlockFromIsr(); - if (b < Q_OK) - UART2->CR2 &= (uint8_t)~UART2_CR2_TIEN; - else - UART2->DR = (uint8_t)b; - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief IRQ 21 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(21) { - uint8_t sr = UART2->SR; - - CH_IRQ_PROLOGUE(); - - if ((sr = UART2->SR) & (UART2_SR_OR | UART2_SR_NF | - UART2_SR_FE | UART2_SR_PE)) - set_error(&SD2, sr); - chSysLockFromIsr(); - sdIncomingDataI(&SD2, UART2->DR); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM8S_SERIAL_USE_UART2 */ - -#if STM8S_SERIAL_USE_UART3 || defined(__DOXYGEN__) -/** - * @brief IRQ 20 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(20) { - msg_t b; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - b = sdRequestDataI(&SD3); - chSysUnlockFromIsr(); - if (b < Q_OK) - UART3->CR2 &= (uint8_t)~UART3_CR2_TIEN; - else - UART3->DR = (uint8_t)b; - - CH_IRQ_EPILOGUE(); -} - -/** - * @brief IRQ 21 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(21) { - uint8_t sr = UART3->SR; - - CH_IRQ_PROLOGUE(); - - if ((sr = UART3->SR) & (UART3_SR_OR | UART3_SR_NF | - UART3_SR_FE | UART3_SR_PE)) - set_error(&SD3, sr); - chSysLockFromIsr(); - sdIncomingDataI(&SD3, UART3->DR); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} -#endif /* STM8S_SERIAL_USE_UART3 */ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level serial driver initialization. - * - * @notapi - */ -void sd_lld_init(void) { - -#if STM8S_SERIAL_USE_UART1 - sdObjectInit(&SD1, NULL, notify1); - CLK->PCKENR1 |= CLK_PCKENR1_UART1; /* PCKEN12, clock source. */ - UART1->CR1 = UART1_CR1_UARTD; /* UARTD (low power). */ -#endif - -#if STM8S_SERIAL_USE_UART2 - sdObjectInit(&SD2, NULL, notify2); - CLK->PCKENR1 |= CLK_PCKENR1_UART2; /* PCKEN13, clock source. */ - UART2->CR1 = UART2_CR1_UARTD; /* UARTD (low power). */ -#endif - -#if STM8S_SERIAL_USE_UART3 - sdObjectInit(&SD3, NULL, notify3); - CLK->PCKENR1 |= CLK_PCKENR1_UART3; /* PCKEN13, clock source. */ - UART3->CR1 = UART3_CR1_UARTD; /* UARTD (low power). */ -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - * - * @notapi - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - -#if STM8S_SERIAL_USE_UART1 - if (&SD1 == sdp) { - uart1_init(config); - return; - } -#endif -#if STM8S_SERIAL_USE_UART2 - if (&SD2 == sdp) { - uart2_init(config); - return; - } -#endif -#if STM8S_SERIAL_USE_UART3 - if (&SD3 == sdp) { - uart3_init(config); - return; - } -#endif -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - * - * @notapi - */ -void sd_lld_stop(SerialDriver *sdp) { - -#if STM8S_SERIAL_USE_UART1 - if (&SD1 == sdp) { - uart1_deinit(); - return; - } -#endif -#if STM8S_SERIAL_USE_UART2 - if (&SD2 == sdp) { - uart2_deinit(); - return; - } -#endif -#if STM8S_SERIAL_USE_UART3 - if (&SD3 == sdp) { - uart3_deinit(); - return; - } -#endif -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/serial_lld.h b/os/hal/platforms/STM8S/serial_lld.h deleted file mode 100644 index f0e60fd718..0000000000 --- a/os/hal/platforms/STM8S/serial_lld.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/serial_lld.h - * @brief STM8S low level serial driver header. - * - * @addtogroup SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -#define SD_MODE_PARITY 0x07 /**< @brief Parity field mask. */ -#define SD_MODE_PARITY_NONE 0x00 /**< @brief No parity. */ -#define SD_MODE_PARITY_EVEN 0x05 /**< @brief Even parity. */ -#define SD_MODE_PARITY_ODD 0x07 /**< @brief Odd parity. */ - -#define SD_MODE_STOP 0x30 /**< @brief Stop bits mask. */ -#define SD_MODE_STOP_1 0x00 /**< @brief One stop bit. */ -#define SD_MODE_STOP_2 0x20 /**< @brief Two stop bits. */ -#define SD_MODE_STOP_1P5 0x30 /**< @brief 1.5 stop bits. */ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief UART1 driver enable switch. - * @details If set to @p TRUE the support for UART1 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8S_SERIAL_USE_UART1) || defined(__DOXYGEN__) -#define STM8S_SERIAL_USE_UART1 TRUE -#endif - -/** - * @brief UART2 driver enable switch. - * @details If set to @p TRUE the support for UART3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8S_SERIAL_USE_UART2) || defined(__DOXYGEN__) -#define STM8S_SERIAL_USE_UART2 TRUE -#endif - -/** - * @brief UART3 driver enable switch. - * @details If set to @p TRUE the support for UART3 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8S_SERIAL_USE_UART3) || defined(__DOXYGEN__) -#define STM8S_SERIAL_USE_UART3 TRUE -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if STM8S_SERIAL_USE_UART2 && STM8S_SERIAL_USE_UART3 -#error "STM8S UART2 and UART3 cannot be used together" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Generic Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { - /** - * @brief Bit rate register. - */ - uint16_t sc_brr; - /** - * @brief Mode flags. - */ - uint8_t sc_mode; -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/** - * @brief Macro for baud rate computation. - * @note Make sure the final baud rate is within tolerance. - */ -#define BRR(b) (SYSCLK / (b)) - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM8S_SERIAL_USE_UART1 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if STM8S_SERIAL_USE_UART2 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif -#if STM8S_SERIAL_USE_UART3 && !defined(__DOXYGEN__) -extern SerialDriver SD3; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/spi_lld.c b/os/hal/platforms/STM8S/spi_lld.c deleted file mode 100644 index 709135a201..0000000000 --- a/os/hal/platforms/STM8S/spi_lld.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/spi_lld.c - * @brief STM8S low level SPI driver code. - * - * @addtogroup SPI - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -#if STM8S_SPI_USE_SPI || defined(__DOXYGEN__) -/** @brief SPI1 driver identifier.*/ -SPIDriver SPID1; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -#if STM8S_SPI_USE_SPI || defined(__DOXYGEN__) -/** - * @brief IRQ 10 service routine. - * - * @isr - */ -CH_IRQ_HANDLER(10) { - - CH_IRQ_PROLOGUE(); - - if ((SPI->SR & SPI_SR_OVR) != 0) { - /* The overflow condition should never happen because priority is given - to receive but a hook macro is provided anyway...*/ - STM8S_SPI_ERROR_HOOK(&SPID1); - } - /* Handling the DR register like it is a FIFO with depth>1 in order to - handle the case where a frame arrives immediately after reading the - DR register.*/ - while ((SPI->SR & SPI_SR_RXNE) != 0) { - if (SPID1.rxptr != NULL) - *SPID1.rxptr++ = SPI->DR; - else - (void)SPI->DR; - if (--SPID1.rxcnt == 0) { - chDbgAssert(SPID1.txcnt == 0, - "IRQ10, #1", "counter out of synch"); - /* Stops all the IRQ sources.*/ - SPI->ICR = 0; - /* Portable SPI ISR code defined in the high level driver, note, it - is a macro.*/ - _spi_isr_code(&SPID1); - /* Goto because it is mandatory to go through the epilogue, cannot - just return.*/ - goto exit_isr; - } - } - /* Loading the DR register.*/ - if ((SPI->SR & SPI_SR_TXE) != 0) { - if (SPID1.txptr != NULL) - SPI->DR = *SPID1.txptr++; - else - SPI->DR = 0xFF; - } - -exit_isr: - CH_IRQ_EPILOGUE(); -} -#endif - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level SPI driver initialization. - * - * @notapi - */ -void spi_lld_init(void) { - -#if STM8S_SPI_USE_SPI - spiObjectInit(&SPID1); -#endif /* STM8S_SPI_USE_SPI */ -} - -/** - * @brief Configures and activates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_start(SPIDriver *spip) { - - /* Clock activation.*/ - CLK->PCKENR1 |= CLK_PCKENR1_SPI; /* PCKEN11, clock source. */ - - /* Configuration.*/ - SPI->CR1 = 0; - SPI->CR1 = spip->config->cr1 | SPI_CR1_MSTR; - SPI->CR2 = SPI_CR2_SSI | SPI_CR2_SSM; - SPI->CR1 |= SPI_CR1_SPE; -} - -/** - * @brief Deactivates the SPI peripheral. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_stop(SPIDriver *spip) { - - (void)spip; - - /* Reset state.*/ - SPI->CR1 = 0; - SPI->CR2 = 0; - SPI->ICR = 0; - - /* Clock de-activation.*/ - CLK->PCKENR1 &= (uint8_t)~CLK_PCKENR1_SPI; /* PCKEN11, clock source. */ -} - -/** - * @brief Asserts the slave select signal and prepares for transfers. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_select(SPIDriver *spip) { - - palClearPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Deasserts the slave select signal. - * @details The previously selected peripheral is unselected. - * - * @param[in] spip pointer to the @p SPIDriver object - * - * @notapi - */ -void spi_lld_unselect(SPIDriver *spip) { - - palSetPad(spip->config->ssport, spip->config->sspad); -} - -/** - * @brief Ignores data on the SPI bus. - * @details This function transmits a series of idle words on the SPI bus and - * ignores the received data. This function can be invoked even - * when a slave select signal has not been yet asserted. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be ignored - * - * @notapi - */ -void spi_lld_ignore(SPIDriver *spip, size_t n) { - - spip->rxptr = NULL; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - SPI->ICR = SPI_ICR_TXEI | SPI_ICR_RXEI | SPI_ICR_ERRIE; -} - -/** - * @brief Exchanges data on the SPI bus. - * @details This asynchronous function starts a simultaneous transmit/receive - * operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to be exchanged - * @param[in] txbuf the pointer to the transmit buffer - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - SPI->ICR = SPI_ICR_TXEI | SPI_ICR_RXEI | SPI_ICR_ERRIE; -} - -/** - * @brief Sends data over the SPI bus. - * @details This asynchronous function starts a transmit operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to send - * @param[in] txbuf the pointer to the transmit buffer - * - * @notapi - */ -void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) { - - spip->rxptr = NULL; - spip->txptr = txbuf; - spip->rxcnt = spip->txcnt = n; - SPI->ICR = SPI_ICR_TXEI | SPI_ICR_RXEI | SPI_ICR_ERRIE; -} - -/** - * @brief Receives data from the SPI bus. - * @details This asynchronous function starts a receive operation. - * @post At the end of the operation the configured callback is invoked. - * @note The buffers are organized as uint8_t arrays for data sizes below or - * equal to 8 bits else it is organized as uint16_t arrays. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] n number of words to receive - * @param[out] rxbuf the pointer to the receive buffer - * - * @notapi - */ -void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) { - - spip->rxptr = rxbuf; - spip->txptr = NULL; - spip->rxcnt = spip->txcnt = n; - SPI->ICR = SPI_ICR_TXEI | SPI_ICR_RXEI | SPI_ICR_ERRIE; -} - -/** - * @brief Exchanges one frame using a polled wait. - * @details This synchronous function exchanges one frame using a polled - * synchronization method. This function is useful when exchanging - * small amount of data on high speed channels, usually in this - * situation is much more efficient just wait for completion using - * polling than suspending the thread waiting for an interrupt. - * - * @param[in] spip pointer to the @p SPIDriver object - * @param[in] frame the data frame to send over the SPI bus - * @return The received data frame from the SPI bus. - */ -uint8_t spi_lld_polled_exchange(SPIDriver *spip, uint8_t frame) { - - (void)spip; - - SPI->DR = (uint32_t)frame; - while ((SPI->SR & SPI_SR_RXNE) == 0) - ; - return (uint16_t)SPI->DR; -} - -#endif /* HAL_USE_SPI */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/spi_lld.h b/os/hal/platforms/STM8S/spi_lld.h deleted file mode 100644 index f9fafc9017..0000000000 --- a/os/hal/platforms/STM8S/spi_lld.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file STM8S/spi_lld.h - * @brief STM8S low level SPI driver header. - * - * @addtogroup SPI - * @{ - */ - -#ifndef _SPI_LLD_H_ -#define _SPI_LLD_H_ - -#if HAL_USE_SPI || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief SPI1 driver enable switch. - * @details If set to @p TRUE the support for device SSP0 is included. - * @note The default is @p TRUE. - */ -#if !defined(STM8S_SPI_USE_SPI) || defined(__DOXYGEN__) -#define STM8S_SPI_USE_SPI TRUE -#endif - -/** - * @brief Overflow error hook. - * @details The default action is to stop the system. - */ -#if !defined(STM8S_SPI_SPI_ERROR_HOOK) || defined(__DOXYGEN__) -#define STM8S_SPI_ERROR_HOOK(spip) chSysHalt() -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !STM8S_SPI_USE_SPI -#error "SPI driver activated but no SPI peripheral assigned" -#endif - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of a structure representing an SPI driver. - */ -typedef struct SPIDriver SPIDriver; - -/** - * @brief SPI notification callback type. - * - * @param[in] spip pointer to the @p SPIDriver object triggering the - * callback - */ -typedef void (*spicallback_t)(SPIDriver *spip); - -/** - * @brief Driver configuration structure. - */ -typedef struct { - /** - * @brief Operation complete callback or @p NULL. - */ - spicallback_t end_cb; - /* End of the mandatory fields.*/ - /** - * @brief The chip select line port. - */ - ioportid_t ssport; - /** - * @brief The chip select line pad number. - */ - uint16_t sspad; - /** - * @brief SPI initialization data. - */ - uint8_t cr1; -} SPIConfig; - -/** - * @brief Structure representing a SPI driver. - */ -struct SPIDriver { - /** - * @brief Driver state. - */ - spistate_t state; - /** - * @brief Current configuration data. - */ - const SPIConfig *config; -#if SPI_USE_WAIT || defined(__DOXYGEN__) - /** - * @brief Waiting thread. - */ - Thread *thread; -#endif /* SPI_USE_WAIT */ -#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /** - * @brief Mutex protecting the bus. - */ - Mutex mutex; -#elif CH_USE_SEMAPHORES - Semaphore semaphore; -#endif -#endif /* SPI_USE_MUTUAL_EXCLUSION */ -#if defined(SPI_DRIVER_EXT_FIELDS) - SPI_DRIVER_EXT_FIELDS -#endif - /* End of the mandatory fields.*/ - /** - * @brief Number of bytes yet to be received. - */ - uint16_t rxcnt; - /** - * @brief Receive pointer or @p NULL. - */ - uint8_t *rxptr; - /** - * @brief Number of bytes yet to be transmitted. - */ - uint16_t txcnt; - /** - * @brief Transmit pointer or @p NULL. - */ - const uint8_t *txptr; -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if STM8S_SPI_USE_SPI && !defined(__DOXYGEN__) -extern SPIDriver SPID1; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void spi_lld_init(void); - void spi_lld_start(SPIDriver *spip); - void spi_lld_stop(SPIDriver *spip); - void spi_lld_select(SPIDriver *spip); - void spi_lld_unselect(SPIDriver *spip); - void spi_lld_ignore(SPIDriver *spip, size_t n); - void spi_lld_exchange(SPIDriver *spip, size_t n, - const void *txbuf, void *rxbuf); - void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf); - void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf); - uint8_t spi_lld_polled_exchange(SPIDriver *spip, uint8_t frame); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SPI */ - -#endif /* _SPI_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/STM8S/stm8s.h b/os/hal/platforms/STM8S/stm8s.h deleted file mode 100644 index 07a8362d3f..0000000000 --- a/os/hal/platforms/STM8S/stm8s.h +++ /dev/null @@ -1,2725 +0,0 @@ -/** - ****************************************************************************** - * @file stm8s.h - * @author MCD Application Team - * @version V2.1.0 - * @date 18-November-2011 - * @brief This file contains all HW registers definitions and memory mapping. - ****************************************************************************** - * @attention - * - * 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. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM8S_H -#define __STM8S_H - -/** @addtogroup STM8S_StdPeriph_Driver - * @{ - */ - -/* Uncomment the line below according to the target STM8S or STM8A device used in your - application. */ - - /* #define STM8S208 */ /*!< STM8S High density devices with CAN */ - /* #define STM8S207 */ /*!< STM8S High density devices without CAN */ - /* #define STM8S007 */ /*!< STM8S Value Line High density devices */ - /* #define STM8AF52Ax */ /*!< STM8A High density devices with CAN */ - /* #define STM8AF62Ax */ /*!< STM8A High density devices without CAN */ - /* #define STM8S105 */ /*!< STM8S Medium density devices */ - /* #define STM8S005 */ /*!< STM8S Value Line Medium density devices */ - /* #define STM8AF626x */ /*!< STM8A Medium density devices */ - /* #define STM8S103 */ /*!< STM8S Low density devices */ - /* #define STM8S003 */ /*!< STM8S Value Line Low density devices */ - /* #define STM8S903 */ /*!< STM8S Low density devices */ - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - - - High-Density STM8A devices are the STM8AF52xx STM8AF6269/8x/Ax, - STM8AF51xx, and STM8AF6169/7x/8x/9x/Ax microcontrollers where the Flash memory - density ranges between 32 to 128 Kbytes - - Medium-Density STM8A devices are the STM8AF622x/4x, STM8AF6266/68, - STM8AF612x/4x, and STM8AF6166/68 microcontrollers where the Flash memory - density ranges between 8 to 32 Kbytes - - High-Density STM8S devices are the STM8S207xx, STM8S007 and STM8S208xx microcontrollers - where the Flash memory density ranges between 32 to 128 Kbytes. - - Medium-Density STM8S devices are the STM8S105x and STM8S005 microcontrollers - where the Flash memory density ranges between 16 to 32-Kbytes. - - Low-Density STM8S devices are the STM8S103xx, STM8S003 and STM8S903xx microcontrollers - where the Flash density is 8 Kbytes. */ - -#if !defined (STM8S208) && !defined (STM8S207) && !defined (STM8S105) && \ - !defined (STM8S103) && !defined (STM8S903) && !defined (STM8AF52Ax) && \ - !defined (STM8AF62Ax) && !defined (STM8AF626x) && !defined (STM8S007) && \ - !defined (STM8S003)&& !defined (STM8S005) - #error "Please select first the target STM8S/A device used in your application (in stm8s.h file)" -#endif - -/******************************************************************************/ -/* Library configuration section */ -/******************************************************************************/ -/* Check the used compiler */ -#if defined(__CSMC__) - #define _COSMIC_ -#elif defined(__RCST7__) - #define _RAISONANCE_ -#elif defined(__ICCSTM8__) - #define _IAR_ -#else - #error "Unsupported Compiler!" /* Compiler defines not found */ -#endif - -#if !defined USE_STDPERIPH_DRIVER -/* Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will be - based on direct access to peripherals registers */ -/* CHIBIOS FIX */ -/* #define USE_STDPERIPH_DRIVER*/ -#endif - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined HSE_Value - #if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || \ - defined (STM8AF62Ax) - #define HSE_VALUE ((u32)24000000) /* Value of the External oscillator in Hz*/ - #else - #define HSE_VALUE ((u32)16000000) /* Value of the External oscillator in Hz*/ - #endif /* STM8S208 || STM8S207 || STM8S007 || STM8AF62Ax || STM8AF52Ax */ -#endif /* HSE_Value */ - -/** - * @brief Definition of Device on-chip RC oscillator frequencies - */ -#define HSI_VALUE ((uint32_t)16000000) /*!< Typical Value of the HSI in Hz */ -#define LSI_VALUE ((uint32_t)128000) /*!< Typical Value of the LSI in Hz */ - -#ifdef _COSMIC_ - #define FAR @far - #define NEAR @near - #define TINY @tiny - #define EEPROM @eeprom - #define CONST const -#elif defined (_RAISONANCE_) /* __RCST7__ */ - #define FAR far - #define NEAR data - #define TINY page0 - #define EEPROM eeprom - #define CONST code - #if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || \ - defined (STM8AF62Ax) - /*!< Used with memory Models for code higher than 64K */ - #define MEMCPY fmemcpy - #else /* STM8S903, STM8S103, STM8S003, STM8S105, STM8AF626x */ - /*!< Used with memory Models for code less than 64K */ - #define MEMCPY memcpy - #endif /* STM8S208 or STM8S207 or STM8S007 or STM8AF62Ax or STM8AF52Ax */ -#else /*_IAR_*/ - #define FAR __far - #define NEAR __near - #define TINY __tiny - #define EEPROM __eeprom - #define CONST const -#endif /* __CSMC__ */ - -/* For FLASH routines, select whether pointer will be declared as near (2 bytes, - to handle code smaller than 64KB) or far (3 bytes, to handle code larger - than 64K) */ - -#if defined (STM8S105) || defined (STM8S005) || defined (STM8S103) || defined (STM8S003) || \ - defined (STM8S903) || defined (STM8AF626x) -/*!< Used with memory Models for code smaller than 64K */ - #define PointerAttr NEAR -#else /* STM8S208 or STM8S207 or STM8AF62Ax or STM8AF52Ax */ -/*!< Used with memory Models for code higher than 64K */ - #define PointerAttr FAR -#endif /* STM8S105 or STM8S103 or STM8S003 or STM8S903 or STM8AF626x */ - -/* Uncomment the line below to enable the FLASH functions execution from RAM */ -#if !defined (RAM_EXECUTION) -/* #define RAM_EXECUTION (1) */ -#endif /* RAM_EXECUTION */ - -#ifdef RAM_EXECUTION - #ifdef _COSMIC_ - #define IN_RAM(a) a - #elif defined (_RAISONANCE_) /* __RCST7__ */ - #define IN_RAM(a) a inram - #else /*_IAR_*/ - #define IN_RAM(a) __ramfunc a - #endif /* _COSMIC_ */ -#else - #define IN_RAM(a) a -#endif /* RAM_EXECUTION */ - -/*!< [31:16] STM8S Standard Peripheral Library main version V2.1.0*/ -#define __STM8S_STDPERIPH_VERSION_MAIN ((uint8_t)0x02) /*!< [31:24] main version */ -#define __STM8S_STDPERIPH_VERSION_SUB1 ((uint8_t)0x01) /*!< [23:16] sub1 version */ -#define __STM8S_STDPERIPH_VERSION_SUB2 ((uint8_t)0x00) /*!< [15:8] sub2 version */ -#define __STM8S_STDPERIPH_VERSION_RC ((uint8_t)0x00) /*!< [7:0] release candidate */ -#define __STM8S_STDPERIPH_VERSION ( (__STM8S_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM8S_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM8S_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM8S_STDPERIPH_VERSION_RC)) - -/******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ - -/* Exported types and constants ----------------------------------------------*/ - -/** @addtogroup Exported_types - * @{ - */ - -/** - * IO definitions - * - * define access restrictions to peripheral registers - */ -#define __I volatile const /*!< defines 'read only' permissions */ -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/*!< Signed integer types */ -/* CHIBIOS FIX */ -#if 0 -typedef signed char int8_t; -typedef signed short int16_t; -typedef signed long int32_t; - -/*!< Unsigned integer types */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned long uint32_t; -#endif - -/*!< STM8 Standard Peripheral Library old types (maintained for legacy purpose) */ - -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - - -typedef enum {FALSE = 0, TRUE = !FALSE} bool; - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction; - -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; -#define IS_FUNCTIONALSTATE_OK(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; - -#define U8_MAX (255) -#define S8_MAX (127) -#define S8_MIN (-128) -#define U16_MAX (65535u) -#define S16_MAX (32767) -#define S16_MIN (-32768) -#define U32_MAX (4294967295uL) -#define S32_MAX (2147483647) -#define S32_MIN (-2147483648uL) - -/** - * @} - */ - -/** @addtogroup MAP_FILE_Exported_Types_and_Constants - * @{ - */ - -/******************************************************************************/ -/* IP registers structures */ -/******************************************************************************/ - -/** - * @brief General Purpose I/Os (GPIO) - */ -typedef struct GPIO_struct -{ - __IO uint8_t ODR; /*!< Output Data Register */ - __IO uint8_t IDR; /*!< Input Data Register */ - __IO uint8_t DDR; /*!< Data Direction Register */ - __IO uint8_t CR1; /*!< Configuration Register 1 */ - __IO uint8_t CR2; /*!< Configuration Register 2 */ -} -GPIO_TypeDef; - -/** @addtogroup GPIO_Registers_Reset_Value - * @{ - */ - -#define GPIO_ODR_RESET_VALUE ((uint8_t)0x00) -#define GPIO_DDR_RESET_VALUE ((uint8_t)0x00) -#define GPIO_CR1_RESET_VALUE ((uint8_t)0x00) -#define GPIO_CR2_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ - defined(STM8S903) || defined(STM8AF626x) -/** - * @brief Analog to Digital Converter (ADC1) - */ - typedef struct ADC1_struct - { - __IO uint8_t DB0RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB0RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB1RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB1RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB2RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB2RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB3RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB3RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB4RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB4RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB5RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB5RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB6RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB6RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB7RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB7RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB8RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB8RL; /*!< ADC1 Data Buffer Register (LSB) */ - __IO uint8_t DB9RH; /*!< ADC1 Data Buffer Register (MSB) */ - __IO uint8_t DB9RL; /*!< ADC1 Data Buffer Register (LSB) */ - uint8_t RESERVED[12]; /*!< Reserved byte */ - __IO uint8_t CSR; /*!< ADC1 control status register */ - __IO uint8_t CR1; /*!< ADC1 configuration register 1 */ - __IO uint8_t CR2; /*!< ADC1 configuration register 2 */ - __IO uint8_t CR3; /*!< ADC1 configuration register 3 */ - __IO uint8_t DRH; /*!< ADC1 Data high */ - __IO uint8_t DRL; /*!< ADC1 Data low */ - __IO uint8_t TDRH; /*!< ADC1 Schmitt trigger disable register high */ - __IO uint8_t TDRL; /*!< ADC1 Schmitt trigger disable register low */ - __IO uint8_t HTRH; /*!< ADC1 high threshold register High*/ - __IO uint8_t HTRL; /*!< ADC1 high threshold register Low*/ - __IO uint8_t LTRH; /*!< ADC1 low threshold register high */ - __IO uint8_t LTRL; /*!< ADC1 low threshold register low */ - __IO uint8_t AWSRH; /*!< ADC1 watchdog status register high */ - __IO uint8_t AWSRL; /*!< ADC1 watchdog status register low */ - __IO uint8_t AWCRH; /*!< ADC1 watchdog control register high */ - __IO uint8_t AWCRL; /*!< ADC1 watchdog control register low */ - } - ADC1_TypeDef; - -/** @addtogroup ADC1_Registers_Reset_Value - * @{ - */ - #define ADC1_CSR_RESET_VALUE ((uint8_t)0x00) - #define ADC1_CR1_RESET_VALUE ((uint8_t)0x00) - #define ADC1_CR2_RESET_VALUE ((uint8_t)0x00) - #define ADC1_CR3_RESET_VALUE ((uint8_t)0x00) - #define ADC1_TDRL_RESET_VALUE ((uint8_t)0x00) - #define ADC1_TDRH_RESET_VALUE ((uint8_t)0x00) - #define ADC1_HTRL_RESET_VALUE ((uint8_t)0x03) - #define ADC1_HTRH_RESET_VALUE ((uint8_t)0xFF) - #define ADC1_LTRH_RESET_VALUE ((uint8_t)0x00) - #define ADC1_LTRL_RESET_VALUE ((uint8_t)0x00) - #define ADC1_AWCRH_RESET_VALUE ((uint8_t)0x00) - #define ADC1_AWCRL_RESET_VALUE ((uint8_t)0x00) -/** - * @} - */ - -/** @addtogroup ADC1_Registers_Bits_Definition - * @{ - */ - #define ADC1_CSR_EOC ((uint8_t)0x80) /*!< End of Conversion mask */ - #define ADC1_CSR_AWD ((uint8_t)0x40) /*!< Analog Watch Dog Status mask */ - #define ADC1_CSR_EOCIE ((uint8_t)0x20) /*!< Interrupt Enable for EOC mask */ - #define ADC1_CSR_AWDIE ((uint8_t)0x10) /*!< Analog Watchdog interrupt enable mask */ - #define ADC1_CSR_CH ((uint8_t)0x0F) /*!< Channel selection bits mask */ - - #define ADC1_CR1_SPSEL ((uint8_t)0x70) /*!< Prescaler selection mask */ - #define ADC1_CR1_CONT ((uint8_t)0x02) /*!< Continuous conversion mask */ - #define ADC1_CR1_ADON ((uint8_t)0x01) /*!< A/D Converter on/off mask */ - - #define ADC1_CR2_EXTTRIG ((uint8_t)0x40) /*!< External trigger enable mask */ - #define ADC1_CR2_EXTSEL ((uint8_t)0x30) /*!< External event selection mask */ - #define ADC1_CR2_ALIGN ((uint8_t)0x08) /*!< Data Alignment mask */ - #define ADC1_CR2_SCAN ((uint8_t)0x02) /*!< Scan mode mask */ - - #define ADC1_CR3_DBUF ((uint8_t)0x80) /*!< Data Buffer Enable mask */ - #define ADC1_CR3_OVR ((uint8_t)0x40) /*!< Overrun Status Flag mask */ - -#endif /* (STM8S105) ||(STM8S103) || (STM8S005) ||(STM8S003) || (STM8S903) || (STM8AF626x) */ -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief Analog to Digital Converter (ADC2) - */ -#if defined(STM8S208) || defined(STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || defined (STM8AF62Ax) - typedef struct ADC2_struct - { - __IO uint8_t CSR; /*!< ADC2 control status register */ - __IO uint8_t CR1; /*!< ADC2 configuration register 1 */ - __IO uint8_t CR2; /*!< ADC2 configuration register 2 */ - uint8_t RESERVED; /*!< Reserved byte */ - __IO uint8_t DRH; /*!< ADC2 Data high */ - __IO uint8_t DRL; /*!< ADC2 Data low */ - __IO uint8_t TDRH; /*!< ADC2 Schmitt trigger disable register high */ - __IO uint8_t TDRL; /*!< ADC2 Schmitt trigger disable register low */ - } - ADC2_TypeDef; - -/** @addtogroup ADC2_Registers_Reset_Value - * @{ - */ - #define ADC2_CSR_RESET_VALUE ((uint8_t)0x00) - #define ADC2_CR1_RESET_VALUE ((uint8_t)0x00) - #define ADC2_CR2_RESET_VALUE ((uint8_t)0x00) - #define ADC2_TDRL_RESET_VALUE ((uint8_t)0x00) - #define ADC2_TDRH_RESET_VALUE ((uint8_t)0x00) -/** - * @} - */ - -/** @addtogroup ADC2_Registers_Bits_Definition - * @{ - */ - #define ADC2_CSR_EOC ((uint8_t)0x80) /*!< End of Conversion mask */ - #define ADC2_CSR_EOCIE ((uint8_t)0x20) /*!< Interrupt Enable for EOC mask */ - #define ADC2_CSR_CH ((uint8_t)0x0F) /*!< Channel selection bits mask */ - - #define ADC2_CR1_SPSEL ((uint8_t)0x70) /*!< Prescaler selection mask */ - #define ADC2_CR1_CONT ((uint8_t)0x02) /*!< Continuous conversion mask */ - #define ADC2_CR1_ADON ((uint8_t)0x01) /*!< A/D Converter on/off mask */ - - #define ADC2_CR2_EXTTRIG ((uint8_t)0x40) /*!< External trigger enable mask */ - #define ADC2_CR2_EXTSEL ((uint8_t)0x30) /*!< External event selection mask */ - #define ADC2_CR2_ALIGN ((uint8_t)0x08) /*!< Data Alignment mask */ - -#endif /* (STM8S208) ||(STM8S207) || defined (STM8S007) || (STM8AF62Ax) || (STM8AF52Ax) */ -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ - -/** - * @brief Auto Wake Up (AWU) peripheral registers. - */ -typedef struct AWU_struct -{ - __IO uint8_t CSR; /*!< AWU Control status register */ - __IO uint8_t APR; /*!< AWU Asynchronous prescaler buffer */ - __IO uint8_t TBR; /*!< AWU Time base selection register */ -} -AWU_TypeDef; - -/** @addtogroup AWU_Registers_Reset_Value - * @{ - */ -#define AWU_CSR_RESET_VALUE ((uint8_t)0x00) -#define AWU_APR_RESET_VALUE ((uint8_t)0x3F) -#define AWU_TBR_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup AWU_Registers_Bits_Definition - * @{ - */ - -#define AWU_CSR_AWUF ((uint8_t)0x20) /*!< Interrupt flag mask */ -#define AWU_CSR_AWUEN ((uint8_t)0x10) /*!< Auto Wake-up enable mask */ -#define AWU_CSR_MSR ((uint8_t)0x01) /*!< LSI Measurement enable mask */ - -#define AWU_APR_APR ((uint8_t)0x3F) /*!< Asynchronous Prescaler divider mask */ - -#define AWU_TBR_AWUTB ((uint8_t)0x0F) /*!< Timebase selection mask */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief Beeper (BEEP) peripheral registers. - */ - -typedef struct BEEP_struct -{ - __IO uint8_t CSR; /*!< BEEP Control status register */ -} -BEEP_TypeDef; - -/** @addtogroup BEEP_Registers_Reset_Value - * @{ - */ -#define BEEP_CSR_RESET_VALUE ((uint8_t)0x1F) -/** - * @} - */ - -/** @addtogroup BEEP_Registers_Bits_Definition - * @{ - */ -#define BEEP_CSR_BEEPSEL ((uint8_t)0xC0) /*!< Beeper frequency selection mask */ -#define BEEP_CSR_BEEPEN ((uint8_t)0x20) /*!< Beeper enable mask */ -#define BEEP_CSR_BEEPDIV ((uint8_t)0x1F) /*!< Beeper Divider prescalar mask */ -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief Clock Controller (CLK) - */ -typedef struct CLK_struct -{ - __IO uint8_t ICKR; /*!< Internal Clocks Control Register */ - __IO uint8_t ECKR; /*!< External Clocks Control Register */ - uint8_t RESERVED; /*!< Reserved byte */ - __IO uint8_t CMSR; /*!< Clock Master Status Register */ - __IO uint8_t SWR; /*!< Clock Master Switch Register */ - __IO uint8_t SWCR; /*!< Switch Control Register */ - __IO uint8_t CKDIVR; /*!< Clock Divider Register */ - __IO uint8_t PCKENR1; /*!< Peripheral Clock Gating Register 1 */ - __IO uint8_t CSSR; /*!< Clock Security System Register */ - __IO uint8_t CCOR; /*!< Configurable Clock Output Register */ - __IO uint8_t PCKENR2; /*!< Peripheral Clock Gating Register 2 */ - uint8_t RESERVED1; /*!< Reserved byte */ - __IO uint8_t HSITRIMR; /*!< HSI Calibration Trimmer Register */ - __IO uint8_t SWIMCCR; /*!< SWIM clock control register */ -} -CLK_TypeDef; - -/** @addtogroup CLK_Registers_Reset_Value - * @{ - */ - -#define CLK_ICKR_RESET_VALUE ((uint8_t)0x01) -#define CLK_ECKR_RESET_VALUE ((uint8_t)0x00) -#define CLK_CMSR_RESET_VALUE ((uint8_t)0xE1) -#define CLK_SWR_RESET_VALUE ((uint8_t)0xE1) -#define CLK_SWCR_RESET_VALUE ((uint8_t)0x00) -#define CLK_CKDIVR_RESET_VALUE ((uint8_t)0x18) -#define CLK_PCKENR1_RESET_VALUE ((uint8_t)0xFF) -#define CLK_PCKENR2_RESET_VALUE ((uint8_t)0xFF) -#define CLK_CSSR_RESET_VALUE ((uint8_t)0x00) -#define CLK_CCOR_RESET_VALUE ((uint8_t)0x00) -#define CLK_HSITRIMR_RESET_VALUE ((uint8_t)0x00) -#define CLK_SWIMCCR_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup CLK_Registers_Bits_Definition - * @{ - */ -#define CLK_ICKR_SWUAH ((uint8_t)0x20) /*!< Slow Wake-up from Active Halt/Halt modes */ -#define CLK_ICKR_LSIRDY ((uint8_t)0x10) /*!< Low speed internal oscillator ready */ -#define CLK_ICKR_LSIEN ((uint8_t)0x08) /*!< Low speed internal RC oscillator enable */ -#define CLK_ICKR_FHWU ((uint8_t)0x04) /*!< Fast Wake-up from Active Halt/Halt mode */ -#define CLK_ICKR_HSIRDY ((uint8_t)0x02) /*!< High speed internal RC oscillator ready */ -#define CLK_ICKR_HSIEN ((uint8_t)0x01) /*!< High speed internal RC oscillator enable */ - -#define CLK_ECKR_HSERDY ((uint8_t)0x02) /*!< High speed external crystal oscillator ready */ -#define CLK_ECKR_HSEEN ((uint8_t)0x01) /*!< High speed external crystal oscillator enable */ - -#define CLK_CMSR_CKM ((uint8_t)0xFF) /*!< Clock master status bits */ - -#define CLK_SWR_SWI ((uint8_t)0xFF) /*!< Clock master selection bits */ - -#define CLK_SWCR_SWIF ((uint8_t)0x08) /*!< Clock switch interrupt flag */ -#define CLK_SWCR_SWIEN ((uint8_t)0x04) /*!< Clock switch interrupt enable */ -#define CLK_SWCR_SWEN ((uint8_t)0x02) /*!< Switch start/stop */ -#define CLK_SWCR_SWBSY ((uint8_t)0x01) /*!< Switch busy flag*/ - -#define CLK_CKDIVR_HSIDIV ((uint8_t)0x18) /*!< High speed internal clock prescaler */ -#define CLK_CKDIVR_CPUDIV ((uint8_t)0x07) /*!< CPU clock prescaler */ - -#define CLK_PCKENR1_TIM1 ((uint8_t)0x80) /*!< Timer 1 clock enable */ -#define CLK_PCKENR1_TIM3 ((uint8_t)0x40) /*!< Timer 3 clock enable */ -#define CLK_PCKENR1_TIM2 ((uint8_t)0x20) /*!< Timer 2 clock enable */ -#define CLK_PCKENR1_TIM5 ((uint8_t)0x20) /*!< Timer 5 clock enable */ -#define CLK_PCKENR1_TIM4 ((uint8_t)0x10) /*!< Timer 4 clock enable */ -#define CLK_PCKENR1_TIM6 ((uint8_t)0x10) /*!< Timer 6 clock enable */ -#define CLK_PCKENR1_UART3 ((uint8_t)0x08) /*!< UART3 clock enable */ -#define CLK_PCKENR1_UART2 ((uint8_t)0x08) /*!< UART2 clock enable */ -#define CLK_PCKENR1_UART1 ((uint8_t)0x04) /*!< UART1 clock enable */ -#define CLK_PCKENR1_SPI ((uint8_t)0x02) /*!< SPI clock enable */ -#define CLK_PCKENR1_I2C ((uint8_t)0x01) /*!< I2C clock enable */ - -#define CLK_PCKENR2_CAN ((uint8_t)0x80) /*!< CAN clock enable */ -#define CLK_PCKENR2_ADC ((uint8_t)0x08) /*!< ADC clock enable */ -#define CLK_PCKENR2_AWU ((uint8_t)0x04) /*!< AWU clock enable */ - -#define CLK_CSSR_CSSD ((uint8_t)0x08) /*!< Clock security system detection */ -#define CLK_CSSR_CSSDIE ((uint8_t)0x04) /*!< Clock security system detection interrupt enable */ -#define CLK_CSSR_AUX ((uint8_t)0x02) /*!< Auxiliary oscillator connected to master clock */ -#define CLK_CSSR_CSSEN ((uint8_t)0x01) /*!< Clock security system enable */ - -#define CLK_CCOR_CCOBSY ((uint8_t)0x40) /*!< Configurable clock output busy */ -#define CLK_CCOR_CCORDY ((uint8_t)0x20) /*!< Configurable clock output ready */ -#define CLK_CCOR_CCOSEL ((uint8_t)0x1E) /*!< Configurable clock output selection */ -#define CLK_CCOR_CCOEN ((uint8_t)0x01) /*!< Configurable clock output enable */ - -#define CLK_HSITRIMR_HSITRIM ((uint8_t)0x07) /*!< High speed internal oscillator trimmer */ - -#define CLK_SWIMCCR_SWIMDIV ((uint8_t)0x01) /*!< SWIM Clock Dividing Factor */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief 16-bit timer with complementary PWM outputs (TIM1) - */ - -typedef struct TIM1_struct -{ - __IO uint8_t CR1; /*!< control register 1 */ - __IO uint8_t CR2; /*!< control register 2 */ - __IO uint8_t SMCR; /*!< Synchro mode control register */ - __IO uint8_t ETR; /*!< external trigger register */ - __IO uint8_t IER; /*!< interrupt enable register*/ - __IO uint8_t SR1; /*!< status register 1 */ - __IO uint8_t SR2; /*!< status register 2 */ - __IO uint8_t EGR; /*!< event generation register */ - __IO uint8_t CCMR1; /*!< CC mode register 1 */ - __IO uint8_t CCMR2; /*!< CC mode register 2 */ - __IO uint8_t CCMR3; /*!< CC mode register 3 */ - __IO uint8_t CCMR4; /*!< CC mode register 4 */ - __IO uint8_t CCER1; /*!< CC enable register 1 */ - __IO uint8_t CCER2; /*!< CC enable register 2 */ - __IO uint8_t CNTRH; /*!< counter high */ - __IO uint8_t CNTRL; /*!< counter low */ - __IO uint8_t PSCRH; /*!< prescaler high */ - __IO uint8_t PSCRL; /*!< prescaler low */ - __IO uint8_t ARRH; /*!< auto-reload register high */ - __IO uint8_t ARRL; /*!< auto-reload register low */ - __IO uint8_t RCR; /*!< Repetition Counter register */ - __IO uint8_t CCR1H; /*!< capture/compare register 1 high */ - __IO uint8_t CCR1L; /*!< capture/compare register 1 low */ - __IO uint8_t CCR2H; /*!< capture/compare register 2 high */ - __IO uint8_t CCR2L; /*!< capture/compare register 2 low */ - __IO uint8_t CCR3H; /*!< capture/compare register 3 high */ - __IO uint8_t CCR3L; /*!< capture/compare register 3 low */ - __IO uint8_t CCR4H; /*!< capture/compare register 3 high */ - __IO uint8_t CCR4L; /*!< capture/compare register 3 low */ - __IO uint8_t BKR; /*!< Break Register */ - __IO uint8_t DTR; /*!< dead-time register */ - __IO uint8_t OISR; /*!< Output idle register */ -} -TIM1_TypeDef; - -/** @addtogroup TIM1_Registers_Reset_Value - * @{ - */ - -#define TIM1_CR1_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CR2_RESET_VALUE ((uint8_t)0x00) -#define TIM1_SMCR_RESET_VALUE ((uint8_t)0x00) -#define TIM1_ETR_RESET_VALUE ((uint8_t)0x00) -#define TIM1_IER_RESET_VALUE ((uint8_t)0x00) -#define TIM1_SR1_RESET_VALUE ((uint8_t)0x00) -#define TIM1_SR2_RESET_VALUE ((uint8_t)0x00) -#define TIM1_EGR_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCMR1_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCMR2_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCMR3_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCMR4_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCER1_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCER2_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CNTRH_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CNTRL_RESET_VALUE ((uint8_t)0x00) -#define TIM1_PSCRH_RESET_VALUE ((uint8_t)0x00) -#define TIM1_PSCRL_RESET_VALUE ((uint8_t)0x00) -#define TIM1_ARRH_RESET_VALUE ((uint8_t)0xFF) -#define TIM1_ARRL_RESET_VALUE ((uint8_t)0xFF) -#define TIM1_RCR_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR1H_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR1L_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR2H_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR2L_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR3H_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR3L_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR4H_RESET_VALUE ((uint8_t)0x00) -#define TIM1_CCR4L_RESET_VALUE ((uint8_t)0x00) -#define TIM1_BKR_RESET_VALUE ((uint8_t)0x00) -#define TIM1_DTR_RESET_VALUE ((uint8_t)0x00) -#define TIM1_OISR_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup TIM1_Registers_Bits_Definition - * @{ - */ -/* CR1*/ -#define TIM1_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ -#define TIM1_CR1_CMS ((uint8_t)0x60) /*!< Center-aligned Mode Selection mask. */ -#define TIM1_CR1_DIR ((uint8_t)0x10) /*!< Direction mask. */ -#define TIM1_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ -#define TIM1_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ -#define TIM1_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ -#define TIM1_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ -/* CR2*/ -#define TIM1_CR2_TI1S ((uint8_t)0x80) /*!< TI1S Selection mask. */ -#define TIM1_CR2_MMS ((uint8_t)0x70) /*!< MMS Selection mask. */ -#define TIM1_CR2_COMS ((uint8_t)0x04) /*!< Capture/Compare Control Update Selection mask. */ -#define TIM1_CR2_CCPC ((uint8_t)0x01) /*!< Capture/Compare Preloaded Control mask. */ -/* SMCR*/ -#define TIM1_SMCR_MSM ((uint8_t)0x80) /*!< Master/Slave Mode mask. */ -#define TIM1_SMCR_TS ((uint8_t)0x70) /*!< Trigger Selection mask. */ -#define TIM1_SMCR_SMS ((uint8_t)0x07) /*!< Slave Mode Selection mask. */ -/*ETR*/ -#define TIM1_ETR_ETP ((uint8_t)0x80) /*!< External Trigger Polarity mask. */ -#define TIM1_ETR_ECE ((uint8_t)0x40)/*!< External Clock mask. */ -#define TIM1_ETR_ETPS ((uint8_t)0x30) /*!< External Trigger Prescaler mask. */ -#define TIM1_ETR_ETF ((uint8_t)0x0F) /*!< External Trigger Filter mask. */ -/*IER*/ -#define TIM1_IER_BIE ((uint8_t)0x80) /*!< Break Interrupt Enable mask. */ -#define TIM1_IER_TIE ((uint8_t)0x40) /*!< Trigger Interrupt Enable mask. */ -#define TIM1_IER_COMIE ((uint8_t)0x20) /*!< Commutation Interrupt Enable mask.*/ -#define TIM1_IER_CC4IE ((uint8_t)0x10) /*!< Capture/Compare 4 Interrupt Enable mask. */ -#define TIM1_IER_CC3IE ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Enable mask. */ -#define TIM1_IER_CC2IE ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Enable mask. */ -#define TIM1_IER_CC1IE ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Enable mask. */ -#define TIM1_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ -/*SR1*/ -#define TIM1_SR1_BIF ((uint8_t)0x80) /*!< Break Interrupt Flag mask. */ -#define TIM1_SR1_TIF ((uint8_t)0x40) /*!< Trigger Interrupt Flag mask. */ -#define TIM1_SR1_COMIF ((uint8_t)0x20) /*!< Commutation Interrupt Flag mask. */ -#define TIM1_SR1_CC4IF ((uint8_t)0x10) /*!< Capture/Compare 4 Interrupt Flag mask. */ -#define TIM1_SR1_CC3IF ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Flag mask. */ -#define TIM1_SR1_CC2IF ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Flag mask. */ -#define TIM1_SR1_CC1IF ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Flag mask. */ -#define TIM1_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ -/*SR2*/ -#define TIM1_SR2_CC4OF ((uint8_t)0x10) /*!< Capture/Compare 4 Overcapture Flag mask. */ -#define TIM1_SR2_CC3OF ((uint8_t)0x08) /*!< Capture/Compare 3 Overcapture Flag mask. */ -#define TIM1_SR2_CC2OF ((uint8_t)0x04) /*!< Capture/Compare 2 Overcapture Flag mask. */ -#define TIM1_SR2_CC1OF ((uint8_t)0x02) /*!< Capture/Compare 1 Overcapture Flag mask. */ -/*EGR*/ -#define TIM1_EGR_BG ((uint8_t)0x80) /*!< Break Generation mask. */ -#define TIM1_EGR_TG ((uint8_t)0x40) /*!< Trigger Generation mask. */ -#define TIM1_EGR_COMG ((uint8_t)0x20) /*!< Capture/Compare Control Update Generation mask. */ -#define TIM1_EGR_CC4G ((uint8_t)0x10) /*!< Capture/Compare 4 Generation mask. */ -#define TIM1_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation mask. */ -#define TIM1_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation mask. */ -#define TIM1_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation mask. */ -#define TIM1_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ -/*CCMR*/ -#define TIM1_CCMR_ICxPSC ((uint8_t)0x0C) /*!< Input Capture x Prescaler mask. */ -#define TIM1_CCMR_ICxF ((uint8_t)0xF0) /*!< Input Capture x Filter mask. */ -#define TIM1_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */ -#define TIM1_CCMR_OCxPE ((uint8_t)0x08) /*!< Output Compare x Preload Enable mask. */ -#define TIM1_CCMR_OCxFE ((uint8_t)0x04) /*!< Output Compare x Fast Enable mask. */ -#define TIM1_CCMR_CCxS ((uint8_t)0x03) /*!< Capture/Compare x Selection mask. */ - -#define CCMR_TIxDirect_Set ((uint8_t)0x01) -/*CCER1*/ -#define TIM1_CCER1_CC2NP ((uint8_t)0x80) /*!< Capture/Compare 2 Complementary output Polarity mask. */ -#define TIM1_CCER1_CC2NE ((uint8_t)0x40) /*!< Capture/Compare 2 Complementary output enable mask. */ -#define TIM1_CCER1_CC2P ((uint8_t)0x20) /*!< Capture/Compare 2 output Polarity mask. */ -#define TIM1_CCER1_CC2E ((uint8_t)0x10) /*!< Capture/Compare 2 output enable mask. */ -#define TIM1_CCER1_CC1NP ((uint8_t)0x08) /*!< Capture/Compare 1 Complementary output Polarity mask. */ -#define TIM1_CCER1_CC1NE ((uint8_t)0x04) /*!< Capture/Compare 1 Complementary output enable mask. */ -#define TIM1_CCER1_CC1P ((uint8_t)0x02) /*!< Capture/Compare 1 output Polarity mask. */ -#define TIM1_CCER1_CC1E ((uint8_t)0x01) /*!< Capture/Compare 1 output enable mask. */ -/*CCER2*/ -#define TIM1_CCER2_CC4P ((uint8_t)0x20) /*!< Capture/Compare 4 output Polarity mask. */ -#define TIM1_CCER2_CC4E ((uint8_t)0x10) /*!< Capture/Compare 4 output enable mask. */ -#define TIM1_CCER2_CC3NP ((uint8_t)0x08) /*!< Capture/Compare 3 Complementary output Polarity mask. */ -#define TIM1_CCER2_CC3NE ((uint8_t)0x04) /*!< Capture/Compare 3 Complementary output enable mask. */ -#define TIM1_CCER2_CC3P ((uint8_t)0x02) /*!< Capture/Compare 3 output Polarity mask. */ -#define TIM1_CCER2_CC3E ((uint8_t)0x01) /*!< Capture/Compare 3 output enable mask. */ -/*CNTRH*/ -#define TIM1_CNTRH_CNT ((uint8_t)0xFF) /*!< Counter Value (MSB) mask. */ -/*CNTRL*/ -#define TIM1_CNTRL_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ -/*PSCH*/ -#define TIM1_PSCH_PSC ((uint8_t)0xFF) /*!< Prescaler Value (MSB) mask. */ -/*PSCL*/ -#define TIM1_PSCL_PSC ((uint8_t)0xFF) /*!< Prescaler Value (LSB) mask. */ -/*ARR*/ -#define TIM1_ARRH_ARR ((uint8_t)0xFF) /*!< Autoreload Value (MSB) mask. */ -#define TIM1_ARRL_ARR ((uint8_t)0xFF) /*!< Autoreload Value (LSB) mask. */ -/*RCR*/ -#define TIM1_RCR_REP ((uint8_t)0xFF) /*!< Repetition Counter Value mask. */ -/*CCR1*/ -#define TIM1_CCR1H_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (MSB) mask. */ -#define TIM1_CCR1L_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (LSB) mask. */ -/*CCR2*/ -#define TIM1_CCR2H_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (MSB) mask. */ -#define TIM1_CCR2L_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (LSB) mask. */ -/*CCR3*/ -#define TIM1_CCR3H_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (MSB) mask. */ -#define TIM1_CCR3L_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (LSB) mask. */ -/*CCR4*/ -#define TIM1_CCR4H_CCR4 ((uint8_t)0xFF) /*!< Capture/Compare 4 Value (MSB) mask. */ -#define TIM1_CCR4L_CCR4 ((uint8_t)0xFF) /*!< Capture/Compare 4 Value (LSB) mask. */ -/*BKR*/ -#define TIM1_BKR_MOE ((uint8_t)0x80) /*!< Main Output Enable mask. */ -#define TIM1_BKR_AOE ((uint8_t)0x40) /*!< Automatic Output Enable mask. */ -#define TIM1_BKR_BKP ((uint8_t)0x20) /*!< Break Polarity mask. */ -#define TIM1_BKR_BKE ((uint8_t)0x10) /*!< Break Enable mask. */ -#define TIM1_BKR_OSSR ((uint8_t)0x08) /*!< Off-State Selection for Run mode mask. */ -#define TIM1_BKR_OSSI ((uint8_t)0x04) /*!< Off-State Selection for Idle mode mask. */ -#define TIM1_BKR_LOCK ((uint8_t)0x03) /*!< Lock Configuration mask. */ -/*DTR*/ -#define TIM1_DTR_DTG ((uint8_t)0xFF) /*!< Dead-Time Generator set-up mask. */ -/*OISR*/ -#define TIM1_OISR_OIS4 ((uint8_t)0x40) /*!< Output Idle state 4 (OC4 output) mask. */ -#define TIM1_OISR_OIS3N ((uint8_t)0x20) /*!< Output Idle state 3 (OC3N output) mask. */ -#define TIM1_OISR_OIS3 ((uint8_t)0x10) /*!< Output Idle state 3 (OC3 output) mask. */ -#define TIM1_OISR_OIS2N ((uint8_t)0x08) /*!< Output Idle state 2 (OC2N output) mask. */ -#define TIM1_OISR_OIS2 ((uint8_t)0x04) /*!< Output Idle state 2 (OC2 output) mask. */ -#define TIM1_OISR_OIS1N ((uint8_t)0x02) /*!< Output Idle state 1 (OC1N output) mask. */ -#define TIM1_OISR_OIS1 ((uint8_t)0x01) /*!< Output Idle state 1 (OC1 output) mask. */ -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief 16-bit timer (TIM2) - */ - -typedef struct TIM2_struct -{ - __IO uint8_t CR1; /*!< control register 1 */ -#if defined(STM8S103) || defined(STM8S003) - uint8_t RESERVED1; /*!< Reserved register */ - uint8_t RESERVED2; /*!< Reserved register */ -#endif - __IO uint8_t IER; /*!< interrupt enable register */ - __IO uint8_t SR1; /*!< status register 1 */ - __IO uint8_t SR2; /*!< status register 2 */ - __IO uint8_t EGR; /*!< event generation register */ - __IO uint8_t CCMR1; /*!< CC mode register 1 */ - __IO uint8_t CCMR2; /*!< CC mode register 2 */ - __IO uint8_t CCMR3; /*!< CC mode register 3 */ - __IO uint8_t CCER1; /*!< CC enable register 1 */ - __IO uint8_t CCER2; /*!< CC enable register 2 */ - __IO uint8_t CNTRH; /*!< counter high */ - __IO uint8_t CNTRL; /*!< counter low */ - __IO uint8_t PSCR; /*!< prescaler register */ - __IO uint8_t ARRH; /*!< auto-reload register high */ - __IO uint8_t ARRL; /*!< auto-reload register low */ - __IO uint8_t CCR1H; /*!< capture/compare register 1 high */ - __IO uint8_t CCR1L; /*!< capture/compare register 1 low */ - __IO uint8_t CCR2H; /*!< capture/compare register 2 high */ - __IO uint8_t CCR2L; /*!< capture/compare register 2 low */ - __IO uint8_t CCR3H; /*!< capture/compare register 3 high */ - __IO uint8_t CCR3L; /*!< capture/compare register 3 low */ -} -TIM2_TypeDef; - -/** @addtogroup TIM2_Registers_Reset_Value - * @{ - */ - -#define TIM2_CR1_RESET_VALUE ((uint8_t)0x00) -#define TIM2_IER_RESET_VALUE ((uint8_t)0x00) -#define TIM2_SR1_RESET_VALUE ((uint8_t)0x00) -#define TIM2_SR2_RESET_VALUE ((uint8_t)0x00) -#define TIM2_EGR_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCMR1_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCMR2_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCMR3_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCER1_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCER2_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CNTRH_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CNTRL_RESET_VALUE ((uint8_t)0x00) -#define TIM2_PSCR_RESET_VALUE ((uint8_t)0x00) -#define TIM2_ARRH_RESET_VALUE ((uint8_t)0xFF) -#define TIM2_ARRL_RESET_VALUE ((uint8_t)0xFF) -#define TIM2_CCR1H_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCR1L_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCR2H_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCR2L_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCR3H_RESET_VALUE ((uint8_t)0x00) -#define TIM2_CCR3L_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup TIM2_Registers_Bits_Definition - * @{ - */ -/*CR1*/ -#define TIM2_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ -#define TIM2_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ -#define TIM2_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ -#define TIM2_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ -#define TIM2_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ -/*IER*/ -#define TIM2_IER_CC3IE ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Enable mask. */ -#define TIM2_IER_CC2IE ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Enable mask. */ -#define TIM2_IER_CC1IE ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Enable mask. */ -#define TIM2_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ -/*SR1*/ -#define TIM2_SR1_CC3IF ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Flag mask. */ -#define TIM2_SR1_CC2IF ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Flag mask. */ -#define TIM2_SR1_CC1IF ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Flag mask. */ -#define TIM2_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ -/*SR2*/ -#define TIM2_SR2_CC3OF ((uint8_t)0x08) /*!< Capture/Compare 3 Overcapture Flag mask. */ -#define TIM2_SR2_CC2OF ((uint8_t)0x04) /*!< Capture/Compare 2 Overcapture Flag mask. */ -#define TIM2_SR2_CC1OF ((uint8_t)0x02) /*!< Capture/Compare 1 Overcapture Flag mask. */ -/*EGR*/ -#define TIM2_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation mask. */ -#define TIM2_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation mask. */ -#define TIM2_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation mask. */ -#define TIM2_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ -/*CCMR*/ -#define TIM2_CCMR_ICxPSC ((uint8_t)0x0C) /*!< Input Capture x Prescaler mask. */ -#define TIM2_CCMR_ICxF ((uint8_t)0xF0) /*!< Input Capture x Filter mask. */ -#define TIM2_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */ -#define TIM2_CCMR_OCxPE ((uint8_t)0x08) /*!< Output Compare x Preload Enable mask. */ -#define TIM2_CCMR_CCxS ((uint8_t)0x03) /*!< Capture/Compare x Selection mask. */ -/*CCER1*/ -#define TIM2_CCER1_CC2P ((uint8_t)0x20) /*!< Capture/Compare 2 output Polarity mask. */ -#define TIM2_CCER1_CC2E ((uint8_t)0x10) /*!< Capture/Compare 2 output enable mask. */ -#define TIM2_CCER1_CC1P ((uint8_t)0x02) /*!< Capture/Compare 1 output Polarity mask. */ -#define TIM2_CCER1_CC1E ((uint8_t)0x01) /*!< Capture/Compare 1 output enable mask. */ -/*CCER2*/ -#define TIM2_CCER2_CC3P ((uint8_t)0x02) /*!< Capture/Compare 3 output Polarity mask. */ -#define TIM2_CCER2_CC3E ((uint8_t)0x01) /*!< Capture/Compare 3 output enable mask. */ -/*CNTR*/ -#define TIM2_CNTRH_CNT ((uint8_t)0xFF) /*!< Counter Value (MSB) mask. */ -#define TIM2_CNTRL_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ -/*PSCR*/ -#define TIM2_PSCR_PSC ((uint8_t)0xFF) /*!< Prescaler Value (MSB) mask. */ -/*ARR*/ -#define TIM2_ARRH_ARR ((uint8_t)0xFF) /*!< Autoreload Value (MSB) mask. */ -#define TIM2_ARRL_ARR ((uint8_t)0xFF) /*!< Autoreload Value (LSB) mask. */ -/*CCR1*/ -#define TIM2_CCR1H_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (MSB) mask. */ -#define TIM2_CCR1L_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (LSB) mask. */ -/*CCR2*/ -#define TIM2_CCR2H_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (MSB) mask. */ -#define TIM2_CCR2L_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (LSB) mask. */ -/*CCR3*/ -#define TIM2_CCR3H_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (MSB) mask. */ -#define TIM2_CCR3L_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (LSB) mask. */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief 16-bit timer (TIM3) - */ -typedef struct TIM3_struct -{ - __IO uint8_t CR1; /*!< control register 1 */ - __IO uint8_t IER; /*!< interrupt enable register */ - __IO uint8_t SR1; /*!< status register 1 */ - __IO uint8_t SR2; /*!< status register 2 */ - __IO uint8_t EGR; /*!< event generation register */ - __IO uint8_t CCMR1; /*!< CC mode register 1 */ - __IO uint8_t CCMR2; /*!< CC mode register 2 */ - __IO uint8_t CCER1; /*!< CC enable register 1 */ - __IO uint8_t CNTRH; /*!< counter high */ - __IO uint8_t CNTRL; /*!< counter low */ - __IO uint8_t PSCR; /*!< prescaler register */ - __IO uint8_t ARRH; /*!< auto-reload register high */ - __IO uint8_t ARRL; /*!< auto-reload register low */ - __IO uint8_t CCR1H; /*!< capture/compare register 1 high */ - __IO uint8_t CCR1L; /*!< capture/compare register 1 low */ - __IO uint8_t CCR2H; /*!< capture/compare register 2 high */ - __IO uint8_t CCR2L; /*!< capture/compare register 2 low */ -} -TIM3_TypeDef; - -/** @addtogroup TIM3_Registers_Reset_Value - * @{ - */ - -#define TIM3_CR1_RESET_VALUE ((uint8_t)0x00) -#define TIM3_IER_RESET_VALUE ((uint8_t)0x00) -#define TIM3_SR1_RESET_VALUE ((uint8_t)0x00) -#define TIM3_SR2_RESET_VALUE ((uint8_t)0x00) -#define TIM3_EGR_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CCMR1_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CCMR2_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CCER1_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CNTRH_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CNTRL_RESET_VALUE ((uint8_t)0x00) -#define TIM3_PSCR_RESET_VALUE ((uint8_t)0x00) -#define TIM3_ARRH_RESET_VALUE ((uint8_t)0xFF) -#define TIM3_ARRL_RESET_VALUE ((uint8_t)0xFF) -#define TIM3_CCR1H_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CCR1L_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CCR2H_RESET_VALUE ((uint8_t)0x00) -#define TIM3_CCR2L_RESET_VALUE ((uint8_t)0x00) - -/** - * @} - */ - -/** @addtogroup TIM3_Registers_Bits_Definition - * @{ - */ -/*CR1*/ -#define TIM3_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ -#define TIM3_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ -#define TIM3_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ -#define TIM3_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ -#define TIM3_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ -/*IER*/ -#define TIM3_IER_CC2IE ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Enable mask. */ -#define TIM3_IER_CC1IE ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Enable mask. */ -#define TIM3_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ -/*SR1*/ -#define TIM3_SR1_CC2IF ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Flag mask. */ -#define TIM3_SR1_CC1IF ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Flag mask. */ -#define TIM3_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ -/*SR2*/ -#define TIM3_SR2_CC2OF ((uint8_t)0x04) /*!< Capture/Compare 2 Overcapture Flag mask. */ -#define TIM3_SR2_CC1OF ((uint8_t)0x02) /*!< Capture/Compare 1 Overcapture Flag mask. */ -/*EGR*/ -#define TIM3_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation mask. */ -#define TIM3_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation mask. */ -#define TIM3_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ -/*CCMR*/ -#define TIM3_CCMR_ICxPSC ((uint8_t)0x0C) /*!< Input Capture x Prescaler mask. */ -#define TIM3_CCMR_ICxF ((uint8_t)0xF0) /*!< Input Capture x Filter mask. */ -#define TIM3_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */ -#define TIM3_CCMR_OCxPE ((uint8_t)0x08) /*!< Output Compare x Preload Enable mask. */ -#define TIM3_CCMR_CCxS ((uint8_t)0x03) /*!< Capture/Compare x Selection mask. */ -/*CCER1*/ -#define TIM3_CCER1_CC2P ((uint8_t)0x20) /*!< Capture/Compare 2 output Polarity mask. */ -#define TIM3_CCER1_CC2E ((uint8_t)0x10) /*!< Capture/Compare 2 output enable mask. */ -#define TIM3_CCER1_CC1P ((uint8_t)0x02) /*!< Capture/Compare 1 output Polarity mask. */ -#define TIM3_CCER1_CC1E ((uint8_t)0x01) /*!< Capture/Compare 1 output enable mask. */ -/*CNTR*/ -#define TIM3_CNTRH_CNT ((uint8_t)0xFF) /*!< Counter Value (MSB) mask. */ -#define TIM3_CNTRL_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ -/*PSCR*/ -#define TIM3_PSCR_PSC ((uint8_t)0xFF) /*!< Prescaler Value (MSB) mask. */ -/*ARR*/ -#define TIM3_ARRH_ARR ((uint8_t)0xFF) /*!< Autoreload Value (MSB) mask. */ -#define TIM3_ARRL_ARR ((uint8_t)0xFF) /*!< Autoreload Value (LSB) mask. */ -/*CCR1*/ -#define TIM3_CCR1H_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (MSB) mask. */ -#define TIM3_CCR1L_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (LSB) mask. */ -/*CCR2*/ -#define TIM3_CCR2H_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (MSB) mask. */ -#define TIM3_CCR2L_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (LSB) mask. */ -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief 8-bit system timer (TIM4) - */ - -typedef struct TIM4_struct -{ - __IO uint8_t CR1; /*!< control register 1 */ -#if defined(STM8S103) || defined(STM8S003) - uint8_t RESERVED1; /*!< Reserved register */ - uint8_t RESERVED2; /*!< Reserved register */ -#endif - __IO uint8_t IER; /*!< interrupt enable register */ - __IO uint8_t SR1; /*!< status register 1 */ - __IO uint8_t EGR; /*!< event generation register */ - __IO uint8_t CNTR; /*!< counter register */ - __IO uint8_t PSCR; /*!< prescaler register */ - __IO uint8_t ARR; /*!< auto-reload register */ -} -TIM4_TypeDef; - -/** @addtogroup TIM4_Registers_Reset_Value - * @{ - */ - -#define TIM4_CR1_RESET_VALUE ((uint8_t)0x00) -#define TIM4_IER_RESET_VALUE ((uint8_t)0x00) -#define TIM4_SR1_RESET_VALUE ((uint8_t)0x00) -#define TIM4_EGR_RESET_VALUE ((uint8_t)0x00) -#define TIM4_CNTR_RESET_VALUE ((uint8_t)0x00) -#define TIM4_PSCR_RESET_VALUE ((uint8_t)0x00) -#define TIM4_ARR_RESET_VALUE ((uint8_t)0xFF) - -/** - * @} - */ - -/** @addtogroup TIM4_Registers_Bits_Definition - * @{ - */ -/*CR1*/ -#define TIM4_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ -#define TIM4_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ -#define TIM4_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ -#define TIM4_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ -#define TIM4_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ -/*IER*/ -#define TIM4_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ -/*SR1*/ -#define TIM4_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ -/*EGR*/ -#define TIM4_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ -/*CNTR*/ -#define TIM4_CNTR_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ -/*PSCR*/ -#define TIM4_PSCR_PSC ((uint8_t)0x07) /*!< Prescaler Value mask. */ -/*ARR*/ -#define TIM4_ARR_ARR ((uint8_t)0xFF) /*!< Autoreload Value mask. */ - -/** - * @} - */ - -/*----------------------------------------------------------------------------*/ -/** - * @brief 16-bit timer with synchro module (TIM5) - */ - -typedef struct TIM5_struct -{ - __IO uint8_t CR1; /*! - #define enableInterrupts() _rim_() /* enable interrupts */ - #define disableInterrupts() _sim_() /* disable interrupts */ - #define rim() _rim_() /* enable interrupts */ - #define sim() _sim_() /* disable interrupts */ - #define nop() _nop_() /* No Operation */ - #define trap() _trap_() /* Trap (soft IT) */ - #define wfi() _wfi_() /* Wait For Interrupt */ - #define halt() _halt_() /* Halt */ -#elif defined(_COSMIC_) - #define enableInterrupts() {_asm("rim\n");} /* enable interrupts */ - #define disableInterrupts() {_asm("sim\n");} /* disable interrupts */ - #define rim() {_asm("rim\n");} /* enable interrupts */ - #define sim() {_asm("sim\n");} /* disable interrupts */ - #define nop() {_asm("nop\n");} /* No Operation */ - #define trap() {_asm("trap\n");} /* Trap (soft IT) */ - #define wfi() {_asm("wfi\n");} /* Wait For Interrupt */ - #define halt() {_asm("halt\n");} /* Halt */ -#else /*_IAR_*/ - #include - #define enableInterrupts() __enable_interrupt() /* enable interrupts */ - #define disableInterrupts() __disable_interrupt() /* disable interrupts */ - #define rim() __enable_interrupt() /* enable interrupts */ - #define sim() __disable_interrupt() /* disable interrupts */ - #define nop() __no_operation() /* No Operation */ - #define trap() __trap() /* Trap (soft IT) */ - #define wfi() __wait_for_interrupt() /* Wait For Interrupt */ - #define halt() __halt() /* Halt */ -#endif /*_RAISONANCE_*/ - -/*============================== Interrupt vector Handling ========================*/ - -#ifdef _COSMIC_ - #define INTERRUPT_HANDLER(a,b) @far @interrupt void a(void) - #define INTERRUPT_HANDLER_TRAP(a) void @far @interrupt a(void) -#endif /* _COSMIC_ */ - -#ifdef _RAISONANCE_ - #define INTERRUPT_HANDLER(a,b) void a(void) interrupt b - #define INTERRUPT_HANDLER_TRAP(a) void a(void) trap -#endif /* _RAISONANCE_ */ - -#ifdef _IAR_ - #define STRINGVECTOR(x) #x - #define VECTOR_ID(x) STRINGVECTOR( vector = (x) ) - #define INTERRUPT_HANDLER( a, b ) \ - _Pragma( VECTOR_ID( (b)+2 ) ) \ - __interrupt void (a)( void ) - #define INTERRUPT_HANDLER_TRAP(a) \ - _Pragma( VECTOR_ID( 1 ) ) \ - __interrupt void (a) (void) -#endif /* _IAR_ */ - -/*============================== Interrupt Handler declaration ========================*/ -#ifdef _COSMIC_ - #define INTERRUPT @far @interrupt -#elif defined(_IAR_) - #define INTERRUPT __interrupt -#endif /* _COSMIC_ */ - -/*============================== Handling bits ====================================*/ -/*----------------------------------------------------------------------------- -Method : I -Description : Handle the bit from the character variables. -Comments : The different parameters of commands are - - VAR : Name of the character variable where the bit is located. - - Place : Bit position in the variable (7 6 5 4 3 2 1 0) - - Value : Can be 0 (reset bit) or not 0 (set bit) - The "MskBit" command allows to select some bits in a source - variables and copy it in a destination var (return the value). - The "ValBit" command returns the value of a bit in a char - variable: the bit is reset if it returns 0 else the bit is set. - This method generates not an optimised code yet. ------------------------------------------------------------------------------*/ -#define SetBit(VAR,Place) ( (VAR) |= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) ) -#define ClrBit(VAR,Place) ( (VAR) &= (uint8_t)((uint8_t)((uint8_t)1<<(uint8_t)(Place))^(uint8_t)255) ) - -#define ChgBit(VAR,Place) ( (VAR) ^= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) ) -#define AffBit(VAR,Place,Value) ((Value) ? \ - ((VAR) |= ((uint8_t)1<<(Place))) : \ - ((VAR) &= (((uint8_t)1<<(Place))^(uint8_t)255))) -#define MskBit(Dest,Msk,Src) ( (Dest) = ((Msk) & (Src)) | ((~(Msk)) & (Dest)) ) - -#define ValBit(VAR,Place) ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place))) - -#define BYTE_0(n) ((uint8_t)((n) & (uint8_t)0xFF)) /*!< Returns the low byte of the 32-bit value */ -#define BYTE_1(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)8))) /*!< Returns the second byte of the 32-bit value */ -#define BYTE_2(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)16))) /*!< Returns the third byte of the 32-bit value */ -#define BYTE_3(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)24))) /*!< Returns the high byte of the 32-bit value */ - -/*============================== Assert Macros ====================================*/ -#define IS_STATE_VALUE_OK(SensitivityValue) \ - (((SensitivityValue) == ENABLE) || \ - ((SensitivityValue) == DISABLE)) - -/*----------------------------------------------------------------------------- -Method : II -Description : Handle directly the bit. -Comments : The idea is to handle directly with the bit name. For that, it is - necessary to have RAM area descriptions (example: HW register...) - and the following command line for each area. - This method generates the most optimized code. ------------------------------------------------------------------------------*/ - -#define AREA 0x00 /* The area of bits begins at address 0x10. */ - -#define BitClr(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) &= (~(1<<(7-(BIT)%8))) ) -#define BitSet(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) |= (1<<(7-(BIT)%8)) ) -#define BitVal(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) & (1<<(7-(BIT)%8)) ) - -/* Exported functions ------------------------------------------------------- */ - -#endif /* __STM8S_H */ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/os/hal/platforms/STM8S/stm8s_type.h b/os/hal/platforms/STM8S/stm8s_type.h deleted file mode 100644 index 5c80f66872..0000000000 --- a/os/hal/platforms/STM8S/stm8s_type.h +++ /dev/null @@ -1,103 +0,0 @@ -/** - ****************************************************************************** - * @file stm8s_type.h - * @brief This file contains all common data types. - * @author STMicroelectronics - MCD Application Team - * @version V1.1.1 - * @date 06/05/2009 - ****************************************************************************** - * - * 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. - * - *

    © COPYRIGHT 2009 STMicroelectronics

    - * @image html logo.bmp - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM8S_TYPE_H -#define __STM8S_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, BitStatus; - -typedef enum { - DISABLE = 0, - ENABLE = !DISABLE -} -FunctionalState; - -#define IS_FUNCTIONALSTATE_OK(VALUE) ( (VALUE == ENABLE) || (VALUE == DISABLE) ) - -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 /* __STM8S_TYPE_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/os/hal/platforms/Win32/console.c b/os/hal/platforms/Win32/console.c deleted file mode 100644 index ed62545fbd..0000000000 --- a/os/hal/platforms/Win32/console.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file console.c - * @brief Simulator console driver code. - * @{ - */ - -#include - -#include "ch.h" -#include "console.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief Console driver 1. - */ -BaseChannel CD1; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - - -static size_t writes(void *ip, const uint8_t *bp, size_t n) { - size_t ret; - - (void)ip; - ret = fwrite(bp, 1, n, stdout); - fflush(stdout); - return ret; -} - -static size_t reads(void *ip, uint8_t *bp, size_t n) { - - (void)ip; - return fread(bp, 1, n, stdin); -} - -static bool_t putwouldblock(void *ip) { - - (void)ip; - return FALSE; -} - -static bool_t getwouldblock(void *ip) { - - (void)ip; - return TRUE; -} - -static msg_t putt(void *ip, uint8_t b, systime_t time) { - - (void)ip; - (void)time; - fputc(b, stdout); - fflush(stdout); - return RDY_OK; -} - -static msg_t gett(void *ip, systime_t time) { - - (void)ip; - (void)time; - return fgetc(stdin); -} - -static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) { - size_t ret; - - (void)ip; - (void)time; - ret = fwrite(bp, 1, n, stdout); - fflush(stdout); - return ret; -} - -static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) { - - (void)ip; - (void)time; - return fread(bp, 1, n, stdin); -} - -static const struct BaseChannelVMT vmt = { - writes, reads, putwouldblock, getwouldblock, putt, gett, writet, readt -}; - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -void conInit(void) { - - CD1.vmt = &vmt; -} - -/** @} */ diff --git a/os/hal/platforms/Win32/console.h b/os/hal/platforms/Win32/console.h deleted file mode 100644 index 557d9189a8..0000000000 --- a/os/hal/platforms/Win32/console.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file console.h - * @brief Simulator console driver header. - * @{ - */ - -#ifndef _CONSOLE_H_ -#define _CONSOLE_H_ - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -extern BaseChannel CD1; - -#ifdef __cplusplus -extern "C" { -#endif - void conInit(void); -#ifdef __cplusplus -} -#endif - -#endif /* _CONSOLE_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Win32/hal_lld.c b/os/hal/platforms/Win32/hal_lld.c deleted file mode 100644 index 1ba99dd1b3..0000000000 --- a/os/hal/platforms/Win32/hal_lld.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Win32/hal_lld.c - * @brief Win32 HAL subsystem low level driver code. - * @addtogroup WIN32_HAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -static LARGE_INTEGER nextcnt; -static LARGE_INTEGER slice; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Low level HAL driver initialization. - */ -void hal_lld_init(void) { - WSADATA wsaData; - - /* Initialization.*/ - if (WSAStartup(2, &wsaData) != 0) { - printf("Unable to locate a winsock DLL\n"); - exit(1); - } - - printf("ChibiOS/RT simulator (Win32)\n"); - if (!QueryPerformanceFrequency(&slice)) { - printf("QueryPerformanceFrequency() error"); - exit(1); - } - slice.QuadPart /= CH_FREQUENCY; - QueryPerformanceCounter(&nextcnt); - nextcnt.QuadPart += slice.QuadPart; - - fflush(stdout); -} - -/** - * @brief Interrupt simulation. - */ -void ChkIntSources(void) { - LARGE_INTEGER n; - -#if HAL_USE_SERIAL - if (sd_lld_interrupt_pending()) { - dbg_check_lock(); - if (chSchIsPreemptionRequired()) - chSchDoReschedule(); - dbg_check_unlock(); - return; - } -#endif - - /* Interrupt Timer simulation (10ms interval).*/ - QueryPerformanceCounter(&n); - if (n.QuadPart > nextcnt.QuadPart) { - nextcnt.QuadPart += slice.QuadPart; - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); - - dbg_check_lock(); - if (chSchIsPreemptionRequired()) - chSchDoReschedule(); - dbg_check_unlock(); - } -} - -/** @} */ diff --git a/os/hal/platforms/Win32/hal_lld.h b/os/hal/platforms/Win32/hal_lld.h deleted file mode 100644 index 81123e9f53..0000000000 --- a/os/hal/platforms/Win32/hal_lld.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Win32/hal_lld.h - * @brief WIN32 simulator HAL subsystem low level driver header. - * - * @addtogroup WIN32_HAL - * @{ - */ - -#ifndef _HAL_LLD_H_ -#define _HAL_LLD_H_ - -#include -#include - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/** - * @brief Defines the support for realtime counters in the HAL. - */ -#define HAL_IMPLEMENTS_COUNTERS FALSE - -/** - * @brief Platform name. - */ -#define PLATFORM_NAME "Win32" - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void hal_lld_init(void); - void ChkIntSources(void); -#ifdef __cplusplus -} -#endif - -#endif /* _HAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Win32/pal_lld.c b/os/hal/platforms/Win32/pal_lld.c deleted file mode 100644 index 3279b83a9b..0000000000 --- a/os/hal/platforms/Win32/pal_lld.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Win32/pal_lld.c - * @brief Win32 low level simulated PAL driver code. - * - * @addtogroup WIN32_PAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** - * @brief VIO1 simulated port. - */ -sim_vio_port_t vio_port_1; - -/** - * @brief VIO2 simulated port. - */ -sim_vio_port_t vio_port_2; - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * @brief Pads mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port the port identifier - * @param[in] mask the group mask - * @param[in] mode the mode - * - * @note This function is not meant to be invoked directly by the application - * code. - * @note @p PAL_MODE_UNCONNECTED is implemented as push pull output with high - * state. - * @note This function does not alter the @p PINSELx registers. Alternate - * functions setup must be handled by device-specific code. - */ -void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode) { - - switch (mode) { - case PAL_MODE_RESET: - case PAL_MODE_INPUT: - port->dir &= ~mask; - break; - case PAL_MODE_UNCONNECTED: - port->latch |= mask; - case PAL_MODE_OUTPUT_PUSHPULL: - port->dir |= mask; - break; - } -} - -#endif /* HAL_USE_PAL */ - -/** @} */ diff --git a/os/hal/platforms/Win32/pal_lld.h b/os/hal/platforms/Win32/pal_lld.h deleted file mode 100644 index b76ef13e98..0000000000 --- a/os/hal/platforms/Win32/pal_lld.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Win32/pal_lld.h - * @brief Win32 low level simulated PAL driver header. - * - * @addtogroup WIN32_PAL - * @{ - */ - -#ifndef _PAL_LLD_H_ -#define _PAL_LLD_H_ - -#if HAL_USE_PAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Unsupported modes and specific modes */ -/*===========================================================================*/ - -#undef PAL_MODE_INPUT_PULLUP -#undef PAL_MODE_INPUT_PULLDOWN -#undef PAL_MODE_OUTPUT_OPENDRAIN -#undef PAL_MODE_INPUT_ANALOG - -/*===========================================================================*/ -/* I/O Ports Types and constants. */ -/*===========================================================================*/ - -/** - * @brief VIO port structure. - */ -typedef struct { - /** - * @brief VIO_LATCH register. - * @details This register represents the output latch of the VIO port. - */ - uint32_t latch; - /** - * @brief VIO_PIN register. - * @details This register represents the logical level at the VIO port - * pin level. - */ - uint32_t pin; - /** - * @brief VIO_DIR register. - * @details Direction of the VIO port bits, 0=input, 1=output. - */ - uint32_t dir; -} sim_vio_port_t; - -/** - * @brief Virtual I/O ports static initializer. - * @details An instance of this structure must be passed to @p palInit() at - * system startup time in order to initialized the digital I/O - * subsystem. This represents only the initial setup, specific pads - * or whole ports can be reprogrammed at later time. - */ -typedef struct { - /** - * @brief Virtual port 1 setup data. - */ - sim_vio_port_t VP1Data; - /** - * @brief Virtual port 2 setup data. - */ - sim_vio_port_t VP2Data; -} PALConfig; - -/** - * @brief Width, in bits, of an I/O port. - */ -#define PAL_IOPORTS_WIDTH 32 - -/** - * @brief Whole port mask. - * @brief This macro specifies all the valid bits into a port. - */ -#define PAL_WHOLE_PORT ((ioportmask_t)0xFFFFFFFF) - -/** - * @brief Digital I/O port sized unsigned type. - */ -typedef uint32_t ioportmask_t; - -/** - * @brief Digital I/O modes. - */ -typedef uint32_t iomode_t; - -/** - * @brief Port Identifier. - */ -typedef sim_vio_port_t *ioportid_t; - -/*===========================================================================*/ -/* I/O Ports Identifiers. */ -/*===========================================================================*/ - -/** - * @brief VIO port 1 identifier. - */ -#define IOPORT1 (&vio_port_1) - -/** - * @brief VIO port 2 identifier. - */ -#define IOPORT2 (&vio_port_2) - -/*===========================================================================*/ -/* Implementation, some of the following macros could be implemented as */ -/* functions, if so please put them in pal_lld.c. */ -/*===========================================================================*/ - -/** - * @brief Low level PAL subsystem initialization. - * - * @param[in] config architecture-dependent ports configuration - * - * @notapi - */ -#define pal_lld_init(config) \ - (vio_port_1 = (config)->VP1Data, \ - vio_port_2 = (config)->VP2Data) - -/** - * @brief Reads the physical I/O port states. - * - * @param[in] port port identifier - * @return The port bits. - * - * @notapi - */ -#define pal_lld_readport(port) ((port)->pin) - -/** - * @brief Reads the output latch. - * @details The purpose of this function is to read back the latched output - * value. - * - * @param[in] port port identifier - * @return The latched logical states. - * - * @notapi - */ -#define pal_lld_readlatch(port) ((port)->latch) - -/** - * @brief Writes a bits mask on a I/O port. - * - * @param[in] port port identifier - * @param[in] bits bits to be written on the specified port - * - * @notapi - */ -#define pal_lld_writeport(port, bits) ((port)->latch = (bits)) - -/** - * @brief Pads group mode setup. - * @details This function programs a pads group belonging to the same port - * with the specified mode. - * - * @param[in] port port identifier - * @param[in] mask group mask - * @param[in] offset group bit offset within the port - * @param[in] mode group mode - * - * @notapi - */ -#define pal_lld_setgroupmode(port, mask, offset, mode) \ - _pal_lld_setgroupmode(port, mask << offset, mode) - -#if !defined(__DOXYGEN__) -extern sim_vio_port_t vio_port_1; -extern sim_vio_port_t vio_port_2; -extern const PALConfig pal_default_config; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void _pal_lld_setgroupmode(ioportid_t port, - ioportmask_t mask, - iomode_t mode); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_PAL */ - -#endif /* _PAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/Win32/platform.mk b/os/hal/platforms/Win32/platform.mk deleted file mode 100644 index 0887c1ae37..0000000000 --- a/os/hal/platforms/Win32/platform.mk +++ /dev/null @@ -1,7 +0,0 @@ -# List of all the Win32 platform files. -PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/Win32/hal_lld.c \ - ${CHIBIOS}/os/hal/platforms/Win32/pal_lld.c \ - ${CHIBIOS}/os/hal/platforms/Win32/serial_lld.c - -# Required include directories -PLATFORMINC = ${CHIBIOS}/os/hal/platforms/Win32 diff --git a/os/hal/platforms/Win32/serial_lld.c b/os/hal/platforms/Win32/serial_lld.c deleted file mode 100644 index d383317bcb..0000000000 --- a/os/hal/platforms/Win32/serial_lld.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Win32/serial_lld.c - * @brief Win32 low level simulated serial driver code. - * @addtogroup WIN32_SERIAL - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver exported variables. */ -/*===========================================================================*/ - -/** @brief Serial driver 1 identifier.*/ -#if USE_WIN32_SERIAL1 || defined(__DOXYGEN__) -SerialDriver SD1; -#endif -/** @brief Serial driver 2 identifier.*/ -#if USE_WIN32_SERIAL2 || defined(__DOXYGEN__) -SerialDriver SD2; -#endif - -/*===========================================================================*/ -/* Driver local variables. */ -/*===========================================================================*/ - -/** @brief Driver default configuration.*/ -static const SerialConfig default_config = { -}; - -static u_long nb = 1; - -/*===========================================================================*/ -/* Driver local functions. */ -/*===========================================================================*/ - -static void init(SerialDriver *sdp, uint16_t port) { - struct sockaddr_in sad; - struct protoent *prtp; - - if ((prtp = getprotobyname("tcp")) == NULL) { - printf("%s: Error mapping protocol name to protocol number\n", sdp->com_name); - goto abort; - } - - sdp->com_listen = socket(PF_INET, SOCK_STREAM, prtp->p_proto); - if (sdp->com_listen == INVALID_SOCKET) { - printf("%s: Error creating simulator socket\n", sdp->com_name); - goto abort; - } - - if (ioctlsocket(sdp->com_listen, FIONBIO, &nb) != 0) { - printf("%s: Unable to setup non blocking mode on socket\n", sdp->com_name); - goto abort; - } - - memset(&sad, 0, sizeof(sad)); - sad.sin_family = AF_INET; - sad.sin_addr.s_addr = INADDR_ANY; - sad.sin_port = htons(port); - if (bind(sdp->com_listen, (struct sockaddr *)&sad, sizeof(sad))) { - printf("%s: Error binding socket\n", sdp->com_name); - goto abort; - } - - if (listen(sdp->com_listen, 1) != 0) { - printf("%s: Error listening socket\n", sdp->com_name); - goto abort; - } - printf("Full Duplex Channel %s listening on port %d\n", sdp->com_name, port); - return; - -abort: - if (sdp->com_listen != INVALID_SOCKET) - closesocket(sdp->com_listen); - WSACleanup(); - exit(1); -} - -static bool_t connint(SerialDriver *sdp) { - - if (sdp->com_data == INVALID_SOCKET) { - struct sockaddr addr; - int addrlen = sizeof(addr); - - if ((sdp->com_data = accept(sdp->com_listen, &addr, &addrlen)) == INVALID_SOCKET) - return FALSE; - - if (ioctlsocket(sdp->com_data, FIONBIO, &nb) != 0) { - printf("%s: Unable to setup non blocking mode on data socket\n", sdp->com_name); - goto abort; - } - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_CONNECTED); - chSysUnlockFromIsr(); - return TRUE; - } - return FALSE; -abort: - if (sdp->com_listen != INVALID_SOCKET) - closesocket(sdp->com_listen); - if (sdp->com_data != INVALID_SOCKET) - closesocket(sdp->com_data); - WSACleanup(); - exit(1); -} - -static bool_t inint(SerialDriver *sdp) { - - if (sdp->com_data != INVALID_SOCKET) { - int i; - uint8_t data[32]; - - /* - * Input. - */ - int n = recv(sdp->com_data, data, sizeof(data), 0); - switch (n) { - case 0: - closesocket(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_DISCONNECTED); - chSysUnlockFromIsr(); - return FALSE; - case SOCKET_ERROR: - if (WSAGetLastError() == WSAEWOULDBLOCK) - return FALSE; - closesocket(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - return FALSE; - } - for (i = 0; i < n; i++) { - chSysLockFromIsr(); - sdIncomingDataI(sdp, data[i]); - chSysUnlockFromIsr(); - } - return TRUE; - } - return FALSE; -} - -static bool_t outint(SerialDriver *sdp) { - - if (sdp->com_data != INVALID_SOCKET) { - int n; - uint8_t data[1]; - - /* - * Input. - */ - chSysLockFromIsr(); - n = sdRequestDataI(sdp); - chSysUnlockFromIsr(); - if (n < 0) - return FALSE; - data[0] = (uint8_t)n; - n = send(sdp->com_data, data, sizeof(data), 0); - switch (n) { - case 0: - closesocket(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - chSysLockFromIsr(); - chnAddFlagsI(sdp, CHN_DISCONNECTED); - chSysUnlockFromIsr(); - return FALSE; - case SOCKET_ERROR: - if (WSAGetLastError() == WSAEWOULDBLOCK) - return FALSE; - closesocket(sdp->com_data); - sdp->com_data = INVALID_SOCKET; - return FALSE; - } - return TRUE; - } - return FALSE; -} - -/*===========================================================================*/ -/* Driver interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver exported functions. */ -/*===========================================================================*/ - -/** - * Low level serial driver initialization. - */ -void sd_lld_init(void) { - -#if USE_WIN32_SERIAL1 - sdObjectInit(&SD1, NULL, NULL); - SD1.com_listen = INVALID_SOCKET; - SD1.com_data = INVALID_SOCKET; - SD1.com_name = "SD1"; -#endif - -#if USE_WIN32_SERIAL1 - sdObjectInit(&SD2, NULL, NULL); - SD2.com_listen = INVALID_SOCKET; - SD2.com_data = INVALID_SOCKET; - SD2.com_name = "SD2"; -#endif -} - -/** - * @brief Low level serial driver configuration and (re)start. - * - * @param[in] sdp pointer to a @p SerialDriver object - * @param[in] config the architecture-dependent serial driver configuration. - * If this parameter is set to @p NULL then a default - * configuration is used. - */ -void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) { - - if (config == NULL) - config = &default_config; - -#if USE_WIN32_SERIAL1 - if (sdp == &SD1) - init(&SD1, SD1_PORT); -#endif - -#if USE_WIN32_SERIAL1 - if (sdp == &SD2) - init(&SD2, SD2_PORT); -#endif -} - -/** - * @brief Low level serial driver stop. - * @details De-initializes the USART, stops the associated clock, resets the - * interrupt vector. - * - * @param[in] sdp pointer to a @p SerialDriver object - */ -void sd_lld_stop(SerialDriver *sdp) { - - (void)sdp; -} - -bool_t sd_lld_interrupt_pending(void) { - bool_t b; - - CH_IRQ_PROLOGUE(); - - b = connint(&SD1) || connint(&SD2) || - inint(&SD1) || inint(&SD2) || - outint(&SD1) || outint(&SD2); - - CH_IRQ_EPILOGUE(); - - return b; -} - -#endif /* HAL_USE_SERIAL */ - -/** @} */ diff --git a/os/hal/platforms/Win32/serial_lld.h b/os/hal/platforms/Win32/serial_lld.h deleted file mode 100644 index 21f3df3c04..0000000000 --- a/os/hal/platforms/Win32/serial_lld.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file Win32/serial_lld.h - * @brief Win32 low level simulated serial driver header. - * - * @addtogroup WIN32_SERIAL - * @{ - */ - -#ifndef _SERIAL_LLD_H_ -#define _SERIAL_LLD_H_ - -#if HAL_USE_SERIAL || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 1024 -#endif - -/** - * @brief SD1 driver enable switch. - * @details If set to @p TRUE the support for SD1 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_WIN32_SERIAL1) || defined(__DOXYGEN__) -#define USE_WIN32_SERIAL1 TRUE -#endif - -/** - * @brief SD2 driver enable switch. - * @details If set to @p TRUE the support for SD2 is included. - * @note The default is @p TRUE. - */ -#if !defined(USE_WIN32_SERIAL2) || defined(__DOXYGEN__) -#define USE_WIN32_SERIAL2 TRUE -#endif - -/** - * @brief Listen port for SD1. - */ -#if !defined(SD1_PORT) || defined(__DOXYGEN__) -#define SD1_PORT 29001 -#endif - -/** - * @brief Listen port for SD2. - */ -#if !defined(SD2_PORT) || defined(__DOXYGEN__) -#define SD2_PORT 29002 -#endif - -/*===========================================================================*/ -/* Unsupported event flags and custom events. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Generic Serial Driver configuration structure. - * @details An instance of this structure must be passed to @p sdStart() - * in order to configure and start a serial driver operations. - * @note This structure content is architecture dependent, each driver - * implementation defines its own version and the custom static - * initializers. - */ -typedef struct { -} SerialConfig; - -/** - * @brief @p SerialDriver specific data. - */ -#define _serial_driver_data \ - _base_asynchronous_channel_data \ - /* Driver state.*/ \ - sdstate_t state; \ - /* Input queue.*/ \ - InputQueue iqueue; \ - /* Output queue.*/ \ - OutputQueue oqueue; \ - /* Input circular buffer.*/ \ - uint8_t ib[SERIAL_BUFFERS_SIZE]; \ - /* Output circular buffer.*/ \ - uint8_t ob[SERIAL_BUFFERS_SIZE]; \ - /* End of the mandatory fields.*/ \ - /* Listen socket for simulated serial port.*/ \ - SOCKET com_listen; \ - /* Data socket for simulated serial port.*/ \ - SOCKET com_data; \ - /* Port readable name.*/ \ - const char *com_name; - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if USE_WIN32_SERIAL1 && !defined(__DOXYGEN__) -extern SerialDriver SD1; -#endif -#if USE_WIN32_SERIAL2 && !defined(__DOXYGEN__) -extern SerialDriver SD2; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void sd_lld_init(void); - void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); - void sd_lld_stop(SerialDriver *sdp); - bool_t sd_lld_interrupt_pending(void); -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_SERIAL */ - -#endif /* _SERIAL_LLD_H_ */ - -/** @} */ diff --git a/os/hal/platforms/platforms.dox b/os/hal/platforms/platforms.dox deleted file mode 100644 index 303382cd3f..0000000000 --- a/os/hal/platforms/platforms.dox +++ /dev/null @@ -1,28 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup platforms Platforms - * @brief Supported platforms. - * @details The implementation of the device drivers can be slightly different - * on the various platforms because architectural constrains. This section - * describes the implementation of the various device drivers on the various - * supported platforms. - */ diff --git a/os/ports/GCC/ARM/AT91SAM7/armparams.h b/os/ports/GCC/ARM/AT91SAM7/armparams.h deleted file mode 100644 index 9a07b49bfc..0000000000 --- a/os/ports/GCC/ARM/AT91SAM7/armparams.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARM/AT91SAM7/armparams.h - * @brief ARM7 AT91SAM7 Specific Parameters. - * - * @defgroup ARM_AT91SAM7 AT91SAM7 Specific Parameters - * @ingroup ARM_SPECIFIC - * @details This file contains the ARM specific parameters for the - * AT91SAM7 platform. - * @{ - */ - -#ifndef _ARMPARAMS_H_ -#define _ARMPARAMS_H_ - -/** - * @brief ARM core model. - */ -#define ARM_CORE ARM_CORE_ARM7TDMI - -/** - * @brief AT91SAM7-specific wait for interrupt. - * @details This implementation writes 1 into the PMC_SCDR register. - */ -#if !defined(port_wait_for_interrupt) || defined(__DOXYGEN__) -#if ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() { \ - (*((volatile uint32_t *)0xFFFFFC04)) = 1; \ -} -#else -#define port_wait_for_interrupt() -#endif -#endif - -#endif /* _ARMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7S256.ld b/os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7S256.ld deleted file mode 100644 index a9ba3a8ccc..0000000000 --- a/os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7S256.ld +++ /dev/null @@ -1,105 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AT91SAM7S256 memory setup. - */ -__und_stack_size__ = 0x0004; -__abt_stack_size__ = 0x0004; -__fiq_stack_size__ = 0x0010; -__irq_stack_size__ = 0x0080; -__svc_stack_size__ = 0x0004; -__sys_stack_size__ = 0x0400; -__stacks_total_size__ = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__; - -MEMORY -{ - flash : org = 0x100000, len = 256k - ram : org = 0x200020, len = 64k - 0x20 -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - - .text : ALIGN(16) SUBALIGN(16) - { - _text = .; - KEEP(*(vectors)) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - *(.ctors) - *(.dtors) - } > flash - - .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} - - __exidx_start = .; - .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash - __exidx_end = .; - - .eh_frame_hdr : {*(.eh_frame_hdr)} - - .eh_frame : ONLY_IF_RO {*(.eh_frame)} - - . = ALIGN(4); - _etext = .; - _textdata = _etext; - - .data : - { - _data = .; - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - _edata = .; - } > ram AT > flash - - .bss : - { - _bss_start = .; - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - _bss_end = .; - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__ - __stacks_total_size__; -__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__; diff --git a/os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7X256.ld b/os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7X256.ld deleted file mode 100644 index 12141553ab..0000000000 --- a/os/ports/GCC/ARM/AT91SAM7/ld/AT91SAM7X256.ld +++ /dev/null @@ -1,105 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * AT91SAM7X256 memory setup. - */ -__und_stack_size__ = 0x0004; -__abt_stack_size__ = 0x0004; -__fiq_stack_size__ = 0x0010; -__irq_stack_size__ = 0x0080; -__svc_stack_size__ = 0x0004; -__sys_stack_size__ = 0x0400; -__stacks_total_size__ = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__; - -MEMORY -{ - flash : org = 0x100000, len = 256k - ram : org = 0x200020, len = 64k - 0x20 -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - - .text : ALIGN(16) SUBALIGN(16) - { - _text = .; - KEEP(*(vectors)) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - *(.ctors) - *(.dtors) - } > flash - - .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} - - __exidx_start = .; - .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash - __exidx_end = .; - - .eh_frame_hdr : {*(.eh_frame_hdr)} - - .eh_frame : ONLY_IF_RO {*(.eh_frame)} - - . = ALIGN(4); - _etext = .; - _textdata = _etext; - - .data : - { - _data = .; - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - _edata = .; - } > ram AT > flash - - .bss : - { - _bss_start = .; - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - _bss_end = .; - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__ - __stacks_total_size__; -__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__; diff --git a/os/ports/GCC/ARM/AT91SAM7/port.mk b/os/ports/GCC/ARM/AT91SAM7/port.mk deleted file mode 100644 index 2cafd01aab..0000000000 --- a/os/ports/GCC/ARM/AT91SAM7/port.mk +++ /dev/null @@ -1,11 +0,0 @@ -# List of the ChibiOS/RT ARM7 AT91SAM7 port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/ARM/chcore.c - -PORTASM = ${CHIBIOS}/os/ports/GCC/ARM/crt0.s \ - ${CHIBIOS}/os/ports/GCC/ARM/chcoreasm.s \ - ${CHIBIOS}/os/ports/GCC/ARM/AT91SAM7/vectors.s - -PORTINC = ${CHIBIOS}/os/ports/GCC/ARM \ - ${CHIBIOS}/os/ports/GCC/ARM/AT91SAM7 - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARM/AT91SAM7/ld diff --git a/os/ports/GCC/ARM/AT91SAM7/vectors.s b/os/ports/GCC/ARM/AT91SAM7/vectors.s deleted file mode 100644 index 5dc2699dc9..0000000000 --- a/os/ports/GCC/ARM/AT91SAM7/vectors.s +++ /dev/null @@ -1,104 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARM/AT91SAM7/vectors.s - * @brief Interrupt vectors for the AT91SAM7 family. - * - * @defgroup ARM_AT91SAM7_VECTORS AT91SAM7 Interrupt Vectors - * @ingroup ARM_SPECIFIC - * @details Interrupt vectors for the AT91SAM7 family. - * @{ - */ - -#if defined(__DOXYGEN__) -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -void _unhandled_exception(void) {} -#endif - -#if !defined(__DOXYGEN__) - -.section vectors -.code 32 -.balign 4 -/* - * System entry points. - */ -_start: - ldr pc, _reset - ldr pc, _undefined - ldr pc, _swi - ldr pc, _prefetch - ldr pc, _abort - nop - ldr pc, [pc,#-0xF20] /* AIC - AIC_IVR */ - ldr pc, [pc,#-0xF20] /* AIC - AIC_FVR */ - -_reset: - .word ResetHandler /* In crt0.s */ -_undefined: - .word UndHandler -_swi: - .word SwiHandler -_prefetch: - .word PrefetchHandler -_abort: - .word AbortHandler - .word 0 - .word 0 - .word 0 - -.text -.code 32 -.balign 4 - -/* - * Default exceptions handlers. The handlers are declared weak in order to be - * replaced by the real handling code. Everything is defaulted to an infinite - * loop. - */ -.weak UndHandler -UndHandler: - -.weak SwiHandler -SwiHandler: - -.weak PrefetchHandler -PrefetchHandler: - -.weak AbortHandler -AbortHandler: - -.weak FiqHandler -FiqHandler: - -.global _unhandled_exception -_unhandled_exception: - b _unhandled_exception - -#endif - -/** @} */ diff --git a/os/ports/GCC/ARM/AT91SAM7/wfi.h b/os/ports/GCC/ARM/AT91SAM7/wfi.h deleted file mode 100644 index 9901def0f0..0000000000 --- a/os/ports/GCC/ARM/AT91SAM7/wfi.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _WFI_H_ -#define _WFI_H_ - -#include "board.h" - -#ifndef port_wait_for_interrupt -#if ENABLE_WFI_IDLE != 0 -#define port_wait_for_interrupt() { \ - AT91C_BASE_SYS->PMC_SCDR = AT91C_PMC_PCK; \ -} -#else -#define port_wait_for_interrupt() -#endif -#endif - -#endif /* _WFI_H_ */ diff --git a/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld b/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld index 809def23a0..300adbc188 100644 --- a/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld +++ b/os/ports/GCC/ARM/BCM2835/ld/BCM2835.ld @@ -57,7 +57,7 @@ SECTIONS *(.dtors) } > ram - .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} > ram + .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} __exidx_start = .; .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > ram diff --git a/os/ports/GCC/ARM/LPC214x/armparams.h b/os/ports/GCC/ARM/LPC214x/armparams.h deleted file mode 100644 index b73a9c8089..0000000000 --- a/os/ports/GCC/ARM/LPC214x/armparams.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARM/LPC214x/armparams.h - * @brief ARM7 LPC214x Specific Parameters. - * - * @defgroup ARM_LPC214x LPC214x Specific Parameters - * @ingroup ARM_SPECIFIC - * @details This file contains the ARM specific parameters for the - * LPC214x platform. - * @{ - */ - -#ifndef _ARMPARAMS_H_ -#define _ARMPARAMS_H_ - -/** - * @brief ARM core model. - */ -#define ARM_CORE ARM_CORE_ARM7TDMI - -/** - * @brief LPC214x-specific wait for interrupt code. - * @details This implementation writes 1 into the PCON register. - */ -#if !defined(port_wait_for_interrupt) || defined(__DOXYGEN__) -#if ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() { \ - (*((volatile uint32_t *)0xE01FC0C0)) = 1; \ -} -#else -#define port_wait_for_interrupt() -#endif -#endif - -#endif /* _ARMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARM/LPC214x/ld/LPC2148.ld b/os/ports/GCC/ARM/LPC214x/ld/LPC2148.ld deleted file mode 100644 index cfe0cfe576..0000000000 --- a/os/ports/GCC/ARM/LPC214x/ld/LPC2148.ld +++ /dev/null @@ -1,108 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC2148 memory setup. - */ -__und_stack_size__ = 0x0004; -__abt_stack_size__ = 0x0004; -__fiq_stack_size__ = 0x0010; -__irq_stack_size__ = 0x0080; -__svc_stack_size__ = 0x0004; -__sys_stack_size__ = 0x0400; -__stacks_total_size__ = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__; - -MEMORY -{ - flash : org = 0x00000000, len = 512k - 12k - ram : org = 0x40000200, len = 32k - 0x200 - 288 -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; -__dma_start__ = 0x7FD00000; -__dma_size__ = 8k; -__dma_end__ = 0x7FD00000 + __dma_size__; - -SECTIONS -{ - . = 0; - - .text : ALIGN(16) SUBALIGN(16) - { - _text = .; - KEEP(*(vectors)) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - *(.ctors) - *(.dtors) - } > flash - - .ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)} - - __exidx_start = .; - .ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash - __exidx_end = .; - - .eh_frame_hdr : {*(.eh_frame_hdr)} - - .eh_frame : ONLY_IF_RO {*(.eh_frame)} - - . = ALIGN(4); - _etext = .; - _textdata = _etext; - - .data : - { - _data = .; - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - _edata = .; - } > ram AT > flash - - .bss : - { - _bss_start = .; - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - _bss_end = .; - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__ - __stacks_total_size__; -__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__; diff --git a/os/ports/GCC/ARM/LPC214x/port.mk b/os/ports/GCC/ARM/LPC214x/port.mk deleted file mode 100644 index 339f1d66ab..0000000000 --- a/os/ports/GCC/ARM/LPC214x/port.mk +++ /dev/null @@ -1,11 +0,0 @@ -# List of the ChibiOS/RT ARM7 LPC214x port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/ARM/chcore.c - -PORTASM = ${CHIBIOS}/os/ports/GCC/ARM/crt0.s \ - ${CHIBIOS}/os/ports/GCC/ARM/chcoreasm.s \ - ${CHIBIOS}/os/ports/GCC/ARM/LPC214x/vectors.s - -PORTINC = ${CHIBIOS}/os/ports/GCC/ARM \ - ${CHIBIOS}/os/ports/GCC/ARM/LPC214x - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARM/LPC214x/ld diff --git a/os/ports/GCC/ARM/LPC214x/vectors.s b/os/ports/GCC/ARM/LPC214x/vectors.s deleted file mode 100644 index db4350fd70..0000000000 --- a/os/ports/GCC/ARM/LPC214x/vectors.s +++ /dev/null @@ -1,101 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARM/LPC214x/vectors.s - * @brief Interrupt vectors for the LPC214x family. - * - * @defgroup ARM_LPC214x_VECTORS LPC214x Interrupt Vectors - * @ingroup ARM_SPECIFIC - * @details Interrupt vectors for the LPC214x family. - * @{ - */ - -#if defined(__DOXYGEN__) -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -void _unhandled_exception(void) {} -#endif - -#if !defined(__DOXYGEN__) - -.section vectors -.code 32 -.balign 4 -/* - * System entry points. - */ -_start: - ldr pc, _reset - ldr pc, _undefined - ldr pc, _swi - ldr pc, _prefetch - ldr pc, _abort - nop - ldr pc, [pc,#-0xFF0] /* VIC - IRQ Vector Register */ - ldr pc, _fiq - -_reset: - .word ResetHandler /* In crt0.s */ -_undefined: - .word UndHandler -_swi: - .word SwiHandler -_prefetch: - .word PrefetchHandler -_abort: - .word AbortHandler -_fiq: - .word FiqHandler - .word 0 - .word 0 - -/* - * Default exceptions handlers. The handlers are declared weak in order to be - * replaced by the real handling code. Everything is defaulted to an infinite - * loop. - */ -.weak UndHandler -UndHandler: - -.weak SwiHandler -SwiHandler: - -.weak PrefetchHandler -PrefetchHandler: - -.weak AbortHandler -AbortHandler: - -.weak FiqHandler -FiqHandler: - -.global _unhandled_exception -_unhandled_exception: - b _unhandled_exception - -#endif - -/** @} */ diff --git a/os/ports/GCC/ARM/LPC214x/wfi.h b/os/ports/GCC/ARM/LPC214x/wfi.h deleted file mode 100644 index ff27762419..0000000000 --- a/os/ports/GCC/ARM/LPC214x/wfi.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _WFI_H_ -#define _WFI_H_ - -#include "lpc214x.h" - -#ifndef port_wait_for_interrupt -#if ENABLE_WFI_IDLE != 0 -#define port_wait_for_interrupt() { \ - PCON = 1; \ -} -#else -#define port_wait_for_interrupt() -#endif -#endif - -#endif /* _WFI_H_ */ diff --git a/os/ports/GCC/ARM/rules.mk b/os/ports/GCC/ARM/rules.mk index 5bd5be2abf..b179a76905 100644 --- a/os/ports/GCC/ARM/rules.mk +++ b/os/ports/GCC/ARM/rules.mk @@ -8,7 +8,7 @@ ifeq ($(BUILDDIR),.) BUILDDIR = build endif OUTFILES = $(BUILDDIR)/$(PROJECT).elf $(BUILDDIR)/$(PROJECT).hex \ - $(BUILDDIR)/$(PROJECT).bin $(BUILDDIR)/$(PROJECT).dmp + $(BUILDDIR)/$(PROJECT).img $(BUILDDIR)/$(PROJECT).dmp # Automatic compiler options OPT = $(USE_OPT) @@ -190,7 +190,7 @@ else @$(HEX) $< $@ endif -%.bin: %.elf $(LDSCRIPT) +%.img: %.elf $(LDSCRIPT) ifeq ($(USE_VERBOSE_COMPILE),yes) $(BIN) $< $@ else diff --git a/os/ports/GCC/ARMCMx/LPC11xx/cmparams.h b/os/ports/GCC/ARMCMx/LPC11xx/cmparams.h deleted file mode 100644 index 7fa50caf08..0000000000 --- a/os/ports/GCC/ARMCMx/LPC11xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/LPC11xx/cmparams.h - * @brief ARM Cortex-M0 parameters for the LPC11xx. - * - * @defgroup ARMCMx_LPC11xx LPC11xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M0 specific parameters for the - * LPC11xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M0 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 2 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/LPC11xx/ld/LPC1114.ld b/os/ports/GCC/ARMCMx/LPC11xx/ld/LPC1114.ld deleted file mode 100644 index c4f328a155..0000000000 --- a/os/ports/GCC/ARMCMx/LPC11xx/ld/LPC1114.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC1114 memory setup. - */ -__main_stack_size__ = 0x0200; -__process_stack_size__ = 0x0200; - -MEMORY -{ - flash : org = 0x00000000, len = 32k - ram : org = 0x10000000, len = 8k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/LPC11xx/ld/LPC11U14.ld b/os/ports/GCC/ARMCMx/LPC11xx/ld/LPC11U14.ld deleted file mode 100644 index ef2e723c28..0000000000 --- a/os/ports/GCC/ARMCMx/LPC11xx/ld/LPC11U14.ld +++ /dev/null @@ -1,151 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC11U14 memory setup. - */ -__main_stack_size__ = 0x0100; -__process_stack_size__ = 0x0200; - -MEMORY -{ - flash : org = 0x00000000, len = 32k - ram : org = 0x10000000, len = 4k - usbram : org = 0x20004000, len = 2k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/LPC11xx/port.mk b/os/ports/GCC/ARMCMx/LPC11xx/port.mk deleted file mode 100644 index 8bfd25ad31..0000000000 --- a/os/ports/GCC/ARMCMx/LPC11xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M0 LPC11xx port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v6m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/LPC11xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/LPC11xx/ld diff --git a/os/ports/GCC/ARMCMx/LPC11xx/vectors.c b/os/ports/GCC/ARMCMx/LPC11xx/vectors.c deleted file mode 100644 index c51a89e25c..0000000000 --- a/os/ports/GCC/ARMCMx/LPC11xx/vectors.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/LPC11xx/vectors.c - * @brief Interrupt vectors for the LPC11xx family. - * - * @defgroup ARMCMx_LPC11xx_VECTORS LPC11xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the LPC11xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -#endif - -/** - * @brief LPC11xx vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/LPC13xx/cmparams.h b/os/ports/GCC/ARMCMx/LPC13xx/cmparams.h deleted file mode 100644 index 4079ec92ee..0000000000 --- a/os/ports/GCC/ARMCMx/LPC13xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/LPC13xx/cmparams.h - * @brief ARM Cortex-M3 LPC13xx Specific Parameters. - * - * @defgroup ARMCMx_LPC13xx LPC13xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * LPC13xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 3 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/LPC13xx/ld/LPC1343.ld b/os/ports/GCC/ARMCMx/LPC13xx/ld/LPC1343.ld deleted file mode 100644 index 4431d7a75e..0000000000 --- a/os/ports/GCC/ARMCMx/LPC13xx/ld/LPC1343.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC1343 memory setup. - */ -__main_stack_size__ = 0x0200; -__process_stack_size__ = 0x0200; - -MEMORY -{ - flash : org = 0x00000000, len = 32k - ram : org = 0x10000000, len = 8k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/LPC13xx/port.mk b/os/ports/GCC/ARMCMx/LPC13xx/port.mk deleted file mode 100644 index fa392c5d53..0000000000 --- a/os/ports/GCC/ARMCMx/LPC13xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M0 LPC13xx port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC13xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/LPC13xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/LPC13xx/ld diff --git a/os/ports/GCC/ARMCMx/LPC13xx/vectors.c b/os/ports/GCC/ARMCMx/LPC13xx/vectors.c deleted file mode 100644 index 350e8d0aa6..0000000000 --- a/os/ports/GCC/ARMCMx/LPC13xx/vectors.c +++ /dev/null @@ -1,227 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/LPC13xx/vectors.c - * @brief Interrupt vectors for the LPC13xx family. - * - * @defgroup ARMCMx_LPC13xx_VECTORS LPC13xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the LPC13xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -extern void VectorC0(void); -extern void VectorC4(void); -extern void VectorC8(void); -extern void VectorCC(void); -extern void VectorD0(void); -extern void VectorD4(void); -extern void VectorD8(void); -extern void VectorDC(void); -extern void VectorE0(void); -extern void VectorE4(void); -extern void VectorE8(void); -extern void VectorEC(void); -extern void VectorF0(void); -extern void VectorF4(void); -extern void VectorF8(void); -extern void VectorFC(void); -extern void Vector100(void); -extern void Vector104(void); -extern void Vector108(void); -extern void Vector10C(void); -extern void Vector110(void); -extern void Vector114(void); -extern void Vector118(void); -extern void Vector11C(void); -extern void Vector120(void); -extern void Vector124(void); -#endif - -/** - * @brief LPC13xx vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC, - VectorC0, VectorC4, VectorC8, VectorCC, - VectorD0, VectorD4, VectorD8, VectorDC, - VectorE0, VectorE4, VectorE8, VectorEC, - VectorF0, VectorF4, VectorF8, VectorFC, - Vector100, Vector104, Vector108, Vector10C, - Vector110, Vector114, Vector118, Vector11C, - Vector120, Vector124 -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorCC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorDC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorEC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorFC(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector100(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector104(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector108(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector10C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector110(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector114(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector118(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector11C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector120(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector124(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F0xx/cmparams.h b/os/ports/GCC/ARMCMx/STM32F0xx/cmparams.h deleted file mode 100644 index cf06a3627d..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F0xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F0xx/cmparams.h - * @brief ARM Cortex-M0 parameters for the STM32F0xx. - * - * @defgroup ARMCMx_STM32F0xx STM32F0xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M0 specific parameters for the - * STM32F0xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M0 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 2 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F0xx/ld/STM32F051x8.ld b/os/ports/GCC/ARMCMx/STM32F0xx/ld/STM32F051x8.ld deleted file mode 100644 index beffc882b1..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F0xx/ld/STM32F051x8.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F051x8 memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 64k - ram : org = 0x20000000, len = 8k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F0xx/port.mk b/os/ports/GCC/ARMCMx/STM32F0xx/port.mk deleted file mode 100644 index 5cb296a2bc..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F0xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M0 STM32 port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v6m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F0xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F0xx/ld diff --git a/os/ports/GCC/ARMCMx/STM32F0xx/vectors.c b/os/ports/GCC/ARMCMx/STM32F0xx/vectors.c deleted file mode 100644 index 48f7ceee4f..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F0xx/vectors.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F0xx/vectors.c - * @brief Interrupt vectors for the STM32F0xx family. - * - * @defgroup ARMCMx_STM32F0xx_VECTORS STM32F0xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the STM32F0xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -#endif - -/** - * @brief STM32 vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/cmparams.h b/os/ports/GCC/ARMCMx/STM32F1xx/cmparams.h deleted file mode 100644 index ac0160afc0..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F1xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F1xx. - * - * @defgroup ARMCMx_STM32F1xx STM32F1xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * STM32F1xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F100xB.ld b/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F100xB.ld deleted file mode 100644 index 36c1905bea..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F100xB.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F100xB memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 128k - ram : org = 0x20000000, len = 8k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xB.ld b/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xB.ld deleted file mode 100644 index 313fdabc91..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xB.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F103xB memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 128k - ram : org = 0x20000000, len = 20k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xD.ld b/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xD.ld deleted file mode 100755 index c2a88a9481..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xD.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F103xE memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 384k - ram : org = 0x20000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xE.ld b/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xE.ld deleted file mode 100644 index db31407706..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xE.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F103xE memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 512k - ram : org = 0x20000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xG.ld b/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xG.ld deleted file mode 100644 index 7858ce9935..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F103xG.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F103xG memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 1m - ram : org = 0x20000000, len = 96k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F107xC.ld b/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F107xC.ld deleted file mode 100644 index f512d4d045..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/ld/STM32F107xC.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F107xC memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 256k - ram : org = 0x20000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/port.mk b/os/ports/GCC/ARMCMx/STM32F1xx/port.mk deleted file mode 100644 index 1ba6c672e0..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M3 STM32 port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F1xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F1xx/ld diff --git a/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c b/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c deleted file mode 100644 index 07145f76c9..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F1xx/vectors.c - * @brief Interrupt vectors for the STM32F1xx family. - * - * @defgroup ARMCMx_STM32F1xx_VECTORS STM32F1xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the STM32F1xx family. - * One of the following macros must be defined on the - * compiler command line or in a file named board.h: - * - @p STM32F10X_LD - * - @p STM32F10X_LD_VL - * - @p STM32F10X_MD - * - @p STM32F10X_MD_VL - * - @p STM32F10X_HD - * - @p STM32F10X_XL - * - @p STM32F10X_CL - * . - * This is required in order to include a vectors table with - * the correct length for the specified STM32 model. - * @{ - */ - -#include "ch.h" - -#if !defined(STM32F10X_LD) && !defined(STM32F10X_LD_VL) && \ - !defined(STM32F10X_MD) && !defined(STM32F10X_MD_VL) && \ - !defined(STM32F10X_HD) && !defined(STM32F10X_XL) && \ - !defined(STM32F10X_CL) -#include "board.h" -#endif - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -extern void VectorC0(void); -extern void VectorC4(void); -extern void VectorC8(void); -extern void VectorCC(void); -extern void VectorD0(void); -extern void VectorD4(void); -extern void VectorD8(void); -extern void VectorDC(void); -extern void VectorE0(void); -extern void VectorE4(void); -extern void VectorE8(void); -#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) || \ - defined(STM32F10X_XL) || defined(STM32F10X_CL) -extern void VectorEC(void); -extern void VectorF0(void); -extern void VectorF4(void); -#endif -#if defined(STM32F10X_HD) || defined(STM32F10X_XL) || defined(STM32F10X_CL) -extern void VectorF8(void); -extern void VectorFC(void); -extern void Vector100(void); -extern void Vector104(void); -extern void Vector108(void); -extern void Vector10C(void); -extern void Vector110(void); -extern void Vector114(void); -extern void Vector118(void); -extern void Vector11C(void); -extern void Vector120(void); -extern void Vector124(void); -extern void Vector128(void); -extern void Vector12C(void); -#endif -#if defined(STM32F10X_CL) -extern void Vector130(void); -extern void Vector134(void); -extern void Vector138(void); -extern void Vector13C(void); -extern void Vector140(void); -extern void Vector144(void); -extern void Vector148(void); -extern void Vector14C(void); -#endif -#endif - -/** - * @brief STM32 vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC, - VectorC0, VectorC4, VectorC8, VectorCC, - VectorD0, VectorD4, VectorD8, VectorDC, - VectorE0, VectorE4, VectorE8, -#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) || \ - defined(STM32F10X_XL) || defined(STM32F10X_CL) - VectorEC, VectorF0, VectorF4, -#endif -#if defined(STM32F10X_HD) || defined(STM32F10X_XL) || defined(STM32F10X_CL) - VectorF8, VectorFC, Vector100, Vector104, - Vector108, Vector10C, Vector110, Vector114, - Vector118, Vector11C, Vector120, Vector124, - Vector128, Vector12C, -#endif -#if defined(STM32F10X_CL) - Vector130, Vector134, Vector138, Vector13C, - Vector140, Vector144, Vector148, Vector14C -#endif -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorCC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorDC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE8(void) __attribute__((weak, alias("_unhandled_exception"))); -#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) || \ - defined(STM32F10X_XL) || defined(STM32F10X_CL) -void VectorEC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF4(void) __attribute__((weak, alias("_unhandled_exception"))); -#endif -#if defined(STM32F10X_HD) || defined(STM32F10X_XL) || defined(STM32F10X_CL) -void VectorF8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorFC(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector100(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector104(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector108(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector10C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector110(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector114(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector118(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector11C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector120(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector124(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector128(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector12C(void) __attribute__((weak, alias("_unhandled_exception"))); -#endif -#if defined(STM32F10X_CL) -void Vector130(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector134(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector138(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector13C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector140(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector144(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector148(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector14C(void) __attribute__((weak, alias("_unhandled_exception"))); -#endif - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F2xx/cmparams.h b/os/ports/GCC/ARMCMx/STM32F2xx/cmparams.h deleted file mode 100644 index 3cdf0407ba..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F2xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F2xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F2xx. - * - * @defgroup ARMCMx_STM32F2xx STM32F2xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M4 specific parameters for the - * STM32F2xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F205xB.ld b/os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F205xB.ld deleted file mode 100644 index 097eed2e4d..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F205xB.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F205xB memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 128k - ram : org = 0x20000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F207xG.ld b/os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F207xG.ld deleted file mode 100644 index 2191f7fce1..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F2xx/ld/STM32F207xG.ld +++ /dev/null @@ -1,151 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F207xG memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 1M - ram : org = 0x20000000, len = 112k - ethram : org = 0x2001C000, len = 16k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F2xx/port.mk b/os/ports/GCC/ARMCMx/STM32F2xx/port.mk deleted file mode 100644 index 95104160cf..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F2xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M3 STM32 port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F2xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F2xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F2xx/ld diff --git a/os/ports/GCC/ARMCMx/STM32F2xx/vectors.c b/os/ports/GCC/ARMCMx/STM32F2xx/vectors.c deleted file mode 100644 index fce885f4ff..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F2xx/vectors.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F2xx/vectors.c - * @brief Interrupt vectors for the STM32F2xx family. - * - * @defgroup ARMCMx_STM32F2xx_VECTORS STM32F2xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the STM32F2xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -extern void VectorC0(void); -extern void VectorC4(void); -extern void VectorC8(void); -extern void VectorCC(void); -extern void VectorD0(void); -extern void VectorD4(void); -extern void VectorD8(void); -extern void VectorDC(void); -extern void VectorE0(void); -extern void VectorE4(void); -extern void VectorE8(void); -extern void VectorEC(void); -extern void VectorF0(void); -extern void VectorF4(void); -extern void VectorF8(void); -extern void VectorFC(void); -extern void Vector100(void); -extern void Vector104(void); -extern void Vector108(void); -extern void Vector10C(void); -extern void Vector110(void); -extern void Vector114(void); -extern void Vector118(void); -extern void Vector11C(void); -extern void Vector120(void); -extern void Vector124(void); -extern void Vector128(void); -extern void Vector12C(void); -extern void Vector130(void); -extern void Vector134(void); -extern void Vector138(void); -extern void Vector13C(void); -extern void Vector140(void); -extern void Vector144(void); -extern void Vector148(void); -extern void Vector14C(void); -extern void Vector150(void); -extern void Vector154(void); -extern void Vector158(void); -extern void Vector15C(void); -extern void Vector160(void); -extern void Vector164(void); -extern void Vector168(void); -extern void Vector16C(void); -extern void Vector170(void); -extern void Vector174(void); -extern void Vector178(void); -extern void Vector17C(void); -extern void Vector180(void); -#endif - -/** - * @brief STM32 vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC, - VectorC0, VectorC4, VectorC8, VectorCC, - VectorD0, VectorD4, VectorD8, VectorDC, - VectorE0, VectorE4, VectorE8, VectorEC, - VectorF0, VectorF4, VectorF8, VectorFC, - Vector100, Vector104, Vector108, Vector10C, - Vector110, Vector114, Vector118, Vector11C, - Vector120, Vector124, Vector128, Vector12C, - Vector130, Vector134, Vector138, Vector13C, - Vector140, Vector144, Vector148, Vector14C, - Vector150, Vector154, Vector158, Vector15C, - Vector160, Vector164, Vector168, Vector16C, - Vector170, Vector174, Vector178, Vector17C, - Vector180 -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorCC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorDC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorEC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorFC(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector100(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector104(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector108(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector10C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector110(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector114(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector118(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector11C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector120(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector124(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector128(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector12C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector130(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector134(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector138(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector13C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector140(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector144(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector148(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector14C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector150(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector154(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector158(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector15C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector160(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector164(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector168(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector16C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector170(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector174(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector178(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector17C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector180(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F3xx/cmparams.h b/os/ports/GCC/ARMCMx/STM32F3xx/cmparams.h deleted file mode 100644 index 99b2239ff2..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F3xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F4xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F4xx. - * - * @defgroup ARMCMx_STM32F4xx STM32F4xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M4 specific parameters for the - * STM32F4xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M4 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU TRUE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F3xx/ld/STM32F303xC.ld b/os/ports/GCC/ARMCMx/STM32F3xx/ld/STM32F303xC.ld deleted file mode 100644 index eab4626475..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F3xx/ld/STM32F303xC.ld +++ /dev/null @@ -1,151 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F303xC memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 256k - ram : org = 0x20000000, len = 40k - ccmram : org = 0x10000000, len = 8k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F3xx/port.mk b/os/ports/GCC/ARMCMx/STM32F3xx/port.mk deleted file mode 100644 index 09cc8dfd6a..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F3xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M4 STM32 port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F3xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F3xx/ld diff --git a/os/ports/GCC/ARMCMx/STM32F3xx/vectors.c b/os/ports/GCC/ARMCMx/STM32F3xx/vectors.c deleted file mode 100644 index a4d98878c6..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F3xx/vectors.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F3xx/vectors.c - * @brief Interrupt vectors for the STM32F3xx family. - * - * @defgroup ARMCMx_STM32F3xx_VECTORS STM32F3xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the STM32F3xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -extern void VectorC0(void); -extern void VectorC4(void); -extern void VectorC8(void); -extern void VectorCC(void); -extern void VectorD0(void); -extern void VectorD4(void); -extern void VectorD8(void); -extern void VectorDC(void); -extern void VectorE0(void); -extern void VectorE4(void); -extern void VectorE8(void); -extern void VectorEC(void); -extern void VectorF0(void); -extern void VectorF4(void); -extern void VectorF8(void); -extern void VectorFC(void); -extern void Vector100(void); -extern void Vector104(void); -extern void Vector108(void); -extern void Vector10C(void); -extern void Vector110(void); -extern void Vector114(void); -extern void Vector118(void); -extern void Vector11C(void); -extern void Vector120(void); -extern void Vector124(void); -extern void Vector128(void); -extern void Vector12C(void); -extern void Vector130(void); -extern void Vector134(void); -extern void Vector138(void); -extern void Vector13C(void); -extern void Vector140(void); -extern void Vector144(void); -extern void Vector148(void); -extern void Vector14C(void); -extern void Vector150(void); -extern void Vector154(void); -extern void Vector158(void); -extern void Vector15C(void); -extern void Vector160(void); -extern void Vector164(void); -extern void Vector168(void); -extern void Vector16C(void); -extern void Vector170(void); -extern void Vector174(void); -extern void Vector178(void); -extern void Vector17C(void); -extern void Vector180(void); -extern void Vector184(void); -#endif - -/** - * @brief STM32 vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC, - VectorC0, VectorC4, VectorC8, VectorCC, - VectorD0, VectorD4, VectorD8, VectorDC, - VectorE0, VectorE4, VectorE8, VectorEC, - VectorF0, VectorF4, VectorF8, VectorFC, - Vector100, Vector104, Vector108, Vector10C, - Vector110, Vector114, Vector118, Vector11C, - Vector120, Vector124, Vector128, Vector12C, - Vector130, Vector134, Vector138, Vector13C, - Vector140, Vector144, Vector148, Vector14C, - Vector150, Vector154, Vector158, Vector15C, - Vector160, Vector164, Vector168, Vector16C, - Vector170, Vector174, Vector178, Vector17C, - Vector180, Vector184 -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorCC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorDC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorEC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorFC(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector100(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector104(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector108(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector10C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector110(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector114(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector118(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector11C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector120(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector124(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector128(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector12C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector130(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector134(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector138(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector13C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector140(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector144(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector148(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector14C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector150(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector154(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector158(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector15C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector160(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector164(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector168(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector16C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector170(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector174(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector178(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector17C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector180(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector184(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F4xx/cmparams.h b/os/ports/GCC/ARMCMx/STM32F4xx/cmparams.h deleted file mode 100644 index 99b2239ff2..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F4xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F4xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F4xx. - * - * @defgroup ARMCMx_STM32F4xx STM32F4xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M4 specific parameters for the - * STM32F4xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M4 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU TRUE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F405xG.ld b/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F405xG.ld deleted file mode 100644 index dc65ba048e..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F405xG.ld +++ /dev/null @@ -1,152 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F405xG memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 1M - ram : org = 0x20000000, len = 112k - ethram : org = 0x2001C000, len = 16k - ccmram : org = 0x10000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG.ld b/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG.ld deleted file mode 100644 index afd0d4ff64..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG.ld +++ /dev/null @@ -1,152 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F407xG memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 1M - ram : org = 0x20000000, len = 112k - ethram : org = 0x2001C000, len = 16k - ccmram : org = 0x10000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG_CCM.ld b/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG_CCM.ld deleted file mode 100644 index d0dd10a3ca..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG_CCM.ld +++ /dev/null @@ -1,173 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32F407xG memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 1M - ram : org = 0x20000000, len = 112k - ethram : org = 0x2001C000, len = 16k - ccmram : org = 0x10000000, len = 64k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ccmram - - .ccm : - { - PROVIDE(_cmm_start = .); - . = ALIGN(4); - *(.bss.mainthread.*) - . = ALIGN(4); - *(.bss._idle_thread_wa) - . = ALIGN(4); - *(.bss.rlist) - . = ALIGN(4); - *(.bss.vtlist) - . = ALIGN(4); - *(.bss.endmem) - . = ALIGN(4); - *(.bss.nextmem) - . = ALIGN(4); - *(.bss.default_heap) - . = ALIGN(4); - PROVIDE(_cmmend = .); - } > ccmram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32F4xx/port.mk b/os/ports/GCC/ARMCMx/STM32F4xx/port.mk deleted file mode 100644 index 743f825e98..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F4xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M4 STM32 port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F4xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F4xx/ld diff --git a/os/ports/GCC/ARMCMx/STM32F4xx/vectors.c b/os/ports/GCC/ARMCMx/STM32F4xx/vectors.c deleted file mode 100644 index 6d552779dd..0000000000 --- a/os/ports/GCC/ARMCMx/STM32F4xx/vectors.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32F4xx/vectors.c - * @brief Interrupt vectors for the STM32F4xx family. - * - * @defgroup ARMCMx_STM32F4xx_VECTORS STM32F4xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the STM32F4xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __main_stack_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -extern void VectorC0(void); -extern void VectorC4(void); -extern void VectorC8(void); -extern void VectorCC(void); -extern void VectorD0(void); -extern void VectorD4(void); -extern void VectorD8(void); -extern void VectorDC(void); -extern void VectorE0(void); -extern void VectorE4(void); -extern void VectorE8(void); -extern void VectorEC(void); -extern void VectorF0(void); -extern void VectorF4(void); -extern void VectorF8(void); -extern void VectorFC(void); -extern void Vector100(void); -extern void Vector104(void); -extern void Vector108(void); -extern void Vector10C(void); -extern void Vector110(void); -extern void Vector114(void); -extern void Vector118(void); -extern void Vector11C(void); -extern void Vector120(void); -extern void Vector124(void); -extern void Vector128(void); -extern void Vector12C(void); -extern void Vector130(void); -extern void Vector134(void); -extern void Vector138(void); -extern void Vector13C(void); -extern void Vector140(void); -extern void Vector144(void); -extern void Vector148(void); -extern void Vector14C(void); -extern void Vector150(void); -extern void Vector154(void); -extern void Vector158(void); -extern void Vector15C(void); -extern void Vector160(void); -extern void Vector164(void); -extern void Vector168(void); -extern void Vector16C(void); -extern void Vector170(void); -extern void Vector174(void); -extern void Vector178(void); -extern void Vector17C(void); -extern void Vector180(void); -extern void Vector184(void); -#endif - -/** - * @brief STM32 vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __main_stack_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC, - VectorC0, VectorC4, VectorC8, VectorCC, - VectorD0, VectorD4, VectorD8, VectorDC, - VectorE0, VectorE4, VectorE8, VectorEC, - VectorF0, VectorF4, VectorF8, VectorFC, - Vector100, Vector104, Vector108, Vector10C, - Vector110, Vector114, Vector118, Vector11C, - Vector120, Vector124, Vector128, Vector12C, - Vector130, Vector134, Vector138, Vector13C, - Vector140, Vector144, Vector148, Vector14C, - Vector150, Vector154, Vector158, Vector15C, - Vector160, Vector164, Vector168, Vector16C, - Vector170, Vector174, Vector178, Vector17C, - Vector180, Vector184 -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorCC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorDC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorEC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorFC(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector100(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector104(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector108(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector10C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector110(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector114(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector118(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector11C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector120(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector124(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector128(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector12C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector130(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector134(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector138(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector13C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector140(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector144(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector148(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector14C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector150(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector154(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector158(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector15C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector160(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector164(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector168(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector16C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector170(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector174(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector178(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector17C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector180(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector184(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32L1xx/cmparams.h b/os/ports/GCC/ARMCMx/STM32L1xx/cmparams.h deleted file mode 100644 index 52807d27e3..0000000000 --- a/os/ports/GCC/ARMCMx/STM32L1xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32L1xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32L1xx. - * - * @defgroup ARMCMx_STM32L1xx STM32L1xx Specific Parameters - * @ingroup ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * STM32L1xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/STM32L1xx/ld/STM32L152xB.ld b/os/ports/GCC/ARMCMx/STM32L1xx/ld/STM32L152xB.ld deleted file mode 100644 index 3ac6053397..0000000000 --- a/os/ports/GCC/ARMCMx/STM32L1xx/ld/STM32L152xB.ld +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * ST32L1152xB memory setup. - */ -__main_stack_size__ = 0x0400; -__process_stack_size__ = 0x0400; - -MEMORY -{ - flash : org = 0x08000000, len = 128k - ram : org = 0x20000000, len = 16k -} - -__ram_start__ = ORIGIN(ram); -__ram_size__ = LENGTH(ram); -__ram_end__ = __ram_start__ + __ram_size__; - -SECTIONS -{ - . = 0; - _text = .; - - startup : ALIGN(16) SUBALIGN(16) - { - KEEP(*(vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text.startup.*) - *(.text) - *(.text.*) - *(.rodata) - *(.rodata.*) - *(.glue_7t) - *(.glue_7) - *(.gcc*) - } > flash - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > flash - - .ARM.exidx : { - PROVIDE(__exidx_start = .); - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - PROVIDE(__exidx_end = .); - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .textalign : ONLY_IF_RO - { - . = ALIGN(8); - } > flash - - _etext = .; - _textdata = _etext; - - .stacks : - { - . = ALIGN(8); - __main_stack_base__ = .; - . += __main_stack_size__; - . = ALIGN(8); - __main_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : - { - . = ALIGN(4); - PROVIDE(_data = .); - *(.data) - . = ALIGN(4); - *(.data.*) - . = ALIGN(4); - *(.ramtext) - . = ALIGN(4); - PROVIDE(_edata = .); - } > ram AT > flash - - .bss : - { - . = ALIGN(4); - PROVIDE(_bss_start = .); - *(.bss) - . = ALIGN(4); - *(.bss.*) - . = ALIGN(4); - *(COMMON) - . = ALIGN(4); - PROVIDE(_bss_end = .); - } > ram -} - -PROVIDE(end = .); -_end = .; - -__heap_base__ = _end; -__heap_end__ = __ram_end__; diff --git a/os/ports/GCC/ARMCMx/STM32L1xx/port.mk b/os/ports/GCC/ARMCMx/STM32L1xx/port.mk deleted file mode 100644 index 93b1775639..0000000000 --- a/os/ports/GCC/ARMCMx/STM32L1xx/port.mk +++ /dev/null @@ -1,15 +0,0 @@ -# List of the ChibiOS/RT Cortex-M3 STM32L1xx port files. -PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \ - $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/vectors.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \ - ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \ - ${CHIBIOS}/os/ports/common/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx \ - ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32L1xx - -PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32L1xx/ld diff --git a/os/ports/GCC/ARMCMx/STM32L1xx/vectors.c b/os/ports/GCC/ARMCMx/STM32L1xx/vectors.c deleted file mode 100644 index b662228736..0000000000 --- a/os/ports/GCC/ARMCMx/STM32L1xx/vectors.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/STM32L1xx/vectors.c - * @brief Interrupt vectors for the STM32 family. - * - * @defgroup ARMCMx_STM32L1xx_VECTORS STM32L1xx Interrupt Vectors - * @ingroup ARMCMx_SPECIFIC - * @details Interrupt vectors for the STM32L1xx family. - * @{ - */ - -#include "ch.h" - -#if !defined(__DOXYGEN__) -extern void __ram_end__(void); -extern void ResetHandler(void); -extern void NMIVector(void); -extern void HardFaultVector(void); -extern void MemManageVector(void); -extern void BusFaultVector(void); -extern void UsageFaultVector(void); -extern void Vector1C(void); -extern void Vector20(void); -extern void Vector24(void); -extern void Vector28(void); -extern void SVCallVector(void); -extern void DebugMonitorVector(void); -extern void Vector34(void); -extern void PendSVVector(void); -extern void SysTickVector(void); -extern void Vector40(void); -extern void Vector44(void); -extern void Vector48(void); -extern void Vector4C(void); -extern void Vector50(void); -extern void Vector54(void); -extern void Vector58(void); -extern void Vector5C(void); -extern void Vector60(void); -extern void Vector64(void); -extern void Vector68(void); -extern void Vector6C(void); -extern void Vector70(void); -extern void Vector74(void); -extern void Vector78(void); -extern void Vector7C(void); -extern void Vector80(void); -extern void Vector84(void); -extern void Vector88(void); -extern void Vector8C(void); -extern void Vector90(void); -extern void Vector94(void); -extern void Vector98(void); -extern void Vector9C(void); -extern void VectorA0(void); -extern void VectorA4(void); -extern void VectorA8(void); -extern void VectorAC(void); -extern void VectorB0(void); -extern void VectorB4(void); -extern void VectorB8(void); -extern void VectorBC(void); -extern void VectorC0(void); -extern void VectorC4(void); -extern void VectorC8(void); -extern void VectorCC(void); -extern void VectorD0(void); -extern void VectorD4(void); -extern void VectorD8(void); -extern void VectorDC(void); -extern void VectorE0(void); -extern void VectorE4(void); -extern void VectorE8(void); -extern void VectorEC(void); -extern void VectorF0(void); -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief STM32L1xx vectors table. - */ -#if !defined(__DOXYGEN__) -__attribute__ ((section("vectors"))) -#endif -void (*_vectors[])(void) = { - __ram_end__, ResetHandler, NMIVector, HardFaultVector, - MemManageVector, BusFaultVector, UsageFaultVector, Vector1C, - Vector20, Vector24, Vector28, SVCallVector, - DebugMonitorVector, Vector34, PendSVVector, SysTickVector, - Vector40, Vector44, Vector48, Vector4C, - Vector50, Vector54, Vector58, Vector5C, - Vector60, Vector64, Vector68, Vector6C, - Vector70, Vector74, Vector78, Vector7C, - Vector80, Vector84, Vector88, Vector8C, - Vector90, Vector94, Vector98, Vector9C, - VectorA0, VectorA4, VectorA8, VectorAC, - VectorB0, VectorB4, VectorB8, VectorBC, - VectorC0, VectorC4, VectorC8, VectorCC, - VectorD0, VectorD4, VectorD8, VectorDC, - VectorE0, VectorE4, VectorE8, VectorEC, - VectorF0 -}; - -/** - * @brief Unhandled exceptions handler. - * @details Any undefined exception vector points to this function by default. - * This function simply stops the system into an infinite loop. - * - * @notapi - */ -#if !defined(__DOXYGEN__) -__attribute__ ((naked)) -#endif -void _unhandled_exception(void) { - - while (TRUE) - ; -} - -void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void HardFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void MemManageVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void BusFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void UsageFaultVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector1C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector20(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector24(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector28(void) __attribute__((weak, alias("_unhandled_exception"))); -void SVCallVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void DebugMonitorVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector34(void) __attribute__((weak, alias("_unhandled_exception"))); -void PendSVVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void SysTickVector(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector40(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector44(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector48(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector4C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector50(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector54(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector58(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector5C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector60(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector64(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector68(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector6C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector70(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector74(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector78(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector7C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector80(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector84(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector88(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector8C(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector90(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector94(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector98(void) __attribute__((weak, alias("_unhandled_exception"))); -void Vector9C(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorA8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorAC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorB8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorBC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorC8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorCC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorD8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorDC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE0(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE4(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorE8(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorEC(void) __attribute__((weak, alias("_unhandled_exception"))); -void VectorF0(void) __attribute__((weak, alias("_unhandled_exception"))); - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chcore.c b/os/ports/GCC/ARMCMx/chcore.c deleted file mode 100644 index 632f7d4c61..0000000000 --- a/os/ports/GCC/ARMCMx/chcore.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chcore.c - * @brief ARM Cortex-Mx port code. - * - * @addtogroup ARMCMx_CORE - * @{ - */ - -#include "ch.h" - -/** - * @brief Halts the system. - * @note The function is declared as a weak symbol, it is possible - * to redefine it in your application code. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak)) -#endif -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chcore.h b/os/ports/GCC/ARMCMx/chcore.h deleted file mode 100644 index 25d41664d2..0000000000 --- a/os/ports/GCC/ARMCMx/chcore.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chcore.h - * @brief ARM Cortex-Mx port macros and structures. - * - * @addtogroup ARMCMx_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -/*===========================================================================*/ -/* Port constants (common). */ -/*===========================================================================*/ - -/* Added to make the header stand-alone when included from asm.*/ -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#define CORTEX_M0 0 /**< @brief Cortex-M0 variant. */ -#define CORTEX_M1 1 /**< @brief Cortex-M1 variant. */ -#define CORTEX_M3 3 /**< @brief Cortex-M3 variant. */ -#define CORTEX_M4 4 /**< @brief Cortex-M4 variant. */ - -/* Inclusion of the Cortex-Mx implementation specific parameters.*/ -#include "cmparams.h" - -/* Cortex model check, only M0 and M3 supported right now.*/ -#if (CORTEX_MODEL == CORTEX_M0) || (CORTEX_MODEL == CORTEX_M3) || \ - (CORTEX_MODEL == CORTEX_M4) -#elif (CORTEX_MODEL == CORTEX_M1) -#warning "untested Cortex-M model" -#else -#error "unknown or unsupported Cortex-M model" -#endif - -/** - * @brief Total priority levels. - */ -#define CORTEX_PRIORITY_LEVELS (1 << CORTEX_PRIORITY_BITS) - -/** - * @brief Minimum priority level. - * @details This minimum priority level is calculated from the number of - * priority bits supported by the specific Cortex-Mx implementation. - */ -#define CORTEX_MINIMUM_PRIORITY (CORTEX_PRIORITY_LEVELS - 1) - -/** - * @brief Maximum priority level. - * @details The maximum allowed priority level is always zero. - */ -#define CORTEX_MAXIMUM_PRIORITY 0 - -/*===========================================================================*/ -/* Port macros (common). */ -/*===========================================================================*/ - -/** - * @brief Priority level verification macro. - */ -#define CORTEX_IS_VALID_PRIORITY(n) \ - (((n) >= 0) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level verification macro. - */ -#define CORTEX_IS_VALID_KERNEL_PRIORITY(n) \ - (((n) >= CORTEX_MAX_KERNEL_PRIORITY) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level to priority mask conversion macro. - */ -#define CORTEX_PRIORITY_MASK(n) \ - ((n) << (8 - CORTEX_PRIORITY_BITS)) - -/*===========================================================================*/ -/* Port configurable parameters (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port derived parameters (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port exported info (common). */ -/*===========================================================================*/ - -/** - * @brief Macro defining a generic ARM architecture. - */ -#define CH_ARCHITECTURE_ARM - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "GCC " __VERSION__ - -/*===========================================================================*/ -/* Port implementation part (common). */ -/*===========================================================================*/ - -/* Includes the sub-architecture-specific part.*/ -#if (CORTEX_MODEL == CORTEX_M0) || (CORTEX_MODEL == CORTEX_M1) -#include "chcore_v6m.h" -#elif (CORTEX_MODEL == CORTEX_M3) || (CORTEX_MODEL == CORTEX_M4) -#include "chcore_v7m.h" -#endif - -#if !defined(_FROM_ASM_) - -#include "nvic.h" - -/* The following declarations are there just for Doxygen documentation, the - real declarations are inside the sub-headers.*/ -#if defined(__DOXYGEN__) - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note It is implemented to match the Cortex-Mx exception context. - */ -struct extctx {}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - */ -struct intctx {}; - -#endif /* defined(__DOXYGEN__) */ - -/** - * @brief Excludes the default @p chSchIsPreemptionRequired()implementation. - */ -#define PORT_OPTIMIZED_ISPREEMPTIONREQUIRED - -#if (CH_TIME_QUANTUM > 0) || defined(__DOXYGEN__) -/** - * @brief Inline-able version of this kernel function. - */ -#define chSchIsPreemptionRequired() \ - (currp->p_preempt ? firstprio(&rlist.r_queue) > currp->p_prio : \ - firstprio(&rlist.r_queue) >= currp->p_prio) -#else /* CH_TIME_QUANTUM == 0 */ -#define chSchIsPreemptionRequired() \ - (firstprio(&rlist.r_queue) > currp->p_prio) -#endif /* CH_TIME_QUANTUM == 0 */ - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chcore_v6m.c b/os/ports/GCC/ARMCMx/chcore_v6m.c deleted file mode 100644 index 6bdbbfeb52..0000000000 --- a/os/ports/GCC/ARMCMx/chcore_v6m.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chcore_v6m.c - * @brief ARMv6-M architecture port code. - * - * @addtogroup ARMCMx_V6M_CORE - * @{ - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Port interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief System Timer vector. - * @details This interrupt is used as system tick. - * @note The timer must be initialized in the startup code. - */ -CH_IRQ_HANDLER(SysTickVector) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -/** - * @brief NMI vector. - * @details The NMI vector is used for exception mode re-entering after a - * context switch. - */ -void NMIVector(void) { - register struct extctx *ctxp; - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - asm volatile ("mrs %0, PSP" : "=r" (ctxp) : : "memory"); - ctxp++; - asm volatile ("msr PSP, %0" : : "r" (ctxp) : "memory"); - port_unlock_from_isr(); -} -#endif /* !CORTEX_ALTERNATE_SWITCH */ - -#if CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - */ -void PendSVVector(void) { - register struct extctx *ctxp; - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - asm volatile ("mrs %0, PSP" : "=r" (ctxp) : : "memory"); - ctxp++; - asm volatile ("msr PSP, %0" : : "r" (ctxp) : "memory"); -} -#endif /* CORTEX_ALTERNATE_SWITCH */ - -/*===========================================================================*/ -/* Port exported functions. */ -/*===========================================================================*/ - -/** - * @brief IRQ epilogue code. - * - * @param[in] lr value of the @p LR register on ISR entry - */ -void _port_irq_epilogue(regarm_t lr) { - - if (lr != (regarm_t)0xFFFFFFF1) { - register struct extctx *ctxp; - - port_lock_from_isr(); - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - asm volatile ("mrs %0, PSP" : "=r" (ctxp) : : "memory"); - ctxp--; - asm volatile ("msr PSP, %0" : : "r" (ctxp) : "memory"); - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsPreemptionRequired()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (void *)_port_switch_from_isr; - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (void *)_port_exit_from_isr; - } - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - } -} - -/** - * @brief Post-IRQ switch code. - * @details The switch is performed in thread context then an NMI exception - * is enforced in order to return to the exact point before the - * preemption. - */ -#if !defined(__DOXYGEN__) -__attribute__((naked)) -#endif -void _port_switch_from_isr(void) { - - dbg_check_lock(); - chSchDoReschedule(); - dbg_check_unlock(); - asm volatile ("_port_exit_from_isr:" : : : "memory"); -#if CORTEX_ALTERNATE_SWITCH - SCB_ICSR = ICSR_PENDSVSET; - port_unlock(); -#else - SCB_ICSR = ICSR_NMIPENDSET; -#endif - /* The following loop should never be executed, the exception will kick in - immediately.*/ - while (TRUE) - ; -} - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !defined(__DOXYGEN__) -__attribute__((naked)) -#endif -void _port_switch(Thread *ntp, Thread *otp) { - register struct intctx *r13 asm ("r13"); - - asm volatile ("push {r4, r5, r6, r7, lr} \n\t" - "mov r4, r8 \n\t" - "mov r5, r9 \n\t" - "mov r6, r10 \n\t" - "mov r7, r11 \n\t" - "push {r4, r5, r6, r7}" : : : "memory"); - - otp->p_ctx.r13 = r13; - r13 = ntp->p_ctx.r13; - - asm volatile ("pop {r4, r5, r6, r7} \n\t" - "mov r8, r4 \n\t" - "mov r9, r5 \n\t" - "mov r10, r6 \n\t" - "mov r11, r7 \n\t" - "pop {r4, r5, r6, r7, pc}" : : "r" (r13) : "memory"); -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -void _port_thread_start(void) { - - chSysUnlock(); - asm volatile ("mov r0, r5 \n\t" - "blx r4 \n\t" - "bl chThdExit"); -} - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chcore_v6m.h b/os/ports/GCC/ARMCMx/chcore_v6m.h deleted file mode 100644 index c60ac661e4..0000000000 --- a/os/ports/GCC/ARMCMx/chcore_v6m.h +++ /dev/null @@ -1,376 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chcore_v6m.h - * @brief ARMv6-M architecture port macros and structures. - * - * @addtogroup ARMCMx_V6M_CORE - * @{ - */ - -#ifndef _CHCORE_V6M_H_ -#define _CHCORE_V6M_H_ - -/*===========================================================================*/ -/* Port constants. */ -/*===========================================================================*/ - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p 0, - * this handler always has the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV 0 - -/*===========================================================================*/ -/* Port macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief SYSTICK handler priority. - * @note The default SYSTICK handler priority is calculated as the priority - * level in the middle of the numeric priorities range. - */ -#if !defined(CORTEX_PRIORITY_SYSTICK) -#define CORTEX_PRIORITY_SYSTICK (CORTEX_PRIORITY_LEVELS >> 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SYSTICK) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SYSTICK" -#endif - -/** - * @brief Alternate preemption method. - * @details Activating this option will make the Kernel use the PendSV - * handler for preemption instead of the NMI handler. - */ -#ifndef CORTEX_ALTERNATE_SWITCH -#define CORTEX_ALTERNATE_SWITCH FALSE -#endif - -/*===========================================================================*/ -/* Port derived parameters. */ -/*===========================================================================*/ - -/** - * @brief Maximum usable priority for normal ISRs. - */ -#if CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#else -#define CORTEX_MAX_KERNEL_PRIORITY 0 -#endif - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -/** - * @brief Macro defining the specific ARM architecture. - */ -#define CH_ARCHITECTURE_ARM_v6M - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "ARMv6-M" - -/** - * @brief Name of the architecture variant. - */ -#if (CORTEX_MODEL == CORTEX_M0) || defined(__DOXYGEN__) -#define CH_CORE_VARIANT_NAME "Cortex-M0" -#elif (CORTEX_MODEL == CORTEX_M1) -#define CH_CORE_VARIANT_NAME "Cortex-M1" -#endif - -/** - * @brief Port-specific information string. - */ -#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -#define CH_PORT_INFO "Preemption through NMI" -#else -#define CH_PORT_INFO "Preemption through PendSV" -#endif - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Generic ARM register. - */ -typedef void *regarm_t; - - /* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) - -typedef uint64_t stkalign_t __attribute__ ((aligned (8))); - -struct extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -}; - -struct intctx { - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t lr; -}; - -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In this port the structure just holds a pointer to the @p intctx - * structure representing the stack pointer at context switch time. - */ -struct context { - struct intctx *r13; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.r13->r4 = (void *)(pf); \ - tp->p_ctx.r13->r5 = (void *)(arg); \ - tp->p_ctx.r13->lr = (void *)(_port_thread_start); \ -} - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() \ - regarm_t _saved_lr; \ - asm volatile ("mov %0, lr" : "=r" (_saved_lr) : : "memory") - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue(_saved_lr) - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Port-related initialization code. - */ -#define port_init() { \ - SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(0); \ - nvicSetSystemHandlerPriority(HANDLER_PENDSV, \ - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); \ - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, \ - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); \ -} - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform - * more actions. - */ -#define port_lock() asm volatile ("cpsid i" : : : "memory") - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform - * more actions. - */ -#define port_unlock() asm volatile ("cpsie i" : : : "memory") - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_lock_from_isr() port_lock() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_unlock_from_isr() port_unlock() - -/** - * @brief Disables all the interrupt sources. - */ -#define port_disable() asm volatile ("cpsid i" : : : "memory") - -/** - * @brief Disables the interrupt sources below kernel-level priority. - */ -#define port_suspend() asm volatile ("cpsid i" : : : "memory") - -/** - * @brief Enables all the interrupt sources. - */ -#define port_enable() asm volatile ("cpsie i" : : : "memory") - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() asm volatile ("wfi" : : : "memory") -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - register struct intctx *r13 asm ("r13"); \ - if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \ - chDbgPanic("stack overflow"); \ - _port_switch(ntp, otp); \ -} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_halt(void); - void _port_irq_epilogue(regarm_t lr); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V6M_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chcore_v7m.c b/os/ports/GCC/ARMCMx/chcore_v7m.c deleted file mode 100644 index 08f3fbba1c..0000000000 --- a/os/ports/GCC/ARMCMx/chcore_v7m.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chcore_v7m.c - * @brief ARMv7-M architecture port code. - * - * @addtogroup ARMCMx_V7M_CORE - * @{ - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Port interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief System Timer vector. - * @details This interrupt is used as system tick. - * @note The timer must be initialized in the startup code. - */ -CH_IRQ_HANDLER(SysTickVector) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief SVC vector. - * @details The SVC vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in advanced kernel mode. - */ -void SVCallVector(void) { - struct extctx *ctxp; - - /* Current PSP value.*/ - asm volatile ("mrs %0, PSP" : "=r" (ctxp) : : "memory"); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - -#if CORTEX_USE_FPU - /* Restoring the special register SCB_FPCCR.*/ - SCB_FPCCR = (uint32_t)ctxp->fpccr; - SCB_FPCAR = SCB_FPCAR + sizeof (struct extctx); -#endif - asm volatile ("msr PSP, %0" : : "r" (ctxp) : "memory"); - port_unlock_from_isr(); -} -#endif /* !CORTEX_SIMPLIFIED_PRIORITY */ - -#if CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in compact kernel mode. - */ -void PendSVVector(void) { - struct extctx *ctxp; - - /* Current PSP value.*/ - asm volatile ("mrs %0, PSP" : "=r" (ctxp) : : "memory"); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - -#if CORTEX_USE_FPU - /* Restoring the special register SCB_FPCCR.*/ - SCB_FPCCR = (uint32_t)ctxp->fpccr; - SCB_FPCAR = SCB_FPCAR + sizeof (struct extctx); -#endif - asm volatile ("msr PSP, %0" : : "r" (ctxp) : "memory"); -} -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/*===========================================================================*/ -/* Port exported functions. */ -/*===========================================================================*/ - -/** - * @brief Port-related initialization code. - */ -void _port_init(void) { - - /* Initialization of the vector table and priority related settings.*/ - SCB_VTOR = CORTEX_VTOR_INIT; - SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(CORTEX_PRIGROUP_INIT); - - /* Initialization of the system vectors used by the port.*/ - nvicSetSystemHandlerPriority(HANDLER_SVCALL, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SVCALL)); - nvicSetSystemHandlerPriority(HANDLER_PENDSV, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); -} - -#if !CH_OPTIMIZE_SPEED -void _port_lock(void) { - register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_KERNEL; - asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory"); -} - -void _port_unlock(void) { - register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_DISABLED; - asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory"); -} -#endif - -/** - * @brief Exception exit redirection to _port_switch_from_isr(). - */ -void _port_irq_epilogue(void) { - - port_lock_from_isr(); - if ((SCB_ICSR & ICSR_RETTOBASE) != 0) { - struct extctx *ctxp; - - /* Current PSP value.*/ - asm volatile ("mrs %0, PSP" : "=r" (ctxp) : : "memory"); - - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp--; - asm volatile ("msr PSP, %0" : : "r" (ctxp) : "memory"); - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsPreemptionRequired()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (void *)_port_switch_from_isr; -#if CORTEX_USE_FPU - /* Triggering a lazy FPU state save.*/ - asm volatile ("vmrs APSR_nzcv, FPSCR" : : : "memory"); -#endif - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (void *)_port_exit_from_isr; - } - -#if CORTEX_USE_FPU - { - uint32_t fpccr; - - /* Saving the special register SCB_FPCCR into the reserved offset of - the Cortex-M4 exception frame.*/ - (ctxp + 1)->fpccr = (regarm_t)(fpccr = SCB_FPCCR); - - /* Now the FPCCR is modified in order to not restore the FPU status - from the artificial return context.*/ - SCB_FPCCR = fpccr | FPCCR_LSPACT; - } -#endif - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - return; - } - port_unlock_from_isr(); -} - -/** - * @brief Post-IRQ switch code. - * @details Exception handlers return here for context switching. - */ -#if !defined(__DOXYGEN__) -__attribute__((naked)) -#endif -void _port_switch_from_isr(void) { - - dbg_check_lock(); - chSchDoReschedule(); - dbg_check_unlock(); - asm volatile ("_port_exit_from_isr:" : : : "memory"); -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) - asm volatile ("svc #0"); -#else /* CORTEX_SIMPLIFIED_PRIORITY */ - SCB_ICSR = ICSR_PENDSVSET; - port_unlock(); - while (TRUE) - ; -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ -} - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !defined(__DOXYGEN__) -__attribute__((naked)) -#endif -void _port_switch(Thread *ntp, Thread *otp) { - - asm volatile ("push {r4, r5, r6, r7, r8, r9, r10, r11, lr}" - : : : "memory"); -#if CORTEX_USE_FPU - asm volatile ("vpush {s16-s31}" : : : "memory"); -#endif - - asm volatile ("str sp, [%1, #12] \n\t" - "ldr sp, [%0, #12]" : : "r" (ntp), "r" (otp)); - -#if CORTEX_USE_FPU - asm volatile ("vpop {s16-s31}" : : : "memory"); -#endif - asm volatile ("pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}" - : : : "memory"); -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -void _port_thread_start(void) { - - chSysUnlock(); - asm volatile ("mov r0, r5 \n\t" - "blx r4 \n\t" - "bl chThdExit"); -} - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chcore_v7m.h b/os/ports/GCC/ARMCMx/chcore_v7m.h deleted file mode 100644 index 6a9aa536ff..0000000000 --- a/os/ports/GCC/ARMCMx/chcore_v7m.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chcore_v7m.h - * @brief ARMv7-M architecture port macros and structures. - * - * @addtogroup ARMCMx_V7M_CORE - * @{ - */ - -#ifndef _CHCORE_V7M_H_ -#define _CHCORE_V7M_H_ - -/*===========================================================================*/ -/* Port constants. */ -/*===========================================================================*/ - -/** - * @brief Disabled value for BASEPRI register. - */ -#define CORTEX_BASEPRI_DISABLED 0 - -/*===========================================================================*/ -/* Port macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief SYSTICK handler priority. - * @note The default SYSTICK handler priority is calculated as the priority - * level in the middle of the numeric priorities range. - */ -#if !defined(CORTEX_PRIORITY_SYSTICK) -#define CORTEX_PRIORITY_SYSTICK (CORTEX_PRIORITY_LEVELS >> 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SYSTICK) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SYSTICK" -#endif - -/** - * @brief FPU support in context switch. - * @details Activating this option activates the FPU support in the kernel. - */ -#if !defined(CORTEX_USE_FPU) -#define CORTEX_USE_FPU CORTEX_HAS_FPU -#elif CORTEX_USE_FPU && !CORTEX_HAS_FPU -/* This setting requires an FPU presence check in case it is externally - redefined.*/ -#error "the selected core does not have an FPU" -#endif - -/** - * @brief Simplified priority handling flag. - * @details Activating this option makes the Kernel work in compact mode. - */ -#if !defined(CORTEX_SIMPLIFIED_PRIORITY) -#define CORTEX_SIMPLIFIED_PRIORITY FALSE -#endif - -/** - * @brief SVCALL handler priority. - * @note The default SVCALL handler priority is defaulted to - * @p CORTEX_MAXIMUM_PRIORITY+1, this reserves the - * @p CORTEX_MAXIMUM_PRIORITY priority level as fast interrupts - * priority level. - */ -#if !defined(CORTEX_PRIORITY_SVCALL) -#define CORTEX_PRIORITY_SVCALL (CORTEX_MAXIMUM_PRIORITY + 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SVCALL) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SVCALL" -#endif - -/** - * @brief NVIC VTOR initialization expression. - */ -#if !defined(CORTEX_VTOR_INIT) || defined(__DOXYGEN__) -#define CORTEX_VTOR_INIT 0x00000000 -#endif - -/** - * @brief NVIC PRIGROUP initialization expression. - * @details The default assigns all available priority bits as preemption - * priority with no sub-priority. - */ -#if !defined(CORTEX_PRIGROUP_INIT) || defined(__DOXYGEN__) -#define CORTEX_PRIGROUP_INIT (7 - CORTEX_PRIORITY_BITS) -#endif - -/*===========================================================================*/ -/* Port derived parameters. */ -/*===========================================================================*/ - -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief Maximum usable priority for normal ISRs. - */ -#define CORTEX_MAX_KERNEL_PRIORITY (CORTEX_PRIORITY_SVCALL + 1) - -/** - * @brief BASEPRI level within kernel lock. - * @note In compact kernel mode this constant value is enforced to zero. - */ -#define CORTEX_BASEPRI_KERNEL \ - CORTEX_PRIORITY_MASK(CORTEX_MAX_KERNEL_PRIORITY) -#else - -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#define CORTEX_BASEPRI_KERNEL 0 -#endif - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p CORTEX_BASEPRI_KERNEL, - * this handler always have the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV CORTEX_BASEPRI_KERNEL - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -#if (CORTEX_MODEL == CORTEX_M3) || defined(__DOXYGEN__) -/** - * @brief Macro defining the specific ARM architecture. - */ -#define CH_ARCHITECTURE_ARM_v7M - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "ARMv7-M" - -/** - * @brief Name of the architecture variant. - */ -#define CH_CORE_VARIANT_NAME "Cortex-M3" - -#elif (CORTEX_MODEL == CORTEX_M4) -#define CH_ARCHITECTURE_ARM_v7ME -#define CH_ARCHITECTURE_NAME "ARMv7-ME" -#if CORTEX_USE_FPU -#define CH_CORE_VARIANT_NAME "Cortex-M4F" -#else -#define CH_CORE_VARIANT_NAME "Cortex-M4" -#endif -#endif - -/** - * @brief Port-specific information string. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define CH_PORT_INFO "Advanced kernel mode" -#else -#define CH_PORT_INFO "Compact kernel mode" -#endif - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Generic ARM register. - */ -typedef void *regarm_t; - -/* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) - -typedef uint64_t stkalign_t __attribute__ ((aligned (8))); - -struct extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -#if CORTEX_USE_FPU - regarm_t s0; - regarm_t s1; - regarm_t s2; - regarm_t s3; - regarm_t s4; - regarm_t s5; - regarm_t s6; - regarm_t s7; - regarm_t s8; - regarm_t s9; - regarm_t s10; - regarm_t s11; - regarm_t s12; - regarm_t s13; - regarm_t s14; - regarm_t s15; - regarm_t fpscr; - regarm_t fpccr; -#endif /* CORTEX_USE_FPU */ -}; - -struct intctx { -#if CORTEX_USE_FPU - regarm_t s16; - regarm_t s17; - regarm_t s18; - regarm_t s19; - regarm_t s20; - regarm_t s21; - regarm_t s22; - regarm_t s23; - regarm_t s24; - regarm_t s25; - regarm_t s26; - regarm_t s27; - regarm_t s28; - regarm_t s29; - regarm_t s30; - regarm_t s31; -#endif /* CORTEX_USE_FPU */ - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t lr; -}; - -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In this port the structure just holds a pointer to the @p intctx - * structure representing the stack pointer at context switch time. - */ -struct context { - struct intctx *r13; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.r13->r4 = (void *)(pf); \ - tp->p_ctx.r13->r5 = (void *)(arg); \ - tp->p_ctx.r13->lr = (void *)(_port_thread_start); \ -} - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Port-related initialization code. - */ -#define port_init() _port_init() - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform - * more actions. - * @note In this port this it raises the base priority to kernel level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#if CH_OPTIMIZE_SPEED || defined(__DOXYGEN__) -#define port_lock() { \ - register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_KERNEL; \ - asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory"); \ -} -#else /* !CH_OPTIMIZE_SPEED */ -#define port_lock() { \ - asm volatile ("bl _port_lock" : : : "r3", "lr", "memory"); \ -} -#endif /* !CH_OPTIMIZE_SPEED */ -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_lock() asm volatile ("cpsid i" : : : "memory") -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform - * more actions. - * @note In this port this it lowers the base priority to user level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#if CH_OPTIMIZE_SPEED || defined(__DOXYGEN__) -#define port_unlock() { \ - register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_DISABLED; \ - asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory"); \ -} -#else /* !CH_OPTIMIZE_SPEED */ -#define port_unlock() { \ - asm volatile ("bl _port_unlock" : : : "r3", "lr", "memory"); \ -} -#endif /* !CH_OPTIMIZE_SPEED */ -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_unlock() asm volatile ("cpsie i" : : : "memory") -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_lock_from_isr() port_lock() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note Same as @p port_unlock() in this port. - */ -#define port_unlock_from_isr() port_unlock() - -/** - * @brief Disables all the interrupt sources. - * @note Of course non-maskable interrupt sources are not included. - * @note In this port it disables all the interrupt sources by raising - * the priority mask to level 0. - */ -#define port_disable() asm volatile ("cpsid i" : : : "memory") - -/** - * @brief Disables the interrupt sources below kernel-level priority. - * @note Interrupt sources above kernel level remains enabled. - * @note In this port it raises/lowers the base priority to kernel level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_suspend() { \ - register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_KERNEL; \ - asm volatile ("msr BASEPRI, %0 \n\t" \ - "cpsie i" : : "r" (tmp) : "memory"); \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_suspend() asm volatile ("cpsid i" : : : "memory") -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Enables all the interrupt sources. - * @note In this port it lowers the base priority to user level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_enable() { \ - register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_DISABLED; \ - asm volatile ("msr BASEPRI, %0 \n\t" \ - "cpsie i" : : "r" (tmp) : "memory"); \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_enable() asm volatile ("cpsie i" : : : "memory") -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() { \ - asm volatile ("wfi" : : : "memory"); \ -} -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - register struct intctx *r13 asm ("r13"); \ - if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \ - chDbgPanic("stack overflow"); \ - _port_switch(ntp, otp); \ -} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_halt(void); - void _port_init(void); - void _port_irq_epilogue(void); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#if !CH_OPTIMIZE_SPEED - void _port_lock(void); - void _port_unlock(void); -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V7M_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/chtypes.h b/os/ports/GCC/ARMCMx/chtypes.h deleted file mode 100644 index 70feda2fe4..0000000000 --- a/os/ports/GCC/ARMCMx/chtypes.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file GCC/ARMCMx/chtypes.h - * @brief ARM Cortex-Mx port system types. - * - * @addtogroup ARMCMx_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#define __need_ptrdiff_t -#include - -#include - -typedef int32_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint32_t tprio_t; /**< Thread priority. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef int32_t eventid_t; /**< Event Id. */ -typedef uint32_t eventmask_t; /**< Event mask. */ -typedef uint32_t flagsmask_t; /**< Event flags. */ -typedef uint32_t systime_t; /**< System time. */ -typedef int32_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note It uses the "packed" GCC attribute. - */ -#define PACK_STRUCT_STRUCT __attribute__((packed)) - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/crt0.c b/os/ports/GCC/ARMCMx/crt0.c deleted file mode 100644 index c1d32ba848..0000000000 --- a/os/ports/GCC/ARMCMx/crt0.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file ARMCMx/crt0.c - * @brief Generic ARMvx-M (Cortex-M0/M1/M3/M4) startup file for ChibiOS/RT. - * - * @addtogroup ARMCMx_STARTUP - * @{ - */ - -#include "ch.h" - -typedef void (*funcp_t)(void); -typedef funcp_t * funcpp_t; - -#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0)) - -/* - * Area fill code, it is a macro because here functions cannot be called - * until stacks are initialized. - */ -#define fill32(start, end, filler) { \ - uint32_t *p1 = start; \ - uint32_t *p2 = end; \ - while (p1 < p2) \ - *p1++ = filler; \ -} - -/*===========================================================================*/ -/** - * @name Startup settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Control special register initialization value. - * @details The system is setup to run in privileged mode using the PSP - * stack (dual stack mode). - */ -#if !defined(CRT0_CONTROL_INIT) || defined(__DOXYGEN__) -#define CRT0_CONTROL_INIT 0x00000002 -#endif - -/** - * @brief Stack segments initialization switch. - */ -#if !defined(CRT0_STACKS_FILL_PATTERN) || defined(__DOXYGEN__) -#define CRT0_STACKS_FILL_PATTERN 0x55555555 -#endif - -/** - * @brief Stack segments initialization switch. - */ -#if !defined(CRT0_INIT_STACKS) || defined(__DOXYGEN__) -#define CRT0_INIT_STACKS TRUE -#endif - -/** - * @brief DATA segment initialization switch. - */ -#if !defined(CRT0_INIT_DATA) || defined(__DOXYGEN__) -#define CRT0_INIT_DATA TRUE -#endif - -/** - * @brief BSS segment initialization switch. - */ -#if !defined(CRT0_INIT_BSS) || defined(__DOXYGEN__) -#define CRT0_INIT_BSS TRUE -#endif - -/** - * @brief Constructors invocation switch. - */ -#if !defined(CRT0_CALL_CONSTRUCTORS) || defined(__DOXYGEN__) -#define CRT0_CALL_CONSTRUCTORS TRUE -#endif - -/** - * @brief Destructors invocation switch. - */ -#if !defined(CRT0_CALL_DESTRUCTORS) || defined(__DOXYGEN__) -#define CRT0_CALL_DESTRUCTORS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Symbols from the scatter file - */ -/*===========================================================================*/ - -/** - * @brief Main stack lower boundary. - * @details This symbol must be exported by the linker script and represents - * the main stack lower boundary. - */ -extern uint32_t __main_stack_base__; - -/** - * - * @brief Main stack initial position. - * @details This symbol must be exported by the linker script and represents - * the main stack initial position. - */ -extern uint32_t __main_stack_end__; - -/** - * @brief Process stack lower boundary. - * @details This symbol must be exported by the linker script and represents - * the process stack lower boundary. - */ -extern uint32_t __process_stack_base__; - -/** - * @brief Process stack initial position. - * @details This symbol must be exported by the linker script and represents - * the process stack initial position. - */ -extern uint32_t __process_stack_end__; - -/** - * @brief ROM image of the data segment start. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern uint32_t _textdata; - -/** - * @brief Data segment start. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern uint32_t _data; - -/** - * @brief Data segment end. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern uint32_t _edata; - -/** - * @brief BSS segment start. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern uint32_t _bss_start; - -/** - * @brief BSS segment end. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern uint32_t _bss_end; - -/** - * @brief Constructors table start. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern funcp_t __init_array_start; - -/** - * @brief Constructors table end. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern funcp_t __init_array_end; - -/** - * @brief Destructors table start. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern funcp_t __fini_array_start; - -/** - * @brief Destructors table end. - * @pre The symbol must be aligned to a 32 bits boundary. - */ -extern funcp_t __fini_array_end; - -/** @} */ - -/** - * @brief Application @p main() function. - */ -extern void main(void); - -/** - * @brief Early initialization. - * @details This hook is invoked immediately after the stack initialization - * and before the DATA and BSS segments initialization. The - * default behavior is to do nothing. - * @note This function is a weak symbol. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak)) -#endif -void __early_init(void) {} - -/** - * @brief Late initialization. - * @details This hook is invoked after the DATA and BSS segments - * initialization and before any static constructor. The - * default behavior is to do nothing. - * @note This function is a weak symbol. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak)) -#endif -void __late_init(void) {} - -/** - * @brief Default @p main() function exit handler. - * @details This handler is invoked or the @p main() function exit. The - * default behavior is to enter an infinite loop. - * @note This function is a weak symbol. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak, naked)) -#endif -void _default_exit(void) { - while (1) - ; -} - -/** - * @brief Reset vector. - */ -#if !defined(__DOXYGEN__) -__attribute__((naked)) -#endif -void ResetHandler(void) { - uint32_t psp, reg; - - /* Process Stack initialization, it is allocated starting from the - symbol __process_stack_end__ and its lower limit is the symbol - __process_stack_base__.*/ - asm volatile ("cpsid i"); - psp = SYMVAL(__process_stack_end__); - asm volatile ("msr PSP, %0" : : "r" (psp)); - -#if CORTEX_USE_FPU - /* Initializing the FPU context save in lazy mode.*/ - SCB_FPCCR = FPCCR_ASPEN | FPCCR_LSPEN; - - /* CP10 and CP11 set to full access.*/ - SCB_CPACR |= 0x00F00000; - - /* FPSCR and FPDSCR initially zero.*/ - reg = 0; - asm volatile ("vmsr FPSCR, %0" : : "r" (reg) : "memory"); - SCB_FPDSCR = reg; - - /* CPU mode initialization, enforced FPCA bit.*/ - reg = CRT0_CONTROL_INIT | 4; -#else - /* CPU mode initialization.*/ - reg = CRT0_CONTROL_INIT; -#endif - asm volatile ("msr CONTROL, %0" : : "r" (reg)); - asm volatile ("isb"); - -#if CRT0_INIT_STACKS - /* Main and Process stacks initialization.*/ - fill32(&__main_stack_base__, - &__main_stack_end__, - CRT0_STACKS_FILL_PATTERN); - fill32(&__process_stack_base__, - &__process_stack_end__, - CRT0_STACKS_FILL_PATTERN); -#endif - - /* Early initialization hook invocation.*/ - __early_init(); - -#if CRT0_INIT_DATA - /* DATA segment initialization.*/ - { - uint32_t *tp, *dp; - - tp = &_textdata; - dp = &_data; - while (dp < &_edata) - *dp++ = *tp++; - } -#endif - -#if CRT0_INIT_BSS - /* BSS segment initialization.*/ - fill32(&_bss_start, &_bss_end, 0); -#endif - - /* Late initialization hook invocation.*/ - __late_init(); - -#if CRT0_CALL_CONSTRUCTORS - /* Constructors invocation.*/ - { - funcpp_t fpp = &__init_array_start; - while (fpp < &__init_array_end) { - (*fpp)(); - fpp++; - } - } -#endif - - /* Invoking application main() function.*/ - main(); - -#if CRT0_CALL_DESTRUCTORS - /* Destructors invocation.*/ - { - funcpp_t fpp = &__fini_array_start; - while (fpp < &__fini_array_end) { - (*fpp)(); - fpp++; - } - } -#endif - - /* Invoking the exit handler.*/ - _default_exit(); -} - -/** @} */ diff --git a/os/ports/GCC/ARMCMx/port.dox b/os/ports/GCC/ARMCMx/port.dox deleted file mode 100644 index b030254cca..0000000000 --- a/os/ports/GCC/ARMCMx/port.dox +++ /dev/null @@ -1,258 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup ARMCMx ARM Cortex-Mx - * @details ARM Cortex-Mx port for the GCC compiler. - * - * @section ARMCMx_INTRO Introduction - * This port supports all the cores implementing the ARMv6-M and ARMv7-M - * architectures. - * - * @section ARMCMx_MODES Kernel Modes - * The Cortex-Mx port supports two distinct kernel modes: - * - Advanced Kernel mode. In this mode the kernel only masks - * interrupt sources with priorities below or equal to the - * @p CORTEX_BASEPRI_KERNEL level. Higher priorities are not affected by - * the kernel critical sections and can be used for fast interrupts. - * This mode is not available in the ARMv6-M architecture which does not - * support priority masking. - * - Compact Kernel mode. In this mode the kernel handles IRQ priorities - * in a simplified way, all interrupt sources are disabled when the kernel - * enters into a critical zone and re-enabled on exit. This is simple and - * adequate for most applications, this mode results in a more compact and - * faster kernel. - * . - * The selection of the mode is performed using the port configuration option - * @p CORTEX_SIMPLIFIED_PRIORITY. Apart from the different handling of - * interrupts there are no other differences between the two modes. The - * kernel API is exactly the same. - * - * @section ARMCMx_STATES_A System logical states in Compact Kernel mode - * The ChibiOS/RT logical @ref system_states are mapped as follow in Compact - * Kernel mode: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). In this state interrupts are enabled. The processor - * is running in thread-privileged mode. - * - Suspended. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. In this - * mode this state is not different from the Disabled state. - * - Disabled. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. In this - * mode this state is not different from the Suspended state. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wfi. - * - S-Locked. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. - * - I-Locked. In this state the interrupt sources are globally - * disabled. The processor is running in exception-privileged mode. - * - Serving Regular Interrupt. In this state the interrupt sources are - * not globally masked but only interrupts with higher priority can preempt - * the current handler. The processor is running in exception-privileged - * mode. - * - Serving Fast Interrupt. Not implemented in compact kernel mode. - * - Serving Non-Maskable Interrupt. The Cortex-Mx has a specific - * asynchronous NMI vector and several synchronous fault vectors that can - * be considered belonging to this category. - * - Halted. Implemented as an infinite loop after globally masking all - * the maskable interrupt sources. The ARM state is whatever the processor - * was running when @p chSysHalt() was invoked. - * - * @section ARMCMx_STATES_B System logical states in Advanced Kernel mode - * The ChibiOS/RT logical @ref system_states are mapped as follow in the - * Advanced Kernel mode: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). In this state the ARM Cortex-Mx has the BASEPRI register - * set at @p CORTEX_BASEPRI_USER level, interrupts are not masked. The - * processor is running in thread-privileged mode. - * - Suspended. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in thread-privileged mode. - * - Disabled. Interrupt sources are globally masked. The processor - * is running in thread-privileged mode. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wfi. - * - S-Locked. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in thread-privileged mode. - * - I-Locked. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in exception-privileged mode. - * - Serving Regular Interrupt. In this state the interrupt sources are - * not globally masked but only interrupts with higher priority can preempt - * the current handler. The processor is running in exception-privileged - * mode. - * - Serving Fast Interrupt. Fast interrupts are defined as interrupt - * sources having higher priority level than the kernel - * (@p CORTEX_BASEPRI_KERNEL). In this state is not possible to switch to - * the I-Locked state because fast interrupts can preempt the kernel - * critical zone.
    - * This state is not implemented in the ARMv6-M implementation because - * priority masking is not present in this architecture. - * - Serving Non-Maskable Interrupt. The Cortex-Mx has a specific - * asynchronous NMI vector and several synchronous fault vectors that can - * be considered belonging to this category. - * - Halted. Implemented as an infinite loop after globally masking all - * the maskable interrupt sources. The ARM state is whatever the processor - * was running when @p chSysHalt() was invoked. - * . - * @section ARMCMx_NOTES ARM Cortex-Mx/GCC port notes - * The ARM Cortex-Mx port is organized as follow: - * - The @p main() function is invoked in thread-privileged mode. - * - Each thread has a private process stack, the system has a single main - * stack where all the interrupts and exceptions are processed. - * - The threads are started in thread-privileged mode. - * - Interrupt nesting and the other advanced core/NVIC features are supported. - * - The Cortex-Mx port is perfectly generic, support for more devices can be - * easily added by adding a subdirectory under ./os/ports/GCC/ARMCMx - * and giving it the name of the new device, then copy the files from another - * device into the new directory and customize them for the new device. - * . - * @ingroup gcc - */ - -/** - * @defgroup ARMCMx_CONF Configuration Options - * @details ARM Cortex-Mx Configuration Options. The ARMCMx port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space used - * by an interrupt handler between the @p extctx and @p intctx - * structures. - * - @p IDLE_THREAD_STACK_SIZE, stack area size to be assigned to the IDLE - * thread. Usually there is no need to change this value unless inserting - * code in the IDLE thread using the @p IDLE_LOOP_HOOK hook macro. - * - @p CORTEX_PRIORITY_SYSTICK, priority of the SYSTICK handler. - * - @p CORTEX_PRIORITY_PENDSV, priority of the PENDSV handler. - * - @p CORTEX_ENABLE_WFI_IDLE, if set to @p TRUE enables the use of the - * @p wfi instruction from within the idle loop. This option is - * defaulted to FALSE because it can create problems with some debuggers. - * Setting this option to TRUE reduces the system power requirements. - * . - * @section ARMCMx_CONF_1 ARMv6-M specific options - * The following options are specific for the ARMv6-M architecture: - * - @p CORTEX_ALTERNATE_SWITCH, when activated makes the OS use the PendSV - * exception instead of NMI as preemption handler. - * . - * @section ARMCMx_CONF_2 ARMv7-M specific options - * The following options are specific for the ARMv6-M architecture: - * - @p CORTEX_PRIORITY_SVCALL, priority of the SVCALL handler. - * - @p CORTEX_SIMPLIFIED_PRIORITY, when enabled activates the Compact kernel - * mode. - * . - * @ingroup ARMCMx - */ - -/** - * @defgroup ARMCMx_CORE Core Port Implementation - * @details ARM Cortex-Mx specific port code, structures and macros. - * - * @ingroup ARMCMx - */ - -/** - * @defgroup ARMCMx_V6M_CORE ARMv6-M Specific Implementation - * @details ARMv6-M specific port code, structures and macros. - * - * @ingroup ARMCMx_CORE - */ - -/** - * @defgroup ARMCMx_V7M_CORE ARMv7-M Specific Implementation - * @details ARMv7-M specific port code, structures and macros. - * - * @ingroup ARMCMx_CORE - */ - -/** - * @defgroup ARMCMx_STARTUP Startup Support - * @details ChibiOS/RT provides its own generic startup file for the ARM - * Cortex-Mx port. - * Of course it is not mandatory to use it but care should be taken about the - * startup phase details. - * - * @section ARMCMx_STARTUP_1 Startup Process - * The startup process, as implemented, is the following: - * -# Interrupts are masked globally. - * -# The two stacks are initialized by assigning them the sizes defined in - * the linker script (also known as scatter file). - * -# The CPU state is switched to Privileged and the PSP stack is used. - * -# An early initialization routine @p __early_init() is invoked, if the - * symbol is not defined then an empty default routine is executed - * (weak symbol). - * -# DATA and BSS segments are initialized. - * -# Constructors are invoked. - * -# The @p main() function is invoked with no parameters. - * -# Destructors are invoked. - * -# A branch is performed to the weak symbol @p _default_exit(). The - * default code is an endless empty loop. - * . - * @section ARMCMx_STARTUP_2 Expected linker symbols - * The startup code starts at the symbol @p ResetHandler and expects the - * following symbols to be defined in the linker script: - * - @p __ram_end__, end of RAM. - * - @p __main_stack_base__, main stack lower boundary. - * - @p __main_stack_end__, main stack initial position. - * - @p __process_stack_base__, process stack lower boundary. - * - @p __process_stack_end__, process stack initial position. - * - @p _textdata, address of the data segment source read only data. - * - @p _data, start of the data segment. - * - @p _edata, end of the data segment end location. - * - @p _bss_start, start of the BSS. - * - @p _bss_end, end of the BSS segment. - * - @p __init_array_start, start of the constructors array. - * - @p __init_array_end, end of the constructors array. - * - @p __fini_array_start, start of the destructors array. - * - @p __fini_array_end, end of the destructors array. - * . - * Additionally the kernel expects the following symbols: - * - @p __main_thread_stack_base__, this symbol is required when the - * stack checking is enabled (CH_DBG_ENABLE_STACK_CHECK==TRUE), - * it is an alias of @p __process_stack_base__ in this port. - * - @p __heap_base__ and @p __heap_end__, those symbols are required - * if the memory core manager is enabled (CH_USE_MEMCORE==TRUE) - * with a default core size set to zero (CH_MEMCORE_SIZE==0). - * . - * @ingroup ARMCMx - */ - -/** - * @defgroup ARMCMx_NVIC NVIC Support - * @details ARM Cortex-Mx NVIC support. - * - * @ingroup ARMCMx - */ - -/** - * @defgroup ARMCMx_SPECIFIC Specific Implementations - * @details Platform-specific port code. - * - * @ingroup ARMCMx - */ diff --git a/os/ports/GCC/ARMCMx/rules.mk b/os/ports/GCC/ARMCMx/rules.mk deleted file mode 100644 index 111669fde8..0000000000 --- a/os/ports/GCC/ARMCMx/rules.mk +++ /dev/null @@ -1,220 +0,0 @@ -# ARM Cortex-Mx common makefile scripts and rules. - -# Output directory and files -ifeq ($(BUILDDIR),) - BUILDDIR = build -endif -ifeq ($(BUILDDIR),.) - BUILDDIR = build -endif -OUTFILES = $(BUILDDIR)/$(PROJECT).elf $(BUILDDIR)/$(PROJECT).hex \ - $(BUILDDIR)/$(PROJECT).bin $(BUILDDIR)/$(PROJECT).dmp - -# Automatic compiler options -OPT = $(USE_OPT) -COPT = $(USE_COPT) -CPPOPT = $(USE_CPPOPT) -ifeq ($(USE_LINK_GC),yes) - OPT += -ffunction-sections -fdata-sections -fno-common -endif - -# Source files groups and paths -ifeq ($(USE_THUMB),yes) - TCSRC += $(CSRC) - TCPPSRC += $(CPPSRC) -else - ACSRC += $(CSRC) - ACPPSRC += $(CPPSRC) -endif -ASRC = $(ACSRC)$(ACPPSRC) -TSRC = $(TCSRC)$(TCPPSRC) -SRCPATHS = $(sort $(dir $(ASMXSRC)) $(dir $(ASMSRC)) $(dir $(ASRC)) $(dir $(TSRC))) - -# Various directories -OBJDIR = $(BUILDDIR)/obj -LSTDIR = $(BUILDDIR)/lst - -# Object files groups -ACOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ACSRC:.c=.o))) -ACPPOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ACPPSRC:.cpp=.o))) -TCOBJS = $(addprefix $(OBJDIR)/, $(notdir $(TCSRC:.c=.o))) -TCPPOBJS = $(addprefix $(OBJDIR)/, $(notdir $(TCPPSRC:.cpp=.o))) -ASMOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ASMSRC:.s=.o))) -ASMXOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ASMXSRC:.S=.o))) -OBJS = $(ASMXOBJS) $(ASMOBJS) $(ACOBJS) $(TCOBJS) $(ACPPOBJS) $(TCPPOBJS) - -# Paths -IINCDIR = $(patsubst %,-I%,$(INCDIR) $(DINCDIR) $(UINCDIR)) -LLIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) - -# Macros -DEFS = $(DDEFS) $(UDEFS) -ADEFS = $(DADEFS) $(UADEFS) - -# Libs -LIBS = $(DLIBS) $(ULIBS) - -# Various settings -MCFLAGS = -mcpu=$(MCU) -ODFLAGS = -x --syms -ASFLAGS = $(MCFLAGS) -Wa,-amhls=$(LSTDIR)/$(notdir $(<:.s=.lst)) $(ADEFS) -ASXFLAGS = $(MCFLAGS) -Wa,-amhls=$(LSTDIR)/$(notdir $(<:.S=.lst)) $(ADEFS) -CFLAGS = $(MCFLAGS) $(OPT) $(COPT) $(CWARN) -Wa,-alms=$(LSTDIR)/$(notdir $(<:.c=.lst)) $(DEFS) -CPPFLAGS = $(MCFLAGS) $(OPT) $(CPPOPT) $(CPPWARN) -Wa,-alms=$(LSTDIR)/$(notdir $(<:.cpp=.lst)) $(DEFS) -ifeq ($(USE_LINK_GC),yes) - LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(BUILDDIR)/$(PROJECT).map,--cref,--no-warn-mismatch,--gc-sections $(LLIBDIR) -else - LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(BUILDDIR)/$(PROJECT).map,--cref,--no-warn-mismatch $(LLIBDIR) -endif - -# Thumb interwork enabled only if needed because it kills performance. -ifneq ($(TSRC),) - CFLAGS += -DTHUMB_PRESENT - CPPFLAGS += -DTHUMB_PRESENT - ASFLAGS += -DTHUMB_PRESENT - ifneq ($(ASRC),) - # Mixed ARM and THUMB mode. - CFLAGS += -mthumb-interwork - CPPFLAGS += -mthumb-interwork - ASFLAGS += -mthumb-interwork - LDFLAGS += -mthumb-interwork - else - # Pure THUMB mode, THUMB C code cannot be called by ARM asm code directly. - CFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING - CPPFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING - ASFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb - LDFLAGS += -mno-thumb-interwork -mthumb - endif -else - # Pure ARM mode - CFLAGS += -mno-thumb-interwork - CPPFLAGS += -mno-thumb-interwork - ASFLAGS += -mno-thumb-interwork - LDFLAGS += -mno-thumb-interwork -endif - -# Generate dependency information -CFLAGS += -MD -MP -MF .dep/$(@F).d -CPPFLAGS += -MD -MP -MF .dep/$(@F).d - -# Paths where to search for sources -VPATH = $(SRCPATHS) - -# -# Makefile rules -# - -all: $(OBJS) $(OUTFILES) MAKE_ALL_RULE_HOOK - -MAKE_ALL_RULE_HOOK: - -$(OBJS): | $(BUILDDIR) - -$(BUILDDIR) $(OBJDIR) $(LSTDIR): -ifneq ($(USE_VERBOSE_COMPILE),yes) - @echo Compiler Options - @echo $(CC) -c $(CFLAGS) -I. $(IINCDIR) main.c -o main.o - @echo -endif - mkdir -p $(OBJDIR) - mkdir -p $(LSTDIR) - -$(ACPPOBJS) : $(OBJDIR)/%.o : %.cpp Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ -endif - -$(TCPPOBJS) : $(OBJDIR)/%.o : %.cpp Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CPPC) -c $(CPPFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CPPC) -c $(CPPFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ -endif - -$(ACOBJS) : $(OBJDIR)/%.o : %.c Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CC) -c $(CFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CC) -c $(CFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ -endif - -$(TCOBJS) : $(OBJDIR)/%.o : %.c Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CC) -c $(CFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CC) -c $(CFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ -endif - -$(ASMOBJS) : $(OBJDIR)/%.o : %.s Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(AS) -c $(ASFLAGS) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(AS) -c $(ASFLAGS) -I. $(IINCDIR) $< -o $@ -endif - -$(ASMXOBJS) : $(OBJDIR)/%.o : %.S Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CC) -c $(ASXFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CC) -c $(ASXFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ -endif - -%.elf: $(OBJS) $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ -else - @echo Linking $@ - @$(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ -endif - -%.hex: %.elf $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - $(HEX) $< $@ -else - @echo Creating $@ - @$(HEX) $< $@ -endif - -%.bin: %.elf $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - $(BIN) $< $@ -else - @echo Creating $@ - @$(BIN) $< $@ -endif - -%.dmp: %.elf $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - $(OD) $(ODFLAGS) $< > $@ -else - @echo Creating $@ - @$(OD) $(ODFLAGS) $< > $@ - @echo Done -endif - -clean: - @echo Cleaning - -rm -fR .dep $(BUILDDIR) - @echo Done - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/os/ports/GCC/AVR/chcore.c b/os/ports/GCC/AVR/chcore.c deleted file mode 100644 index 0537904334..0000000000 --- a/os/ports/GCC/AVR/chcore.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/chcore.c - * @brief AVR architecture port code. - * - * @addtogroup AVR_CORE - * @{ - */ - -#include "ch.h" - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * @note The function is declared as a weak symbol, it is possible to - * redefine it in your application code. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !defined(__DOXYGEN__) -__attribute__((naked, weak)) -#endif -void port_switch(Thread *ntp, Thread *otp) { - - asm volatile ("push r2"); - asm volatile ("push r3"); - asm volatile ("push r4"); - asm volatile ("push r5"); - asm volatile ("push r6"); - asm volatile ("push r7"); - asm volatile ("push r8"); - asm volatile ("push r9"); - asm volatile ("push r10"); - asm volatile ("push r11"); - asm volatile ("push r12"); - asm volatile ("push r13"); - asm volatile ("push r14"); - asm volatile ("push r15"); - asm volatile ("push r16"); - asm volatile ("push r17"); - asm volatile ("push r28"); - asm volatile ("push r29"); - - asm volatile ("movw r30, r22"); - asm volatile ("in r0, 0x3d"); - asm volatile ("std Z+5, r0"); - asm volatile ("in r0, 0x3e"); - asm volatile ("std Z+6, r0"); - - asm volatile ("movw r30, r24"); - asm volatile ("ldd r0, Z+5"); - asm volatile ("out 0x3d, r0"); - asm volatile ("ldd r0, Z+6"); - asm volatile ("out 0x3e, r0"); - - asm volatile ("pop r29"); - asm volatile ("pop r28"); - asm volatile ("pop r17"); - asm volatile ("pop r16"); - asm volatile ("pop r15"); - asm volatile ("pop r14"); - asm volatile ("pop r13"); - asm volatile ("pop r12"); - asm volatile ("pop r11"); - asm volatile ("pop r10"); - asm volatile ("pop r9"); - asm volatile ("pop r8"); - asm volatile ("pop r7"); - asm volatile ("pop r6"); - asm volatile ("pop r5"); - asm volatile ("pop r4"); - asm volatile ("pop r3"); - asm volatile ("pop r2"); - asm volatile ("ret"); -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected (for example because a programming - * error in the application code that triggers an assertion while in - * debug mode). - * @note The function is declared as a weak symbol, it is possible to - * redefine it in your application code. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak)) -#endif -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -void _port_thread_start(void) { - - chSysUnlock(); - asm volatile ("movw r24, r4"); - asm volatile ("movw r30, r2"); - asm volatile ("icall"); - asm volatile ("call chThdExit"); -} - -/** @} */ diff --git a/os/ports/GCC/AVR/chcore.h b/os/ports/GCC/AVR/chcore.h deleted file mode 100644 index bdc7694cad..0000000000 --- a/os/ports/GCC/AVR/chcore.h +++ /dev/null @@ -1,325 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/chcore.h - * @brief AVR architecture port macros and structures. - * - * @addtogroup AVR_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#include -#include - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/** - * @brief If enabled allows the idle thread to enter a low power mode. - */ -#ifndef ENABLE_WFI_IDLE -#define ENABLE_WFI_IDLE 0 -#endif - -/** - * @brief Macro defining the AVR architecture. - */ -#define CH_ARCHITECTURE_AVR - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "AVR" - -/** - * @brief Name of the architecture variant (optional). - */ -#define CH_CORE_VARIANT_NAME "MegaAVR" - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "GCC " __VERSION__ - -/** - * @brief Port-specific information string. - */ -#define CH_PORT_INFO "None" - -/** - * @brief 8 bits stack and memory alignment enforcement. - */ -typedef uint8_t stkalign_t; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note The field @p _next is not part of the context, it represents the - * offset of the structure relative to the stack pointer. - */ -struct extctx { - uint8_t _next; - uint8_t r31; - uint8_t r30; - uint8_t r27; - uint8_t r26; - uint8_t r25; - uint8_t r24; - uint8_t r23; - uint8_t r22; - uint8_t r21; - uint8_t r20; - uint8_t r19; - uint8_t r18; - uint8_t sr; - uint8_t r1; - uint8_t r0; - uint16_t pc; -}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - * @note The field @p _next is not part of the context, it represents the - * offset of the structure relative to the stack pointer. - */ -struct intctx { - uint8_t _next; - uint8_t r29; - uint8_t r28; - uint8_t r17; - uint8_t r16; - uint8_t r15; - uint8_t r14; - uint8_t r13; - uint8_t r12; - uint8_t r11; - uint8_t r10; - uint8_t r9; - uint8_t r8; - uint8_t r7; - uint8_t r6; - uint8_t r5; - uint8_t r4; - uint8_t r3; - uint8_t r2; - uint8_t pcl; - uint8_t pch; -}; - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In the AVR port this structure just holds a pointer to the - * @p intctx structure representing the stack pointer at the time - * of the context switch. - */ -struct context { - struct intctx *sp; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.sp = (struct intctx*)((uint8_t *)workspace + wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.sp->r2 = (int)pf; \ - tp->p_ctx.sp->r3 = (int)pf >> 8; \ - tp->p_ctx.sp->r4 = (int)arg; \ - tp->p_ctx.sp->r5 = (int)arg >> 8; \ - tp->p_ctx.sp->pcl = (int)_port_thread_start >> 8; \ - tp->p_ctx.sp->pch = (int)_port_thread_start; \ -} - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 8. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 8 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * This value can be zero on those architecture where there is a - * separate interrupt stack and the stack space between @p intctx and - * @p extctx is known to be zero. - * @note In this port the default is 32 bytes per thread. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - (sizeof(struct intctx) - 1) + \ - (sizeof(struct extctx) - 1) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - * @note This code tricks the compiler to save all the specified registers - * by "touching" them. - */ -#define PORT_IRQ_PROLOGUE() { \ - asm ("" : : : "r18", "r19", "r20", "r21", "r22", "r23", "r24", \ - "r25", "r26", "r27", "r30", "r31"); \ -} - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() { \ - dbg_check_lock(); \ - if (chSchIsPreemptionRequired()) \ - chSchDoReschedule(); \ - dbg_check_unlock(); \ -} - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) ISR(id) - -/** - * @brief Port-related initialization code. - * @note This function is empty in this port. - */ -#define port_init() - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform more - * actions. - * @note Implemented as global interrupt disable. - */ -#define port_lock() asm volatile ("cli" : : : "memory") - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform more - * actions. - * @note Implemented as global interrupt enable. - */ -#define port_unlock() asm volatile ("sei" : : : "memory") - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note This function is empty in this port. - */ -#define port_lock_from_isr() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note This function is empty in this port. - */ -#define port_unlock_from_isr() - -/** - * @brief Disables all the interrupt sources. - * @note Of course non-maskable interrupt sources are not included. - * @note Implemented as global interrupt disable. - */ -#define port_disable() asm volatile ("cli" : : : "memory") - -/** - * @brief Disables the interrupt sources below kernel-level priority. - * @note Interrupt sources above kernel level remains enabled. - * @note Same as @p port_disable() in this port, there is no difference - * between the two states. - */ -#define port_suspend() asm volatile ("cli" : : : "memory") - -/** - * @brief Enables all the interrupt sources. - * @note Implemented as global interrupt enable. - */ -#define port_enable() asm volatile ("sei" : : : "memory") - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note This port function is implemented as inlined code for performance - * reasons. - */ -#if ENABLE_WFI_IDLE != 0 -#define port_wait_for_interrupt() { \ - asm volatile ("sleep" : : : "memory"); \ -} -#else -#define port_wait_for_interrupt() -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_switch(Thread *ntp, Thread *otp); - void port_halt(void); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/GCC/AVR/chtypes.h b/os/ports/GCC/AVR/chtypes.h deleted file mode 100644 index 96ed68aa3c..0000000000 --- a/os/ports/GCC/AVR/chtypes.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file AVR/chtypes.h - * @brief AVR architecture port system types. - * - * @addtogroup AVR_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#define __need_ptrdiff_t -#include - -#if !defined(_STDINT_H) && !defined(__STDINT_H_) -#include -#endif - -typedef int8_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint8_t tprio_t; /**< Thread priority. */ -typedef int16_t msg_t; /**< Inter-thread message. */ -typedef uint8_t eventid_t; /**< Event Id. */ -typedef uint8_t eventmask_t; /**< Event mask. */ -typedef uint8_t flagsmask_t; /**< Event flags. */ -typedef uint16_t systime_t; /**< System time. */ -typedef int8_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note It uses the "packed" GCC attribute. - */ -#define PACK_STRUCT_STRUCT __attribute__((packed)) - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/GCC/AVR/port.dox b/os/ports/GCC/AVR/port.dox deleted file mode 100644 index 7450d0e577..0000000000 --- a/os/ports/GCC/AVR/port.dox +++ /dev/null @@ -1,87 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup AVR MegaAVR - * @details AVR port for the GCC compiler. - * - * @section AVR_STATES Mapping of the System States in the AVR port - * The ChibiOS/RT logical @ref system_states are mapped as follow in the AVR - * port: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). Interrupts are enabled. - * - Suspended. Interrupts are disabled. - * - Disabled. Interrupts are disabled. This state is equivalent to the - * Suspended state because there are no fast interrupts in this architecture. - * - Sleep. This state is entered with the execution of the specific - * instruction @p sleep. - * - S-Locked. Interrupts are disabled. - * - I-Locked. This state is equivalent to the SRI state, the - * @p chSysLockI() and @p chSysUnlockI() APIs do nothing (still use them in - * order to formally change state because this may change). - * - Serving Regular Interrupt. Normal interrupt service code. - * - Serving Fast Interrupt. Not present in this architecture. - * - Serving Non-Maskable Interrupt. Not present in this architecture. - * - Halted. Implemented as an infinite loop with interrupts disabled. - * . - * @section AVR_NOTES The AVR port notes - * - The AVR does not have a dedicated interrupt stack, make sure to reserve - * enough stack space for interrupts in each thread stack. This can be done - * by modifying the @p INT_REQUIRED_STACK macro into - * ./ports/AVR/chcore.h. - * . - * @ingroup gcc - */ - -/** - * @defgroup AVR_CONF Configuration Options - * @details AVR Configuration Options. The AVR port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space - * used by the interrupt handlers.
    - * The default for this value is @p 32, this space is allocated for each - * thread so be careful in order to not waste precious RAM space. - * - @p IDLE_THREAD_STACK_SIZE, stack area size to be assigned to the IDLE - * thread. Usually there is no need to change this value unless inserting - * code in the IDLE thread hook macro. - * . - * @ingroup AVR - */ - -/** - * @defgroup AVR_CORE Core Port Implementation - * @details AVR specific port code, structures and macros. - * - * @ingroup AVR - */ - - /** - * @defgroup AVR_STARTUP Startup Support - * @details ChibiOS/RT doed not provide startup files for the AVR, there - * are no special startup requirement so the normal toolchain-provided - * startup files can be used. - * - * @ingroup AVR - */ diff --git a/os/ports/GCC/AVR/port.mk b/os/ports/GCC/AVR/port.mk deleted file mode 100644 index 7cafb56b2b..0000000000 --- a/os/ports/GCC/AVR/port.mk +++ /dev/null @@ -1,6 +0,0 @@ -# List of the ChibiOS/RT AVR port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/AVR/chcore.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/GCC/AVR diff --git a/os/ports/GCC/MSP430/chcore.c b/os/ports/GCC/MSP430/chcore.c deleted file mode 100644 index 33a162cf5b..0000000000 --- a/os/ports/GCC/MSP430/chcore.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/chcore.c - * @brief MSP430 architecture port code. - * - * @addtogroup MSP430_CORE - * @{ - */ - -#include "ch.h" - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * @note The function is declared as a weak symbol, it is possible to - * redefine it in your application code. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !defined(__DOXYGEN__) -__attribute__((naked, weak)) -#endif -void port_switch(Thread *ntp, Thread *otp) { - register struct intctx *sp asm("r1"); - - asm volatile ("push r11 \n\t" \ - "push r10 \n\t" \ - "push r9 \n\t" \ - "push r8 \n\t" \ - "push r7 \n\t" \ - "push r6 \n\t" \ - "push r5 \n\t" \ - "push r4" : : : "memory"); - otp->p_ctx.sp = sp; - sp = ntp->p_ctx.sp; - asm volatile ("pop r4 \n\t" \ - "pop r5 \n\t" \ - "pop r6 \n\t" \ - "pop r7 \n\t" \ - "pop r8 \n\t" \ - "pop r9 \n\t" \ - "pop r10 \n\t" \ - "pop r11 \n\t" \ - "ret" : : "r" (sp) : "memory"); -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected (for example because a programming - * error in the application code that triggers an assertion while in - * debug mode). - * @note The function is declared as a weak symbol, it is possible to - * redefine it in your application code. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak)) -#endif -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -void _port_thread_start(void) { - - chSysUnlock(); - asm volatile ("mov r11, r15 \n\t" \ - "call r10 \n\t" \ - "call #chThdExit"); -} - -/** @} */ diff --git a/os/ports/GCC/MSP430/chcore.h b/os/ports/GCC/MSP430/chcore.h deleted file mode 100644 index 10e18d9a62..0000000000 --- a/os/ports/GCC/MSP430/chcore.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/chcore.h - * @brief MSP430 architecture port macros and structures. - * - * @addtogroup MSP430_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#include -#include - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/** - * @brief Enables the use of a wait state in the idle thread loop. - */ -#ifndef ENABLE_WFI_IDLE -#define ENABLE_WFI_IDLE 0 -#endif - -/** - * @brief Macro defining the MSP430 architecture. - */ -#define CH_ARCHITECTURE_MSP430 - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "MSP430" - -/** - * @brief Name of the architecture variant (optional). - */ -#define CH_CORE_VARIANT_NAME "MSP430" - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "GCC " __VERSION__ - -/** - * @brief Port-specific information string. - */ -#define CH_PORT_INFO "None" - -/** - * @brief 16 bits stack and memory alignment enforcement. - */ -typedef uint16_t stkalign_t; - -/** - * @brief Generic MSP430 register. - */ -typedef void *regmsp_t; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - */ -struct extctx { - regmsp_t r12; - regmsp_t r13; - regmsp_t r14; - regmsp_t r15; - regmsp_t sr; - regmsp_t pc; -}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - */ -struct intctx { - regmsp_t r4; - regmsp_t r5; - regmsp_t r6; - regmsp_t r7; - regmsp_t r8; - regmsp_t r9; - regmsp_t r10; - regmsp_t r11; - regmsp_t pc; -}; - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details This structure usually contains just the saved stack pointer - * defined as a pointer to a @p intctx structure. - */ -struct context { - struct intctx *sp; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.sp = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.sp->r10 = pf; \ - tp->p_ctx.sp->r11 = arg; \ - tp->p_ctx.sp->pc = _port_thread_start; \ -} - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 0 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * This value can be zero on those architecture where there is a - * separate interrupt stack and the stack space between @p intctx and - * @p extctx is known to be zero. - * @note In this port the default is 32 bytes per thread. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() { \ - dbg_check_lock(); \ - if (chSchIsPreemptionRequired()) \ - chSchDoReschedule(); \ - dbg_check_unlock(); \ -} - -#define ISRNAME(pre, id) pre##id - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) ISR(id, ISRNAME(vect, id)) - -/** - * @brief Port-related initialization code. - * @note This function is empty in this port. - */ -#define port_init() - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform more - * actions. - * @note Implemented as global interrupt disable. - */ -#define port_lock() asm volatile ("dint" : : : "memory") - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform more - * actions. - * @note Implemented as global interrupt enable. - */ -#define port_unlock() asm volatile ("eint" : : : "memory") - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependen#define PORT_IRQ_EPILOGUE() { \ - if (chSchIsPreemptionRequired()) \ - chSchDoReschedule(); \ -} - * t, - * in its simplest form it is void. - * @note This function is empty in this port. - */ -#define port_lock_from_isr() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note This function is empty in this port. - */ -#define port_unlock_from_isr() - -/** - * @brief Disables all the interrupt sources. - * @note Of course non-maskable interrupt sources are not included. - * @note Implemented as global interrupt disable. - */ -#define port_disable() asm volatile ("dint" : : : "memory") - -/** - * @brief Disables the interrupt sources below kernel-level priority. - * @note Interrupt sources above kernel level remains enabled. - * @note Same as @p port_disable() in this port, there is no difference - * between the two states. - */ -#define port_suspend() asm volatile ("dint" : : : "memory") - -/** - * @brief Enables all the interrupt sources. - * @note Implemented as global interrupt enable. - */ -#define port_enable() asm volatile ("eint" : : : "memory") - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note This port function is implemented as inlined code for performance - * reasons. - * @note The port code does not define a low power mode, this macro has to - * be defined externally. The default implementation is a "nop", not - * a real low power mode. - */ -#if ENABLE_WFI_IDLE != 0 -#ifndef port_wait_for_interrupt -#define port_wait_for_interrupt() { \ - asm volatile ("nop" : : : "memory"); \ -} -#endif -#else -#define port_wait_for_interrupt() -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_switch(Thread *ntp, Thread *otp); - void port_halt(void); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/GCC/MSP430/chtypes.h b/os/ports/GCC/MSP430/chtypes.h deleted file mode 100644 index d195f3fb3a..0000000000 --- a/os/ports/GCC/MSP430/chtypes.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file MSP430/chtypes.h - * @brief MSP430 architecture port system types. - * - * @addtogroup MSP430_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#define __need_ptrdiff_t -#include - -#if !defined(_STDINT_H) && !defined(__STDINT_H_) -#include -#endif - -typedef int16_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint16_t tprio_t; /**< Thread priority. */ -typedef int16_t msg_t; /**< Inter-thread message. */ -typedef int16_t eventid_t; /**< Event Id. */ -typedef uint16_t eventmask_t; /**< Event mask. */ -typedef uint16_t flagsmask_t; /**< Event flags. */ -typedef uint16_t systime_t; /**< System time. */ -typedef int16_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note It uses the "packed" GCC attribute. - */ -#define PACK_STRUCT_STRUCT __attribute__((packed)) - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/GCC/MSP430/port.dox b/os/ports/GCC/MSP430/port.dox deleted file mode 100644 index fb23db4eb7..0000000000 --- a/os/ports/GCC/MSP430/port.dox +++ /dev/null @@ -1,95 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup MSP430 MSP430 - * @details MSP430 port for the GCC compiler. - * - * @section MSP430_INTRO Introduction - * This port supports all the cores implementing the MSP430 architecture. - * - * @section MSP430_STATES Mapping of the System States in the MSP430 port - * The ChibiOS/RT logical @ref system_states are mapped as follow in the MSP430 - * port: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). Interrupts are enabled. - * - Suspended. Interrupts are disabled. - * - Disabled. Interrupts are disabled. This state is equivalent to the - * Suspended state because there are no fast interrupts in this architecture. - * - Sleep. Not yet implemented. - * - S-Locked. Interrupts are disabled. - * - I-Locked. This state is equivalent to the SRI state, the - * @p chSysLockI() and @p chSysUnlockI() APIs do nothing (still use them in - * order to formally change state because this may change). - * - Serving Regular Interrupt. Normal interrupt service code. - * - Serving Fast Interrupt. Not present in this architecture. - * - Serving Non-Maskable Interrupt. The MSP430 has several non - * maskable interrupt sources that can be associated to this state. - * - Halted. Implemented as an infinite loop with interrupts disabled. - * . - * @section MSP430_NOTES The MSP430 port notes - * - The MSP430 does not have a dedicated interrupt stack, make sure to reserve - * enough stack space for interrupts in each thread stack. This can be done - * by modifying the @p INT_REQUIRED_STACK configuration options. - * - The state of the hardware multiplier is not saved in the thread context, - * make sure to use it in Suspended state (interrupts masked). - * - The port code does not define the switch to a low power mode for the - * idle thread because the MSP430 has several low power modes. You can - * select the proper low power mode for you application by defining the - * macro @p port_wait_for_interrupt(). - * . - * @ingroup gcc - */ - -/** - * @defgroup MSP430_CONF Configuration Options - * @details MSP430 Configuration Options. The MSP430 port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space - * used by the interrupt handlers.
    - * The default for this value is @p 32, this space is allocated for each - * thread so be careful in order to not waste precious RAM space. - * - @p IDLE_THREAD_STACK_SIZE, stack area size to be assigned to the IDLE - * thread. Usually there is no need to change this value unless inserting - * code in the IDLE thread hook macro. - * . - * @ingroup MSP430 - */ - -/** - * @defgroup MSP430_CORE Core Port Implementation - * @details MSP430 specific port code, structures and macros. - * - * @ingroup MSP430 - */ - - /** - * @defgroup MSP430_STARTUP Startup Support - * @details ChibiOS/RT doed not provide startup files for the MSP430, there - * are no special startup requirement so the normal toolchain-provided - * startup files can be used. - * - * @ingroup MSP430 - */ diff --git a/os/ports/GCC/MSP430/port.mk b/os/ports/GCC/MSP430/port.mk deleted file mode 100644 index 60b3f8add9..0000000000 --- a/os/ports/GCC/MSP430/port.mk +++ /dev/null @@ -1,6 +0,0 @@ -# List of the ChibiOS/RT MSP430 port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/MSP430/chcore.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/GCC/MSP430 diff --git a/os/ports/GCC/MSP430/rules.mk b/os/ports/GCC/MSP430/rules.mk deleted file mode 100644 index e5df109164..0000000000 --- a/os/ports/GCC/MSP430/rules.mk +++ /dev/null @@ -1,87 +0,0 @@ -# MSP430 makefile scripts and rules. - -# Automatic compiler options -OPT = $(USE_OPT) -COPT = $(USE_COPT) -CPPOPT = $(USE_CPPOPT) -ifeq ($(USE_LINK_GC),yes) - OPT += -ffunction-sections -fdata-sections -endif - -# Source files groups -SRC = $(CSRC)$(CPPSRC) - -# Object files groups -COBJS = $(CSRC:.c=.o) -CPPOBJS = $(CPPSRC:.cpp=.o) -ASMOBJS = $(ASMSRC:.s=.o) -OBJS = $(ASMOBJS) $(COBJS) $(CPPOBJS) - -# Paths -IINCDIR = $(patsubst %,-I%,$(INCDIR) $(DINCDIR) $(UINCDIR)) -LLIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) - -# Macros -DEFS = $(DDEFS) $(UDEFS) -ADEFS = $(DADEFS) $(UADEFS) - -# Libs -LIBS = $(DLIBS) $(ULIBS) - -MCFLAGS = -mmcu=$(MCU) -ODFLAGS = -x --syms -ASFLAGS = $(MCFLAGS) -Wa,-amhls=$(<:.s=.lst) $(ADEFS) -CPFLAGS = $(MCFLAGS) $(OPT) $(COPT) $(WARN) -Wa,-alms=$(<:.c=.lst) $(DEFS) -ifeq ($(LINK_GC),yes) - LDFLAGS = $(MCFLAGS) -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch,--gc-sections $(LLIBDIR) -else - LDFLAGS = $(MCFLAGS) -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LLIBDIR) -endif - -# Generate dependency information -CPFLAGS += -MD -MP -MF .dep/$(@F).d - -# -# Makefile rules -# -all: $(OBJS) $(PROJECT).elf $(PROJECT).hex $(PROJECT).bin $(PROJECT).dmp MAKE_ALL_RULE_HOOK - -MAKE_ALL_RULE_HOOK: - -$(CPPOBJS) : %.o : %.cpp - @echo - $(CPPC) -c $(CPPFLAGS) -I . $(IINCDIR) $< -o $@ - -$(COBJS) : %.o : %.c - @echo - $(CC) -c $(CPFLAGS) -I . $(IINCDIR) $< -o $@ - -$(ASMOBJS) : %.o : %.s - @echo - $(AS) -c $(ASFLAGS) -I . $(IINCDIR) $< -o $@ - -%elf: $(OBJS) - @echo - $(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ - -%hex: %elf - $(HEX) $< $@ - -%bin: %elf - $(BIN) $< $@ - -%dmp: %elf - $(OD) $(ODFLAGS) $< > $@ - -clean: - -rm -f $(OBJS) - -rm -f $(CSRC:.c=.lst) $(CPPSRC:.cpp=.lst) $(ASMSRC:.s=.lst) - -rm -f $(PROJECT).elf $(PROJECT).dmp $(PROJECT).map $(PROJECT).hex $(PROJECT).bin - -rm -fR .dep - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/os/ports/GCC/PPC/SPC560Pxx/bam.s b/os/ports/GCC/PPC/SPC560Pxx/bam.s deleted file mode 100644 index 9da61c8f0b..0000000000 --- a/os/ports/GCC/PPC/SPC560Pxx/bam.s +++ /dev/null @@ -1,38 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/bam.s - * @brief SPC560Pxx boot assistant record. - * - * @addtogroup PPC_CORE - * @{ - */ - -#if !defined(__DOXYGEN__) - - /* BAM info, SWT off, WTE off, VLE from settings.*/ - .section .bam, "ax" - .long 0x015A0000 - .long _boot_address - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/ports/GCC/PPC/SPC560Pxx/ivor.s b/os/ports/GCC/PPC/SPC560Pxx/ivor.s deleted file mode 100644 index 5e9f7ab0e7..0000000000 --- a/os/ports/GCC/PPC/SPC560Pxx/ivor.s +++ /dev/null @@ -1,234 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/ivor.s - * @brief SPC560Pxx IVORx handlers. - * - * @addtogroup PPC_CORE - * @{ - */ - -/* - * Imports the PPC configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -#if !defined(__DOXYGEN__) - /* - * INTC registers address. - */ - .equ INTC_IACKR, 0xfff48010 - .equ INTC_EOIR, 0xfff48018 - - .section .handlers, "ax" - - /* - * Fixed IVOR offset table. - */ - .globl IVORS -IVORS: -IVOR0: b IVOR0 - .align 4 -IVOR1: b _IVOR1 - .align 4 -IVOR2: b _IVOR2 - .align 4 -IVOR3: b _IVOR3 - .align 4 -IVOR4: b _IVOR4 - .align 4 -IVOR5: b _IVOR5 - .align 4 -IVOR6: b _IVOR6 - .align 4 -IVOR7: b _IVOR7 - .align 4 -IVOR8: b _IVOR8 - .align 4 -IVOR9: b _IVOR9 - .align 4 -IVOR10: b _IVOR10 - .align 4 -IVOR11: b _IVOR11 - .align 4 -IVOR12: b _IVOR12 - .align 4 -IVOR13: b _IVOR13 - .align 4 -IVOR14: b _IVOR14 - .align 4 -IVOR15: b _IVOR15 - - /* - * Unhandled exceptions handler. - */ - .weak _IVOR0 -_IVOR0: - .weak _IVOR1 -_IVOR1: - .weak _IVOR2 -_IVOR2: - .weak _IVOR3 -_IVOR3: - .weak _IVOR5 -_IVOR5: - .weak _IVOR6 -_IVOR6: - .weak _IVOR7 -_IVOR7: - .weak _IVOR8 -_IVOR8: - .weak _IVOR9 -_IVOR9: - .weak _IVOR10 -_IVOR10: - .weak _IVOR11 -_IVOR11: - .weak _IVOR12 -_IVOR12: - .weak _IVOR13 -_IVOR13: - .weak _IVOR14 -_IVOR14: - .weak _IVOR15 -_IVOR15: - .weak _unhandled_exception - .type _unhandled_exception, @function -_unhandled_exception: - b _unhandled_exception - - /* - * IVOR4 handler (Book-E external interrupt). - */ - .align 4 - .globl _IVOR4 - .type _IVOR4, @function -_IVOR4: - /* Creation of the external stack frame (extctx structure).*/ - stwu %sp, -80(%sp) /* Size of the extctx structure.*/ -#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI - e_stmvsrrw 8(%sp) /* Saves PC, MSR. */ - e_stmvsprw 16(%sp) /* Saves CR, LR, CTR, XER. */ - e_stmvgprw 32(%sp) /* Saves GPR0, GPR3...GPR12. */ -#else /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - stw %r0, 32(%sp) /* Saves GPR0. */ - mfSRR0 %r0 - stw %r0, 8(%sp) /* Saves PC. */ - mfSRR1 %r0 - stw %r0, 12(%sp) /* Saves MSR. */ - mfCR %r0 - stw %r0, 16(%sp) /* Saves CR. */ - mfLR %r0 - stw %r0, 20(%sp) /* Saves LR. */ - mfCTR %r0 - stw %r0, 24(%sp) /* Saves CTR. */ - mfXER %r0 - stw %r0, 28(%sp) /* Saves XER. */ - stw %r3, 36(%sp) /* Saves GPR3...GPR12. */ - stw %r4, 40(%sp) - stw %r5, 44(%sp) - stw %r6, 48(%sp) - stw %r7, 52(%sp) - stw %r8, 56(%sp) - stw %r9, 60(%sp) - stw %r10, 64(%sp) - stw %r11, 68(%sp) - stw %r12, 72(%sp) -#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - - /* Software vector address from the INTC register.*/ - lis %r3, INTC_IACKR@h - ori %r3, %r3, INTC_IACKR@l /* IACKR register address. */ - lwz %r3, 0(%r3) /* IACKR register value. */ - lwz %r3, 0(%r3) - mtCTR %r3 /* Software handler address. */ - -#if PPC_USE_IRQ_PREEMPTION - /* Allows preemption while executing the software handler.*/ - wrteei 1 -#endif - - /* Exectes the software handler.*/ - bctrl - -#if PPC_USE_IRQ_PREEMPTION - /* Prevents preemption again.*/ - wrteei 0 -#endif - - /* Informs the INTC that the interrupt has been served.*/ - mbar 0 - lis %r3, INTC_EOIR@h - ori %r3, %r3, INTC_EOIR@l - stw %r3, 0(%r3) /* Writing any value should do. */ - - /* Verifies if a reschedule is required.*/ -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchIsPreemptionRequired - cmpli cr0, %r3, 0 - beq cr0, _ivor_exit - bl chSchDoReschedule - - /* Context restore.*/ - .globl _ivor_exit -_ivor_exit: -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI - e_lmvgprw 32(%sp) /* Restores GPR0, GPR3...GPR12. */ - e_lmvsprw 16(%sp) /* Restores CR, LR, CTR, XER. */ - e_lmvsrrw 8(%sp) /* Restores PC, MSR. */ -#else /*!(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - lwz %r3, 36(%sp) /* Restores GPR3...GPR12. */ - lwz %r4, 40(%sp) - lwz %r5, 44(%sp) - lwz %r6, 48(%sp) - lwz %r7, 52(%sp) - lwz %r8, 56(%sp) - lwz %r9, 60(%sp) - lwz %r10, 64(%sp) - lwz %r11, 68(%sp) - lwz %r12, 72(%sp) - lwz %r0, 8(%sp) - mtSRR0 %r0 /* Restores PC. */ - lwz %r0, 12(%sp) - mtSRR1 %r0 /* Restores MSR. */ - lwz %r0, 16(%sp) - mtCR %r0 /* Restores CR. */ - lwz %r0, 20(%sp) - mtLR %r0 /* Restores LR. */ - lwz %r0, 24(%sp) - mtCTR %r0 /* Restores CTR. */ - lwz %r0, 28(%sp) - mtXER %r0 /* Restores XER. */ - lwz %r0, 32(%sp) /* Restores GPR0. */ -#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - addi %sp, %sp, 80 /* Back to the previous frame. */ - rfi - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld b/os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld deleted file mode 100644 index 49b1827212..0000000000 --- a/os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld +++ /dev/null @@ -1,178 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * SPC560P44 memory setup. - */ -__irq_stack_size__ = 0x0000; /* Not yet used.*/ -__process_stack_size__ = 0x0800; - -MEMORY -{ - flash : org = 0x00000000, len = 512k - dataflash : org = 0x00800000, len = 64k - ram : org = 0x40000000, len = 40k -} - -/* - * Derived constants. - */ -__flash_size__ = LENGTH(flash); -__flash_start__ = ORIGIN(flash); -__flash_end__ = ORIGIN(flash) + LENGTH(flash); - -__ram_size__ = LENGTH(ram); -__ram_start__ = ORIGIN(ram); -__ram_end__ = ORIGIN(ram) + LENGTH(ram); - -SECTIONS -{ - . = ORIGIN(flash); - .boot : ALIGN(16) SUBALIGN(16) - { - KEEP(*(.bam)) - KEEP(*(.crt0)) - . = ALIGN(0x00000800); - KEEP(*(.vectors)) - /* Note, have to waste the first 64KB because the IVPR register - requires an alignment of 64KB and the first 64KB cannot be used, - IVOR0 would conflict with the BAM word. Applications could - allocate code or data in the first 64KB by using special sections.*/ - . = ALIGN(0x00010000); - __ivpr_base__ = .; - KEEP(*(.handlers)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text_vle : ALIGN(16) SUBALIGN(16) - { - *(.text_vle) - *(.text_vle.*) - *(.gnu.linkonce.t_vle.*) - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text) - *(.text.*) - *(.gnu.linkonce.t.*) - } > flash - - .rodata : ALIGN(16) SUBALIGN(16) - { - *(.glue_7t) - *(.glue_7) - *(.gcc*) - *(.rodata) - *(.rodata.*) - *(.rodata1) - } > flash - - .sdata2 : ALIGN(16) SUBALIGN(16) - { - __sdata2_start__ = . + 0x8000; - *(.sdata2) - *(.sdata2.*) - *(.gnu.linkonce.s2.*) - *(.sbss2) - *(.sbss2.*) - *(.gnu.linkonce.sb2.*) - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .romdata : ALIGN(16) SUBALIGN(16) - { - __romdata_start__ = .; - } > flash - - .stacks : - { - . = ALIGN(8); - __irq_stack_base__ = .; - . += __irq_stack_size__; - . = ALIGN(8); - __irq_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : AT(__romdata_start__) - { - . = ALIGN(4); - __data_start__ = .; - *(.data) - *(.data.*) - *(.gnu.linkonce.d.*) - __sdata_start__ = . + 0x8000; - *(.sdata) - *(.sdata.*) - *(.gnu.linkonce.s.*) - __data_end__ = .; - } > ram - - .sbss : - { - __bss_start__ = .; - *(.sbss) - *(.sbss.*) - *(.gnu.linkonce.sb.*) - *(.scommon) - } > ram - - .bss : - { - *(.bss) - *(.bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - __bss_end__ = .; - } > ram - - __heap_base__ = __bss_end__; - __heap_end__ = __ram_end__; -} diff --git a/os/ports/GCC/PPC/SPC560Pxx/port.mk b/os/ports/GCC/PPC/SPC560Pxx/port.mk deleted file mode 100644 index de516c7d05..0000000000 --- a/os/ports/GCC/PPC/SPC560Pxx/port.mk +++ /dev/null @@ -1,12 +0,0 @@ -# List of the ChibiOS/RT SPC560Pxx port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/PPC/chcore.c - -PORTASM = ${CHIBIOS}/os/ports/GCC/PPC/bam.s \ - ${CHIBIOS}/os/ports/GCC/PPC/crt0.s \ - ${CHIBIOS}/os/ports/GCC/PPC/SPC560Pxx/ivor.s \ - ${CHIBIOS}/os/ports/GCC/PPC/SPC560Pxx/vectors.s - -PORTINC = ${CHIBIOS}/os/ports/GCC/PPC \ - ${CHIBIOS}/os/ports/GCC/PPC/SPC560Pxx - -PORTLD = ${CHIBIOS}/os/ports/GCC/PPC/SPC560Pxx/ld diff --git a/os/ports/GCC/PPC/SPC560Pxx/ppcparams.h b/os/ports/GCC/PPC/SPC560Pxx/ppcparams.h deleted file mode 100644 index 34f49449da..0000000000 --- a/os/ports/GCC/PPC/SPC560Pxx/ppcparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/ppcparams.h - * @brief PowerPC parameters for the SPC560Pxx. - * - * @defgroup PPC_SPC560Pxx SPC560Pxx/MPC560x Specific Parameters - * @ingroup PPC_SPECIFIC - * @details This file contains the PowerPC specific parameters for the - * SPC560Pxx/MPC560x platform. - * @{ - */ - -#ifndef _PPCPARAMS_H_ -#define _PPCPARAMS_H_ - -/** - * @brief PPC core model. - */ -#define PPC_VARIANT PPC_VARIANT_e200z0 - -/** - * @brief IVORx registers support. - */ -#define PPC_SUPPORTS_IVORS FALSE - -/** - * @brief Book E instruction set support. - */ -#define PPC_SUPPORTS_BOOKE FALSE - -/** - * @brief VLE instruction set support. - */ -#define PPC_SUPPORTS_VLE TRUE - -/** - * @brief Supports VLS Load/Store Multiple Volatile instructions. - */ -#define PPC_SUPPORTS_VLE_MULTI TRUE - -#endif /* _PPCPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/PPC/SPC560Pxx/vectors.s b/os/ports/GCC/PPC/SPC560Pxx/vectors.s deleted file mode 100644 index 515fdd1880..0000000000 --- a/os/ports/GCC/PPC/SPC560Pxx/vectors.s +++ /dev/null @@ -1,1093 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC560Pxx/vectors.s - * @brief SPC560Pxx vectors table. - * - * @addtogroup PPC_CORE - * @{ - */ - -#if !defined(__DOXYGEN__) - - /* Software vectors table. The vectors are accessed from the IVOR4 - handler only. In order to declare an interrupt handler just create - a function withe the same name of a vector, the symbol will - override the weak symbol declared here.*/ - .section .vectors, "ax" - .align 4 - .globl _vectors -_vectors: - .long vector0 - .long vector1 - .long vector2 - .long vector3 - .long vector4 - .long vector5 - .long vector6 - .long vector7 - .long vector8 - .long vector9 - .long vector10 - .long vector11 - .long vector12 - .long vector13 - .long vector14 - .long vector15 - .long vector16 - .long vector17 - .long vector18 - .long vector19 - .long vector20 - .long vector21 - .long vector22 - .long vector23 - .long vector24 - .long vector25 - .long vector26 - .long vector27 - .long vector28 - .long vector29 - .long vector30 - .long vector31 - .long vector32 - .long vector33 - .long vector34 - .long vector35 - .long vector36 - .long vector37 - .long vector38 - .long vector39 - .long vector40 - .long vector41 - .long vector42 - .long vector43 - .long vector44 - .long vector45 - .long vector46 - .long vector47 - .long vector48 - .long vector49 - .long vector50 - .long vector51 - .long vector52 - .long vector53 - .long vector54 - .long vector55 - .long vector56 - .long vector57 - .long vector58 - .long vector59 - .long vector60 - .long vector61 - .long vector62 - .long vector63 - .long vector64 - .long vector65 - .long vector66 - .long vector67 - .long vector68 - .long vector69 - .long vector70 - .long vector71 - .long vector72 - .long vector73 - .long vector74 - .long vector75 - .long vector76 - .long vector77 - .long vector78 - .long vector79 - .long vector80 - .long vector81 - .long vector82 - .long vector83 - .long vector84 - .long vector85 - .long vector86 - .long vector87 - .long vector88 - .long vector89 - .long vector90 - .long vector91 - .long vector92 - .long vector93 - .long vector94 - .long vector95 - .long vector96 - .long vector97 - .long vector98 - .long vector99 - .long vector100 - .long vector101 - .long vector102 - .long vector103 - .long vector104 - .long vector105 - .long vector106 - .long vector107 - .long vector108 - .long vector109 - .long vector110 - .long vector111 - .long vector112 - .long vector113 - .long vector114 - .long vector115 - .long vector116 - .long vector117 - .long vector118 - .long vector119 - .long vector120 - .long vector121 - .long vector122 - .long vector123 - .long vector124 - .long vector125 - .long vector126 - .long vector127 - .long vector128 - .long vector129 - .long vector130 - .long vector131 - .long vector132 - .long vector133 - .long vector134 - .long vector135 - .long vector136 - .long vector137 - .long vector138 - .long vector139 - .long vector140 - .long vector141 - .long vector142 - .long vector143 - .long vector144 - .long vector145 - .long vector146 - .long vector147 - .long vector148 - .long vector149 - .long vector150 - .long vector151 - .long vector152 - .long vector153 - .long vector154 - .long vector155 - .long vector156 - .long vector157 - .long vector158 - .long vector159 - .long vector160 - .long vector161 - .long vector162 - .long vector163 - .long vector164 - .long vector165 - .long vector166 - .long vector167 - .long vector168 - .long vector169 - .long vector170 - .long vector171 - .long vector172 - .long vector173 - .long vector174 - .long vector175 - .long vector176 - .long vector177 - .long vector178 - .long vector179 - .long vector180 - .long vector181 - .long vector182 - .long vector183 - .long vector184 - .long vector185 - .long vector186 - .long vector187 - .long vector188 - .long vector189 - .long vector190 - .long vector191 - .long vector192 - .long vector193 - .long vector194 - .long vector195 - .long vector196 - .long vector197 - .long vector198 - .long vector199 - .long vector200 - .long vector201 - .long vector202 - .long vector203 - .long vector204 - .long vector205 - .long vector206 - .long vector207 - .long vector208 - .long vector209 - .long vector210 - .long vector211 - .long vector212 - .long vector213 - .long vector214 - .long vector215 - .long vector216 - .long vector217 - .long vector218 - .long vector219 - .long vector220 - .long vector221 - .long vector222 - .long vector223 - .long vector224 - .long vector225 - .long vector226 - .long vector227 - .long vector228 - .long vector229 - .long vector230 - .long vector231 - .long vector232 - .long vector233 - .long vector234 - .long vector235 - .long vector236 - .long vector237 - .long vector238 - .long vector239 - .long vector240 - .long vector241 - .long vector242 - .long vector243 - .long vector244 - .long vector245 - .long vector246 - .long vector247 - .long vector248 - .long vector249 - .long vector250 - .long vector251 - .long vector252 - .long vector253 - .long vector254 - .long vector255 - .long vector256 - .long vector257 - .long vector258 - .long vector259 - .long vector260 - - .text - .align 2 - .weak vector0 -vector0: - - .weak vector1 -vector1: - - .weak vector2 -vector2: - - .weak vector3 -vector3: - - .weak vector4 -vector4: - - .weak vector5 -vector5: - - .weak vector6 -vector6: - - .weak vector7 -vector7: - - .weak vector8 -vector8: - - .weak vector9 -vector9: - - .weak vector10 -vector10: - - .weak vector11 -vector11: - - .weak vector12 -vector12: - - .weak vector13 -vector13: - - .weak vector14 -vector14: - - .weak vector15 -vector15: - - .weak vector16 -vector16: - - .weak vector17 -vector17: - - .weak vector18 -vector18: - - .weak vector19 -vector19: - - .weak vector20 -vector20: - - .weak vector21 -vector21: - - .weak vector22 -vector22: - - .weak vector23 -vector23: - - .weak vector24 -vector24: - - .weak vector25 -vector25: - - .weak vector26 -vector26: - - .weak vector27 -vector27: - - .weak vector28 -vector28: - - .weak vector29 -vector29: - - .weak vector30 -vector30: - - .weak vector31 -vector31: - - .weak vector32 -vector32: - - .weak vector33 -vector33: - - .weak vector34 -vector34: - - .weak vector35 -vector35: - - .weak vector36 -vector36: - - .weak vector37 -vector37: - - .weak vector38 -vector38: - - .weak vector39 -vector39: - - .weak vector40 -vector40: - - .weak vector41 -vector41: - - .weak vector42 -vector42: - - .weak vector43 -vector43: - - .weak vector44 -vector44: - - .weak vector45 -vector45: - - .weak vector46 -vector46: - - .weak vector47 -vector47: - - .weak vector48 -vector48: - - .weak vector49 -vector49: - - .weak vector50 -vector50: - - .weak vector51 -vector51: - - .weak vector52 -vector52: - - .weak vector53 -vector53: - - .weak vector54 -vector54: - - .weak vector55 -vector55: - - .weak vector56 -vector56: - - .weak vector57 -vector57: - - .weak vector58 -vector58: - - .weak vector59 -vector59: - - .weak vector60 -vector60: - - .weak vector61 -vector61: - - .weak vector62 -vector62: - - .weak vector63 -vector63: - - .weak vector64 -vector64: - - .weak vector65 -vector65: - - .weak vector66 -vector66: - - .weak vector67 -vector67: - - .weak vector68 -vector68: - - .weak vector69 -vector69: - - .weak vector70 -vector70: - - .weak vector71 -vector71: - - .weak vector72 -vector72: - - .weak vector73 -vector73: - - .weak vector74 -vector74: - - .weak vector75 -vector75: - - .weak vector76 -vector76: - - .weak vector77 -vector77: - - .weak vector78 -vector78: - - .weak vector79 -vector79: - - .weak vector80 -vector80: - - .weak vector81 -vector81: - - .weak vector82 -vector82: - - .weak vector83 -vector83: - - .weak vector84 -vector84: - - .weak vector85 -vector85: - - .weak vector86 -vector86: - - .weak vector87 -vector87: - - .weak vector88 -vector88: - - .weak vector89 -vector89: - - .weak vector90 -vector90: - - .weak vector91 -vector91: - - .weak vector92 -vector92: - - .weak vector93 -vector93: - - .weak vector94 -vector94: - - .weak vector95 -vector95: - - .weak vector96 -vector96: - - .weak vector97 -vector97: - - .weak vector98 -vector98: - - .weak vector99 -vector99: - - .weak vector100 -vector100: - - .weak vector101 -vector101: - - .weak vector102 -vector102: - - .weak vector103 -vector103: - - .weak vector104 -vector104: - - .weak vector105 -vector105: - - .weak vector106 -vector106: - - .weak vector107 -vector107: - - .weak vector108 -vector108: - - .weak vector109 -vector109: - - .weak vector110 -vector110: - - .weak vector111 -vector111: - - .weak vector112 -vector112: - - .weak vector113 -vector113: - - .weak vector114 -vector114: - - .weak vector115 -vector115: - - .weak vector116 -vector116: - - .weak vector117 -vector117: - - .weak vector118 -vector118: - - .weak vector119 -vector119: - - .weak vector120 -vector120: - - .weak vector121 -vector121: - - .weak vector122 -vector122: - - .weak vector123 -vector123: - - .weak vector124 -vector124: - - .weak vector125 -vector125: - - .weak vector126 -vector126: - - .weak vector127 -vector127: - - .weak vector128 -vector128: - - .weak vector129 -vector129: - - .weak vector130 -vector130: - - .weak vector131 -vector131: - - .weak vector132 -vector132: - - .weak vector133 -vector133: - - .weak vector134 -vector134: - - .weak vector135 -vector135: - - .weak vector136 -vector136: - - .weak vector137 -vector137: - - .weak vector138 -vector138: - - .weak vector139 -vector139: - - .weak vector140 -vector140: - - .weak vector141 -vector141: - - .weak vector142 -vector142: - - .weak vector143 -vector143: - - .weak vector144 -vector144: - - .weak vector145 -vector145: - - .weak vector146 -vector146: - - .weak vector147 -vector147: - - .weak vector148 -vector148: - - .weak vector149 -vector149: - - .weak vector150 -vector150: - - .weak vector151 -vector151: - - .weak vector152 -vector152: - - .weak vector153 -vector153: - - .weak vector154 -vector154: - - .weak vector155 -vector155: - - .weak vector156 -vector156: - - .weak vector157 -vector157: - - .weak vector158 -vector158: - - .weak vector159 -vector159: - - .weak vector160 -vector160: - - .weak vector161 -vector161: - - .weak vector162 -vector162: - - .weak vector163 -vector163: - - .weak vector164 -vector164: - - .weak vector165 -vector165: - - .weak vector166 -vector166: - - .weak vector167 -vector167: - - .weak vector168 -vector168: - - .weak vector169 -vector169: - - .weak vector170 -vector170: - - .weak vector171 -vector171: - - .weak vector172 -vector172: - - .weak vector173 -vector173: - - .weak vector174 -vector174: - - .weak vector175 -vector175: - - .weak vector176 -vector176: - - .weak vector177 -vector177: - - .weak vector178 -vector178: - - .weak vector179 -vector179: - - .weak vector180 -vector180: - - .weak vector181 -vector181: - - .weak vector182 -vector182: - - .weak vector183 -vector183: - - .weak vector184 -vector184: - - .weak vector185 -vector185: - - .weak vector186 -vector186: - - .weak vector187 -vector187: - - .weak vector188 -vector188: - - .weak vector189 -vector189: - - .weak vector190 -vector190: - - .weak vector191 -vector191: - - .weak vector192 -vector192: - - .weak vector193 -vector193: - - .weak vector194 -vector194: - - .weak vector195 -vector195: - - .weak vector196 -vector196: - - .weak vector197 -vector197: - - .weak vector198 -vector198: - - .weak vector199 -vector199: - - .weak vector200 -vector200: - - .weak vector201 -vector201: - - .weak vector202 -vector202: - - .weak vector203 -vector203: - - .weak vector204 -vector204: - - .weak vector205 -vector205: - - .weak vector206 -vector206: - - .weak vector207 -vector207: - - .weak vector208 -vector208: - - .weak vector209 -vector209: - - .weak vector210 -vector210: - - .weak vector211 -vector211: - - .weak vector212 -vector212: - - .weak vector213 -vector213: - - .weak vector214 -vector214: - - .weak vector215 -vector215: - - .weak vector216 -vector216: - - .weak vector217 -vector217: - - .weak vector218 -vector218: - - .weak vector219 -vector219: - - .weak vector220 -vector220: - - .weak vector221 -vector221: - - .weak vector222 -vector222: - - .weak vector223 -vector223: - - .weak vector224 -vector224: - - .weak vector225 -vector225: - - .weak vector226 -vector226: - - .weak vector227 -vector227: - - .weak vector228 -vector228: - - .weak vector229 -vector229: - - .weak vector230 -vector230: - - .weak vector231 -vector231: - - .weak vector232 -vector232: - - .weak vector233 -vector233: - - .weak vector234 -vector234: - - .weak vector235 -vector235: - - .weak vector236 -vector236: - - .weak vector237 -vector237: - - .weak vector238 -vector238: - - .weak vector239 -vector239: - - .weak vector240 -vector240: - - .weak vector241 -vector241: - - .weak vector242 -vector242: - - .weak vector243 -vector243: - - .weak vector244 -vector244: - - .weak vector245 -vector245: - - .weak vector246 -vector246: - - .weak vector247 -vector247: - - .weak vector248 -vector248: - - .weak vector249 -vector249: - - .weak vector250 -vector250: - - .weak vector251 -vector251: - - .weak vector252 -vector252: - - .weak vector253 -vector253: - - .weak vector254 -vector254: - - .weak vector255 -vector255: - - .weak vector256 -vector256: - - .weak vector257 -vector257: - - .weak vector258 -vector258: - - .weak vector259 -vector259: - - .weak vector260 -vector260: - - .weak _unhandled_irq - .type _unhandled_irq, @function -_unhandled_irq: - b _unhandled_irq - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/ports/GCC/PPC/SPC563Mxx/ivor.s b/os/ports/GCC/PPC/SPC563Mxx/ivor.s deleted file mode 100644 index 0eb362ed05..0000000000 --- a/os/ports/GCC/PPC/SPC563Mxx/ivor.s +++ /dev/null @@ -1,258 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC563Mxx/ivor.s - * @brief SPC563Mxx IVORx handlers. - * - * @addtogroup PPC_CORE - * @{ - */ - -/* - * Imports the PPC configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -#if !defined(__DOXYGEN__) - /* - * INTC registers address. - */ - .equ INTC_IACKR, 0xfff48010 - .equ INTC_EOIR, 0xfff48018 - - .section .handlers, "ax" - - /* - * Unhandled exceptions handler. - */ - .weak _IVOR0 -_IVOR0: - .weak _IVOR1 -_IVOR1: - .weak _IVOR2 -_IVOR2: - .weak _IVOR3 -_IVOR3: - .weak _IVOR5 -_IVOR5: - .weak _IVOR6 -_IVOR6: - .weak _IVOR7 -_IVOR7: - .weak _IVOR8 -_IVOR8: - .weak _IVOR9 -_IVOR9: - .weak _IVOR11 -_IVOR11: - .weak _IVOR12 -_IVOR12: - .weak _IVOR13 -_IVOR13: - .weak _IVOR14 -_IVOR14: - .weak _IVOR15 -_IVOR15: - .weak _unhandled_exception - .type _unhandled_exception, @function -_unhandled_exception: - b _unhandled_exception - - /* - * _IVOR10 handler (Book-E decrementer). - */ - .align 4 - .globl _IVOR10 - .type _IVOR10, @function -_IVOR10: - /* Creation of the external stack frame (extctx structure).*/ - stwu %sp, -80(%sp) /* Size of the extctx structure.*/ -#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI - e_stmvsrrw 8(%sp) /* Saves PC, MSR. */ - e_stmvsprw 16(%sp) /* Saves CR, LR, CTR, XER. */ - e_stmvgprw 32(%sp) /* Saves GPR0, GPR3...GPR12. */ -#else /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - stw %r0, 32(%sp) /* Saves GPR0. */ - mfSRR0 %r0 - stw %r0, 8(%sp) /* Saves PC. */ - mfSRR1 %r0 - stw %r0, 12(%sp) /* Saves MSR. */ - mfCR %r0 - stw %r0, 16(%sp) /* Saves CR. */ - mfLR %r0 - stw %r0, 20(%sp) /* Saves LR. */ - mfCTR %r0 - stw %r0, 24(%sp) /* Saves CTR. */ - mfXER %r0 - stw %r0, 28(%sp) /* Saves XER. */ - stw %r3, 36(%sp) /* Saves GPR3...GPR12. */ - stw %r4, 40(%sp) - stw %r5, 44(%sp) - stw %r6, 48(%sp) - stw %r7, 52(%sp) - stw %r8, 56(%sp) - stw %r9, 60(%sp) - stw %r10, 64(%sp) - stw %r11, 68(%sp) - stw %r12, 72(%sp) -#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - - /* Reset DIE bit in TSR register.*/ - lis %r3, 0x0800 /* DIS bit mask. */ - mtspr 336, %r3 /* TSR register. */ - -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_enter_isr - bl dbg_check_lock_from_isr -#endif - bl chSysTimerHandlerI -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock_from_isr - bl dbg_check_leave_isr -#endif - - /* System tick handler invocation.*/ -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchIsPreemptionRequired - cmpli cr0, %r3, 0 - beq cr0, .ctxrestore - bl chSchDoReschedule - b _ivor_exit - - /* - * _IVOR4 handler (Book-E external interrupt). - */ - .align 4 - .globl _IVOR4 - .type _IVOR4, @function -_IVOR4: - /* Creation of the external stack frame (extctx structure).*/ - stwu %sp, -80(%sp) /* Size of the extctx structure.*/ -#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI - e_stmvsrrw 8(%sp) /* Saves PC, MSR. */ - e_stmvsprw 16(%sp) /* Saves CR, LR, CTR, XER. */ - e_stmvgprw 32(%sp) /* Saves GPR0, GPR3...GPR12. */ -#else /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - stw %r0, 32(%sp) /* Saves GPR0. */ - mfSRR0 %r0 - stw %r0, 8(%sp) /* Saves PC. */ - mfSRR1 %r0 - stw %r0, 12(%sp) /* Saves MSR. */ - mfCR %r0 - stw %r0, 16(%sp) /* Saves CR. */ - mfLR %r0 - stw %r0, 20(%sp) /* Saves LR. */ - mfCTR %r0 - stw %r0, 24(%sp) /* Saves CTR. */ - mfXER %r0 - stw %r0, 28(%sp) /* Saves XER. */ - stw %r3, 36(%sp) /* Saves GPR3...GPR12. */ - stw %r4, 40(%sp) - stw %r5, 44(%sp) - stw %r6, 48(%sp) - stw %r7, 52(%sp) - stw %r8, 56(%sp) - stw %r9, 60(%sp) - stw %r10, 64(%sp) - stw %r11, 68(%sp) - stw %r12, 72(%sp) -#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - - /* Software vector address from the INTC register.*/ - lis %r3, INTC_IACKR@h - ori %r3, %r3, INTC_IACKR@l /* IACKR register address. */ - lwz %r3, 0(%r3) /* IACKR register value. */ - lwz %r3, 0(%r3) - mtCTR %r3 /* Software handler address. */ - -#if PPC_USE_IRQ_PREEMPTION - /* Allows preemption while executing the software handler.*/ - wrteei 1 -#endif - - /* Exectes the software handler.*/ - bctrl - -#if PPC_USE_IRQ_PREEMPTION - /* Prevents preemption again.*/ - wrteei 0 -#endif - - /* Informs the INTC that the interrupt has been served.*/ - mbar 0 - lis %r3, INTC_EOIR@h - ori %r3, %r3, INTC_EOIR@l - stw %r3, 0(%r3) /* Writing any value should do. */ - - /* Verifies if a reschedule is required.*/ -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchIsPreemptionRequired - cmpli cr0, %r3, 0 - beq cr0, _ivor_exit - bl chSchDoReschedule - - /* Context restore.*/ - .globl -_ivor_exit: -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI - e_lmvgprw 32(%sp) /* Restores GPR0, GPR3...GPR12. */ - e_lmvsprw 16(%sp) /* Restores CR, LR, CTR, XER. */ - e_lmvsrrw 8(%sp) /* Restores PC, MSR. */ -#else /*!(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - lwz %r3, 36(%sp) /* Restores GPR3...GPR12. */ - lwz %r4, 40(%sp) - lwz %r5, 44(%sp) - lwz %r6, 48(%sp) - lwz %r7, 52(%sp) - lwz %r8, 56(%sp) - lwz %r9, 60(%sp) - lwz %r10, 64(%sp) - lwz %r11, 68(%sp) - lwz %r12, 72(%sp) - lwz %r0, 8(%sp) - mtSRR0 %r0 /* Restores PC. */ - lwz %r0, 12(%sp) - mtSRR1 %r0 /* Restores MSR. */ - lwz %r0, 16(%sp) - mtCR %r0 /* Restores CR. */ - lwz %r0, 20(%sp) - mtLR %r0 /* Restores LR. */ - lwz %r0, 24(%sp) - mtCTR %r0 /* Restores CTR. */ - lwz %r0, 28(%sp) - mtXER %r0 /* Restores XER. */ - lwz %r0, 32(%sp) /* Restores GPR0. */ -#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ - addi %sp, %sp, 80 /* Back to the previous frame. */ - rfi - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld b/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld deleted file mode 100644 index 0d4475fd7a..0000000000 --- a/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld +++ /dev/null @@ -1,172 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * SPC563M64 memory setup. - */ -__irq_stack_size__ = 0x0000; /* Not yet used.*/ -__process_stack_size__ = 0x0800; - -MEMORY -{ - flash : org = 0x00000000, len = 1536k - ram : org = 0x40000000, len = 94k -} - -/* - * Derived constants. - */ -__flash_size__ = LENGTH(flash); -__flash_start__ = ORIGIN(flash); -__flash_end__ = ORIGIN(flash) + LENGTH(flash); - -__ram_size__ = LENGTH(ram); -__ram_start__ = ORIGIN(ram); -__ram_end__ = ORIGIN(ram) + LENGTH(ram); - -SECTIONS -{ - . = ORIGIN(flash); - .boot : ALIGN(16) SUBALIGN(16) - { - __ivpr_base__ = .; - KEEP(*(.bam)) - KEEP(*(.crt0)) - KEEP(*(.handlers)) - . = ALIGN(0x800); - KEEP(*(.vectors)) - } > flash - - constructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE(__init_array_end = .); - } > flash - - destructors : ALIGN(4) SUBALIGN(4) - { - PROVIDE(__fini_array_start = .); - KEEP(*(.fini_array)) - KEEP(*(SORT(.fini_array.*))) - PROVIDE(__fini_array_end = .); - } > flash - - .text_vle : ALIGN(16) SUBALIGN(16) - { - *(.text_vle) - *(.text_vle.*) - *(.gnu.linkonce.t_vle.*) - } > flash - - .text : ALIGN(16) SUBALIGN(16) - { - *(.text) - *(.text.*) - *(.gnu.linkonce.t.*) - } > flash - - .rodata : ALIGN(16) SUBALIGN(16) - { - *(.glue_7t) - *(.glue_7) - *(.gcc*) - *(.rodata) - *(.rodata.*) - *(.rodata1) - } > flash - - .sdata2 : ALIGN(16) SUBALIGN(16) - { - __sdata2_start__ = . + 0x8000; - *(.sdata2) - *(.sdata2.*) - *(.gnu.linkonce.s2.*) - *(.sbss2) - *(.sbss2.*) - *(.gnu.linkonce.sb2.*) - } > flash - - .eh_frame_hdr : - { - *(.eh_frame_hdr) - } > flash - - .eh_frame : ONLY_IF_RO - { - *(.eh_frame) - } > flash - - .romdata : ALIGN(16) SUBALIGN(16) - { - __romdata_start__ = .; - } > flash - - .stacks : - { - . = ALIGN(8); - __irq_stack_base__ = .; - . += __irq_stack_size__; - . = ALIGN(8); - __irq_stack_end__ = .; - __process_stack_base__ = .; - __main_thread_stack_base__ = .; - . += __process_stack_size__; - . = ALIGN(8); - __process_stack_end__ = .; - __main_thread_stack_end__ = .; - } > ram - - .data : AT(__romdata_start__) - { - . = ALIGN(4); - __data_start__ = .; - *(.data) - *(.data.*) - *(.gnu.linkonce.d.*) - __sdata_start__ = . + 0x8000; - *(.sdata) - *(.sdata.*) - *(.gnu.linkonce.s.*) - __data_end__ = .; - } > ram - - .sbss : - { - __bss_start__ = .; - *(.sbss) - *(.sbss.*) - *(.gnu.linkonce.sb.*) - *(.scommon) - } > ram - - .bss : - { - *(.bss) - *(.bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - __bss_end__ = .; - } > ram - - __heap_base__ = __bss_end__; - __heap_end__ = __ram_end__; -} diff --git a/os/ports/GCC/PPC/SPC563Mxx/port.mk b/os/ports/GCC/PPC/SPC563Mxx/port.mk deleted file mode 100644 index 460d4e1f95..0000000000 --- a/os/ports/GCC/PPC/SPC563Mxx/port.mk +++ /dev/null @@ -1,11 +0,0 @@ -# List of the ChibiOS/RT SPC563Mxx port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/PPC/chcore.c - -PORTASM = ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx/vectors.s \ - ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx/ivor.s \ - ${CHIBIOS}/os/ports/GCC/PPC/crt0.s - -PORTINC = ${CHIBIOS}/os/ports/GCC/PPC \ - ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx - -PORTLD = ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx/ld diff --git a/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h b/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h deleted file mode 100644 index 135818bd3b..0000000000 --- a/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC563Mxx/ppcparams.h - * @brief PowerPC parameters for the SPC563Mxx. - * - * @defgroup PPC_SPC563Mxx SPC563Mxx/MPC563x Specific Parameters - * @ingroup PPC_SPECIFIC - * @details This file contains the PowerPC specific parameters for the - * SPC563Mxx/MPC563x platform. - * @{ - */ - -#ifndef _PPCPARAMS_H_ -#define _PPCPARAMS_H_ - -/** - * @brief PPC core model. - */ -#define PPC_VARIANT PPC_VARIANT_e200z3 - -/** - * @brief IVORx registers support. - */ -#define PPC_SUPPORTS_IVORS TRUE - -/** - * @brief Book E instruction set support. - */ -#define PPC_SUPPORTS_BOOKE TRUE - -/** - * @brief VLE instruction set support. - */ -#define PPC_SUPPORTS_VLE TRUE - -/** - * @brief Supports VLS Load/Store Multiple Volatile instructions. - */ -#define PPC_SUPPORTS_VLE_MULTI TRUE - -#endif /* _PPCPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/GCC/PPC/SPC563Mxx/vectors.s b/os/ports/GCC/PPC/SPC563Mxx/vectors.s deleted file mode 100644 index 0a7d723e5e..0000000000 --- a/os/ports/GCC/PPC/SPC563Mxx/vectors.s +++ /dev/null @@ -1,1505 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file SPC563Mxx/vectors.s - * @brief SPC563Mxx vectors table. - * - * @addtogroup PPC_CORE - * @{ - */ - -/* - * Imports the PPC configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -#if !defined(__DOXYGEN__) - - /* BAM info, SWT off, WTE off, VLE from settings.*/ - .section .bam, "ax" -#if PPC_USE_VLE - .long 0x015A0000 -#else - .long 0x005A0000 -#endif - .long _boot_address - - /* Software vectors table. The vectors are accessed from the IVOR4 - handler only. In order to declare an interrupt handler just create - a function withe the same name of a vector, the symbol will - override the weak symbol declared here.*/ - .section .vectors, "ax" - .align 4 - .globl _vectors -_vectors: - .long vector0 - .long vector1 - .long vector2 - .long vector3 - .long vector4 - .long vector5 - .long vector6 - .long vector7 - .long vector8 - .long vector9 - .long vector10 - .long vector11 - .long vector12 - .long vector13 - .long vector14 - .long vector15 - .long vector16 - .long vector17 - .long vector18 - .long vector19 - .long vector20 - .long vector21 - .long vector22 - .long vector23 - .long vector24 - .long vector25 - .long vector26 - .long vector27 - .long vector28 - .long vector29 - .long vector30 - .long vector31 - .long vector32 - .long vector33 - .long vector34 - .long vector35 - .long vector36 - .long vector37 - .long vector38 - .long vector39 - .long vector40 - .long vector41 - .long vector42 - .long vector43 - .long vector44 - .long vector45 - .long vector46 - .long vector47 - .long vector48 - .long vector49 - .long vector50 - .long vector51 - .long vector52 - .long vector53 - .long vector54 - .long vector55 - .long vector56 - .long vector57 - .long vector58 - .long vector59 - .long vector60 - .long vector61 - .long vector62 - .long vector63 - .long vector64 - .long vector65 - .long vector66 - .long vector67 - .long vector68 - .long vector69 - .long vector70 - .long vector71 - .long vector72 - .long vector73 - .long vector74 - .long vector75 - .long vector76 - .long vector77 - .long vector78 - .long vector79 - .long vector80 - .long vector81 - .long vector82 - .long vector83 - .long vector84 - .long vector85 - .long vector86 - .long vector87 - .long vector88 - .long vector89 - .long vector90 - .long vector91 - .long vector92 - .long vector93 - .long vector94 - .long vector95 - .long vector96 - .long vector97 - .long vector98 - .long vector99 - .long vector100 - .long vector101 - .long vector102 - .long vector103 - .long vector104 - .long vector105 - .long vector106 - .long vector107 - .long vector108 - .long vector109 - .long vector110 - .long vector111 - .long vector112 - .long vector113 - .long vector114 - .long vector115 - .long vector116 - .long vector117 - .long vector118 - .long vector119 - .long vector120 - .long vector121 - .long vector122 - .long vector123 - .long vector124 - .long vector125 - .long vector126 - .long vector127 - .long vector128 - .long vector129 - .long vector130 - .long vector131 - .long vector132 - .long vector133 - .long vector134 - .long vector135 - .long vector136 - .long vector137 - .long vector138 - .long vector139 - .long vector140 - .long vector141 - .long vector142 - .long vector143 - .long vector144 - .long vector145 - .long vector146 - .long vector147 - .long vector148 - .long vector149 - .long vector150 - .long vector151 - .long vector152 - .long vector153 - .long vector154 - .long vector155 - .long vector156 - .long vector157 - .long vector158 - .long vector159 - .long vector160 - .long vector161 - .long vector162 - .long vector163 - .long vector164 - .long vector165 - .long vector166 - .long vector167 - .long vector168 - .long vector169 - .long vector170 - .long vector171 - .long vector172 - .long vector173 - .long vector174 - .long vector175 - .long vector176 - .long vector177 - .long vector178 - .long vector179 - .long vector180 - .long vector181 - .long vector182 - .long vector183 - .long vector184 - .long vector185 - .long vector186 - .long vector187 - .long vector188 - .long vector189 - .long vector190 - .long vector191 - .long vector192 - .long vector193 - .long vector194 - .long vector195 - .long vector196 - .long vector197 - .long vector198 - .long vector199 - .long vector200 - .long vector201 - .long vector202 - .long vector203 - .long vector204 - .long vector205 - .long vector206 - .long vector207 - .long vector208 - .long vector209 - .long vector210 - .long vector211 - .long vector212 - .long vector213 - .long vector214 - .long vector215 - .long vector216 - .long vector217 - .long vector218 - .long vector219 - .long vector220 - .long vector221 - .long vector222 - .long vector223 - .long vector224 - .long vector225 - .long vector226 - .long vector227 - .long vector228 - .long vector229 - .long vector230 - .long vector231 - .long vector232 - .long vector233 - .long vector234 - .long vector235 - .long vector236 - .long vector237 - .long vector238 - .long vector239 - .long vector240 - .long vector241 - .long vector242 - .long vector243 - .long vector244 - .long vector245 - .long vector246 - .long vector247 - .long vector248 - .long vector249 - .long vector250 - .long vector251 - .long vector252 - .long vector253 - .long vector254 - .long vector255 - .long vector256 - .long vector257 - .long vector258 - .long vector259 - .long vector260 - .long vector261 - .long vector262 - .long vector263 - .long vector264 - .long vector265 - .long vector266 - .long vector267 - .long vector268 - .long vector269 - .long vector270 - .long vector271 - .long vector272 - .long vector273 - .long vector274 - .long vector275 - .long vector276 - .long vector277 - .long vector278 - .long vector279 - .long vector280 - .long vector281 - .long vector282 - .long vector283 - .long vector284 - .long vector285 - .long vector286 - .long vector287 - .long vector288 - .long vector289 - .long vector290 - .long vector291 - .long vector292 - .long vector293 - .long vector294 - .long vector295 - .long vector296 - .long vector297 - .long vector298 - .long vector299 - .long vector300 - .long vector301 - .long vector302 - .long vector303 - .long vector304 - .long vector305 - .long vector306 - .long vector307 - .long vector308 - .long vector309 - .long vector310 - .long vector311 - .long vector312 - .long vector313 - .long vector314 - .long vector315 - .long vector316 - .long vector317 - .long vector318 - .long vector319 - .long vector320 - .long vector321 - .long vector322 - .long vector323 - .long vector324 - .long vector325 - .long vector326 - .long vector327 - .long vector328 - .long vector329 - .long vector330 - .long vector331 - .long vector332 - .long vector333 - .long vector334 - .long vector335 - .long vector336 - .long vector337 - .long vector338 - .long vector339 - .long vector340 - .long vector341 - .long vector342 - .long vector343 - .long vector344 - .long vector345 - .long vector346 - .long vector347 - .long vector348 - .long vector349 - .long vector350 - .long vector351 - .long vector352 - .long vector353 - .long vector354 - .long vector355 - .long vector356 - .long vector357 - .long vector358 - .long vector359 - - .text - .align 2 - .weak vector0 -vector0: - - .weak vector1 -vector1: - - .weak vector2 -vector2: - - .weak vector3 -vector3: - - .weak vector4 -vector4: - - .weak vector5 -vector5: - - .weak vector6 -vector6: - - .weak vector7 -vector7: - - .weak vector8 -vector8: - - .weak vector9 -vector9: - - .weak vector10 -vector10: - - .weak vector11 -vector11: - - .weak vector12 -vector12: - - .weak vector13 -vector13: - - .weak vector14 -vector14: - - .weak vector15 -vector15: - - .weak vector16 -vector16: - - .weak vector17 -vector17: - - .weak vector18 -vector18: - - .weak vector19 -vector19: - - .weak vector20 -vector20: - - .weak vector21 -vector21: - - .weak vector22 -vector22: - - .weak vector23 -vector23: - - .weak vector24 -vector24: - - .weak vector25 -vector25: - - .weak vector26 -vector26: - - .weak vector27 -vector27: - - .weak vector28 -vector28: - - .weak vector29 -vector29: - - .weak vector30 -vector30: - - .weak vector31 -vector31: - - .weak vector32 -vector32: - - .weak vector33 -vector33: - - .weak vector34 -vector34: - - .weak vector35 -vector35: - - .weak vector36 -vector36: - - .weak vector37 -vector37: - - .weak vector38 -vector38: - - .weak vector39 -vector39: - - .weak vector40 -vector40: - - .weak vector41 -vector41: - - .weak vector42 -vector42: - - .weak vector43 -vector43: - - .weak vector44 -vector44: - - .weak vector45 -vector45: - - .weak vector46 -vector46: - - .weak vector47 -vector47: - - .weak vector48 -vector48: - - .weak vector49 -vector49: - - .weak vector50 -vector50: - - .weak vector51 -vector51: - - .weak vector52 -vector52: - - .weak vector53 -vector53: - - .weak vector54 -vector54: - - .weak vector55 -vector55: - - .weak vector56 -vector56: - - .weak vector57 -vector57: - - .weak vector58 -vector58: - - .weak vector59 -vector59: - - .weak vector60 -vector60: - - .weak vector61 -vector61: - - .weak vector62 -vector62: - - .weak vector63 -vector63: - - .weak vector64 -vector64: - - .weak vector65 -vector65: - - .weak vector66 -vector66: - - .weak vector67 -vector67: - - .weak vector68 -vector68: - - .weak vector69 -vector69: - - .weak vector70 -vector70: - - .weak vector71 -vector71: - - .weak vector72 -vector72: - - .weak vector73 -vector73: - - .weak vector74 -vector74: - - .weak vector75 -vector75: - - .weak vector76 -vector76: - - .weak vector77 -vector77: - - .weak vector78 -vector78: - - .weak vector79 -vector79: - - .weak vector80 -vector80: - - .weak vector81 -vector81: - - .weak vector82 -vector82: - - .weak vector83 -vector83: - - .weak vector84 -vector84: - - .weak vector85 -vector85: - - .weak vector86 -vector86: - - .weak vector87 -vector87: - - .weak vector88 -vector88: - - .weak vector89 -vector89: - - .weak vector90 -vector90: - - .weak vector91 -vector91: - - .weak vector92 -vector92: - - .weak vector93 -vector93: - - .weak vector94 -vector94: - - .weak vector95 -vector95: - - .weak vector96 -vector96: - - .weak vector97 -vector97: - - .weak vector98 -vector98: - - .weak vector99 -vector99: - - .weak vector100 -vector100: - - .weak vector101 -vector101: - - .weak vector102 -vector102: - - .weak vector103 -vector103: - - .weak vector104 -vector104: - - .weak vector105 -vector105: - - .weak vector106 -vector106: - - .weak vector107 -vector107: - - .weak vector108 -vector108: - - .weak vector109 -vector109: - - .weak vector110 -vector110: - - .weak vector111 -vector111: - - .weak vector112 -vector112: - - .weak vector113 -vector113: - - .weak vector114 -vector114: - - .weak vector115 -vector115: - - .weak vector116 -vector116: - - .weak vector117 -vector117: - - .weak vector118 -vector118: - - .weak vector119 -vector119: - - .weak vector120 -vector120: - - .weak vector121 -vector121: - - .weak vector122 -vector122: - - .weak vector123 -vector123: - - .weak vector124 -vector124: - - .weak vector125 -vector125: - - .weak vector126 -vector126: - - .weak vector127 -vector127: - - .weak vector128 -vector128: - - .weak vector129 -vector129: - - .weak vector130 -vector130: - - .weak vector131 -vector131: - - .weak vector132 -vector132: - - .weak vector133 -vector133: - - .weak vector134 -vector134: - - .weak vector135 -vector135: - - .weak vector136 -vector136: - - .weak vector137 -vector137: - - .weak vector138 -vector138: - - .weak vector139 -vector139: - - .weak vector140 -vector140: - - .weak vector141 -vector141: - - .weak vector142 -vector142: - - .weak vector143 -vector143: - - .weak vector144 -vector144: - - .weak vector145 -vector145: - - .weak vector146 -vector146: - - .weak vector147 -vector147: - - .weak vector148 -vector148: - - .weak vector149 -vector149: - - .weak vector150 -vector150: - - .weak vector151 -vector151: - - .weak vector152 -vector152: - - .weak vector153 -vector153: - - .weak vector154 -vector154: - - .weak vector155 -vector155: - - .weak vector156 -vector156: - - .weak vector157 -vector157: - - .weak vector158 -vector158: - - .weak vector159 -vector159: - - .weak vector160 -vector160: - - .weak vector161 -vector161: - - .weak vector162 -vector162: - - .weak vector163 -vector163: - - .weak vector164 -vector164: - - .weak vector165 -vector165: - - .weak vector166 -vector166: - - .weak vector167 -vector167: - - .weak vector168 -vector168: - - .weak vector169 -vector169: - - .weak vector170 -vector170: - - .weak vector171 -vector171: - - .weak vector172 -vector172: - - .weak vector173 -vector173: - - .weak vector174 -vector174: - - .weak vector175 -vector175: - - .weak vector176 -vector176: - - .weak vector177 -vector177: - - .weak vector178 -vector178: - - .weak vector179 -vector179: - - .weak vector180 -vector180: - - .weak vector181 -vector181: - - .weak vector182 -vector182: - - .weak vector183 -vector183: - - .weak vector184 -vector184: - - .weak vector185 -vector185: - - .weak vector186 -vector186: - - .weak vector187 -vector187: - - .weak vector188 -vector188: - - .weak vector189 -vector189: - - .weak vector190 -vector190: - - .weak vector191 -vector191: - - .weak vector192 -vector192: - - .weak vector193 -vector193: - - .weak vector194 -vector194: - - .weak vector195 -vector195: - - .weak vector196 -vector196: - - .weak vector197 -vector197: - - .weak vector198 -vector198: - - .weak vector199 -vector199: - - .weak vector200 -vector200: - - .weak vector201 -vector201: - - .weak vector202 -vector202: - - .weak vector203 -vector203: - - .weak vector204 -vector204: - - .weak vector205 -vector205: - - .weak vector206 -vector206: - - .weak vector207 -vector207: - - .weak vector208 -vector208: - - .weak vector209 -vector209: - - .weak vector210 -vector210: - - .weak vector211 -vector211: - - .weak vector212 -vector212: - - .weak vector213 -vector213: - - .weak vector214 -vector214: - - .weak vector215 -vector215: - - .weak vector216 -vector216: - - .weak vector217 -vector217: - - .weak vector218 -vector218: - - .weak vector219 -vector219: - - .weak vector220 -vector220: - - .weak vector221 -vector221: - - .weak vector222 -vector222: - - .weak vector223 -vector223: - - .weak vector224 -vector224: - - .weak vector225 -vector225: - - .weak vector226 -vector226: - - .weak vector227 -vector227: - - .weak vector228 -vector228: - - .weak vector229 -vector229: - - .weak vector230 -vector230: - - .weak vector231 -vector231: - - .weak vector232 -vector232: - - .weak vector233 -vector233: - - .weak vector234 -vector234: - - .weak vector235 -vector235: - - .weak vector236 -vector236: - - .weak vector237 -vector237: - - .weak vector238 -vector238: - - .weak vector239 -vector239: - - .weak vector240 -vector240: - - .weak vector241 -vector241: - - .weak vector242 -vector242: - - .weak vector243 -vector243: - - .weak vector244 -vector244: - - .weak vector245 -vector245: - - .weak vector246 -vector246: - - .weak vector247 -vector247: - - .weak vector248 -vector248: - - .weak vector249 -vector249: - - .weak vector250 -vector250: - - .weak vector251 -vector251: - - .weak vector252 -vector252: - - .weak vector253 -vector253: - - .weak vector254 -vector254: - - .weak vector255 -vector255: - - .weak vector256 -vector256: - - .weak vector257 -vector257: - - .weak vector258 -vector258: - - .weak vector259 -vector259: - - .weak vector260 -vector260: - - .weak vector261 -vector261: - - .weak vector262 -vector262: - - .weak vector263 -vector263: - - .weak vector264 -vector264: - - .weak vector265 -vector265: - - .weak vector266 -vector266: - - .weak vector267 -vector267: - - .weak vector268 -vector268: - - .weak vector269 -vector269: - - .weak vector270 -vector270: - - .weak vector271 -vector271: - - .weak vector272 -vector272: - - .weak vector273 -vector273: - - .weak vector274 -vector274: - - .weak vector275 -vector275: - - .weak vector276 -vector276: - - .weak vector277 -vector277: - - .weak vector278 -vector278: - - .weak vector279 -vector279: - - .weak vector280 -vector280: - - .weak vector281 -vector281: - - .weak vector282 -vector282: - - .weak vector283 -vector283: - - .weak vector284 -vector284: - - .weak vector285 -vector285: - - .weak vector286 -vector286: - - .weak vector287 -vector287: - - .weak vector288 -vector288: - - .weak vector289 -vector289: - - .weak vector290 -vector290: - - .weak vector291 -vector291: - - .weak vector292 -vector292: - - .weak vector293 -vector293: - - .weak vector294 -vector294: - - .weak vector295 -vector295: - - .weak vector296 -vector296: - - .weak vector297 -vector297: - - .weak vector298 -vector298: - - .weak vector299 -vector299: - - .weak vector300 -vector300: - - .weak vector301 -vector301: - - .weak vector302 -vector302: - - .weak vector303 -vector303: - - .weak vector304 -vector304: - - .weak vector305 -vector305: - - .weak vector306 -vector306: - - .weak vector307 -vector307: - - .weak vector308 -vector308: - - .weak vector309 -vector309: - - .weak vector310 -vector310: - - .weak vector311 -vector311: - - .weak vector312 -vector312: - - .weak vector313 -vector313: - - .weak vector314 -vector314: - - .weak vector315 -vector315: - - .weak vector316 -vector316: - - .weak vector317 -vector317: - - .weak vector318 -vector318: - - .weak vector319 -vector319: - - .weak vector320 -vector320: - - .weak vector321 -vector321: - - .weak vector322 -vector322: - - .weak vector323 -vector323: - - .weak vector324 -vector324: - - .weak vector325 -vector325: - - .weak vector326 -vector326: - - .weak vector327 -vector327: - - .weak vector328 -vector328: - - .weak vector329 -vector329: - - .weak vector330 -vector330: - - .weak vector331 -vector331: - - .weak vector332 -vector332: - - .weak vector333 -vector333: - - .weak vector334 -vector334: - - .weak vector335 -vector335: - - .weak vector336 -vector336: - - .weak vector337 -vector337: - - .weak vector338 -vector338: - - .weak vector339 -vector339: - - .weak vector340 -vector340: - - .weak vector341 -vector341: - - .weak vector342 -vector342: - - .weak vector343 -vector343: - - .weak vector344 -vector344: - - .weak vector345 -vector345: - - .weak vector346 -vector346: - - .weak vector347 -vector347: - - .weak vector348 -vector348: - - .weak vector349 -vector349: - - .weak vector350 -vector350: - - .weak vector351 -vector351: - - .weak vector352 -vector352: - - .weak vector353 -vector353: - - .weak vector354 -vector354: - - .weak vector355 -vector355: - - .weak vector356 -vector356: - - .weak vector357 -vector357: - - .weak vector358 -vector358: - - .weak vector359 -vector359: - - .weak _unhandled_irq - .type _unhandled_irq, @function -_unhandled_irq: - b _unhandled_irq - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/ports/GCC/PPC/chcore.c b/os/ports/GCC/PPC/chcore.c deleted file mode 100644 index 5ad1195a46..0000000000 --- a/os/ports/GCC/PPC/chcore.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file PPC/chcore.c - * @brief PowerPC architecture port code. - * - * @addtogroup PPC_CORE - * @{ - */ - -#include "ch.h" - -/** - * @brief Kernel port layer initialization. - * @details IVOR4 and IVOR10 initialization. - */ -void port_init(void) { -#if PPC_SUPPORTS_IVORS - /* The CPU support IVOR registers, the kernel requires IVOR4 and IVOR10 - and the initialization is performed here.*/ - asm volatile ("li %r3, _IVOR4@l \t\n" - "mtIVOR4 %r3 \t\n" - "li %r3, _IVOR10@l \t\n" - "mtIVOR10 %r3" : : : "memory"); -#endif -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected (for example because a programming - * error in the application code that triggers an assertion while - * in debug mode). - */ -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -void port_switch(Thread *ntp, Thread *otp) { - - (void)otp; - (void)ntp; - - asm ("subi %sp, %sp, 80"); /* Size of the intctx structure. */ - asm ("mflr %r0"); - asm ("stw %r0, 84(%sp)"); /* LR into the caller frame. */ - asm ("mfcr %r0"); - asm ("stw %r0, 0(%sp)"); /* CR. */ - asm ("stmw %r14, 4(%sp)"); /* GPR14...GPR31. */ - - asm ("stw %sp, 12(%r4)"); /* Store swapped-out stack. */ - asm ("lwz %sp, 12(%r3)"); /* Load swapped-in stack. */ - - asm ("lmw %r14, 4(%sp)"); /* GPR14...GPR31. */ - asm ("lwz %r0, 0(%sp)"); /* CR. */ - asm ("mtcr %r0"); - asm ("lwz %r0, 84(%sp)"); /* LR from the caller frame. */ - asm ("mtlr %r0"); - asm ("addi %sp, %sp, 80"); /* Size of the intctx structure. */ -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -void _port_thread_start(void) { - - chSysUnlock(); - asm ("mr %r3, %r31"); /* Thread parameter. */ - asm ("mtctr %r30"); - asm ("bctrl"); /* Invoke thread function. */ - asm ("bl chThdExit"); /* Thread termination on exit. */ -} - -/** @} */ diff --git a/os/ports/GCC/PPC/chcore.h b/os/ports/GCC/PPC/chcore.h deleted file mode 100644 index 0a4476ea41..0000000000 --- a/os/ports/GCC/PPC/chcore.h +++ /dev/null @@ -1,376 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file PPC/chcore.h - * @brief PowerPC architecture port macros and structures. - * - * @addtogroup PPC_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/*===========================================================================*/ -/* Port constants (common). */ -/*===========================================================================*/ - -/* Added to make the header stand-alone when included from asm.*/ -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -/** - * @name Supported core variants - * @{ - */ -#define PPC_VARIANT_e200z0 200 -#define PPC_VARIANT_e200z3 203 -#define PPC_VARIANT_e200z4 204 -/** @} */ - -#include "ppcparams.h" - -/*===========================================================================*/ -/* Port macros (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters (common). */ -/*===========================================================================*/ - -/** - * @brief Use VLE instruction set. - * @note This parameter is usually set in the Makefile. - */ -#if !defined(PPC_USE_VLE) -#define PPC_USE_VLE TRUE -#endif - -/** - * @brief Enables the use of the @p WFI instruction. - */ -#if !defined(PPC_ENABLE_WFI_IDLE) -#define PPC_ENABLE_WFI_IDLE FALSE -#endif - -/*===========================================================================*/ -/* Port derived parameters (common). */ -/*===========================================================================*/ - -#if PPC_USE_VLE && !PPC_SUPPORTS_VLE -#error "the selected MCU does not support VLE instructions set" -#endif - -#if !PPC_USE_VLE && !PPC_SUPPORTS_BOOKE -#error "the selected MCU does not support BookE instructions set" -#endif - -/*===========================================================================*/ -/* Port exported info (common). */ -/*===========================================================================*/ - -/** - * @brief Unique macro for the implemented architecture. - */ -#define CH_ARCHITECTURE_PPC - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "Power Architecture" - -/** - * @brief Name of the architecture variant. - */ -#if (PPC_VARIANT == PPC_VARIANT_e200z0) || defined(__DOXYGEN__) -#define CH_CORE_VARIANT_NAME "e200z0" -#elif PPC_VARIANT == PPC_VARIANT_e200z3 -#define CH_CORE_VARIANT_NAME "e200z3" -#elif PPC_VARIANT == PPC_VARIANT_e200z4 -#define CH_CORE_VARIANT_NAME "e200z4" -#else -#error "unknown or unsupported PowerPC variant specified" -#endif - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "GCC " __VERSION__ - -/** - * @brief Port-specific information string. - */ -#if PPC_USE_VLE -#define CH_PORT_INFO "VLE mode" -#else -#define CH_PORT_INFO "Book-E mode" -#endif - -/*===========================================================================*/ -/* Port implementation part (common). */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Base type for stack and memory alignment. - */ -typedef struct { - uint8_t a[8]; -} stkalign_t __attribute__((aligned(8))); - -/** - * @brief Generic PPC register. - */ -typedef void *regppc_t; - -/** - * @brief Mandatory part of a stack frame. - */ -struct eabi_frame { - regppc_t slink; /**< Stack back link. */ - regppc_t shole; /**< Stack hole for LR storage. */ -}; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note R2 and R13 are not saved because those are assumed to be immutable - * during the system life cycle. - */ -struct extctx { - struct eabi_frame frame; - /* Start of the e_stmvsrrw frame (offset 8).*/ - regppc_t pc; - regppc_t msr; - /* Start of the e_stmvsprw frame (offset 16).*/ - regppc_t cr; - regppc_t lr; - regppc_t ctr; - regppc_t xer; - /* Start of the e_stmvgprw frame (offset 32).*/ - regppc_t r0; - regppc_t r3; - regppc_t r4; - regppc_t r5; - regppc_t r6; - regppc_t r7; - regppc_t r8; - regppc_t r9; - regppc_t r10; - regppc_t r11; - regppc_t r12; - regppc_t padding; - }; - - /** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - * @note R2 and R13 are not saved because those are assumed to be immutable - * during the system life cycle. - * @note LR is stored in the caller contex so it is not present in this - * structure. - */ -struct intctx { - regppc_t cr; /* Part of it is not volatile... */ - regppc_t r14; - regppc_t r15; - regppc_t r16; - regppc_t r17; - regppc_t r18; - regppc_t r19; - regppc_t r20; - regppc_t r21; - regppc_t r22; - regppc_t r23; - regppc_t r24; - regppc_t r25; - regppc_t r26; - regppc_t r27; - regppc_t r28; - regppc_t r29; - regppc_t r30; - regppc_t r31; - regppc_t padding; -}; - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details This structure usually contains just the saved stack pointer - * defined as a pointer to a @p intctx structure. - */ -struct context { - struct intctx *sp; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - uint8_t *sp = (uint8_t *)workspace + wsize - sizeof(struct eabi_frame); \ - ((struct eabi_frame *)sp)->slink = 0; \ - ((struct eabi_frame *)sp)->shole = _port_thread_start; \ - tp->p_ctx.sp = (struct intctx *)(sp - sizeof(struct intctx)); \ - tp->p_ctx.sp->r31 = arg; \ - tp->p_ctx.sp->r30 = pf; \ -} - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * This value can be zero on those architecture where there is a - * separate interrupt stack and the stack space between @p intctx and - * @p extctx is known to be zero. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 256 -#endif - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @details Implemented as global interrupt disable. - */ -#define port_lock() asm volatile ("wrteei 0" : : : "memory") - -/** - * @details Implemented as global interrupt enable. - */ -#define port_unlock() asm volatile("wrteei 1" : : : "memory") - -/** - * @details Implemented as global interrupt disable. - */ -#define port_lock_from_isr() /*asm ("wrteei 0")*/ - -/** - * @details Implemented as global interrupt enable. - */ -#define port_unlock_from_isr() /*asm ("wrteei 1")*/ - -/** - * @details Implemented as global interrupt disable. - */ -#define port_disable() asm volatile ("wrteei 0" : : : "memory") - -/** - * @details Same as @p port_disable() in this port, there is no difference - * between the two states. - */ -#define port_suspend() asm volatile ("wrteei 0" : : : "memory") - -/** - * @details Implemented as global interrupt enable. - */ -#define port_enable() asm volatile ("wrteei 1" : : : "memory") - -/** - * @details This port function is implemented as inlined code for performance - * reasons. - */ -#if PPC_ENABLE_WFI_IDLE -#if !defined(port_wait_for_interrupt) -#define port_wait_for_interrupt() { \ - asm volatile ("wait" : : : "memory"); \ -} -#endif -#else -#define port_wait_for_interrupt() -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_init(void); - void port_halt(void); - void port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/GCC/PPC/chtypes.h b/os/ports/GCC/PPC/chtypes.h deleted file mode 100644 index 3a1844ef90..0000000000 --- a/os/ports/GCC/PPC/chtypes.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file PPC/chtypes.h - * @brief PowerPC architecture port system types. - * - * @addtogroup PPC_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#include - -#if !defined(_STDINT_H) && !defined(__STDINT_H_) -#include -#endif - -/* - * Derived generic types. - */ -typedef volatile int8_t vint8_t; /**< Volatile signed 8 bits. */ -typedef volatile uint8_t vuint8_t; /**< Volatile unsigned 8 bits. */ -typedef volatile int16_t vint16_t; /**< Volatile signed 16 bits. */ -typedef volatile uint16_t vuint16_t; /**< Volatile unsigned 16 bits. */ -typedef volatile int32_t vint32_t; /**< Volatile signed 32 bits. */ -typedef volatile uint32_t vuint32_t; /**< Volatile unsigned 32 bits. */ - -/* - * Kernel types. - */ -typedef int32_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter.*/ -typedef uint32_t tprio_t; /**< Thread priority. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef int32_t eventid_t; /**< Event Id. */ -typedef uint32_t eventmask_t; /**< Event mask. */ -typedef uint32_t flagsmask_t; /**< Event flags. */ -typedef uint32_t systime_t; /**< System time. */ -typedef int32_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note It uses the "packed" GCC attribute. - */ -#define PACK_STRUCT_STRUCT __attribute__((packed)) - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/GCC/PPC/crt0.s b/os/ports/GCC/PPC/crt0.s deleted file mode 100644 index d20cb7ffbf..0000000000 --- a/os/ports/GCC/PPC/crt0.s +++ /dev/null @@ -1,132 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file PPC/crt0.s - * @brief Generic PowerPC startup file for ChibiOS/RT. - * - * @addtogroup PPC_CORE - * @{ - */ - -#if !defined(__DOXYGEN__) - - .section .crt0, "ax" - .align 2 - .globl _boot_address - .type _boot_address, @function -_boot_address: - /* - * Stack setup. - */ - lis %r1, __ram_end__@h - ori %r1, %r1, __ram_end__@l - li %r0, 0 - stwu %r0, -8(%r1) - /* - * IVPR initialization. - */ - lis %r4, __ivpr_base__@h - ori %r4, %r4, __ivpr_base__@l - mtIVPR %r4 - /* - * Small sections registers initialization. - */ - lis %r2, __sdata2_start__@h - ori %r2, %r2, __sdata2_start__@l - lis %r13, __sdata_start__@h - ori %r13, %r13, __sdata_start__@l - /* - * Early initialization. - */ - bl __early_init - /* - * BSS clearing. - */ - lis %r4, __bss_start__@h - ori %r4, %r4, __bss_start__@l - lis %r5, __bss_end__@h - ori %r5, %r5, __bss_end__@l - li %r7, 0 -.bssloop: - cmpl cr0, %r4, %r5 - bge cr0, .bssend - stw %r7, 0(%r4) - addi %r4, %r4, 4 - b .bssloop -.bssend: - /* - * DATA initialization. - */ - lis %r4, __romdata_start__@h - ori %r4, %r4, __romdata_start__@l - lis %r5, __data_start__@h - ori %r5, %r5, __data_start__@l - lis %r6, __data_end__@h - ori %r6, %r6, __data_end__@l -.dataloop: - cmpl cr0, %r5, %r6 - bge cr0, .dataend - lwz %r7, 0(%r4) - addi %r4, %r4, 4 - stw %r7, 0(%r5) - addi %r5, %r5, 4 - b .dataloop -.dataend: - /* - * Late initialization. - */ - bl __late_init - /* - * Main program invocation. - */ - bl main - b _main_exit_handler - - /* - * Default main exit code, infinite loop. - */ - .weak _main_exit_handler - .globl _main_exit_handler - .type _main_exit_handler, @function -_main_exit_handler: - b _main_exit_handler - - /* - * Default early initialization code, none. - */ - .weak __early_init - .globl __early_init - .type __early_init, @function -__early_init: - blr - - /* - * Default late initialization code, none. - */ - .weak __late_init - .globl __late_init - .type __late_init, @function -__late_init: - blr - -#endif /* !defined(__DOXYGEN__) */ - -/** @} */ diff --git a/os/ports/GCC/PPC/port.dox b/os/ports/GCC/PPC/port.dox deleted file mode 100644 index 670523498a..0000000000 --- a/os/ports/GCC/PPC/port.dox +++ /dev/null @@ -1,132 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup PPC Power Architecture - * @details Power Architecture port for the GCC compiler. - * - * @section PPC_INTRO Introduction - * This port supports cores implementing a 32 bits Power Architecture. - * - * @section PPC_STATES Mapping of the System States in the Power Architecture port - * The ChibiOS/RT logical @ref system_states are mapped as follow in the - * PowerPC port: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). Interrupts are enabled. - * - Suspended. Interrupts are disabled. - * - Disabled. Interrupts are disabled. This state is equivalent to the - * Suspended state because there are no fast interrupts in this architecture. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wait. - * - S-Locked. Interrupts are disabled. - * - I-Locked. This state is equivalent to the SRI state, the - * @p chSysLockI() and @p chSysUnlockI() APIs do nothing (still use them in - * order to formally change state because this may change). - * - Serving Regular Interrupt. Normal interrupt service code. - * - Serving Fast Interrupt. Not present in this architecture. - * - Serving Non-Maskable Interrupt. The PowerPC has several non - * maskable interrupt sources that can be associated to this state. - * - Halted. Implemented as an infinite loop with interrupts disabled. - * . - * @section PPC_NOTES The PowerPC port notes - * The PowerPC port is organized as follow: - * - The @p main() function is invoked in privileged mode. - * - Each thread has a private stack with extra storage for interrupts - * servicing. - * - The Book-E Decrementer Timer, mapped on IVOR10, is used for system tick. - * - Interrupt nesting is not currently supported. - * . - * @ingroup gcc - */ - -/** - * @defgroup PPC_CONF Configuration Options - * @details PowerPC Configuration Options. The PowerPC port allows some - * architecture-specific configurations settings that can be overridden by - * redefining them in @p chconf.h. Usually there is no need to change the - * default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space used - * by an interrupt handler between the @p extctx and @p intctx - * structures. - * The default for this value is @p 128 bytes, this space is allocated for - * each thread so be careful in order to not waste precious RAM space. - * - @p IDLE_THREAD_STACK_SIZE, stack area size to be assigned to the IDLE - * thread. Usually there is no need to change this value unless inserting - * code in the IDLE thread hook macro. - * - @p ENABLE_WFI_IDLE, if set to @p TRUE enables the use of the @p wait - * instruction from within the idle loop. This is defaulted to 0 because - * it can create problems with some debuggers. Setting this option to 1 - * reduces the system power requirements. - * . - * @ingroup PPC - */ - -/** - * @defgroup PPC_CORE Core Port Implementation - * @brief PowerPC specific port code, structures and macros. - * - * @ingroup PPC - */ - -/** - * @defgroup PPC_STARTUP Startup Support - * @brief - * @details PPC startup code support. ChibiOS/RT provides its own generic - * startup file for the PowerPC port. - * Of course it is not mandatory to use it but care should be taken about the - * startup phase details. - * - * @section PPC_STARTUP_1 Startup Process - * The startup process, as implemented, is the following: - * -# The stacks pointer is initialized into the area defined in the linker - * script. - * -# The IVPR register is setup according to the linker script. - * -# The R2 and R13 registers are set to pointer to the SDA areas according - * to the EABI specification. - * -# An early initialization routine @p hwinit0 is invoked, if the symbol is - * not defined then an empty default routine is executed (weak symbol). - * -# DATA and BSS segments are initialized. - * -# A late initialization routine @p hwinit1 is invoked, if the symbol not - * defined then an empty default routine is executed (weak symbol).
    - * This late initialization function is also the proper place for a - * @a bootloader, if your application requires one. - * -# The @p main() function is invoked with the parameters @p argc and @p argv - * set to zero. - * -# Should the @p main() function return a branch is performed to the weak - * symbol @p _main_exit_handler. The default code is an endless empty loop. - * . - * @section PPC_STARTUP_2 Expected linker symbols - * The startup code starts at the symbol @p _boot_address and expects the - * following symbols to be defined in the linker script: - * - @p __ram_end__ RAM end location +1. - * - @p __sdata2_start__ small constants data area - * - @p __sdata_start__ small variables data area - * - @p __romdata_start__ address of the data segment source read only data. - * - @p __data_start__ data segment start location. - * - @p __data_end__ data segment end location +1. - * - @p __bss_start__ BSS start location. - * - @p __bss_end__ BSS end location +1. - * - @p __ivpr_base__ IVPR register initialization address. - * . - * @ingroup PPC - */ diff --git a/os/ports/GCC/PPC/rules.mk b/os/ports/GCC/PPC/rules.mk deleted file mode 100644 index 75f4bf8c89..0000000000 --- a/os/ports/GCC/PPC/rules.mk +++ /dev/null @@ -1,176 +0,0 @@ -# PPC makefile scripts and rules. - -# Output directory and files -ifeq ($(BUILDDIR),) - BUILDDIR = build -endif -ifeq ($(BUILDDIR),.) - BUILDDIR = build -endif -OUTFILES = $(BUILDDIR)/$(PROJECT).elf $(BUILDDIR)/$(PROJECT).hex \ - $(BUILDDIR)/$(PROJECT).bin $(BUILDDIR)/$(PROJECT).dmp - -# Automatic compiler options -OPT = $(USE_OPT) -COPT = $(USE_COPT) -CPPOPT = $(USE_CPPOPT) -ifeq ($(USE_LINK_GC),yes) - OPT += -ffunction-sections -fdata-sections -endif - -# VLE option handling. -ifeq ($(USE_VLE),yes) - DDEFS += -DPPC_USE_VLE=1 - DADEFS += -DPPC_USE_VLE=1 - MCU += -mvle -else - DDEFS += -DPPC_USE_VLE=0 - DADEFS += -DPPC_USE_VLE=0 -endif - -# Source files groups and paths -SRC = $(CSRC)$(CPPSRC) -SRCPATHS = $(sort $(dir $(ASMXSRC)) $(dir $(ASMSRC)) $(dir $(SRC))) - -# Various directories -OBJDIR = $(BUILDDIR)/obj -LSTDIR = $(BUILDDIR)/lst - -# Object files groups -COBJS = $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o))) -CPPOBJS = $(addprefix $(OBJDIR)/, $(notdir $(CPPSRC:.cpp=.o))) -ASMOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ASMSRC:.s=.o))) -ASMXOBJS = $(addprefix $(OBJDIR)/, $(notdir $(ASMXSRC:.S=.o))) -OBJS = $(ASMXOBJS) $(ASMOBJS) $(COBJS) $(CPPOBJS) - -# Paths -IINCDIR = $(patsubst %,-I%,$(INCDIR) $(DINCDIR) $(UINCDIR)) -LLIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) - -# Macros -DEFS = $(DDEFS) $(UDEFS) -ADEFS = $(DADEFS) $(UADEFS) - -# Libs -LIBS = $(DLIBS) $(ULIBS) - -# Various settings -MCFLAGS = -mcpu=$(MCU) -ODFLAGS = -x --syms -ASFLAGS = $(MCFLAGS) -Wa,-amhls=$(LSTDIR)/$(notdir $(<:.s=.lst)) $(ADEFS) -ASXFLAGS = $(MCFLAGS) -Wa,-amhls=$(LSTDIR)/$(notdir $(<:.S=.lst)) $(ADEFS) -CFLAGS = $(MCFLAGS) $(OPT) $(COPT) $(CWARN) -Wa,-alms=$(LSTDIR)/$(notdir $(<:.c=.lst)) $(DEFS) -CPPFLAGS = $(MCFLAGS) $(OPT) $(CPPOPT) $(CPPWARN) -Wa,-alms=$(LSTDIR)/$(notdir $(<:.cpp=.lst)) $(DEFS) -ifeq ($(USE_LINK_GC),yes) - LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(BUILDDIR)/$(PROJECT).map,--cref,--no-warn-mismatch,--gc-sections $(LLIBDIR) -else - LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(BUILDDIR)/$(PROJECT).map,--cref,--no-warn-mismatch $(LLIBDIR) -endif - -# Generate dependency information -CFLAGS += -MD -MP -MF .dep/$(@F).d -CPPFLAGS += -MD -MP -MF .dep/$(@F).d - -# Paths where to search for sources -VPATH = $(SRCPATHS) - -# -# Makefile rules -# - -all: $(OBJS) $(OUTFILES) MAKE_ALL_RULE_HOOK - -MAKE_ALL_RULE_HOOK: - -$(OBJS): | $(BUILDDIR) - -$(BUILDDIR) $(OBJDIR) $(LSTDIR): -ifneq ($(USE_VERBOSE_COMPILE),yes) - @echo Compiler Options - @echo $(CC) -c $(CFLAGS) -I. $(IINCDIR) main.c -o main.o - @echo -endif - mkdir -p $(OBJDIR) - mkdir -p $(LSTDIR) - -$(CPPOBJS) : $(OBJDIR)/%.o : %.cpp Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CPPC) -c $(CPPFLAGS) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CPPC) -c $(CPPFLAGS) -I. $(IINCDIR) $< -o $@ -endif - -$(COBJS) : $(OBJDIR)/%.o : %.c Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CC) -c $(CFLAGS) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CC) -c $(CFLAGS) -I. $(IINCDIR) $< -o $@ -endif - -$(ASMOBJS) : $(OBJDIR)/%.o : %.s Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(AS) -c $(ASFLAGS) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(AS) -c $(ASFLAGS) -I. $(IINCDIR) $< -o $@ -endif - -$(ASMXOBJS) : $(OBJDIR)/%.o : %.S Makefile -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(CC) -c $(ASXFLAGS) -I. $(IINCDIR) $< -o $@ -else - @echo Compiling $< - @$(CC) -c $(ASXFLAGS) -I. $(IINCDIR) $< -o $@ -endif - -%.elf: $(OBJS) $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - @echo - $(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ -else - @echo Linking $@ - @$(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ -endif - -%.hex: %.elf $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - $(HEX) $< $@ -else - @echo Creating $@ - @$(HEX) $< $@ -endif - -%.bin: %.elf $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - $(BIN) $< $@ -else - @echo Creating $@ - @$(BIN) $< $@ -endif - -%.dmp: %.elf $(LDSCRIPT) -ifeq ($(USE_VERBOSE_COMPILE),yes) - $(OD) $(ODFLAGS) $< > $@ -else - @echo Creating $@ - @$(OD) $(ODFLAGS) $< > $@ - @echo Done -endif - -clean: - @echo Cleaning - -rm -fR .dep $(BUILDDIR) - @echo Done - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/os/ports/GCC/SIMIA32/chcore.c b/os/ports/GCC/SIMIA32/chcore.c deleted file mode 100644 index dadf442919..0000000000 --- a/os/ports/GCC/SIMIA32/chcore.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @addtogroup SIMIA32_CORE - * @{ - */ - -#include - -#include "ch.h" -#include "hal.h" - -/** - * Performs a context switch between two threads. - * @param otp the thread to be switched out - * @param ntp the thread to be switched in - */ -__attribute__((used)) -static void __dummy(Thread *ntp, Thread *otp) { - (void)ntp; (void)otp; - - asm volatile ( -#if defined(WIN32) - ".globl @port_switch@8 \n\t" - "@port_switch@8:" -#elif defined(__APPLE__) - ".globl _port_switch \n\t" - "_port_switch:" -#else - ".globl port_switch \n\t" - "port_switch:" -#endif - "push %ebp \n\t" - "push %esi \n\t" - "push %edi \n\t" - "push %ebx \n\t" - "movl %esp, 12(%edx) \n\t" - "movl 12(%ecx), %esp \n\t" - "pop %ebx \n\t" - "pop %edi \n\t" - "pop %esi \n\t" - "pop %ebp \n\t" - "ret"); -} - -/** - * Halts the system. In this implementation it just exits the simulation. - */ -__attribute__((fastcall)) -void port_halt(void) { - - exit(2); -} - -/** - * @brief Start a thread by invoking its work function. - * @details If the work function returns @p chThdExit() is automatically - * invoked. - */ -__attribute__((cdecl, noreturn)) -void _port_thread_start(msg_t (*pf)(void *), void *p) { - - chSysUnlock(); - chThdExit(pf(p)); - while(1); -} - -/** @} */ diff --git a/os/ports/GCC/SIMIA32/chcore.h b/os/ports/GCC/SIMIA32/chcore.h deleted file mode 100644 index e9e2a13f94..0000000000 --- a/os/ports/GCC/SIMIA32/chcore.h +++ /dev/null @@ -1,243 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @addtogroup SIMIA32_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/** - * Macro defining the a simulated architecture into x86. - */ -#define CH_ARCHITECTURE_SIMIA32 - -/** - * Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "Simulator" - -/** - * @brief Name of the architecture variant (optional). - */ -#define CH_CORE_VARIANT_NAME "x86 (integer only)" - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "GCC " __VERSION__ - -/** - * @brief Port-specific information string. - */ -#define CH_PORT_INFO "No preemption" - -/** - * 16 bytes stack alignment. - */ -typedef struct { - uint8_t a[16]; -} stkalign_t __attribute__((aligned(16))); - -/** - * Generic x86 register. - */ -typedef void *regx86; - -/** - * Interrupt saved context. - * This structure represents the stack frame saved during a preemption-capable - * interrupt handler. - */ -struct extctx { -}; - -/** - * System saved context. - * @note In this demo the floating point registers are not saved. - */ -struct intctx { - regx86 ebx; - regx86 edi; - regx86 esi; - regx86 ebp; - regx86 eip; -}; - -/** - * Platform dependent part of the @p Thread structure. - * This structure usually contains just the saved stack pointer defined as a - * pointer to a @p intctx structure. - */ -struct context { - struct intctx volatile *esp; -}; - -#define APUSH(p, a) (p) -= sizeof(void *), *(void **)(p) = (void*)(a) - -/* Darwin requires the stack to be aligned to a 16-byte boundary at - * the time of a call instruction (in case the called function needs - * to save MMX registers). This aligns to 'mod' module 16, so that we'll end - * up with the right alignment after pushing the args. */ -#define AALIGN(p, mask, mod) p = (void *)((((uintptr_t)(p) - mod) & ~mask) + mod) - -/** - * Platform dependent part of the @p chThdCreateI() API. - * This code usually setup the context switching frame represented by a - * @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - uint8_t *esp = (uint8_t *)workspace + wsize; \ - APUSH(esp, 0); \ - uint8_t *savebp = esp; \ - AALIGN(esp, 15, 8); \ - APUSH(esp, arg); \ - APUSH(esp, pf); \ - APUSH(esp, 0); \ - esp -= sizeof(struct intctx); \ - ((struct intctx *)esp)->eip = _port_thread_start; \ - ((struct intctx *)esp)->ebx = 0; \ - ((struct intctx *)esp)->edi = 0; \ - ((struct intctx *)esp)->esi = 0; \ - ((struct intctx *)esp)->ebp = savebp; \ - tp->p_ctx.esp = (struct intctx *)esp; \ -} - -/** - * Stack size for the system idle thread. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 256 -#endif - -/** - * Per-thread stack overhead for interrupts servicing, it is used in the - * calculation of the correct working area size. - * It requires stack space because the simulated "interrupt handlers" can - * invoke host library functions inside so it better have a lot of space. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 16384 -#endif - -/** - * Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - - /** - * Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(void *) * 4 + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * Macro used to allocate a thread working area aligned as both position and - * size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * IRQ prologue code, inserted at the start of all IRQ handlers enabled to - * invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * IRQ epilogue code, inserted at the end of all IRQ handlers enabled to - * invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() - -/** - * IRQ handler function declaration. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * Simulator initialization. - */ -#define port_init() - -/** - * Does nothing in this simulator. - */ -#define port_lock() asm volatile("nop") - -/** - * Does nothing in this simulator. - */ -#define port_unlock() asm volatile("nop") - -/** - * Does nothing in this simulator. - */ -#define port_lock_from_isr() - -/** - * Does nothing in this simulator. - */ -#define port_unlock_from_isr() - -/** - * Does nothing in this simulator. - */ -#define port_disable() - -/** - * Does nothing in this simulator. - */ -#define port_suspend() - -/** - * Does nothing in this simulator. - */ -#define port_enable() - -/** - * In the simulator this does a polling pass on the simulated interrupt - * sources. - */ -#define port_wait_for_interrupt() ChkIntSources() - -#ifdef __cplusplus -extern "C" { -#endif - __attribute__((fastcall)) void port_switch(Thread *ntp, Thread *otp); - __attribute__((fastcall)) void port_halt(void); - __attribute__((cdecl, noreturn)) void _port_thread_start(msg_t (*pf)(void *), - void *p); - void ChkIntSources(void); -#ifdef __cplusplus -} -#endif - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/GCC/SIMIA32/chtypes.h b/os/ports/GCC/SIMIA32/chtypes.h deleted file mode 100644 index 7b24597c22..0000000000 --- a/os/ports/GCC/SIMIA32/chtypes.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#define __need_ptrdiff_t -#include - -#if !defined(_STDINT_H) && !defined(__STDINT_H_) -#include -#endif - -typedef int32_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint32_t tprio_t; /**< Thread priority. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef int32_t eventid_t; /**< Event Id. */ -typedef uint32_t eventmask_t; /**< Event mask. */ -typedef uint32_t flagsmask_t; /**< Event flags. */ -typedef uint32_t systime_t; /**< System time. */ -typedef int32_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note It uses the "packed" GCC attribute. - */ -#define PACK_STRUCT_STRUCT __attribute__((packed)) - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ diff --git a/os/ports/GCC/SIMIA32/port.mk b/os/ports/GCC/SIMIA32/port.mk deleted file mode 100644 index 8f053abc43..0000000000 --- a/os/ports/GCC/SIMIA32/port.mk +++ /dev/null @@ -1,6 +0,0 @@ -# List of the ChibiOS/RT SIMIA32 port files. -PORTSRC = ${CHIBIOS}/os/ports/GCC/SIMIA32/chcore.c - -PORTASM = - -PORTINC = ${CHIBIOS}/os/ports/GCC/SIMIA32 diff --git a/os/ports/IAR/ARMCMx/LPC11xx/cmparams.h b/os/ports/IAR/ARMCMx/LPC11xx/cmparams.h deleted file mode 100644 index 6afd508751..0000000000 --- a/os/ports/IAR/ARMCMx/LPC11xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/LPC11xx/cmparams.h - * @brief ARM Cortex-M0 parameters for the LPC11xx. - * - * @defgroup IAR_ARMCMx_LPC11xx LPC11xx Specific Parameters - * @ingroup IAR_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M0 specific parameters for the - * LPC11xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M0 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 2 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/LPC11xx/vectors.s b/os/ports/IAR/ARMCMx/LPC11xx/vectors.s deleted file mode 100644 index df325bc281..0000000000 --- a/os/ports/IAR/ARMCMx/LPC11xx/vectors.s +++ /dev/null @@ -1,187 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - MODULE ?vectors - - AAPCS INTERWORK, VFP_COMPATIBLE, RWPI_COMPATIBLE - PRESERVE8 - - SECTION IRQSTACK:DATA:NOROOT(3) - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - PUBLIC __vector_table - - DATA - -__vector_table: - DCD SFE(IRQSTACK) - DCD __iar_program_start - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - -/* - * Default interrupt handlers. - */ - PUBWEAK NMIVector - PUBWEAK HardFaultVector - PUBWEAK MemManageVector - PUBWEAK BusFaultVector - PUBWEAK UsageFaultVector - PUBWEAK Vector1C - PUBWEAK Vector20 - PUBWEAK Vector24 - PUBWEAK Vector28 - PUBWEAK SVCallVector - PUBWEAK DebugMonitorVector - PUBWEAK Vector34 - PUBWEAK PendSVVector - PUBWEAK SysTickVector - PUBWEAK Vector40 - PUBWEAK Vector44 - PUBWEAK Vector48 - PUBWEAK Vector4C - PUBWEAK Vector50 - PUBWEAK Vector54 - PUBWEAK Vector58 - PUBWEAK Vector5C - PUBWEAK Vector60 - PUBWEAK Vector64 - PUBWEAK Vector68 - PUBWEAK Vector6C - PUBWEAK Vector70 - PUBWEAK Vector74 - PUBWEAK Vector78 - PUBWEAK Vector7C - PUBWEAK Vector80 - PUBWEAK Vector84 - PUBWEAK Vector88 - PUBWEAK Vector8C - PUBWEAK Vector90 - PUBWEAK Vector94 - PUBWEAK Vector98 - PUBWEAK Vector9C - PUBWEAK VectorA0 - PUBWEAK VectorA4 - PUBWEAK VectorA8 - PUBWEAK VectorAC - PUBWEAK VectorB0 - PUBWEAK VectorB4 - PUBWEAK VectorB8 - PUBWEAK VectorBC - PUBLIC _unhandled_exception - - SECTION .text:CODE:REORDER(1) - THUMB - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -_unhandled_exception - b _unhandled_exception - - END diff --git a/os/ports/IAR/ARMCMx/LPC13xx/cmparams.h b/os/ports/IAR/ARMCMx/LPC13xx/cmparams.h deleted file mode 100644 index 453a84458f..0000000000 --- a/os/ports/IAR/ARMCMx/LPC13xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/LPC13xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the LPC13xx. - * - * @defgroup IAR_ARMCMx_LPC13xx LPC13xx Specific Parameters - * @ingroup IAR_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * LPC13xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 3 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/LPC13xx/vectors.s b/os/ports/IAR/ARMCMx/LPC13xx/vectors.s deleted file mode 100644 index 9b764501b3..0000000000 --- a/os/ports/IAR/ARMCMx/LPC13xx/vectors.s +++ /dev/null @@ -1,265 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - MODULE ?vectors - - AAPCS INTERWORK, VFP_COMPATIBLE, RWPI_COMPATIBLE - PRESERVE8 - - SECTION IRQSTACK:DATA:NOROOT(3) - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - PUBLIC __vector_table - - DATA - -__vector_table: - DCD SFE(IRQSTACK) - DCD __iar_program_start - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 - DCD VectorEC - DCD VectorF0 - DCD VectorF4 - DCD VectorF8 - DCD VectorFC - DCD Vector100 - DCD Vector104 - DCD Vector108 - DCD Vector10C - DCD Vector110 - DCD Vector114 - DCD Vector118 - DCD Vector11C - DCD Vector120 - DCD Vector124 - -/* - * Default interrupt handlers. - */ - PUBWEAK NMIVector - PUBWEAK HardFaultVector - PUBWEAK MemManageVector - PUBWEAK BusFaultVector - PUBWEAK UsageFaultVector - PUBWEAK Vector1C - PUBWEAK Vector20 - PUBWEAK Vector24 - PUBWEAK Vector28 - PUBWEAK SVCallVector - PUBWEAK DebugMonitorVector - PUBWEAK Vector34 - PUBWEAK PendSVVector - PUBWEAK SysTickVector - PUBWEAK Vector40 - PUBWEAK Vector44 - PUBWEAK Vector48 - PUBWEAK Vector4C - PUBWEAK Vector50 - PUBWEAK Vector54 - PUBWEAK Vector58 - PUBWEAK Vector5C - PUBWEAK Vector60 - PUBWEAK Vector64 - PUBWEAK Vector68 - PUBWEAK Vector6C - PUBWEAK Vector70 - PUBWEAK Vector74 - PUBWEAK Vector78 - PUBWEAK Vector7C - PUBWEAK Vector80 - PUBWEAK Vector84 - PUBWEAK Vector88 - PUBWEAK Vector8C - PUBWEAK Vector90 - PUBWEAK Vector94 - PUBWEAK Vector98 - PUBWEAK Vector9C - PUBWEAK VectorA0 - PUBWEAK VectorA4 - PUBWEAK VectorA8 - PUBWEAK VectorAC - PUBWEAK VectorB0 - PUBWEAK VectorB4 - PUBWEAK VectorB8 - PUBWEAK VectorBC - PUBWEAK VectorC0 - PUBWEAK VectorC4 - PUBWEAK VectorC8 - PUBWEAK VectorCC - PUBWEAK VectorD0 - PUBWEAK VectorD4 - PUBWEAK VectorD8 - PUBWEAK VectorDC - PUBWEAK VectorE0 - PUBWEAK VectorE4 - PUBWEAK VectorE8 - PUBWEAK VectorEC - PUBWEAK VectorF0 - PUBWEAK VectorF4 - PUBWEAK VectorF8 - PUBWEAK VectorFC - PUBWEAK Vector100 - PUBWEAK Vector104 - PUBWEAK Vector108 - PUBWEAK Vector10C - PUBWEAK Vector110 - PUBWEAK Vector114 - PUBWEAK Vector118 - PUBWEAK Vector11C - PUBWEAK Vector120 - PUBWEAK Vector124 - PUBLIC _unhandled_exception - - SECTION .text:CODE:REORDER(1) - THUMB - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -VectorF4 -VectorF8 -VectorFC -Vector100 -Vector104 -Vector108 -Vector10C -Vector110 -Vector114 -Vector118 -Vector11C -Vector120 -Vector124 -_unhandled_exception - b _unhandled_exception - - END diff --git a/os/ports/IAR/ARMCMx/STM32F1xx/cmparams.h b/os/ports/IAR/ARMCMx/STM32F1xx/cmparams.h deleted file mode 100644 index 3dee196c29..0000000000 --- a/os/ports/IAR/ARMCMx/STM32F1xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/STM32F1xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F1xx. - * - * @defgroup IAR_ARMCMx_STM32F1xx STM32F1xx Specific Parameters - * @ingroup IAR_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * STM32F1xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/STM32F1xx/vectors.s b/os/ports/IAR/ARMCMx/STM32F1xx/vectors.s deleted file mode 100644 index 606135991d..0000000000 --- a/os/ports/IAR/ARMCMx/STM32F1xx/vectors.s +++ /dev/null @@ -1,310 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#if !defined(STM32F10X_LD) && !defined(STM32F10X_LD_VL) && \ - !defined(STM32F10X_MD) && !defined(STM32F10X_MD_VL) && \ - !defined(STM32F10X_HD) && !defined(STM32F10X_XL) && \ - !defined(STM32F10X_CL) -#define _FROM_ASM_ -#include "board.h" -#endif - - MODULE ?vectors - - AAPCS INTERWORK, VFP_COMPATIBLE, RWPI_COMPATIBLE - PRESERVE8 - - SECTION IRQSTACK:DATA:NOROOT(3) - SECTION .intvec:CODE:NOROOT(3) - - EXTERN __iar_program_start - PUBLIC __vector_table - - DATA - -__vector_table: - DCD SFE(IRQSTACK) - DCD __iar_program_start - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 -#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) || \ - defined(STM32F10X_XL) || defined(STM32F10X_CL) - DCD VectorEC - DCD VectorF0 - DCD VectorF4 -#endif -#if defined(STM32F10X_HD) || defined(STM32F10X_XL) || defined(STM32F10X_CL) - DCD VectorF8 - DCD VectorFC - DCD Vector100 - DCD Vector104 - DCD Vector108 - DCD Vector10C - DCD Vector110 - DCD Vector114 - DCD Vector118 - DCD Vector11C - DCD Vector120 - DCD Vector124 - DCD Vector128 - DCD Vector12C -#endif -#if defined(STM32F10X_CL) - DCD Vector130 - DCD Vector134 - DCD Vector138 - DCD Vector13C - DCD Vector140 - DCD Vector144 - DCD Vector148 - DCD Vector14C -#endif - -/* - * Default interrupt handlers. - */ - PUBWEAK NMIVector - PUBWEAK HardFaultVector - PUBWEAK MemManageVector - PUBWEAK BusFaultVector - PUBWEAK UsageFaultVector - PUBWEAK Vector1C - PUBWEAK Vector20 - PUBWEAK Vector24 - PUBWEAK Vector28 - PUBWEAK SVCallVector - PUBWEAK DebugMonitorVector - PUBWEAK Vector34 - PUBWEAK PendSVVector - PUBWEAK SysTickVector - PUBWEAK Vector40 - PUBWEAK Vector44 - PUBWEAK Vector48 - PUBWEAK Vector4C - PUBWEAK Vector50 - PUBWEAK Vector54 - PUBWEAK Vector58 - PUBWEAK Vector5C - PUBWEAK Vector60 - PUBWEAK Vector64 - PUBWEAK Vector68 - PUBWEAK Vector6C - PUBWEAK Vector70 - PUBWEAK Vector74 - PUBWEAK Vector78 - PUBWEAK Vector7C - PUBWEAK Vector80 - PUBWEAK Vector84 - PUBWEAK Vector88 - PUBWEAK Vector8C - PUBWEAK Vector90 - PUBWEAK Vector94 - PUBWEAK Vector98 - PUBWEAK Vector9C - PUBWEAK VectorA0 - PUBWEAK VectorA4 - PUBWEAK VectorA8 - PUBWEAK VectorAC - PUBWEAK VectorB0 - PUBWEAK VectorB4 - PUBWEAK VectorB8 - PUBWEAK VectorBC - PUBWEAK VectorC0 - PUBWEAK VectorC4 - PUBWEAK VectorC8 - PUBWEAK VectorCC - PUBWEAK VectorD0 - PUBWEAK VectorD4 - PUBWEAK VectorD8 - PUBWEAK VectorDC - PUBWEAK VectorE0 - PUBWEAK VectorE4 - PUBWEAK VectorE8 - PUBWEAK VectorEC - PUBWEAK VectorF0 - PUBWEAK VectorF4 - PUBWEAK VectorF8 - PUBWEAK VectorFC - PUBWEAK Vector100 - PUBWEAK Vector104 - PUBWEAK Vector108 - PUBWEAK Vector10C - PUBWEAK Vector110 - PUBWEAK Vector114 - PUBWEAK Vector118 - PUBWEAK Vector11C - PUBWEAK Vector120 - PUBWEAK Vector124 - PUBWEAK Vector128 - PUBWEAK Vector12C - PUBWEAK Vector130 - PUBWEAK Vector134 - PUBWEAK Vector138 - PUBWEAK Vector13C - PUBWEAK Vector140 - PUBWEAK Vector144 - PUBWEAK Vector148 - PUBWEAK Vector14C - PUBLIC _unhandled_exception - - SECTION .text:CODE:REORDER(1) - THUMB - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -VectorF4 -VectorF8 -VectorFC -Vector100 -Vector104 -Vector108 -Vector10C -Vector110 -Vector114 -Vector118 -Vector11C -Vector120 -Vector124 -Vector128 -Vector12C -Vector130 -Vector134 -Vector138 -Vector13C -Vector140 -Vector144 -Vector148 -Vector14C -_unhandled_exception - b _unhandled_exception - - END diff --git a/os/ports/IAR/ARMCMx/STM32F4xx/cmparams.h b/os/ports/IAR/ARMCMx/STM32F4xx/cmparams.h deleted file mode 100644 index 7295b52c44..0000000000 --- a/os/ports/IAR/ARMCMx/STM32F4xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/STM32F4xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F4xx. - * - * @defgroup IAR_ARMCMx_STM32F4xx STM32F4xx Specific Parameters - * @ingroup IAR_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M4 specific parameters for the - * STM32F4xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M4 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU TRUE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/STM32F4xx/vectors.s b/os/ports/IAR/ARMCMx/STM32F4xx/vectors.s deleted file mode 100644 index e7602f05b9..0000000000 --- a/os/ports/IAR/ARMCMx/STM32F4xx/vectors.s +++ /dev/null @@ -1,337 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - MODULE ?vectors - - AAPCS INTERWORK, VFP_COMPATIBLE, RWPI_COMPATIBLE - PRESERVE8 - - SECTION IRQSTACK:DATA:NOROOT(3) - SECTION .intvec:CODE:NOROOT(3) - - EXTERN __iar_program_start - PUBLIC __vector_table - - DATA - -__vector_table: - DCD SFE(IRQSTACK) - DCD __iar_program_start - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 - DCD VectorEC - DCD VectorF0 - DCD VectorF4 - DCD VectorF8 - DCD VectorFC - DCD Vector100 - DCD Vector104 - DCD Vector108 - DCD Vector10C - DCD Vector110 - DCD Vector114 - DCD Vector118 - DCD Vector11C - DCD Vector120 - DCD Vector124 - DCD Vector128 - DCD Vector12C - DCD Vector130 - DCD Vector134 - DCD Vector138 - DCD Vector13C - DCD Vector140 - DCD Vector144 - DCD Vector148 - DCD Vector14C - DCD Vector150 - DCD Vector154 - DCD Vector158 - DCD Vector15C - DCD Vector160 - DCD Vector164 - DCD Vector168 - DCD Vector16C - DCD Vector170 - DCD Vector174 - DCD Vector178 - DCD Vector17C - DCD Vector180 - DCD Vector184 - -/* - * Default interrupt handlers. - */ - PUBWEAK NMIVector - PUBWEAK HardFaultVector - PUBWEAK MemManageVector - PUBWEAK BusFaultVector - PUBWEAK UsageFaultVector - PUBWEAK Vector1C - PUBWEAK Vector20 - PUBWEAK Vector24 - PUBWEAK Vector28 - PUBWEAK SVCallVector - PUBWEAK DebugMonitorVector - PUBWEAK Vector34 - PUBWEAK PendSVVector - PUBWEAK SysTickVector - PUBWEAK Vector40 - PUBWEAK Vector44 - PUBWEAK Vector48 - PUBWEAK Vector4C - PUBWEAK Vector50 - PUBWEAK Vector54 - PUBWEAK Vector58 - PUBWEAK Vector5C - PUBWEAK Vector60 - PUBWEAK Vector64 - PUBWEAK Vector68 - PUBWEAK Vector6C - PUBWEAK Vector70 - PUBWEAK Vector74 - PUBWEAK Vector78 - PUBWEAK Vector7C - PUBWEAK Vector80 - PUBWEAK Vector84 - PUBWEAK Vector88 - PUBWEAK Vector8C - PUBWEAK Vector90 - PUBWEAK Vector94 - PUBWEAK Vector98 - PUBWEAK Vector9C - PUBWEAK VectorA0 - PUBWEAK VectorA4 - PUBWEAK VectorA8 - PUBWEAK VectorAC - PUBWEAK VectorB0 - PUBWEAK VectorB4 - PUBWEAK VectorB8 - PUBWEAK VectorBC - PUBWEAK VectorC0 - PUBWEAK VectorC4 - PUBWEAK VectorC8 - PUBWEAK VectorCC - PUBWEAK VectorD0 - PUBWEAK VectorD4 - PUBWEAK VectorD8 - PUBWEAK VectorDC - PUBWEAK VectorE0 - PUBWEAK VectorE4 - PUBWEAK VectorE8 - PUBWEAK VectorEC - PUBWEAK VectorF0 - PUBWEAK VectorF4 - PUBWEAK VectorF8 - PUBWEAK VectorFC - PUBWEAK Vector100 - PUBWEAK Vector104 - PUBWEAK Vector108 - PUBWEAK Vector10C - PUBWEAK Vector110 - PUBWEAK Vector114 - PUBWEAK Vector118 - PUBWEAK Vector11C - PUBWEAK Vector120 - PUBWEAK Vector124 - PUBWEAK Vector128 - PUBWEAK Vector12C - PUBWEAK Vector130 - PUBWEAK Vector134 - PUBWEAK Vector138 - PUBWEAK Vector13C - PUBWEAK Vector140 - PUBWEAK Vector144 - PUBWEAK Vector148 - PUBWEAK Vector14C - PUBWEAK Vector150 - PUBWEAK Vector154 - PUBWEAK Vector158 - PUBWEAK Vector15C - PUBWEAK Vector160 - PUBWEAK Vector164 - PUBWEAK Vector168 - PUBWEAK Vector16C - PUBWEAK Vector170 - PUBWEAK Vector174 - PUBWEAK Vector178 - PUBWEAK Vector17C - PUBWEAK Vector180 - PUBWEAK Vector184 - PUBLIC _unhandled_exception - - SECTION .text:CODE:REORDER(1) - THUMB - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -VectorF4 -VectorF8 -VectorFC -Vector100 -Vector104 -Vector108 -Vector10C -Vector110 -Vector114 -Vector118 -Vector11C -Vector120 -Vector124 -Vector128 -Vector12C -Vector130 -Vector134 -Vector138 -Vector13C -Vector140 -Vector144 -Vector148 -Vector14C -Vector150 -Vector154 -Vector158 -Vector15C -Vector160 -Vector164 -Vector168 -Vector16C -Vector170 -Vector174 -Vector178 -Vector17C -Vector180 -Vector184 -_unhandled_exception - b _unhandled_exception - - END diff --git a/os/ports/IAR/ARMCMx/STM32L1xx/cmparams.h b/os/ports/IAR/ARMCMx/STM32L1xx/cmparams.h deleted file mode 100644 index 6c6c190e3d..0000000000 --- a/os/ports/IAR/ARMCMx/STM32L1xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/STM32L1xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32L1xx. - * - * @defgroup IAR_ARMCMx_STM32L1xx STM32L1xx Specific Parameters - * @ingroup IAR_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * STM32L1xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/STM32L1xx/vectors.s b/os/ports/IAR/ARMCMx/STM32L1xx/vectors.s deleted file mode 100644 index a5f33bedc1..0000000000 --- a/os/ports/IAR/ARMCMx/STM32L1xx/vectors.s +++ /dev/null @@ -1,231 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#if !defined(STM32L1XX_MD) -#define _FROM_ASM_ -#include "board.h" -#endif - - MODULE ?vectors - - AAPCS INTERWORK, VFP_COMPATIBLE, RWPI_COMPATIBLE - PRESERVE8 - - SECTION IRQSTACK:DATA:NOROOT(3) - SECTION .intvec:CODE:NOROOT(3) - - EXTERN __iar_program_start - PUBLIC __vector_table - - DATA - -__vector_table: - DCD SFE(IRQSTACK) - DCD __iar_program_start - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 - DCD VectorEC - DCD VectorF0 - -/* - * Default interrupt handlers. - */ - PUBWEAK NMIVector - PUBWEAK HardFaultVector - PUBWEAK MemManageVector - PUBWEAK BusFaultVector - PUBWEAK UsageFaultVector - PUBWEAK Vector1C - PUBWEAK Vector20 - PUBWEAK Vector24 - PUBWEAK Vector28 - PUBWEAK SVCallVector - PUBWEAK DebugMonitorVector - PUBWEAK Vector34 - PUBWEAK PendSVVector - PUBWEAK SysTickVector - PUBWEAK Vector40 - PUBWEAK Vector44 - PUBWEAK Vector48 - PUBWEAK Vector4C - PUBWEAK Vector50 - PUBWEAK Vector54 - PUBWEAK Vector58 - PUBWEAK Vector5C - PUBWEAK Vector60 - PUBWEAK Vector64 - PUBWEAK Vector68 - PUBWEAK Vector6C - PUBWEAK Vector70 - PUBWEAK Vector74 - PUBWEAK Vector78 - PUBWEAK Vector7C - PUBWEAK Vector80 - PUBWEAK Vector84 - PUBWEAK Vector88 - PUBWEAK Vector8C - PUBWEAK Vector90 - PUBWEAK Vector94 - PUBWEAK Vector98 - PUBWEAK Vector9C - PUBWEAK VectorA0 - PUBWEAK VectorA4 - PUBWEAK VectorA8 - PUBWEAK VectorAC - PUBWEAK VectorB0 - PUBWEAK VectorB4 - PUBWEAK VectorB8 - PUBWEAK VectorBC - PUBWEAK VectorC0 - PUBWEAK VectorC4 - PUBWEAK VectorC8 - PUBWEAK VectorCC - PUBWEAK VectorD0 - PUBWEAK VectorD4 - PUBWEAK VectorD8 - PUBWEAK VectorDC - PUBWEAK VectorE0 - PUBWEAK VectorE4 - PUBWEAK VectorE8 - PUBWEAK VectorEC - PUBWEAK VectorF0 - PUBLIC _unhandled_exception - - SECTION .text:CODE:REORDER(1) - THUMB - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -_unhandled_exception - b _unhandled_exception - - END diff --git a/os/ports/IAR/ARMCMx/chcore.c b/os/ports/IAR/ARMCMx/chcore.c deleted file mode 100644 index 5c44492dd7..0000000000 --- a/os/ports/IAR/ARMCMx/chcore.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chcore.c - * @brief ARM Cortex-Mx port code. - * - * @addtogroup IAR_ARMCMx_CORE - * @{ - */ - -#include "ch.h" - -/** - * @brief Halts the system. - * @note The function is declared as a weak symbol, it is possible - * to redefine it in your application code. - */ -#if !defined(__DOXYGEN__) -__weak -#endif -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/chcore.h b/os/ports/IAR/ARMCMx/chcore.h deleted file mode 100644 index a3e9733f0c..0000000000 --- a/os/ports/IAR/ARMCMx/chcore.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chcore.h - * @brief ARM Cortex-Mx port macros and structures. - * - * @addtogroup IAR_ARMCMx_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -/*===========================================================================*/ -/* Port constants (common). */ -/*===========================================================================*/ - -/* Added to make the header stand-alone when included from asm.*/ -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#define CORTEX_M0 0 /**< @brief Cortex-M0 variant. */ -#define CORTEX_M1 1 /**< @brief Cortex-M1 variant. */ -#define CORTEX_M3 3 /**< @brief Cortex-M3 variant. */ -#define CORTEX_M4 4 /**< @brief Cortex-M4 variant. */ - -/* Inclusion of the Cortex-Mx implementation specific parameters.*/ -#include "cmparams.h" - -/* Cortex model check, only M0 and M3 supported right now.*/ -#if (CORTEX_MODEL == CORTEX_M0) || (CORTEX_MODEL == CORTEX_M3) || \ - (CORTEX_MODEL == CORTEX_M4) -#elif (CORTEX_MODEL == CORTEX_M1) -#error "untested Cortex-M model" -#else -#error "unknown or unsupported Cortex-M model" -#endif - -/** - * @brief Total priority levels. - */ -#define CORTEX_PRIORITY_LEVELS (1 << CORTEX_PRIORITY_BITS) - -/** - * @brief Minimum priority level. - * @details This minimum priority level is calculated from the number of - * priority bits supported by the specific Cortex-Mx implementation. - */ -#define CORTEX_MINIMUM_PRIORITY (CORTEX_PRIORITY_LEVELS - 1) - -/** - * @brief Maximum priority level. - * @details The maximum allowed priority level is always zero. - */ -#define CORTEX_MAXIMUM_PRIORITY 0 - -/*===========================================================================*/ -/* Port macros (common). */ -/*===========================================================================*/ - -/** - * @brief Priority level verification macro. - */ -#define CORTEX_IS_VALID_PRIORITY(n) \ - (((n) >= 0) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level verification macro. - */ -#define CORTEX_IS_VALID_KERNEL_PRIORITY(n) \ - (((n) >= CORTEX_MAX_KERNEL_PRIORITY) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level to priority mask conversion macro. - */ -#define CORTEX_PRIORITY_MASK(n) \ - ((n) << (8 - CORTEX_PRIORITY_BITS)) - -/*===========================================================================*/ -/* Port configurable parameters (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port derived parameters (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port exported info (common). */ -/*===========================================================================*/ - -/** - * @brief Macro defining a generic ARM architecture. - */ -#define CH_ARCHITECTURE_ARM - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "IAR" - -/*===========================================================================*/ -/* Port implementation part (common). */ -/*===========================================================================*/ - -/* Includes the sub-architecture-specific part.*/ -#if (CORTEX_MODEL == CORTEX_M0) || (CORTEX_MODEL == CORTEX_M1) -#include "chcore_v6m.h" -#elif (CORTEX_MODEL == CORTEX_M3) || (CORTEX_MODEL == CORTEX_M4) -#include "chcore_v7m.h" -#endif - -#if !defined(_FROM_ASM_) - -#include -#include "nvic.h" - -/* The following declarations are there just for Doxygen documentation, the - real declarations are inside the sub-headers.*/ -#if defined(__DOXYGEN__) - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note It is implemented to match the Cortex-Mx exception context. - */ -struct extctx {}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - */ -struct intctx {}; - -#endif /* defined(__DOXYGEN__) */ - -/** - * @brief Excludes the default @p chSchIsPreemptionRequired()implementation. - */ -#define PORT_OPTIMIZED_ISPREEMPTIONREQUIRED - -#if (CH_TIME_QUANTUM > 0) || defined(__DOXYGEN__) -/** - * @brief Inline-able version of this kernel function. - */ -#define chSchIsPreemptionRequired() \ - (currp->p_preempt ? firstprio(&rlist.r_queue) > currp->p_prio : \ - firstprio(&rlist.r_queue) >= currp->p_prio) -#else /* CH_TIME_QUANTUM == 0 */ -#define chSchIsPreemptionRequired() \ - (firstprio(&rlist.r_queue) > currp->p_prio) -#endif /* CH_TIME_QUANTUM == 0 */ - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/chcore_v6m.c b/os/ports/IAR/ARMCMx/chcore_v6m.c deleted file mode 100644 index cc1e1ab6b1..0000000000 --- a/os/ports/IAR/ARMCMx/chcore_v6m.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chcore_v6m.c - * @brief ARMv6-M architecture port code. - * - * @addtogroup IAR_ARMCMx_V6M_CORE - * @{ - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Port interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief System Timer vector. - * @details This interrupt is used as system tick. - * @note The timer must be initialized in the startup code. - */ -CH_IRQ_HANDLER(SysTickVector) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -/** - * @brief NMI vector. - * @details The NMI vector is used for exception mode re-entering after a - * context switch. - */ -void NMIVector(void) { - register struct extctx *ctxp; - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp = (struct extctx *)__get_PSP(); - ctxp++; - __set_PSP((unsigned long)ctxp); - port_unlock_from_isr(); -} -#endif /* !CORTEX_ALTERNATE_SWITCH */ - -#if CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - */ -void PendSVVector(void) { - register struct extctx *ctxp; - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp = (struct extctx *)__get_PSP(); - ctxp++; - __set_PSP((unsigned long)ctxp); -} -#endif /* CORTEX_ALTERNATE_SWITCH */ - -/*===========================================================================*/ -/* Port exported functions. */ -/*===========================================================================*/ - -/** - * @brief IRQ epilogue code. - * - * @param[in] lr value of the @p LR register on ISR entry - */ -void _port_irq_epilogue(regarm_t lr) { - - if (lr != (regarm_t)0xFFFFFFF1) { - register struct extctx *ctxp; - - port_lock_from_isr(); - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp = (struct extctx *)__get_PSP(); - ctxp--; - __set_PSP((unsigned long)ctxp); - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsPreemptionRequired()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (regarm_t)_port_switch_from_isr; - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (regarm_t)_port_exit_from_isr; - } - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - } -} - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/chcore_v6m.h b/os/ports/IAR/ARMCMx/chcore_v6m.h deleted file mode 100644 index a63bd1f187..0000000000 --- a/os/ports/IAR/ARMCMx/chcore_v6m.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chcore_v6m.h - * @brief ARMv6-M architecture port macros and structures. - * - * @addtogroup IAR_ARMCMx_V6M_CORE - * @{ - */ - -#ifndef _CHCORE_V6M_H_ -#define _CHCORE_V6M_H_ - -/*===========================================================================*/ -/* Port constants. */ -/*===========================================================================*/ - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p 0, - * this handler always has the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV 0 - -/*===========================================================================*/ -/* Port macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief SYSTICK handler priority. - * @note The default SYSTICK handler priority is calculated as the priority - * level in the middle of the numeric priorities range. - */ -#if !defined(CORTEX_PRIORITY_SYSTICK) -#define CORTEX_PRIORITY_SYSTICK (CORTEX_PRIORITY_LEVELS >> 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SYSTICK) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SYSTICK" -#endif - -/** - * @brief Alternate preemption method. - * @details Activating this option will make the Kernel use the PendSV - * handler for preemption instead of the NMI handler. - */ -#ifndef CORTEX_ALTERNATE_SWITCH -#define CORTEX_ALTERNATE_SWITCH FALSE -#endif - -/*===========================================================================*/ -/* Port derived parameters. */ -/*===========================================================================*/ - -/** - * @brief Maximum usable priority for normal ISRs. - */ -#if CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#else -#define CORTEX_MAX_KERNEL_PRIORITY 0 -#endif - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -/** - * @brief Macro defining the specific ARM architecture. - */ -#define CH_ARCHITECTURE_ARM_v6M - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "ARMv6-M" - -/** - * @brief Name of the architecture variant. - */ -#if (CORTEX_MODEL == CORTEX_M0) || defined(__DOXYGEN__) -#define CH_CORE_VARIANT_NAME "Cortex-M0" -#elif (CORTEX_MODEL == CORTEX_M1) -#define CH_CORE_VARIANT_NAME "Cortex-M1" -#endif - -/** - * @brief Port-specific information string. - */ -#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -#define CH_PORT_INFO "Preemption through NMI" -#else -#define CH_PORT_INFO "Preemption through PendSV" -#endif - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Generic ARM register. - */ -typedef void *regarm_t; - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - - /* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) - -struct extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -}; - -struct intctx { - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t lr; -}; - -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In this port the structure just holds a pointer to the @p intctx - * structure representing the stack pointer at context switch time. - */ -struct context { - struct intctx *r13; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.r13->r4 = (regarm_t)pf; \ - tp->p_ctx.r13->r5 = (regarm_t)arg; \ - tp->p_ctx.r13->lr = (regarm_t)_port_thread_start; \ -} - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() regarm_t _saved_lr = (regarm_t)__get_LR() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue(_saved_lr) - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Port-related initialization code. - */ -#define port_init() { \ - SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(0); \ - nvicSetSystemHandlerPriority(HANDLER_PENDSV, \ - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); \ - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, \ - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); \ -} - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform - * more actions. - */ -#define port_lock() __disable_interrupt() - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform - * more actions. - */ -#define port_unlock() __enable_interrupt() - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_lock_from_isr() port_lock() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_unlock_from_isr() port_unlock() - -/** - * @brief Disables all the interrupt sources. - */ -#define port_disable() __disable_interrupt() - -/** - * @brief Disables the interrupt sources below kernel-level priority. - */ -#define port_suspend() __disable_interrupt() - -/** - * @brief Enables all the interrupt sources. - */ -#define port_enable() __enable_interrupt() - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() asm ("wfi") -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - if ((stkalign_t *)(__get_SP() - sizeof(struct intctx)) < otp->p_stklimit) \ - chDbgPanic("stack overflow"); \ - _port_switch(ntp, otp); \ -} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_halt(void); - void _port_irq_epilogue(regarm_t lr); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V6M_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/chcore_v7m.c b/os/ports/IAR/ARMCMx/chcore_v7m.c deleted file mode 100644 index 3ceaf1d177..0000000000 --- a/os/ports/IAR/ARMCMx/chcore_v7m.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chcore_v7m.c - * @brief ARMv7-M architecture port code. - * - * @addtogroup IAR_ARMCMx_V7M_CORE - * @{ - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Port interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief System Timer vector. - * @details This interrupt is used as system tick. - * @note The timer must be initialized in the startup code. - */ -CH_IRQ_HANDLER(SysTickVector) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief SVC vector. - * @details The SVC vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in advanced kernel mode. - */ -void SVCallVector(void) { - struct extctx *ctxp; - - /* Current PSP value.*/ - ctxp = (struct extctx *)__get_PSP(); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - -#if CORTEX_USE_FPU - /* Restoring the special register SCB_FPCCR.*/ - SCB_FPCCR = (uint32_t)ctxp->fpccr; - SCB_FPCAR = SCB_FPCAR + sizeof (struct extctx); -#endif - __set_PSP((unsigned long)ctxp); - port_unlock_from_isr(); -} -#endif /* !CORTEX_SIMPLIFIED_PRIORITY */ - -#if CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in compact kernel mode. - */ -void PendSVVector(void) { - struct extctx *ctxp; - - /* Current PSP value.*/ - ctxp = (struct extctx *)__get_PSP(); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - -#if CORTEX_USE_FPU - /* Restoring the special register SCB_FPCCR.*/ - SCB_FPCCR = (uint32_t)ctxp->fpccr; - SCB_FPCAR = SCB_FPCAR + sizeof (struct extctx); -#endif - __set_PSP((unsigned long)ctxp); -} -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/*===========================================================================*/ -/* Port exported functions. */ -/*===========================================================================*/ - -/** - * @brief Port-related initialization code. - */ -void _port_init(void) { - - /* Initialization of the vector table and priority related settings.*/ - SCB_VTOR = CORTEX_VTOR_INIT; - SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(CORTEX_PRIGROUP_INIT); - -#if CORTEX_USE_FPU - { - /* Initializing the FPU context save in lazy mode.*/ - SCB_FPCCR = FPCCR_ASPEN | FPCCR_LSPEN; - - /* CP10 and CP11 set to full access.*/ - SCB_CPACR |= 0x00F00000; - - /* Enables FPU context save/restore on exception entry/exit (FPCA bit).*/ - __set_CONTROL(__get_CONTROL() | 4); - - /* FPSCR and FPDSCR initially zero.*/ - __set_FPSCR(0); - SCB_FPDSCR = 0; - } -#endif - - /* Initialization of the system vectors used by the port.*/ - nvicSetSystemHandlerPriority(HANDLER_SVCALL, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SVCALL)); - nvicSetSystemHandlerPriority(HANDLER_PENDSV, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); -} - -/** - * @brief Exception exit redirection to _port_switch_from_isr(). - */ -void _port_irq_epilogue(void) { - - port_lock_from_isr(); - if ((SCB_ICSR & ICSR_RETTOBASE) != 0) { - struct extctx *ctxp; - - /* Current PSP value.*/ - ctxp = (struct extctx *)__get_PSP(); - - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp--; - __set_PSP((unsigned long)ctxp); - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsPreemptionRequired()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (regarm_t)_port_switch_from_isr; -#if CORTEX_USE_FPU - /* Triggering a lazy FPU state save.*/ - (void)__get_FPSCR(); -#endif - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (regarm_t)_port_exit_from_isr; - } - -#if CORTEX_USE_FPU - { - uint32_t fpccr; - - /* Saving the special register SCB_FPCCR into the reserved offset of - the Cortex-M4 exception frame.*/ - (ctxp + 1)->fpccr = (regarm_t)(fpccr = SCB_FPCCR); - - /* Now the FPCCR is modified in order to not restore the FPU status - from the artificial return context.*/ - SCB_FPCCR = fpccr | FPCCR_LSPACT; - } -#endif - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - return; - } - port_unlock_from_isr(); -} - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/chcore_v7m.h b/os/ports/IAR/ARMCMx/chcore_v7m.h deleted file mode 100644 index 413f367074..0000000000 --- a/os/ports/IAR/ARMCMx/chcore_v7m.h +++ /dev/null @@ -1,504 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chcore_v7m.h - * @brief ARMv7-M architecture port macros and structures. - * - * @addtogroup IAR_ARMCMx_V7M_CORE - * @{ - */ - -#ifndef _CHCORE_V7M_H_ -#define _CHCORE_V7M_H_ - -/*===========================================================================*/ -/* Port constants. */ -/*===========================================================================*/ - -/** - * @brief Disabled value for BASEPRI register. - */ -#define CORTEX_BASEPRI_DISABLED 0 - -/*===========================================================================*/ -/* Port macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief SYSTICK handler priority. - * @note The default SYSTICK handler priority is calculated as the priority - * level in the middle of the numeric priorities range. - */ -#if !defined(CORTEX_PRIORITY_SYSTICK) -#define CORTEX_PRIORITY_SYSTICK (CORTEX_PRIORITY_LEVELS >> 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SYSTICK) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SYSTICK" -#endif - -/** - * @brief FPU support in context switch. - * @details Activating this option activates the FPU support in the kernel. - */ -#if !defined(CORTEX_USE_FPU) -#define CORTEX_USE_FPU CORTEX_HAS_FPU -#elif CORTEX_USE_FPU && !CORTEX_HAS_FPU -/* This setting requires an FPU presence check in case it is externally - redefined.*/ -#error "the selected core does not have an FPU" -#endif - -/** - * @brief Simplified priority handling flag. - * @details Activating this option makes the Kernel work in compact mode. - */ -#if !defined(CORTEX_SIMPLIFIED_PRIORITY) -#define CORTEX_SIMPLIFIED_PRIORITY FALSE -#endif - -/** - * @brief SVCALL handler priority. - * @note The default SVCALL handler priority is defaulted to - * @p CORTEX_MAXIMUM_PRIORITY+1, this reserves the - * @p CORTEX_MAXIMUM_PRIORITY priority level as fast interrupts - * priority level. - */ -#if !defined(CORTEX_PRIORITY_SVCALL) -#define CORTEX_PRIORITY_SVCALL (CORTEX_MAXIMUM_PRIORITY + 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SVCALL) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SVCALL" -#endif - -/** - * @brief NVIC VTOR initialization expression. - */ -#if !defined(CORTEX_VTOR_INIT) || defined(__DOXYGEN__) -#define CORTEX_VTOR_INIT 0x00000000 -#endif - -/** - * @brief NVIC PRIGROUP initialization expression. - * @details The default assigns all available priority bits as preemption - * priority with no sub-priority. - */ -#if !defined(CORTEX_PRIGROUP_INIT) || defined(__DOXYGEN__) -#define CORTEX_PRIGROUP_INIT (7 - CORTEX_PRIORITY_BITS) -#endif - -/*===========================================================================*/ -/* Port derived parameters. */ -/*===========================================================================*/ - -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief Maximum usable priority for normal ISRs. - */ -#define CORTEX_MAX_KERNEL_PRIORITY (CORTEX_PRIORITY_SVCALL + 1) - -/** - * @brief BASEPRI level within kernel lock. - * @note In compact kernel mode this constant value is enforced to zero. - */ -#define CORTEX_BASEPRI_KERNEL \ - CORTEX_PRIORITY_MASK(CORTEX_MAX_KERNEL_PRIORITY) -#else - -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#define CORTEX_BASEPRI_KERNEL 0 -#endif - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p CORTEX_BASEPRI_KERNEL, - * this handler always have the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV CORTEX_BASEPRI_KERNEL - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -#if (CORTEX_MODEL == CORTEX_M3) || defined(__DOXYGEN__) -/** - * @brief Macro defining the specific ARM architecture. - */ -#define CH_ARCHITECTURE_ARM_v7M - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "ARMv7-M" - -/** - * @brief Name of the architecture variant. - */ -#define CH_CORE_VARIANT_NAME "Cortex-M3" - -#elif (CORTEX_MODEL == CORTEX_M4) -#define CH_ARCHITECTURE_ARM_v7ME -#define CH_ARCHITECTURE_NAME "ARMv7-ME" -#if CORTEX_USE_FPU -#define CH_CORE_VARIANT_NAME "Cortex-M4F" -#else -#define CH_CORE_VARIANT_NAME "Cortex-M4" -#endif -#endif - -/** - * @brief Port-specific information string. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define CH_PORT_INFO "Advanced kernel mode" -#else -#define CH_PORT_INFO "Compact kernel mode" -#endif - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Generic ARM register. - */ -typedef void *regarm_t; - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - -/* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) - -struct extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -#if CORTEX_USE_FPU - regarm_t s0; - regarm_t s1; - regarm_t s2; - regarm_t s3; - regarm_t s4; - regarm_t s5; - regarm_t s6; - regarm_t s7; - regarm_t s8; - regarm_t s9; - regarm_t s10; - regarm_t s11; - regarm_t s12; - regarm_t s13; - regarm_t s14; - regarm_t s15; - regarm_t fpscr; - regarm_t fpccr; -#endif /* CORTEX_USE_FPU */ -}; - -struct intctx { -#if CORTEX_USE_FPU - regarm_t s16; - regarm_t s17; - regarm_t s18; - regarm_t s19; - regarm_t s20; - regarm_t s21; - regarm_t s22; - regarm_t s23; - regarm_t s24; - regarm_t s25; - regarm_t s26; - regarm_t s27; - regarm_t s28; - regarm_t s29; - regarm_t s30; - regarm_t s31; -#endif /* CORTEX_USE_FPU */ - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t lr; -}; - -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In this port the structure just holds a pointer to the @p intctx - * structure representing the stack pointer at context switch time. - */ -struct context { - struct intctx *r13; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.r13->r4 = (regarm_t)pf; \ - tp->p_ctx.r13->r5 = (regarm_t)arg; \ - tp->p_ctx.r13->lr = (regarm_t)_port_thread_start; \ -} - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Port-related initialization code. - */ -#define port_init() _port_init() - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform - * more actions. - * @note In this port this it raises the base priority to kernel level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_lock() __set_BASEPRI(CORTEX_BASEPRI_KERNEL) -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_lock() __disable_interrupt() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform - * more actions. - * @note In this port this it lowers the base priority to user level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_unlock() __set_BASEPRI(CORTEX_BASEPRI_DISABLED) -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_unlock() __enable_interrupt() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_lock_from_isr() port_lock() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note Same as @p port_unlock() in this port. - */ -#define port_unlock_from_isr() port_unlock() - -/** - * @brief Disables all the interrupt sources. - * @note Of course non-maskable interrupt sources are not included. - * @note In this port it disables all the interrupt sources by raising - * the priority mask to level 0. - */ -#define port_disable() __disable_interrupt() - -/** - * @brief Disables the interrupt sources below kernel-level priority. - * @note Interrupt sources above kernel level remains enabled. - * @note In this port it raises/lowers the base priority to kernel level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_suspend() { \ - __set_BASEPRI(CORTEX_BASEPRI_KERNEL); \ - __enable_interrupt(); \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_suspend() __disable_interrupt() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Enables all the interrupt sources. - * @note In this port it lowers the base priority to user level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_enable() { \ - __set_BASEPRI(CORTEX_BASEPRI_DISABLED); \ - __enable_interrupt(); \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_enable() __enable_interrupt() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() asm ("wfi") -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - if ((stkalign_t *)(__get_SP() - sizeof(struct intctx)) < otp->p_stklimit) \ - chDbgPanic("stack overflow"); \ - _port_switch(ntp, otp); \ -} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_halt(void); - void _port_init(void); - void _port_irq_epilogue(void); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V7M_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/chcoreasm_v6m.s b/os/ports/IAR/ARMCMx/chcoreasm_v6m.s deleted file mode 100644 index 9671328335..0000000000 --- a/os/ports/IAR/ARMCMx/chcoreasm_v6m.s +++ /dev/null @@ -1,111 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - MODULE ?chcoreasm_v6m - - AAPCS INTERWORK, VFP_COMPATIBLE - PRESERVE8 - -/* - * Imports the Cortex-Mx configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -CONTEXT_OFFSET SET 12 -SCB_ICSR SET 0xE000ED04 - - SECTION .text:CODE:NOROOT(2) - - EXTERN chThdExit - EXTERN chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - EXTERN dbg_check_unlock - EXTERN dbg_check_lock -#endif - - THUMB - -/* - * Performs a context switch between two threads. - */ - PUBLIC _port_switch -_port_switch: - push {r4, r5, r6, r7, lr} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4, r5, r6, r7} - mov r3, sp - str r3, [r1, #CONTEXT_OFFSET] - ldr r3, [r0, #CONTEXT_OFFSET] - mov sp, r3 - pop {r4, r5, r6, r7} - mov r8, r4 - mov r9, r5 - mov r10, r6 - mov r11, r7 - pop {r4, r5, r6, r7, pc} - -/* - * Start a thread by invoking its work function. - * If the work function returns @p chThdExit() is automatically invoked. - */ - PUBLIC _port_thread_start -_port_thread_start: -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif - cpsie i - mov r0, r5 - blx r4 - bl chThdExit - -/* - * Post-IRQ switch code. - * Exception handlers return here for context switching. - */ - PUBLIC _port_switch_from_isr - PUBLIC _port_exit_from_isr -_port_switch_from_isr: -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -_port_exit_from_isr: - ldr r2, =SCB_ICSR - movs r3, #128 -#if CORTEX_ALTERNATE_SWITCH - lsls r3, r3, #21 - str r3, [r2, #0] - cpsie i -#else - lsls r3, r3, #24 - str r3, [r2, #0] -#endif -waithere: - b waithere - - END diff --git a/os/ports/IAR/ARMCMx/chcoreasm_v7m.s b/os/ports/IAR/ARMCMx/chcoreasm_v7m.s deleted file mode 100644 index 008963a68e..0000000000 --- a/os/ports/IAR/ARMCMx/chcoreasm_v7m.s +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - MODULE ?chcoreasm_v7m - - AAPCS INTERWORK, VFP_COMPATIBLE - PRESERVE8 - -/* - * Imports the Cortex-Mx configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -CONTEXT_OFFSET SET 12 -SCB_ICSR SET 0xE000ED04 -ICSR_PENDSVSET SET 0x10000000 - - SECTION .text:CODE:NOROOT(2) - - EXTERN chThdExit - EXTERN chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - EXTERN dbg_check_unlock - EXTERN dbg_check_lock -#endif - - THUMB - -/* - * Performs a context switch between two threads. - */ - PUBLIC _port_switch -_port_switch: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} -#if CORTEX_USE_FPU - vpush {s16-s31} -#endif - str sp, [r1, #CONTEXT_OFFSET] - ldr sp, [r0, #CONTEXT_OFFSET] -#if CORTEX_USE_FPU - vpop {s16-s31} -#endif - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - -/* - * Start a thread by invoking its work function. - * If the work function returns @p chThdExit() is automatically invoked. - */ - PUBLIC _port_thread_start -_port_thread_start: -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -#if CORTEX_SIMPLIFIED_PRIORITY - cpsie i -#else - movs r3, #CORTEX_BASEPRI_DISABLED - msr BASEPRI, r3 -#endif - mov r0, r5 - blx r4 - bl chThdExit - -/* - * Post-IRQ switch code. - * Exception handlers return here for context switching. - */ - PUBLIC _port_switch_from_isr - PUBLIC _port_exit_from_isr -_port_switch_from_isr: -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -_port_exit_from_isr: -#if CORTEX_SIMPLIFIED_PRIORITY - mov r3, #LWRD SCB_ICSR - movt r3, #HWRD SCB_ICSR - mov r2, #ICSR_PENDSVSET - str r2, [r3] - cpsie i -.L3: b .L3 -#else - svc #0 -#endif - - END diff --git a/os/ports/IAR/ARMCMx/chtypes.h b/os/ports/IAR/ARMCMx/chtypes.h deleted file mode 100644 index ec370ba3ea..0000000000 --- a/os/ports/IAR/ARMCMx/chtypes.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/ARMCMx/chtypes.h - * @brief ARM Cortex-Mx port system types. - * - * @addtogroup IAR_ARMCMx_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#define __need_ptrdiff_t -#include - -#include - -typedef int32_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint32_t tprio_t; /**< Thread priority. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef int32_t eventid_t; /**< Event Id. */ -typedef uint32_t eventmask_t; /**< Event mask. */ -typedef uint32_t flagsmask_t; /**< Event flags. */ -typedef uint32_t systime_t; /**< System time. */ -typedef int32_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note Empty in this port. - */ -#define PACK_STRUCT_STRUCT - -/** - * @brief Packed structure modifier (before). - */ -#define PACK_STRUCT_BEGIN __packed - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/IAR/ARMCMx/cstartup.s b/os/ports/IAR/ARMCMx/cstartup.s deleted file mode 100644 index 1d599604c8..0000000000 --- a/os/ports/IAR/ARMCMx/cstartup.s +++ /dev/null @@ -1,68 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - MODULE ?cstartup - -CONTROL_MODE_PRIVILEGED SET 0 -CONTROL_MODE_UNPRIVILEGED SET 1 -CONTROL_USE_MSP SET 0 -CONTROL_USE_PSP SET 2 - - AAPCS INTERWORK, VFP_COMPATIBLE, ROPI - PRESERVE8 - - SECTION .intvec:CODE:NOROOT(3) - - SECTION CSTACK:DATA:NOROOT(3) - PUBLIC __main_thread_stack_base__ -__main_thread_stack_base__: - PUBLIC __heap_end__ -__heap_end__: - - SECTION SYSHEAP:DATA:NOROOT(3) - PUBLIC __heap_base__ -__heap_base__: - - PUBLIC __iar_program_start - EXTERN __vector_table - EXTWEAK __iar_init_core - EXTWEAK __iar_init_vfp - EXTERN __cmain - - SECTION .text:CODE:REORDER(2) - REQUIRE __vector_table - THUMB -__iar_program_start: - cpsid i - ldr r0, =SFE(CSTACK) - msr PSP, r0 - movs r0, #CONTROL_MODE_PRIVILEGED | CONTROL_USE_PSP - msr CONTROL, r0 - isb - bl __early_init - bl __iar_init_core - bl __iar_init_vfp - b __cmain - - PUBWEAK __early_init -__early_init: - bx lr - - END diff --git a/os/ports/IAR/ARMCMx/port.dox b/os/ports/IAR/ARMCMx/port.dox deleted file mode 100644 index 1e2078e785..0000000000 --- a/os/ports/IAR/ARMCMx/port.dox +++ /dev/null @@ -1,228 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup IAR_ARMCMx ARM Cortex-Mx - * @details ARM Cortex-Mx port for the IAR compiler. - - * @section IAR_ARMCMx_INTRO Introduction - * This port supports all the cores implementing the ARMv6-M and ARMv7-M - * architectures. - * - * @section IAR_ARMCMx_MODES Kernel Modes - * The Cortex-Mx port supports two distinct kernel modes: - * - Advanced Kernel mode. In this mode the kernel only masks - * interrupt sources with priorities below or equal to the - * @p CORTEX_BASEPRI_KERNEL level. Higher priorities are not affected by - * the kernel critical sections and can be used for fast interrupts. - * This mode is not available in the ARMv6-M architecture which does not - * support priority masking. - * - Compact Kernel mode. In this mode the kernel handles IRQ priorities - * in a simplified way, all interrupt sources are disabled when the kernel - * enters into a critical zone and re-enabled on exit. This is simple and - * adequate for most applications, this mode results in a more compact and - * faster kernel. - * . - * The selection of the mode is performed using the port configuration option - * @p CORTEX_SIMPLIFIED_PRIORITY. Apart from the different handling of - * interrupts there are no other differences between the two modes. The - * kernel API is exactly the same. - * - * @section IAR_ARMCMx_STATES_A System logical states in Compact Kernel mode - * The ChibiOS/RT logical @ref system_states are mapped as follow in Compact - * Kernel mode: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). In this state interrupts are enabled. The processor - * is running in thread-privileged mode. - * - Suspended. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. In this - * mode this state is not different from the Disabled state. - * - Disabled. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. In this - * mode this state is not different from the Suspended state. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wfi. - * - S-Locked. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. - * - I-Locked. In this state the interrupt sources are globally - * disabled. The processor is running in exception-privileged mode. - * - Serving Regular Interrupt. In this state the interrupt sources are - * not globally masked but only interrupts with higher priority can preempt - * the current handler. The processor is running in exception-privileged - * mode. - * - Serving Fast Interrupt. Not implemented in compact kernel mode. - * - Serving Non-Maskable Interrupt. The Cortex-Mx has a specific - * asynchronous NMI vector and several synchronous fault vectors that can - * be considered belonging to this category. - * - Halted. Implemented as an infinite loop after globally masking all - * the maskable interrupt sources. The ARM state is whatever the processor - * was running when @p chSysHalt() was invoked. - * - * @section IAR_ARMCMx_STATES_B System logical states in Advanced Kernel mode - * The ChibiOS/RT logical @ref system_states are mapped as follow in the - * Advanced Kernel mode: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). In this state the ARM Cortex-Mx has the BASEPRI register - * set at @p CORTEX_BASEPRI_USER level, interrupts are not masked. The - * processor is running in thread-privileged mode. - * - Suspended. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in thread-privileged mode. - * - Disabled. Interrupt sources are globally masked. The processor - * is running in thread-privileged mode. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wfi. - * - S-Locked. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in thread-privileged mode. - * - I-Locked. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in exception-privileged mode. - * - Serving Regular Interrupt. In this state the interrupt sources are - * not globally masked but only interrupts with higher priority can preempt - * the current handler. The processor is running in exception-privileged - * mode. - * - Serving Fast Interrupt. Fast interrupts are defined as interrupt - * sources having higher priority level than the kernel - * (@p CORTEX_BASEPRI_KERNEL). In this state is not possible to switch to - * the I-Locked state because fast interrupts can preempt the kernel - * critical zone.
    - * This state is not implemented in the ARMv6-M implementation because - * priority masking is not present in this architecture. - * - Serving Non-Maskable Interrupt. The Cortex-Mx has a specific - * asynchronous NMI vector and several synchronous fault vectors that can - * be considered belonging to this category. - * - Halted. Implemented as an infinite loop after globally masking all - * the maskable interrupt sources. The ARM state is whatever the processor - * was running when @p chSysHalt() was invoked. - * . - * @section IAR_ARMCMx_NOTES ARM Cortex-Mx/IAR port notes - * The ARM Cortex-Mx port is organized as follow: - * - The @p main() function is invoked in thread-privileged mode. - * - Each thread has a private process stack, the system has a single main - * stack where all the interrupts and exceptions are processed. - * - The threads are started in thread-privileged mode. - * - Interrupt nesting and the other advanced core/NVIC features are supported. - * - The Cortex-Mx port is perfectly generic, support for more devices can be - * easily added by adding a subdirectory under ./os/ports/IAR/ARMCMx - * and giving it the name of the new device, then copy the files from another - * device into the new directory and customize them for the new device. - * . - * @ingroup iar - */ - -/** - * @defgroup IAR_ARMCMx_CONF Configuration Options - * @details ARM Cortex-Mx Configuration Options. The ARMCMx port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space used - * by an interrupt handler between the @p extctx and @p intctx - * structures. - * - @p IDLE_THREAD_STACK_SIZE, stack area size to be assigned to the IDLE - * thread. Usually there is no need to change this value unless inserting - * code in the IDLE thread using the @p IDLE_LOOP_HOOK hook macro. - * - @p CORTEX_PRIORITY_SYSTICK, priority of the SYSTICK handler. - * - @p CORTEX_PRIORITY_PENDSV, priority of the PENDSV handler. - * - @p CORTEX_ENABLE_WFI_IDLE, if set to @p TRUE enables the use of the - * @p wfi instruction from within the idle loop. This option is - * defaulted to FALSE because it can create problems with some debuggers. - * Setting this option to TRUE reduces the system power requirements. - * . - * @section IAR_ARMCMx_CONF_1 ARMv6-M specific options - * The following options are specific for the ARMv6-M architecture: - * - @p CORTEX_ALTERNATE_SWITCH, when activated makes the OS use the PendSV - * exception instead of NMI as preemption handler. - * . - * @section IAR_ARMCMx_CONF_2 ARMv7-M specific options - * The following options are specific for the ARMv6-M architecture: - * - @p CORTEX_PRIORITY_SVCALL, priority of the SVCALL handler. - * - @p CORTEX_SIMPLIFIED_PRIORITY, when enabled activates the Compact kernel - * mode. - * . - * @ingroup IAR_ARMCMx - */ - -/** - * @defgroup IAR_ARMCMx_CORE Core Port Implementation - * @details ARM Cortex-Mx specific port code, structures and macros. - * - * @ingroup IAR_ARMCMx - */ - -/** - * @defgroup IAR_ARMCMx_V6M_CORE ARMv6-M Specific Implementation - * @details ARMv6-M specific port code, structures and macros. - * - * @ingroup IAR_ARMCMx_CORE - */ - -/** - * @defgroup IAR_ARMCMx_V7M_CORE ARMv7-M Specific Implementation - * @details ARMv7-M specific port code, structures and macros. - * - * @ingroup IAR_ARMCMx_CORE - */ - -/** - * @defgroup IAR_ARMCMx_STARTUP Startup Support - * @details ChibiOS/RT provides its own generic startup file for the ARM - * Cortex-Mx port. - * Of course it is not mandatory to use it but care should be taken about the - * startup phase details. - * - * @section IAR_ARMCMx_STARTUP_1 Startup Process - * The startup process, as implemented, is the following: - * -# Interrupts are masked globally. - * -# The two stacks are initialized by assigning them the sizes defined in the - * linker script (usually named @p ch.icf). - * -# The CPU state is switched to Privileged and the PSP stack is used. - * -# An early initialization routine @p __early_init() is invoked, if the - * symbol is not defined then an empty default routine is executed - * (weak symbol). - * -# Control is passed to the C runtime entry point @p __cmain that performs - * the required initializations before invoking the @p main() function. - * . - * @ingroup IAR_ARMCMx - */ - -/** - * @defgroup IAR_ARMCMx_NVIC NVIC Support - * @details ARM Cortex-Mx NVIC support. - * - * @ingroup IAR_ARMCMx - */ - -/** - * @defgroup IAR_ARMCMx_SPECIFIC Specific Implementations - * @details Platform-specific port code. - * - * @ingroup IAR_ARMCMx - */ diff --git a/os/ports/IAR/STM8/chcore.c b/os/ports/IAR/STM8/chcore.c deleted file mode 100644 index 6f7d32b302..0000000000 --- a/os/ports/IAR/STM8/chcore.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file cosmic/STM8/chcore.c - * @brief STM8 (Cosmic) architecture port code. - * - * @addtogroup STM8_COSMIC_CORE - * @{ - */ - -#include "ch.h" - -__tiny ReadyList rlist; - -/** - * @brief Thread start code. - */ -__task void _port_thread_start(void) { - chSysUnlock(); - asm("popw x"); -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected (for example because a programming - * error in the application code that triggers an assertion while in - * debug mode). - */ -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** @} */ diff --git a/os/ports/IAR/STM8/chcore.h b/os/ports/IAR/STM8/chcore.h deleted file mode 100644 index 72bfd4b116..0000000000 --- a/os/ports/IAR/STM8/chcore.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file cosmic/STM8/chcore.h - * @brief STM8 (Cosmic) architecture port macros and structures. - * - * @addtogroup STM8_COSMIC_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#ifndef STM8_ENABLE_WFI_IDLE -#define STM8_ENABLE_WFI_IDLE FALSE -#endif - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -/** - * @brief Unique macro for the implemented architecture. - */ -#define CH_ARCHITECTURE_STM8 - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "STM8" - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "IAR" - -/** - * @brief Port-specific information string. - */ -#define CH_PORT_INFO "None" - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -/** - * @brief Base type for stack alignment. - * @note No alignment constraints so uint8_t. - */ -typedef uint8_t stkalign_t; - -/** - * @brief Generic STM8 function pointer. - * @note It is used to allocate the proper size for return addresses in - * context-related structures. - */ -typedef void (*stm8func_t)(void); - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note The structure requires one dummy field at its start because the - * stack is handled as preincremented/postdecremented. - */ -struct extctx { - uint8_t _next; - uint16_t w3; - uint16_t w2; - uint16_t w1; - uint16_t w0; - uint8_t cc; - uint8_t a; - uint16_t x; - uint16_t y; - uint8_t pce; - uint8_t pch; - uint8_t pcl; -}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching.. - * @note The structure requires one dummy field at its start because the - * stack is handled as preincremented/postdecremented. - */ -struct intctx { - uint8_t _next; - uint16_t w7; - uint16_t w6; - uint16_t w5; - uint16_t w4; - stm8func_t pc; /* Function pointer sized return address. */ -}; - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details This structure usually contains just the saved stack pointer - * defined as a pointer to a @p intctx structure. - */ -struct context { - struct intctx *sp; -}; - -/** - * @brief Start context. - * @details This context is the stack organization for the trampoline code - * @p _port_thread_start(). - */ -struct stm8_startctx { - uint8_t saved_vreg[8]; // saved virtual registers to restore - uint8_t _next; - stm8func_t ts; /* Trampoline address. */ - void *arg; /* Thread argument. */ - stm8func_t pc; /* Thread function address. */ - stm8func_t ret; /* chThdExit() address. */ -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - struct stm8_startctx *scp; \ - scp = (struct stm8_startctx *)((uint8_t *)workspace + wsize - \ - sizeof(struct stm8_startctx)); \ - scp->ts = (stm8func_t)_port_thread_start; \ - scp->arg = (void *)arg; \ - scp->pc = (stm8func_t)pf; \ - scp->ret = (stm8func_t)chThdExit; \ - tp->p_ctx.sp = (struct intctx *)scp; \ -} - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 0 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This is a safe value, you may trim it down after reading the - * right size in the map file. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 48 -#endif - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - (sizeof(struct intctx) - 1) + \ - (sizeof(struct extctx) - 1) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() { \ - dbg_check_lock(); \ - if (chSchIsPreemptionRequired()) \ - chSchDoReschedule(); \ - dbg_check_unlock(); \ -} - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) \ - _Pragma(VECTOR_ID((id)+2)) __interrupt void vector##id(void) - -/** - * @brief Port-related initialization code. - * @note None in this port. - */ -#define port_init() - -/** - * @brief Kernel-lock action. - * @note Implemented as global interrupts disable. - */ -#define port_lock() asm("sim") - -/** - * @brief Kernel-unlock action. - * @note Implemented as global interrupts enable. - */ -#define port_unlock() asm("rim") - -/** - * @brief Kernel-lock action from an interrupt handler. - * @note This function is empty in this port. - */ -#define port_lock_from_isr() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @note This function is empty in this port. - */ -#define port_unlock_from_isr() - -/** - * @brief Disables all the interrupt sources. - * @note Implemented as global interrupts disable. - * @note Of course non-maskable interrupt sources are not included. - */ -#define port_disable() asm("sim") - -/** - * @brief Disables the interrupt sources that are not supposed to preempt - * the kernel. - * @note Same as @p port_disable() in this port, there is no difference - * between the two states. - */ -#define port_suspend() asm("sim") - -/** - * @brief Enables all the interrupt sources. - * @note Implemented as global interrupt enable. - */ -#define port_enable() asm("rim") - -/** - * @brief Enters an architecture-dependent halt mode. - * @note Implemented with the specific "wfi" instruction. - */ -#if STM8_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() asm("wfi") -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note Implemented as a call to a low level assembler routine. - * - * @param ntp the thread to be switched in - * @param otp the thread to be switched out - */ -#define port_switch(ntp, otp) _port_switch(otp) - -#ifdef __cplusplus -extern "C" { -#endif - void _port_switch(Thread *otp); - __task void _port_thread_start(void); - void port_halt(void); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Scheduler captured code. */ -/*===========================================================================*/ - -#define PORT_OPTIMIZED_RLIST_VAR -#define PORT_OPTIMIZED_RLIST_EXT -#define PORT_OPTIMIZED_READYLIST_STRUCT - -typedef struct { - ThreadsQueue r_queue; - tprio_t r_prio; - Thread *r_current; -#if CH_USE_REGISTRY - Thread *r_newer; - Thread *r_older; -#endif - /* End of the fields shared with the Thread structure.*/ -#if CH_TIME_QUANTUM > 0 - cnt_t r_preempt; -#endif -} ReadyList; - -extern __tiny ReadyList rlist; - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/IAR/STM8/chcore_stm8.s b/os/ports/IAR/STM8/chcore_stm8.s deleted file mode 100644 index 0db99bea5e..0000000000 --- a/os/ports/IAR/STM8/chcore_stm8.s +++ /dev/null @@ -1,57 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -; Get definitions for virtual registers used by the compiler -#include "vregs.inc" - - SECTION .near_func.text:code - EXTERN rlist - -/* - * Performs a context switch between two threads. - */ - PUBLIC _port_switch -_port_switch: - push ?b8 - push ?b9 - push ?b10 - push ?b11 - push ?b12 - push ?b13 - push ?b14 - push ?b15 - - ldw y,sp - ldw (5,x),y - ldw x, rlist + 5 - ldw x,(5,x) - ldw sp,x - - pop ?b15 - pop ?b14 - pop ?b13 - pop ?b12 - pop ?b11 - pop ?b10 - pop ?b9 - pop ?b8 - ret - - END diff --git a/os/ports/IAR/STM8/chtypes.h b/os/ports/IAR/STM8/chtypes.h deleted file mode 100644 index a5753f410b..0000000000 --- a/os/ports/IAR/STM8/chtypes.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file IAR/STM8/chtypes.h - * @brief STM8 (IAR) port system types. - * - * @addtogroup STM8_IAR_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#include - -#if !defined(_STDINT_H) && !defined(__STDINT_H_) -#include -#endif - -typedef int8_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint8_t tprio_t; /**< Thread priority. */ -typedef int16_t msg_t; /**< Inter-thread message. */ -typedef int8_t eventid_t; /**< Event Id. */ -typedef uint8_t eventmask_t; /**< Event mask. */ -typedef uint8_t flagsmask_t; /**< Event flags. */ -typedef uint16_t systime_t; /**< System time. */ -typedef int8_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note Uses the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note Empty in this port. - */ -#define PACK_STRUCT_STRUCT - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/IAR/STM8/port.dox b/os/ports/IAR/STM8/port.dox deleted file mode 100644 index 47fd9d7f47..0000000000 --- a/os/ports/IAR/STM8/port.dox +++ /dev/null @@ -1,95 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8_IAR STM8 - * @details STM8 port for the Cosmic C compiler. - * - * @section STM8_IAR_INTRO Introduction - * This port supports all STM8 8 bits MCUs. - * - * @section STM8_IAR_STATES Mapping of the System States in the STM8 port - * The ChibiOS/RT logical @ref system_states are mapped as follow in the STM8 - * port: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). Interrupts are enabled. - * - Suspended. Interrupts are disabled. - * - Disabled. Interrupts are disabled. This state is equivalent to the - * Suspended state because there are no fast interrupts in this architecture. - * - Sleep. Implemented with "wait" instruction insertion in the idle - * loop. - * - S-Locked. Interrupts are disabled. - * - I-Locked. This state is equivalent to the SRI state, the - * @p chSysLockI() and @p chSysUnlockI() APIs do nothing (still use them in - * order to formally change state because this may change). - * - Serving Regular Interrupt. Normal interrupt service code. - * - Serving Fast Interrupt. Not present in this architecture. - * - Serving Non-Maskable Interrupt. The STM8 ha non - * maskable interrupt sources that can be associated to this state. - * - Halted. Implemented as an infinite loop with interrupts disabled. - * . - * @section STM8_IAR_NOTES The STM8 port notes - * - The STM8 does not have a dedicated interrupt stack, make sure to reserve - * enough stack space for interrupts in each thread stack. This can be done - * by modifying the @p INT_REQUIRED_STACK macro into - * ./os/ports/cosmic/STM8/chcore.h. - * - The kernel currently supports only the small memory model so the - * kernel files should be loaded in the first 64K. Note that this is not - * a problem because upper addresses can be used by the user code, the - * kernel can context switch code running there. - * - The configuration option @p CH_OPTIMIZE_SPEED is not currently supported - * because the missing support of the @p inline "C" keyword in the - * compiler. - * . - * @ingroup cosmic - */ - -/** - * @defgroup STM8_IAR_CONF Configuration Options - * @details STM8 Configuration Options. The STM8 port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space - * used by the interrupt handlers.
    - * The default for this value is @p 48, this space is allocated for each - * thread so be careful in order to not waste precious RAM space. - * . - * @ingroup STM8_IAR - */ - -/** - * @defgroup STM8_IAR_CORE Core Port Implementation - * @details STM8 specific port code, structures and macros. - * - * @ingroup STM8_IAR - */ - - /** - * @defgroup STM8_IAR_STARTUP Startup Support - * @details ChibiOS/RT doed not provide startup files for the STM8, there - * are no special startup requirement so the normal toolchain-provided - * startup files can be used. - * - * @ingroup STM8_IAR - */ diff --git a/os/ports/RC/STM8/chcore.c b/os/ports/RC/STM8/chcore.c deleted file mode 100644 index 48eadb24cc..0000000000 --- a/os/ports/RC/STM8/chcore.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RC/STM8/chcore.c - * @brief STM8 (Raisonance) architecture port code. - * - * @addtogroup STM8_RAISONANCE_CORE - * @{ - */ -#pragma SRC("tmp.asm") - -#include "ch.h" - -page0 ReadyList rlist; - -/** - * @brief Performs a context switch between two threads. - * - * @param otp the thread to be switched out - */ -void _port_switch(Thread *otp) { - - (void)otp; - /* Asm because unoptimal code would generated by using _getSP_().*/ -#pragma ASM - LDW Y,SP ; old context pointer - LDW (5,X),Y ; SP saved in otp->p_ctx.sp - LDW X,rlist + 5 ; r_current (currp) field - LDW X,(5,X) ; currp->p_ctx.sp - LDW SP,X ; new context pointer -#pragma ENDASM -} - -/** - * @brief Thread start code. - */ -void _port_thread_start(void) { - - chSysUnlock(); -#pragma ASM - POPW X -#pragma ENDASM -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected (for example because a programming - * error in the application code that triggers an assertion while in - * debug mode). - */ -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** @} */ diff --git a/os/ports/RC/STM8/chcore.h b/os/ports/RC/STM8/chcore.h deleted file mode 100644 index b72f066c4c..0000000000 --- a/os/ports/RC/STM8/chcore.h +++ /dev/null @@ -1,334 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RC/STM8/chcore.h - * @brief STM8 (Raisonance) architecture port macros and structures. - * - * @addtogroup STM8_RAISONANCE_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#include - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#ifndef STM8_ENABLE_WFI_IDLE -#define STM8_ENABLE_WFI_IDLE FALSE -#endif - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -/** - * @brief Unique macro for the implemented architecture. - */ -#define CH_ARCHITECTURE_STM8 - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "STM8" - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "Raisonance" - -/** - * @brief Port-specific information string. - */ -#define CH_PORT_INFO "None" - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -/** - * @brief Base type for stack alignment. - * @note No alignment constraints so uint8_t. - */ -typedef uint8_t stkalign_t; - -/** - * @brief Generic STM8 function pointer. - * @note It is used to allocate the proper size for return addresses in - * context-related structures. - */ -typedef void (*stm8func_t)(void); - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note The structure requires one dummy field at its start because the - * stack is handled as preincremented/postdecremented. - */ -struct extctx { - uint8_t _next; - uint16_t cx; - uint16_t bx; - uint8_t cc; - uint8_t a; - uint16_t x; - uint16_t y; - uint8_t pce; - uint8_t pch; - uint8_t pcl; -}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching.. - * @note The structure requires one dummy field at its start because the - * stack is handled as preincremented/postdecremented. - */ -struct intctx { - uint8_t _next; - stm8func_t pc; /* Function pointer sized return address. */ -}; - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details This structure usually contains just the saved stack pointer - * defined as a pointer to a @p intctx structure. - */ -struct context { - struct intctx *sp; -}; - -/** - * @brief Start context. - * @details This context is the stack organization for the trampoline code - * @p _port_thread_start(). - */ -struct stm8_startctx { - uint8_t _next; - stm8func_t ts; /* Trampoline address. */ - void *arg; /* Thread argument. */ - stm8func_t pc; /* Thread function address. */ - stm8func_t ret; /* chThdExit() address. */ -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - struct stm8_startctx *scp; \ - scp = (struct stm8_startctx *)((uint8_t *)workspace + wsize - \ - sizeof(struct stm8_startctx)); \ - scp->ts = _port_thread_start; \ - scp->arg = arg; \ - scp->pc = (stm8func_t)pf; \ - scp->ret = (stm8func_t)chThdExit; \ - tp->p_ctx.sp = (struct intctx *)scp; \ -} - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 0 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This is a safe value, you may trim it down after reading the - * right size in the map file. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 48 -#endif - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - (sizeof(struct intctx) - 1) + \ - (sizeof(struct extctx) - 1) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() { \ -} - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() { \ - dbg_check_lock(); \ - if (chSchIsPreemptionRequired()) \ - chSchDoReschedule(); \ - dbg_check_unlock(); \ -} - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void vector##id(void) interrupt id - -/** - * @brief Port-related initialization code. - * @note None in this port. - */ -#define port_init() - -/** - * @brief Kernel-lock action. - * @note Implemented as global interrupts disable. - */ -#define port_lock() _sim_() - -/** - * @brief Kernel-unlock action. - * @note Implemented as global interrupts enable. - */ -#define port_unlock() _rim_() - -/** - * @brief Kernel-lock action from an interrupt handler. - * @note This function is empty in this port. - */ -#define port_lock_from_isr() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @note This function is empty in this port. - */ -#define port_unlock_from_isr() - -/** - * @brief Disables all the interrupt sources. - * @note Implemented as global interrupts disable. - * @note Of course non-maskable interrupt sources are not included. - */ -#define port_disable() _sim_() - -/** - * @brief Disables the interrupt sources that are not supposed to preempt - * the kernel. - * @note Same as @p port_disable() in this port, there is no difference - * between the two states. - */ -#define port_suspend() _sim_() - -/** - * @brief Enables all the interrupt sources. - * @note Implemented as global interrupt enable. - */ -#define port_enable() _rim_() - -/** - * @brief Enters an architecture-dependent halt mode. - * @note Implemented with the specific "wfi" instruction. - */ -#if STM8_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() _wfi_() -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note Implemented as a call to a low level assembler routine. - * - * @param ntp the thread to be switched in - * @param otp the thread to be switched out - */ -#define port_switch(ntp, otp) _port_switch(otp) - -#ifdef __cplusplus -extern "C" { -#endif - void _port_switch(Thread *otp); - void _port_thread_start(void); - void port_halt(void); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Scheduler captured code. */ -/*===========================================================================*/ - -#define PORT_OPTIMIZED_RLIST_VAR -#define PORT_OPTIMIZED_RLIST_EXT -#define PORT_OPTIMIZED_READYLIST_STRUCT - -typedef struct { - ThreadsQueue r_queue; - tprio_t r_prio; - Thread *r_current; -#if CH_USE_REGISTRY - Thread *r_newer; - Thread *r_older; -#endif - /* End of the fields shared with the Thread structure.*/ -#if CH_TIME_QUANTUM > 0 - cnt_t r_preempt; -#endif -} ReadyList; - -page0 extern ReadyList rlist; - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/RC/STM8/chtypes.h b/os/ports/RC/STM8/chtypes.h deleted file mode 100644 index b87d77baa7..0000000000 --- a/os/ports/RC/STM8/chtypes.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RC/STM8/chtypes.h - * @brief STM8 (Raisonance) port system types. - * - * @addtogroup STM8_RAISONANCE_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#include - -//#if !defined(_STDINT_H) && !defined(__STDINT_H_) -//#include -//#endif - -typedef unsigned char uint8_t; /**< C99-style 8 bits unsigned. */ -typedef signed char int8_t; /**< C99-style 8 bits signed. */ -typedef unsigned int uint16_t; /**< C99-style 16 bits unsigned. */ -typedef signed int int16_t; /**< C99-style 16 bits signed. */ -typedef unsigned long uint32_t; /**< C99-style 32 bits unsigned. */ -typedef signed long int32_t; /**< C99-style 32 bits signed. */ -typedef uint8_t uint_fast8_t; /**< C99-style 8 bits unsigned. */ -typedef uint16_t uint_fast16_t; /**< C99-style 16 bits unsigned. */ -typedef uint32_t uint_fast32_t; /**< C99-style 32 bits unsigned. */ - -typedef int8_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint8_t tprio_t; /**< Thread priority. */ -typedef int16_t msg_t; /**< Inter-thread message. */ -typedef int8_t eventid_t; /**< Event Id. */ -typedef uint8_t eventmask_t; /**< Event mask. */ -typedef uint8_t flagsmask_t; /**< Event flags. */ -typedef uint16_t systime_t; /**< System time. */ -typedef int8_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE inline - -/** - * @brief ROM constant modifier. - * @note Uses the "const" keyword in this port. - */ -#define ROMCONST code - -/** - * @brief Packed structure modifier (within). - * @note Empty in this port. - */ -#define PACK_STRUCT_STRUCT - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/RC/STM8/port.dox b/os/ports/RC/STM8/port.dox deleted file mode 100644 index ff55a5c1a9..0000000000 --- a/os/ports/RC/STM8/port.dox +++ /dev/null @@ -1,95 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8_RAISONANCE STM8 - * @details STM8 port for the Raisonance C compiler. - * - * @section STM8_RAISONANCE_INTRO Introduction - * This port supports all STM8 8 bits MCUs. - * - * @section STM8_RAISONANCE_STATES Mapping of the System States in the STM8 port - * The ChibiOS/RT logical @ref system_states are mapped as follow in the STM8 - * port: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). Interrupts are enabled. - * - Suspended. Interrupts are disabled. - * - Disabled. Interrupts are disabled. This state is equivalent to the - * Suspended state because there are no fast interrupts in this architecture. - * - Sleep. Implemented with "wait" instruction insertion in the idle - * loop. - * - S-Locked. Interrupts are disabled. - * - I-Locked. This state is equivalent to the SRI state, the - * @p chSysLockI() and @p chSysUnlockI() APIs do nothing (still use them in - * order to formally change state because this may change). - * - Serving Regular Interrupt. Normal interrupt service code. - * - Serving Fast Interrupt. Not present in this architecture. - * - Serving Non-Maskable Interrupt. The STM8 ha non - * maskable interrupt sources that can be associated to this state. - * - Halted. Implemented as an infinite loop with interrupts disabled. - * . - * @section STM8_RAISONANCE_NOTES The STM8 port notes - * - The STM8 does not have a dedicated interrupt stack, make sure to reserve - * enough stack space for interrupts in each thread stack. This can be done - * by modifying the @p INT_REQUIRED_STACK macro into - * ./os/ports/RC/STM8/chcore.h. - * - The kernel currently supports only the small memory model so the - * kernel files should be loaded in the first 64K. Note that this is not - * a problem because upper addresses can be used by the user code, the - * kernel can context switch code running there. - * - The configuration option @p CH_OPTIMIZE_SPEED is not currently supported - * because the missing support of the @p inline "C" keyword in the - * compiler. - * . - * @ingroup raisonance - */ - -/** - * @defgroup STM8_RAISONANCE_CONF Configuration Options - * @details STM8 Configuration Options. The STM8 port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space - * used by the interrupt handlers.
    - * The default for this value is @p 48, this space is allocated for each - * thread so be careful in order to not waste precious RAM space. - * . - * @ingroup STM8_RAISONANCE - */ - -/** - * @defgroup STM8_RAISONANCE_CORE Core Port Implementation - * @details STM8 specific port code, structures and macros. - * - * @ingroup STM8_RAISONANCE - */ - - /** - * @defgroup STM8_RAISONANCE_STARTUP Startup Support - * @details ChibiOS/RT doed not provide startup files for the STM8, there - * are no special startup requirement so the normal toolchain-provided - * startup files can be used. - * - * @ingroup STM8_RAISONANCE - */ diff --git a/os/ports/RVCT/ARMCMx/LPC11xx/cmparams.h b/os/ports/RVCT/ARMCMx/LPC11xx/cmparams.h deleted file mode 100644 index 67ad169ce9..0000000000 --- a/os/ports/RVCT/ARMCMx/LPC11xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/LPC11xx/cmparams.h - * @brief ARM Cortex-M0 parameters for the LPC11xx. - * - * @defgroup RVCT_ARMCMx_LPC11xx LPC11xx Specific Parameters - * @ingroup RVCT_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M0 specific parameters for the - * LPC11xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M0 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 2 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/LPC11xx/vectors.s b/os/ports/RVCT/ARMCMx/LPC11xx/vectors.s deleted file mode 100644 index e4a8128871..0000000000 --- a/os/ports/RVCT/ARMCMx/LPC11xx/vectors.s +++ /dev/null @@ -1,183 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - PRESERVE8 - - AREA RESET, DATA, READONLY - - IMPORT __initial_msp - IMPORT Reset_Handler - EXPORT __Vectors - -__Vectors - DCD __initial_msp - DCD Reset_Handler - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - - AREA |.text|, CODE, READONLY - THUMB - -/* - * Default interrupt handlers. - */ - EXPORT _unhandled_exception -_unhandled_exception PROC - EXPORT NMIVector [WEAK] - EXPORT HardFaultVector [WEAK] - EXPORT MemManageVector [WEAK] - EXPORT BusFaultVector [WEAK] - EXPORT UsageFaultVector [WEAK] - EXPORT Vector1C [WEAK] - EXPORT Vector20 [WEAK] - EXPORT Vector24 [WEAK] - EXPORT Vector28 [WEAK] - EXPORT SVCallVector [WEAK] - EXPORT DebugMonitorVector [WEAK] - EXPORT Vector34 [WEAK] - EXPORT PendSVVector [WEAK] - EXPORT SysTickVector [WEAK] - EXPORT Vector40 [WEAK] - EXPORT Vector44 [WEAK] - EXPORT Vector48 [WEAK] - EXPORT Vector4C [WEAK] - EXPORT Vector50 [WEAK] - EXPORT Vector54 [WEAK] - EXPORT Vector58 [WEAK] - EXPORT Vector5C [WEAK] - EXPORT Vector60 [WEAK] - EXPORT Vector64 [WEAK] - EXPORT Vector68 [WEAK] - EXPORT Vector6C [WEAK] - EXPORT Vector70 [WEAK] - EXPORT Vector74 [WEAK] - EXPORT Vector78 [WEAK] - EXPORT Vector7C [WEAK] - EXPORT Vector80 [WEAK] - EXPORT Vector84 [WEAK] - EXPORT Vector88 [WEAK] - EXPORT Vector8C [WEAK] - EXPORT Vector90 [WEAK] - EXPORT Vector94 [WEAK] - EXPORT Vector98 [WEAK] - EXPORT Vector9C [WEAK] - EXPORT VectorA0 [WEAK] - EXPORT VectorA4 [WEAK] - EXPORT VectorA8 [WEAK] - EXPORT VectorAC [WEAK] - EXPORT VectorB0 [WEAK] - EXPORT VectorB4 [WEAK] - EXPORT VectorB8 [WEAK] - EXPORT VectorBC [WEAK] - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC - b _unhandled_exception - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/LPC13xx/cmparams.h b/os/ports/RVCT/ARMCMx/LPC13xx/cmparams.h deleted file mode 100644 index aaf7271141..0000000000 --- a/os/ports/RVCT/ARMCMx/LPC13xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/LPC13xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the LPC13xx. - * - * @defgroup RVCT_ARMCMx_LPC13xx LPC13xx Specific Parameters - * @ingroup RVCT_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * LPC13xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 3 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/LPC13xx/vectors.s b/os/ports/RVCT/ARMCMx/LPC13xx/vectors.s deleted file mode 100644 index eeefa3aab8..0000000000 --- a/os/ports/RVCT/ARMCMx/LPC13xx/vectors.s +++ /dev/null @@ -1,261 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - PRESERVE8 - - AREA RESET, DATA, READONLY - - IMPORT __initial_msp - IMPORT Reset_Handler - EXPORT __Vectors - -__Vectors - DCD __initial_msp - DCD Reset_Handler - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 - DCD VectorEC - DCD VectorF0 - DCD VectorF4 - DCD VectorF8 - DCD VectorFC - DCD Vector100 - DCD Vector104 - DCD Vector108 - DCD Vector10C - DCD Vector110 - DCD Vector114 - DCD Vector118 - DCD Vector11C - DCD Vector120 - DCD Vector124 - - AREA |.text|, CODE, READONLY - THUMB - -/* - * Default interrupt handlers. - */ - EXPORT _unhandled_exception -_unhandled_exception PROC - EXPORT NMIVector [WEAK] - EXPORT HardFaultVector [WEAK] - EXPORT MemManageVector [WEAK] - EXPORT BusFaultVector [WEAK] - EXPORT UsageFaultVector [WEAK] - EXPORT Vector1C [WEAK] - EXPORT Vector20 [WEAK] - EXPORT Vector24 [WEAK] - EXPORT Vector28 [WEAK] - EXPORT SVCallVector [WEAK] - EXPORT DebugMonitorVector [WEAK] - EXPORT Vector34 [WEAK] - EXPORT PendSVVector [WEAK] - EXPORT SysTickVector [WEAK] - EXPORT Vector40 [WEAK] - EXPORT Vector44 [WEAK] - EXPORT Vector48 [WEAK] - EXPORT Vector4C [WEAK] - EXPORT Vector50 [WEAK] - EXPORT Vector54 [WEAK] - EXPORT Vector58 [WEAK] - EXPORT Vector5C [WEAK] - EXPORT Vector60 [WEAK] - EXPORT Vector64 [WEAK] - EXPORT Vector68 [WEAK] - EXPORT Vector6C [WEAK] - EXPORT Vector70 [WEAK] - EXPORT Vector74 [WEAK] - EXPORT Vector78 [WEAK] - EXPORT Vector7C [WEAK] - EXPORT Vector80 [WEAK] - EXPORT Vector84 [WEAK] - EXPORT Vector88 [WEAK] - EXPORT Vector8C [WEAK] - EXPORT Vector90 [WEAK] - EXPORT Vector94 [WEAK] - EXPORT Vector98 [WEAK] - EXPORT Vector9C [WEAK] - EXPORT VectorA0 [WEAK] - EXPORT VectorA4 [WEAK] - EXPORT VectorA8 [WEAK] - EXPORT VectorAC [WEAK] - EXPORT VectorB0 [WEAK] - EXPORT VectorB4 [WEAK] - EXPORT VectorB8 [WEAK] - EXPORT VectorBC [WEAK] - EXPORT VectorC0 [WEAK] - EXPORT VectorC4 [WEAK] - EXPORT VectorC8 [WEAK] - EXPORT VectorCC [WEAK] - EXPORT VectorD0 [WEAK] - EXPORT VectorD4 [WEAK] - EXPORT VectorD8 [WEAK] - EXPORT VectorDC [WEAK] - EXPORT VectorE0 [WEAK] - EXPORT VectorE4 [WEAK] - EXPORT VectorE8 [WEAK] - EXPORT VectorEC [WEAK] - EXPORT VectorF0 [WEAK] - EXPORT VectorF4 [WEAK] - EXPORT VectorF8 [WEAK] - EXPORT VectorFC [WEAK] - EXPORT Vector100 [WEAK] - EXPORT Vector104 [WEAK] - EXPORT Vector108 [WEAK] - EXPORT Vector10C [WEAK] - EXPORT Vector110 [WEAK] - EXPORT Vector114 [WEAK] - EXPORT Vector118 [WEAK] - EXPORT Vector11C [WEAK] - EXPORT Vector120 [WEAK] - EXPORT Vector124 [WEAK] - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -VectorF4 -VectorF8 -VectorFC -Vector100 -Vector104 -Vector108 -Vector10C -Vector110 -Vector114 -Vector118 -Vector11C -Vector120 -Vector124 - b _unhandled_exception - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/STM32F1xx/cmparams.h b/os/ports/RVCT/ARMCMx/STM32F1xx/cmparams.h deleted file mode 100644 index a2b91626ba..0000000000 --- a/os/ports/RVCT/ARMCMx/STM32F1xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/STM32F1xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F1xx. - * - * @defgroup RVCT_ARMCMx_STM32F1xx STM32F1xx Specific Parameters - * @ingroup RVCT_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * STM32F1xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU FALSE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/STM32F1xx/vectors.s b/os/ports/RVCT/ARMCMx/STM32F1xx/vectors.s deleted file mode 100644 index 98fdb927c0..0000000000 --- a/os/ports/RVCT/ARMCMx/STM32F1xx/vectors.s +++ /dev/null @@ -1,306 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#if !defined(STM32F10X_LD) && !defined(STM32F10X_LD_VL) && \ - !defined(STM32F10X_MD) && !defined(STM32F10X_MD_VL) && \ - !defined(STM32F10X_HD) && !defined(STM32F10X_XL) && \ - !defined(STM32F10X_CL) -#define _FROM_ASM_ -#include "board.h" -#endif - - PRESERVE8 - - AREA RESET, DATA, READONLY - - IMPORT __initial_msp - IMPORT Reset_Handler - EXPORT __Vectors - -__Vectors - DCD __initial_msp - DCD Reset_Handler - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 -#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) || \ - defined(STM32F10X_XL) || defined(STM32F10X_CL) - DCD VectorEC - DCD VectorF0 - DCD VectorF4 -#endif -#if defined(STM32F10X_HD) || defined(STM32F10X_XL) || defined(STM32F10X_CL) - DCD VectorF8 - DCD VectorFC - DCD Vector100 - DCD Vector104 - DCD Vector108 - DCD Vector10C - DCD Vector110 - DCD Vector114 - DCD Vector118 - DCD Vector11C - DCD Vector120 - DCD Vector124 - DCD Vector128 - DCD Vector12C -#endif -#if defined(STM32F10X_CL) - DCD Vector130 - DCD Vector134 - DCD Vector138 - DCD Vector13C - DCD Vector140 - DCD Vector144 - DCD Vector148 - DCD Vector14C -#endif - - AREA |.text|, CODE, READONLY - THUMB - -/* - * Default interrupt handlers. - */ - EXPORT _unhandled_exception -_unhandled_exception PROC - EXPORT NMIVector [WEAK] - EXPORT HardFaultVector [WEAK] - EXPORT MemManageVector [WEAK] - EXPORT BusFaultVector [WEAK] - EXPORT UsageFaultVector [WEAK] - EXPORT Vector1C [WEAK] - EXPORT Vector20 [WEAK] - EXPORT Vector24 [WEAK] - EXPORT Vector28 [WEAK] - EXPORT SVCallVector [WEAK] - EXPORT DebugMonitorVector [WEAK] - EXPORT Vector34 [WEAK] - EXPORT PendSVVector [WEAK] - EXPORT SysTickVector [WEAK] - EXPORT Vector40 [WEAK] - EXPORT Vector44 [WEAK] - EXPORT Vector48 [WEAK] - EXPORT Vector4C [WEAK] - EXPORT Vector50 [WEAK] - EXPORT Vector54 [WEAK] - EXPORT Vector58 [WEAK] - EXPORT Vector5C [WEAK] - EXPORT Vector60 [WEAK] - EXPORT Vector64 [WEAK] - EXPORT Vector68 [WEAK] - EXPORT Vector6C [WEAK] - EXPORT Vector70 [WEAK] - EXPORT Vector74 [WEAK] - EXPORT Vector78 [WEAK] - EXPORT Vector7C [WEAK] - EXPORT Vector80 [WEAK] - EXPORT Vector84 [WEAK] - EXPORT Vector88 [WEAK] - EXPORT Vector8C [WEAK] - EXPORT Vector90 [WEAK] - EXPORT Vector94 [WEAK] - EXPORT Vector98 [WEAK] - EXPORT Vector9C [WEAK] - EXPORT VectorA0 [WEAK] - EXPORT VectorA4 [WEAK] - EXPORT VectorA8 [WEAK] - EXPORT VectorAC [WEAK] - EXPORT VectorB0 [WEAK] - EXPORT VectorB4 [WEAK] - EXPORT VectorB8 [WEAK] - EXPORT VectorBC [WEAK] - EXPORT VectorC0 [WEAK] - EXPORT VectorC4 [WEAK] - EXPORT VectorC8 [WEAK] - EXPORT VectorCC [WEAK] - EXPORT VectorD0 [WEAK] - EXPORT VectorD4 [WEAK] - EXPORT VectorD8 [WEAK] - EXPORT VectorDC [WEAK] - EXPORT VectorE0 [WEAK] - EXPORT VectorE4 [WEAK] - EXPORT VectorE8 [WEAK] - EXPORT VectorEC [WEAK] - EXPORT VectorF0 [WEAK] - EXPORT VectorF4 [WEAK] - EXPORT VectorF8 [WEAK] - EXPORT VectorFC [WEAK] - EXPORT Vector100 [WEAK] - EXPORT Vector104 [WEAK] - EXPORT Vector108 [WEAK] - EXPORT Vector10C [WEAK] - EXPORT Vector110 [WEAK] - EXPORT Vector114 [WEAK] - EXPORT Vector118 [WEAK] - EXPORT Vector11C [WEAK] - EXPORT Vector120 [WEAK] - EXPORT Vector124 [WEAK] - EXPORT Vector128 [WEAK] - EXPORT Vector12C [WEAK] - EXPORT Vector130 [WEAK] - EXPORT Vector134 [WEAK] - EXPORT Vector138 [WEAK] - EXPORT Vector13C [WEAK] - EXPORT Vector140 [WEAK] - EXPORT Vector144 [WEAK] - EXPORT Vector148 [WEAK] - EXPORT Vector14C [WEAK] - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -VectorF4 -VectorF8 -VectorFC -Vector100 -Vector104 -Vector108 -Vector10C -Vector110 -Vector114 -Vector118 -Vector11C -Vector120 -Vector124 -Vector128 -Vector12C -Vector130 -Vector134 -Vector138 -Vector13C -Vector140 -Vector144 -Vector148 -Vector14C - b _unhandled_exception - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/STM32F4xx/cmparams.h b/os/ports/RVCT/ARMCMx/STM32F4xx/cmparams.h deleted file mode 100644 index 2543732acf..0000000000 --- a/os/ports/RVCT/ARMCMx/STM32F4xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/STM32F4xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32F4xx. - * - * @defgroup RVCT_ARMCMx_STM32F4xx STM32F4xx Specific Parameters - * @ingroup RVCT_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M4 specific parameters for the - * STM32F4xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M4 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU TRUE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/STM32F4xx/vectors.s b/os/ports/RVCT/ARMCMx/STM32F4xx/vectors.s deleted file mode 100644 index 39429a761e..0000000000 --- a/os/ports/RVCT/ARMCMx/STM32F4xx/vectors.s +++ /dev/null @@ -1,338 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#if !defined(STM32F4XX) -#define _FROM_ASM_ -#include "board.h" -#endif - - PRESERVE8 - - AREA RESET, DATA, READONLY - - IMPORT __initial_msp - IMPORT Reset_Handler - EXPORT __Vectors - -__Vectors - DCD __initial_msp - DCD Reset_Handler - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 - DCD VectorEC - DCD VectorF0 - DCD VectorF4 - DCD VectorF8 - DCD VectorFC - DCD Vector100 - DCD Vector104 - DCD Vector108 - DCD Vector10C - DCD Vector110 - DCD Vector114 - DCD Vector118 - DCD Vector11C - DCD Vector120 - DCD Vector124 - DCD Vector128 - DCD Vector12C - DCD Vector130 - DCD Vector134 - DCD Vector138 - DCD Vector13C - DCD Vector140 - DCD Vector144 - DCD Vector148 - DCD Vector14C - DCD Vector150 - DCD Vector154 - DCD Vector158 - DCD Vector15C - DCD Vector160 - DCD Vector164 - DCD Vector168 - DCD Vector16C - DCD Vector170 - DCD Vector174 - DCD Vector178 - DCD Vector17C - DCD Vector180 - DCD Vector184 - - AREA |.text|, CODE, READONLY - THUMB - -/* - * Default interrupt handlers. - */ - EXPORT _unhandled_exception -_unhandled_exception PROC - EXPORT NMIVector [WEAK] - EXPORT HardFaultVector [WEAK] - EXPORT MemManageVector [WEAK] - EXPORT BusFaultVector [WEAK] - EXPORT UsageFaultVector [WEAK] - EXPORT Vector1C [WEAK] - EXPORT Vector20 [WEAK] - EXPORT Vector24 [WEAK] - EXPORT Vector28 [WEAK] - EXPORT SVCallVector [WEAK] - EXPORT DebugMonitorVector [WEAK] - EXPORT Vector34 [WEAK] - EXPORT PendSVVector [WEAK] - EXPORT SysTickVector [WEAK] - EXPORT Vector40 [WEAK] - EXPORT Vector44 [WEAK] - EXPORT Vector48 [WEAK] - EXPORT Vector4C [WEAK] - EXPORT Vector50 [WEAK] - EXPORT Vector54 [WEAK] - EXPORT Vector58 [WEAK] - EXPORT Vector5C [WEAK] - EXPORT Vector60 [WEAK] - EXPORT Vector64 [WEAK] - EXPORT Vector68 [WEAK] - EXPORT Vector6C [WEAK] - EXPORT Vector70 [WEAK] - EXPORT Vector74 [WEAK] - EXPORT Vector78 [WEAK] - EXPORT Vector7C [WEAK] - EXPORT Vector80 [WEAK] - EXPORT Vector84 [WEAK] - EXPORT Vector88 [WEAK] - EXPORT Vector8C [WEAK] - EXPORT Vector90 [WEAK] - EXPORT Vector94 [WEAK] - EXPORT Vector98 [WEAK] - EXPORT Vector9C [WEAK] - EXPORT VectorA0 [WEAK] - EXPORT VectorA4 [WEAK] - EXPORT VectorA8 [WEAK] - EXPORT VectorAC [WEAK] - EXPORT VectorB0 [WEAK] - EXPORT VectorB4 [WEAK] - EXPORT VectorB8 [WEAK] - EXPORT VectorBC [WEAK] - EXPORT VectorC0 [WEAK] - EXPORT VectorC4 [WEAK] - EXPORT VectorC8 [WEAK] - EXPORT VectorCC [WEAK] - EXPORT VectorD0 [WEAK] - EXPORT VectorD4 [WEAK] - EXPORT VectorD8 [WEAK] - EXPORT VectorDC [WEAK] - EXPORT VectorE0 [WEAK] - EXPORT VectorE4 [WEAK] - EXPORT VectorE8 [WEAK] - EXPORT VectorEC [WEAK] - EXPORT VectorF0 [WEAK] - EXPORT VectorF4 [WEAK] - EXPORT VectorF8 [WEAK] - EXPORT VectorFC [WEAK] - EXPORT Vector100 [WEAK] - EXPORT Vector104 [WEAK] - EXPORT Vector108 [WEAK] - EXPORT Vector10C [WEAK] - EXPORT Vector110 [WEAK] - EXPORT Vector114 [WEAK] - EXPORT Vector118 [WEAK] - EXPORT Vector11C [WEAK] - EXPORT Vector120 [WEAK] - EXPORT Vector124 [WEAK] - EXPORT Vector128 [WEAK] - EXPORT Vector12C [WEAK] - EXPORT Vector130 [WEAK] - EXPORT Vector134 [WEAK] - EXPORT Vector138 [WEAK] - EXPORT Vector13C [WEAK] - EXPORT Vector140 [WEAK] - EXPORT Vector144 [WEAK] - EXPORT Vector148 [WEAK] - EXPORT Vector14C [WEAK] - EXPORT Vector150 [WEAK] - EXPORT Vector154 [WEAK] - EXPORT Vector158 [WEAK] - EXPORT Vector15C [WEAK] - EXPORT Vector160 [WEAK] - EXPORT Vector164 [WEAK] - EXPORT Vector168 [WEAK] - EXPORT Vector16C [WEAK] - EXPORT Vector170 [WEAK] - EXPORT Vector174 [WEAK] - EXPORT Vector178 [WEAK] - EXPORT Vector17C [WEAK] - EXPORT Vector180 [WEAK] - EXPORT Vector184 [WEAK] - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 -VectorF4 -VectorF8 -VectorFC -Vector100 -Vector104 -Vector108 -Vector10C -Vector110 -Vector114 -Vector118 -Vector11C -Vector120 -Vector124 -Vector128 -Vector12C -Vector130 -Vector134 -Vector138 -Vector13C -Vector140 -Vector144 -Vector148 -Vector14C -Vector150 -Vector154 -Vector158 -Vector15C -Vector160 -Vector164 -Vector168 -Vector16C -Vector170 -Vector174 -Vector178 -Vector17C -Vector180 -Vector184 - b _unhandled_exception - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/STM32L1xx/cmparams.h b/os/ports/RVCT/ARMCMx/STM32L1xx/cmparams.h deleted file mode 100644 index 07bc179ca9..0000000000 --- a/os/ports/RVCT/ARMCMx/STM32L1xx/cmparams.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/STM32L1xx/cmparams.h - * @brief ARM Cortex-M3 parameters for the STM32L1xx. - * - * @defgroup RVCT_ARMCMx_STM32L1xx STM32L1xx Specific Parameters - * @ingroup RVCT_ARMCMx_SPECIFIC - * @details This file contains the Cortex-M3 specific parameters for the - * STM32L1xx platform. - * @{ - */ - -#ifndef _CMPARAMS_H_ -#define _CMPARAMS_H_ - -/** - * @brief Cortex core model. - */ -#define CORTEX_MODEL CORTEX_M3 - -/** - * @brief Systick unit presence. - */ -#define CORTEX_HAS_ST TRUE - -/** - * @brief Memory Protection unit presence. - */ -#define CORTEX_HAS_MPU TRUE - -/** - * @brief Floating Point unit presence. - */ -#define CORTEX_HAS_FPU FALSE - -/** - * @brief Number of bits in priority masks. - */ -#define CORTEX_PRIORITY_BITS 4 - -#endif /* _CMPARAMS_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/STM32L1xx/vectors.s b/os/ports/RVCT/ARMCMx/STM32L1xx/vectors.s deleted file mode 100644 index ea061c6617..0000000000 --- a/os/ports/RVCT/ARMCMx/STM32L1xx/vectors.s +++ /dev/null @@ -1,227 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#if !defined(STM32L1XX_MD) -#define _FROM_ASM_ -#include "board.h" -#endif - - PRESERVE8 - - AREA RESET, DATA, READONLY - - IMPORT __initial_msp - IMPORT Reset_Handler - EXPORT __Vectors - -__Vectors - DCD __initial_msp - DCD Reset_Handler - DCD NMIVector - DCD HardFaultVector - DCD MemManageVector - DCD BusFaultVector - DCD UsageFaultVector - DCD Vector1C - DCD Vector20 - DCD Vector24 - DCD Vector28 - DCD SVCallVector - DCD DebugMonitorVector - DCD Vector34 - DCD PendSVVector - DCD SysTickVector - DCD Vector40 - DCD Vector44 - DCD Vector48 - DCD Vector4C - DCD Vector50 - DCD Vector54 - DCD Vector58 - DCD Vector5C - DCD Vector60 - DCD Vector64 - DCD Vector68 - DCD Vector6C - DCD Vector70 - DCD Vector74 - DCD Vector78 - DCD Vector7C - DCD Vector80 - DCD Vector84 - DCD Vector88 - DCD Vector8C - DCD Vector90 - DCD Vector94 - DCD Vector98 - DCD Vector9C - DCD VectorA0 - DCD VectorA4 - DCD VectorA8 - DCD VectorAC - DCD VectorB0 - DCD VectorB4 - DCD VectorB8 - DCD VectorBC - DCD VectorC0 - DCD VectorC4 - DCD VectorC8 - DCD VectorCC - DCD VectorD0 - DCD VectorD4 - DCD VectorD8 - DCD VectorDC - DCD VectorE0 - DCD VectorE4 - DCD VectorE8 - DCD VectorEC - DCD VectorF0 - - AREA |.text|, CODE, READONLY - THUMB - -/* - * Default interrupt handlers. - */ - EXPORT _unhandled_exception -_unhandled_exception PROC - EXPORT NMIVector [WEAK] - EXPORT HardFaultVector [WEAK] - EXPORT MemManageVector [WEAK] - EXPORT BusFaultVector [WEAK] - EXPORT UsageFaultVector [WEAK] - EXPORT Vector1C [WEAK] - EXPORT Vector20 [WEAK] - EXPORT Vector24 [WEAK] - EXPORT Vector28 [WEAK] - EXPORT SVCallVector [WEAK] - EXPORT DebugMonitorVector [WEAK] - EXPORT Vector34 [WEAK] - EXPORT PendSVVector [WEAK] - EXPORT SysTickVector [WEAK] - EXPORT Vector40 [WEAK] - EXPORT Vector44 [WEAK] - EXPORT Vector48 [WEAK] - EXPORT Vector4C [WEAK] - EXPORT Vector50 [WEAK] - EXPORT Vector54 [WEAK] - EXPORT Vector58 [WEAK] - EXPORT Vector5C [WEAK] - EXPORT Vector60 [WEAK] - EXPORT Vector64 [WEAK] - EXPORT Vector68 [WEAK] - EXPORT Vector6C [WEAK] - EXPORT Vector70 [WEAK] - EXPORT Vector74 [WEAK] - EXPORT Vector78 [WEAK] - EXPORT Vector7C [WEAK] - EXPORT Vector80 [WEAK] - EXPORT Vector84 [WEAK] - EXPORT Vector88 [WEAK] - EXPORT Vector8C [WEAK] - EXPORT Vector90 [WEAK] - EXPORT Vector94 [WEAK] - EXPORT Vector98 [WEAK] - EXPORT Vector9C [WEAK] - EXPORT VectorA0 [WEAK] - EXPORT VectorA4 [WEAK] - EXPORT VectorA8 [WEAK] - EXPORT VectorAC [WEAK] - EXPORT VectorB0 [WEAK] - EXPORT VectorB4 [WEAK] - EXPORT VectorB8 [WEAK] - EXPORT VectorBC [WEAK] - EXPORT VectorC0 [WEAK] - EXPORT VectorC4 [WEAK] - EXPORT VectorC8 [WEAK] - EXPORT VectorCC [WEAK] - EXPORT VectorD0 [WEAK] - EXPORT VectorD4 [WEAK] - EXPORT VectorD8 [WEAK] - EXPORT VectorDC [WEAK] - EXPORT VectorE0 [WEAK] - EXPORT VectorE4 [WEAK] - EXPORT VectorE8 [WEAK] - EXPORT VectorEC [WEAK] - EXPORT VectorF0 [WEAK] - -NMIVector -HardFaultVector -MemManageVector -BusFaultVector -UsageFaultVector -Vector1C -Vector20 -Vector24 -Vector28 -SVCallVector -DebugMonitorVector -Vector34 -PendSVVector -SysTickVector -Vector40 -Vector44 -Vector48 -Vector4C -Vector50 -Vector54 -Vector58 -Vector5C -Vector60 -Vector64 -Vector68 -Vector6C -Vector70 -Vector74 -Vector78 -Vector7C -Vector80 -Vector84 -Vector88 -Vector8C -Vector90 -Vector94 -Vector98 -Vector9C -VectorA0 -VectorA4 -VectorA8 -VectorAC -VectorB0 -VectorB4 -VectorB8 -VectorBC -VectorC0 -VectorC4 -VectorC8 -VectorCC -VectorD0 -VectorD4 -VectorD8 -VectorDC -VectorE0 -VectorE4 -VectorE8 -VectorEC -VectorF0 - b _unhandled_exception - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/chcore.c b/os/ports/RVCT/ARMCMx/chcore.c deleted file mode 100644 index eaf6100d86..0000000000 --- a/os/ports/RVCT/ARMCMx/chcore.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chcore.c - * @brief ARM Cortex-Mx port code. - * - * @addtogroup RVCT_ARMCMx_CORE - * @{ - */ - -#include "ch.h" - -/** - * @brief Halts the system. - * @note The function is declared as a weak symbol, it is possible - * to redefine it in your application code. - */ -#if !defined(__DOXYGEN__) -__attribute__((weak)) -#endif -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/chcore.h b/os/ports/RVCT/ARMCMx/chcore.h deleted file mode 100644 index ef3bc623c8..0000000000 --- a/os/ports/RVCT/ARMCMx/chcore.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chcore.h - * @brief ARM Cortex-Mx port macros and structures. - * - * @addtogroup RVCT_ARMCMx_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -/*===========================================================================*/ -/* Port constants (common). */ -/*===========================================================================*/ - -/* Added to make the header stand-alone when included from asm.*/ -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#define CORTEX_M0 0 /**< @brief Cortex-M0 variant. */ -#define CORTEX_M1 1 /**< @brief Cortex-M1 variant. */ -#define CORTEX_M3 3 /**< @brief Cortex-M3 variant. */ -#define CORTEX_M4 4 /**< @brief Cortex-M4 variant. */ - -/* Inclusion of the Cortex-Mx implementation specific parameters.*/ -#include "cmparams.h" - -/* Cortex model check, only M0 and M3 supported right now.*/ -#if (CORTEX_MODEL == CORTEX_M0) || (CORTEX_MODEL == CORTEX_M3) || \ - (CORTEX_MODEL == CORTEX_M4) -#elif (CORTEX_MODEL == CORTEX_M1) -#error "untested Cortex-M model" -#else -#error "unknown or unsupported Cortex-M model" -#endif - -/** - * @brief Total priority levels. - */ -#define CORTEX_PRIORITY_LEVELS (1 << CORTEX_PRIORITY_BITS) - -/** - * @brief Minimum priority level. - * @details This minimum priority level is calculated from the number of - * priority bits supported by the specific Cortex-Mx implementation. - */ -#define CORTEX_MINIMUM_PRIORITY (CORTEX_PRIORITY_LEVELS - 1) - -/** - * @brief Maximum priority level. - * @details The maximum allowed priority level is always zero. - */ -#define CORTEX_MAXIMUM_PRIORITY 0 - -/*===========================================================================*/ -/* Port macros (common). */ -/*===========================================================================*/ - -/** - * @brief Priority level verification macro. - */ -#define CORTEX_IS_VALID_PRIORITY(n) \ - (((n) >= 0) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level verification macro. - */ -#define CORTEX_IS_VALID_KERNEL_PRIORITY(n) \ - (((n) >= CORTEX_MAX_KERNEL_PRIORITY) && ((n) < CORTEX_PRIORITY_LEVELS)) - -/** - * @brief Priority level to priority mask conversion macro. - */ -#define CORTEX_PRIORITY_MASK(n) \ - ((n) << (8 - CORTEX_PRIORITY_BITS)) - -/*===========================================================================*/ -/* Port configurable parameters (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port derived parameters (common). */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port exported info (common). */ -/*===========================================================================*/ - -/** - * @brief Macro defining a generic ARM architecture. - */ -#define CH_ARCHITECTURE_ARM - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "RVCT" - -/*===========================================================================*/ -/* Port implementation part (common). */ -/*===========================================================================*/ - -/* Includes the sub-architecture-specific part.*/ -#if (CORTEX_MODEL == CORTEX_M0) || (CORTEX_MODEL == CORTEX_M1) -#include "chcore_v6m.h" -#elif (CORTEX_MODEL == CORTEX_M3) || (CORTEX_MODEL == CORTEX_M4) -#include "chcore_v7m.h" -#endif - -#if !defined(_FROM_ASM_) - -#include "nvic.h" - -/* The following declarations are there just for Doxygen documentation, the - real declarations are inside the sub-headers.*/ -#if defined(__DOXYGEN__) - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note It is implemented to match the Cortex-Mx exception context. - */ -struct extctx {}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching. - */ -struct intctx {}; - -#endif /* defined(__DOXYGEN__) */ - -/** - * @brief Excludes the default @p chSchIsPreemptionRequired()implementation. - */ -#define PORT_OPTIMIZED_ISPREEMPTIONREQUIRED - -#if (CH_TIME_QUANTUM > 0) || defined(__DOXYGEN__) -/** - * @brief Inline-able version of this kernel function. - */ -#define chSchIsPreemptionRequired() \ - (currp->p_preempt ? firstprio(&rlist.r_queue) > currp->p_prio : \ - firstprio(&rlist.r_queue) >= currp->p_prio) -#else /* CH_TIME_QUANTUM == 0 */ -#define chSchIsPreemptionRequired() \ - (firstprio(&rlist.r_queue) > currp->p_prio) -#endif /* CH_TIME_QUANTUM == 0 */ - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/chcore_v6m.c b/os/ports/RVCT/ARMCMx/chcore_v6m.c deleted file mode 100644 index d01dce56ba..0000000000 --- a/os/ports/RVCT/ARMCMx/chcore_v6m.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chcore_v6m.c - * @brief ARMv6-M architecture port code. - * - * @addtogroup RVCT_ARMCMx_V6M_CORE - * @{ - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Port interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief System Timer vector. - * @details This interrupt is used as system tick. - * @note The timer must be initialized in the startup code. - */ -CH_IRQ_HANDLER(SysTickVector) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -/** - * @brief NMI vector. - * @details The NMI vector is used for exception mode re-entering after a - * context switch. - */ -void NMIVector(void) { - register struct extctx *ctxp; - register uint32_t psp __asm("psp"); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp = (struct extctx *)psp; - ctxp++; - psp = (uint32_t)ctxp; - port_unlock_from_isr(); -} -#endif /* !CORTEX_ALTERNATE_SWITCH */ - -#if CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - */ -void PendSVVector(void) { - register struct extctx *ctxp; - register uint32_t psp __asm("psp"); - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp = (struct extctx *)psp; - ctxp++; - psp = (uint32_t)ctxp; -} -#endif /* CORTEX_ALTERNATE_SWITCH */ - -/*===========================================================================*/ -/* Port exported functions. */ -/*===========================================================================*/ - -/** - * @brief IRQ epilogue code. - * - * @param[in] lr value of the @p LR register on ISR entry - */ -void _port_irq_epilogue(regarm_t lr) { - - if (lr != (regarm_t)0xFFFFFFF1) { - register struct extctx *ctxp; - register uint32_t psp __asm("psp"); - - port_lock_from_isr(); - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp = (struct extctx *)psp; - ctxp--; - psp = (uint32_t)ctxp; - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsPreemptionRequired()) { - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (regarm_t)_port_switch_from_isr; - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (regarm_t)_port_exit_from_isr; - } - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - } -} - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/chcore_v6m.h b/os/ports/RVCT/ARMCMx/chcore_v6m.h deleted file mode 100644 index 685eddaef0..0000000000 --- a/os/ports/RVCT/ARMCMx/chcore_v6m.h +++ /dev/null @@ -1,380 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chcore_v6m.h - * @brief ARMv6-M architecture port macros and structures. - * - * @addtogroup RVCT_ARMCMx_V6M_CORE - * @{ - */ - -#ifndef _CHCORE_V6M_H_ -#define _CHCORE_V6M_H_ - -/*===========================================================================*/ -/* Port constants. */ -/*===========================================================================*/ - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p 0, - * this handler always has the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV 0 - -/*===========================================================================*/ -/* Port macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief SYSTICK handler priority. - * @note The default SYSTICK handler priority is calculated as the priority - * level in the middle of the numeric priorities range. - */ -#if !defined(CORTEX_PRIORITY_SYSTICK) -#define CORTEX_PRIORITY_SYSTICK (CORTEX_PRIORITY_LEVELS >> 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SYSTICK) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SYSTICK" -#endif - -/** - * @brief Alternate preemption method. - * @details Activating this option will make the Kernel use the PendSV - * handler for preemption instead of the NMI handler. - */ -#ifndef CORTEX_ALTERNATE_SWITCH -#define CORTEX_ALTERNATE_SWITCH FALSE -#endif - -/*===========================================================================*/ -/* Port derived parameters. */ -/*===========================================================================*/ - -/** - * @brief Maximum usable priority for normal ISRs. - */ -#if CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#else -#define CORTEX_MAX_KERNEL_PRIORITY 0 -#endif - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -/** - * @brief Macro defining the specific ARM architecture. - */ -#define CH_ARCHITECTURE_ARM_v6M - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "ARMv6-M" - -/** - * @brief Name of the architecture variant. - */ -#if (CORTEX_MODEL == CORTEX_M0) || defined(__DOXYGEN__) -#define CH_CORE_VARIANT_NAME "Cortex-M0" -#elif (CORTEX_MODEL == CORTEX_M1) -#define CH_CORE_VARIANT_NAME "Cortex-M1" -#endif - -/** - * @brief Port-specific information string. - */ -#if !CORTEX_ALTERNATE_SWITCH || defined(__DOXYGEN__) -#define CH_PORT_INFO "Preemption through NMI" -#else -#define CH_PORT_INFO "Preemption through PendSV" -#endif - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Generic ARM register. - */ -typedef void *regarm_t; - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - - /* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) - -struct extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -}; - -struct intctx { - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t lr; -}; - -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In this port the structure just holds a pointer to the @p intctx - * structure representing the stack pointer at context switch time. - */ -struct context { - struct intctx *r13; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.r13->r4 = (regarm_t)pf; \ - tp->p_ctx.r13->r5 = (regarm_t)arg; \ - tp->p_ctx.r13->lr = (regarm_t)_port_thread_start; \ -} - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() regarm_t _saved_lr = (regarm_t)__return_address() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue(_saved_lr) - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Port-related initialization code. - */ -#define port_init() { \ - SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(0); \ - nvicSetSystemHandlerPriority(HANDLER_PENDSV, \ - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); \ - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, \ - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); \ -} - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform - * more actions. - */ -#define port_lock() __disable_irq() - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform - * more actions. - */ -#define port_unlock() __enable_irq() - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_lock_from_isr() port_lock() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_unlock_from_isr() port_unlock() - -/** - * @brief Disables all the interrupt sources. - */ -#define port_disable() __disable_irq() - -/** - * @brief Disables the interrupt sources below kernel-level priority. - */ -#define port_suspend() __disable_irq() - -/** - * @brief Enables all the interrupt sources. - */ -#define port_enable() __enable_irq() - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() __wfi() -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - uint8_t *r13 = (uint8_t *)__current_sp(); \ - if ((stkalign_t *)(r13 - sizeof(struct intctx)) < otp->p_stklimit) \ - chDbgPanic("stack overflow"); \ - _port_switch(ntp, otp); \ -} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_halt(void); - void _port_irq_epilogue(regarm_t lr); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V6M_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/chcore_v7m.c b/os/ports/RVCT/ARMCMx/chcore_v7m.c deleted file mode 100644 index f7d4afb9d6..0000000000 --- a/os/ports/RVCT/ARMCMx/chcore_v7m.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chcore_v7m.c - * @brief ARMv7-M architecture port code. - * - * @addtogroup RVCT_ARMCMx_V7M_CORE - * @{ - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Port interrupt handlers. */ -/*===========================================================================*/ - -/** - * @brief System Timer vector. - * @details This interrupt is used as system tick. - * @note The timer must be initialized in the startup code. - */ -CH_IRQ_HANDLER(SysTickVector) { - - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - chSysTimerHandlerI(); - chSysUnlockFromIsr(); - - CH_IRQ_EPILOGUE(); -} - -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief SVC vector. - * @details The SVC vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in advanced kernel mode. - */ -void SVCallVector(void) { - struct extctx *ctxp; - register uint32_t psp __asm("psp"); - - /* Current PSP value.*/ - ctxp = (struct extctx *)psp; - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - -#if CORTEX_USE_FPU - /* Restoring the special register SCB_FPCCR.*/ - SCB_FPCCR = (uint32_t)ctxp->fpccr; - SCB_FPCAR = SCB_FPCAR + sizeof (struct extctx); -#endif - psp = (uint32_t)ctxp; - port_unlock_from_isr(); -} -#endif /* !CORTEX_SIMPLIFIED_PRIORITY */ - -#if CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief PendSV vector. - * @details The PendSV vector is used for exception mode re-entering after a - * context switch. - * @note The PendSV vector is only used in compact kernel mode. - */ -void PendSVVector(void) { - struct extctx *ctxp; - register uint32_t psp __asm("psp"); - - /* Current PSP value.*/ - ctxp = (struct extctx *)psp; - - /* Discarding the current exception context and positioning the stack to - point to the real one.*/ - ctxp++; - -#if CORTEX_USE_FPU - /* Restoring the special register SCB_FPCCR.*/ - SCB_FPCCR = (uint32_t)ctxp->fpccr; - SCB_FPCAR = SCB_FPCAR + sizeof (struct extctx); -#endif - psp = (uint32_t)ctxp; -} -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/*===========================================================================*/ -/* Port exported functions. */ -/*===========================================================================*/ - -/** - * @brief Port-related initialization code. - */ -void _port_init(void) { - - /* Initialization of the vector table and priority related settings.*/ - SCB_VTOR = CORTEX_VTOR_INIT; - SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(CORTEX_PRIGROUP_INIT); - -#if CORTEX_USE_FPU - { - register uint32_t control __asm("control"); - register uint32_t fpscr __asm("fpscr"); - - /* Initializing the FPU context save in lazy mode.*/ - SCB_FPCCR = FPCCR_ASPEN | FPCCR_LSPEN; - - /* CP10 and CP11 set to full access in the startup code.*/ -/* SCB_CPACR |= 0x00F00000;*/ - - /* Enables FPU context save/restore on exception entry/exit (FPCA bit).*/ - control |= 4; - - /* FPSCR and FPDSCR initially zero.*/ - fpscr = 0; - SCB_FPDSCR = 0; - } -#endif - - /* Initialization of the system vectors used by the port.*/ - nvicSetSystemHandlerPriority(HANDLER_SVCALL, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SVCALL)); - nvicSetSystemHandlerPriority(HANDLER_PENDSV, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); - nvicSetSystemHandlerPriority(HANDLER_SYSTICK, - CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); -} - -/** - * @brief Exception exit redirection to _port_switch_from_isr(). - */ -void _port_irq_epilogue(void) { - - port_lock_from_isr(); - if ((SCB_ICSR & ICSR_RETTOBASE) != 0) { - struct extctx *ctxp; - register uint32_t psp __asm("psp"); - - /* Current PSP value.*/ - ctxp = (struct extctx *)psp; - - /* Adding an artificial exception return context, there is no need to - populate it fully.*/ - ctxp--; - psp = (uint32_t)ctxp; - ctxp->xpsr = (regarm_t)0x01000000; - - /* The exit sequence is different depending on if a preemption is - required or not.*/ - if (chSchIsPreemptionRequired()) { -#if CORTEX_USE_FPU - /* Triggering a lazy FPU state save.*/ - register uint32_t fpscr __asm("fpscr"); - ctxp->r0 = (regarm_t)fpscr; -#endif - /* Preemption is required we need to enforce a context switch.*/ - ctxp->pc = (regarm_t)_port_switch_from_isr; - } - else { - /* Preemption not required, we just need to exit the exception - atomically.*/ - ctxp->pc = (regarm_t)_port_exit_from_isr; - } - -#if CORTEX_USE_FPU - { - uint32_t fpccr; - - /* Saving the special register SCB_FPCCR into the reserved offset of - the Cortex-M4 exception frame.*/ - (ctxp + 1)->fpccr = (regarm_t)(fpccr = SCB_FPCCR); - - /* Now the FPCCR is modified in order to not restore the FPU status - from the artificial return context.*/ - SCB_FPCCR = fpccr | FPCCR_LSPACT; - } -#endif - - /* Note, returning without unlocking is intentional, this is done in - order to keep the rest of the context switch atomic.*/ - return; - } - port_unlock_from_isr(); -} - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/chcore_v7m.h b/os/ports/RVCT/ARMCMx/chcore_v7m.h deleted file mode 100644 index 8ff4f630f8..0000000000 --- a/os/ports/RVCT/ARMCMx/chcore_v7m.h +++ /dev/null @@ -1,512 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chcore_v7m.h - * @brief ARMv7-M architecture port macros and structures. - * - * @addtogroup RVCT_ARMCMx_V7M_CORE - * @{ - */ - -#ifndef _CHCORE_V7M_H_ -#define _CHCORE_V7M_H_ - -/*===========================================================================*/ -/* Port constants. */ -/*===========================================================================*/ - -/** - * @brief Disabled value for BASEPRI register. - */ -#define CORTEX_BASEPRI_DISABLED 0 - -/*===========================================================================*/ -/* Port macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - * @note In this port it is set to 16 because the idle thread does have - * a stack frame when compiling without optimizations. You may - * reduce this value to zero when compiling with optimizations. - */ -#if !defined(PORT_IDLE_THREAD_STACK_SIZE) -#define PORT_IDLE_THREAD_STACK_SIZE 16 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This constant is used in the calculation of the correct working - * area size. - * @note In this port this value is conservatively set to 32 because the - * function @p chSchDoReschedule() can have a stack frame, especially - * with compiler optimizations disabled. The value can be reduced - * when compiler optimizations are enabled. - */ -#if !defined(PORT_INT_REQUIRED_STACK) -#define PORT_INT_REQUIRED_STACK 32 -#endif - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#if !defined(CORTEX_ENABLE_WFI_IDLE) -#define CORTEX_ENABLE_WFI_IDLE FALSE -#endif - -/** - * @brief SYSTICK handler priority. - * @note The default SYSTICK handler priority is calculated as the priority - * level in the middle of the numeric priorities range. - */ -#if !defined(CORTEX_PRIORITY_SYSTICK) -#define CORTEX_PRIORITY_SYSTICK (CORTEX_PRIORITY_LEVELS >> 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SYSTICK) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SYSTICK" -#endif - -/** - * @brief FPU support in context switch. - * @details Activating this option activates the FPU support in the kernel. - */ -#if !defined(CORTEX_USE_FPU) -#define CORTEX_USE_FPU CORTEX_HAS_FPU -#elif CORTEX_USE_FPU && !CORTEX_HAS_FPU -/* This setting requires an FPU presence check in case it is externally - redefined.*/ -#error "the selected core does not have an FPU" -#endif - -/** - * @brief Simplified priority handling flag. - * @details Activating this option makes the Kernel work in compact mode. - */ -#if !defined(CORTEX_SIMPLIFIED_PRIORITY) -#define CORTEX_SIMPLIFIED_PRIORITY FALSE -#endif - -/** - * @brief SVCALL handler priority. - * @note The default SVCALL handler priority is defaulted to - * @p CORTEX_MAXIMUM_PRIORITY+1, this reserves the - * @p CORTEX_MAXIMUM_PRIORITY priority level as fast interrupts - * priority level. - */ -#if !defined(CORTEX_PRIORITY_SVCALL) -#define CORTEX_PRIORITY_SVCALL (CORTEX_MAXIMUM_PRIORITY + 1) -#elif !CORTEX_IS_VALID_PRIORITY(CORTEX_PRIORITY_SVCALL) -/* If it is externally redefined then better perform a validity check on it.*/ -#error "invalid priority level specified for CORTEX_PRIORITY_SVCALL" -#endif - -/** - * @brief NVIC VTOR initialization expression. - */ -#if !defined(CORTEX_VTOR_INIT) || defined(__DOXYGEN__) -#define CORTEX_VTOR_INIT 0x00000000 -#endif - -/** - * @brief NVIC PRIGROUP initialization expression. - * @details The default assigns all available priority bits as preemption - * priority with no sub-priority. - */ -#if !defined(CORTEX_PRIGROUP_INIT) || defined(__DOXYGEN__) -#define CORTEX_PRIGROUP_INIT (7 - CORTEX_PRIORITY_BITS) -#endif - -/*===========================================================================*/ -/* Port derived parameters. */ -/*===========================================================================*/ - -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -/** - * @brief Maximum usable priority for normal ISRs. - */ -#define CORTEX_MAX_KERNEL_PRIORITY (CORTEX_PRIORITY_SVCALL + 1) - -/** - * @brief BASEPRI level within kernel lock. - * @note In compact kernel mode this constant value is enforced to zero. - */ -#define CORTEX_BASEPRI_KERNEL \ - CORTEX_PRIORITY_MASK(CORTEX_MAX_KERNEL_PRIORITY) -#else - -#define CORTEX_MAX_KERNEL_PRIORITY 1 -#define CORTEX_BASEPRI_KERNEL 0 -#endif - -/** - * @brief PendSV priority level. - * @note This priority is enforced to be equal to @p CORTEX_BASEPRI_KERNEL, - * this handler always have the highest priority that cannot preempt - * the kernel. - */ -#define CORTEX_PRIORITY_PENDSV CORTEX_BASEPRI_KERNEL - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -#if (CORTEX_MODEL == CORTEX_M3) || defined(__DOXYGEN__) -/** - * @brief Macro defining the specific ARM architecture. - */ -#define CH_ARCHITECTURE_ARM_v7M - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "ARMv7-M" - -/** - * @brief Name of the architecture variant. - */ -#define CH_CORE_VARIANT_NAME "Cortex-M3" - -#elif (CORTEX_MODEL == CORTEX_M4) -#define CH_ARCHITECTURE_ARM_v7ME -#define CH_ARCHITECTURE_NAME "ARMv7-ME" -#if CORTEX_USE_FPU -#define CH_CORE_VARIANT_NAME "Cortex-M4F" -#else -#define CH_CORE_VARIANT_NAME "Cortex-M4" -#endif -#endif - -/** - * @brief Port-specific information string. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define CH_PORT_INFO "Advanced kernel mode" -#else -#define CH_PORT_INFO "Compact kernel mode" -#endif - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -#if !defined(_FROM_ASM_) - -/** - * @brief Generic ARM register. - */ -typedef void *regarm_t; - -/** - * @brief Stack and memory alignment enforcement. - * @note In this architecture the stack alignment is enforced to 64 bits, - * 32 bits alignment is supported by hardware but deprecated by ARM, - * the implementation choice is to not offer the option. - */ -typedef uint64_t stkalign_t; - -/* The documentation of the following declarations is in chconf.h in order - to not have duplicated structure names into the documentation.*/ -#if !defined(__DOXYGEN__) - -struct extctx { - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_thd; - regarm_t pc; - regarm_t xpsr; -#if CORTEX_USE_FPU - regarm_t s0; - regarm_t s1; - regarm_t s2; - regarm_t s3; - regarm_t s4; - regarm_t s5; - regarm_t s6; - regarm_t s7; - regarm_t s8; - regarm_t s9; - regarm_t s10; - regarm_t s11; - regarm_t s12; - regarm_t s13; - regarm_t s14; - regarm_t s15; - regarm_t fpscr; - regarm_t fpccr; -#endif /* CORTEX_USE_FPU */ -}; - -struct intctx { -#if CORTEX_USE_FPU - regarm_t s16; - regarm_t s17; - regarm_t s18; - regarm_t s19; - regarm_t s20; - regarm_t s21; - regarm_t s22; - regarm_t s23; - regarm_t s24; - regarm_t s25; - regarm_t s26; - regarm_t s27; - regarm_t s28; - regarm_t s29; - regarm_t s30; - regarm_t s31; -#endif /* CORTEX_USE_FPU */ - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t lr; -}; - -#endif /* !defined(__DOXYGEN__) */ - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details In this port the structure just holds a pointer to the @p intctx - * structure representing the stack pointer at context switch time. - */ -struct context { - struct intctx *r13; -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \ - wsize - \ - sizeof(struct intctx)); \ - tp->p_ctx.r13->r4 = (regarm_t)pf; \ - tp->p_ctx.r13->r5 = (regarm_t)arg; \ - tp->p_ctx.r13->lr = (regarm_t)_port_thread_start; \ -} - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - sizeof(struct intctx) + \ - sizeof(struct extctx) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() _port_irq_epilogue() - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) void id(void) - -/** - * @brief Fast IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_FAST_IRQ_HANDLER(id) void id(void) - -/** - * @brief Port-related initialization code. - */ -#define port_init() _port_init() - -/** - * @brief Kernel-lock action. - * @details Usually this function just disables interrupts but may perform - * more actions. - * @note In this port this it raises the base priority to kernel level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_lock() { \ - register uint32_t basepri __asm("basepri"); \ - basepri = CORTEX_BASEPRI_KERNEL; \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_lock() __disable_irq() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Kernel-unlock action. - * @details Usually this function just enables interrupts but may perform - * more actions. - * @note In this port this it lowers the base priority to user level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_unlock() { \ - register uint32_t basepri __asm("basepri"); \ - basepri = CORTEX_BASEPRI_DISABLED; \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_unlock() __enable_irq() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Kernel-lock action from an interrupt handler. - * @details This function is invoked before invoking I-class APIs from - * interrupt handlers. The implementation is architecture dependent, - * in its simplest form it is void. - * @note Same as @p port_lock() in this port. - */ -#define port_lock_from_isr() port_lock() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @details This function is invoked after invoking I-class APIs from interrupt - * handlers. The implementation is architecture dependent, in its - * simplest form it is void. - * @note Same as @p port_unlock() in this port. - */ -#define port_unlock_from_isr() port_unlock() - -/** - * @brief Disables all the interrupt sources. - * @note Of course non-maskable interrupt sources are not included. - * @note In this port it disables all the interrupt sources by raising - * the priority mask to level 0. - */ -#define port_disable() __disable_irq() - -/** - * @brief Disables the interrupt sources below kernel-level priority. - * @note Interrupt sources above kernel level remains enabled. - * @note In this port it raises/lowers the base priority to kernel level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_suspend() { \ - register uint32_t basepri __asm("basepri"); \ - basepri = CORTEX_BASEPRI_KERNEL; \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_suspend() __disable_irq() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Enables all the interrupt sources. - * @note In this port it lowers the base priority to user level. - */ -#if !CORTEX_SIMPLIFIED_PRIORITY || defined(__DOXYGEN__) -#define port_enable() { \ - register uint32_t basepri __asm("basepri"); \ - basepri = CORTEX_BASEPRI_DISABLED; \ - __enable_irq(); \ -} -#else /* CORTEX_SIMPLIFIED_PRIORITY */ -#define port_enable() __enable_irq() -#endif /* CORTEX_SIMPLIFIED_PRIORITY */ - -/** - * @brief Enters an architecture-dependent IRQ-waiting mode. - * @details The function is meant to return when an interrupt becomes pending. - * The simplest implementation is an empty function or macro but this - * would not take advantage of architecture-specific power saving - * modes. - * @note Implemented as an inlined @p WFI instruction. - */ -#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() __wfi() -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. - * - * @param[in] ntp the thread to be switched in - * @param[in] otp the thread to be switched out - */ -#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__) -#define port_switch(ntp, otp) _port_switch(ntp, otp) -#else -#define port_switch(ntp, otp) { \ - uint8_t *r13 = (uint8_t *)__current_sp(); \ - if ((stkalign_t *)(r13 - sizeof(struct intctx)) < otp->p_stklimit) \ - chDbgPanic("stack overflow"); \ - _port_switch(ntp, otp); \ -} -#endif - -#ifdef __cplusplus -extern "C" { -#endif - void port_halt(void); - void _port_init(void); - void _port_irq_epilogue(void); - void _port_switch_from_isr(void); - void _port_exit_from_isr(void); - void _port_switch(Thread *ntp, Thread *otp); - void _port_thread_start(void); -#ifdef __cplusplus -} -#endif - -#endif /* _FROM_ASM_ */ - -#endif /* _CHCORE_V7M_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/chcoreasm_v6m.s b/os/ports/RVCT/ARMCMx/chcoreasm_v6m.s deleted file mode 100644 index 0c6e33260e..0000000000 --- a/os/ports/RVCT/ARMCMx/chcoreasm_v6m.s +++ /dev/null @@ -1,108 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * Imports the Cortex-Mx configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -CONTEXT_OFFSET EQU 12 -SCB_ICSR EQU 0xE000ED04 - - PRESERVE8 - THUMB - AREA |.text|, CODE, READONLY - - IMPORT chThdExit - IMPORT chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - IMPORT dbg_check_unlock - IMPORT dbg_check_lock -#endif - -/* - * Performs a context switch between two threads. - */ - EXPORT _port_switch -_port_switch PROC - push {r4, r5, r6, r7, lr} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4, r5, r6, r7} - mov r3, sp - str r3, [r1, #CONTEXT_OFFSET] - ldr r3, [r0, #CONTEXT_OFFSET] - mov sp, r3 - pop {r4, r5, r6, r7} - mov r8, r4 - mov r9, r5 - mov r10, r6 - mov r11, r7 - pop {r4, r5, r6, r7, pc} - ENDP - -/* - * Start a thread by invoking its work function. - * If the work function returns @p chThdExit() is automatically invoked. - */ - EXPORT _port_thread_start -_port_thread_start PROC -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif - cpsie i - mov r0, r5 - blx r4 - bl chThdExit - ENDP - -/* - * Post-IRQ switch code. - * Exception handlers return here for context switching. - */ - EXPORT _port_switch_from_isr - EXPORT _port_exit_from_isr -_port_switch_from_isr PROC -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -_port_exit_from_isr - ldr r2, =SCB_ICSR - movs r3, #128 -#if CORTEX_ALTERNATE_SWITCH - lsls r3, r3, #21 - str r3, [r2, #0] - cpsie i -#else - lsls r3, r3, #24 - str r3, [r2, #0] -#endif -waithere b waithere - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/chcoreasm_v7m.s b/os/ports/RVCT/ARMCMx/chcoreasm_v7m.s deleted file mode 100644 index 98c96bd50b..0000000000 --- a/os/ports/RVCT/ARMCMx/chcoreasm_v7m.s +++ /dev/null @@ -1,107 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * Imports the Cortex-Mx configuration headers. - */ -#define _FROM_ASM_ -#include "chconf.h" -#include "chcore.h" - -CONTEXT_OFFSET EQU 12 -SCB_ICSR EQU 0xE000ED04 -ICSR_PENDSVSET EQU 0x10000000 - - PRESERVE8 - THUMB - AREA |.text|, CODE, READONLY - - IMPORT chThdExit - IMPORT chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - IMPORT dbg_check_unlock - IMPORT dbg_check_lock -#endif - -/* - * Performs a context switch between two threads. - */ - EXPORT _port_switch -_port_switch PROC - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} -#if CORTEX_USE_FPU - vpush {s16-s31} -#endif - str sp, [r1, #CONTEXT_OFFSET] - ldr sp, [r0, #CONTEXT_OFFSET] -#if CORTEX_USE_FPU - vpop {s16-s31} -#endif - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - ENDP - -/* - * Start a thread by invoking its work function. - * If the work function returns @p chThdExit() is automatically invoked. - */ - EXPORT _port_thread_start -_port_thread_start PROC -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -#if CORTEX_SIMPLIFIED_PRIORITY - cpsie i -#else - movs r3, #CORTEX_BASEPRI_DISABLED - msr BASEPRI, r3 -#endif - mov r0, r5 - blx r4 - bl chThdExit - ENDP - -/* - * Post-IRQ switch code. - * Exception handlers return here for context switching. - */ - EXPORT _port_switch_from_isr - EXPORT _port_exit_from_isr -_port_switch_from_isr PROC -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_lock -#endif - bl chSchDoReschedule -#if CH_DBG_SYSTEM_STATE_CHECK - bl dbg_check_unlock -#endif -_port_exit_from_isr -#if CORTEX_SIMPLIFIED_PRIORITY - mov r3, #SCB_ICSR :AND: 0xFFFF - movt r3, #SCB_ICSR :SHR: 16 - mov r2, #ICSR_PENDSVSET - str r2, [r3, #0] - cpsie i -waithere b waithere -#else - svc #0 -#endif - ENDP - - END diff --git a/os/ports/RVCT/ARMCMx/chtypes.h b/os/ports/RVCT/ARMCMx/chtypes.h deleted file mode 100644 index c0c65fa09c..0000000000 --- a/os/ports/RVCT/ARMCMx/chtypes.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file RVCT/ARMCMx/chtypes.h - * @brief ARM Cortex-Mx port system types. - * - * @addtogroup RVCT_ARMCMx_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#define __need_ptrdiff_t -#include - -#include - -typedef int32_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint32_t tprio_t; /**< Thread priority. */ -typedef int32_t msg_t; /**< Inter-thread message. */ -typedef int32_t eventid_t; /**< Event Id. */ -typedef uint32_t eventmask_t; /**< Event mask. */ -typedef uint32_t flagsmask_t; /**< Event flags. */ -typedef uint32_t systime_t; /**< System time. */ -typedef int32_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE __inline - -/** - * @brief ROM constant modifier. - * @note It is set to use the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note Empty in this port. - */ -#define PACK_STRUCT_STRUCT - -/** - * @brief Packed structure modifier (before). - */ -#define PACK_STRUCT_BEGIN __packed - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/RVCT/ARMCMx/cstartup.s b/os/ports/RVCT/ARMCMx/cstartup.s deleted file mode 100644 index f0160c88d8..0000000000 --- a/os/ports/RVCT/ARMCMx/cstartup.s +++ /dev/null @@ -1,121 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -;/* <<< Use Configuration Wizard in Context Menu >>> */ - -;// Main Stack Configuration (IRQ Stack) -;// Main Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -;// -main_stack_size EQU 0x00000400 - -;// Process Stack Configuration -;// Process Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -;// -proc_stack_size EQU 0x00000400 - -;// C-runtime heap size -;// C-runtime heap size (in Bytes) <0x0-0xFFFFFFFF:8> -;// -heap_size EQU 0x00000400 - - AREA MSTACK, NOINIT, READWRITE, ALIGN=3 -main_stack_mem SPACE main_stack_size - EXPORT __initial_msp -__initial_msp - - AREA CSTACK, NOINIT, READWRITE, ALIGN=3 -__main_thread_stack_base__ - EXPORT __main_thread_stack_base__ -proc_stack_mem SPACE proc_stack_size - EXPORT __initial_sp -__initial_sp - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE heap_size -__heap_limit - -CONTROL_MODE_PRIVILEGED EQU 0 -CONTROL_MODE_UNPRIVILEGED EQU 1 -CONTROL_USE_MSP EQU 0 -CONTROL_USE_PSP EQU 2 - - PRESERVE8 - THUMB - - AREA |.text|, CODE, READONLY - -/* - * Reset handler. - */ - IMPORT __main - EXPORT Reset_Handler -Reset_Handler PROC - cpsid i - ldr r0, =__initial_sp - msr PSP, r0 - movs r0, #CONTROL_MODE_PRIVILEGED :OR: CONTROL_USE_PSP - msr CONTROL, r0 - isb - bl __early_init - - IF {CPU} = "Cortex-M4.fp" - LDR R0, =0xE000ED88 ; Enable CP10,CP11 - LDR R1, [R0] - ORR R1, R1, #(0xF << 20) - STR R1, [R0] - ENDIF - - ldr r0, =__main - bx r0 - ENDP - -__early_init PROC - EXPORT __early_init [WEAK] - bx lr - ENDP - - ALIGN - -/* - * User Initial Stack & Heap. - */ - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap -__user_initial_stackheap - ldr r0, =Heap_Mem - ldr r1, =(proc_stack_mem + proc_stack_size) - ldr r2, =(Heap_Mem + heap_size) - ldr r3, =proc_stack_mem - bx lr - - ALIGN - - ENDIF - - END diff --git a/os/ports/RVCT/ARMCMx/port.dox b/os/ports/RVCT/ARMCMx/port.dox deleted file mode 100644 index c02fdc25bc..0000000000 --- a/os/ports/RVCT/ARMCMx/port.dox +++ /dev/null @@ -1,233 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup RVCT_ARMCMx ARM Cortex-Mx - * @details ARM Cortex-Mx port for the RVCT compiler. - - * @section RVCT_ARMCMx_INTRO Introduction - * This port supports all the cores implementing the ARMv6-M and ARMv7-M - * architectures. - * - * @section RVCT_ARMCMx_MODES Kernel Modes - * The Cortex-Mx port supports two distinct kernel modes: - * - Advanced Kernel mode. In this mode the kernel only masks - * interrupt sources with priorities below or equal to the - * @p CORTEX_BASEPRI_KERNEL level. Higher priorities are not affected by - * the kernel critical sections and can be used for fast interrupts. - * This mode is not available in the ARMv6-M architecture which does not - * support priority masking. - * - Compact Kernel mode. In this mode the kernel handles IRQ priorities - * in a simplified way, all interrupt sources are disabled when the kernel - * enters into a critical zone and re-enabled on exit. This is simple and - * adequate for most applications, this mode results in a more compact and - * faster kernel. - * . - * The selection of the mode is performed using the port configuration option - * @p CORTEX_SIMPLIFIED_PRIORITY. Apart from the different handling of - * interrupts there are no other differences between the two modes. The - * kernel API is exactly the same. - * - * @section RVCT_ARMCMx_STATES_A System logical states in Compact Kernel mode - * The ChibiOS/RT logical @ref system_states are mapped as follow in Compact - * Kernel mode: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). In this state interrupts are enabled. The processor - * is running in thread-privileged mode. - * - Suspended. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. In this - * mode this state is not different from the Disabled state. - * - Disabled. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. In this - * mode this state is not different from the Suspended state. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wfi. - * - S-Locked. In this state the interrupt sources are globally - * disabled. The processor is running in thread-privileged mode. - * - I-Locked. In this state the interrupt sources are globally - * disabled. The processor is running in exception-privileged mode. - * - Serving Regular Interrupt. In this state the interrupt sources are - * not globally masked but only interrupts with higher priority can preempt - * the current handler. The processor is running in exception-privileged - * mode. - * - Serving Fast Interrupt. Not implemented in compact kernel mode. - * - Serving Non-Maskable Interrupt. The Cortex-Mx has a specific - * asynchronous NMI vector and several synchronous fault vectors that can - * be considered belonging to this category. - * - Halted. Implemented as an infinite loop after globally masking all - * the maskable interrupt sources. The ARM state is whatever the processor - * was running when @p chSysHalt() was invoked. - * - * @section RVCT_ARMCMx_STATES_B System logical states in Advanced Kernel mode - * The ChibiOS/RT logical @ref system_states are mapped as follow in the - * Advanced Kernel mode: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). In this state the ARM Cortex-Mx has the BASEPRI register - * set at @p CORTEX_BASEPRI_USER level, interrupts are not masked. The - * processor is running in thread-privileged mode. - * - Suspended. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in thread-privileged mode. - * - Disabled. Interrupt sources are globally masked. The processor - * is running in thread-privileged mode. - * - Sleep. This state is entered with the execution of the specific - * instruction @p wfi. - * - S-Locked. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in thread-privileged mode. - * - I-Locked. In this state the interrupt sources are not globally - * masked but the BASEPRI register is set to @p CORTEX_BASEPRI_KERNEL thus - * masking any interrupt source with lower or equal priority. The processor - * is running in exception-privileged mode. - * - Serving Regular Interrupt. In this state the interrupt sources are - * not globally masked but only interrupts with higher priority can preempt - * the current handler. The processor is running in exception-privileged - * mode. - * - Serving Fast Interrupt. Fast interrupts are defined as interrupt - * sources having higher priority level than the kernel - * (@p CORTEX_BASEPRI_KERNEL). In this state is not possible to switch to - * the I-Locked state because fast interrupts can preempt the kernel - * critical zone.
    - * This state is not implemented in the ARMv6-M implementation because - * priority masking is not present in this architecture. - * - Serving Non-Maskable Interrupt. The Cortex-Mx has a specific - * asynchronous NMI vector and several synchronous fault vectors that can - * be considered belonging to this category. - * - Halted. Implemented as an infinite loop after globally masking all - * the maskable interrupt sources. The ARM state is whatever the processor - * was running when @p chSysHalt() was invoked. - * . - * @section RVCT_ARMCMx_NOTES ARM Cortex-Mx/RVCT port notes - * The ARM Cortex-Mx port is organized as follow: - * - The @p main() function is invoked in thread-privileged mode. - * - Each thread has a private process stack, the system has a single main - * stack where all the interrupts and exceptions are processed. - * - The threads are started in thread-privileged mode. - * - Interrupt nesting and the other advanced core/NVIC features are supported. - * - The Cortex-Mx port is perfectly generic, support for more devices can be - * easily added by adding a subdirectory under ./os/ports/RVCT/ARMCMx - * and giving it the name of the new device, then copy the files from another - * device into the new directory and customize them for the new device. - * - The free uVision is not able to handle scatter files, the following - * options are required in the project options under "Preprocesso symbols" - * in order to use the unused RAM as heap automatically: - * __heap_base__=Image$$RW_IRAM1$$ZI$$Limit - * __heap_end__=Image$$RW_IRAM2$$Base - * . - * @ingroup rvct - */ - -/** - * @defgroup RVCT_ARMCMx_CONF Configuration Options - * @details ARM Cortex-Mx Configuration Options. The ARMCMx port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space used - * by an interrupt handler between the @p extctx and @p intctx - * structures. - * - @p IDLE_THREAD_STACK_SIZE, stack area size to be assigned to the IDLE - * thread. Usually there is no need to change this value unless inserting - * code in the IDLE thread using the @p IDLE_LOOP_HOOK hook macro. - * - @p CORTEX_PRIORITY_SYSTICK, priority of the SYSTICK handler. - * - @p CORTEX_PRIORITY_PENDSV, priority of the PENDSV handler. - * - @p CORTEX_ENABLE_WFI_IDLE, if set to @p TRUE enables the use of the - * @p wfi instruction from within the idle loop. This option is - * defaulted to FALSE because it can create problems with some debuggers. - * Setting this option to TRUE reduces the system power requirements. - * . - * @section RVCT_ARMCMx_CONF_1 ARMv6-M specific options - * The following options are specific for the ARMv6-M architecture: - * - @p CORTEX_ALTERNATE_SWITCH, when activated makes the OS use the PendSV - * exception instead of NMI as preemption handler. - * . - * @section RVCT_ARMCMx_CONF_2 ARMv7-M specific options - * The following options are specific for the ARMv6-M architecture: - * - @p CORTEX_PRIORITY_SVCALL, priority of the SVCALL handler. - * - @p CORTEX_SIMPLIFIED_PRIORITY, when enabled activates the Compact kernel - * mode. - * . - * @ingroup RVCT_ARMCMx - */ - -/** - * @defgroup RVCT_ARMCMx_CORE Core Port Implementation - * @details ARM Cortex-Mx specific port code, structures and macros. - * - * @ingroup RVCT_ARMCMx - */ - -/** - * @defgroup RVCT_ARMCMx_V6M_CORE ARMv6-M Specific Implementation - * @details ARMv6-M specific port code, structures and macros. - * - * @ingroup RVCT_ARMCMx_CORE - */ - -/** - * @defgroup RVCT_ARMCMx_V7M_CORE ARMv7-M Specific Implementation - * @details ARMv7-M specific port code, structures and macros. - * - * @ingroup RVCT_ARMCMx_CORE - */ - -/** - * @defgroup RVCT_ARMCMx_STARTUP Startup Support - * @details ChibiOS/RT provides its own generic startup file for the ARM - * Cortex-Mx port. - * Of course it is not mandatory to use it but care should be taken about the - * startup phase details. - * - * @section RVCT_ARMCMx_STARTUP_1 Startup Process - * The startup process, as implemented, is the following: - * -# Interrupts are masked globally. - * -# The two stacks are initialized by assigning them the sizes defined in - * cstartup.s file and accessible through the configuration wizard. - * -# The CPU state is switched to Privileged and the PSP stack is used. - * -# An early initialization routine @p __early_init() is invoked, if the - * symbol is not defined then an empty default routine is executed - * (weak symbol). - * -# Control is passed to the C runtime entry point @p __main that performs - * the required initializations before invoking the @p main() function. - * . - * @ingroup RVCT_ARMCMx - */ - -/** - * @defgroup RVCT_ARMCMx_NVIC NVIC Support - * @details ARM Cortex-Mx NVIC support. - * - * @ingroup RVCT_ARMCMx - */ - -/** - * @defgroup RVCT_ARMCMx_SPECIFIC Specific Implementations - * @details Platform-specific port code. - * - * @ingroup RVCT_ARMCMx - */ diff --git a/os/ports/common/.empty b/os/ports/common/.empty new file mode 100644 index 0000000000..da1585c347 --- /dev/null +++ b/os/ports/common/.empty @@ -0,0 +1 @@ +I'm a folder! \ No newline at end of file diff --git a/os/ports/common/ARMCMx/CMSIS/include/arm_common_tables.h b/os/ports/common/ARMCMx/CMSIS/include/arm_common_tables.h deleted file mode 100644 index 5fd6ff4af9..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/arm_common_tables.h +++ /dev/null @@ -1,38 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010 ARM Limited. All rights reserved. -* -* $Date: 11. November 2010 -* $Revision: V1.0.2 -* -* Project: CMSIS DSP Library -* Title: arm_common_tables.h -* -* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Version 1.0.2 2010/11/11 -* Documentation updated. -* -* Version 1.0.1 2010/10/05 -* Production release and review comments incorporated. -* -* Version 1.0.0 2010/09/20 -* Production release and review comments incorporated. -* -------------------------------------------------------------------- */ - -#ifndef _ARM_COMMON_TABLES_H -#define _ARM_COMMON_TABLES_H - -#include "arm_math.h" - -extern const uint16_t armBitRevTable[1024]; -extern const q15_t armRecipTableQ15[64]; -extern const q31_t armRecipTableQ31[64]; -extern const q31_t realCoefAQ31[1024]; -extern const q31_t realCoefBQ31[1024]; -extern const float32_t twiddleCoef[6144]; -extern const q31_t twiddleCoefQ31[6144]; -extern const q15_t twiddleCoefQ15[6144]; - -#endif /* ARM_COMMON_TABLES_H */ diff --git a/os/ports/common/ARMCMx/CMSIS/include/arm_math.h b/os/ports/common/ARMCMx/CMSIS/include/arm_math.h deleted file mode 100644 index 266dbfc918..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/arm_math.h +++ /dev/null @@ -1,7578 +0,0 @@ -/* ---------------------------------------------------------------------- - * Copyright (C) 2010-2011 ARM Limited. All rights reserved. - * - * $Date: 15. February 2012 - * $Revision: V1.1.0 - * - * Project: CMSIS DSP Library - * Title: arm_math.h - * - * Description: Public header file for CMSIS DSP Library - * - * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 - * - * Version 1.1.0 2012/02/15 - * Updated with more optimizations, bug fixes and minor API changes. - * - * Version 1.0.10 2011/7/15 - * Big Endian support added and Merged M0 and M3/M4 Source code. - * - * Version 1.0.3 2010/11/29 - * Re-organized the CMSIS folders and updated documentation. - * - * Version 1.0.2 2010/11/11 - * Documentation updated. - * - * Version 1.0.1 2010/10/05 - * Production release and review comments incorporated. - * - * Version 1.0.0 2010/09/20 - * Production release and review comments incorporated. - * -------------------------------------------------------------------- */ - -/** - \mainpage CMSIS DSP Software Library - * - * Introduction - * - * This user manual describes the CMSIS DSP software library, - * a suite of common signal processing functions for use on Cortex-M processor based devices. - * - * The library is divided into a number of functions each covering a specific category: - * - Basic math functions - * - Fast math functions - * - Complex math functions - * - Filters - * - Matrix functions - * - Transforms - * - Motor control functions - * - Statistical functions - * - Support functions - * - Interpolation functions - * - * The library has separate functions for operating on 8-bit integers, 16-bit integers, - * 32-bit integer and 32-bit floating-point values. - * - * Pre-processor Macros - * - * Each library project have differant pre-processor macros. - * - * - UNALIGNED_SUPPORT_DISABLE: - * - * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access - * - * - ARM_MATH_BIG_ENDIAN: - * - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. - * - * - ARM_MATH_MATRIX_CHECK: - * - * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices - * - * - ARM_MATH_ROUNDING: - * - * Define macro ARM_MATH_ROUNDING for rounding on support functions - * - * - ARM_MATH_CMx: - * - * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target - * and ARM_MATH_CM0 for building library on cortex-M0 target. - * - * - __FPU_PRESENT: - * - * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries - * - * Toolchain Support - * - * The library has been developed and tested with MDK-ARM version 4.23. - * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. - * - * Using the Library - * - * The library installer contains prebuilt versions of the libraries in the Lib folder. - * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) - * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) - * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) - * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) - * - arm_cortexM0l_math.lib (Little endian on Cortex-M0) - * - arm_cortexM0b_math.lib (Big endian on Cortex-M3) - * - * The library functions are declared in the public file arm_math.h which is placed in the Include folder. - * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single - * public header file arm_math.h for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. - * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or - * ARM_MATH_CM0 depending on the target processor in the application. - * - * Examples - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * Building the Library - * - * The library installer contains project files to re build libraries on MDK Tool chain in the CMSIS\\DSP_Lib\\Source\\ARM folder. - * - arm_cortexM0b_math.uvproj - * - arm_cortexM0l_math.uvproj - * - arm_cortexM3b_math.uvproj - * - arm_cortexM3l_math.uvproj - * - arm_cortexM4b_math.uvproj - * - arm_cortexM4l_math.uvproj - * - arm_cortexM4bf_math.uvproj - * - arm_cortexM4lf_math.uvproj - * - * - * The project can be built by opening the appropriate project in MDK-ARM 4.23 chain and defining the optional pre processor MACROs detailed above. - * - * Copyright Notice - * - * Copyright (C) 2010 ARM Limited. All rights reserved. - */ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CMSIS math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - *
    - *     typedef struct
    - *     {
    - *       uint16_t numRows;     // number of rows of the matrix.
    - *       uint16_t numCols;     // number of columns of the matrix.
    - *       float32_t *pData;     // points to the data of the matrix.
    - *     } arm_matrix_instance_f32;
    - * 
    - * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size numRows X numCols - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - *
    - *     pData[i*numCols + j]
    - * 
    - * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() - * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - *
    - * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
    - * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
    - * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
    - * 
    - * where nRows specifies the number of rows, nColumns - * specifies the number of columns, and pData points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - *
    - *     ARM_MATH_SIZE_MISMATCH
    - * 
    - * Otherwise the functions return - *
    - *     ARM_MATH_SUCCESS
    - * 
    - * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the \#define - *
    - *     ARM_MATH_MATRIX_CHECK
    - * 
    - * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return ARM_MATH_SUCCESS. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - -/** - * @defgroup groupExamples Examples - */ -#ifndef _ARM_MATH_H -#define _ARM_MATH_H - -/* CHIBIOS FIX BEGIN */ -#include "board.h" -#if defined(STM32F4XX) -#define ARM_MATH_CM4 -#define __FPU_PRESENT 1 -#elif (defined(STM32F10X_LD) || defined(STM32F10X_LD_VL) || \ - defined(STM32F10X_MD) || defined(STM32F10X_MD_VL) || \ - defined(STM32F10X_HD) || defined(STM32F10X_XL) || \ - defined(STM32F10X_CL)) -#define ARM_MATH_CM3 -#elif defined(STM32F0XX) -#define ARM_MATH_CM0 -#endif -/* CHIBIOS FIX END */ - -#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ - -#if defined (ARM_MATH_CM4) -#include "core_cm4.h" -#elif defined (ARM_MATH_CM3) -#include "core_cm3.h" -#elif defined (ARM_MATH_CM0) -#include "core_cm0.h" -#else -#include "ARMCM4.h" -#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." -#endif - -#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ -#include "string.h" -#include "math.h" -#ifdef __cplusplus -extern "C" -{ -#endif - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 (0x100) -#define DELTA_Q15 0x5 -#define INDEX_MASK 0x0000003F -#ifndef PI -#define PI 3.14159265358979f -#endif - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define TABLE_SIZE 256 -#define TABLE_SPACING_Q31 0x800000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - /** - * @brief Macro for Unaligned Support - */ -#ifndef UNALIGNED_SUPPORT_DISABLE - #define ALIGN4 -#else - #if defined (__GNUC__) - #define ALIGN4 __attribute__((aligned(4))) - #else - #define ALIGN4 __align(4) - #endif -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ - ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } arm_status; - - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief definition to read/write two 16 bit values. - */ -#if defined (__GNUC__) - #define __SIMD32(addr) (*( int32_t **) & (addr)) - #define _SIMD32_OFFSET(addr) (*( int32_t * ) (addr)) -#else - #define __SIMD32(addr) (*(__packed int32_t **) & (addr)) - #define _SIMD32_OFFSET(addr) (*(__packed int32_t * ) (addr)) -#endif - - #define __SIMD64(addr) (*(int64_t **) & (addr)) - -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) - /** - * @brief definition to pack two 16 bit values. - */ -#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) -#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) - -#endif - - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef ARM_MATH_BIG_ENDIAN - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) - -#endif - - - /** - * @brief Clips Q63 to Q31 values. - */ - __STATIC_INLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Clips Q63 to Q15 values. - */ - __STATIC_INLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** - * @brief Clips Q31 to Q7 values. - */ - __STATIC_INLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** - * @brief Clips Q31 to Q15 values. - */ - __STATIC_INLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ - - __STATIC_INLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y))); - } - - -#if defined (ARM_MATH_CM0) && defined ( __CC_ARM ) -#define __CLZ __clz -#endif - -#if defined (ARM_MATH_CM0) && defined ( __TASKING__ ) -/* No need to redefine __CLZ */ -#endif - -#if defined (ARM_MATH_CM0) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) ) - - __STATIC_INLINE uint32_t __CLZ(q31_t data); - - - __STATIC_INLINE uint32_t __CLZ(q31_t data) - { - uint32_t count = 0; - uint32_t mask = 0x80000000; - - while((data & mask) == 0) - { - count += 1u; - mask = mask >> 1u; - } - - return (count); - - } - -#endif - - /** - * @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type. - */ - - __STATIC_INLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - q31_t * pRecipTable) - { - - uint32_t out, tempVal; - uint32_t index, i; - uint32_t signBits; - - if(in > 0) - { - signBits = __CLZ(in) - 1; - } - else - { - signBits = __CLZ(-in) - 1; - } - - /* Convert input sample to 1.31 format */ - in = in << signBits; - - /* calculation of index for initial approximated Val */ - index = (uint32_t) (in >> 24u); - index = (index & INDEX_MASK); - - /* 1.31 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0u; i < 2u; i++) - { - tempVal = (q31_t) (((q63_t) in * out) >> 31u); - tempVal = 0x7FFFFFFF - tempVal; - /* 1.31 with exp 1 */ - //out = (q31_t) (((q63_t) out * tempVal) >> 30u); - out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1u); - - } - - /** - * @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type. - */ - __STATIC_INLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - q15_t * pRecipTable) - { - - uint32_t out = 0, tempVal = 0; - uint32_t index = 0, i = 0; - uint32_t signBits = 0; - - if(in > 0) - { - signBits = __CLZ(in) - 17; - } - else - { - signBits = __CLZ(-in) - 17; - } - - /* Convert input sample to 1.15 format */ - in = in << signBits; - - /* calculation of index for initial approximated Val */ - index = in >> 8; - index = (index & INDEX_MASK); - - /* 1.15 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0; i < 2; i++) - { - tempVal = (q15_t) (((q31_t) in * out) >> 15); - tempVal = 0x7FFF - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1); - - } - - - /* - * @brief C custom defined intrinisic function for only M0 processors - */ -#if defined(ARM_MATH_CM0) - - __STATIC_INLINE q31_t __SSAT( - q31_t x, - uint32_t y) - { - int32_t posMax, negMin; - uint32_t i; - - posMax = 1; - for (i = 0; i < (y - 1); i++) - { - posMax = posMax * 2; - } - - if(x > 0) - { - posMax = (posMax - 1); - - if(x > posMax) - { - x = posMax; - } - } - else - { - negMin = -posMax; - - if(x < negMin) - { - x = negMin; - } - } - return (x); - - - } - -#endif /* end of ARM_MATH_CM0 */ - - - - /* - * @brief C custom defined intrinsic function for M3 and M0 processors - */ -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) - - /* - * @brief C custom defined QADD8 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QADD8( - q31_t x, - q31_t y) - { - - q31_t sum; - q7_t r, s, t, u; - - r = (q7_t) x; - s = (q7_t) y; - - r = __SSAT((q31_t) (r + s), 8); - s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); - t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); - u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); - - sum = - (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | - (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); - - return sum; - - } - - /* - * @brief C custom defined QSUB8 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QSUB8( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s, t, u; - - r = (q7_t) x; - s = (q7_t) y; - - r = __SSAT((r - s), 8); - s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; - t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; - u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; - - sum = - (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & - 0x000000FF); - - return sum; - } - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QADD16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = __SSAT(r + s, 16); - s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - - } - - /* - * @brief C custom defined SHADD16 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SHADD16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) + (s >> 1)); - s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - - } - - /* - * @brief C custom defined QSUB16 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QSUB16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = __SSAT(r - s, 16); - s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - /* - * @brief C custom defined SHSUB16 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SHSUB16( - q31_t x, - q31_t y) - { - - q31_t diff; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) - (s >> 1)); - s = (((x >> 17) - (y >> 17)) << 16); - - diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return diff; - } - - /* - * @brief C custom defined QASX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QASX( - q31_t x, - q31_t y) - { - - q31_t sum = 0; - - sum = - ((sum + - clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) + - clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16))); - - return sum; - } - - /* - * @brief C custom defined SHASX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SHASX( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) - (y >> 17)); - s = (((x >> 17) + (s >> 1)) << 16); - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - - /* - * @brief C custom defined QSAX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QSAX( - q31_t x, - q31_t y) - { - - q31_t sum = 0; - - sum = - ((sum + - clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) + - clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16))); - - return sum; - } - - /* - * @brief C custom defined SHSAX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SHSAX( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) + (y >> 17)); - s = (((x >> 17) - (s >> 1)) << 16); - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - /* - * @brief C custom defined SMUSDX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMUSDX( - q31_t x, - q31_t y) - { - - return ((q31_t) (((short) x * (short) (y >> 16)) - - ((short) (x >> 16) * (short) y))); - } - - /* - * @brief C custom defined SMUADX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMUADX( - q31_t x, - q31_t y) - { - - return ((q31_t) (((short) x * (short) (y >> 16)) + - ((short) (x >> 16) * (short) y))); - } - - /* - * @brief C custom defined QADD for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QADD( - q31_t x, - q31_t y) - { - return clip_q63_to_q31((q63_t) x + y); - } - - /* - * @brief C custom defined QSUB for M3 and M0 processors - */ - __STATIC_INLINE q31_t __QSUB( - q31_t x, - q31_t y) - { - return clip_q63_to_q31((q63_t) x - y); - } - - /* - * @brief C custom defined SMLAD for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMLAD( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y >> 16)) + - ((short) x * (short) y)); - } - - /* - * @brief C custom defined SMLADX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMLADX( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y)) + - ((short) x * (short) (y >> 16))); - } - - /* - * @brief C custom defined SMLSDX for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMLSDX( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum - ((short) (x >> 16) * (short) (y)) + - ((short) x * (short) (y >> 16))); - } - - /* - * @brief C custom defined SMLALD for M3 and M0 processors - */ - __STATIC_INLINE q63_t __SMLALD( - q31_t x, - q31_t y, - q63_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y >> 16)) + - ((short) x * (short) y)); - } - - /* - * @brief C custom defined SMLALDX for M3 and M0 processors - */ - __STATIC_INLINE q63_t __SMLALDX( - q31_t x, - q31_t y, - q63_t sum) - { - - return (sum + ((short) (x >> 16) * (short) y)) + - ((short) x * (short) (y >> 16)); - } - - /* - * @brief C custom defined SMUAD for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMUAD( - q31_t x, - q31_t y) - { - - return (((x >> 16) * (y >> 16)) + - (((x << 16) >> 16) * ((y << 16) >> 16))); - } - - /* - * @brief C custom defined SMUSD for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SMUSD( - q31_t x, - q31_t y) - { - - return (-((x >> 16) * (y >> 16)) + - (((x << 16) >> 16) * ((y << 16) >> 16))); - } - - - /* - * @brief C custom defined SXTB16 for M3 and M0 processors - */ - __STATIC_INLINE q31_t __SXTB16( - q31_t x) - { - - return ((((x << 24) >> 24) & 0x0000FFFF) | - (((x << 8) >> 8) & 0xFFFF0000)); - } - - -#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ - - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; - - - /** - * @brief Processing function for the Q7 FIR filter. - * @param[in] *S points to an instance of the Q7 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] *S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - * @return none - */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR filter. - * @param[in] *S points to an instance of the Q15 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] *S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if - * numTaps is not a supported value. - */ - - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR filter. - * @param[in] *S points to an instance of the Q31 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] *S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return none. - */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the floating-point FIR filter. - * @param[in] *S points to an instance of the floating-point FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] *S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return none. - */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - - } arm_biquad_casd_df1_inst_q15; - - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - - } arm_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - - - } arm_biquad_casd_df1_inst_f32; - - - - /** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - - /** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - /** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - */ - - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - - } arm_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - - } arm_matrix_instance_q31; - - - - /** - * @brief Floating-point matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @param[in] *pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q31 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix scaling. - * @param[in] *pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] *pDst points to the output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Q31 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - /** - * @brief Q15 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - /** - * @brief Floating-point matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ -#ifdef ARM_MATH_CM0 - q15_t A1; - q15_t A2; -#else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ -#endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - - } arm_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; - - - - /** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] *S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); - - /** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] *S is an instance of the floating-point PID Control structure - * @return none - */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - - - /** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q31 PID Control structure - * @return none - */ - - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - - /** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); - - /** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the q15 PID Control structure - * @return none - */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - - - /** - * @brief Q7 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; - - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q15; - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q31; - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f32; - - - /** - * @brief Processing function for the Q15 CFFT/CIFFT. - * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Processing function for the Q15 CFFT/CIFFT. - * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Initialization function for the Q15 CFFT/CIFFT. - * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Initialization function for the Q15 CFFT/CIFFT. - * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Processing function for the Q31 CFFT/CIFFT. - * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Initialization function for the Q31 CFFT/CIFFT. - * @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Processing function for the Radix-2 Q31 CFFT/CIFFT. - * @param[in] *S points to an instance of the Radix-2 Q31 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix2_q31( - const arm_cfft_radix2_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Initialization function for the Radix-2 Q31 CFFT/CIFFT. - * @param[in,out] *S points to an instance of the Radix-2 Q31 CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - - - /** - * @brief Processing function for the floating-point CFFT/CIFFT. - * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix2_f32( - const arm_cfft_radix2_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Initialization function for the floating-point CFFT/CIFFT. - * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Processing function for the floating-point CFFT/CIFFT. - * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Initialization function for the floating-point CFFT/CIFFT. - * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - - - /*---------------------------------------------------------------------- - * Internal functions prototypes FFT function - ----------------------------------------------------------------------*/ - - /** - * @brief Core function for the floating-point CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to the twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_f32( - float32_t * pSrc, - uint16_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the floating-point CIFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @param[in] onebyfftLen value of 1/fftLen. - * @return none. - */ - - void arm_radix4_butterfly_inverse_f32( - float32_t * pSrc, - uint16_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier, - float32_t onebyfftLen); - - /** - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. - * @param[in] fftSize length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. - * @param[in] *pBitRevTab points to the bit reversal table. - * @return none. - */ - - void arm_bitreversal_f32( - float32_t * pSrc, - uint16_t fftSize, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - - /** - * @brief Core function for the Q31 CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier); - - /** - * @brief Core function for the f32 FFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of f32 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix2_butterfly_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the Radix-2 Q31 CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix2_butterfly_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the Radix-2 Q15 CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix2_butterfly_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the Radix-2 Q15 CFFT Inverse butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix2_butterfly_inverse_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the Radix-2 Q31 CFFT Inverse butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix2_butterfly_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the f32 IFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of f32 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to Twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @param[in] onebyfftLen 1/fftLenfth - * @return none. - */ - - void arm_radix2_butterfly_inverse_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier, - float32_t onebyfftLen); - - /** - * @brief Core function for the Q31 CIFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier); - - /** - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table - * @param[in] *pBitRevTab points to bit reversal table. - * @return none. - */ - - void arm_bitreversal_q31( - q31_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - - /** - * @brief Core function for the Q15 CFFT butterfly process. - * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef16 points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_q15( - q15_t * pSrc16, - uint32_t fftLen, - q15_t * pCoef16, - uint32_t twidCoefModifier); - - - /** - * @brief Core function for the Q15 CIFFT butterfly process. - * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef16 points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_inverse_q15( - q15_t * pSrc16, - uint32_t fftLen, - q15_t * pCoef16, - uint32_t twidCoefModifier); - - /** - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table - * @param[in] *pBitRevTab points to bit reversal table. - * @return none. - */ - - void arm_bitreversal_q15( - q15_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint32_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q15; - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint32_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q31; - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - /** - * @brief Processing function for the Q15 RFFT/RIFFT. - * @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Initialization function for the Q15 RFFT/RIFFT. - * @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in] fftLenReal length of the FFT. - * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. - */ - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - /** - * @brief Processing function for the Q31 RFFT/RIFFT. - * @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Initialization function for the Q31 RFFT/RIFFT. - * @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. - * @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in] fftLenReal length of the FFT. - * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. - */ - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - /** - * @brief Initialization function for the floating-point RFFT/RIFFT. - * @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. - * @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in] fftLenReal length of the FFT. - * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. - */ - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - /** - * @brief Processing function for the floating-point RFFT/RIFFT. - * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - /** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. - */ - - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - /** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - /** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - /** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q31 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - /** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - /** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q15 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - /** - * @brief Floating-point vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Dot product of floating-point vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - /** - * @brief Dot product of Q7 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - /** - * @brief Dot product of Q15 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - /** - * @brief Dot product of Q31 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - /** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - /** - * @brief Copies the elements of a floating-point vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q7 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q15 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q31 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - /** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return none. - */ - - - void arm_conv_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return none. - */ - - void arm_conv_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - - /** - * @brief Convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return none. - */ - - void arm_conv_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Partial convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q7 sequences - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - - } arm_fir_decimate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - - } arm_fir_decimate_instance_f32; - - - - /** - * @brief Processing function for the floating-point FIR decimator. - * @param[in] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR decimator. - * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - - arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_fast_q31( - arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; - - - /** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - - } arm_biquad_cas_df1_32x64_ins_q31; - - - /** - * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] *S points to an instance of the filter data structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] *S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - */ - - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState); - - - /** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState); - - - /** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; - - /** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the Q15 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - * @return none. - */ - - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - - /** - * @brief Processing function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_f32( - const arm_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - - - /** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_q15( - const arm_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - - } arm_lms_instance_q31; - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_q31( - const arm_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; - - /** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; - - /** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - /** - * @brief Correlation of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Correlation of Q15 sequences - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @return none. - */ - void arm_correlate_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - - /** - * @brief Correlation of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @return none. - */ - - void arm_correlate_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - /** - * @brief Correlation of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return none. - */ - - void arm_correlate_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; - - /** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /* - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] *pSinVal points to the processed sine output. - * @param[out] *pCosVal points to the processed cos output. - * @return none. - */ - - void arm_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCcosVal); - - /* - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] *pSinVal points to the processed sine output. - * @param[out] *pCosVal points to the processed cosine output. - * @return none. - */ - - void arm_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - - /** - * @brief Floating-point complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - - /** - * @brief Floating-point complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * S points to an instance of the PID control data structure. in - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - *
    -   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
    -   *    A0 = Kp + Ki + Kd
    -   *    A1 = (-Kp ) - (2 * Kd )
    -   *    A2 = Kd  
    - * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup PID - * @{ - */ - - /** - * @brief Process function for the floating-point PID Control. - * @param[in,out] *S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - */ - - - __STATIC_INLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q31 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ - - __STATIC_INLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31u); - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - - __STATIC_INLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - - /* Implementation of PID controller */ - -#ifdef ARM_MATH_CM0 - - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - -#else - - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD(S->A0, in); - -#endif - -#ifdef ARM_MATH_CM0 - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; - -#else - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc = __SMLALD(S->A1, (q31_t) __SIMD32(S->state), acc); - -#endif - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT((acc >> 15), 16)); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @} end of PID group - */ - - - /** - * @brief Floating-point matrix inverse. - * @param[in] *src points to the instance of the input floating-point matrix structure. - * @param[out] *dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); - - - - /** - * @ingroup groupController - */ - - - /** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents - * in the two-phase orthogonal stator axis Ialpha and Ibeta. - * When Ialpha is superposed with Ia as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta - * can be calculated using only Ia and Ib. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where Ia and Ib are the instantaneous stator phases and - * pIalpha and pIbeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup clarke - * @{ - */ - - /** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @return none. - */ - - __STATIC_INLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = - ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); - - } - - /** - * @brief Clarke transform for Q31 version - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - - __STATIC_INLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - /** - * @} end of clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where pIa and pIb are the instantaneous stator phases and - * Ialpha and Ibeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] *pIa points to output three-phase coordinate a - * @param[out] *pIb points to output three-phase coordinate b - * @return none. - */ - - - __STATIC_INLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta; - - } - - /** - * @brief Inverse Clarke transform for Q31 version - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] *pIa points to output three-phase coordinate a - * @param[out] *pIb points to output three-phase coordinate b - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the subtraction, hence there is no risk of overflow. - */ - - __STATIC_INLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - - } - - /** - * @} end of inv_clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where Ialpha and Ibeta are the stator vector components, - * pId and pIq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup park - * @{ - */ - - /** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] *pId points to output rotor reference frame d - * @param[out] *pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * The function implements the forward Park transform. - * - */ - - __STATIC_INLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; - - } - - /** - * @brief Park transform for Q31 version - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] *pId points to output rotor reference frame d - * @param[out] *pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ - - - __STATIC_INLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); - } - - /** - * @} end of park group - */ - - /** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where pIalpha and pIbeta are the stator vector components, - * Id and Iq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_park - * @{ - */ - - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - */ - - __STATIC_INLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; - - } - - - /** - * @brief Inverse Park transform for Q31 version - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - - - __STATIC_INLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); - - } - - /** - * @} end of Inverse park group - */ - - - /** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - *
    -   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
    -   *       where x0, x1 are nearest values of input x
    -   *             y0, y1 are nearest values to output y
    -   * 
    - * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * S points to an instance of the Linear Interpolate function data structure. - * x is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - - /** - * @addtogroup LinearInterpolate - * @{ - */ - - /** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ - - __STATIC_INLINE float32_t arm_linear_interp_f32( - arm_linear_interp_instance_f32 * S, - float32_t x) - { - - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - - /* Calculation of index */ - i = (x - S->x1) / xSpacing; - - if(i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - /* CHIBIOS FIX BEGIN */ - else if(i >= (int32_t)S->nValues) - /* CHIBIOS FIX END */ - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - - } - - /* returns output value */ - return (y); - } - - /** - * - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] *pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - - - __STATIC_INLINE q31_t arm_linear_interp_q31( - q31_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20); - /* CHIBIOS FIX BEGIN */ - if(index >= ((int32_t)nValues - 1)) - /* CHIBIOS FIX END */ - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - - /* Convert y to 1.31 format */ - return (y << 1u); - - } - - } - - /** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] *pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - - - __STATIC_INLINE q15_t arm_linear_interp_q15( - q15_t * pYData, - q31_t x, - uint32_t nValues) - { - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20u); - - /* CHIBIOS FIX BEGIN */ - if(index >= ((int32_t)nValues - 1)) - /* CHIBIOS FIX END */ - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - - /* convert y to 1.15 format */ - return (y >> 20); - } - - - } - - /** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] *pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ - - - __STATIC_INLINE q7_t arm_linear_interp_q7( - q7_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20u); - - /* CHIBIOS FIX BEGIN */ - if(index >= ((int32_t)nValues - 1)) - /* CHIBIOS FIX END */ - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - - /* convert y to 1.7(q7) format */ - return (y >> 20u); - - } - - } - /** - * @} end of LinearInterpolate group - */ - - /** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - - float32_t arm_sin_f32( - float32_t x); - - /** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - - q31_t arm_sin_q31( - q31_t x); - - /** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - - q15_t arm_sin_q15( - q15_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - - float32_t arm_cos_f32( - float32_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - - q31_t arm_cos_q31( - q31_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - - q15_t arm_cos_q15( - q15_t x); - - - /** - * @ingroup groupFastMath - */ - - - /** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - *
    -   *      x1 = x0 - f(x0)/f'(x0)
    -   * 
    - * where x1 is the current estimate, - * x0 is the previous estimate and - * f'(x0) is the derivative of f() evaluated at x0. - * For the square root function, the algorithm reduces to: - *
    -   *     x0 = in/2                         [initial guess]
    -   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
    -   * 
    - */ - - - /** - * @addtogroup SQRT - * @{ - */ - - /** - * @brief Floating-point square root function. - * @param[in] in input value. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - - __STATIC_INLINE arm_status arm_sqrt_f32( - float32_t in, - float32_t * pOut) - { - if(in > 0) - { - -// #if __FPU_USED - #if (__FPU_USED == 1) && defined ( __CC_ARM ) - *pOut = __sqrtf(in); - #elif (__FPU_USED == 1) && defined ( __TMS_740 ) - *pOut = __builtin_sqrtf(in); - #else - *pOut = sqrtf(in); - #endif - - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); - } - - } - - - /** - * @brief Q31 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut); - - /** - * @brief Q15 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut); - - /** - * @} end of SQRT group - */ - - - - - - - /** - * @brief floating-point Circular write function. - */ - - __STATIC_INLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief floating-point Circular Read function. - */ - __STATIC_INLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (int32_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - /** - * @brief Q15 Circular write function. - */ - - __STATIC_INLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief Q15 Circular Read function. - */ - __STATIC_INLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q15_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q7 Circular write function. - */ - - __STATIC_INLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief Q7 Circular Read function. - */ - __STATIC_INLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q7_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Mean value of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - /** - * @brief Mean value of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Mean value of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Mean value of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Variance of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Variance of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Variance of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Floating-point complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - /** - * @brief Q31 complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - /** - * @brief Floating-point complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - /** - * @brief Q15 complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_q15( - q15_t * pSrcCmplx, - q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Q31 complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_q31( - q31_t * pSrcCmplx, - q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Floating-point complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_f32( - float32_t * pSrcCmplx, - float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Minimum value of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - /** - * @brief Minimum value of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[in] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - /** - * @brief Minimum value of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[out] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - void arm_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - /** - * @brief Minimum value of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[out] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - /** - * @brief Q15 complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Floating-point complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - * @return none. - */ - void arm_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * @return none - */ - void arm_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - * @return none - */ - void arm_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function f(x, y) is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * Algorithm - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - *
    -   *   typedef struct
    -   *   {
    -   *     uint16_t numRows;
    -   *     uint16_t numCols;
    -   *     float32_t *pData;
    -   * } arm_bilinear_interp_instance_f32;
    -   * 
    - * - * \par - * where numRows specifies the number of rows in the table; - * numCols specifies the number of columns in the table; - * and pData points to an array of size numRows*numCols values. - * The data table pTable is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. - * - * \par - * Let (x, y) specify the desired interpolation point. Then define: - *
    -   *     XF = floor(x)
    -   *     YF = floor(y)
    -   * 
    - * \par - * The interpolated output point is computed as: - *
    -   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
    -   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
    -   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
    -   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
    -   * 
    - * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - /** - * @addtogroup BilinearInterpolate - * @{ - */ - - /** - * - * @brief Floating-point bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate. - * @param[in] Y interpolation coordinate. - * @return out interpolated value. - */ - - - __STATIC_INLINE float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) - { - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 - || yIndex > (S->numCols - 1)) - { - return (0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex - 1) + (yIndex - 1) * S->numCols; - - - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex - 1) + (yIndex) * S->numCols; - - - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - - /* return to application */ - return (out); - - } - - /** - * - * @brief Q31 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - __STATIC_INLINE q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) - { - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20u); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20u); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* Convert acc to 1.31(q31) format */ - return (acc << 2u); - - } - - /** - * @brief Q15 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - __STATIC_INLINE q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); - acc = ((q63_t) out * (0xFFFFF - yfract)); - - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); - acc += ((q63_t) out * (xfract)); - - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return (acc >> 36); - - } - - /** - * @brief Q7 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - __STATIC_INLINE q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return (acc >> 40); - - } - - /** - * @} end of BilinearInterpolate group - */ - - - - - - -#ifdef __cplusplus -} -#endif - - -#endif /* _ARM_MATH_H */ - - -/** - * - * End of file. - */ diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cm0.h b/os/ports/common/ARMCMx/CMSIS/include/core_cm0.h deleted file mode 100644 index 0d7cfd85e2..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cm0.h +++ /dev/null @@ -1,667 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V3.01 - * @date 13. March 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
    - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
    - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M0 - @{ - */ - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000 - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) -#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) -#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } - else { - NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ - else { - return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cm0plus.h b/os/ports/common/ARMCMx/CMSIS/include/core_cm0plus.h deleted file mode 100755 index cf92fb7fef..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cm0plus.h +++ /dev/null @@ -1,778 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V3.01 - * @date 22. March 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
    - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
    - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex-M0+ - @{ - */ - -/* CMSIS CM0P definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \ - __CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000 - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0 - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if (__VTOR_PRESENT == 1) - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if (__VTOR_PRESENT == 1) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0+ Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) -#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) -#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } - else { - NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0+ system interrupts */ - else { - return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cm3.h b/os/ports/common/ARMCMx/CMSIS/include/core_cm3.h deleted file mode 100644 index db1716ad95..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cm3.h +++ /dev/null @@ -1,1612 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V3.01 - * @date 22. March 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
    - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
    - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M3 - @{ - */ - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200 - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if (__CM3_REV < 0x0201) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** \brief Set Priority Grouping - - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cm4.h b/os/ports/common/ARMCMx/CMSIS/include/core_cm4.h deleted file mode 100644 index 024302e4a6..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cm4.h +++ /dev/null @@ -1,1757 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V3.01 - * @date 22. March 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
    - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
    - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M4 - @{ - */ - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (0x01) /*!< [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x04) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ -#include /* Compiler specific SIMD Intrinsics */ - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000 - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0 - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9 /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8 /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ - -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if (__FPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __IO uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IO uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IO uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __I uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __I uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register */ -#define FPU_FPCCR_ASPEN_Pos 31 /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30 /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8 /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6 /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5 /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4 /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3 /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1 /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0 /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL << FPU_FPCCR_LSPACT_Pos) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register */ -#define FPU_FPCAR_ADDRESS_Pos 3 /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register */ -#define FPU_FPDSCR_AHP_Pos 26 /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25 /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24 /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22 /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28 /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24 /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20 /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16 /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12 /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8 /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4 /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0 /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL << FPU_MVFR0_A_SIMD_registers_Pos) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28 /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24 /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4 /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0 /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL << FPU_MVFR1_FtZ_mode_Pos) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#if (__FPU_PRESENT == 1) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** \brief Set Priority Grouping - - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ -/* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */ - NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cm4_simd.h b/os/ports/common/ARMCMx/CMSIS/include/core_cm4_simd.h deleted file mode 100644 index b5140073fb..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cm4_simd.h +++ /dev/null @@ -1,649 +0,0 @@ -/**************************************************************************//** - * @file core_cm4_simd.h - * @brief CMSIS Cortex-M4 SIMD Header File - * @version V3.01 - * @date 06. March 2012 - * - * @note - * Copyright (C) 2010-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM4_SIMD_H -#define __CORE_CM4_SIMD_H - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -#include - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ -/* TI CCS specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -#include - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SMLALD(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -#define __SMLALDX(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SMLSLD(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -#define __SMLSLDX(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -/* not yet supported */ -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - -#endif - -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CORE_CM4_SIMD_H */ - -#ifdef __cplusplus -} -#endif diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cmFunc.h b/os/ports/common/ARMCMx/CMSIS/include/core_cmFunc.h deleted file mode 100644 index 585d2bb56c..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cmFunc.h +++ /dev/null @@ -1,620 +0,0 @@ -/**************************************************************************//** - * @file core_cmFunc.h - * @brief CMSIS Cortex-M Core Function Access Header File - * @version V3.01 - * @date 06. March 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CORE_CMFUNC_H -#define __CORE_CMFUNC_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** \brief Get IPSR Register - - This function returns the content of the IPSR Register. - - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xff); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - - -#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ -/* TI CCS specific functions */ - -#include - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief Enable IRQ Interrupts - - This function enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i"); -} - - -/** \brief Disable IRQ Interrupts - - This function disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i"); -} - - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) ); -} - - -/** \brief Get IPSR Register - - This function returns the content of the IPSR Register. - - \return IPSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f"); -} - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f"); -} - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); - return(result); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) ); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); -/* CHIBIOS FIX BEGIN */ -#else - (void)fpscr; -/* CHIBIOS FIX END */ -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all instrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -#endif /* __CORE_CMFUNC_H */ diff --git a/os/ports/common/ARMCMx/CMSIS/include/core_cmInstr.h b/os/ports/common/ARMCMx/CMSIS/include/core_cmInstr.h deleted file mode 100644 index 624c175fd5..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/include/core_cmInstr.h +++ /dev/null @@ -1,618 +0,0 @@ -/**************************************************************************//** - * @file core_cmInstr.h - * @brief CMSIS Cortex-M Core Instruction Access Header File - * @version V3.01 - * @date 06. March 2012 - * - * @note - * Copyright (C) 2009-2012 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CORE_CMINSTR_H -#define __CORE_CMINSTR_H - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} - - -/** \brief Rotate Right in unsigned value (32 bit) - - This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __rbit - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW(value, ptr) __strex(value, ptr) - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -#define __CLREX __clrex - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - -#endif /* (__CORTEX_M >= 0x03) */ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - - -#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ -/* TI CCS specific functions */ - -#include - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) -{ - __ASM volatile ("nop"); -} - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) -{ - __ASM volatile ("wfi"); -} - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) -{ - __ASM volatile ("wfe"); -} - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) -{ - __ASM volatile ("sev"); -} - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) -{ - __ASM volatile ("isb"); -} - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) -{ - __ASM volatile ("dsb"); -} - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) -{ - __ASM volatile ("dmb"); -} - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) -{ - uint32_t result; - - __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Rotate Right in unsigned value (32 bit) - - This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - - __ASM volatile ("ror %0, %0, %1" : "+r" (op1) : "r" (op2) ); - return(op1); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint8_t result; - - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint16_t result; - - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) -{ - __ASM volatile ("clrex"); -} - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) -{ - uint8_t result; - - __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - -#endif /* __CORE_CMINSTR_H */ diff --git a/os/ports/common/ARMCMx/CMSIS/readme.txt b/os/ports/common/ARMCMx/CMSIS/readme.txt deleted file mode 100644 index 6e21724559..0000000000 --- a/os/ports/common/ARMCMx/CMSIS/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -CMSIS is Copyright (C) 2011 ARM Limited. All rights reserved. - -This directory contains only part of the CMSIS package. If you need the whole -package please download it from: - -http://www.onarm.com diff --git a/os/ports/common/ARMCMx/nvic.c b/os/ports/common/ARMCMx/nvic.c deleted file mode 100644 index 7c8b9f5636..0000000000 --- a/os/ports/common/ARMCMx/nvic.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file common/ARMCMx/nvic.c - * @brief Cortex-Mx NVIC support code. - * - * @addtogroup COMMON_ARMCMx_NVIC - * @{ - */ - -#include "ch.h" -#include "nvic.h" - -/** - * @brief Sets the priority of an interrupt handler and enables it. - * @note The parameters are not tested for correctness. - * - * @param[in] n the interrupt number - * @param[in] prio the interrupt priority mask - */ -void nvicEnableVector(uint32_t n, uint32_t prio) { - unsigned sh = (n & 3) << 3; - - NVIC_IPR(n >> 2) = (NVIC_IPR(n >> 2) & ~(0xFF << sh)) | (prio << sh); - NVIC_ICPR(n >> 5) = 1 << (n & 0x1F); - NVIC_ISER(n >> 5) = 1 << (n & 0x1F); -} - -/** - * @brief Disables an interrupt handler. - * @note The parameters are not tested for correctness. - * - * @param[in] n the interrupt number - */ -void nvicDisableVector(uint32_t n) { - unsigned sh = (n & 3) << 3; - - NVIC_ICER(n >> 5) = 1 << (n & 0x1F); - NVIC_IPR(n >> 2) = NVIC_IPR(n >> 2) & ~(0xFF << sh); -} - -/** - * @brief Changes the priority of a system handler. - * @note The parameters are not tested for correctness. - * - * @param[in] handler the system handler number - * @param[in] prio the system handler priority mask - */ -void nvicSetSystemHandlerPriority(uint32_t handler, uint32_t prio) { - unsigned sh = (handler & 3) * 8; - - SCB_SHPR(handler >> 2) = (SCB_SHPR(handler >> 2) & - ~(0xFF << sh)) | (prio << sh); -} - -/** @} */ diff --git a/os/ports/common/ARMCMx/nvic.h b/os/ports/common/ARMCMx/nvic.h deleted file mode 100644 index 7188c4bcd4..0000000000 --- a/os/ports/common/ARMCMx/nvic.h +++ /dev/null @@ -1,293 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file common/ARMCMx/nvic.h - * @brief Cortex-Mx NVIC support macros and structures. - * - * @addtogroup COMMON_ARMCMx_NVIC - * @{ - */ - -#ifndef _NVIC_H_ -#define _NVIC_H_ - -/** - * @name System vector numbers - * @{ - */ -#define HANDLER_MEM_MANAGE 0 /**< MEM MANAGE vector id. */ -#define HANDLER_BUS_FAULT 1 /**< BUS FAULT vector id. */ -#define HANDLER_USAGE_FAULT 2 /**< USAGE FAULT vector id. */ -#define HANDLER_RESERVED_3 3 -#define HANDLER_RESERVED_4 4 -#define HANDLER_RESERVED_5 5 -#define HANDLER_RESERVED_6 6 -#define HANDLER_SVCALL 7 /**< SVCALL vector id. */ -#define HANDLER_DEBUG_MONITOR 8 /**< DEBUG MONITOR vector id. */ -#define HANDLER_RESERVED_9 9 -#define HANDLER_PENDSV 10 /**< PENDSV vector id. */ -#define HANDLER_SYSTICK 11 /**< SYS TCK vector id. */ -/** @} */ - -typedef volatile uint8_t IOREG8; /**< 8 bits I/O register type. */ -typedef volatile uint32_t IOREG32; /**< 32 bits I/O register type. */ - -/** - * @brief NVIC ITCR register. - */ -#define NVIC_ITCR (*((IOREG32 *)0xE000E004U)) - -/** - * @brief Structure representing the SYSTICK I/O space. - */ -typedef struct { - IOREG32 CSR; - IOREG32 RVR; - IOREG32 CVR; - IOREG32 CBVR; -} CMx_ST; - -/** - * @brief SYSTICK peripheral base address. - */ -#define STBase ((CMx_ST *)0xE000E010U) -#define ST_CSR (STBase->CSR) -#define ST_RVR (STBase->RVR) -#define ST_CVR (STBase->CVR) -#define ST_CBVR (STBase->CBVR) - -#define CSR_ENABLE_MASK (0x1U << 0) -#define ENABLE_OFF_BITS (0U << 0) -#define ENABLE_ON_BITS (1U << 0) -#define CSR_TICKINT_MASK (0x1U << 1) -#define TICKINT_DISABLED_BITS (0U << 1) -#define TICKINT_ENABLED_BITS (1U << 1) -#define CSR_CLKSOURCE_MASK (0x1U << 2) -#define CLKSOURCE_EXT_BITS (0U << 2) -#define CLKSOURCE_CORE_BITS (1U << 2) -#define CSR_COUNTFLAG_MASK (0x1U << 16) - -#define RVR_RELOAD_MASK (0xFFFFFFU << 0) - -#define CVR_CURRENT_MASK (0xFFFFFFU << 0) - -#define CBVR_TENMS_MASK (0xFFFFFFU << 0) -#define CBVR_SKEW_MASK (0x1U << 30) -#define CBVR_NOREF_MASK (0x1U << 31) - -/** - * @brief Structure representing the NVIC I/O space. - */ -typedef struct { - IOREG32 ISER[8]; - IOREG32 unused1[24]; - IOREG32 ICER[8]; - IOREG32 unused2[24]; - IOREG32 ISPR[8]; - IOREG32 unused3[24]; - IOREG32 ICPR[8]; - IOREG32 unused4[24]; - IOREG32 IABR[8]; - IOREG32 unused5[56]; - IOREG32 IPR[60]; - IOREG32 unused6[644]; - IOREG32 STIR; -} CMx_NVIC; - -/** - * @brief NVIC peripheral base address. - */ -#define NVICBase ((CMx_NVIC *)0xE000E100U) -#define NVIC_ISER(n) (NVICBase->ISER[n]) -#define NVIC_ICER(n) (NVICBase->ICER[n]) -#define NVIC_ISPR(n) (NVICBase->ISPR[n]) -#define NVIC_ICPR(n) (NVICBase->ICPR[n]) -#define NVIC_IABR(n) (NVICBase->IABR[n]) -#define NVIC_IPR(n) (NVICBase->IPR[n]) -#define NVIC_STIR (NVICBase->STIR) - -/** - * @brief Structure representing the System Control Block I/O space. - */ -typedef struct { - IOREG32 CPUID; - IOREG32 ICSR; - IOREG32 VTOR; - IOREG32 AIRCR; - IOREG32 SCR; - IOREG32 CCR; - IOREG32 SHPR[3]; - IOREG32 SHCSR; - IOREG32 CFSR; - IOREG32 HFSR; - IOREG32 DFSR; - IOREG32 MMFAR; - IOREG32 BFAR; - IOREG32 AFSR; - IOREG32 PFR[2]; - IOREG32 DFR; - IOREG32 ADR; - IOREG32 MMFR[4]; - IOREG32 SAR[5]; - IOREG32 unused1[5]; - IOREG32 CPACR; -} CMx_SCB; - -/** - * @brief SCB peripheral base address. - */ -#define SCBBase ((CMx_SCB *)0xE000ED00U) -#define SCB_CPUID (SCBBase->CPUID) -#define SCB_ICSR (SCBBase->ICSR) -#define SCB_VTOR (SCBBase->VTOR) -#define SCB_AIRCR (SCBBase->AIRCR) -#define SCB_SCR (SCBBase->SCR) -#define SCB_CCR (SCBBase->CCR) -#define SCB_SHPR(n) (SCBBase->SHPR[n]) -#define SCB_SHCSR (SCBBase->SHCSR) -#define SCB_CFSR (SCBBase->CFSR) -#define SCB_HFSR (SCBBase->HFSR) -#define SCB_DFSR (SCBBase->DFSR) -#define SCB_MMFAR (SCBBase->MMFAR) -#define SCB_BFAR (SCBBase->BFAR) -#define SCB_AFSR (SCBBase->AFSR) -#define SCB_PFR(n) (SCBBase->PFR[n]) -#define SCB_DFR (SCBBase->DFR) -#define SCB_ADR (SCBBase->ADR) -#define SCB_MMFR(n) (SCBBase->MMFR[n]) -#define SCB_SAR(n) (SCBBase->SAR[n]) -#define SCB_CPACR (SCBBase->CPACR) - -#define ICSR_VECTACTIVE_MASK (0x1FFU << 0) -#define ICSR_RETTOBASE (0x1U << 11) -#define ICSR_VECTPENDING_MASK (0x1FFU << 12) -#define ICSR_ISRPENDING (0x1U << 22) -#define ICSR_ISRPREEMPT (0x1U << 23) -#define ICSR_PENDSTCLR (0x1U << 25) -#define ICSR_PENDSTSET (0x1U << 26) -#define ICSR_PENDSVCLR (0x1U << 27) -#define ICSR_PENDSVSET (0x1U << 28) -#define ICSR_NMIPENDSET (0x1U << 31) - -#define AIRCR_VECTKEY 0x05FA0000U -#define AIRCR_PRIGROUP_MASK (0x7U << 8) -#define AIRCR_PRIGROUP(n) ((n) << 8) - -/** - * @brief Structure representing the FPU I/O space. - */ -typedef struct { - IOREG32 unused1[1]; - IOREG32 FPCCR; - IOREG32 FPCAR; - IOREG32 FPDSCR; - IOREG32 MVFR0; - IOREG32 MVFR1; -} CMx_FPU; - -/** - * @brief FPU peripheral base address. - */ -#define FPUBase ((CMx_FPU *)0xE000EF30U) -#define SCB_FPCCR (FPUBase->FPCCR) -#define SCB_FPCAR (FPUBase->FPCAR) -#define SCB_FPDSCR (FPUBase->FPDSCR) -#define SCB_MVFR0 (FPUBase->MVFR0) -#define SCB_MVFR1 (FPUBase->MVFR1) - -#define FPCCR_ASPEN (0x1U << 31) -#define FPCCR_LSPEN (0x1U << 30) -#define FPCCR_MONRDY (0x1U << 8) -#define FPCCR_BFRDY (0x1U << 6) -#define FPCCR_MMRDY (0x1U << 5) -#define FPCCR_HFRDY (0x1U << 4) -#define FPCCR_THREAD (0x1U << 3) -#define FPCCR_USER (0x1U << 1) -#define FPCCR_LSPACT (0x1U << 0) - -#define FPDSCR_AHP (0x1U << 26) -#define FPDSCR_DN (0x1U << 25) -#define FPDSCR_FZ (0x1U << 24) -#define FPDSCR_RMODE(n) ((n##U) << 22) - -/** - * @brief Structure representing the SCS I/O space. - */ -typedef struct { - IOREG32 DHCSR; - IOREG32 DCRSR; - IOREG32 DCRDR; - IOREG32 DEMCR; -} CMx_SCS; - -/** - * @brief SCS peripheral base address. - */ -#define SCSBase ((CMx_SCS *)0xE000EDF0U) -#define SCS_DHCSR (SCSBase->DHCSR) -#define SCS_DCRSR (SCSBase->DCRSR) -#define SCS_DCRDR (SCSBase->DCRDR) -#define SCS_DEMCR (SCSBase->DEMCR) - -#define SCS_DEMCR_TRCENA (0x1U << 24) - -/** - * @brief Structure representing the DWT I/O space. - */ -typedef struct { - IOREG32 CTRL; - IOREG32 CYCCNT; - IOREG32 CPICNT; - IOREG32 EXCCNT; - IOREG32 SLEEPCNT; - IOREG32 LSUCNT; - IOREG32 FOLDCNT; - IOREG32 PCSR; -} CMx_DWT; - -/** - * @brief DWT peripheral base address. - */ -#define DWTBase ((CMx_DWT *)0xE0001000U) -#define DWT_CTRL (DWTBase->CTRL) -#define DWT_CYCCNT (DWTBase->CYCCNT) -#define DWT_CPICNT (DWTBase->CPICNT) -#define DWT_EXCCNT (DWTBase->EXCCNT) -#define DWT_SLEEPCNT (DWTBase->SLEEPCNT) -#define DWT_LSUCNT (DWTBase->LSUCNT) -#define DWT_FOLDCNT (DWTBase->FOLDCNT) -#define DWT_PCSR (DWTBase->PCSR) - -#define DWT_CTRL_CYCCNTENA (0x1U << 0) - -#ifdef __cplusplus -extern "C" { -#endif - void nvicEnableVector(uint32_t n, uint32_t prio); - void nvicDisableVector(uint32_t n); - void nvicSetSystemHandlerPriority(uint32_t handler, uint32_t prio); -#ifdef __cplusplus -} -#endif - -#endif /* _NVIC_H_ */ - -/** @} */ diff --git a/os/ports/common/ARMCMx/port.dox b/os/ports/common/ARMCMx/port.dox deleted file mode 100644 index 3f12ea1e5c..0000000000 --- a/os/ports/common/ARMCMx/port.dox +++ /dev/null @@ -1,34 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup COMMON_ARMCMx ARM Cortex-Mx Common Code - * @ingroup port_common - */ - -/** - * @defgroup COMMON_ARMCMx_NVIC NVIC Support - * @details ARM Cortex-Mx NVIC support. - * - * @ingroup COMMON_ARMCMx - */ - - /** @} */ - \ No newline at end of file diff --git a/os/ports/cosmic/.empty b/os/ports/cosmic/.empty new file mode 100644 index 0000000000..da1585c347 --- /dev/null +++ b/os/ports/cosmic/.empty @@ -0,0 +1 @@ +I'm a folder! \ No newline at end of file diff --git a/os/ports/cosmic/STM8/chcore.c b/os/ports/cosmic/STM8/chcore.c deleted file mode 100644 index 38abccb6d8..0000000000 --- a/os/ports/cosmic/STM8/chcore.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file cosmic/STM8/chcore.c - * @brief STM8 (Cosmic) architecture port code. - * - * @addtogroup STM8_COSMIC_CORE - * @{ - */ - -#include "ch.h" - -@tiny ReadyList rlist; - -/** - * @brief Performs a context switch between two threads. - * - * @param otp the thread to be switched out - */ -void _port_switch(Thread *otp) { - - _asm(" xref _rlist \n" - " ldw y,sp \n" - " ldw (5,x),y \n" - " ldw x,_rlist+5 \n" - " ldw x,(5,x) \n" - " ldw sp,x \n", otp); -} - -/** - * @brief Thread start code. - */ -void _port_thread_start(void) { - - chSysUnlock(); - _asm(" popw x \n"); -} - -/** - * @brief Halts the system. - * @details This function is invoked by the operating system when an - * unrecoverable error is detected (for example because a programming - * error in the application code that triggers an assertion while in - * debug mode). - */ -void port_halt(void) { - - port_disable(); - while (TRUE) { - } -} - -/** @} */ diff --git a/os/ports/cosmic/STM8/chcore.h b/os/ports/cosmic/STM8/chcore.h deleted file mode 100644 index 73ceebeb72..0000000000 --- a/os/ports/cosmic/STM8/chcore.h +++ /dev/null @@ -1,332 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file cosmic/STM8/chcore.h - * @brief STM8 (Cosmic) architecture port macros and structures. - * - * @addtogroup STM8_COSMIC_CORE - * @{ - */ - -#ifndef _CHCORE_H_ -#define _CHCORE_H_ - -#if CH_DBG_ENABLE_STACK_CHECK -#error "option CH_DBG_ENABLE_STACK_CHECK not supported by this port" -#endif - -/*===========================================================================*/ -/* Port configurable parameters. */ -/*===========================================================================*/ - -/** - * @brief Enables the use of the WFI instruction in the idle thread loop. - */ -#ifndef STM8_ENABLE_WFI_IDLE -#define STM8_ENABLE_WFI_IDLE FALSE -#endif - -/*===========================================================================*/ -/* Port exported info. */ -/*===========================================================================*/ - -/** - * @brief Unique macro for the implemented architecture. - */ -#define CH_ARCHITECTURE_STM8 - -/** - * @brief Name of the implemented architecture. - */ -#define CH_ARCHITECTURE_NAME "STM8" - -/** - * @brief Name of the compiler supported by this port. - */ -#define CH_COMPILER_NAME "Cosmic" - -/** - * @brief Port-specific information string. - */ -#define CH_PORT_INFO "None" - -/*===========================================================================*/ -/* Port implementation part. */ -/*===========================================================================*/ - -/** - * @brief Base type for stack alignment. - * @note No alignment constraints so uint8_t. - */ -typedef uint8_t stkalign_t; - -/** - * @brief Generic STM8 function pointer. - * @note It is used to allocate the proper size for return addresses in - * context-related structures. - */ -typedef void (*stm8func_t)(void); - -/** - * @brief Interrupt saved context. - * @details This structure represents the stack frame saved during a - * preemption-capable interrupt handler. - * @note The structure requires one dummy field at its start because the - * stack is handled as preincremented/postdecremented. - */ -struct extctx { - uint8_t _next; - uint8_t c_lreg[4]; - uint8_t c_y[3]; - uint8_t c_x[3]; - uint8_t cc; - uint8_t a; - uint16_t x; - uint16_t y; - uint8_t pce; - uint8_t pch; - uint8_t pcl; -}; - -/** - * @brief System saved context. - * @details This structure represents the inner stack frame during a context - * switching.. - * @note The structure requires one dummy field at its start because the - * stack is handled as preincremented/postdecremented. - */ -struct intctx { - uint8_t _next; - stm8func_t pc; /* Function pointer sized return address. */ -}; - -/** - * @brief Platform dependent part of the @p Thread structure. - * @details This structure usually contains just the saved stack pointer - * defined as a pointer to a @p intctx structure. - */ -struct context { - struct intctx *sp; -}; - -/** - * @brief Start context. - * @details This context is the stack organization for the trampoline code - * @p _port_thread_start(). - */ -struct stm8_startctx { - uint8_t _next; - stm8func_t ts; /* Trampoline address. */ - void *arg; /* Thread argument. */ - stm8func_t pc; /* Thread function address. */ - stm8func_t ret; /* chThdExit() address. */ -}; - -/** - * @brief Platform dependent part of the @p chThdCreateI() API. - * @details This code usually setup the context switching frame represented - * by an @p intctx structure. - */ -#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ - struct stm8_startctx *scp; \ - scp = (struct stm8_startctx *)((uint8_t *)workspace + wsize - \ - sizeof(struct stm8_startctx)); \ - scp->ts = _port_thread_start; \ - scp->arg = arg; \ - scp->pc = (stm8func_t)pf; \ - scp->ret = (stm8func_t)chThdExit; \ - tp->p_ctx.sp = (struct intctx *)scp; \ -} - -/** - * @brief Stack size for the system idle thread. - * @details This size depends on the idle thread implementation, usually - * the idle thread should take no more space than those reserved - * by @p PORT_INT_REQUIRED_STACK. - */ -#ifndef PORT_IDLE_THREAD_STACK_SIZE -#define PORT_IDLE_THREAD_STACK_SIZE 0 -#endif - -/** - * @brief Per-thread stack overhead for interrupts servicing. - * @details This is a safe value, you may trim it down after reading the - * right size in the map file. - */ -#ifndef PORT_INT_REQUIRED_STACK -#define PORT_INT_REQUIRED_STACK 48 -#endif - -/** - * @brief Enforces a correct alignment for a stack area size value. - */ -#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1) - -/** - * @brief Computes the thread working area global size. - */ -#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(Thread) + \ - (sizeof(struct intctx) - 1) + \ - (sizeof(struct extctx) - 1) + \ - (n) + (PORT_INT_REQUIRED_STACK)) - -/** - * @brief Static working area allocation. - * @details This macro is used to allocate a static thread working area - * aligned as both position and size. - */ -#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)] - -/** - * @brief IRQ prologue code. - * @details This macro must be inserted at the start of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_PROLOGUE() - -/** - * @brief IRQ epilogue code. - * @details This macro must be inserted at the end of all IRQ handlers - * enabled to invoke system APIs. - */ -#define PORT_IRQ_EPILOGUE() { \ - dbg_check_lock(); \ - if (chSchIsPreemptionRequired()) \ - chSchDoReschedule(); \ - dbg_check_unlock(); \ -} - -/** - * @brief IRQ handler function declaration. - * @note @p id can be a function name or a vector number depending on the - * port implementation. - */ -#define PORT_IRQ_HANDLER(id) @far @interrupt @svlreg void vector##id(void) - -/** - * @brief Port-related initialization code. - * @note None in this port. - */ -#define port_init() - -/** - * @brief Kernel-lock action. - * @note Implemented as global interrupts disable. - */ -#define port_lock() _asm("sim") - -/** - * @brief Kernel-unlock action. - * @note Implemented as global interrupts enable. - */ -#define port_unlock() _asm("rim") - -/** - * @brief Kernel-lock action from an interrupt handler. - * @note This function is empty in this port. - */ -#define port_lock_from_isr() - -/** - * @brief Kernel-unlock action from an interrupt handler. - * @note This function is empty in this port. - */ -#define port_unlock_from_isr() - -/** - * @brief Disables all the interrupt sources. - * @note Implemented as global interrupts disable. - * @note Of course non-maskable interrupt sources are not included. - */ -#define port_disable() _asm("sim") - -/** - * @brief Disables the interrupt sources that are not supposed to preempt - * the kernel. - * @note Same as @p port_disable() in this port, there is no difference - * between the two states. - */ -#define port_suspend() _asm("sim") - -/** - * @brief Enables all the interrupt sources. - * @note Implemented as global interrupt enable. - */ -#define port_enable() _asm("rim") - -/** - * @brief Enters an architecture-dependent halt mode. - * @note Implemented with the specific "wfi" instruction. - */ -#if STM8_ENABLE_WFI_IDLE || defined(__DOXYGEN__) -#define port_wait_for_interrupt() _asm("wfi") -#else -#define port_wait_for_interrupt() -#endif - -/** - * @brief Performs a context switch between two threads. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. - * @note Implemented as a call to a low level assembler routine. - * - * @param ntp the thread to be switched in - * @param otp the thread to be switched out - */ -#define port_switch(ntp, otp) _port_switch(otp) - -#ifdef __cplusplus -extern "C" { -#endif - void _port_switch(Thread *otp); - void _port_thread_start(void); - void port_halt(void); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Scheduler captured code. */ -/*===========================================================================*/ - -#define PORT_OPTIMIZED_RLIST_VAR -#define PORT_OPTIMIZED_RLIST_EXT -#define PORT_OPTIMIZED_READYLIST_STRUCT - -typedef struct { - ThreadsQueue r_queue; - tprio_t r_prio; - Thread *r_current; -#if CH_USE_REGISTRY - Thread *r_newer; - Thread *r_older; -#endif - /* End of the fields shared with the Thread structure.*/ -#if CH_TIME_QUANTUM > 0 - cnt_t r_preempt; -#endif -} ReadyList; - -@tiny extern ReadyList rlist; - -#endif /* _CHCORE_H_ */ - -/** @} */ diff --git a/os/ports/cosmic/STM8/chtypes.h b/os/ports/cosmic/STM8/chtypes.h deleted file mode 100644 index 48c9271c7d..0000000000 --- a/os/ports/cosmic/STM8/chtypes.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file cosmic/STM8/chtypes.h - * @brief STM8 (Cosmic) port system types. - * - * @addtogroup STM8_COSMIC_CORE - * @{ - */ - -#ifndef _CHTYPES_H_ -#define _CHTYPES_H_ - -#define __need_NULL -#define __need_size_t -#include - -//#if !defined(_STDINT_H) && !defined(__STDINT_H_) -//#include -//#endif - -typedef unsigned char uint8_t; /**< C99-style 8 bits unsigned. */ -typedef signed char int8_t; /**< C99-style 8 bits signed. */ -typedef unsigned int uint16_t; /**< C99-style 16 bits unsigned. */ -typedef signed int int16_t; /**< C99-style 16 bits signed. */ -typedef unsigned long uint32_t; /**< C99-style 32 bits unsigned. */ -typedef signed long int32_t; /**< C99-style 32 bits signed. */ -typedef uint8_t uint_fast8_t; /**< C99-style 8 bits unsigned. */ -typedef uint16_t uint_fast16_t; /**< C99-style 16 bits unsigned. */ -typedef uint32_t uint_fast32_t; /**< C99-style 32 bits unsigned. */ - -typedef int8_t bool_t; /**< Fast boolean type. */ -typedef uint8_t tmode_t; /**< Thread flags. */ -typedef uint8_t tstate_t; /**< Thread state. */ -typedef uint8_t trefs_t; /**< Thread references counter. */ -typedef uint8_t tslices_t; /**< Thread time slices counter. */ -typedef uint8_t tprio_t; /**< Thread priority. */ -typedef int16_t msg_t; /**< Inter-thread message. */ -typedef int8_t eventid_t; /**< Event Id. */ -typedef uint8_t eventmask_t; /**< Event mask. */ -typedef uint8_t flagsmask_t; /**< Event flags. */ -typedef uint16_t systime_t; /**< System time. */ -typedef int8_t cnt_t; /**< Resources counter. */ - -/** - * @brief Inline function modifier. - */ -#define INLINE @inline - -/** - * @brief ROM constant modifier. - * @note Uses the "const" keyword in this port. - */ -#define ROMCONST const - -/** - * @brief Packed structure modifier (within). - * @note Empty in this port. - */ -#define PACK_STRUCT_STRUCT - -/** - * @brief Packed structure modifier (before). - * @note Empty in this port. - */ -#define PACK_STRUCT_BEGIN - -/** - * @brief Packed structure modifier (after). - * @note Empty in this port. - */ -#define PACK_STRUCT_END - -#endif /* _CHTYPES_H_ */ - -/** @} */ diff --git a/os/ports/cosmic/STM8/port.dox b/os/ports/cosmic/STM8/port.dox deleted file mode 100644 index 339b2e69b1..0000000000 --- a/os/ports/cosmic/STM8/port.dox +++ /dev/null @@ -1,95 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup STM8_COSMIC STM8 - * @details STM8 port for the Cosmic C compiler. - * - * @section STM8_COSMIC_INTRO Introduction - * This port supports all STM8 8 bits MCUs. - * - * @section STM8_COSMIC_STATES Mapping of the System States in the STM8 port - * The ChibiOS/RT logical @ref system_states are mapped as follow in the STM8 - * port: - * - Init. This state is represented by the startup code and the - * initialization code before @p chSysInit() is executed. It has not a - * special hardware state associated. - * - Normal. This is the state the system has after executing - * @p chSysInit(). Interrupts are enabled. - * - Suspended. Interrupts are disabled. - * - Disabled. Interrupts are disabled. This state is equivalent to the - * Suspended state because there are no fast interrupts in this architecture. - * - Sleep. Implemented with "wait" instruction insertion in the idle - * loop. - * - S-Locked. Interrupts are disabled. - * - I-Locked. This state is equivalent to the SRI state, the - * @p chSysLockI() and @p chSysUnlockI() APIs do nothing (still use them in - * order to formally change state because this may change). - * - Serving Regular Interrupt. Normal interrupt service code. - * - Serving Fast Interrupt. Not present in this architecture. - * - Serving Non-Maskable Interrupt. The STM8 ha non - * maskable interrupt sources that can be associated to this state. - * - Halted. Implemented as an infinite loop with interrupts disabled. - * . - * @section STM8_COSMIC_NOTES The STM8 port notes - * - The STM8 does not have a dedicated interrupt stack, make sure to reserve - * enough stack space for interrupts in each thread stack. This can be done - * by modifying the @p INT_REQUIRED_STACK macro into - * ./os/ports/cosmic/STM8/chcore.h. - * - The kernel currently supports only the small memory model so the - * kernel files should be loaded in the first 64K. Note that this is not - * a problem because upper addresses can be used by the user code, the - * kernel can context switch code running there. - * - The configuration option @p CH_OPTIMIZE_SPEED is not currently supported - * because the missing support of the @p inline "C" keyword in the - * compiler. - * . - * @ingroup cosmic - */ - -/** - * @defgroup STM8_COSMIC_CONF Configuration Options - * @details STM8 Configuration Options. The STM8 port allows some - * architecture-specific configurations settings that can be overridden - * by redefining them in @p chconf.h. Usually there is no need to change - * the default values. - * - @p INT_REQUIRED_STACK, this value represent the amount of stack space - * used by the interrupt handlers.
    - * The default for this value is @p 48, this space is allocated for each - * thread so be careful in order to not waste precious RAM space. - * . - * @ingroup STM8_COSMIC - */ - -/** - * @defgroup STM8_COSMIC_CORE Core Port Implementation - * @details STM8 specific port code, structures and macros. - * - * @ingroup STM8_COSMIC - */ - - /** - * @defgroup STM8_COSMIC_STARTUP Startup Support - * @details ChibiOS/RT doed not provide startup files for the STM8, there - * are no special startup requirement so the normal toolchain-provided - * startup files can be used. - * - * @ingroup STM8_COSMIC - */ diff --git a/os/various/shell.c b/os/various/shell.c index 611da6de02..c21549cb0a 100644 --- a/os/various/shell.c +++ b/os/various/shell.c @@ -284,7 +284,7 @@ bool_t shellGetLine(BaseSequentialStream *chp, char *line, unsigned size) { chSequentialStreamPut(chp, c); *p++ = (char)c; } - } + } } /** @} */ diff --git a/os/various/syscalls.c b/os/various/syscalls.c index c945040a7f..252028c7f1 100644 --- a/os/various/syscalls.c +++ b/os/various/syscalls.c @@ -71,9 +71,6 @@ /***************************************************************************/ -///* The ABI requires a 64-bit type. */ -__extension__ typedef int __guard __attribute__((mode (__DI__))); - int _read_r(struct _reent *r, int file, char * ptr, int len) { (void)r; @@ -176,25 +173,4 @@ int _isatty_r(struct _reent *r, int fd) return 1; } -// FIXME: Stubs - HATE THEM -void _exit(int status){ - (void) status; - chSysHalt(); - - while(TRUE){} -} - -pid_t _getpid(void){ - return 1; -} - -void _kill(pid_t id){ - (void) id; -} - -/* guard variables */ -int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);}; -void __cxa_guard_release (__guard *g) {*(char *)g = 1;}; -void __cxa_guard_abort (__guard * g __attribute__((unused))) {}; - /*** EOF ***/ diff --git a/test/coverage/Makefile b/test/coverage/Makefile deleted file mode 100644 index d19014202d..0000000000 --- a/test/coverage/Makefile +++ /dev/null @@ -1,156 +0,0 @@ -# -# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!! -# -############################################################################################## -# -# On command line: -# -# make all = Create project -# -# make clean = Clean project files. -# -# To rebuild project do "make clean" and "make all". -# - -############################################################################################## -# Start of default section -# - -TRGT = mingw32- -CC = $(TRGT)gcc -AS = $(TRGT)gcc -x assembler-with-cpp -COV = gcov - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSIMULATOR - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = -lws2_32 - -# Must be a directory in ${CHIBIOS}/os/hal/platforms -HOST_TYPE = Win32 - -# -# End of default section -############################################################################################## - -############################################################################################## -# Start of user section -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# Imported source files -CHIBIOS = ../.. -include $(CHIBIOS)/boards/simulator/board.mk -include ${CHIBIOS}/os/hal/hal.mk -include ${CHIBIOS}/os/hal/platforms/$(HOST_TYPE)/platform.mk -include ${CHIBIOS}/os/ports/GCC/SIMIA32/port.mk -include ${CHIBIOS}/os/kernel/kernel.mk -include ${CHIBIOS}/test/test.mk - -# List C source files here -SRC = ${PORTSRC} \ - ${KERNSRC} \ - ${TESTSRC} \ - ${HALSRC} \ - ${PLATFORMSRC} \ - $(BOARDSRC) \ - ${CHIBIOS}/os/hal/platforms/$(HOST_TYPE)/console.c \ - main.c - -# List ASM source files here -ASRC = - -# List all user directories here -UINCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# Define optimisation level here -OPT = -ggdb -O0 -fomit-frame-pointer -fprofile-arcs -ftest-coverage - -# -# End of user defines -############################################################################################## - - -INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR)) -LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) -DEFS = $(DDEFS) $(UDEFS) -ADEFS = $(DADEFS) $(UADEFS) -OBJS = $(ASRC:.s=.o) $(SRC:.c=.o) -LIBS = $(DLIBS) $(ULIBS) - -LDFLAGS = -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch -lgcov $(LIBDIR) -ASFLAGS = -Wa,-amhls=$(<:.s=.lst) $(ADEFS) -CPFLAGS = $(OPT) -Wall -Wextra -Wstrict-prototypes -fverbose-asm -Wa,-alms=$(<:.c=.lst) $(DEFS) - -# Generate dependency information -CPFLAGS += -MD -MP -MF .dep/$(@F).d - -# -# makefile rules -# - -all: $(OBJS) $(PROJECT).exe - -%o : %c - $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ - -%o : %s - $(AS) -c $(ASFLAGS) $< -o $@ - -%exe: $(OBJS) - $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ - -.PHONY: gcov -gcov: - -mkdir gcov - $(COV) -u $(subst /,\,$(KERNSRC)) - -mv -f *.gcov ./gcov - -.PHONY: clean -clean: - -rm -f $(OBJS) - -rm -f $(PROJECT).exe - -rm -f $(PROJECT).map - -rm -f $(SRC:.c=.c.bak) - -rm -f $(SRC:.c=.lst) - -rm -f $(SRC:.c=.gcno) - -rm -f $(SRC:.c=.gcda) - -rm -f $(ASRC:.s=.s.bak) - -rm -f $(ASRC:.s=.lst) - -rm -fR .dep - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/test/coverage/chconf.h b/test/coverage/chconf.h deleted file mode 100644 index 9db485f525..0000000000 --- a/test/coverage/chconf.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0x20000 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/test/coverage/halconf.h b/test/coverage/halconf.h deleted file mode 100644 index 991f7cd1b9..0000000000 --- a/test/coverage/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -/*#include "mcuconf.h"*/ - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL FALSE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/test/coverage/main.c b/test/coverage/main.c deleted file mode 100644 index 16c2702ecd..0000000000 --- a/test/coverage/main.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" -#include "console.h" - -/* - * Simulator main. - */ -int main(int argc, char *argv[]) { - msg_t result; - - (void)argc; - (void)argv; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - conInit(); - chSysInit(); - - result = TestThread(&CD1); - if (result) - exit(1); - else - exit(0); -} diff --git a/test/coverage/readme.txt b/test/coverage/readme.txt deleted file mode 100644 index fc35951125..0000000000 --- a/test/coverage/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -In order to compute the code coverage: - -- Build the test application: make -- Run the test suite: ch -- Compute the code coverage: make gcov -- Clear everything: make clean diff --git a/test/test.c b/test/test.c deleted file mode 100644 index e6ee8e0ceb..0000000000 --- a/test/test.c +++ /dev/null @@ -1,394 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file test.c - * @brief Tests support code. - * - * @addtogroup test - * @{ - */ - -#include "ch.h" -#include "hal.h" - -#include "test.h" -#include "testthd.h" -#include "testsem.h" -#include "testmtx.h" -#include "testmsg.h" -#include "testmbox.h" -#include "testevt.h" -#include "testheap.h" -#include "testpools.h" -#include "testdyn.h" -#include "testqueues.h" -#include "testbmk.h" - -/* - * Array of all the test patterns. - */ -static ROMCONST struct testcase * ROMCONST *patterns[] = { - patternthd, - patternsem, - patternmtx, - patternmsg, - patternmbox, - patternevt, - patternheap, - patternpools, - patterndyn, - patternqueues, - patternbmk, - NULL -}; - -static bool_t local_fail, global_fail; -static unsigned failpoint; -static char tokens_buffer[MAX_TOKENS]; -static char *tokp; - -/* - * Static working areas, the following areas can be used for threads or - * used as temporary buffers. - */ -union test_buffers test; - -/* - * Pointers to the spawned threads. - */ -Thread *threads[MAX_THREADS]; - -/* - * Pointers to the working areas. - */ -void * ROMCONST wa[5] = {test.wa.T0, test.wa.T1, test.wa.T2, - test.wa.T3, test.wa.T4}; - -/* - * Console output. - */ -static BaseSequentialStream *chp; - -/** - * @brief Prints a decimal unsigned number. - * - * @param[in] n the number to be printed - */ -void test_printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(chp, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(chp, *--p); - } -} - -/** - * @brief Prints a line without final end-of-line. - * - * @param[in] msgp the message - */ -void test_print(const char *msgp) { - - while (*msgp) - chSequentialStreamPut(chp, *msgp++); -} - -/** - * @brief Prints a line. - * - * @param[in] msgp the message - */ -void test_println(const char *msgp) { - - test_print(msgp); - chSequentialStreamWrite(chp, (const uint8_t *)"\r\n", 2); -} - -/* - * Tokens. - */ -static void clear_tokens(void) { - - tokp = tokens_buffer; -} - -static void print_tokens(void) { - char *cp = tokens_buffer; - - while (cp < tokp) - chSequentialStreamPut(chp, *cp++); -} - -/** - * @brief Emits a token into the tokens buffer. - * - * @param[in] token the token as a char - */ -void test_emit_token(char token) { - - chSysLock(); - *tokp++ = token; - chSysUnlock(); -} - -/* - * Assertions. - */ -bool_t _test_fail(unsigned point) { - - local_fail = TRUE; - global_fail = TRUE; - failpoint = point; - return TRUE; -} - -bool_t _test_assert(unsigned point, bool_t condition) { - - if (!condition) - return _test_fail(point); - return FALSE; -} - -bool_t _test_assert_sequence(unsigned point, char *expected) { - char *cp = tokens_buffer; - while (cp < tokp) { - if (*cp++ != *expected++) - return _test_fail(point); - } - if (*expected) - return _test_fail(point); - clear_tokens(); - return FALSE; -} - -bool_t _test_assert_time_window(unsigned point, systime_t start, systime_t end) { - - return _test_assert(point, chTimeIsWithin(start, end)); -} - -/* - * Threads utils. - */ - -/** - * @brief Sets a termination request in all the test-spawned threads. - */ -void test_terminate_threads(void) { - int i; - - for (i = 0; i < MAX_THREADS; i++) - if (threads[i]) - chThdTerminate(threads[i]); -} - -/** - * @brief Waits for the completion of all the test-spawned threads. - */ -void test_wait_threads(void) { - int i; - - for (i = 0; i < MAX_THREADS; i++) - if (threads[i] != NULL) { - chThdWait(threads[i]); - threads[i] = NULL; - } -} - -#if CH_DBG_THREADS_PROFILING -/** - * @brief CPU pulse. - * @note The current implementation is not totally reliable. - * - * @param[in] duration CPU pulse duration in milliseconds - */ -void test_cpu_pulse(unsigned duration) { - systime_t start, end, now; - - start = chThdSelf()->p_time; - end = start + MS2ST(duration); - do { - now = chThdSelf()->p_time; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } - while (end > start ? (now >= start) && (now < end) : - (now >= start) || (now < end)); -} -#endif - -/** - * @brief Delays execution until next system time tick. - * - * @return The system time. - */ -systime_t test_wait_tick(void) { - - chThdSleep(1); - return chTimeNow(); -} - -/* - * Timer utils. - */ - -/** - * @brief Set to @p TRUE when the test timer reaches its deadline. - */ -bool_t test_timer_done; - -static VirtualTimer vt; -static void tmr(void *p) { - (void)p; - - test_timer_done = TRUE; -} - -/** - * @brief Starts the test timer. - * - * @param[in] ms time in milliseconds - */ -void test_start_timer(unsigned ms) { - - systime_t duration = MS2ST(ms); - test_timer_done = FALSE; - chVTSet(&vt, duration, tmr, NULL); -} - -/* - * Test suite execution. - */ -static void execute_test(const struct testcase *tcp) { - int i; - - /* Initialization */ - clear_tokens(); - local_fail = FALSE; - for (i = 0; i < MAX_THREADS; i++) - threads[i] = NULL; - - if (tcp->setup != NULL) - tcp->setup(); - tcp->execute(); - if (tcp->teardown != NULL) - tcp->teardown(); - - test_wait_threads(); -} - -static void print_line(void) { - unsigned i; - - for (i = 0; i < 76; i++) - chSequentialStreamPut(chp, '-'); - chSequentialStreamWrite(chp, (const uint8_t *)"\r\n", 2); -} - -/** - * @brief Test execution thread function. - * - * @param[in] p pointer to a @p BaseChannel object for test output - * @return A failure boolean value. - */ -msg_t TestThread(void *p) { - int i, j; - - chp = p; - test_println(""); - test_println("*** ChibiOS/RT test suite"); - test_println("***"); - test_print("*** Kernel: "); - test_println(CH_KERNEL_VERSION); - test_print("*** Compiled: "); - test_println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - test_print("*** Compiler: "); - test_println(CH_COMPILER_NAME); -#endif - test_print("*** Architecture: "); - test_println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - test_print("*** Core Variant: "); - test_println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - test_print("*** Port Info: "); - test_println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - test_print("*** Platform: "); - test_println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - test_print("*** Test Board: "); - test_println(BOARD_NAME); -#endif - test_println(""); - - global_fail = FALSE; - i = 0; - while (patterns[i]) { - j = 0; - while (patterns[i][j]) { - print_line(); - test_print("--- Test Case "); - test_printn(i + 1); - test_print("."); - test_printn(j + 1); - test_print(" ("); - test_print(patterns[i][j]->name); - test_println(")"); -#if DELAY_BETWEEN_TESTS > 0 - chThdSleepMilliseconds(DELAY_BETWEEN_TESTS); -#endif - execute_test(patterns[i][j]); - if (local_fail) { - test_print("--- Result: FAILURE (#"); - test_printn(failpoint); - test_print(" ["); - print_tokens(); - test_println("])"); - } - else - test_println("--- Result: SUCCESS"); - j++; - } - i++; - } - print_line(); - test_println(""); - test_print("Final result: "); - if (global_fail) - test_println("FAILURE"); - else - test_println("SUCCESS"); - - return (msg_t)global_fail; -} - -/** @} */ diff --git a/test/test.dox b/test/test.dox deleted file mode 100644 index 9474d5386a..0000000000 --- a/test/test.dox +++ /dev/null @@ -1,86 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup test Test Runtime - * @details Runtime code for the test suite execution, this code is not part - * of the OS and should not be included in user applications. - */ - -/** - * @page testsuite Testing Strategy - *

    Description

    - * Most of the ChibiOS/RT demos link a set of software modules (test suite) in - * order to verify the proper working of the kernel, the port and the demo - * itself. - * - *

    Strategy by Component

    - * The OS components are tested in various modes depending on their importance: - * - Kernel. The kernel code is subject to rigorous testing. The test - * suite aims to test all the kernel code and reach a code coverage - * as close to 100% as possible. In addition to the code coverage, the kernel - * code is tested for functionality and benchmarked for speed - * and size before each stable release. In addition to the code - * coverage and functional testing a batch compilation test is - * performed before each release, the kernel is compiled by alternatively - * enabling and disabling all the various configuration options, the - * kernel code is expected to compile without errors nor warnings and - * execute the test suite without failures (a specific simulator is used - * for this execution test, it is done automatically by a script because - * the entire sequence can take hours).
    - * All the tests results are included as reports in the OS distribution - * under ./docs/reports. - * - Ports. The port code is tested by executing the kernel test - * suite on the target hardware. A port is validated only if it passes all - * the tests. Speed and size benchmarks for all the supported architectures - * are performed, both size and speed regressions are monitored. - * - HAL. The HAL high level code and device drivers implementations - * are tested through specific test applications under ./testhal. - * - Various. The miscellaneous code is tested by use in the various - * demos. - * - External Code. Not tested, external libraries or components are - * used as-is or with minor patching where required, problems are usually - * reported upstream. - * . - *

    Kernel Test Suite

    - * The kernel test suite is divided in modules or test sequences. Each Test - * Module performs a series of tests on a specified kernel subsystem or - * subsystems and can report a failure/success status and/or a performance - * index as the test suite output.
    - * The test suite is usually activated in the demo applications by pressing a - * button on the target board, see the readme file into the various demos - * directories. The test suite output is usually sent through a serial port - * and can be examined by using a terminal emulator program. - * - *

    Kernel Test Modules

    - * - * - @subpage test_threads - * - @subpage test_dynamic - * - @subpage test_msg - * - @subpage test_sem - * - @subpage test_mtx - * - @subpage test_events - * - @subpage test_mbox - * - @subpage test_queues - * - @subpage test_heap - * - @subpage test_pools - * - @subpage test_benchmarks - * . - */ diff --git a/test/test.h b/test/test.h deleted file mode 100644 index f4d8e10863..0000000000 --- a/test/test.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file test.h - * @brief Tests support header. - * - * @addtogroup test - * @{ - */ - -#ifndef _TEST_H_ -#define _TEST_H_ - -/** - * @brief Delay inserted between test cases. - */ -#if !defined(DELAY_BETWEEN_TESTS) || defined(__DOXYGEN__) -#define DELAY_BETWEEN_TESTS 200 -#endif - -/** - * @brief If @p TRUE then benchmarks are not included. - */ -#if !defined(TEST_NO_BENCHMARKS) || defined(__DOXYGEN__) -#define TEST_NO_BENCHMARKS FALSE -#endif - -#define MAX_THREADS 5 -#define MAX_TOKENS 16 - -#if defined(CH_ARCHITECTURE_AVR) || defined(CH_ARCHITECTURE_MSP430) -#define THREADS_STACK_SIZE 48 -#elif defined(CH_ARCHITECTURE_STM8) -#define THREADS_STACK_SIZE 64 -#elif defined(CH_ARCHITECTURE_SIMIA32) -#define THREADS_STACK_SIZE 512 -#else -#define THREADS_STACK_SIZE 128 -#endif -#define WA_SIZE THD_WA_SIZE(THREADS_STACK_SIZE) - -/** - * @brief Structure representing a test case. - */ -struct testcase { - const char *name; /**< @brief Test case name. */ - void (*setup)(void); /**< @brief Test case preparation function. */ - void (*teardown)(void); /**< @brief Test case clean up function. */ - void (*execute)(void); /**< @brief Test case execution function. */ -}; - -#ifndef __DOXYGEN__ -union test_buffers { - struct { - WORKING_AREA(T0, THREADS_STACK_SIZE); - WORKING_AREA(T1, THREADS_STACK_SIZE); - WORKING_AREA(T2, THREADS_STACK_SIZE); - WORKING_AREA(T3, THREADS_STACK_SIZE); - WORKING_AREA(T4, THREADS_STACK_SIZE); - } wa; - uint8_t buffer[WA_SIZE * 5]; -}; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - msg_t TestThread(void *p); - void test_printn(uint32_t n); - void test_print(const char *msgp); - void test_println(const char *msgp); - void test_emit_token(char token); - bool_t _test_fail(unsigned point); - bool_t _test_assert(unsigned point, bool_t condition); - bool_t _test_assert_sequence(unsigned point, char *expected); - bool_t _test_assert_time_window(unsigned point, systime_t start, systime_t end); - void test_terminate_threads(void); - void test_wait_threads(void); - systime_t test_wait_tick(void); - void test_start_timer(unsigned ms); -#if CH_DBG_THREADS_PROFILING - void test_cpu_pulse(unsigned duration); -#endif -#if defined(WIN32) - void ChkIntSources(void); -#endif -#ifdef __cplusplus -} -#endif - -/** - * @brief Test failure enforcement. - */ -#define test_fail(point) { \ - _test_fail(point); \ - return; \ -} - -/** - * @brief Test assertion. - * - * @param[in] point numeric assertion identifier - * @param[in] condition a boolean expression that must be verified to be true - * @param[in] msg failure message - */ -#define test_assert(point, condition, msg) { \ - if (_test_assert(point, condition)) \ - return; \ -} - -/** - * @brief Test assertion with lock. - * - * @param[in] point numeric assertion identifier - * @param[in] condition a boolean expression that must be verified to be true - * @param[in] msg failure message - */ -#define test_assert_lock(point, condition, msg) { \ - chSysLock(); \ - if (_test_assert(point, condition)) { \ - chSysUnlock(); \ - return; \ - } \ - chSysUnlock(); \ -} - -/** - * @brief Test sequence assertion. - * - * @param[in] point numeric assertion identifier - * @param[in] expected string to be matched with the tokens buffer - */ -#define test_assert_sequence(point, expected) { \ - if (_test_assert_sequence(point, expected)) \ - return; \ -} - -/** - * @brief Test time window assertion. - * - * @param[in] point numeric assertion identifier - * @param[in] start initial time in the window (included) - * @param[in] end final time in the window (not included) - */ -#define test_assert_time_window(point, start, end) { \ - if (_test_assert_time_window(point, start, end)) \ - return; \ -} - -#if !defined(__DOXYGEN__) -extern Thread *threads[MAX_THREADS]; -extern union test_buffers test; -extern void * ROMCONST wa[]; -extern bool_t test_timer_done; -#endif - -#endif /* _TEST_H_ */ - -/** @} */ diff --git a/test/test.mk b/test/test.mk deleted file mode 100644 index 3f740288c7..0000000000 --- a/test/test.mk +++ /dev/null @@ -1,16 +0,0 @@ -# List of all the ChibiOS/RT test files. -TESTSRC = ${CHIBIOS}/test/test.c \ - ${CHIBIOS}/test/testthd.c \ - ${CHIBIOS}/test/testsem.c \ - ${CHIBIOS}/test/testmtx.c \ - ${CHIBIOS}/test/testmsg.c \ - ${CHIBIOS}/test/testmbox.c \ - ${CHIBIOS}/test/testevt.c \ - ${CHIBIOS}/test/testheap.c \ - ${CHIBIOS}/test/testpools.c \ - ${CHIBIOS}/test/testdyn.c \ - ${CHIBIOS}/test/testqueues.c \ - ${CHIBIOS}/test/testbmk.c - -# Required include directories -TESTINC = ${CHIBIOS}/test diff --git a/test/testbmk.c b/test/testbmk.c deleted file mode 100644 index 5e5b11e7db..0000000000 --- a/test/testbmk.c +++ /dev/null @@ -1,714 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_benchmarks Kernel Benchmarks - * - * File: @ref testbmk.c - * - *

    Description

    - * This module implements a series of system benchmarks. The benchmarks are - * useful as a stress test and as a reference when comparing ChibiOS/RT - * with similar systems. - * - *

    Objective

    - * Objective of the test module is to provide a performance index for the - * most critical system subsystems. The performance numbers allow to - * discover performance regressions between successive ChibiOS/RT releases. - * - *

    Preconditions

    - * None. - * - *

    Test Cases

    - * - @subpage test_benchmarks_001 - * - @subpage test_benchmarks_002 - * - @subpage test_benchmarks_003 - * - @subpage test_benchmarks_004 - * - @subpage test_benchmarks_005 - * - @subpage test_benchmarks_006 - * - @subpage test_benchmarks_007 - * - @subpage test_benchmarks_008 - * - @subpage test_benchmarks_009 - * - @subpage test_benchmarks_010 - * - @subpage test_benchmarks_011 - * - @subpage test_benchmarks_012 - * - @subpage test_benchmarks_013 - * . - * @file testbmk.c Kernel Benchmarks - * @brief Kernel Benchmarks source file - * @file testbmk.h - * @brief Kernel Benchmarks header file - */ - -static Semaphore sem1; -#if CH_USE_MUTEXES || defined(__DOXYGEN__) -static Mutex mtx1; -#endif - -static msg_t thread1(void *p) { - Thread *tp; - msg_t msg; - - (void)p; - do { - tp = chMsgWait(); - msg = chMsgGet(tp); - chMsgRelease(tp, msg); - } while (msg); - return 0; -} - -#ifdef __GNUC__ -__attribute__((noinline)) -#endif -static unsigned int msg_loop_test(Thread *tp) { - - uint32_t n = 0; - test_wait_tick(); - test_start_timer(1000); - do { - (void)chMsgSend(tp, 1); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - (void)chMsgSend(tp, 0); - return n; -} - -/** - * @page test_benchmarks_001 Messages performance #1 - * - *

    Description

    - * A message server thread is created with a lower priority than the client - * thread, the messages throughput per second is measured and the result - * printed in the output log. - */ - -static void bmk1_execute(void) { - uint32_t n; - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-1, thread1, NULL); - n = msg_loop_test(threads[0]); - test_wait_threads(); - test_print("--- Score : "); - test_printn(n); - test_print(" msgs/S, "); - test_printn(n << 1); - test_println(" ctxswc/S"); -} - -ROMCONST struct testcase testbmk1 = { - "Benchmark, messages #1", - NULL, - NULL, - bmk1_execute -}; - -/** - * @page test_benchmarks_002 Messages performance #2 - * - *

    Description

    - * A message server thread is created with an higher priority than the client - * thread, the messages throughput per second is measured and the result - * printed in the output log. - */ - -static void bmk2_execute(void) { - uint32_t n; - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread1, NULL); - n = msg_loop_test(threads[0]); - test_wait_threads(); - test_print("--- Score : "); - test_printn(n); - test_print(" msgs/S, "); - test_printn(n << 1); - test_println(" ctxswc/S"); -} - -ROMCONST struct testcase testbmk2 = { - "Benchmark, messages #2", - NULL, - NULL, - bmk2_execute -}; - -static msg_t thread2(void *p) { - - return (msg_t)p; -} - -/** - * @page test_benchmarks_003 Messages performance #3 - * - *

    Description

    - * A message server thread is created with an higher priority than the client - * thread, four lower priority threads crowd the ready list, the messages - * throughput per second is measured while the ready list and the result - * printed in the output log. - */ - -static void bmk3_execute(void) { - uint32_t n; - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread1, NULL); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-2, thread2, NULL); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread2, NULL); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-4, thread2, NULL); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-5, thread2, NULL); - n = msg_loop_test(threads[0]); - test_wait_threads(); - test_print("--- Score : "); - test_printn(n); - test_print(" msgs/S, "); - test_printn(n << 1); - test_println(" ctxswc/S"); -} - -ROMCONST struct testcase testbmk3 = { - "Benchmark, messages #3", - NULL, - NULL, - bmk3_execute -}; - -/** - * @page test_benchmarks_004 Context Switch performance - * - *

    Description

    - * A thread is created that just performs a @p chSchGoSleepS() into a loop, - * the thread is awakened as fast is possible by the tester thread.
    - * The Context Switch performance is calculated by measuring the number of - * iterations after a second of continuous operations. - */ - -msg_t thread4(void *p) { - msg_t msg; - Thread *self = chThdSelf(); - - (void)p; - chSysLock(); - do { - chSchGoSleepS(THD_STATE_SUSPENDED); - msg = self->p_u.rdymsg; - } while (msg == RDY_OK); - chSysUnlock(); - return 0; -} - -static void bmk4_execute(void) { - Thread *tp; - uint32_t n; - - tp = threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread4, NULL); - n = 0; - test_wait_tick(); - test_start_timer(1000); - do { - chSysLock(); - chSchWakeupS(tp, RDY_OK); - chSchWakeupS(tp, RDY_OK); - chSchWakeupS(tp, RDY_OK); - chSchWakeupS(tp, RDY_OK); - chSysUnlock(); - n += 4; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - chSysLock(); - chSchWakeupS(tp, RDY_TIMEOUT); - chSysUnlock(); - - test_wait_threads(); - test_print("--- Score : "); - test_printn(n * 2); - test_println(" ctxswc/S"); -} - -ROMCONST struct testcase testbmk4 = { - "Benchmark, context switch", - NULL, - NULL, - bmk4_execute -}; - -/** - * @page test_benchmarks_005 Threads performance, full cycle - * - *

    Description

    - * Threads are continuously created and terminated into a loop. A full - * @p chThdCreateStatic() / @p chThdExit() / @p chThdWait() cycle is performed - * in each iteration.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static void bmk5_execute(void) { - - uint32_t n = 0; - void *wap = wa[0]; - tprio_t prio = chThdGetPriority() - 1; - test_wait_tick(); - test_start_timer(1000); - do { - chThdWait(chThdCreateStatic(wap, WA_SIZE, prio, thread2, NULL)); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_print("--- Score : "); - test_printn(n); - test_println(" threads/S"); -} - -ROMCONST struct testcase testbmk5 = { - "Benchmark, threads, full cycle", - NULL, - NULL, - bmk5_execute -}; - -/** - * @page test_benchmarks_006 Threads performance, create/exit only - * - *

    Description

    - * Threads are continuously created and terminated into a loop. A partial - * @p chThdCreateStatic() / @p chThdExit() cycle is performed in each - * iteration, the @p chThdWait() is not necessary because the thread is - * created at an higher priority so there is no need to wait for it to - * terminate.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static void bmk6_execute(void) { - - uint32_t n = 0; - void *wap = wa[0]; - tprio_t prio = chThdGetPriority() + 1; - test_wait_tick(); - test_start_timer(1000); - do { - chThdCreateStatic(wap, WA_SIZE, prio, thread2, NULL); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_print("--- Score : "); - test_printn(n); - test_println(" threads/S"); -} - -ROMCONST struct testcase testbmk6 = { - "Benchmark, threads, create only", - NULL, - NULL, - bmk6_execute -}; - -/** - * @page test_benchmarks_007 Mass reschedule performance - * - *

    Description

    - * Five threads are created and atomically rescheduled by resetting the - * semaphore where they are waiting on. The operation is performed into a - * continuous loop.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static msg_t thread3(void *p) { - - (void)p; - while (!chThdShouldTerminate()) - chSemWait(&sem1); - return 0; -} - -static void bmk7_setup(void) { - - chSemInit(&sem1, 0); -} - -static void bmk7_execute(void) { - uint32_t n; - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+5, thread3, NULL); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()+4, thread3, NULL); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()+3, thread3, NULL); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()+2, thread3, NULL); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()+1, thread3, NULL); - - n = 0; - test_wait_tick(); - test_start_timer(1000); - do { - chSemReset(&sem1, 0); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_terminate_threads(); - chSemReset(&sem1, 0); - test_wait_threads(); - - test_print("--- Score : "); - test_printn(n); - test_print(" reschedules/S, "); - test_printn(n * 6); - test_println(" ctxswc/S"); -} - -ROMCONST struct testcase testbmk7 = { - "Benchmark, mass reschedule, 5 threads", - bmk7_setup, - NULL, - bmk7_execute -}; - -/** - * @page test_benchmarks_008 I/O Round-Robin voluntary reschedule. - * - *

    Description

    - * Five threads are created at equal priority, each thread just increases a - * variable and yields.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static msg_t thread8(void *p) { - - do { - chThdYield(); - chThdYield(); - chThdYield(); - chThdYield(); - (*(uint32_t *)p) += 4; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while(!chThdShouldTerminate()); - return 0; -} - -static void bmk8_execute(void) { - uint32_t n; - - n = 0; - test_wait_tick(); - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-1, thread8, (void *)&n); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-1, thread8, (void *)&n); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-1, thread8, (void *)&n); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-1, thread8, (void *)&n); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-1, thread8, (void *)&n); - - chThdSleepSeconds(1); - test_terminate_threads(); - test_wait_threads(); - - test_print("--- Score : "); - test_printn(n); - test_println(" ctxswc/S"); -} - -ROMCONST struct testcase testbmk8 = { - "Benchmark, round robin context switching", - NULL, - NULL, - bmk8_execute -}; - -/** - * @page test_benchmarks_009 I/O Queues throughput - * - *

    Description

    - * Four bytes are written and then read from an @p InputQueue into a continuous - * loop.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static void bmk9_execute(void) { - uint32_t n; - static uint8_t ib[16]; - static InputQueue iq; - - chIQInit(&iq, ib, sizeof(ib), NULL, NULL); - n = 0; - test_wait_tick(); - test_start_timer(1000); - do { - chSysLock(); - chIQPutI(&iq, 0); - chIQPutI(&iq, 1); - chIQPutI(&iq, 2); - chIQPutI(&iq, 3); - chSysUnlock(); - (void)chIQGet(&iq); - (void)chIQGet(&iq); - (void)chIQGet(&iq); - (void)chIQGet(&iq); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_print("--- Score : "); - test_printn(n * 4); - test_println(" bytes/S"); -} - -ROMCONST struct testcase testbmk9 = { - "Benchmark, I/O Queues throughput", - NULL, - NULL, - bmk9_execute -}; - -/** - * @page test_benchmarks_010 Virtual Timers set/reset performance - * - *

    Description

    - * A virtual timer is set and immediately reset into a continuous loop.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static void tmo(void *param) {(void)param;} - -static void bmk10_execute(void) { - static VirtualTimer vt1, vt2; - uint32_t n = 0; - - test_wait_tick(); - test_start_timer(1000); - do { - chSysLock(); - chVTSetI(&vt1, 1, tmo, NULL); - chVTSetI(&vt2, 10000, tmo, NULL); - chVTResetI(&vt1); - chVTResetI(&vt2); - chSysUnlock(); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_print("--- Score : "); - test_printn(n * 2); - test_println(" timers/S"); -} - -ROMCONST struct testcase testbmk10 = { - "Benchmark, virtual timers set/reset", - NULL, - NULL, - bmk10_execute -}; - -/** - * @page test_benchmarks_011 Semaphores wait/signal performance - * - *

    Description

    - * A counting semaphore is taken/released into a continuous loop, no Context - * Switch happens because the counter is always non negative.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static void bmk11_setup(void) { - - chSemInit(&sem1, 1); -} - -static void bmk11_execute(void) { - uint32_t n = 0; - - test_wait_tick(); - test_start_timer(1000); - do { - chSemWait(&sem1); - chSemSignal(&sem1); - chSemWait(&sem1); - chSemSignal(&sem1); - chSemWait(&sem1); - chSemSignal(&sem1); - chSemWait(&sem1); - chSemSignal(&sem1); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_print("--- Score : "); - test_printn(n * 4); - test_println(" wait+signal/S"); -} - -ROMCONST struct testcase testbmk11 = { - "Benchmark, semaphores wait/signal", - bmk11_setup, - NULL, - bmk11_execute -}; - -#if CH_USE_MUTEXES || defined(__DOXYGEN__) -/** - * @page test_benchmarks_012 Mutexes lock/unlock performance - * - *

    Description

    - * A mutex is locked/unlocked into a continuous loop, no Context Switch happens - * because there are no other threads asking for the mutex.
    - * The performance is calculated by measuring the number of iterations after - * a second of continuous operations. - */ - -static void bmk12_setup(void) { - - chMtxInit(&mtx1); -} - -static void bmk12_execute(void) { - uint32_t n = 0; - - test_wait_tick(); - test_start_timer(1000); - do { - chMtxLock(&mtx1); - chMtxUnlock(); - chMtxLock(&mtx1); - chMtxUnlock(); - chMtxLock(&mtx1); - chMtxUnlock(); - chMtxLock(&mtx1); - chMtxUnlock(); - n++; -#if defined(SIMULATOR) - ChkIntSources(); -#endif - } while (!test_timer_done); - test_print("--- Score : "); - test_printn(n * 4); - test_println(" lock+unlock/S"); -} - -ROMCONST struct testcase testbmk12 = { - "Benchmark, mutexes lock/unlock", - bmk12_setup, - NULL, - bmk12_execute -}; -#endif - -/** - * @page test_benchmarks_013 RAM Footprint - * - *

    Description

    - * The memory size of the various kernel objects is printed. - */ - -static void bmk13_execute(void) { - - test_print("--- System: "); - test_printn(sizeof(ReadyList) + sizeof(VTList) + - PORT_IDLE_THREAD_STACK_SIZE + - (sizeof(Thread) + sizeof(struct intctx) + - sizeof(struct extctx) + - PORT_INT_REQUIRED_STACK) * 2); - test_println(" bytes"); - test_print("--- Thread: "); - test_printn(sizeof(Thread)); - test_println(" bytes"); - test_print("--- Timer : "); - test_printn(sizeof(VirtualTimer)); - test_println(" bytes"); - test_print("--- Semaph: "); - test_printn(sizeof(Semaphore)); - test_println(" bytes"); -#if CH_USE_EVENTS || defined(__DOXYGEN__) - test_print("--- EventS: "); - test_printn(sizeof(EventSource)); - test_println(" bytes"); - test_print("--- EventL: "); - test_printn(sizeof(EventListener)); - test_println(" bytes"); -#endif -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - test_print("--- Mutex : "); - test_printn(sizeof(Mutex)); - test_println(" bytes"); -#endif -#if CH_USE_CONDVARS || defined(__DOXYGEN__) - test_print("--- CondV.: "); - test_printn(sizeof(CondVar)); - test_println(" bytes"); -#endif -#if CH_USE_QUEUES || defined(__DOXYGEN__) - test_print("--- Queue : "); - test_printn(sizeof(GenericQueue)); - test_println(" bytes"); -#endif -#if CH_USE_MAILBOXES || defined(__DOXYGEN__) - test_print("--- MailB.: "); - test_printn(sizeof(Mailbox)); - test_println(" bytes"); -#endif -} - -ROMCONST struct testcase testbmk13 = { - "Benchmark, RAM footprint", - NULL, - NULL, - bmk13_execute -}; - -/** - * @brief Test sequence for benchmarks. - */ -ROMCONST struct testcase * ROMCONST patternbmk[] = { -#if !TEST_NO_BENCHMARKS - &testbmk1, - &testbmk2, - &testbmk3, - &testbmk4, - &testbmk5, - &testbmk6, - &testbmk7, - &testbmk8, - &testbmk9, - &testbmk10, - &testbmk11, -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - &testbmk12, -#endif - &testbmk13, -#endif - NULL -}; diff --git a/test/testbmk.h b/test/testbmk.h deleted file mode 100644 index 6e8c4d1ba6..0000000000 --- a/test/testbmk.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTBMK_H_ -#define _TESTBMK_H_ - -extern ROMCONST struct testcase * ROMCONST patternbmk[]; - -#endif /* _TESTBMK_H_ */ diff --git a/test/testdyn.c b/test/testdyn.c deleted file mode 100644 index 5edbc0b633..0000000000 --- a/test/testdyn.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_dynamic Dynamic APIs test - * - * File: @ref testdyn.c - * - *

    Description

    - * This module implements the test sequence for the dynamic thread creation - * APIs. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the dynamic APIs code. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_DYNAMIC - * - @p CH_USE_HEAP - * - @p CH_USE_MEMPOOLS - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_dynamic_001 - * - @subpage test_dynamic_002 - * - @subpage test_dynamic_003 - * . - * @file testdyn.c - * @brief Dynamic thread APIs test source file - * @file testdyn.h - * @brief Dynamic thread APIs test header file - */ - -#if CH_USE_DYNAMIC || defined(__DOXYGEN__) -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -static MemoryHeap heap1; -#endif -#if CH_USE_MEMPOOLS || defined(__DOXYGEN__) -static MemoryPool mp1; -#endif - -/** - * @page test_dynamic_001 Threads creation from Memory Heap - * - *

    Description

    - * Two threads are started by allocating the memory from the Memory Heap then - * the remaining heap space is arbitrarily allocated and a third tread startup - * is attempted.
    - * The test expects the first two threads to successfully start and the last - * one to fail. - */ - -static msg_t thread(void *p) { - - test_emit_token(*(char *)p); - return 0; -} - -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -static void dyn1_setup(void) { - - chHeapInit(&heap1, test.buffer, sizeof(union test_buffers)); -} - -static void dyn1_execute(void) { - size_t n, sz; - void *p1; - tprio_t prio = chThdGetPriority(); - - (void)chHeapStatus(&heap1, &sz); - /* Starting threads from the heap. */ - threads[0] = chThdCreateFromHeap(&heap1, THD_WA_SIZE(THREADS_STACK_SIZE), - prio-1, thread, "A"); - threads[1] = chThdCreateFromHeap(&heap1, THD_WA_SIZE(THREADS_STACK_SIZE), - prio-2, thread, "B"); - /* Allocating the whole heap in order to make the thread creation fail.*/ - (void)chHeapStatus(&heap1, &n); - p1 = chHeapAlloc(&heap1, n); - threads[2] = chThdCreateFromHeap(&heap1, THD_WA_SIZE(THREADS_STACK_SIZE), - prio-3, thread, "C"); - chHeapFree(p1); - - test_assert(1, (threads[0] != NULL) && - (threads[1] != NULL) && - (threads[2] == NULL) && - (threads[3] == NULL) && - (threads[4] == NULL), - "thread creation failed"); - - /* Claiming the memory from terminated threads. */ - test_wait_threads(); - test_assert_sequence(2, "AB"); - - /* Heap status checked again.*/ - test_assert(3, chHeapStatus(&heap1, &n) == 1, "heap fragmented"); - test_assert(4, n == sz, "heap size changed"); -} - -ROMCONST struct testcase testdyn1 = { - "Dynamic APIs, threads creation from heap", - dyn1_setup, - NULL, - dyn1_execute -}; -#endif /* (CH_USE_HEAP && !CH_USE_MALLOC_HEAP) */ - -#if CH_USE_MEMPOOLS || defined(__DOXYGEN__) -/** - * @page test_dynamic_002 Threads creation from Memory Pool - * - *

    Description

    - * Five thread creation are attempted from a pool containing only four - * elements.
    - * The test expects the first four threads to successfully start and the last - * one to fail. - */ - -static void dyn2_setup(void) { - - chPoolInit(&mp1, THD_WA_SIZE(THREADS_STACK_SIZE), NULL); -} - -static void dyn2_execute(void) { - int i; - tprio_t prio = chThdGetPriority(); - - /* Adding the WAs to the pool. */ - for (i = 0; i < 4; i++) - chPoolFree(&mp1, wa[i]); - - /* Starting threads from the memory pool. */ - threads[0] = chThdCreateFromMemoryPool(&mp1, prio-1, thread, "A"); - threads[1] = chThdCreateFromMemoryPool(&mp1, prio-2, thread, "B"); - threads[2] = chThdCreateFromMemoryPool(&mp1, prio-3, thread, "C"); - threads[3] = chThdCreateFromMemoryPool(&mp1, prio-4, thread, "D"); - threads[4] = chThdCreateFromMemoryPool(&mp1, prio-5, thread, "E"); - - test_assert(1, (threads[0] != NULL) && - (threads[1] != NULL) && - (threads[2] != NULL) && - (threads[3] != NULL) && - (threads[4] == NULL), - "thread creation failed"); - - /* Claiming the memory from terminated threads. */ - test_wait_threads(); - test_assert_sequence(2, "ABCD"); - - /* Now the pool must be full again. */ - for (i = 0; i < 4; i++) - test_assert(3, chPoolAlloc(&mp1) != NULL, "pool list empty"); - test_assert(4, chPoolAlloc(&mp1) == NULL, "pool list not empty"); -} - -ROMCONST struct testcase testdyn2 = { - "Dynamic APIs, threads creation from memory pool", - dyn2_setup, - NULL, - dyn2_execute -}; -#endif /* CH_USE_MEMPOOLS */ - -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP && CH_USE_REGISTRY) || \ - defined(__DOXYGEN__) -/** - * @page test_dynamic_003 Registry and References test - * - *

    Description

    - * Registry and Thread References APIs are tested for functionality and - * coverage. - */ - -static bool_t regfind(Thread *tp) { - Thread *ftp; - bool_t found = FALSE; - - ftp = chRegFirstThread(); - do { - found |= ftp == tp; - ftp = chRegNextThread(ftp); - } while (ftp != NULL); - return found; -} - -static void dyn3_setup(void) { - - chHeapInit(&heap1, test.buffer, sizeof(union test_buffers)); -} - -static void dyn3_execute(void) { - Thread *tp; - tprio_t prio = chThdGetPriority(); - - /* Testing references increase/decrease and final detach.*/ - tp = chThdCreateFromHeap(&heap1, WA_SIZE, prio-1, thread, "A"); - test_assert(1, tp->p_refs == 1, "wrong initial reference counter"); - chThdAddRef(tp); - test_assert(2, tp->p_refs == 2, "references increase failure"); - chThdRelease(tp); - test_assert(3, tp->p_refs == 1, "references decrease failure"); - - /* Verify the new threads count.*/ - test_assert(4, regfind(tp), "thread missing from registry"); - test_assert(5, regfind(tp), "thread disappeared"); - - /* Detach and let the thread execute and terminate.*/ - chThdRelease(tp); - test_assert(6, tp->p_refs == 0, "detach failure"); - test_assert(7, tp->p_state == THD_STATE_READY, "invalid state"); - test_assert(8, regfind(tp), "thread disappeared"); - test_assert(9, regfind(tp), "thread disappeared"); - chThdSleepMilliseconds(50); /* The thread just terminates. */ - test_assert(10, tp->p_state == THD_STATE_FINAL, "invalid state"); - - /* Clearing the zombie by scanning the registry.*/ - test_assert(11, regfind(tp), "thread disappeared"); - test_assert(12, !regfind(tp), "thread still in registry"); -} - -ROMCONST struct testcase testdyn3 = { - "Dynamic APIs, registry and references", - dyn3_setup, - NULL, - dyn3_execute -}; -#endif /* CH_USE_HEAP && CH_USE_REGISTRY */ -#endif /* CH_USE_DYNAMIC */ - -/** - * @brief Test sequence for dynamic APIs. - */ -ROMCONST struct testcase * ROMCONST patterndyn[] = { -#if CH_USE_DYNAMIC || defined(__DOXYGEN__) -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) - &testdyn1, -#endif -#if CH_USE_MEMPOOLS || defined(__DOXYGEN__) - &testdyn2, -#endif -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP && CH_USE_REGISTRY) || \ - defined(__DOXYGEN__) - &testdyn3, -#endif -#endif - NULL -}; diff --git a/test/testdyn.h b/test/testdyn.h deleted file mode 100644 index e373df3ba2..0000000000 --- a/test/testdyn.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTDYN_H_ -#define _TESTDYN_H_ - -extern ROMCONST struct testcase * ROMCONST patterndyn[]; - -#endif /* _TESTDYN_H_ */ diff --git a/test/testevt.c b/test/testevt.c deleted file mode 100644 index cc42167a02..0000000000 --- a/test/testevt.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_events Events test - * - * File: @ref testevt.c - * - *

    Description

    - * This module implements the test sequence for the @ref events subsystem. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref events subsystem. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_EVENTS - * - @p CH_USE_EVENTS_TIMEOUT - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_events_001 - * - @subpage test_events_002 - * - @subpage test_events_003 - * . - * @file testevt.c - * @brief Events test source file - * @file testevt.h - * @brief Events test header file - */ - -#if CH_USE_EVENTS || defined(__DOXYGEN__) - -#define ALLOWED_DELAY MS2ST(5) - -/* - * Note, the static initializers are not really required because the - * variables are explicitly initialized in each test case. It is done in order - * to test the macros. - */ -static EVENTSOURCE_DECL(es1); -static EVENTSOURCE_DECL(es2); - -/** - * @page test_events_001 Events registration and dispatch - * - *

    Description

    - * Two event listeners are registered on an event source and then unregistered - * in the same order.
    - * The test expects that the even source has listeners after the registrations - * and after the first unregistration, then, after the second unegistration, - * the test expects no more listeners.
    - * In the second part the test dispatches three event flags and verifies that - * the associated event handlers are invoked in LSb-first order. - */ - -static void evt1_setup(void) { - - chEvtGetAndClearEvents(ALL_EVENTS); -} - -static void h1(eventid_t id) {(void)id;test_emit_token('A');} -static void h2(eventid_t id) {(void)id;test_emit_token('B');} -static void h3(eventid_t id) {(void)id;test_emit_token('C');} -static ROMCONST evhandler_t evhndl[] = {h1, h2, h3}; - -static void evt1_execute(void) { - EventListener el1, el2; - - /* - * Testing chEvtRegisterMask() and chEvtUnregister(). - */ - chEvtInit(&es1); - chEvtRegisterMask(&es1, &el1, 1); - chEvtRegisterMask(&es1, &el2, 2); - test_assert(1, chEvtIsListeningI(&es1), "no listener"); - chEvtUnregister(&es1, &el1); - test_assert(2, chEvtIsListeningI(&es1), "no listener"); - chEvtUnregister(&es1, &el2); - test_assert(3, !chEvtIsListeningI(&es1), "stuck listener"); - - /* - * Testing chEvtDispatch(). - */ - chEvtDispatch(evhndl, 7); - test_assert_sequence(4, "ABC"); -} - -ROMCONST struct testcase testevt1 = { - "Events, registration and dispatch", - evt1_setup, - NULL, - evt1_execute -}; - -/** - * @page test_events_002 Events wait and broadcast - * - *

    Description

    - * In this test the following APIs are indipently tested by starting threads - * that signal/broadcast events after fixed delays: - * - @p chEvtWaitOne() - * - @p chEvtWaitAny() - * - @p chEvtWaitAll() - * . - * After each test phase the test verifies that the events have been served at - * the expected time and that there are no stuck event flags. - */ - -static void evt2_setup(void) { - - chEvtGetAndClearEvents(ALL_EVENTS); -} - -static msg_t thread1(void *p) { - - chThdSleepMilliseconds(50); - chEvtSignal((Thread *)p, 1); - return 0; -} - -static msg_t thread2(void *p) { - - (void)p; - chEvtBroadcast(&es1); - chThdSleepMilliseconds(50); - chEvtBroadcast(&es2); - return 0; -} - -static void evt2_execute(void) { - eventmask_t m; - EventListener el1, el2; - systime_t target_time; - - /* - * Test on chEvtWaitOne() without wait. - */ - chEvtAddEvents(5); - m = chEvtWaitOne(ALL_EVENTS); - test_assert(1, m == 1, "single event error"); - m = chEvtWaitOne(ALL_EVENTS); - test_assert(2, m == 4, "single event error"); - m = chEvtGetAndClearEvents(ALL_EVENTS); - test_assert(3, m == 0, "stuck event"); - - /* - * Test on chEvtWaitOne() with wait. - */ - test_wait_tick(); - target_time = chTimeNow() + MS2ST(50); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() - 1, - thread1, chThdSelf()); - m = chEvtWaitOne(ALL_EVENTS); - test_assert_time_window(4, target_time, target_time + ALLOWED_DELAY); - test_assert(5, m == 1, "single event error"); - m = chEvtGetAndClearEvents(ALL_EVENTS); - test_assert(6, m == 0, "stuck event"); - test_wait_threads(); - - /* - * Test on chEvtWaitAny() without wait. - */ - chEvtAddEvents(5); - m = chEvtWaitAny(ALL_EVENTS); - test_assert(7, m == 5, "unexpected pending bit"); - m = chEvtGetAndClearEvents(ALL_EVENTS); - test_assert(8, m == 0, "stuck event"); - - /* - * Test on chEvtWaitAny() with wait. - */ - test_wait_tick(); - target_time = chTimeNow() + MS2ST(50); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() - 1, - thread1, chThdSelf()); - m = chEvtWaitAny(ALL_EVENTS); - test_assert_time_window(9, target_time, target_time + ALLOWED_DELAY); - test_assert(10, m == 1, "single event error"); - m = chEvtGetAndClearEvents(ALL_EVENTS); - test_assert(11, m == 0, "stuck event"); - test_wait_threads(); - - /* - * Test on chEvtWaitAll(). - */ - chEvtInit(&es1); - chEvtInit(&es2); - chEvtRegisterMask(&es1, &el1, 1); - chEvtRegisterMask(&es2, &el2, 4); - test_wait_tick(); - target_time = chTimeNow() + MS2ST(50); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() - 1, - thread2, "A"); - m = chEvtWaitAll(5); - test_assert_time_window(12, target_time, target_time + ALLOWED_DELAY); - m = chEvtGetAndClearEvents(ALL_EVENTS); - test_assert(13, m == 0, "stuck event"); - test_wait_threads(); - chEvtUnregister(&es1, &el1); - chEvtUnregister(&es2, &el2); - test_assert(14, !chEvtIsListeningI(&es1), "stuck listener"); - test_assert(15, !chEvtIsListeningI(&es2), "stuck listener"); -} - -ROMCONST struct testcase testevt2 = { - "Events, wait and broadcast", - evt2_setup, - NULL, - evt2_execute -}; - -#if CH_USE_EVENTS_TIMEOUT || defined(__DOXYGEN__) -/** - * @page test_events_003 Events timeout - * - *

    Description

    - * In this test the following APIs are let to timeout twice: immediatly and - * after 10ms: - * In this test the following APIs are indipently tested by starting threads - * that broadcast events after fixed delays: - * - @p chEvtWaitOneTimeout() - * - @p chEvtWaitAnyTimeout() - * - @p chEvtWaitAllTimeout() - * . - * After each test phase the test verifies that there are no stuck event flags. - */ - -static void evt3_setup(void) { - - chEvtGetAndClearEvents(ALL_EVENTS); -} - -static void evt3_execute(void) { - eventmask_t m; - - /* - * Tests various timeout situations. - */ - m = chEvtWaitOneTimeout(ALL_EVENTS, TIME_IMMEDIATE); - test_assert(1, m == 0, "spurious event"); - m = chEvtWaitAnyTimeout(ALL_EVENTS, TIME_IMMEDIATE); - test_assert(2, m == 0, "spurious event"); - m = chEvtWaitAllTimeout(ALL_EVENTS, TIME_IMMEDIATE); - test_assert(3, m == 0, "spurious event"); - m = chEvtWaitOneTimeout(ALL_EVENTS, 10); - test_assert(4, m == 0, "spurious event"); - m = chEvtWaitAnyTimeout(ALL_EVENTS, 10); - test_assert(5, m == 0, "spurious event"); - m = chEvtWaitAllTimeout(ALL_EVENTS, 10); - test_assert(6, m == 0, "spurious event"); -} - -ROMCONST struct testcase testevt3 = { - "Events, timeouts", - evt3_setup, - NULL, - evt3_execute -}; -#endif /* CH_USE_EVENTS_TIMEOUT */ - -/** - * @brief Test sequence for events. - */ -ROMCONST struct testcase * ROMCONST patternevt[] = { -#if CH_USE_EVENTS || defined(__DOXYGEN__) - &testevt1, - &testevt2, -#if CH_USE_EVENTS_TIMEOUT || defined(__DOXYGEN__) - &testevt3, -#endif -#endif - NULL -}; - -#endif /* CH_USE_EVENTS */ diff --git a/test/testevt.h b/test/testevt.h deleted file mode 100644 index ca05c79c32..0000000000 --- a/test/testevt.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTEVT_H_ -#define _TESTEVT_H_ - -extern ROMCONST struct testcase * ROMCONST patternevt[]; - -#endif /* _TESTEVT_H_ */ diff --git a/test/testheap.c b/test/testheap.c deleted file mode 100644 index 8d849257a6..0000000000 --- a/test/testheap.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_heap Memory Heap test - * - * File: @ref testheap.c - * - *

    Description

    - * This module implements the test sequence for the @ref heaps subsystem. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref heaps subsystem. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_HEAP - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_heap_001 - * . - * @file testheap.c - * @brief Heap test source file - * @file testheap.h - * @brief Heap header file - */ - -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) - -#define SIZE 16 - -static MemoryHeap test_heap; - -/** - * @page test_heap_001 Allocation and fragmentation test - * - *

    Description

    - * Series of allocations/deallocations are performed in carefully designed - * sequences in order to stimulate all the possible code paths inside the - * allocator.
    - * The test expects to find the heap back to the initial status after each - * sequence. - */ - -static void heap1_setup(void) { - - chHeapInit(&test_heap, test.buffer, sizeof(union test_buffers)); -} - -static void heap1_execute(void) { - void *p1, *p2, *p3; - size_t n, sz; - - /* Unrelated, for coverage only.*/ - (void)chCoreStatus(); - - /* - * Test on the default heap in order to cover the core allocator at - * least one time. - */ - (void)chHeapStatus(NULL, &sz); - p1 = chHeapAlloc(NULL, SIZE); - test_assert(1, p1 != NULL, "allocation failed"); - chHeapFree(p1); - p1 = chHeapAlloc(NULL, (size_t)-256); - test_assert(2, p1 == NULL, "allocation not failed"); - - /* Initial local heap state.*/ - (void)chHeapStatus(&test_heap, &sz); - - /* Same order.*/ - p1 = chHeapAlloc(&test_heap, SIZE); - p2 = chHeapAlloc(&test_heap, SIZE); - p3 = chHeapAlloc(&test_heap, SIZE); - chHeapFree(p1); /* Does not merge.*/ - chHeapFree(p2); /* Merges backward.*/ - chHeapFree(p3); /* Merges both sides.*/ - test_assert(3, chHeapStatus(&test_heap, &n) == 1, "heap fragmented"); - - /* Reverse order.*/ - p1 = chHeapAlloc(&test_heap, SIZE); - p2 = chHeapAlloc(&test_heap, SIZE); - p3 = chHeapAlloc(&test_heap, SIZE); - chHeapFree(p3); /* Merges forward.*/ - chHeapFree(p2); /* Merges forward.*/ - chHeapFree(p1); /* Merges forward.*/ - test_assert(4, chHeapStatus(&test_heap, &n) == 1, "heap fragmented"); - - /* Small fragments handling.*/ - p1 = chHeapAlloc(&test_heap, SIZE + 1); - p2 = chHeapAlloc(&test_heap, SIZE); - chHeapFree(p1); - test_assert(5, chHeapStatus(&test_heap, &n) == 2, "invalid state"); - p1 = chHeapAlloc(&test_heap, SIZE); - /* Note, the first situation happens when the alignment size is smaller - than the header size, the second in the other cases.*/ - test_assert(6, (chHeapStatus(&test_heap, &n) == 1) || - (chHeapStatus(&test_heap, &n) == 2), "heap fragmented"); - chHeapFree(p2); - chHeapFree(p1); - test_assert(7, chHeapStatus(&test_heap, &n) == 1, "heap fragmented"); - - /* Skip fragment handling.*/ - p1 = chHeapAlloc(&test_heap, SIZE); - p2 = chHeapAlloc(&test_heap, SIZE); - chHeapFree(p1); - test_assert(8, chHeapStatus(&test_heap, &n) == 2, "invalid state"); - p1 = chHeapAlloc(&test_heap, SIZE * 2); /* Skips first fragment.*/ - chHeapFree(p1); - chHeapFree(p2); - test_assert(9, chHeapStatus(&test_heap, &n) == 1, "heap fragmented"); - - /* Allocate all handling.*/ - (void)chHeapStatus(&test_heap, &n); - p1 = chHeapAlloc(&test_heap, n); - test_assert(10, chHeapStatus(&test_heap, &n) == 0, "not empty"); - chHeapFree(p1); - - test_assert(11, chHeapStatus(&test_heap, &n) == 1, "heap fragmented"); - test_assert(12, n == sz, "size changed"); -} - -ROMCONST struct testcase testheap1 = { - "Heap, allocation and fragmentation test", - heap1_setup, - NULL, - heap1_execute -}; - -#endif /* CH_USE_HEAP.*/ - -/** - * @brief Test sequence for heap. - */ -ROMCONST struct testcase * ROMCONST patternheap[] = { -#if (CH_USE_HEAP && !CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) - &testheap1, -#endif - NULL -}; diff --git a/test/testheap.h b/test/testheap.h deleted file mode 100644 index 4e027aeaad..0000000000 --- a/test/testheap.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTHEAP_H_ -#define _TESTHEAP_H_ - -extern ROMCONST struct testcase * ROMCONST patternheap[]; - -#endif /* _TESTHEAP_H_ */ diff --git a/test/testmbox.c b/test/testmbox.c deleted file mode 100644 index 9c0bc08fa1..0000000000 --- a/test/testmbox.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_mbox Mailboxes test - * - * File: @ref testmbox.c - * - *

    Description

    - * This module implements the test sequence for the @ref mailboxes subsystem. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref mailboxes - * subsystem code.
    - * Note that the @ref mailboxes subsystem depends on the @ref semaphores - * subsystem that has to met its testing objectives as well. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_MAILBOXES - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_mbox_001 - * . - * @file testmbox.c - * @brief Mailboxes test source file - * @file testmbox.h - * @brief Mailboxes header file - */ - -#if CH_USE_MAILBOXES || defined(__DOXYGEN__) - -#define ALLOWED_DELAY MS2ST(5) -#define MB_SIZE 5 - -/* - * Note, the static initializers are not really required because the - * variables are explicitly initialized in each test case. It is done in order - * to test the macros. - */ -static MAILBOX_DECL(mb1, test.wa.T0, MB_SIZE); - -/** - * @page test_mbox_001 Queuing and timeouts - * - *

    Description

    - * Messages are posted/fetched from a mailbox in carefully designed sequences - * in order to stimulate all the possible code paths inside the mailbox.
    - * The test expects to find a consistent mailbox status after each operation. - */ - -static void mbox1_setup(void) { - - chMBInit(&mb1, (msg_t *)test.wa.T0, MB_SIZE); -} - -static void mbox1_execute(void) { - msg_t msg1, msg2; - unsigned i; - - /* - * Testing initial space. - */ - test_assert(1, chMBGetFreeCountI(&mb1) == MB_SIZE, "wrong size"); - - /* - * Testing enqueuing and backward circularity. - */ - for (i = 0; i < MB_SIZE - 1; i++) { - msg1 = chMBPost(&mb1, 'B' + i, TIME_INFINITE); - test_assert(2, msg1 == RDY_OK, "wrong wake-up message"); - } - msg1 = chMBPostAhead(&mb1, 'A', TIME_INFINITE); - test_assert(3, msg1 == RDY_OK, "wrong wake-up message"); - - /* - * Testing post timeout. - */ - msg1 = chMBPost(&mb1, 'X', 1); - test_assert(4, msg1 == RDY_TIMEOUT, "wrong wake-up message"); - chSysLock(); - msg1 = chMBPostI(&mb1, 'X'); - chSysUnlock(); - test_assert(5, msg1 == RDY_TIMEOUT, "wrong wake-up message"); - msg1 = chMBPostAhead(&mb1, 'X', 1); - test_assert(6, msg1 == RDY_TIMEOUT, "wrong wake-up message"); - chSysLock(); - msg1 = chMBPostAheadI(&mb1, 'X'); - chSysUnlock(); - test_assert(7, msg1 == RDY_TIMEOUT, "wrong wake-up message"); - - /* - * Testing final conditions. - */ - test_assert_lock(8, chMBGetFreeCountI(&mb1) == 0, "still empty"); - test_assert_lock(9, chMBGetUsedCountI(&mb1) == MB_SIZE, "not full"); - test_assert_lock(10, mb1.mb_rdptr == mb1.mb_wrptr, "pointers not aligned"); - - /* - * Testing dequeuing. - */ - for (i = 0; i < MB_SIZE; i++) { - msg1 = chMBFetch(&mb1, &msg2, TIME_INFINITE); - test_assert(11, msg1 == RDY_OK, "wrong wake-up message"); - test_emit_token(msg2); - } - test_assert_sequence(12, "ABCDE"); - - /* - * Testing buffer circularity. - */ - msg1 = chMBPost(&mb1, 'B' + i, TIME_INFINITE); - test_assert(13, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBFetch(&mb1, &msg2, TIME_INFINITE); - test_assert(14, msg1 == RDY_OK, "wrong wake-up message"); - test_assert(15, mb1.mb_buffer == mb1.mb_wrptr, "write pointer not aligned to base"); - test_assert(16, mb1.mb_buffer == mb1.mb_rdptr, "read pointer not aligned to base"); - - /* - * Testing fetch timeout. - */ - msg1 = chMBFetch(&mb1, &msg2, 1); - test_assert(17, msg1 == RDY_TIMEOUT, "wrong wake-up message"); - chSysLock(); - msg1 = chMBFetchI(&mb1, &msg2); - chSysUnlock(); - test_assert(18, msg1 == RDY_TIMEOUT, "wrong wake-up message"); - - /* - * Testing final conditions. - */ - test_assert_lock(19, chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(20, chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert_lock(21, mb1.mb_rdptr == mb1.mb_wrptr, "pointers not aligned"); - - /* - * Testing I-Class. - */ - chSysLock() - msg1 = chMBPostI(&mb1, 'A'); - test_assert(22, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostI(&mb1, 'B'); - test_assert(23, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostI(&mb1, 'C'); - test_assert(24, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostI(&mb1, 'D'); - test_assert(25, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostI(&mb1, 'E'); - chSysUnlock() - test_assert(26, msg1 == RDY_OK, "wrong wake-up message"); - test_assert(27, mb1.mb_rdptr == mb1.mb_wrptr, "pointers not aligned"); - for (i = 0; i < MB_SIZE; i++) { - chSysLock(); - msg1 = chMBFetchI(&mb1, &msg2); - chSysUnlock(); - test_assert(28, msg1 == RDY_OK, "wrong wake-up message"); - test_emit_token(msg2); - } - test_assert_sequence(29, "ABCDE"); - test_assert_lock(30, chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(31, chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert(32, mb1.mb_rdptr == mb1.mb_wrptr, "pointers not aligned"); - - chSysLock(); - msg1 = chMBPostAheadI(&mb1, 'E'); - test_assert(33, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostAheadI(&mb1, 'D'); - test_assert(34, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostAheadI(&mb1, 'C'); - test_assert(35, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostAheadI(&mb1, 'B'); - test_assert(36, msg1 == RDY_OK, "wrong wake-up message"); - msg1 = chMBPostAheadI(&mb1, 'A'); - chSysUnlock(); - test_assert(37, msg1 == RDY_OK, "wrong wake-up message"); - test_assert(38, mb1.mb_rdptr == mb1.mb_wrptr, "pointers not aligned"); - for (i = 0; i < MB_SIZE; i++) { - chSysLock(); - msg1 = chMBFetchI(&mb1, &msg2); - chSysUnlock(); - test_assert(39, msg1 == RDY_OK, "wrong wake-up message"); - test_emit_token(msg2); - } - test_assert_sequence(40, "ABCDE"); - test_assert_lock(41, chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(42, chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert(43, mb1.mb_rdptr == mb1.mb_wrptr, "pointers not aligned"); - - /* - * Testing reset. - */ - chMBReset(&mb1); - - /* - * Re-testing final conditions. - */ - test_assert_lock(44, chMBGetFreeCountI(&mb1) == MB_SIZE, "not empty"); - test_assert_lock(45, chMBGetUsedCountI(&mb1) == 0, "still full"); - test_assert_lock(46, mb1.mb_buffer == mb1.mb_wrptr, "write pointer not aligned to base"); - test_assert_lock(47, mb1.mb_buffer == mb1.mb_rdptr, "read pointer not aligned to base"); -} - -ROMCONST struct testcase testmbox1 = { - "Mailboxes, queuing and timeouts", - mbox1_setup, - NULL, - mbox1_execute -}; - -#endif /* CH_USE_MAILBOXES */ - -/** - * @brief Test sequence for mailboxes. - */ -ROMCONST struct testcase * ROMCONST patternmbox[] = { -#if CH_USE_MAILBOXES || defined(__DOXYGEN__) - &testmbox1, -#endif - NULL -}; diff --git a/test/testmbox.h b/test/testmbox.h deleted file mode 100644 index e0693e8c6a..0000000000 --- a/test/testmbox.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTMBOX_H_ -#define _TESTMBOX_H_ - -extern ROMCONST struct testcase * ROMCONST patternmbox[]; - -#endif /* _TESTMBOX_H_ */ diff --git a/test/testmsg.c b/test/testmsg.c deleted file mode 100644 index b04da42244..0000000000 --- a/test/testmsg.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_msg Messages test - * - * File: @ref testmsg.c - * - *

    Description

    - * This module implements the test sequence for the @ref messages subsystem. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref messages - * subsystem code. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_MESSAGES - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_msg_001 - * . - * @file testmsg.c - * @brief Messages test source file - * @file testmsg.h - * @brief Messages header file - */ - -#if CH_USE_MESSAGES || defined(__DOXYGEN__) - -/** - * @page test_msg_001 Messages Server loop - * - *

    Description

    - * A thread is spawned that sends four messages back to the tester thread.
    - * The test expect to receive the messages in the correct sequence and to - * not find a fifth message waiting. - */ - -static msg_t thread(void *p) { - - chMsgSend(p, 'A'); - chMsgSend(p, 'B'); - chMsgSend(p, 'C'); - return 0; -} - -static void msg1_execute(void) { - Thread *tp; - msg_t msg; - - /* - * Testing the whole messages loop. - */ - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, - thread, chThdSelf()); - tp = chMsgWait(); - msg = chMsgGet(tp); - chMsgRelease(tp, msg); - test_emit_token(msg); - tp = chMsgWait(); - msg = chMsgGet(tp); - chMsgRelease(tp, msg); - test_emit_token(msg); - tp = chMsgWait(); - msg = chMsgGet(tp); - chMsgRelease(tp, msg); - test_emit_token(msg); - test_assert_sequence(1, "ABC"); -} - -ROMCONST struct testcase testmsg1 = { - "Messages, loop", - NULL, - NULL, - msg1_execute -}; - -#endif /* CH_USE_MESSAGES */ - -/** - * @brief Test sequence for messages. - */ -ROMCONST struct testcase * ROMCONST patternmsg[] = { -#if CH_USE_MESSAGES || defined(__DOXYGEN__) - &testmsg1, -#endif - NULL -}; diff --git a/test/testmsg.h b/test/testmsg.h deleted file mode 100644 index b28b533540..0000000000 --- a/test/testmsg.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTMSG_H_ -#define _TESTMSG_H_ - -extern ROMCONST struct testcase * ROMCONST patternmsg[]; - -#endif /* _TESTMSG_H_ */ diff --git a/test/testmtx.c b/test/testmtx.c deleted file mode 100644 index 07605922c6..0000000000 --- a/test/testmtx.c +++ /dev/null @@ -1,639 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_mtx Mutexes test - * - * File: @ref testmtx.c - * - *

    Description

    - * This module implements the test sequence for the @ref mutexes and - * @ref condvars subsystems.
    - * Tests on those subsystems are particularly critical because the system-wide - * implications of the Priority Inheritance mechanism. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the subsystems code. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_MUTEXES - * - @p CH_USE_CONDVARS - * - @p CH_DBG_THREADS_PROFILING - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_mtx_001 - * - @subpage test_mtx_002 - * - @subpage test_mtx_003 - * - @subpage test_mtx_004 - * - @subpage test_mtx_005 - * - @subpage test_mtx_006 - * - @subpage test_mtx_007 - * - @subpage test_mtx_008 - * . - * @file testmtx.c - * @brief Mutexes and CondVars test source file - * @file testmtx.h - * @brief Mutexes and CondVars test header file - */ - -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - -#define ALLOWED_DELAY 5 - -/* - * Note, the static initializers are not really required because the - * variables are explicitly initialized in each test case. It is done in order - * to test the macros. - */ -static MUTEX_DECL(m1); -static MUTEX_DECL(m2); -#if CH_USE_CONDVARS || defined(__DOXYGEN__) -static CONDVAR_DECL(c1); -#endif - -/** - * @page test_mtx_001 Priority enqueuing test - * - *

    Description

    - * Five threads, with increasing priority, are enqueued on a locked mutex then - * the mutex is unlocked.
    - * The test expects the threads to perform their operations in increasing - * priority order regardless of the initial order. - */ - -static void mtx1_setup(void) { - - chMtxInit(&m1); -} - -static msg_t thread1(void *p) { - - chMtxLock(&m1); - test_emit_token(*(char *)p); - chMtxUnlock(); - return 0; -} - -static void mtx1_execute(void) { - - tprio_t prio = chThdGetPriority(); /* Because priority inheritance.*/ - chMtxLock(&m1); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread1, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread1, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread1, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prio+4, thread1, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prio+5, thread1, "A"); - chMtxUnlock(); - test_wait_threads(); - test_assert(1, prio == chThdGetPriority(), "wrong priority level"); - test_assert_sequence(2, "ABCDE"); -} - -ROMCONST struct testcase testmtx1 = { - "Mutexes, priority enqueuing test", - mtx1_setup, - NULL, - mtx1_execute -}; - -#if CH_DBG_THREADS_PROFILING || defined(__DOXYGEN__) -/** - * @page test_mtx_002 Priority inheritance, simple case - * - *

    Description

    - * Three threads are involved in the classic priority inversion scenario, a - * medium priority thread tries to starve an high priority thread by - * blocking a low priority thread into a mutex lock zone.
    - * The test expects the threads to reach their goal in increasing priority - * order by rearranging their priorities in order to avoid the priority - * inversion trap. - * - *

    Scenario

    - * This weird looking diagram should explain what happens in the test case: - * @code - * Time ----> 0 10 20 30 40 50 60 70 80 90 100 - * 0 ......AL++++++++++............2+++++++++++AU0---------------++++++G... - * 1 ..................++++++++++++------------------++++++++++++G......... - * 2 .............................AL..........++++++AUG................... - * ^ ^ - * Legend: - * 0..2 - Priority levels - * +++ - Running - * --- - Ready - * ... - Waiting or Terminated - * xL - Lock operation on mutex 'x' - * xUn - Unlock operation on mutex 'x' with priority returning to level 'n' - * G - Goal - * ^ - Priority transition (boost or return). - * @endcode - */ - -static void mtx2_setup(void) { - - chMtxInit(&m1); -} - -/* Low priority thread */ -static msg_t thread2L(void *p) { - - (void)p; - chMtxLock(&m1); - test_cpu_pulse(40); - chMtxUnlock(); - test_cpu_pulse(10); - test_emit_token('C'); - return 0; -} - -/* Medium priority thread */ -static msg_t thread2M(void *p) { - - (void)p; - chThdSleepMilliseconds(20); - test_cpu_pulse(40); - test_emit_token('B'); - return 0; -} - -/* High priority thread */ -static msg_t thread2H(void *p) { - - (void)p; - chThdSleepMilliseconds(40); - chMtxLock(&m1); - test_cpu_pulse(10); - chMtxUnlock(); - test_emit_token('A'); - return 0; -} - -static void mtx2_execute(void) { - systime_t time; - - test_wait_tick(); - time = chTimeNow(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-1, thread2H, 0); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-2, thread2M, 0); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread2L, 0); - test_wait_threads(); - test_assert_sequence(1, "ABC"); - test_assert_time_window(2, time + MS2ST(100), time + MS2ST(100) + ALLOWED_DELAY); -} - -ROMCONST struct testcase testmtx2 = { - "Mutexes, priority inheritance, simple case", - mtx2_setup, - NULL, - mtx2_execute -}; - -/** - * @page test_mtx_003 Priority inheritance, complex case - * - *

    Description

    - * Five threads are involved in the complex priority inversion scenario, - * please refer to the diagram below for the complete scenario.
    - * The test expects the threads to perform their operations in increasing - * priority order by rearranging their priorities in order to avoid the - * priority inversion trap. - * - *

    Scenario

    - * This weird looking diagram should explain what happens in the test case: - * @code - * Time ----> 0 10 20 30 40 50 60 70 80 90 100 110 - * 0 ......BL++++------------2+++++------4+++++BU0---------------------------G..... - * 1 ............AL++++2+++++BL----------4-----++++++BU4+++AU1---------------G..... - * 2 ..................AL----------------------------------------------++++++AUG... - * 3 ..............................+++++++-----------------------++++++G........... - * 4 ....................................AL................++++++AUG............... - * ^ ^ ^ ^ ^ ^ - * Legend: - * 0..4 - Priority levels - * +++ - Running - * --- - Ready - * ... - Waiting or Terminated - * xL - Lock operation on mutex 'x' - * xUn - Unlock operation on mutex 'x' with priority returning to level 'n' - * ^ - Priority transition (boost or return). - * @endcode - */ - -static void mtx3_setup(void) { - - chMtxInit(&m1); /* Mutex B.*/ - chMtxInit(&m2); /* Mutex A.*/ -} - -/* Lowest priority thread */ -static msg_t thread3LL(void *p) { - - (void)p; - chMtxLock(&m1); - test_cpu_pulse(30); - chMtxUnlock(); - test_emit_token('E'); - return 0; -} - -/* Low priority thread */ -static msg_t thread3L(void *p) { - - (void)p; - chThdSleepMilliseconds(10); - chMtxLock(&m2); - test_cpu_pulse(20); - chMtxLock(&m1); - test_cpu_pulse(10); - chMtxUnlock(); - test_cpu_pulse(10); - chMtxUnlock(); - test_emit_token('D'); - return 0; -} - -/* Medium priority thread */ -static msg_t thread3M(void *p) { - - (void)p; - chThdSleepMilliseconds(20); - chMtxLock(&m2); - test_cpu_pulse(10); - chMtxUnlock(); - test_emit_token('C'); - return 0; -} - -/* High priority thread */ -static msg_t thread3H(void *p) { - - (void)p; - chThdSleepMilliseconds(40); - test_cpu_pulse(20); - test_emit_token('B'); - return 0; -} - -/* Highest priority thread */ -static msg_t thread3HH(void *p) { - - (void)p; - chThdSleepMilliseconds(50); - chMtxLock(&m2); - test_cpu_pulse(10); - chMtxUnlock(); - test_emit_token('A'); - return 0; -} - -static void mtx3_execute(void) { - systime_t time; - - test_wait_tick(); - time = chTimeNow(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-5, thread3LL, 0); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-4, thread3L, 0); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread3M, 0); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-2, thread3H, 0); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-1, thread3HH, 0); - test_wait_threads(); - test_assert_sequence(1, "ABCDE"); - test_assert_time_window(2, time + MS2ST(110), time + MS2ST(110) + ALLOWED_DELAY); -} - -ROMCONST struct testcase testmtx3 = { - "Mutexes, priority inheritance, complex case", - mtx3_setup, - NULL, - mtx3_execute -}; -#endif /* CH_DBG_THREADS_PROFILING */ - -/** - * @page test_mtx_004 Priority return verification - * - *

    Description

    - * Two threads are spawned that try to lock the mutexes locked by the tester - * thread with precise timing.
    - * The test expects that the priority changes caused by the priority - * inheritance algorithm happen at the right moment and with the right values. - */ - -static void mtx4_setup(void) { - - chMtxInit(&m1); - chMtxInit(&m2); -} - -static msg_t thread4a(void *p) { - - (void)p; - chThdSleepMilliseconds(50); - chMtxLock(&m2); - chMtxUnlock(); - return 0; -} - -static msg_t thread4b(void *p) { - - (void)p; - chThdSleepMilliseconds(150); - chMtxLock(&m1); - chMtxUnlock(); - return 0; -} - -static void mtx4_execute(void) { - tprio_t p, p1, p2; - - p = chThdGetPriority(); - p1 = p + 1; - p2 = p + 2; - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, p1, thread4a, "B"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, p2, thread4b, "A"); - chMtxLock(&m2); - test_assert(1, chThdGetPriority() == p, "wrong priority level"); - chThdSleepMilliseconds(100); - test_assert(2, chThdGetPriority() == p1, "wrong priority level"); - chMtxLock(&m1); - test_assert(3, chThdGetPriority() == p1, "wrong priority level"); - chThdSleepMilliseconds(100); - test_assert(4, chThdGetPriority() == p2, "wrong priority level"); - chMtxUnlock(); - test_assert(5, chThdGetPriority() == p1, "wrong priority level"); - chThdSleepMilliseconds(100); - test_assert(6, chThdGetPriority() == p1, "wrong priority level"); - chMtxUnlockAll(); - test_assert(7, chThdGetPriority() == p, "wrong priority level"); - test_wait_threads(); - - /* Test repeated in order to cover chMtxUnlockS().*/ - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, p1, thread4a, "D"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, p2, thread4b, "C"); - chMtxLock(&m2); - test_assert(8, chThdGetPriority() == p, "wrong priority level"); - chThdSleepMilliseconds(100); - test_assert(9, chThdGetPriority() == p1, "wrong priority level"); - chMtxLock(&m1); - test_assert(10, chThdGetPriority() == p1, "wrong priority level"); - chThdSleepMilliseconds(100); - test_assert(11, chThdGetPriority() == p2, "wrong priority level"); - chSysLock(); - chMtxUnlockS(); - chSysUnlock(); - test_assert(12, chThdGetPriority() == p1, "wrong priority level"); - chThdSleepMilliseconds(100); - test_assert(13, chThdGetPriority() == p1, "wrong priority level"); - chMtxUnlockAll(); - test_assert(14, chThdGetPriority() == p, "wrong priority level"); - test_wait_threads(); -} - -ROMCONST struct testcase testmtx4 = { - "Mutexes, priority return", - mtx4_setup, - NULL, - mtx4_execute -}; - -/** - * @page test_mtx_005 Mutex status - * - *

    Description

    - * Various tests on the mutex structure status after performing some lock and - * unlock operations.
    - * The test expects that the internal mutex status is consistent after each - * operation. - */ - -static void mtx5_setup(void) { - - chMtxInit(&m1); -} - -static void mtx5_execute(void) { - bool_t b; - tprio_t prio; - - prio = chThdGetPriority(); - - b = chMtxTryLock(&m1); - test_assert(1, b, "already locked"); - - b = chMtxTryLock(&m1); - test_assert(2, !b, "not locked"); - - chSysLock(); - chMtxUnlockS(); - chSysUnlock(); - - test_assert(3, isempty(&m1.m_queue), "queue not empty"); - test_assert(4, m1.m_owner == NULL, "still owned"); - test_assert(5, chThdGetPriority() == prio, "wrong priority level"); - - chMtxLock(&m1); - chMtxUnlockAll(); - test_assert(6, isempty(&m1.m_queue), "queue not empty"); - test_assert(7, m1.m_owner == NULL, "still owned"); -} - -ROMCONST struct testcase testmtx5 = { - "Mutexes, status", - mtx5_setup, - NULL, - mtx5_execute -}; - -#if CH_USE_CONDVARS || defined(__DOXYGEN__) -/** - * @page test_mtx_006 Condition Variable signal test - * - *

    Description

    - * Five threads take a mutex and then enter a conditional variable queue, the - * tester thread then proceeds to signal the conditional variable five times - * atomically.
    - * The test expects the threads to reach their goal in increasing priority - * order regardless of the initial order. - */ - -static void mtx6_setup(void) { - - chCondInit(&c1); - chMtxInit(&m1); -} - -static msg_t thread10(void *p) { - - chMtxLock(&m1); - chCondWait(&c1); - test_emit_token(*(char *)p); - chMtxUnlock(); - return 0; -} - -static void mtx6_execute(void) { - - tprio_t prio = chThdGetPriority(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread10, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread10, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread10, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prio+4, thread10, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prio+5, thread10, "A"); - chSysLock(); - chCondSignalI(&c1); - chCondSignalI(&c1); - chCondSignalI(&c1); - chCondSignalI(&c1); - chCondSignalI(&c1); - chSchRescheduleS(); - chSysUnlock(); - test_wait_threads(); - test_assert_sequence(1, "ABCDE"); -} - -ROMCONST struct testcase testmtx6 = { - "CondVar, signal test", - mtx6_setup, - NULL, - mtx6_execute -}; - -/** - * @page test_mtx_007 Condition Variable broadcast test - * - *

    Description

    - * Five threads take a mutex and then enter a conditional variable queue, the - * tester thread then proceeds to broadcast the conditional variable.
    - * The test expects the threads to reach their goal in increasing priority - * order regardless of the initial order. - */ - -static void mtx7_setup(void) { - - chCondInit(&c1); - chMtxInit(&m1); -} - -static void mtx7_execute(void) { - - tprio_t prio = chThdGetPriority(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread10, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread10, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread10, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, prio+4, thread10, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, prio+5, thread10, "A"); - chCondBroadcast(&c1); - test_wait_threads(); - test_assert_sequence(1, "ABCDE"); -} - -ROMCONST struct testcase testmtx7 = { - "CondVar, broadcast test", - mtx7_setup, - NULL, - mtx7_execute -}; - -/** - * @page test_mtx_008 Condition Variable priority boost test - * - *

    Description

    - * This test case verifies the priority boost of a thread waiting on a - * conditional variable queue. It tests this very specific situation in order - * to complete the code coverage. - */ - -static void mtx8_setup(void) { - - chCondInit(&c1); - chMtxInit(&m1); - chMtxInit(&m2); -} - -static msg_t thread11(void *p) { - - chMtxLock(&m2); - chMtxLock(&m1); -#if CH_USE_CONDVARS_TIMEOUT || defined(__DOXYGEN__) - chCondWaitTimeout(&c1, TIME_INFINITE); -#else - chCondWait(&c1); -#endif - test_emit_token(*(char *)p); - chMtxUnlock(); - chMtxUnlock(); - return 0; -} - -static msg_t thread12(void *p) { - - chMtxLock(&m2); - test_emit_token(*(char *)p); - chMtxUnlock(); - return 0; -} - -static void mtx8_execute(void) { - - tprio_t prio = chThdGetPriority(); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, prio+1, thread11, "A"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, prio+2, thread10, "C"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, prio+3, thread12, "B"); - chCondSignal(&c1); - chCondSignal(&c1); - test_wait_threads(); - test_assert_sequence(1, "ABC"); -} - -ROMCONST struct testcase testmtx8 = { - "CondVar, boost test", - mtx8_setup, - NULL, - mtx8_execute -}; -#endif /* CH_USE_CONDVARS */ -#endif /* CH_USE_MUTEXES */ - -/** - * @brief Test sequence for mutexes. - */ -ROMCONST struct testcase * ROMCONST patternmtx[] = { -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - &testmtx1, -#if CH_DBG_THREADS_PROFILING || defined(__DOXYGEN__) - &testmtx2, - &testmtx3, -#endif - &testmtx4, - &testmtx5, -#if CH_USE_CONDVARS || defined(__DOXYGEN__) - &testmtx6, - &testmtx7, - &testmtx8, -#endif -#endif - NULL -}; diff --git a/test/testmtx.h b/test/testmtx.h deleted file mode 100644 index 56e380a94f..0000000000 --- a/test/testmtx.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTMTX_H_ -#define _TESTMTX_H_ - -extern ROMCONST struct testcase * ROMCONST patternmtx[]; - -#endif /* _TESTMTX_H_ */ diff --git a/test/testpools.c b/test/testpools.c deleted file mode 100644 index 2583170fd8..0000000000 --- a/test/testpools.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_pools Memory Pools test - * - * File: @ref testpools.c - * - *

    Description

    - * This module implements the test sequence for the @ref pools subsystem. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref pools code. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_MEMPOOLS - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_pools_001 - * . - * @file testpools.c - * @brief Memory Pools test source file - * @file testpools.h - * @brief Memory Pools test header file - */ - -#if CH_USE_MEMPOOLS || defined(__DOXYGEN__) - -static MEMORYPOOL_DECL(mp1, THD_WA_SIZE(THREADS_STACK_SIZE), NULL); - -/** - * @page test_pools_001 Allocation and enqueuing test - * - *

    Description

    - * Five memory blocks are added to a memory pool then removed.
    - * The test expects to find the pool queue in the proper status after each - * operation. - */ - -static void *null_provider(size_t size) { - - (void)size; - return NULL; -} - -static void pools1_setup(void) { - - chPoolInit(&mp1, THD_WA_SIZE(THREADS_STACK_SIZE), NULL); -} - -static void pools1_execute(void) { - int i; - - /* Adding the WAs to the pool.*/ - chPoolLoadArray(&mp1, wa[0], MAX_THREADS); - - /* Emptying the pool.*/ - for (i = 0; i < MAX_THREADS; i++) - test_assert(1, chPoolAlloc(&mp1) != NULL, "list empty"); - - /* Now must be empty.*/ - test_assert(2, chPoolAlloc(&mp1) == NULL, "list not empty"); - - /* Adding the WAs to the pool, one by one this time.*/ - for (i = 0; i < MAX_THREADS; i++) - chPoolFree(&mp1, wa[i]); - - /* Emptying the pool again.*/ - for (i = 0; i < MAX_THREADS; i++) - test_assert(3, chPoolAlloc(&mp1) != NULL, "list empty"); - - /* Now must be empty again.*/ - test_assert(4, chPoolAlloc(&mp1) == NULL, "list not empty"); - - /* Covering the case where a provider is unable to return more memory.*/ - chPoolInit(&mp1, 16, null_provider); - test_assert(5, chPoolAlloc(&mp1) == NULL, "provider returned memory"); -} - -ROMCONST struct testcase testpools1 = { - "Memory Pools, queue/dequeue", - pools1_setup, - NULL, - pools1_execute -}; - -#endif /* CH_USE_MEMPOOLS */ - -/* - * @brief Test sequence for pools. - */ -ROMCONST struct testcase * ROMCONST patternpools[] = { -#if CH_USE_MEMPOOLS || defined(__DOXYGEN__) - &testpools1, -#endif - NULL -}; diff --git a/test/testpools.h b/test/testpools.h deleted file mode 100644 index 2cfa8e3709..0000000000 --- a/test/testpools.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTPOOLS_H_ -#define _TESTPOOLS_H_ - -extern ROMCONST struct testcase * ROMCONST patternpools[]; - -#endif /* _TESTPOOLS_H_ */ diff --git a/test/testqueues.c b/test/testqueues.c deleted file mode 100644 index 1dc669af74..0000000000 --- a/test/testqueues.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_queues I/O Queues test - * - * File: @ref testqueues.c - * - *

    Description

    - * This module implements the test sequence for the @ref io_queues subsystem. - * The tests are performed by inserting and removing data from queues and by - * checking both the queues status and the correct sequence of the extracted - * data. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref io_queues code.
    - * Note that the @ref io_queues subsystem depends on the @ref semaphores - * subsystem that has to met its testing objectives as well. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_QUEUES (and dependent options) - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_queues_001 - * - @subpage test_queues_002 - * . - * @file testqueues.c - * @brief I/O Queues test source file - * @file testqueues.h - * @brief I/O Queues test header file - */ - -#if CH_USE_QUEUES || defined(__DOXYGEN__) - -#define TEST_QUEUES_SIZE 4 - -static void notify(GenericQueue *qp) { - (void)qp; -} - -/* - * Note, the static initializers are not really required because the - * variables are explicitly initialized in each test case. It is done in order - * to test the macros. - */ -static INPUTQUEUE_DECL(iq, test.wa.T0, TEST_QUEUES_SIZE, notify, NULL); -static OUTPUTQUEUE_DECL(oq, test.wa.T1, TEST_QUEUES_SIZE, notify, NULL); - -/** - * @page test_queues_001 Input Queues functionality and APIs - * - *

    Description

    - * This test case tests sysnchronos and asynchronous operations on an - * @p InputQueue object including timeouts. The queue state must remain - * consistent through the whole test. - */ - -static void queues1_setup(void) { - - chIQInit(&iq, wa[0], TEST_QUEUES_SIZE, notify, NULL); -} - -static msg_t thread1(void *p) { - - (void)p; - chIQGetTimeout(&iq, MS2ST(200)); - return 0; -} - -static void queues1_execute(void) { - unsigned i; - size_t n; - - /* Initial empty state */ - test_assert_lock(1, chIQIsEmptyI(&iq), "not empty"); - - /* Queue filling */ - chSysLock(); - for (i = 0; i < TEST_QUEUES_SIZE; i++) - chIQPutI(&iq, 'A' + i); - chSysUnlock(); - test_assert_lock(2, chIQIsFullI(&iq), "still has space"); - test_assert_lock(3, chIQPutI(&iq, 0) == Q_FULL, "failed to report Q_FULL"); - - /* Queue emptying */ - for (i = 0; i < TEST_QUEUES_SIZE; i++) - test_emit_token(chIQGet(&iq)); - test_assert_lock(4, chIQIsEmptyI(&iq), "still full"); - test_assert_sequence(5, "ABCD"); - - /* Queue filling again */ - chSysLock(); - for (i = 0; i < TEST_QUEUES_SIZE; i++) - chIQPutI(&iq, 'A' + i); - chSysUnlock(); - - /* Reading the whole thing */ - n = chIQReadTimeout(&iq, wa[1], TEST_QUEUES_SIZE * 2, TIME_IMMEDIATE); - test_assert(6, n == TEST_QUEUES_SIZE, "wrong returned size"); - test_assert_lock(7, chIQIsEmptyI(&iq), "still full"); - - /* Queue filling again */ - chSysLock(); - for (i = 0; i < TEST_QUEUES_SIZE; i++) - chIQPutI(&iq, 'A' + i); - chSysUnlock(); - - /* Partial reads */ - n = chIQReadTimeout(&iq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); - test_assert(8, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); - n = chIQReadTimeout(&iq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); - test_assert(9, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); - test_assert_lock(10, chIQIsEmptyI(&iq), "still full"); - - /* Testing reset */ - chSysLock(); - chIQPutI(&iq, 0); - chIQResetI(&iq); - chSysUnlock(); - test_assert_lock(11, chIQGetFullI(&iq) == 0, "still full"); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread1, NULL); - test_assert_lock(12, chIQGetFullI(&iq) == 0, "not empty"); - test_wait_threads(); - - /* Timeout */ - test_assert(13, chIQGetTimeout(&iq, 10) == Q_TIMEOUT, "wrong timeout return"); -} - -ROMCONST struct testcase testqueues1 = { - "Queues, input queues", - queues1_setup, - NULL, - queues1_execute -}; - -/** - * @page test_queues_002 Output Queues functionality and APIs - * - *

    Description

    - * This test case tests sysnchronos and asynchronous operations on an - * @p OutputQueue object including timeouts. The queue state must remain - * consistent through the whole test. - */ - -static void queues2_setup(void) { - - chOQInit(&oq, wa[0], TEST_QUEUES_SIZE, notify, NULL); -} - -static msg_t thread2(void *p) { - - (void)p; - chOQPutTimeout(&oq, 0, MS2ST(200)); - return 0; -} - -static void queues2_execute(void) { - unsigned i; - size_t n; - - /* Initial empty state */ - test_assert_lock(1, chOQIsEmptyI(&oq), "not empty"); - - /* Queue filling */ - for (i = 0; i < TEST_QUEUES_SIZE; i++) - chOQPut(&oq, 'A' + i); - test_assert_lock(2, chOQIsFullI(&oq), "still has space"); - - /* Queue emptying */ - for (i = 0; i < TEST_QUEUES_SIZE; i++) { - char c; - - chSysLock(); - c = chOQGetI(&oq); - chSysUnlock(); - test_emit_token(c); - } - test_assert_lock(3, chOQIsEmptyI(&oq), "still full"); - test_assert_sequence(4, "ABCD"); - test_assert_lock(5, chOQGetI(&oq) == Q_EMPTY, "failed to report Q_EMPTY"); - - /* Writing the whole thing */ - n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE * 2, TIME_IMMEDIATE); - test_assert(6, n == TEST_QUEUES_SIZE, "wrong returned size"); - test_assert_lock(7, chOQIsFullI(&oq), "not full"); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread2, NULL); - test_assert_lock(8, chOQGetFullI(&oq) == TEST_QUEUES_SIZE, "not empty"); - test_wait_threads(); - - /* Testing reset */ - chSysLock(); - chOQResetI(&oq); - chSysUnlock(); - test_assert_lock(9, chOQGetFullI(&oq) == 0, "still full"); - - /* Partial writes */ - n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); - test_assert(10, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); - n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); - test_assert(11, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); - test_assert_lock(12, chOQIsFullI(&oq), "not full"); - - /* Timeout */ - test_assert(13, chOQPutTimeout(&oq, 0, 10) == Q_TIMEOUT, "wrong timeout return"); -} - -ROMCONST struct testcase testqueues2 = { - "Queues, output queues", - queues2_setup, - NULL, - queues2_execute -}; -#endif /* CH_USE_QUEUES */ - -/** - * @brief Test sequence for queues. - */ -ROMCONST struct testcase * ROMCONST patternqueues[] = { -#if CH_USE_QUEUES || defined(__DOXYGEN__) - &testqueues1, - &testqueues2, -#endif - NULL -}; diff --git a/test/testqueues.h b/test/testqueues.h deleted file mode 100644 index ae2a39b285..0000000000 --- a/test/testqueues.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTQUEUES_H_ -#define _TESTQUEUES_H_ - -extern ROMCONST struct testcase * ROMCONST patternqueues[]; - -#endif /* _TESTQUEUES_H_ */ diff --git a/test/testsem.c b/test/testsem.c deleted file mode 100644 index 88f28791cb..0000000000 --- a/test/testsem.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_sem Semaphores test - * - * File: @ref testsem.c - * - *

    Description

    - * This module implements the test sequence for the @ref semaphores subsystem. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the @ref semaphores code. - * - *

    Preconditions

    - * The module requires the following kernel options: - * - @p CH_USE_SEMAPHORES - * . - * In case some of the required options are not enabled then some or all tests - * may be skipped. - * - *

    Test Cases

    - * - @subpage test_sem_001 - * - @subpage test_sem_002 - * - @subpage test_sem_003 - * - @subpage test_sem_004 - * . - * @file testsem.c - * @brief Semaphores test source file - * @file testsem.h - * @brief Semaphores test header file - */ - -#if CH_USE_SEMAPHORES || defined(__DOXYGEN__) - -#define ALLOWED_DELAY MS2ST(5) - -/* - * Note, the static initializers are not really required because the - * variables are explicitly initialized in each test case. It is done in order - * to test the macros. - */ -static SEMAPHORE_DECL(sem1, 0); - -/** - * @page test_sem_001 Enqueuing test - * - *

    Description

    - * Five threads with randomized priorities are enqueued to a semaphore then - * awakened one at time.
    - * The test expects that the threads reach their goal in FIFO order or - * priority order depending on the CH_USE_SEMAPHORES_PRIORITY configuration - * setting. - */ - -static void sem1_setup(void) { - - chSemInit(&sem1, 0); -} - -static msg_t thread1(void *p) { - - chSemWait(&sem1); - test_emit_token(*(char *)p); - return 0; -} - -static void sem1_execute(void) { - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+5, thread1, "A"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()+1, thread1, "B"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()+3, thread1, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()+4, thread1, "D"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()+2, thread1, "E"); - chSemSignal(&sem1); - chSemSignal(&sem1); - chSemSignal(&sem1); - chSemSignal(&sem1); - chSemSignal(&sem1); - test_wait_threads(); -#if CH_USE_SEMAPHORES_PRIORITY - test_assert_sequence(1, "ADCEB"); -#else - test_assert_sequence(1, "ABCDE"); -#endif - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+5, thread1, "A"); - chSysLock(); - chSemAddCounterI(&sem1, 2); - chSysUnlock(); - test_wait_threads(); - test_assert(2, chSemGetCounterI(&sem1) == 1, "invalid counter"); -} - -ROMCONST struct testcase testsem1 = { - "Semaphores, enqueuing", - sem1_setup, - NULL, - sem1_execute -}; - -/** - * @page test_sem_002 Timeout test - * - *

    Description

    - * The three possible semaphore waiting modes (do not wait, wait with timeout, - * wait without timeout) are explored.
    - * The test expects that the semaphore wait function returns the correct value - * in each of the above scenario and that the semaphore structure status is - * correct after each operation. - */ - -static void sem2_setup(void) { - - chSemInit(&sem1, 0); -} - -static msg_t thread2(void *p) { - - (void)p; - chThdSleepMilliseconds(50); - chSysLock(); - chSemSignalI(&sem1); /* For coverage reasons */ - chSchRescheduleS(); - chSysUnlock(); - return 0; -} - -static void sem2_execute(void) { - int i; - systime_t target_time; - msg_t msg; - - /* - * Testing special case TIME_IMMEDIATE. - */ - msg = chSemWaitTimeout(&sem1, TIME_IMMEDIATE); - test_assert(1, msg == RDY_TIMEOUT, "wrong wake-up message"); - test_assert(2, isempty(&sem1.s_queue), "queue not empty"); - test_assert(3, sem1.s_cnt == 0, "counter not zero"); - - /* - * Testing not timeout condition. - */ - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() - 1, - thread2, 0); - msg = chSemWaitTimeout(&sem1, MS2ST(500)); - test_wait_threads(); - test_assert(4, msg == RDY_OK, "wrong wake-up message"); - test_assert(5, isempty(&sem1.s_queue), "queue not empty"); - test_assert(6, sem1.s_cnt == 0, "counter not zero"); - - /* - * Testing timeout condition. - */ - test_wait_tick(); - target_time = chTimeNow() + MS2ST(5 * 500); - for (i = 0; i < 5; i++) { - test_emit_token('A' + i); - msg = chSemWaitTimeout(&sem1, MS2ST(500)); - test_assert(7, msg == RDY_TIMEOUT, "wrong wake-up message"); - test_assert(8, isempty(&sem1.s_queue), "queue not empty"); - test_assert(9, sem1.s_cnt == 0, "counter not zero"); - } - test_assert_sequence(10, "ABCDE"); - test_assert_time_window(11, target_time, target_time + ALLOWED_DELAY); -} - -ROMCONST struct testcase testsem2 = { - "Semaphores, timeout", - sem2_setup, - NULL, - sem2_execute -}; - -#if CH_USE_SEMSW || defined(__DOXYGEN__) -/** - * @page test_sem_003 Atomic signal-wait test - * - *

    Description

    - * This test case explicitly addresses the @p chSemWaitSignal() function. A - * thread is created that performs a wait and a signal operations. - * The tester thread is awakened from an atomic wait/signal operation.
    - * The test expects that the semaphore wait function returns the correct value - * in each of the above scenario and that the semaphore structure status is - * correct after each operation. - */ - -static void sem3_setup(void) { - - chSemInit(&sem1, 0); -} - -static msg_t thread3(void *p) { - - (void)p; - chSemWait(&sem1); - chSemSignal(&sem1); - return 0; -} - -static void sem3_execute(void) { - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()+1, thread3, 0); - chSemSignalWait(&sem1, &sem1); - test_assert(1, isempty(&sem1.s_queue), "queue not empty"); - test_assert(2, sem1.s_cnt == 0, "counter not zero"); - - chSemSignalWait(&sem1, &sem1); - test_assert(3, isempty(&sem1.s_queue), "queue not empty"); - test_assert(4, sem1.s_cnt == 0, "counter not zero"); -} - -ROMCONST struct testcase testsem3 = { - "Semaphores, atomic signal-wait", - sem3_setup, - NULL, - sem3_execute -}; -#endif /* CH_USE_SEMSW */ - -/** - * @page test_sem_004 Binary Wait and Signal - * - *

    Description

    - * This test case tests the binary semaphores functionality. The test both - * checks the binary semaphore status and the expected status of the underlying - * counting semaphore. - */ -static msg_t thread4(void *p) { - - chBSemSignal((BinarySemaphore *)p); - return 0; -} - -static void sem4_execute(void) { - BinarySemaphore bsem; - - /* Creates a taken binary semaphore.*/ - chBSemInit(&bsem, TRUE); - chBSemReset(&bsem, TRUE); - test_assert(1, chBSemGetStateI(&bsem) == TRUE, "not taken"); - - /* Starts a signaler thread at a lower priority.*/ - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, - chThdGetPriority()-1, thread4, &bsem); - - /* Waits to be signaled.*/ - chBSemWait(&bsem); - - /* The binary semaphore is expected to be taken.*/ - test_assert(2, chBSemGetStateI(&bsem) == TRUE, "not taken"); - - /* Releasing it, check both the binary semaphore state and the underlying - counter semaphore state..*/ - chBSemSignal(&bsem); - test_assert(3, chBSemGetStateI(&bsem) == FALSE, "still taken"); - test_assert(4, chSemGetCounterI(&bsem.bs_sem) == 1, "unexpected counter"); - - /* Checking signaling overflow, the counter must not go beyond 1.*/ - chBSemSignal(&bsem); - test_assert(3, chBSemGetStateI(&bsem) == FALSE, "taken"); - test_assert(5, chSemGetCounterI(&bsem.bs_sem) == 1, "unexpected counter"); -} - -ROMCONST struct testcase testsem4 = { - "Binary Semaphores, functionality", - NULL, - NULL, - sem4_execute -}; -#endif /* CH_USE_SEMAPHORES */ - -/** - * @brief Test sequence for semaphores. - */ -ROMCONST struct testcase * ROMCONST patternsem[] = { -#if CH_USE_SEMAPHORES || defined(__DOXYGEN__) - &testsem1, - &testsem2, -#if CH_USE_SEMSW || defined(__DOXYGEN__) - &testsem3, -#endif - &testsem4, -#endif - NULL -}; diff --git a/test/testsem.h b/test/testsem.h deleted file mode 100644 index 664e2ba772..0000000000 --- a/test/testsem.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTSEM_H_ -#define _TESTSEM_H_ - -extern ROMCONST struct testcase * ROMCONST patternsem[]; - -#endif /* _TESTSEM_H_ */ diff --git a/test/testthd.c b/test/testthd.c deleted file mode 100644 index ac3fe5dd63..0000000000 --- a/test/testthd.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "test.h" - -/** - * @page test_threads Threads and Scheduler test - * - * File: @ref testthd.c - * - *

    Description

    - * This module implements the test sequence for the @ref scheduler, - * @ref threads and @ref time subsystems.
    - * Note that the tests on those subsystems are formally required but most of - * their functionality is already demonstrated because the test suite itself - * depends on them, anyway double check is good. - * - *

    Objective

    - * Objective of the test module is to cover 100% of the subsystems code. - * - *

    Preconditions

    - * None. - * - *

    Test Cases

    - * - @subpage test_threads_001 - * - @subpage test_threads_002 - * - @subpage test_threads_003 - * - @subpage test_threads_004 - * . - * @file testthd.c - * @brief Threads and Scheduler test source file - * @file testthd.h - * @brief Threads and Scheduler test header file - */ - -/** - * @page test_threads_001 Ready List functionality #1 - * - *

    Description

    - * Five threads, with increasing priority, are enqueued in the ready list - * and atomically executed.
    - * The test expects the threads to perform their operations in increasing - * priority order regardless of the initial order. - */ - -static msg_t thread(void *p) { - - test_emit_token(*(char *)p); - return 0; -} - -static void thd1_execute(void) { - - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-5, thread, "E"); - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-4, thread, "D"); - threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriority()-3, thread, "C"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-2, thread, "B"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-1, thread, "A"); - test_wait_threads(); - test_assert_sequence(1, "ABCDE"); -} - -ROMCONST struct testcase testthd1 = { - "Threads, enqueuing test #1", - NULL, - NULL, - thd1_execute -}; - -/** - * @page test_threads_002 Ready List functionality #2 - * - *

    Description

    - * Five threads, with pseudo-random priority, are enqueued in the ready list - * and atomically executed.
    - * The test expects the threads to perform their operations in increasing - * priority order regardless of the initial order. - */ - -static void thd2_execute(void) { - - threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriority()-4, thread, "D"); - threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority()-5, thread, "E"); - threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriority()-1, thread, "A"); - threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriority()-2, thread, "B"); - /* Done this way for coverage of chThdCreateI() and chThdResume().*/ - chSysLock(); - threads[2] = chThdCreateI(wa[2], WA_SIZE, chThdGetPriority()-3, thread, "C"); - chSysUnlock(); - chThdResume(threads[2]); - test_wait_threads(); - test_assert_sequence(1, "ABCDE"); -} - -ROMCONST struct testcase testthd2 = { - "Threads, enqueuing test #2", - NULL, - NULL, - thd2_execute -}; - -/** - * @page test_threads_003 Threads priority change test - * - *

    Description

    - * A series of priority changes are performed on the current thread in order - * to verify that the priority change happens as expected.
    - * If the @p CH_USE_MUTEXES option is enabled then the priority changes are - * also tested under priority inheritance boosted priority state. - */ - -static void thd3_execute(void) { - tprio_t prio, p1; - - prio = chThdGetPriority(); - p1 = chThdSetPriority(prio + 1); - test_assert(1, p1 == prio, - "unexpected returned priority level"); - test_assert(2, chThdGetPriority() == prio + 1, - "unexpected priority level"); - p1 = chThdSetPriority(p1); - test_assert(3, p1 == prio + 1, - "unexpected returned priority level"); - test_assert(4, chThdGetPriority() == prio, - "unexpected priority level"); - -#if CH_USE_MUTEXES || defined(__DOXYGEN__) - /* Simulates a priority boost situation (p_prio > p_realprio).*/ - chSysLock(); - chThdSelf()->p_prio += 2; - chSysUnlock(); - test_assert(5, chThdGetPriority() == prio + 2, - "unexpected priority level"); - - /* Tries to raise but below the boost level. */ - p1 = chThdSetPriority(prio + 1); - test_assert(6, p1 == prio, - "unexpected returned priority level"); - test_assert(7, chThdSelf()->p_prio == prio + 2, - "unexpected priority level"); - test_assert(8, chThdSelf()->p_realprio == prio + 1, - "unexpected returned real priority level"); - - /* Tries to raise above the boost level. */ - p1 = chThdSetPriority(prio + 3); - test_assert(9, p1 == prio + 1, - "unexpected returned priority level"); - test_assert(10, chThdSelf()->p_prio == prio + 3, - "unexpected priority level"); - test_assert(11, chThdSelf()->p_realprio == prio + 3, - "unexpected real priority level"); - - chSysLock(); - chThdSelf()->p_prio = prio; - chThdSelf()->p_realprio = prio; - chSysUnlock(); -#endif -} - -ROMCONST struct testcase testthd3 = { - "Threads, priority change", - NULL, - NULL, - thd3_execute -}; - -/** - * @page test_threads_004 Threads delays test - * - *

    Description

    - * Delay APIs and associated macros are tested, the invoking thread is verified - * to wake up at the exact expected time. - */ - -static void thd4_execute(void) { - systime_t time; - - test_wait_tick(); - - /* Timeouts in microseconds.*/ - time = chTimeNow(); - chThdSleepMicroseconds(100000); - test_assert_time_window(1, time + US2ST(100000), time + US2ST(100000) + 1); - - /* Timeouts in milliseconds.*/ - time = chTimeNow(); - chThdSleepMilliseconds(100); - test_assert_time_window(2, time + MS2ST(100), time + MS2ST(100) + 1); - - /* Timeouts in seconds.*/ - time = chTimeNow(); - chThdSleepSeconds(1); - test_assert_time_window(3, time + S2ST(1), time + S2ST(1) + 1); - - /* Absolute timelines.*/ - time = chTimeNow() + MS2ST(100); - chThdSleepUntil(time); - test_assert_time_window(4, time, time + 1); -} - -ROMCONST struct testcase testthd4 = { - "Threads, delays", - NULL, - NULL, - thd4_execute -}; - -/** - * @brief Test sequence for threads. - */ -ROMCONST struct testcase * ROMCONST patternthd[] = { - &testthd1, - &testthd2, - &testthd3, - &testthd4, - NULL -}; diff --git a/test/testthd.h b/test/testthd.h deleted file mode 100644 index 7ab6f4c722..0000000000 --- a/test/testthd.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef _TESTRDY_H_ -#define _TESTRDY_H_ - -extern ROMCONST struct testcase * ROMCONST patternthd[]; - -#endif /* _TESTRDY_H_ */ diff --git a/testhal/LPC11xx/IRQ_STORM/Makefile b/testhal/LPC11xx/IRQ_STORM/Makefile deleted file mode 100644 index 2dd75ef713..0000000000 --- a/testhal/LPC11xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_1114/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC11xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1114.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1114 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC11xx/IRQ_STORM/chconf.h b/testhal/LPC11xx/IRQ_STORM/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/LPC11xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/IRQ_STORM/halconf.h b/testhal/LPC11xx/IRQ_STORM/halconf.h deleted file mode 100644 index 08b919c734..0000000000 --- a/testhal/LPC11xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/IRQ_STORM/main.c b/testhal/LPC11xx/IRQ_STORM/main.c deleted file mode 100644 index 5facfaf606..0000000000 --- a/testhal/LPC11xx/IRQ_STORM/main.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIO0, GPIO0_LED2); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(LPC11xx_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/LPC11xx/IRQ_STORM/mcuconf.h b/testhal/LPC11xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index ffd32bd35a..0000000000 --- a/testhal/LPC11xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC1114 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC11xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC11xx_SYSPLL_MUL 4 -#define LPC11xx_SYSPLL_DIV 4 -#define LPC11xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC11xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC11xx_GPT_USE_CT16B0 TRUE -#define LPC11xx_GPT_USE_CT16B1 TRUE -#define LPC11xx_GPT_USE_CT32B0 TRUE -#define LPC11xx_GPT_USE_CT32B1 TRUE -#define LPC11xx_GPT_CT16B0_IRQ_PRIORITY 1 -#define LPC11xx_GPT_CT16B1_IRQ_PRIORITY 3 -#define LPC11xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC11xx_SERIAL_USE_UART0 TRUE -#define LPC11xx_SERIAL_FIFO_PRELOAD 16 -#define LPC11xx_SERIAL_UART0CLKDIV 1 -#define LPC11xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC11xx_SPI_USE_SSP0 TRUE -#define LPC11xx_SPI_USE_SSP1 FALSE -#define LPC11xx_SPI_SSP0CLKDIV 1 -#define LPC11xx_SPI_SSP1CLKDIV 1 -#define LPC11xx_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP1_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/testhal/LPC11xx/IRQ_STORM/readme.txt b/testhal/LPC11xx/IRQ_STORM/readme.txt deleted file mode 100644 index aa22b8f398..0000000000 --- a/testhal/LPC11xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for LPC11xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an LPCXpresso LPC1114 board. - -** The Demo ** - -The application demonstrates the use of the LPC11xx GPT, PAL and Serial drivers -in order to implement a system stress demo. - -** Build Procedure ** - -The demo has been tested using the free LPCXpresso toolchain but also with -Codesourcery and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -NXP and are licensed under a different license. - - http://www.nxp.com diff --git a/testhal/LPC13xx/IRQ_STORM/Makefile b/testhal/LPC13xx/IRQ_STORM/Makefile deleted file mode 100644 index 0815797543..0000000000 --- a/testhal/LPC13xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_1343/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC13xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC13xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1343.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1348 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC13xx/IRQ_STORM/chconf.h b/testhal/LPC13xx/IRQ_STORM/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/LPC13xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC13xx/IRQ_STORM/halconf.h b/testhal/LPC13xx/IRQ_STORM/halconf.h deleted file mode 100644 index 08b919c734..0000000000 --- a/testhal/LPC13xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC13xx/IRQ_STORM/main.c b/testhal/LPC13xx/IRQ_STORM/main.c deleted file mode 100644 index 11080dbf27..0000000000 --- a/testhal/LPC13xx/IRQ_STORM/main.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIO0, GPIO0_LED2); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(LPC13xx_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/LPC13xx/IRQ_STORM/mcuconf.h b/testhal/LPC13xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 3cf7694027..0000000000 --- a/testhal/LPC13xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * LPC13xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 7...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC13xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC13xx_SYSPLL_MUL 6 -#define LPC13xx_SYSPLL_DIV 4 -#define LPC13xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC13xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC13xx_GPT_USE_CT16B0 TRUE -#define LPC13xx_GPT_USE_CT16B1 TRUE -#define LPC13xx_GPT_USE_CT32B0 TRUE -#define LPC13xx_GPT_USE_CT32B1 TRUE -#define LPC13xx_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT16B1_IRQ_PRIORITY 6 -#define LPC13xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC13xx_SERIAL_USE_UART0 TRUE -#define LPC13xx_SERIAL_FIFO_PRELOAD 16 -#define LPC13xx_SERIAL_UART0CLKDIV 1 -#define LPC13xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC13xx_SPI_USE_SSP0 TRUE -#define LPC13xx_SPI_SSP0CLKDIV 1 -#define LPC13xx_SPI_SSP0_IRQ_PRIORITY 5 -#define LPC13xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC13xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/testhal/LPC13xx/IRQ_STORM/readme.txt b/testhal/LPC13xx/IRQ_STORM/readme.txt deleted file mode 100644 index 85a4cee82f..0000000000 --- a/testhal/LPC13xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for LPC13xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an LPCXpresso LPC1114 board. - -** The Demo ** - -The application demonstrates the use of the LPC13xx GPT, PAL and Serial drivers -in order to implement a system stress demo. - -** Build Procedure ** - -The demo has been tested using the free LPCXpresso toolchain but also with -Codesourcery and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -NXP and are licensed under a different license. - - http://www.nxp.com diff --git a/testhal/STM32F0xx/ADC/Makefile b/testhal/STM32F0xx/ADC/Makefile deleted file mode 100644 index 0b2d556fb7..0000000000 --- a/testhal/STM32F0xx/ADC/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/ADC/chconf.h b/testhal/STM32F0xx/ADC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F0xx/ADC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/ADC/halconf.h b/testhal/STM32F0xx/ADC/halconf.h deleted file mode 100644 index a7e957191e..0000000000 --- a/testhal/STM32F0xx/ADC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/ADC/main.c b/testhal/STM32F0xx/ADC/main.c deleted file mode 100644 index bdb8bed0fc..0000000000 --- a/testhal/STM32F0xx/ADC/main.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 4 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - ADC_CFGR1_RES_12BIT, /* CFGRR1 */ - ADC_TR(0, 0), /* TR */ - ADC_SMPR_SMP_1P5, /* SMPR */ - ADC_CHSELR_CHSEL10 /* CHSELR */ -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - ADC_CFGR1_RES_12BIT, /* CFGRR1 */ - ADC_TR(0, 0), /* TR */ - ADC_SMPR_SMP_28P5, /* SMPR */ - ADC_CHSELR_CHSEL10 | ADC_CHSELR_CHSEL11 | - ADC_CHSELR_CHSEL16 | ADC_CHSELR_CHSEL17 /* CHSELR */ -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOC, GPIOC_LED4); - chThdSleepMilliseconds(500); - palClearPad(GPIOC, GPIOC_LED4); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(0) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the thermal sensor. - */ - adcStart(&ADCD1, NULL); - adcSTM32SetCCR(ADC_CCR_VBATEN | ADC_CCR_TSEN | ADC_CCR_VREFEN); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - adcSTM32SetCCR(0); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F0xx/ADC/mcuconf.h b/testhal/STM32F0xx/ADC/mcuconf.h deleted file mode 100644 index 4cda58614c..0000000000 --- a/testhal/STM32F0xx/ADC/mcuconf.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/ADC/readme.txt b/testhal/STM32F0xx/ADC/readme.txt deleted file mode 100644 index 704ffb1a61..0000000000 --- a/testhal/STM32F0xx/ADC/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx ADC driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect PC0 to 3.3V and PC1 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/EXT/Makefile b/testhal/STM32F0xx/EXT/Makefile deleted file mode 100644 index 0b2d556fb7..0000000000 --- a/testhal/STM32F0xx/EXT/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/EXT/chconf.h b/testhal/STM32F0xx/EXT/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F0xx/EXT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/EXT/halconf.h b/testhal/STM32F0xx/EXT/halconf.h deleted file mode 100644 index 0ff2591be3..0000000000 --- a/testhal/STM32F0xx/EXT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/EXT/main.c b/testhal/STM32F0xx/EXT/main.c deleted file mode 100644 index 65618929f9..0000000000 --- a/testhal/STM32F0xx/EXT/main.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void led4off(void *arg) { - - (void)arg; - palClearPad(GPIOC, GPIOC_LED4); -} - -/* Triggered when the button is pressed or released. The LED4 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - palSetPad(GPIOC, GPIOC_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led4off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F0xx/EXT/mcuconf.h b/testhal/STM32F0xx/EXT/mcuconf.h deleted file mode 100644 index e635e00b33..0000000000 --- a/testhal/STM32F0xx/EXT/mcuconf.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/EXT/readme.txt b/testhal/STM32F0xx/EXT/readme.txt deleted file mode 100644 index 542fc577e1..0000000000 --- a/testhal/STM32F0xx/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/IRQ_STORM/Makefile b/testhal/STM32F0xx/IRQ_STORM/Makefile deleted file mode 100644 index 0b2d556fb7..0000000000 --- a/testhal/STM32F0xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/IRQ_STORM/chconf.h b/testhal/STM32F0xx/IRQ_STORM/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F0xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/IRQ_STORM/halconf.h b/testhal/STM32F0xx/IRQ_STORM/halconf.h deleted file mode 100644 index 08b919c734..0000000000 --- a/testhal/STM32F0xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/IRQ_STORM/main.c b/testhal/STM32F0xx/IRQ_STORM/main.c deleted file mode 100644 index b338d873b1..0000000000 --- a/testhal/STM32F0xx/IRQ_STORM/main.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOC, GPIOC_LED4); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 1 and GPT drivers 2 and 3. - */ - sdStart(&SD1, NULL); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(1)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(1)); /* USART1 RX. */ - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/STM32F0xx/IRQ_STORM/mcuconf.h b/testhal/STM32F0xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index f1e7ab918a..0000000000 --- a/testhal/STM32F0xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/IRQ_STORM/readme.txt b/testhal/STM32F0xx/IRQ_STORM/readme.txt deleted file mode 100644 index e56547a466..0000000000 --- a/testhal/STM32F0xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/PWM-ICU/Makefile b/testhal/STM32F0xx/PWM-ICU/Makefile deleted file mode 100644 index 0b2d556fb7..0000000000 --- a/testhal/STM32F0xx/PWM-ICU/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/PWM-ICU/chconf.h b/testhal/STM32F0xx/PWM-ICU/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F0xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/PWM-ICU/halconf.h b/testhal/STM32F0xx/PWM-ICU/halconf.h deleted file mode 100644 index 64deabdd0e..0000000000 --- a/testhal/STM32F0xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/PWM-ICU/main.c b/testhal/STM32F0xx/PWM-ICU/main.c deleted file mode 100644 index 2cabd28448..0000000000 --- a/testhal/STM32F0xx/PWM-ICU/main.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOC, GPIOC_LED4); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOC, GPIOC_LED4); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOC, GPIOC_LED3); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOC, GPIOC_LED3); - last_period = icuGetPeriod(icup); -} - -static void icuoverflowcb(ICUDriver *icup) { - - (void)icup; -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - icuoverflowcb, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA6 is the ICU input (CH1). - * GPIOA15 is the PWM output (CH1). - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(2)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOA, 6, PAL_MODE_ALTERNATE(1)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOC, GPIOC_LED3); - palClearPad(GPIOC, GPIOC_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F0xx/PWM-ICU/mcuconf.h b/testhal/STM32F0xx/PWM-ICU/mcuconf.h deleted file mode 100644 index fc02500bd5..0000000000 --- a/testhal/STM32F0xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/PWM-ICU/readme.txt b/testhal/STM32F0xx/PWM-ICU/readme.txt deleted file mode 100644 index eccb291d32..0000000000 --- a/testhal/STM32F0xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx PWM-ICU drivers. - -** Board Setup ** - -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/UART/Makefile b/testhal/STM32F0xx/UART/Makefile deleted file mode 100644 index 0b2d556fb7..0000000000 --- a/testhal/STM32F0xx/UART/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/UART/chconf.h b/testhal/STM32F0xx/UART/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F0xx/UART/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/UART/halconf.h b/testhal/STM32F0xx/UART/halconf.h deleted file mode 100644 index 55aaa1b4e3..0000000000 --- a/testhal/STM32F0xx/UART/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/UART/main.c b/testhal/STM32F0xx/UART/main.c deleted file mode 100644 index 1bf37190ab..0000000000 --- a/testhal/STM32F0xx/UART/main.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD1, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palClearPad(GPIOC, GPIOC_LED4); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOC, GPIOC_LED4); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palClearPad(GPIOC, GPIOC_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOC, GPIOC_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART1. - */ - uartStart(&UARTD1, &uart_cfg_1); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(1)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(1)); /* USART1 RX. */ - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD1, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F0xx/UART/mcuconf.h b/testhal/STM32F0xx/UART/mcuconf.h deleted file mode 100644 index e148ed6bb2..0000000000 --- a/testhal/STM32F0xx/UART/mcuconf.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/UART/readme.txt b/testhal/STM32F0xx/UART/readme.txt deleted file mode 100644 index 921f1bc8ed..0000000000 --- a/testhal/STM32F0xx/UART/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx UART driver. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/ADC/Makefile b/testhal/STM32F1xx/ADC/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/ADC/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/ADC/chconf.h b/testhal/STM32F1xx/ADC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/ADC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/ADC/halconf.h b/testhal/STM32F1xx/ADC/halconf.h deleted file mode 100644 index 5452417835..0000000000 --- a/testhal/STM32F1xx/ADC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/ADC/main.c b/testhal/STM32F1xx/ADC/main.c deleted file mode 100644 index 280a744513..0000000000 --- a/testhal/STM32F1xx/ADC/main.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, 0, /* CR1, CR2 */ - ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, /* SQR2 */ - ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, ADC_CR2_TSVREFE, /* CR1, CR2 */ - ADC_SMPR1_SMP_AN11(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_AN10(ADC_SAMPLE_41P5) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_239P5), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN10) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN10) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(0) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the thermal sensor. - */ - adcStart(&ADCD1, NULL); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - adcStopConversion(&ADCD1); - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/ADC/mcuconf.h b/testhal/STM32F1xx/ADC/mcuconf.h deleted file mode 100644 index af2c26fe09..0000000000 --- a/testhal/STM32F1xx/ADC/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/ADC/readme.txt b/testhal/STM32F1xx/ADC/readme.txt deleted file mode 100644 index 1502425f4c..0000000000 --- a/testhal/STM32F1xx/ADC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 ADC driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/CAN/Makefile b/testhal/STM32F1xx/CAN/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/CAN/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/CAN/chconf.h b/testhal/STM32F1xx/CAN/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F1xx/CAN/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/CAN/halconf.h b/testhal/STM32F1xx/CAN/halconf.h deleted file mode 100644 index 52296c1732..0000000000 --- a/testhal/STM32F1xx/CAN/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/CAN/main.c b/testhal/STM32F1xx/CAN/main.c deleted file mode 100644 index ebb3e0f4c9..0000000000 --- a/testhal/STM32F1xx/CAN/main.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Internal loopback mode, 500KBaud, automatic wakeup, automatic recover - * from abort mode. - * See section 22.7.7 on the STM32 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - CAN_BTR_LBKM | CAN_BTR_SJW(0) | CAN_BTR_TS2(1) | - CAN_BTR_TS1(8) | CAN_BTR_BRP(6), - 0, - NULL -}; - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - EventListener el; - CANRxFrame rxmsg; - - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&CAND1.rxfull_event, &el, 0); - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; - while (canReceive(&CAND1, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(IOPORT3, GPIOC_LED); - } - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.DLC = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, &txmsg, MS2ST(100)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, can_rx, NULL); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, can_tx, NULL); - - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/CAN/mcuconf.h b/testhal/STM32F1xx/CAN/mcuconf.h deleted file mode 100644 index b1e2f3066f..0000000000 --- a/testhal/STM32F1xx/CAN/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/CAN/readme.txt b/testhal/STM32F1xx/CAN/readme.txt deleted file mode 100644 index b78112885d..0000000000 --- a/testhal/STM32F1xx/CAN/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 CAN driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/EXT/Makefile b/testhal/STM32F1xx/EXT/Makefile deleted file mode 100644 index 190662d496..0000000000 --- a/testhal/STM32F1xx/EXT/Makefile +++ /dev/null @@ -1,208 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/EXT/chconf.h b/testhal/STM32F1xx/EXT/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/EXT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/EXT/halconf.h b/testhal/STM32F1xx/EXT/halconf.h deleted file mode 100644 index 5a1e5c050f..0000000000 --- a/testhal/STM32F1xx/EXT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/EXT/main.c b/testhal/STM32F1xx/EXT/main.c deleted file mode 100644 index 0c71217ae8..0000000000 --- a/testhal/STM32F1xx/EXT/main.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt; - -/* LED set to OFF after 200mS.*/ -static void ledoff(void *arg) { - - (void)arg; - palSetPad(GPIOC, GPIOC_LED); -} - -/* Triggered when the button is pressed or released. The LED is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - - (void)extp; - (void)channel; - palClearPad(GPIOC, GPIOC_LED); - chSysLockFromIsr(); - if (!chVTIsArmedI(&vt)) - chVTSetI(&vt, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* Triggered when the LED goes OFF.*/ -static void extcb2(EXTDriver *extp, expchannel_t channel) { - - (void)extp; - (void)channel; -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_RISING_EDGE | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOC, extcb2}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F1xx/EXT/mcuconf.h b/testhal/STM32F1xx/EXT/mcuconf.h deleted file mode 100644 index 8dccb622cd..0000000000 --- a/testhal/STM32F1xx/EXT/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/EXT/readme.txt b/testhal/STM32F1xx/EXT/readme.txt deleted file mode 100644 index 48288c565e..0000000000 --- a/testhal/STM32F1xx/EXT/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 EXT driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/GPT/Makefile b/testhal/STM32F1xx/GPT/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/GPT/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/GPT/chconf.h b/testhal/STM32F1xx/GPT/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F1xx/GPT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/GPT/halconf.h b/testhal/STM32F1xx/GPT/halconf.h deleted file mode 100644 index ad048e08f2..0000000000 --- a/testhal/STM32F1xx/GPT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/GPT/main.c b/testhal/STM32F1xx/GPT/main.c deleted file mode 100644 index 0fa26564fd..0000000000 --- a/testhal/STM32F1xx/GPT/main.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - - (void)gptp; - palClearPad(IOPORT3, GPIOC_LED); - chSysLockFromIsr(); - gptStartOneShotI(&GPTD2, 200); /* 0.02 second pulse.*/ - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - - (void)gptp; - palSetPad(IOPORT3, GPIOC_LED); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 10000, /* 10kHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 10000, /* 10kHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the GPT drivers 1 and 2. - */ - gptStart(&GPTD1, &gpt1cfg); - gptPolledDelay(&GPTD1, 10); /* Small delay.*/ - gptStart(&GPTD2, &gpt2cfg); - gptPolledDelay(&GPTD2, 10); /* Small delay.*/ - - /* - * Normal main() thread activity, it changes the GPT1 period every - * five seconds. - */ - while (TRUE) { - gptStartContinuous(&GPTD1, 5000); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD1); - gptStartContinuous(&GPTD1, 2500); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD1); - } - return 0; -} diff --git a/testhal/STM32F1xx/GPT/mcuconf.h b/testhal/STM32F1xx/GPT/mcuconf.h deleted file mode 100644 index 0759c3a439..0000000000 --- a/testhal/STM32F1xx/GPT/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 TRUE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/GPT/readme.txt b/testhal/STM32F1xx/GPT/readme.txt deleted file mode 100644 index 2355ef173c..0000000000 --- a/testhal/STM32F1xx/GPT/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - GPT driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo will on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 GPT driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/I2C/Makefile b/testhal/STM32F1xx/I2C/Makefile deleted file mode 100644 index 24cebda3b5..0000000000 --- a/testhal/STM32F1xx/I2C/Makefile +++ /dev/null @@ -1,220 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -Wall -Wextra - #USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -Wall -Wextra -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_103STK/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c \ - i2c_pns.c \ - tmp75.c \ - fake.c \ - lis3.c - - - - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. - -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk - - diff --git a/testhal/STM32F1xx/I2C/chconf.h b/testhal/STM32F1xx/I2C/chconf.h deleted file mode 100644 index c860ec4a28..0000000000 --- a/testhal/STM32F1xx/I2C/chconf.h +++ /dev/null @@ -1,509 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/I2C/fake.c b/testhal/STM32F1xx/I2C/fake.c deleted file mode 100644 index 763993566e..0000000000 --- a/testhal/STM32F1xx/I2C/fake.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * Not responding slave test - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "fake.h" - - -/* input buffer */ -static uint8_t rx_data[2]; - -/* temperature value */ -static int16_t temperature = 0; - -static i2cflags_t errors = 0; - -#define addr 0b1001100 - -/* This is main function. */ -void request_fake(void){ - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - i2cAcquireBus(&I2CD1); - status = i2cMasterReceiveTimeout(&I2CD1, addr, rx_data, 2, tmo); - i2cReleaseBus(&I2CD1); - - if (status == RDY_RESET){ - errors = i2cGetErrors(&I2CD1); - if (errors == I2CD_ACK_FAILURE){ - /* there is no slave with given address on the bus, or it was die */ - return; - } - } - - else{ - temperature = (rx_data[0] << 8) + rx_data[1]; - } -} - - diff --git a/testhal/STM32F1xx/I2C/fake.h b/testhal/STM32F1xx/I2C/fake.h deleted file mode 100644 index 746cf0b768..0000000000 --- a/testhal/STM32F1xx/I2C/fake.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef FAKE_H_ -#define FAKE_H_ - -void request_fake(void); - -#endif /* FAKE_H_ */ diff --git a/testhal/STM32F1xx/I2C/halconf.h b/testhal/STM32F1xx/I2C/halconf.h deleted file mode 100644 index 3837caff1e..0000000000 --- a/testhal/STM32F1xx/I2C/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/I2C/i2c_pns.c b/testhal/STM32F1xx/I2C/i2c_pns.c deleted file mode 100644 index a64dab5468..0000000000 --- a/testhal/STM32F1xx/I2C/i2c_pns.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#include "i2c_pns.h" -#include "lis3.h" - - -/* I2C1 */ -static const I2CConfig i2cfg1 = { - OPMODE_I2C, - 400000, - FAST_DUTY_CYCLE_2, -}; - - - -void I2CInit_pns(void){ - i2cInit(); - - i2cStart(&I2CD1, &i2cfg1); - - /* tune ports for I2C1*/ - palSetPadMode(IOPORT2, 6, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); - palSetPadMode(IOPORT2, 7, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); - - chThdSleepMilliseconds(100); /* Just to be safe. */ - - init_lis3(); /* accelerometer init */ -} - - diff --git a/testhal/STM32F1xx/I2C/i2c_pns.h b/testhal/STM32F1xx/I2C/i2c_pns.h deleted file mode 100644 index 7b3bab5d94..0000000000 --- a/testhal/STM32F1xx/I2C/i2c_pns.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef I2C_PNS_H_ -#define I2C_PNS_H_ - - -void I2CInit_pns(void); - - -#endif /* I2C_PNS_H_ */ diff --git a/testhal/STM32F1xx/I2C/lis3.c b/testhal/STM32F1xx/I2C/lis3.c deleted file mode 100644 index 5fdc89ae89..0000000000 --- a/testhal/STM32F1xx/I2C/lis3.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * This is device realize "read through write" paradigm. This is not - * standard, but most of I2C devices use this paradigm. - * You must write to device reading address, send restart to bus, - * and then begin reading process. - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "lis3.h" - - -#define lis3_addr 0b0011101 - - -/* buffers */ -static uint8_t accel_rx_data[ACCEL_RX_DEPTH]; -static uint8_t accel_tx_data[ACCEL_TX_DEPTH]; - -static i2cflags_t errors = 0; - -static int16_t acceleration_x = 0; -static int16_t acceleration_y = 0; -static int16_t acceleration_z = 0; - - -/** - * Init function. Here we will also start personal serving thread. - */ -int init_lis3(void){ - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - /* configure accelerometer */ - accel_tx_data[0] = ACCEL_CTRL_REG1 | AUTO_INCREMENT_BIT; /* register address */ - accel_tx_data[1] = 0b11100111; - accel_tx_data[2] = 0b01000001; - accel_tx_data[3] = 0b00000000; - - /* sending */ - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, lis3_addr, accel_tx_data, 4, accel_rx_data, 0, tmo); - i2cReleaseBus(&I2CD1); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD1); - } - - return 0; -} - -/** - * - */ -void request_acceleration_data(void){ - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - accel_tx_data[0] = ACCEL_OUT_DATA | AUTO_INCREMENT_BIT; /* register address */ - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, lis3_addr, accel_tx_data, 1, accel_rx_data, 6, tmo); - i2cReleaseBus(&I2CD1); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD1); - } - - acceleration_x = accel_rx_data[0] + (accel_rx_data[1] << 8); - acceleration_y = accel_rx_data[2] + (accel_rx_data[3] << 8); - acceleration_z = accel_rx_data[4] + (accel_rx_data[5] << 8); -} - diff --git a/testhal/STM32F1xx/I2C/lis3.h b/testhal/STM32F1xx/I2C/lis3.h deleted file mode 100644 index 4b9cab3ef2..0000000000 --- a/testhal/STM32F1xx/I2C/lis3.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include "ch.h" - -#ifndef LIS3_H_ -#define LIS3_H_ - - - -/* buffers depth */ -#define ACCEL_RX_DEPTH 8 -#define ACCEL_TX_DEPTH 8 - -/* autoincrement bit position. This bit needs to perform reading of - * multiple bytes at one request */ -#define AUTO_INCREMENT_BIT (1<<7) - -/* slave specific addresses */ -#define ACCEL_STATUS_REG 0x27 -#define ACCEL_CTRL_REG1 0x20 -#define ACCEL_OUT_DATA 0x28 - - - -inline int init_lis3(void); -inline void request_acceleration_data(void); - - -#endif /* LIS3_H_ */ diff --git a/testhal/STM32F1xx/I2C/main.c b/testhal/STM32F1xx/I2C/main.c deleted file mode 100644 index dbe417c4bb..0000000000 --- a/testhal/STM32F1xx/I2C/main.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "i2c_pns.h" -#include "lis3.h" -#include "tmp75.h" -#include "fake.h" - - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(BlinkWA, 64); -static msg_t Blink(void *arg) { - chRegSetThreadName("Blink"); - (void)arg; - while (TRUE) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Accelerometer thread - */ -static WORKING_AREA(PollAccelThreadWA, 256); -static msg_t PollAccelThread(void *arg) { - chRegSetThreadName("PollAccel"); - (void)arg; - while (TRUE) { - /*chThdSleepMilliseconds(rand() & 31);*/ - chThdSleepMilliseconds(32); - request_acceleration_data(); - } - return 0; -} - - -/* Temperature polling thread */ -static WORKING_AREA(PollTmp75ThreadWA, 256); -static msg_t PollTmp75Thread(void *arg) { - chRegSetThreadName("PollTmp75"); - (void)arg; - while (TRUE) { - /*chThdSleepMilliseconds(rand() & 31);*/ - chThdSleepMilliseconds(15); - /* Call reading function */ - request_temperature(); - } - return 0; -} - - -/* Temperature polling thread */ -static WORKING_AREA(PollFakeThreadWA, 256); -static msg_t PollFakeThread(void *arg) { - chRegSetThreadName("PollFake"); - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(16); - /* Call reading function */ - request_fake(); - } - return 0; -} - - -/* - * Entry point, note, the main() function is already a thread in the system - * on entry. - */ -int main(void) { - - halInit(); - chSysInit(); - - chThdSleepMilliseconds(200); - I2CInit_pns(); - - /* Create accelerometer thread */ - chThdCreateStatic(PollAccelThreadWA, - sizeof(PollAccelThreadWA), - NORMALPRIO, - PollAccelThread, - NULL); - - /* Create temperature thread */ - chThdCreateStatic(PollTmp75ThreadWA, - sizeof(PollTmp75ThreadWA), - NORMALPRIO, - PollTmp75Thread, - NULL); - - /* Create not responding thread */ - chThdCreateStatic(PollFakeThreadWA, - sizeof(PollFakeThreadWA), - NORMALPRIO, - PollFakeThread, - NULL); - - /* Creates the blinker thread. */ - chThdCreateStatic(BlinkWA, sizeof(BlinkWA), HIGHPRIO, Blink, NULL); - - /* main loop that do nothing */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - - return 0; -} diff --git a/testhal/STM32F1xx/I2C/mcuconf.h b/testhal/STM32F1xx/I2C/mcuconf.h deleted file mode 100644 index e3cb528d84..0000000000 --- a/testhal/STM32F1xx/I2C/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 TRUE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/I2C/tmp75.c b/testhal/STM32F1xx/I2C/tmp75.c deleted file mode 100644 index db9a43edf9..0000000000 --- a/testhal/STM32F1xx/I2C/tmp75.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * TMP75 is most simple I2C device in our case. It is already useful with - * default settings after powerup. - * You only must read 2 sequential bytes from it. - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "tmp75.h" - - -/* input buffer */ -static uint8_t tmp75_rx_data[TMP75_RX_DEPTH]; - -/* temperature value */ -static int16_t temperature = 0; - -static i2cflags_t errors = 0; - -#define tmp75_addr 0b1001000 - -/* This is main function. */ -void request_temperature(void){ - int16_t t_int = 0, t_frac = 0; - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - i2cAcquireBus(&I2CD1); - status = i2cMasterReceiveTimeout(&I2CD1, tmp75_addr, tmp75_rx_data, 2, tmo); - i2cReleaseBus(&I2CD1); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD1); - } - - t_int = tmp75_rx_data[0] * 100; - t_frac = (tmp75_rx_data[1] * 100) >> 8; - temperature = t_int + t_frac; -} - - diff --git a/testhal/STM32F1xx/I2C/tmp75.h b/testhal/STM32F1xx/I2C/tmp75.h deleted file mode 100644 index 726b7c533b..0000000000 --- a/testhal/STM32F1xx/I2C/tmp75.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef TMP75_H_ -#define TMP75_H_ - - - -/* buffers depth */ -#define TMP75_RX_DEPTH 2 -#define TMP75_TX_DEPTH 2 - -void init_tmp75(void); -void request_temperature(void); - -#endif /* TMP75_H_ */ diff --git a/testhal/STM32F1xx/IRQ_STORM/Makefile b/testhal/STM32F1xx/IRQ_STORM/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/IRQ_STORM/chconf.h b/testhal/STM32F1xx/IRQ_STORM/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F1xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/IRQ_STORM/halconf.h b/testhal/STM32F1xx/IRQ_STORM/halconf.h deleted file mode 100644 index 4e5a167966..0000000000 --- a/testhal/STM32F1xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/IRQ_STORM/main.c b/testhal/STM32F1xx/IRQ_STORM/main.c deleted file mode 100644 index c3debb0d2f..0000000000 --- a/testhal/STM32F1xx/IRQ_STORM/main.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOC, GPIOC_LED); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/STM32F1xx/IRQ_STORM/mcuconf.h b/testhal/STM32F1xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 356ec33701..0000000000 --- a/testhal/STM32F1xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 6 -#define STM32_GPT_TIM2_IRQ_PRIORITY 10 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/IRQ_STORM/readme.txt b/testhal/STM32F1xx/IRQ_STORM/readme.txt deleted file mode 100644 index 32f5a3781a..0000000000 --- a/testhal/STM32F1xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32F1xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/PWM-ICU/Makefile b/testhal/STM32F1xx/PWM-ICU/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/PWM-ICU/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/PWM-ICU/chconf.h b/testhal/STM32F1xx/PWM-ICU/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F1xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/PWM-ICU/halconf.h b/testhal/STM32F1xx/PWM-ICU/halconf.h deleted file mode 100644 index 9e7b5b6fe4..0000000000 --- a/testhal/STM32F1xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/PWM-ICU/main.c b/testhal/STM32F1xx/PWM-ICU/main.c deleted file mode 100644 index fd8fb581f8..0000000000 --- a/testhal/STM32F1xx/PWM-ICU/main.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(IOPORT3, GPIOC_LED); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(IOPORT3, GPIOC_LED); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -#if STM32_PWM_USE_ADVANCED - 0 -#endif -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * LED initially off. - */ - palSetPad(IOPORT3, GPIOC_LED); - - /* - * Initializes the PWM driver 1 and ICU driver 4. - */ - pwmStart(&PWMD1, &pwmcfg); - palSetPadMode(IOPORT1, 8, PAL_MODE_STM32_ALTERNATE_PUSHPULL); - icuStart(&ICUD4, &icucfg); - icuEnable(&ICUD4); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD1, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD1, 0); - pwmStop(&PWMD1); - icuDisable(&ICUD4); - icuStop(&ICUD4); - palSetPad(IOPORT3, GPIOC_LED); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/PWM-ICU/mcuconf.h b/testhal/STM32F1xx/PWM-ICU/mcuconf.h deleted file mode 100644 index 803a90a29c..0000000000 --- a/testhal/STM32F1xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 TRUE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED TRUE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/PWM-ICU/readme.txt b/testhal/STM32F1xx/PWM-ICU/readme.txt deleted file mode 100644 index 55ffef2cf0..0000000000 --- a/testhal/STM32F1xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM/ICU driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 PWM and ICU drivers. Pins -PA8 and PB6 must be connected in order to trigger the ICU input with the -PWM output. The ICU unit will measure the generated PWM. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/RTC/Makefile b/testhal/STM32F1xx/RTC/Makefile deleted file mode 100644 index 3d28124f25..0000000000 --- a/testhal/STM32F1xx/RTC/Makefile +++ /dev/null @@ -1,211 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c \ - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. - -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/RTC/chconf.h b/testhal/STM32F1xx/RTC/chconf.h deleted file mode 100644 index c860ec4a28..0000000000 --- a/testhal/STM32F1xx/RTC/chconf.h +++ /dev/null @@ -1,509 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC/halconf.h b/testhal/STM32F1xx/RTC/halconf.h deleted file mode 100644 index bf07df92b8..0000000000 --- a/testhal/STM32F1xx/RTC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC/main.c b/testhal/STM32F1xx/RTC/main.c deleted file mode 100644 index 380afdad3a..0000000000 --- a/testhal/STM32F1xx/RTC/main.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#include "chrtclib.h" - -RTCTime timespec; -RTCAlarm alarmspec; - -#define TEST_ALARM_WAKEUP FALSE - - -#if TEST_ALARM_WAKEUP - -/* sleep indicator thread */ -static WORKING_AREA(blinkWA, 128); -static msg_t blink_thd(void *arg){ - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(100); - palTogglePad(GPIOC, GPIOC_LED); - } - return 0; -} - -int main(void) { - halInit(); - chSysInit(); - - chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL); - /* set alarm in near future */ - rtcGetTime(&RTCD1, ×pec); - alarmspec.tv_sec = timespec.tv_sec + 30; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - - while (TRUE){ - chThdSleepSeconds(10); - chSysLock(); - - /* going to anabiosis*/ - PWR->CR |= (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_CSBF | PWR_CR_CWUF); - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - __WFI(); - } - return 0; -} - -#else /* TEST_ALARM_WAKEUP */ - -/* Manually reloaded test alarm period.*/ -#define RTC_ALARMPERIOD 10 - -BinarySemaphore alarm_sem; - -static void my_cb(RTCDriver *rtcp, rtcevent_t event) { - - (void)rtcp; - - switch (event) { - case RTC_EVENT_OVERFLOW: - palTogglePad(GPIOC, GPIOC_LED); - break; - case RTC_EVENT_SECOND: - /* palTogglePad(GPIOC, GPIOC_LED); */ - break; - case RTC_EVENT_ALARM: - palTogglePad(GPIOC, GPIOC_LED); - chSysLockFromIsr(); - chBSemSignalI(&alarm_sem); - chSysUnlockFromIsr(); - break; - } -} - -int main(void) { - msg_t status = RDY_TIMEOUT; - - halInit(); - chSysInit(); - chBSemInit(&alarm_sem, TRUE); - - rtcGetTime(&RTCD1, ×pec); - alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - - rtcSetCallback(&RTCD1, my_cb); - while (TRUE){ - - /* Wait until alarm callback signaled semaphore.*/ - status = chBSemWaitTimeout(&alarm_sem, S2ST(RTC_ALARMPERIOD + 5)); - - if (status == RDY_TIMEOUT){ - chSysHalt(); - } - else{ - rtcGetTime(&RTCD1, ×pec); - alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - } - } - return 0; -} -#endif /* TEST_ALARM_WAKEUP */ diff --git a/testhal/STM32F1xx/RTC/mcuconf.h b/testhal/STM32F1xx/RTC/mcuconf.h deleted file mode 100644 index 699116d517..0000000000 --- a/testhal/STM32F1xx/RTC/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/RTC_FATTIME/Makefile b/testhal/STM32F1xx/RTC_FATTIME/Makefile deleted file mode 100755 index 347169ba97..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/Makefile +++ /dev/null @@ -1,213 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_103STK/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various $(FATFSINC) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/RTC_FATTIME/chconf.h b/testhal/STM32F1xx/RTC_FATTIME/chconf.h deleted file mode 100755 index 3ad8c68dfc..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC_FATTIME/ffconf.h b/testhal/STM32F1xx/RTC_FATTIME/ffconf.h deleted file mode 100755 index a4816e8451..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 1 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1251 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 1 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 1 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 1 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/testhal/STM32F1xx/RTC_FATTIME/halconf.h b/testhal/STM32F1xx/RTC_FATTIME/halconf.h deleted file mode 100755 index 683868d3fb..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC_FATTIME/main.c b/testhal/STM32F1xx/RTC_FATTIME/main.c deleted file mode 100755 index df9eff29b7..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/main.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "usb_cdc.h" -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" -#include "ff.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(usbp); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1 -}; - -/** - * @brief FS object. - */ -FATFS MMC_FS; - -/** - * MMC driver instance. - */ -MMCDriver MMCD1; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig hs_spicfg = {NULL, IOPORT2, GPIOB_SPI2NSS, 0}; - -/* Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig ls_spicfg = {NULL, IOPORT2, GPIOB_SPI2NSS, - SPI_CR1_BR_2 | SPI_CR1_BR_1}; - -/* MMC/SD over SPI driver configuration.*/ -static MMCConfig mmccfg = {&SPID2, &ls_spicfg, &hs_spicfg}; - -/** - * - */ -bool_t mmc_lld_is_write_protected(MMCDriver *sdcp) { - (void)sdcp; - return FALSE; -} - -/** - * - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *sdcp) { - (void)sdcp; - return !palReadPad(GPIOC, GPIOC_MMCCP); -} - -/** - * - */ -void cmd_sdiotest(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argc; - (void)argv; - FRESULT err; - uint32_t clusters; - FATFS *fsp; - FIL FileObject; - //FILINFO FileInfo; - size_t bytes_written; - struct tm timp; - - // set time to 2011-03-13 07:06:40 - //rtcSetTimeUnixSec(&RTCD1, 1300000000); - -#if !HAL_USE_RTC - chprintf(chp, "ERROR! Chibios compiled without RTC support."); - chprintf(chp, "Enable HAL_USE_RCT in you halconf.h"); - chThdSleepMilliseconds(100); - return; -#endif - - chprintf(chp, "Trying to connect SDIO... "); - chThdSleepMilliseconds(100); - - if (!mmcConnect(&MMCD1)) { - chprintf(chp, "OK\r\n"); - chprintf(chp, "Register working area for filesystem... "); - chThdSleepMilliseconds(100); - err = f_mount(0, &MMC_FS); - if (err != FR_OK){ - chSysHalt(); - } - else{ - fs_ready = TRUE; - chprintf(chp, "OK\r\n"); - } - - chprintf(chp, "Mounting filesystem... "); - chThdSleepMilliseconds(100); - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)MMC_FS.csize, - clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "Current RTC time is: "); - chprintf(chp, "%u-%u-%u %u:%u:%u\r\n", - timp.tm_year+1900, timp.tm_mon+1, timp.tm_mday, timp.tm_hour, timp.tm_min, - timp.tm_sec); - - chprintf(chp, "Creating empty file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_open(&FileObject, "0:tmstmp.tst", FA_WRITE | FA_OPEN_ALWAYS); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Write some data in it... "); - chThdSleepMilliseconds(100); - err = f_write(&FileObject, "tst", sizeof("tst"), (void *)&bytes_written); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Closing file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_close(&FileObject); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - -// chprintf(chp, "Obtaining file info ... "); -// chThdSleepMilliseconds(100); -// err = f_stat("0:tmstmp.tst", &FileInfo); -// if (err != FR_OK) { -// chSysHalt(); -// } -// else{ -// chprintf(chp, "OK\r\n"); -// chprintf(chp, " Timestamp: %u-%u-%u %u:%u:%u\r\n", -// ((FileInfo.fdate >> 9) & 127) + 1980, -// (FileInfo.fdate >> 5) & 15, -// FileInfo.fdate & 31, -// (FileInfo.ftime >> 11) & 31, -// (FileInfo.ftime >> 5) & 63, -// (FileInfo.ftime & 31) * 2); -// } - - chprintf(chp, "Umounting filesystem... "); - f_mount(0, NULL); - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Disconnecting from SDIO..."); - chThdSleepMilliseconds(100); - if (mmcDisconnect(&MMCD1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chprintf(chp, "------------------------------------------------------\r\n"); - chprintf(chp, "Now you can remove memory card and check timestamp on PC.\r\n"); - chThdSleepMilliseconds(100); - } - else{ - chSysHalt(); - } -} - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) - -static const ShellCommand commands[] = { - {"sdiotest", cmd_sdiotest}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(100); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Initializes the SDIO drivers. - */ - mmcObjectInit(&MMCD1); - mmcStart(&MMCD1, &mmccfg); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); -} - -} diff --git a/testhal/STM32F1xx/RTC_FATTIME/mcuconf.h b/testhal/STM32F1xx/RTC_FATTIME/mcuconf.h deleted file mode 100755 index 9bf77f578b..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/RTC_FATTIME/readme.txt b/testhal/STM32F1xx/RTC_FATTIME/readme.txt deleted file mode 100755 index 0d7b112eed..0000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates checks timestamp correctness on FAT. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/SDC/Makefile b/testhal/STM32F1xx/SDC/Makefile deleted file mode 100644 index 4e25ee8452..0000000000 --- a/testhal/STM32F1xx/SDC/Makefile +++ /dev/null @@ -1,212 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= ch.ld - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM3210E_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/SDC/chconf.h b/testhal/STM32F1xx/SDC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/SDC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SDC/halconf.h b/testhal/STM32F1xx/SDC/halconf.h deleted file mode 100644 index 63e37a04e4..0000000000 --- a/testhal/STM32F1xx/SDC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SDC/main.c b/testhal/STM32F1xx/SDC/main.c deleted file mode 100644 index 9d8c93d8bf..0000000000 --- a/testhal/STM32F1xx/SDC/main.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * SDIO configuration. - */ -static const SDCConfig sdccfg = { - 0 -}; - -static uint8_t blkbuf[MMCSD_BLOCK_SIZE * 4 + 1]; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the SDIO drivers. - */ - sdcStart(&SDCD1, &sdccfg); - if (!sdcConnect(&SDCD1)) { - int i; - - /* Single aligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf, 1)) - chSysHalt(); - - /* Single unaligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf + 1, 1)) - chSysHalt(); - - /* Multiple aligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf, 4)) - chSysHalt(); - - /* Multiple unaligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf + 1, 4)) - chSysHalt(); - - /* Repeated multiple aligned reads.*/ - for (i = 0; i < 1000; i++) { - if (sdcRead(&SDCD1, 0, blkbuf, 4)) - chSysHalt(); - } - - /* Repeated multiple unaligned reads.*/ - for (i = 0; i < 1000; i++) { - if (sdcRead(&SDCD1, 0, blkbuf + 1, 4)) - chSysHalt(); - } - - /* Repeated multiple aligned writes.*/ - for (i = 0; i < 100; i++) { - if (sdcRead(&SDCD1, 0x10000, blkbuf, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf, 4)) - chSysHalt(); - } - - /* Repeated multiple unaligned writes.*/ - for (i = 0; i < 100; i++) { - if (sdcRead(&SDCD1, 0x10000, blkbuf + 1, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf + 1, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf + 1, 4)) - chSysHalt(); - } - - if (sdcDisconnect(&SDCD1)) - chSysHalt(); - } - - /* - * Normal main() thread activity. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F1xx/SDC/mcuconf.h b/testhal/STM32F1xx/SDC/mcuconf.h deleted file mode 100644 index b3c48a3b29..0000000000 --- a/testhal/STM32F1xx/SDC/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/SDC/readme.txt b/testhal/STM32F1xx/SDC/readme.txt deleted file mode 100644 index b897676af4..0000000000 --- a/testhal/STM32F1xx/SDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex ST_STM3210E_EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32 SDC driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/SPI/Makefile b/testhal/STM32F1xx/SPI/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/SPI/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/SPI/chconf.h b/testhal/STM32F1xx/SPI/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/SPI/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SPI/halconf.h b/testhal/STM32F1xx/SPI/halconf.h deleted file mode 100644 index d176ad1a74..0000000000 --- a/testhal/STM32F1xx/SPI/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SPI/main.c b/testhal/STM32F1xx/SPI/main.c deleted file mode 100644 index be129980ad..0000000000 --- a/testhal/STM32F1xx/SPI/main.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOA, - GPIOA_SPI1NSS, - 0 -}; - -/* - * Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOA, - GPIOA_SPI1NSS, - SPI_CR1_BR_2 | SPI_CR1_BR_1 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palClearPad(IOPORT3, GPIOC_LED); /* LED ON. */ - spiStart(&SPID1, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palSetPad(IOPORT3, GPIOC_LED); /* LED OFF. */ - spiStart(&SPID1, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI1 I/O pins setup. - */ - palSetPadMode(IOPORT1, 5, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* SCK. */ - palSetPadMode(IOPORT1, 6, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* MISO.*/ - palSetPadMode(IOPORT1, 7, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* MOSI.*/ - palSetPadMode(IOPORT1, GPIOA_SPI1NSS, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(IOPORT1, GPIOA_SPI1NSS); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/SPI/mcuconf.h b/testhal/STM32F1xx/SPI/mcuconf.h deleted file mode 100644 index 30c93e7420..0000000000 --- a/testhal/STM32F1xx/SPI/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/SPI/readme.txt b/testhal/STM32F1xx/SPI/readme.txt deleted file mode 100644 index 1a9c90b476..0000000000 --- a/testhal/STM32F1xx/SPI/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 SPI driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/UART/Makefile b/testhal/STM32F1xx/UART/Makefile deleted file mode 100644 index 0f7e203176..0000000000 --- a/testhal/STM32F1xx/UART/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/UART/chconf.h b/testhal/STM32F1xx/UART/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/UART/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/UART/halconf.h b/testhal/STM32F1xx/UART/halconf.h deleted file mode 100644 index 60af9dec00..0000000000 --- a/testhal/STM32F1xx/UART/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/UART/main.c b/testhal/STM32F1xx/UART/main.c deleted file mode 100644 index 0d36e2b899..0000000000 --- a/testhal/STM32F1xx/UART/main.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD2, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palSetPad(IOPORT3, GPIOC_LED); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palClearPad(IOPORT3, GPIOC_LED); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palSetPad(IOPORT3, GPIOC_LED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palClearPad(IOPORT3, GPIOC_LED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - uartStart(&UARTD2, &uart_cfg_1); - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD2, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/UART/mcuconf.h b/testhal/STM32F1xx/UART/mcuconf.h deleted file mode 100644 index 7df0ef00cc..0000000000 --- a/testhal/STM32F1xx/UART/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/UART/readme.txt b/testhal/STM32F1xx/UART/readme.txt deleted file mode 100644 index e24a2c5682..0000000000 --- a/testhal/STM32F1xx/UART/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 UART driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/USB_CDC/Makefile b/testhal/STM32F1xx/USB_CDC/Makefile deleted file mode 100644 index 0c781d14ce..0000000000 --- a/testhal/STM32F1xx/USB_CDC/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/USB_CDC/chconf.h b/testhal/STM32F1xx/USB_CDC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/USB_CDC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC/halconf.h b/testhal/STM32F1xx/USB_CDC/halconf.h deleted file mode 100644 index 7d1f492f8e..0000000000 --- a/testhal/STM32F1xx/USB_CDC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC/main.c b/testhal/STM32F1xx/USB_CDC/main.c deleted file mode 100644 index 9ba972bb37..0000000000 --- a/testhal/STM32F1xx/USB_CDC/main.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "usb_cdc.h" -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(usbp); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1 -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(time); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F1xx/USB_CDC/mcuconf.h b/testhal/STM32F1xx/USB_CDC/mcuconf.h deleted file mode 100644 index df4d3fa0c5..0000000000 --- a/testhal/STM32F1xx/USB_CDC/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/USB_CDC/readme.txt b/testhal/STM32F1xx/USB_CDC/readme.txt deleted file mode 100644 index 2d71df64ff..0000000000 --- a/testhal/STM32F1xx/USB_CDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 USB driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/USB_CDC_F107/.cproject b/testhal/STM32F1xx/USB_CDC_F107/.cproject deleted file mode 100644 index e5f35ee123..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F1xx/USB_CDC_F107/.project b/testhal/STM32F1xx/USB_CDC_F107/.project deleted file mode 100644 index cdd1937af8..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - TEST-STM32F1xx-USB_CDC_F107 - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P107 - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/testhal/STM32F1xx/USB_CDC_F107/Makefile b/testhal/STM32F1xx/USB_CDC_F107/Makefile deleted file mode 100644 index 9b861f6d39..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P107/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform_f105_f107.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F107xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/USB_CDC_F107/chconf.h b/testhal/STM32F1xx/USB_CDC_F107/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC_F107/halconf.h b/testhal/STM32F1xx/USB_CDC_F107/halconf.h deleted file mode 100644 index 7d1f492f8e..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC_F107/main.c b/testhal/STM32F1xx/USB_CDC_F107/main.c deleted file mode 100644 index b54d2e686f..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/main.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "usb_cdc.h" -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(usbp); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1 -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(IOPORT3, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(time); - palSetPad(IOPORT3, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F1xx/USB_CDC_F107/mcuconf.h b/testhal/STM32F1xx/USB_CDC_F107/mcuconf.h deleted file mode 100644 index a3c88dbc63..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/mcuconf.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F107 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F107_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_PREDIV1 -#define STM32_PREDIV1SRC STM32_PREDIV1SRC_PLL2 -#define STM32_PREDIV1_VALUE 5 -#define STM32_PLLMUL_VALUE 9 -#define STM32_PREDIV2_VALUE 5 -#define STM32_PLL2MUL_VALUE 8 -#define STM32_PLL3MUL_VALUE 10 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_OTG_CLOCK_REQUIRED TRUE -#define STM32_OTGFSPRE STM32_OTGFSPRE_DIV3 -#define STM32_I2S_CLOCK_REQUIRED FALSE -#define STM32_MCOSEL STM32_MCOSEL_PLL3 -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 TRUE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F1xx/USB_CDC_F107/readme.txt b/testhal/STM32F1xx/USB_CDC_F107/readme.txt deleted file mode 100644 index 43098d8ac6..0000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P107 board. - -** The Demo ** - -The application demonstrates the use of the STM32 USB (OTG) driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/USB_MSC/Makefile b/testhal/STM32F1xx/USB_MSC/Makefile deleted file mode 100644 index 1f76375fe0..0000000000 --- a/testhal/STM32F1xx/USB_MSC/Makefile +++ /dev/null @@ -1,210 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/usb_msc.c \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/USB_MSC/chconf.h b/testhal/STM32F1xx/USB_MSC/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F1xx/USB_MSC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_MSC/halconf.h b/testhal/STM32F1xx/USB_MSC/halconf.h deleted file mode 100644 index 9669ff2780..0000000000 --- a/testhal/STM32F1xx/USB_MSC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_MSC/main.c b/testhal/STM32F1xx/USB_MSC/main.c deleted file mode 100644 index df291f1b1e..0000000000 --- a/testhal/STM32F1xx/USB_MSC/main.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "usb_msc.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * USB Device Descriptor. - */ -static const uint8_t msc_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x00, /* bDeviceClass (in interface). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x2004, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor msc_device_descriptor = { - sizeof msc_device_descriptor_data, - msc_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t msc_configuration_descriptor_data[32] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(32, /* wTotalLength. */ - 0x01, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x08, /* bInterfaceClass (Mass Stprage). */ - 0x06, /* bInterfaceSubClass (SCSI - transparent command set, MSCO - chapter 2). */ - 0x50, /* bInterfaceProtocol (Bulk-Only - Mass Storage, MSCO chapter 3). */ - 4), /* iInterface. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (MSC_DATA_IN_EP|0x80, /* bEndpointAddress. */ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval (ignored for bulk). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (MSC_DATA_OUT_EP, /* bEndpointAddress. */ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval (ignored for bulk). */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor msc_configuration_descriptor = { - sizeof msc_configuration_descriptor_data, - msc_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t msc_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t msc_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t msc_string2[] = { - USB_DESC_BYTE(50), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0, ' ', 0, - 'S', 0, 't', 0, 'o', 0, 'r', 0, 'a', 0, 'g', 0, 'e', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t msc_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Interface string. - */ -static const uint8_t msc_string4[] = { - 16, /* bLength. */ - USB_DESCRIPTOR_STRING, /* bDescriptorType. */ - 'S', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor msc_strings[] = { - {sizeof msc_string0, msc_string0}, - {sizeof msc_string1, msc_string1}, - {sizeof msc_string2, msc_string2}, - {sizeof msc_string3, msc_string3}, - {sizeof msc_string4, msc_string4} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &msc_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &msc_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 5) - return &msc_strings[dindex]; - } - return NULL; -} - -/* - * IN EP1 state. - */ -USBInEndpointState ep1state; - -/* - * OUT EP2 state. - */ -USBOutEndpointState ep2state; - -/* - * EP1 initialization structure (IN only). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK | USB_EP_MODE_TRANSACTION, - mscDataTransmitted, - NULL, - 0x0040, - 0x0000, - &ep1state, - NULL -}; - -/* - * EP2 initialization structure (OUT only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_BULK | USB_EP_MODE_TRANSACTION, - NULL, - mscDataReceived, - 0x0000, - 0x0040, - NULL, - &ep2state -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - chSysLockFromIsr(); - usbInitEndpointI(usbp, MSC_DATA_IN_EP, &ep1config); - usbInitEndpointI(usbp, MSC_DATA_OUT_EP, &ep2config); - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * Serial over USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - mscRequestsHook, - NULL -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - */ - usbStart(&USBD1, &usbcfg); - palClearPad(GPIOC, GPIOC_USB_DISC); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (palReadPad(IOPORT1, GPIOA_BUTTON)) - TestThread(&SD2); - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F1xx/USB_MSC/mcuconf.h b/testhal/STM32F1xx/USB_MSC/mcuconf.h deleted file mode 100644 index aa0914d75c..0000000000 --- a/testhal/STM32F1xx/USB_MSC/mcuconf.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F4xx/ADC/Makefile b/testhal/STM32F4xx/ADC/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/ADC/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/ADC/chconf.h b/testhal/STM32F4xx/ADC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/ADC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/ADC/halconf.h b/testhal/STM32F4xx/ADC/halconf.h deleted file mode 100644 index 5452417835..0000000000 --- a/testhal/STM32F4xx/ADC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/ADC/main.c b/testhal/STM32F4xx/ADC/main.c deleted file mode 100644 index d08bef1cca..0000000000 --- a/testhal/STM32F4xx/ADC/main.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN11. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN11(ADC_SAMPLE_3), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, /* SQR2 */ - ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN11, IN12, IN11, IN12, IN11, IN12, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN12(ADC_SAMPLE_56) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_56) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED5); - chThdSleepMilliseconds(500); - palClearPad(GPIOD, GPIOD_LED5); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(1) | PAL_PORT_BIT(2), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the thermal sensor. - */ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - adcSTM32DisableTSVREFE(); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F4xx/ADC/mcuconf.h b/testhal/STM32F4xx/ADC/mcuconf.h deleted file mode 100644 index 0d25111ceb..0000000000 --- a/testhal/STM32F4xx/ADC/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 TRUE -#define STM32_ADC_USE_ADC3 TRUE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/ADC/readme.txt b/testhal/STM32F4xx/ADC/readme.txt deleted file mode 100644 index 849be3b27b..0000000000 --- a/testhal/STM32F4xx/ADC/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx ADC driver. - -** Board Setup ** - -- Connect PC1 to 3.3V and PC2 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/CAN/Makefile b/testhal/STM32F4xx/CAN/Makefile deleted file mode 100644 index 62d0516f0d..0000000000 --- a/testhal/STM32F4xx/CAN/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/CAN/chconf.h b/testhal/STM32F4xx/CAN/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F4xx/CAN/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/CAN/halconf.h b/testhal/STM32F4xx/CAN/halconf.h deleted file mode 100644 index 52296c1732..0000000000 --- a/testhal/STM32F4xx/CAN/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/CAN/main.c b/testhal/STM32F4xx/CAN/main.c deleted file mode 100644 index 6992facb73..0000000000 --- a/testhal/STM32F4xx/CAN/main.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Internal loopback mode, 500KBaud, automatic wakeup, automatic recover - * from abort mode. - * See section 22.7.7 on the STM32 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - CAN_BTR_LBKM | CAN_BTR_SJW(0) | CAN_BTR_TS2(1) | - CAN_BTR_TS1(8) | CAN_BTR_BRP(6), - 0, - NULL -}; - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - EventListener el; - CANRxFrame rxmsg; - - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&CAND1.rxfull_event, &el, 0); - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; - while (canReceive(&CAND1, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(GPIOD, GPIOD_LED5); - } - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.DLC = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, &txmsg, MS2ST(100)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, can_rx, NULL); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F4xx/CAN/mcuconf.h b/testhal/STM32F4xx/CAN/mcuconf.h deleted file mode 100644 index f37c976a58..0000000000 --- a/testhal/STM32F4xx/CAN/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/CAN/readme.txt b/testhal/STM32F4xx/CAN/readme.txt deleted file mode 100644 index 8d347dbb98..0000000000 --- a/testhal/STM32F4xx/CAN/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32 CAN driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/DMA_STORM/Makefile b/testhal/STM32F4xx/DMA_STORM/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/DMA_STORM/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/DMA_STORM/chconf.h b/testhal/STM32F4xx/DMA_STORM/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/DMA_STORM/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/DMA_STORM/halconf.h b/testhal/STM32F4xx/DMA_STORM/halconf.h deleted file mode 100644 index 1d37e3c145..0000000000 --- a/testhal/STM32F4xx/DMA_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/DMA_STORM/main.c b/testhal/STM32F4xx/DMA_STORM/main.c deleted file mode 100644 index 2a30bf70b3..0000000000 --- a/testhal/STM32F4xx/DMA_STORM/main.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - (void)buffer; - (void)n; -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; - chSysHalt(); -} - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN11, IN12, IN11, IN12, IN11, IN12, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN12(ADC_SAMPLE_56) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_56) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) -}; - -/* - * Maximum speed SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0 -}; - -static void tmo(void *p) { - - (void)p; - chSysHalt(); -} - -/* - * SPI thread. - */ -static WORKING_AREA(waSPI1, 1024); -static WORKING_AREA(waSPI2, 1024); -static WORKING_AREA(waSPI3, 1024); -static msg_t spi_thread(void *p) { - unsigned i; - SPIDriver *spip = (SPIDriver *)p; - VirtualTimer vt; - uint8_t txbuf[256]; - uint8_t rxbuf[256]; - - /* Prepare transmit pattern.*/ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Continuous transmission.*/ - while (TRUE) { - /* Starts a VT working as watchdog to catch a malfunction in the SPI - driver.*/ - chSysLock(); - chVTSetI(&vt, MS2ST(10), tmo, NULL); - chSysUnlock(); - - spiExchange(spip, sizeof(txbuf), txbuf, rxbuf); - - /* Stops the watchdog.*/ - chSysLock(); - if (chVTIsArmedI(&vt)) - chVTResetI(&vt); - chSysUnlock(); - } -} - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - palClearPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - static uint8_t patterns1[4096], patterns2[4096], buf1[4096], buf2[4096]; - - /* System initializations. - - HAL initialization, this also initializes the configured device drivers - and performs the board-specific initializations. - - Kernel initialization, the main() function becomes a thread and the - RTOS is active.*/ - halInit(); - chSysInit(); - - /* Creates the blinker thread.*/ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 10, - Thread1, NULL); - - /* Activates the ADC1 driver and the thermal sensor.*/ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - - /* Starts an ADC continuous conversion.*/ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* Activating SPI drivers.*/ - spiStart(&SPID1, &hs_spicfg); - spiStart(&SPID2, &hs_spicfg); - spiStart(&SPID3, &hs_spicfg); - - /* Starting SPI threads instances.*/ - chThdCreateStatic(waSPI1, sizeof(waSPI1), NORMALPRIO + 1, spi_thread, &SPID1); - chThdCreateStatic(waSPI2, sizeof(waSPI2), NORMALPRIO + 1, spi_thread, &SPID2); - chThdCreateStatic(waSPI3, sizeof(waSPI3), NORMALPRIO + 1, spi_thread, &SPID3); - - /* Allocating two DMA2 streams for memory copy operations.*/ - if (dmaStreamAllocate(STM32_DMA2_STREAM6, 0, NULL, NULL)) - chSysHalt(); - if (dmaStreamAllocate(STM32_DMA2_STREAM7, 0, NULL, NULL)) - chSysHalt(); - for (i = 0; i < sizeof (patterns1); i++) - patterns1[i] = (uint8_t)i; - for (i = 0; i < sizeof (patterns2); i++) - patterns2[i] = (uint8_t)(i ^ 0xAA); - - /* Normal main() thread activity, it does continues memory copy operations - using 2 DMA streams at the lowest priority.*/ - while (TRUE) { - VirtualTimer vt; - - /* Starts a VT working as watchdog to catch a malfunction in the DMA - driver.*/ - chSysLock(); - chVTSetI(&vt, MS2ST(10), tmo, NULL); - chSysUnlock(); - - /* Copy pattern 1.*/ - dmaStartMemCopy(STM32_DMA2_STREAM6, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns1, buf1, sizeof (patterns1)); - dmaStartMemCopy(STM32_DMA2_STREAM7, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns1, buf2, sizeof (patterns1)); - dmaWaitCompletion(STM32_DMA2_STREAM6); - dmaWaitCompletion(STM32_DMA2_STREAM7); - if (memcmp(patterns1, buf1, sizeof (patterns1))) - chSysHalt(); - if (memcmp(patterns1, buf2, sizeof (patterns1))) - chSysHalt(); - - /* Copy pattern 2.*/ - dmaStartMemCopy(STM32_DMA2_STREAM6, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns2, buf1, sizeof (patterns2)); - dmaStartMemCopy(STM32_DMA2_STREAM7, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns2, buf2, sizeof (patterns2)); - dmaWaitCompletion(STM32_DMA2_STREAM6); - dmaWaitCompletion(STM32_DMA2_STREAM7); - if (memcmp(patterns2, buf1, sizeof (patterns2))) - chSysHalt(); - if (memcmp(patterns2, buf2, sizeof (patterns2))) - chSysHalt(); - - /* Stops the watchdog.*/ - chSysLock(); - if (chVTIsArmedI(&vt)) - chVTResetI(&vt); - chSysUnlock(); - - chThdSleepMilliseconds(2); - } - return 0; -} diff --git a/testhal/STM32F4xx/DMA_STORM/mcuconf.h b/testhal/STM32F4xx/DMA_STORM/mcuconf.h deleted file mode 100644 index fcbacb977a..0000000000 --- a/testhal/STM32F4xx/DMA_STORM/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/EXT/Makefile b/testhal/STM32F4xx/EXT/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/EXT/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/EXT/chconf.h b/testhal/STM32F4xx/EXT/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/EXT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/EXT/halconf.h b/testhal/STM32F4xx/EXT/halconf.h deleted file mode 100644 index 5a1e5c050f..0000000000 --- a/testhal/STM32F4xx/EXT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/EXT/main.c b/testhal/STM32F4xx/EXT/main.c deleted file mode 100644 index 2a6d7901c9..0000000000 --- a/testhal/STM32F4xx/EXT/main.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void led5off(void *arg) { - - (void)arg; - palClearPad(GPIOD, GPIOD_LED5); -} - -/* Triggered when the button is pressed or released. The LED5 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - - palSetPad(GPIOD, GPIOD_LED5); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led5off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F4xx/EXT/mcuconf.h b/testhal/STM32F4xx/EXT/mcuconf.h deleted file mode 100644 index fd0857c518..0000000000 --- a/testhal/STM32F4xx/EXT/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/EXT/readme.txt b/testhal/STM32F4xx/EXT/readme.txt deleted file mode 100644 index 4de20c3313..0000000000 --- a/testhal/STM32F4xx/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/GPT/Makefile b/testhal/STM32F4xx/GPT/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/GPT/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/GPT/chconf.h b/testhal/STM32F4xx/GPT/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/GPT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/GPT/halconf.h b/testhal/STM32F4xx/GPT/halconf.h deleted file mode 100644 index ad048e08f2..0000000000 --- a/testhal/STM32F4xx/GPT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/GPT/main.c b/testhal/STM32F4xx/GPT/main.c deleted file mode 100644 index e751d0a4fa..0000000000 --- a/testhal/STM32F4xx/GPT/main.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - - (void)gptp; - palSetPad(GPIOD, GPIOD_LED5); - chSysLockFromIsr(); - gptStartOneShotI(&GPTD3, 1000); /* 0.1 second pulse.*/ - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - - (void)gptp; - palClearPad(GPIOD, GPIOD_LED5); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 10000, /* 10kHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 10000, /* 10kHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the GPT drivers 2 and 3. - */ - gptStart(&GPTD2, &gpt2cfg); - gptPolledDelay(&GPTD2, 10); /* Small delay.*/ - gptStart(&GPTD3, &gpt3cfg); - gptPolledDelay(&GPTD3, 10); /* Small delay.*/ - - /* - * Normal main() thread activity, it changes the GPT1 period every - * five seconds. - */ - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED4); - gptStartContinuous(&GPTD2, 5000); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD2); - palClearPad(GPIOD, GPIOD_LED4); - gptStartContinuous(&GPTD2, 2500); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD2); - } -} diff --git a/testhal/STM32F4xx/GPT/mcuconf.h b/testhal/STM32F4xx/GPT/mcuconf.h deleted file mode 100644 index 39a5b58439..0000000000 --- a/testhal/STM32F4xx/GPT/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 TRUE -#define STM32_GPT_USE_TIM5 TRUE -#define STM32_GPT_USE_TIM8 TRUE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/GPT/readme.txt b/testhal/STM32F4xx/GPT/readme.txt deleted file mode 100644 index 1039a330e8..0000000000 --- a/testhal/STM32F4xx/GPT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - GPT driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx GPT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/I2C/Makefile b/testhal/STM32F4xx/I2C/Makefile deleted file mode 100644 index d52f5d4e88..0000000000 --- a/testhal/STM32F4xx/I2C/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/I2C/chconf.h b/testhal/STM32F4xx/I2C/chconf.h deleted file mode 100644 index 1abb9626ca..0000000000 --- a/testhal/STM32F4xx/I2C/chconf.h +++ /dev/null @@ -1,512 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -//#define CORTEX_VTOR_INIT 0x000E0000 -#define CORTEX_VTOR_INIT 0x00000000 - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/I2C/halconf.h b/testhal/STM32F4xx/I2C/halconf.h deleted file mode 100644 index 8aae4a995d..0000000000 --- a/testhal/STM32F4xx/I2C/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/I2C/main.c b/testhal/STM32F4xx/I2C/main.c deleted file mode 100644 index e65b7e1c5b..0000000000 --- a/testhal/STM32F4xx/I2C/main.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * This demo acquire data from accelerometer and prints it in shell. - */ - -#include - -#include "ch.h" -#include "hal.h" - -/* buffers depth */ -#define ACCEL_RX_DEPTH 6 -#define ACCEL_TX_DEPTH 4 - -/* mma8451q specific addresses */ -#define ACCEL_OUT_DATA 0x01 -#define ACCEL_CTRL_REG1 0x2A - -static uint8_t rxbuf[ACCEL_RX_DEPTH]; -static uint8_t txbuf[ACCEL_TX_DEPTH]; -static i2cflags_t errors = 0; -static int16_t acceleration_x, acceleration_y, acceleration_z; -#define mma8451_addr 0b0011100 - -/** - * - */ -static void print(char *p) { - - while (*p) { - sdPut(&SD2, *p++); - } -} - -/** - * - */ -static void println(char *p) { - - while (*p) { - sdPut(&SD2, *p++); - } - sdWriteTimeout(&SD2, (uint8_t *)"\r\n", 2, TIME_INFINITE); -} - -/** - * - */ -static void printn(int16_t n) { - char buf[16], *p; - - if (n > 0) - sdPut(&SD2, '+'); - else{ - sdPut(&SD2, '-'); - n = abs(n); - } - - if (!n) - sdPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - sdPut(&SD2, *--p); - } -} - -/** - * Converts data from 2complemented representation to signed integer - */ -int16_t complement2signed(uint8_t msb, uint8_t lsb){ - uint16_t word = 0; - word = (msb << 8) + lsb; - if (msb > 0x7F){ - return -1 * ((int16_t)((~word) + 1)); - } - return (int16_t)word; -} - -/* I2C interface #2 */ -static const I2CConfig i2cfg2 = { - OPMODE_I2C, - 400000, - FAST_DUTY_CYCLE_2, -}; - -/* - * Application entry point. - */ -int main(void) { - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Starts I2C - */ - i2cStart(&I2CD2, &i2cfg2); - - /* - * Prepares the Serial driver 2 - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - - /** - * Prepares the accelerometer - */ - txbuf[0] = ACCEL_CTRL_REG1; /* register address */ - txbuf[1] = 0x1; - i2cAcquireBus(&I2CD2); - status = i2cMasterTransmitTimeout(&I2CD2, mma8451_addr, txbuf, 2, rxbuf, 0, tmo); - i2cReleaseBus(&I2CD2); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD2); - } - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - palTogglePad(GPIOB, GPIOB_LED_B); - chThdSleepMilliseconds(100); - - txbuf[0] = ACCEL_OUT_DATA; /* register address */ - i2cAcquireBus(&I2CD2); - status = i2cMasterTransmitTimeout(&I2CD2, mma8451_addr, txbuf, 1, rxbuf, 6, tmo); - i2cReleaseBus(&I2CD2); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD2); - } - - acceleration_x = complement2signed(rxbuf[0], rxbuf[1]); - acceleration_y = complement2signed(rxbuf[2], rxbuf[3]); - acceleration_z = complement2signed(rxbuf[4], rxbuf[5]); - - print("x: "); - printn(acceleration_x); - print(" y: "); - printn(acceleration_y); - print(" z: "); - printn(acceleration_z); - println(""); - } -} - - - diff --git a/testhal/STM32F4xx/I2C/mcuconf.h b/testhal/STM32F4xx/I2C/mcuconf.h deleted file mode 100644 index 9d68c81f60..0000000000 --- a/testhal/STM32F4xx/I2C/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 TRUE -#define STM32_I2C_USE_I2C3 TRUE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/IRQ_STORM/Makefile b/testhal/STM32F4xx/IRQ_STORM/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/IRQ_STORM/chconf.h b/testhal/STM32F4xx/IRQ_STORM/chconf.h deleted file mode 100644 index 89d0405b8b..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,537 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#define CORTEX_USE_FPU FALSE - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM/halconf.h b/testhal/STM32F4xx/IRQ_STORM/halconf.h deleted file mode 100644 index 4e5a167966..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp b/testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp deleted file mode 100644 index e96555b13a..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp +++ /dev/null @@ -1,2284 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\spi_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\spi_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32f4xx.h - - - - port - - STM32F4xx - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\cmparams.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\vectors.s - - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/iar/ch.eww b/testhal/STM32F4xx/IRQ_STORM/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/iar/ch.icf b/testhal/STM32F4xx/IRQ_STORM/iar/ch.icf deleted file mode 100644 index c0a51f44cb..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj b/testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj deleted file mode 100644 index 92371b6a23..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj +++ /dev/null @@ -1,945 +0,0 @@ - - - - 1.1 - -
    ### uVision Project, (C) Keil Software
    - - - - Demo - 0x4 - ARM-ADS - - - STM32F407VG - STMicroelectronics - IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - "Startup\ST\STM32F4xx\startup_stm32f4xx.s" ("STM32F4xx Startup Code") - UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) - 6103 - stm32f4xx.h - - - - - - - - - - SFD\ST\STM32F4xx\STM32F4xx.sfr - 0 - - - - ST\STM32F4xx\ - ST\STM32F4xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 1 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x20020000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\common\ARMCMx;..\..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\..\os\ports\RVCT\ARMCMx;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\STM32;..\..\..\..\os\hal\platforms\STM32\GPIOv2;..\..\..\..\os\hal\platforms\STM32F4xx;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - cmparams.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\cmparams.h - - - vectors.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\vectors.s - - - nvic.c - 1 - ..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\..\os\kernel\include\chvt.h - - - - - hal - - - hal.c - 1 - ..\..\..\..\os\hal\src\hal.c - - - pal.c - 1 - ..\..\..\..\os\hal\src\pal.c - - - serial.c - 1 - ..\..\..\..\os\hal\src\serial.c - - - hal.h - 5 - ..\..\..\..\os\hal\include\hal.h - - - pal.h - 5 - ..\..\..\..\os\hal\include\pal.h - - - serial.h - 5 - ..\..\..\..\os\hal\include\serial.h - - - gpt.h - 5 - ..\..\..\..\os\hal\include\gpt.h - - - gpt.c - 1 - ..\..\..\..\os\hal\src\gpt.c - - - tm.c - 1 - ..\..\..\..\os\hal\src\tm.c - - - - - platform - - - gpt_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - gpt_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - hal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.h - - - pal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - serial_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - serial_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - stm32_dma.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.h - - - stm32_rcc.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_rcc.h - - - stm32l1xx.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32l1xx.h - - - - - test - - - test.c - 1 - ..\..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - - - - - -
    diff --git a/testhal/STM32F4xx/IRQ_STORM/main.c b/testhal/STM32F4xx/IRQ_STORM/main.c deleted file mode 100644 index a49b738b6c..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/main.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOD, GPIOD_LED5); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 2 and 3. - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 10; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } -} diff --git a/testhal/STM32F4xx/IRQ_STORM/mcuconf.h b/testhal/STM32F4xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 95713caeb1..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/IRQ_STORM/readme.txt b/testhal/STM32F4xx/IRQ_STORM/readme.txt deleted file mode 100644 index d3ae977978..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/Makefile b/testhal/STM32F4xx/IRQ_STORM_FPU/Makefile deleted file mode 100644 index 8391b78dcc..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = yes -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - extfunc.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h b/testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c b/testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c deleted file mode 100644 index c4119a3348..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -float ff1(float par) { - return par; -} - -float ff2(float par1, float par2, float par3, float par4) { - return (par1 + par2) * (par3 + par4); -} diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h b/testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h deleted file mode 100644 index 08b919c734..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp b/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp deleted file mode 100644 index a23706d510..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp +++ /dev/null @@ -1,2288 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\spi_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\spi_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32f4xx.h - - - - port - - STM32F4xx - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\cmparams.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\vectors.s - - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\extfunc.c - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww b/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww deleted file mode 100644 index f9b3b20004..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf b/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf deleted file mode 100644 index c0a51f44cb..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -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__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj b/testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj deleted file mode 100644 index db91f6a021..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj +++ /dev/null @@ -1,945 +0,0 @@ - - - - 1.1 - -
    ### uVision Project, (C) Keil Software
    - - - - Demo - 0x4 - ARM-ADS - - - STM32F407VG - STMicroelectronics - IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - "Startup\ST\STM32F4xx\startup_stm32f4xx.s" ("STM32F4xx Startup Code") - UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) - 6103 - stm32f4xx.h - - - - - - - - - - SFD\ST\STM32F4xx\STM32F4xx.sfr - 0 - - - - ST\STM32F4xx\ - ST\STM32F4xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 1 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x20020000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\common\ARMCMx;..\..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\..\os\ports\RVCT\ARMCMx;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\STM32;..\..\..\..\os\hal\platforms\STM32\GPIOv2;..\..\..\..\os\hal\platforms\STM32F4xx;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - cmparams.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\cmparams.h - - - vectors.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\vectors.s - - - nvic.c - 1 - ..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\..\os\kernel\include\chvt.h - - - - - hal - - - hal.c - 1 - ..\..\..\..\os\hal\src\hal.c - - - pal.c - 1 - ..\..\..\..\os\hal\src\pal.c - - - serial.c - 1 - ..\..\..\..\os\hal\src\serial.c - - - hal.h - 5 - ..\..\..\..\os\hal\include\hal.h - - - pal.h - 5 - ..\..\..\..\os\hal\include\pal.h - - - serial.h - 5 - ..\..\..\..\os\hal\include\serial.h - - - gpt.h - 5 - ..\..\..\..\os\hal\include\gpt.h - - - gpt.c - 1 - ..\..\..\..\os\hal\src\gpt.c - - - - - platform - - - gpt_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - gpt_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - hal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.h - - - pal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - serial_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\serial_lld.c - - - serial_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\serial_lld.h - - - stm32_dma.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.h - - - stm32_rcc.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_rcc.h - - - stm32l1xx.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32l1xx.h - - - - - test - - - test.c - 1 - ..\..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - extfunc.c - 1 - ..\extfunc.c - - - - - - - -
    diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/main.c b/testhal/STM32F4xx/IRQ_STORM_FPU/main.c deleted file mode 100644 index c32cbf10f3..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/main.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -float ff1(float par); - -float ff2(float par1, float par2, float par3, float par4); - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -static bool_t saturated; - -/* - * Test worker thread. - */ -static WORKING_AREA(waWorkerThread, 128); -static msg_t WorkerThread(void *arg) { - - (void)arg; - - while(1) { - float f1, f2, f3, f4, f5; - - f1 = ff1(3.0f); - f2 = ff1(4.0f); - f3 = ff1(5.0f); - f5 = f1 + f2 + f3; - f4 = ff1(6.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 324.0f) - chSysHalt(); - } -} - -/* - * Test periodic thread. - */ -static WORKING_AREA(waPeriodicThread, 128); -static msg_t PeriodicThread(void *arg) { - - (void)arg; - - while(1) { - float f1, f2, f3, f4, f5; - - f1 = ff1(4.0f); - f2 = ff1(5.0f); - f3 = ff1(6.0f); - f5 = f1 + f2 + f3; - f4 = ff1(7.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 484.0f) - chSysHalt(); - chThdSleepSeconds(1); - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - float f1, f2, f3, f4, f5; - - (void)gptp; - - f1 = ff1(2.0f); - f2 = ff1(3.0f); - f3 = ff1(4.0f); - f5 = f1 + f2 + f3; - f4 = ff1(5.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 196.0f) - chSysHalt(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - float f1, f2, f3, f4, f5; - - (void)gptp; - - f1 = ff1(1.0f); - f2 = ff1(2.0f); - f3 = ff1(3.0f); - f5 = f1 + f2 + f3; - f4 = ff1(4.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 100.0f) - chSysHalt(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 2 and 3. - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the worker threads. - */ - chThdCreateStatic(waWorkerThread, sizeof waWorkerThread, - NORMALPRIO - 20, WorkerThread, NULL); - chThdCreateStatic(waPeriodicThread, sizeof waPeriodicThread, - NORMALPRIO - 10, PeriodicThread, NULL); - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM-FPU long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 10; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } -} diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h b/testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h deleted file mode 100644 index 95713caeb1..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt b/testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt deleted file mode 100644 index fea7f2d89f..0000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM_FPU stress test demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx GPT, PAL and Serial -drivers in order to implement a system stress demo involving the FPU. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using YAGARTO 4.6.2. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/PWM-ICU/Makefile b/testhal/STM32F4xx/PWM-ICU/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/PWM-ICU/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/PWM-ICU/chconf.h b/testhal/STM32F4xx/PWM-ICU/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/PWM-ICU/halconf.h b/testhal/STM32F4xx/PWM-ICU/halconf.h deleted file mode 100644 index 9e7b5b6fe4..0000000000 --- a/testhal/STM32F4xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/PWM-ICU/main.c b/testhal/STM32F4xx/PWM-ICU/main.c deleted file mode 100644 index de2818a151..0000000000 --- a/testhal/STM32F4xx/PWM-ICU/main.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOD, GPIOD_LED5); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOD, GPIOD_LED5); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOD, GPIOD_LED4); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOD, GPIOD_LED4); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA15 is the PWM output. - * GPIOC6 is the ICU input. - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(1)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOC, 6, PAL_MODE_ALTERNATE(2)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOD, GPIOD_LED4); - palClearPad(GPIOD, GPIOD_LED5); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F4xx/PWM-ICU/mcuconf.h b/testhal/STM32F4xx/PWM-ICU/mcuconf.h deleted file mode 100644 index 3b8cbbe1e9..0000000000 --- a/testhal/STM32F4xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/PWM-ICU/readme.txt b/testhal/STM32F4xx/PWM-ICU/readme.txt deleted file mode 100644 index 856a627999..0000000000 --- a/testhal/STM32F4xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx PWM-ICU drivers. - -** Board Setup ** - -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/RTC/Makefile b/testhal/STM32F4xx/RTC/Makefile deleted file mode 100644 index e383fef857..0000000000 --- a/testhal/STM32F4xx/RTC/Makefile +++ /dev/null @@ -1,226 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/RTC/chconf.h b/testhal/STM32F4xx/RTC/chconf.h deleted file mode 100644 index f0b22f246b..0000000000 --- a/testhal/STM32F4xx/RTC/chconf.h +++ /dev/null @@ -1,512 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#define CORTEX_USE_FPU FALSE - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC/halconf.h b/testhal/STM32F4xx/RTC/halconf.h deleted file mode 100644 index db9b18ed8f..0000000000 --- a/testhal/STM32F4xx/RTC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC/main.c b/testhal/STM32F4xx/RTC/main.c deleted file mode 100644 index c3d54850c6..0000000000 --- a/testhal/STM32F4xx/RTC/main.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* -This structure is used to hold the values representing a calendar time. -It contains the following members, with the meanings as shown. - -int tm_sec seconds after minute [0-61] (61 allows for 2 leap-seconds) -int tm_min minutes after hour [0-59] -int tm_hour hours after midnight [0-23] -int tm_mday day of the month [1-31] -int tm_mon month of year [0-11] -int tm_year current year-1900 -int tm_wday days since Sunday [0-6] -int tm_yday days since January 1st [0-365] -int tm_isdst daylight savings indicator (1 = yes, 0 = no, -1 = unknown) -*/ -#define WAKEUP_TEST FALSE - -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" - -#if WAKEUP_TEST -static RTCWakeup wakeupspec; -#endif -static RTCAlarm alarmspec; -static time_t unix_time; - -/* libc stub */ -int _getpid(void) {return 1;} -/* libc stub */ -void _exit(int i) {(void)i;} -/* libc stub */ -#include -#undef errno -extern int errno; -int _kill(int pid, int sig) { - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - - -/* sleep indicator thread */ -static WORKING_AREA(blinkWA, 128); -static msg_t blink_thd(void *arg){ - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(100); - palTogglePad(GPIOB, GPIOB_LED_R); - } - return 0; -} - -static void func_sleep(void){ - chSysLock(); - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - PWR->CR |= (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_CSBF | PWR_CR_CWUF); - RTC->ISR &= ~(RTC_ISR_ALRBF | RTC_ISR_ALRAF | RTC_ISR_WUTF | RTC_ISR_TAMP1F | - RTC_ISR_TSOVF | RTC_ISR_TSF); - __WFI(); -} - -static void cmd_sleep(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: sleep\r\n"); - return; - } - chprintf(chp, "Going to sleep.\r\n"); - - chThdSleepMilliseconds(200); - - /* going to anabiosis */ - func_sleep(); -} - -/* - * - */ -static void cmd_alarm(BaseSequentialStream *chp, int argc, char *argv[]){ - int i = 0; - - (void)argv; - if (argc < 1) { - goto ERROR; - } - - if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ - rtcGetAlarm(&RTCD1, 0, &alarmspec); - chprintf(chp, "%D%s",alarmspec," - alarm in STM internal format\r\n"); - return; - } - - if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ - i = atol(argv[1]); - alarmspec.tv_datetime = ((i / 10) & 7 << 4) | (i % 10) | RTC_ALRMAR_MSK4 | - RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK2; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - return; - } - else{ - goto ERROR; - } - -ERROR: - chprintf(chp, "Usage: alarm get\r\n"); - chprintf(chp, " alarm set N\r\n"); - chprintf(chp, "where N is alarm time in seconds\r\n"); -} - -/* - * - */ -static void cmd_date(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - struct tm timp; - - if (argc == 0) { - goto ERROR; - } - - if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ - unix_time = rtcGetTimeUnixSec(&RTCD1); - - if (unix_time == -1){ - chprintf(chp, "incorrect time in RTC cell\r\n"); - } - else{ - chprintf(chp, "%D%s",unix_time," - unix time\r\n"); - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "%s%s",asctime(&timp)," - formatted time string\r\n"); - } - return; - } - - if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ - unix_time = atol(argv[1]); - if (unix_time > 0){ - rtcSetTimeUnixSec(&RTCD1, unix_time); - return; - } - else{ - goto ERROR; - } - } - else{ - goto ERROR; - } - -ERROR: - chprintf(chp, "Usage: date get\r\n"); - chprintf(chp, " date set N\r\n"); - chprintf(chp, "where N is time in seconds sins Unix epoch\r\n"); - chprintf(chp, "you can get current N value from unix console by the command\r\n"); - chprintf(chp, "%s", "date +\%s\r\n"); - return; -} - -static SerialConfig ser_cfg = { - 115200, - 0, - 0, - 0, -}; - -static const ShellCommand commands[] = { - {"alarm", cmd_alarm}, - {"date", cmd_date}, - {"sleep", cmd_sleep}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - - -/** - * Main function. - */ -int main(void){ - - halInit(); - chSysInit(); - chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL); - -#if !WAKEUP_TEST - /* switch off wakeup */ - rtcSetPeriodicWakeup_v2(&RTCD1, NULL); - - /* Shell initialization.*/ - sdStart(&SD2, &ser_cfg); - shellInit(); - static WORKING_AREA(waShell, 1024); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* wait until user do not want to test wakeup */ - while (TRUE){ - chThdSleepMilliseconds(200); - } - -#else - /* set wakeup */ - wakeupspec.wakeup = ((uint32_t)4) << 16; /* select 1 Hz clock source */ - wakeupspec.wakeup |= 9; /* set counter value to 9. Period will be 9+1 seconds. */ - rtcSetPeriodicWakeup_v2(&RTCD1, &wakeupspec); - - chThdSleepSeconds(3); - func_sleep(); -#endif /* !WAKEUP_TEST */ - - return 0; -} - - diff --git a/testhal/STM32F4xx/RTC/mcuconf.h b/testhal/STM32F4xx/RTC/mcuconf.h deleted file mode 100644 index b95361bad5..0000000000 --- a/testhal/STM32F4xx/RTC/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED TRUE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/RTC_FATTIME/Makefile b/testhal/STM32F4xx/RTC_FATTIME/Makefile deleted file mode 100755 index ffd36e3d21..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 #-mhard-float -mfpu=fpv4-sp-d16 -fsingle-precision-constant -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= ch.ld - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various $(FATFSINC) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/RTC_FATTIME/chconf.h b/testhal/STM32F4xx/RTC_FATTIME/chconf.h deleted file mode 100755 index e7d2b29a57..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/chconf.h +++ /dev/null @@ -1,538 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#define CORTEX_USE_FPU FALSE - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitily from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC_FATTIME/ffconf.h b/testhal/STM32F4xx/RTC_FATTIME/ffconf.h deleted file mode 100755 index a4816e8451..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 1 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1251 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 1 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 1 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 1 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/testhal/STM32F4xx/RTC_FATTIME/halconf.h b/testhal/STM32F4xx/RTC_FATTIME/halconf.h deleted file mode 100755 index cd7d0d051d..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/halconf.h +++ /dev/null @@ -1,349 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intevals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_WRITE_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_WRITE_TIMEOUT_MS 250 -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_READ_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_READ_TIMEOUT_MS 5 -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC_FATTIME/main.c b/testhal/STM32F4xx/RTC_FATTIME/main.c deleted file mode 100755 index 15e73b564b..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/main.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" - -#include "ff.h" - -/* FS object.*/ -static FATFS SDC_FS; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/** - * - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - (void)sdcp; - return FALSE; -} - -/** - * - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - (void)sdcp; - return !palReadPad(GPIOE, GPIOE_SDIO_DETECT); -} - -/** - * - */ -void cmd_sdiotest(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argc; - (void)argv; - FRESULT err; - uint32_t clusters; - FATFS *fsp; - FIL FileObject; - //FILINFO FileInfo; - size_t bytes_written; - struct tm timp; - -#if !HAL_USE_RTC - chprintf(chp, "ERROR! Chibios compiled without RTC support."); - chprintf(chp, "Enable HAL_USE_RCT in you halconf.h"); - chThdSleepMilliseconds(100); - return; -#endif - - chprintf(chp, "Trying to connect SDIO... "); - chThdSleepMilliseconds(100); - - if (!sdcConnect(&SDCD1)) { - chprintf(chp, "OK\r\n"); - chprintf(chp, "Register working area for filesystem... "); - chThdSleepMilliseconds(100); - err = f_mount(0, &SDC_FS); - if (err != FR_OK){ - chSysHalt(); - } - else{ - fs_ready = TRUE; - chprintf(chp, "OK\r\n"); - } - - chprintf(chp, "Mounting filesystem... "); - chThdSleepMilliseconds(100); - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)SDC_FS.csize, - clusters * (uint32_t)SDC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "Current RTC time is: "); - chprintf(chp, "%u-%u-%u %u:%u:%u\r\n", - timp.tm_year+1900, timp.tm_mon+1, timp.tm_mday, timp.tm_hour, timp.tm_min, - timp.tm_sec); - - chprintf(chp, "Creating empty file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_open(&FileObject, "0:tmstmp.tst", FA_WRITE | FA_OPEN_ALWAYS); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Write some data in it... "); - chThdSleepMilliseconds(100); - err = f_write(&FileObject, "tst", sizeof("tst"), (void *)&bytes_written); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Closing file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_close(&FileObject); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - -// chprintf(chp, "Obtaining file info ... "); -// chThdSleepMilliseconds(100); -// err = f_stat("0:tmstmp.tst", &FileInfo); -// if (err != FR_OK) { -// chSysHalt(); -// } -// else{ -// chprintf(chp, "OK\r\n"); -// chprintf(chp, " Timestamp: %u-%u-%u %u:%u:%u\r\n", -// ((FileInfo.fdate >> 9) & 127) + 1980, -// (FileInfo.fdate >> 5) & 15, -// FileInfo.fdate & 31, -// (FileInfo.ftime >> 11) & 31, -// (FileInfo.ftime >> 5) & 63, -// (FileInfo.ftime & 31) * 2); -// } - - chprintf(chp, "Umounting filesystem... "); - f_mount(0, NULL); - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Disconnecting from SDIO..."); - chThdSleepMilliseconds(100); - if (sdcDisconnect(&SDCD1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chprintf(chp, "------------------------------------------------------\r\n"); - chprintf(chp, "Now you can remove memory card and check timestamp on PC.\r\n"); - chThdSleepMilliseconds(100); - } - else{ - chSysHalt(); - } -} - -/* - * SDIO configuration. - */ -static const SDCConfig sdccfg = { - 0 -}; - -/** - * - */ -static SerialConfig ser_cfg = { - 115200, - 0, - 0, - 0, -}; -static const ShellCommand commands[] = { - {"sdiotest", cmd_sdiotest}, - {NULL, NULL} -}; -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Application entry point. - */ -int main(void) { - halInit(); - chSysInit(); - - /* start debugging serial link */ - sdStart(&SD2, &ser_cfg); - shellInit(); - static WORKING_AREA(waShell, 4096); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* - * Initializes the SDIO drivers. - */ - sdcStart(&SDCD1, &sdccfg); - - /* - * Normal main() thread activity. - * Blinking signaling about successful passing. - */ - while (TRUE) { - palTogglePad(GPIOB, GPIOB_LED_R); - chThdSleepMilliseconds(100); - } -} diff --git a/testhal/STM32F4xx/RTC_FATTIME/mcuconf.h b/testhal/STM32F4xx/RTC_FATTIME/mcuconf.h deleted file mode 100755 index 1ca881ce60..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/RTC_FATTIME/readme.txt b/testhal/STM32F4xx/RTC_FATTIME/readme.txt deleted file mode 100755 index b5036cd2ca..0000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex ST_STM3210E_EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32 RTC driver for timestamping -files on FAT. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/SDC/Makefile b/testhal/STM32F4xx/SDC/Makefile deleted file mode 100755 index 1c0adc0892..0000000000 --- a/testhal/STM32F4xx/SDC/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 #-mhard-float -mfpu=fpv4-sp-d16 -fsingle-precision-constant -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= ch.ld - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/SDC/chconf.h b/testhal/STM32F4xx/SDC/chconf.h deleted file mode 100755 index e7d2b29a57..0000000000 --- a/testhal/STM32F4xx/SDC/chconf.h +++ /dev/null @@ -1,538 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#define CORTEX_USE_FPU FALSE - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitily from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SDC/csd.txt b/testhal/STM32F4xx/SDC/csd.txt deleted file mode 100755 index eefe5274ca..0000000000 --- a/testhal/STM32F4xx/SDC/csd.txt +++ /dev/null @@ -1,7 +0,0 @@ -127 ... ... 0 - -00000000 00101110 00000000 00110010 - 01011011 01011010 10100011 10100000 - 11111111111111111111111110000000 - 00001010100000000000000010001110 kingmax 2 GB -00000000 00101110 00000000 00110010 - 01011011 01011010 10000011 10101001 - 11111111111111111111111110000000 - 00010110100000000000000010010000 kingstone 2 GB -01000000 00001110 00000000 00110010 - 01011011 01011001 00000000 00000000 - 00111011010010110111111110000000 - 00001010010000000100000001000000 samsung sdhc 8 GB -00000000 00100110 00000000 00110010 - 01011111 01011010 10000011 10101110 - 11111110111110111100111111111111 - 10010010100000000100000011011110 noname 2 GB - diff --git a/testhal/STM32F4xx/SDC/ffconf.h b/testhal/STM32F4xx/SDC/ffconf.h deleted file mode 100755 index 9073f22861..0000000000 --- a/testhal/STM32F4xx/SDC/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 1 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1251 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 1 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 1 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/testhal/STM32F4xx/SDC/halconf.h b/testhal/STM32F4xx/SDC/halconf.h deleted file mode 100755 index c1949d1193..0000000000 --- a/testhal/STM32F4xx/SDC/halconf.h +++ /dev/null @@ -1,349 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intevals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_WRITE_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_WRITE_TIMEOUT_MS 250 -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_READ_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_READ_TIMEOUT_MS 5 -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SDC/main.c b/testhal/STM32F4xx/SDC/main.c deleted file mode 100755 index 7fcc63f17e..0000000000 --- a/testhal/STM32F4xx/SDC/main.c +++ /dev/null @@ -1,402 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" - -#include "ff.h" - -#define SDC_DATA_DESTRUCTIVE_TEST FALSE - -#define SDC_BURST_SIZE 8 /* how many sectors reads at once */ -static uint8_t outbuf[MMCSD_BLOCK_SIZE * SDC_BURST_SIZE + 1]; -static uint8_t inbuf[MMCSD_BLOCK_SIZE * SDC_BURST_SIZE + 1]; - -/* FS object.*/ -static FATFS SDC_FS; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/** - * @brief Parody of UNIX badblocks program. - * - * @param[in] start first block to check - * @param[in] end last block to check - * @param[in] blockatonce number of blocks to check at once - * @param[in] pattern check pattern - * - * @return The operation status. - * @retval SDC_SUCCESS operation succeeded, the requested blocks have been - * read. - * @retval SDC_FAILED operation failed, the state of the buffer is uncertain. - */ -bool_t badblocks(uint32_t start, uint32_t end, uint32_t blockatonce, uint8_t pattern){ - uint32_t position = 0; - uint32_t i = 0; - - chDbgCheck(blockatonce <= SDC_BURST_SIZE, "badblocks"); - - /* fill control buffer */ - for (i=0; i < MMCSD_BLOCK_SIZE * blockatonce; i++) - outbuf[i] = pattern; - - /* fill SD card with pattern. */ - position = start; - while (position < end){ - if (sdcWrite(&SDCD1, position, outbuf, blockatonce)) - goto ERROR; - position += blockatonce; - } - - /* read and compare. */ - position = start; - while (position < end){ - if (sdcRead(&SDCD1, position, inbuf, blockatonce)) - goto ERROR; - if (memcmp(inbuf, outbuf, blockatonce * MMCSD_BLOCK_SIZE) != 0) - goto ERROR; - position += blockatonce; - } - return FALSE; - -ERROR: - return TRUE; -} - -/** - * - */ -void fillbuffer(uint8_t pattern, uint8_t *b){ - uint32_t i = 0; - for (i=0; i < MMCSD_BLOCK_SIZE * SDC_BURST_SIZE; i++) - b[i] = pattern; -} - -/** - * - */ -void fillbuffers(uint8_t pattern){ - fillbuffer(pattern, inbuf); - fillbuffer(pattern, outbuf); -} - -/** - * - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - (void)sdcp; - return FALSE; -} - -/** - * - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - (void)sdcp; - return !palReadPad(GPIOE, GPIOE_SDIO_DETECT); -} - -/** - * - */ -void cmd_sdiotest(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argc; - (void)argv; - uint32_t i = 0; - - chprintf(chp, "Trying to connect SDIO... "); - chThdSleepMilliseconds(100); - - if (!sdcConnect(&SDCD1)) { - - chprintf(chp, "OK\r\n"); - chprintf(chp, "*** Card CSD content is: "); - chprintf(chp, "%X %X %X %X \r\n", (&SDCD1)->csd[3], (&SDCD1)->csd[2], - (&SDCD1)->csd[1], (&SDCD1)->csd[0]); - - chprintf(chp, "Single aligned read..."); - chThdSleepMilliseconds(100); - if (sdcRead(&SDCD1, 0, inbuf, 1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - - - chprintf(chp, "Single unaligned read..."); - chThdSleepMilliseconds(100); - if (sdcRead(&SDCD1, 0, inbuf + 1, 1)) - chSysHalt(); - if (sdcRead(&SDCD1, 0, inbuf + 2, 1)) - chSysHalt(); - if (sdcRead(&SDCD1, 0, inbuf + 3, 1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - - - chprintf(chp, "Multiple aligned reads..."); - chThdSleepMilliseconds(100); - fillbuffers(0x55); - /* fill reference buffer from SD card */ - if (sdcRead(&SDCD1, 0, inbuf, SDC_BURST_SIZE)) - chSysHalt(); - for (i=0; i<1000; i++){ - if (sdcRead(&SDCD1, 0, outbuf, SDC_BURST_SIZE)) - chSysHalt(); - if (memcmp(inbuf, outbuf, SDC_BURST_SIZE * MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - } - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - - - chprintf(chp, "Multiple unaligned reads..."); - chThdSleepMilliseconds(100); - fillbuffers(0x55); - /* fill reference buffer from SD card */ - if (sdcRead(&SDCD1, 0, inbuf + 1, SDC_BURST_SIZE)) - chSysHalt(); - for (i=0; i<1000; i++){ - if (sdcRead(&SDCD1, 0, outbuf + 1, SDC_BURST_SIZE)) - chSysHalt(); - if (memcmp(inbuf, outbuf, SDC_BURST_SIZE * MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - } - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - -#if SDC_DATA_DESTRUCTIVE_TEST - - chprintf(chp, "Single aligned write..."); - chThdSleepMilliseconds(100); - fillbuffer(0xAA, inbuf); - if (sdcWrite(&SDCD1, 0, inbuf, 1)) - chSysHalt(); - fillbuffer(0, outbuf); - if (sdcRead(&SDCD1, 0, outbuf, 1)) - chSysHalt(); - if (memcmp(inbuf, outbuf, MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - chprintf(chp, " OK\r\n"); - - chprintf(chp, "Single unaligned write..."); - chThdSleepMilliseconds(100); - fillbuffer(0xFF, inbuf); - if (sdcWrite(&SDCD1, 0, inbuf+1, 1)) - chSysHalt(); - fillbuffer(0, outbuf); - if (sdcRead(&SDCD1, 0, outbuf+1, 1)) - chSysHalt(); - if (memcmp(inbuf+1, outbuf+1, MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - chprintf(chp, " OK\r\n"); - - chprintf(chp, "Running badblocks at 0x10000 offset..."); - chThdSleepMilliseconds(100); - if(badblocks(0x10000, 0x11000, SDC_BURST_SIZE, 0xAA)) - chSysHalt(); - chprintf(chp, " OK\r\n"); -#endif /* !SDC_DATA_DESTRUCTIVE_TEST */ - - - /** - * Now perform some FS tests. - */ - - FRESULT err; - uint32_t clusters; - FATFS *fsp; - FIL FileObject; - uint32_t bytes_written; - uint32_t bytes_read; - FILINFO filinfo; - uint8_t teststring[] = {"This is test file\r\n"}; - - chprintf(chp, "Register working area for filesystem... "); - chThdSleepMilliseconds(100); - err = f_mount(0, &SDC_FS); - if (err != FR_OK){ - chSysHalt(); - } - else{ - fs_ready = TRUE; - chprintf(chp, "OK\r\n"); - } - - -#if SDC_DATA_DESTRUCTIVE_TEST - chprintf(chp, "Formatting... "); - chThdSleepMilliseconds(100); - err = f_mkfs (0,0,0); - if (err != FR_OK){ - chSysHalt(); - } - else{ - chprintf(chp, "OK\r\n"); - } -#endif /* SDC_DATA_DESTRUCTIVE_TEST */ - - - chprintf(chp, "Mount filesystem... "); - chThdSleepMilliseconds(100); - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)SDC_FS.csize, - clusters * (uint32_t)SDC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - - - chprintf(chp, "Create file \"chtest.txt\"... "); - chThdSleepMilliseconds(100); - err = f_open(&FileObject, "0:chtest.txt", FA_WRITE | FA_OPEN_ALWAYS); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, "Write some data in it... "); - chThdSleepMilliseconds(100); - err = f_write(&FileObject, teststring, sizeof(teststring), (void *)&bytes_written); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Close file \"chtest.txt\"... "); - err = f_close(&FileObject); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Check file size \"chtest.txt\"... "); - err = f_stat("0:chtest.txt", &filinfo); - chThdSleepMilliseconds(100); - if (err != FR_OK) { - chSysHalt(); - } - else{ - if (filinfo.fsize == sizeof(teststring)) - chprintf(chp, "OK\r\n"); - else - chSysHalt(); - } - - chprintf(chp, "Check file content \"chtest.txt\"... "); - err = f_open(&FileObject, "0:chtest.txt", FA_READ | FA_OPEN_EXISTING); - chThdSleepMilliseconds(100); - if (err != FR_OK) { - chSysHalt(); - } - uint8_t buf[sizeof(teststring)]; - err = f_read(&FileObject, buf, sizeof(teststring), (void *)&bytes_read); - if (err != FR_OK) { - chSysHalt(); - } - else{ - if (memcmp(teststring, buf, sizeof(teststring)) != 0){ - chSysHalt(); - } - else{ - chprintf(chp, "OK\r\n"); - } - } - - chprintf(chp, "Umount filesystem... "); - f_mount(0, NULL); - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Disconnecting from SDIO..."); - chThdSleepMilliseconds(100); - if (sdcDisconnect(&SDCD1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chprintf(chp, "------------------------------------------------------\r\n"); - chprintf(chp, "All tests passed successfully.\r\n"); - chThdSleepMilliseconds(100); - } - else{ - chSysHalt(); - } -} - - -/* - * SDIO configuration. - */ -static const SDCConfig sdccfg = { - 0 -}; - -/** - * - */ -static SerialConfig ser_cfg = { - 115200, - 0, - 0, - 0, -}; -static const ShellCommand commands[] = { - {"sdiotest", cmd_sdiotest}, - {NULL, NULL} -}; -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Application entry point. - */ -int main(void) { - halInit(); - chSysInit(); - - /* start debugging serial link */ - sdStart(&SD2, &ser_cfg); - shellInit(); - static WORKING_AREA(waShell, 2048); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* - * Initializes the SDIO drivers. - */ - sdcStart(&SDCD1, &sdccfg); - - /* - * Normal main() thread activity. - * Blinking signaling about successful passing. - */ - while (TRUE) { - palTogglePad(GPIOB, GPIOB_LED_R); - chThdSleepMilliseconds(100); - } -} diff --git a/testhal/STM32F4xx/SDC/mcuconf.h b/testhal/STM32F4xx/SDC/mcuconf.h deleted file mode 100755 index 1ca881ce60..0000000000 --- a/testhal/STM32F4xx/SDC/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/SDC/readme.txt b/testhal/STM32F4xx/SDC/readme.txt deleted file mode 100755 index b897676af4..0000000000 --- a/testhal/STM32F4xx/SDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex ST_STM3210E_EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32 SDC driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/SPI/Makefile b/testhal/STM32F4xx/SPI/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/SPI/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/SPI/chconf.h b/testhal/STM32F4xx/SPI/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/SPI/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SPI/halconf.h b/testhal/STM32F4xx/SPI/halconf.h deleted file mode 100644 index d176ad1a74..0000000000 --- a/testhal/STM32F4xx/SPI/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SPI/main.c b/testhal/STM32F4xx/SPI/main.c deleted file mode 100644 index cd7d46804f..0000000000 --- a/testhal/STM32F4xx/SPI/main.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0 -}; - -/* - * Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 12, - SPI_CR1_BR_2 | SPI_CR1_BR_1 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOD, GPIOD_LED5); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOD, GPIOD_LED5); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI2 I/O pins setup. - */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MOSI. */ - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* New CS. */ - palSetPad(GPIOB, 12); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F4xx/SPI/mcuconf.h b/testhal/STM32F4xx/SPI/mcuconf.h deleted file mode 100644 index feab35c2b4..0000000000 --- a/testhal/STM32F4xx/SPI/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/SPI/readme.txt b/testhal/STM32F4xx/SPI/readme.txt deleted file mode 100644 index d3d78bc8cd..0000000000 --- a/testhal/STM32F4xx/SPI/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx SPI driver. - -** Board Setup ** - -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/UART/Makefile b/testhal/STM32F4xx/UART/Makefile deleted file mode 100644 index 86de6d81c2..0000000000 --- a/testhal/STM32F4xx/UART/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/UART/chconf.h b/testhal/STM32F4xx/UART/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/UART/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/UART/halconf.h b/testhal/STM32F4xx/UART/halconf.h deleted file mode 100644 index 60af9dec00..0000000000 --- a/testhal/STM32F4xx/UART/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/UART/main.c b/testhal/STM32F4xx/UART/main.c deleted file mode 100644 index 69aed3c19e..0000000000 --- a/testhal/STM32F4xx/UART/main.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD2, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palClearPad(GPIOD, GPIOD_LED4); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOD, GPIOD_LED4); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palClearPad(GPIOD, GPIOD_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOD, GPIOD_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the UART driver 2, PA2(TX) and PA3(RX) are routed to USART2. - */ - uartStart(&UARTD2, &uart_cfg_1); - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD2, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F4xx/UART/mcuconf.h b/testhal/STM32F4xx/UART/mcuconf.h deleted file mode 100644 index ce09bfae9a..0000000000 --- a/testhal/STM32F4xx/UART/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USE_USART6 TRUE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/UART/readme.txt b/testhal/STM32F4xx/UART/readme.txt deleted file mode 100644 index 19a8e26daa..0000000000 --- a/testhal/STM32F4xx/UART/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx UART driver. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA2(TX) and PA3(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/USB_CDC/.cproject b/testhal/STM32F4xx/USB_CDC/.cproject deleted file mode 100644 index 10ff121bb3..0000000000 --- a/testhal/STM32F4xx/USB_CDC/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/USB_CDC/.project b/testhal/STM32F4xx/USB_CDC/.project deleted file mode 100644 index 29c5c4c72a..0000000000 --- a/testhal/STM32F4xx/USB_CDC/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - TEST-STM32F4xx-USB_CDC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/testhal/STM32F4xx/USB_CDC/Makefile b/testhal/STM32F4xx/USB_CDC/Makefile deleted file mode 100644 index 8c329e2d76..0000000000 --- a/testhal/STM32F4xx/USB_CDC/Makefile +++ /dev/null @@ -1,223 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_E407/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/USB_CDC/chconf.h b/testhal/STM32F4xx/USB_CDC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32F4xx/USB_CDC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/USB_CDC/halconf.h b/testhal/STM32F4xx/USB_CDC/halconf.h deleted file mode 100644 index 7d1f492f8e..0000000000 --- a/testhal/STM32F4xx/USB_CDC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/USB_CDC/main.c b/testhal/STM32F4xx/USB_CDC/main.c deleted file mode 100644 index 5503884ff9..0000000000 --- a/testhal/STM32F4xx/USB_CDC/main.c +++ /dev/null @@ -1,506 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "usb_cdc.h" -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 2, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(usbp); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD2 -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time; - - time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(time); - palSetPad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F4xx/USB_CDC/mcuconf.h b/testhal/STM32F4xx/USB_CDC/mcuconf.h deleted file mode 100644 index b641a08887..0000000000 --- a/testhal/STM32F4xx/USB_CDC/mcuconf.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 12 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 TRUE -#define STM32_USB_USE_OTG2 TRUE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 - - diff --git a/testhal/STM32F4xx/USB_CDC/readme.txt b/testhal/STM32F4xx/USB_CDC/readme.txt deleted file mode 100644 index a619a3ec1d..0000000000 --- a/testhal/STM32F4xx/USB_CDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-E407 board. - -** The Demo ** - -The application demonstrates the use of the STM32 USB (OTG) driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/ADC/Makefile b/testhal/STM32L1xx/ADC/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/ADC/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/ADC/chconf.h b/testhal/STM32L1xx/ADC/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32L1xx/ADC/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/ADC/halconf.h b/testhal/STM32L1xx/ADC/halconf.h deleted file mode 100644 index 5452417835..0000000000 --- a/testhal/STM32L1xx/ADC/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/ADC/main.c b/testhal/STM32L1xx/ADC/main.c deleted file mode 100644 index 140834f9c5..0000000000 --- a/testhal/STM32L1xx/ADC/main.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, /* SMPR1 */ - ADC_SMPR2_SMP_AN10(ADC_SAMPLE_4), - 0, /* SMPR3 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, 0, 0, /* SQR2, SQR3, SQR4 */ - ADC_SQR5_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, /* SMPR1 */ - ADC_SMPR2_SMP_AN11(ADC_SAMPLE_48) | ADC_SMPR2_SMP_AN10(ADC_SAMPLE_48) | - ADC_SMPR2_SMP_SENSOR(ADC_SAMPLE_192) | ADC_SMPR2_SMP_VREF(ADC_SAMPLE_192), - 0, /* SMPR3 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - 0, 0, /* SQR2, SQR3 */ - ADC_SQR4_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR4_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR5_SQ6_N(ADC_CHANNEL_IN11) | ADC_SQR5_SQ5_N(ADC_CHANNEL_IN10) | - ADC_SQR5_SQ4_N(ADC_CHANNEL_IN11) | ADC_SQR5_SQ3_N(ADC_CHANNEL_IN10) | - ADC_SQR5_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR5_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOB, GPIOB_LED4); - chThdSleepMilliseconds(500); - palClearPad(GPIOB, GPIOB_LED4); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(0) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the thermal sensor. - */ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - adcSTM32DisableTSVREFE(); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32L1xx/ADC/mcuconf.h b/testhal/STM32L1xx/ADC/mcuconf.h deleted file mode 100644 index 8f2abd84d9..0000000000 --- a/testhal/STM32L1xx/ADC/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/ADC/readme.txt b/testhal/STM32L1xx/ADC/readme.txt deleted file mode 100644 index 91e9574b30..0000000000 --- a/testhal/STM32L1xx/ADC/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx ADC driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect PC0 to 3.3V and PC1 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/EXT/Makefile b/testhal/STM32L1xx/EXT/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/EXT/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/EXT/chconf.h b/testhal/STM32L1xx/EXT/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32L1xx/EXT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/EXT/halconf.h b/testhal/STM32L1xx/EXT/halconf.h deleted file mode 100644 index 5a1e5c050f..0000000000 --- a/testhal/STM32L1xx/EXT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/EXT/main.c b/testhal/STM32L1xx/EXT/main.c deleted file mode 100644 index 88721db861..0000000000 --- a/testhal/STM32L1xx/EXT/main.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void led4off(void *arg) { - - (void)arg; - palClearPad(GPIOB, GPIOB_LED4); -} - -/* Triggered when the button is pressed or released. The LED4 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - palSetPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led4off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32L1xx/EXT/mcuconf.h b/testhal/STM32L1xx/EXT/mcuconf.h deleted file mode 100644 index dd173d0a06..0000000000 --- a/testhal/STM32L1xx/EXT/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/EXT/readme.txt b/testhal/STM32L1xx/EXT/readme.txt deleted file mode 100644 index 16953a3c99..0000000000 --- a/testhal/STM32L1xx/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/GPT/Makefile b/testhal/STM32L1xx/GPT/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/GPT/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/GPT/chconf.h b/testhal/STM32L1xx/GPT/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32L1xx/GPT/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/GPT/halconf.h b/testhal/STM32L1xx/GPT/halconf.h deleted file mode 100644 index ad048e08f2..0000000000 --- a/testhal/STM32L1xx/GPT/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/GPT/main.c b/testhal/STM32L1xx/GPT/main.c deleted file mode 100644 index e263c48132..0000000000 --- a/testhal/STM32L1xx/GPT/main.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - - (void)gptp; - palSetPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - gptStartOneShotI(&GPTD3, 1000); /* 0.1 second pulse.*/ - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - - (void)gptp; - palClearPad(GPIOB, GPIOB_LED4); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 10000, /* 10kHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 10000, /* 10kHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the GPT drivers 2 and 3. - */ - gptStart(&GPTD2, &gpt2cfg); - gptPolledDelay(&GPTD2, 10); /* Small delay.*/ - gptStart(&GPTD3, &gpt3cfg); - gptPolledDelay(&GPTD3, 10); /* Small delay.*/ - - /* - * Normal main() thread activity, it changes the GPT1 period every - * five seconds. - */ - while (TRUE) { - palSetPad(GPIOB, GPIOB_LED3); - gptStartContinuous(&GPTD2, 5000); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD2); - palClearPad(GPIOB, GPIOB_LED3); - gptStartContinuous(&GPTD2, 2500); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD2); - } -} diff --git a/testhal/STM32L1xx/GPT/mcuconf.h b/testhal/STM32L1xx/GPT/mcuconf.h deleted file mode 100644 index 1de4501d41..0000000000 --- a/testhal/STM32L1xx/GPT/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 TRUE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/GPT/readme.txt b/testhal/STM32L1xx/GPT/readme.txt deleted file mode 100644 index bb42bbc297..0000000000 --- a/testhal/STM32L1xx/GPT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - GPT driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx GPT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/IRQ_STORM/Makefile b/testhal/STM32L1xx/IRQ_STORM/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/IRQ_STORM/chconf.h b/testhal/STM32L1xx/IRQ_STORM/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM32L1xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/IRQ_STORM/halconf.h b/testhal/STM32L1xx/IRQ_STORM/halconf.h deleted file mode 100644 index 4e5a167966..0000000000 --- a/testhal/STM32L1xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/IRQ_STORM/main.c b/testhal/STM32L1xx/IRQ_STORM/main.c deleted file mode 100644 index 31ec40fb5b..0000000000 --- a/testhal/STM32L1xx/IRQ_STORM/main.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOB, GPIOB_LED4); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 1 and GPT drivers 2 and 3. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/STM32L1xx/IRQ_STORM/mcuconf.h b/testhal/STM32L1xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 1cc7b414a9..0000000000 --- a/testhal/STM32L1xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/IRQ_STORM/readme.txt b/testhal/STM32L1xx/IRQ_STORM/readme.txt deleted file mode 100644 index 9483b1f02b..0000000000 --- a/testhal/STM32L1xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/PWM-ICU/Makefile b/testhal/STM32L1xx/PWM-ICU/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/PWM-ICU/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/PWM-ICU/chconf.h b/testhal/STM32L1xx/PWM-ICU/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32L1xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/PWM-ICU/halconf.h b/testhal/STM32L1xx/PWM-ICU/halconf.h deleted file mode 100644 index 9e7b5b6fe4..0000000000 --- a/testhal/STM32L1xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/PWM-ICU/main.c b/testhal/STM32L1xx/PWM-ICU/main.c deleted file mode 100644 index c4fddb65f3..0000000000 --- a/testhal/STM32L1xx/PWM-ICU/main.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOB, GPIOB_LED4); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOB, GPIOB_LED4); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOB, GPIOB_LED3); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOB, GPIOB_LED3); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA15 is the PWM output. - * GPIOC6 is the ICU input. - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(1)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOC, 6, PAL_MODE_ALTERNATE(2)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOB, GPIOB_LED3); - palClearPad(GPIOB, GPIOB_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32L1xx/PWM-ICU/mcuconf.h b/testhal/STM32L1xx/PWM-ICU/mcuconf.h deleted file mode 100644 index 6673c35ec5..0000000000 --- a/testhal/STM32L1xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/PWM-ICU/readme.txt b/testhal/STM32L1xx/PWM-ICU/readme.txt deleted file mode 100644 index 52a2dd2adf..0000000000 --- a/testhal/STM32L1xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx PWM-ICU drivers. - -** Board Setup ** - -- Remove the LCD module. -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/SPI/Makefile b/testhal/STM32L1xx/SPI/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/SPI/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/SPI/chconf.h b/testhal/STM32L1xx/SPI/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32L1xx/SPI/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/SPI/halconf.h b/testhal/STM32L1xx/SPI/halconf.h deleted file mode 100644 index d176ad1a74..0000000000 --- a/testhal/STM32L1xx/SPI/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/SPI/main.c b/testhal/STM32L1xx/SPI/main.c deleted file mode 100644 index e9fed979a7..0000000000 --- a/testhal/STM32L1xx/SPI/main.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (16MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0 -}; - -/* - * Low speed SPI configuration (256kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 12, - SPI_CR1_BR_2 | SPI_CR1_BR_1 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOB, GPIOB_LED4); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOB, GPIOB_LED4); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI1 I/O pins setup. - */ - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* NSS. */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5)); /* MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* MOSI. */ - palSetPad(GPIOB, 12); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32L1xx/SPI/mcuconf.h b/testhal/STM32L1xx/SPI/mcuconf.h deleted file mode 100644 index 3e4f14fdba..0000000000 --- a/testhal/STM32L1xx/SPI/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/SPI/readme.txt b/testhal/STM32L1xx/SPI/readme.txt deleted file mode 100644 index 2ce8708518..0000000000 --- a/testhal/STM32L1xx/SPI/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx SPI driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/UART/Makefile b/testhal/STM32L1xx/UART/Makefile deleted file mode 100644 index 0d3a8e2b22..0000000000 --- a/testhal/STM32L1xx/UART/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/UART/chconf.h b/testhal/STM32L1xx/UART/chconf.h deleted file mode 100644 index 290044421c..0000000000 --- a/testhal/STM32L1xx/UART/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/UART/halconf.h b/testhal/STM32L1xx/UART/halconf.h deleted file mode 100644 index 60af9dec00..0000000000 --- a/testhal/STM32L1xx/UART/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/UART/main.c b/testhal/STM32L1xx/UART/main.c deleted file mode 100644 index 65f834672c..0000000000 --- a/testhal/STM32L1xx/UART/main.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD1, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palClearPad(GPIOB, GPIOB_LED4); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOB, GPIOB_LED4); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palClearPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART1. - */ - uartStart(&UARTD1, &uart_cfg_1); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD1, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32L1xx/UART/mcuconf.h b/testhal/STM32L1xx/UART/mcuconf.h deleted file mode 100644 index a6b10041e4..0000000000 --- a/testhal/STM32L1xx/UART/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/UART/readme.txt b/testhal/STM32L1xx/UART/readme.txt deleted file mode 100644 index 5f3edb8516..0000000000 --- a/testhal/STM32L1xx/UART/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx UART driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM8S/SPI/ChibiOS-RT.stw b/testhal/STM8S/SPI/ChibiOS-RT.stw deleted file mode 100644 index a6630271a8..0000000000 --- a/testhal/STM8S/SPI/ChibiOS-RT.stw +++ /dev/null @@ -1,16 +0,0 @@ -; STMicroelectronics Workspace file - -[Version] -Keyword=ST7Workspace-V0.7 - -[Project0] -Filename=cosmic\cosmic.stp -Dependencies= - -[Project1] -Filename=raisonance\raisonance.stp -Dependencies= -[Options] -ActiveProject=cosmic -ActiveConfig=Release -AddSortedElements=0 diff --git a/testhal/STM8S/SPI/cosmic/cosmic.stp b/testhal/STM8S/SPI/cosmic/cosmic.stp deleted file mode 100644 index f45146b03d..0000000000 --- a/testhal/STM8S/SPI/cosmic/cosmic.stp +++ /dev/null @@ -1,1947 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=cosmic -Toolset=STM8 Cosmic - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=cosmic -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\cosmic\stm8;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\include;..\..\..\..\os\hal\src;..\..\..\test;..\demo; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,5,25,14,45,56 -String.100.0=STM8S105C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,26,17,30,51 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,6,4,10,29,4 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x4000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x100 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x100 -m 0x700 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x4000-0x43ff]=.eeprom -String.103.2=Zero Page[0x0-0xff]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x100-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\cosmic\stm8;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\include;..\..\..\..\os\hal\src;..\..\..\test;..\demo; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,5,25,14,45,56 -String.100.0=STM8S105C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,6,5,11,53,48 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x4000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x100 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x100 -m 0x700 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x4000-0x43ff]=.eeprom -String.103.2=Zero Page[0x0-0xff]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x100-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.vectors.c - -[Root.Source Files.vectors.c] -ElemType=File -PathName=vectors.c -Next=Root.Source Files.Source Files\board - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s] -ElemType=Folder -PathName=Source Files\os\hal\stm8s -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,6,3,11,20,12 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,54,38 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,6,3,11,20,12 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,6,2,17,48,49 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,54,38 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,6,2,17,48,49 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.c] -ElemType=File -PathName=..\..\..\..\os\ports\cosmic\stm8\chcore.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal -Next=Root.Include Files.Include Files\test - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s] -ElemType=Folder -PathName=Include Files\os\hal\stm8s -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chioch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.h] -ElemType=File -PathName=..\..\..\..\os\ports\cosmic\stm8\chcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\test] -ElemType=Folder -PathName=Include Files\test \ No newline at end of file diff --git a/testhal/STM8S/SPI/cosmic/vectors.c b/testhal/STM8S/SPI/cosmic/vectors.c deleted file mode 100644 index ed3570a876..0000000000 --- a/testhal/STM8S/SPI/cosmic/vectors.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief Exception handler type. - */ -typedef void @far @interrupt (*interrupt_handler_t)(void); - -/* - * Various external symbols. - */ -void _stext(void); -@far @interrupt void vector10(void); -@far @interrupt void vector13(void); -@far @interrupt void vector17(void); -@far @interrupt void vector18(void); -@far @interrupt void vector20(void); -@far @interrupt void vector21(void); - -/** - * @brief Exception vector type. - */ -typedef struct { - uint8_t ev_instruction; - interrupt_handler_t ev_handler; -} exception_vector_t; - -/** - * @brief Undefined interrupt handler. - * @note It should never be invoked. - */ -@far @interrupt static void vector (void) -{ - return; -} - -/** - * @brief Exceptions table. - */ -exception_vector_t const _vectab[] = { - {0x82, (interrupt_handler_t)_stext}, /* reset */ - {0x82, vector}, /* trap */ - {0x82, vector}, /* vector0 */ - {0x82, vector}, /* vector1 */ - {0x82, vector}, /* vector2 */ - {0x82, vector}, /* vector3 */ - {0x82, vector}, /* vector4 */ - {0x82, vector}, /* vector5 */ - {0x82, vector}, /* vector6 */ - {0x82, vector}, /* vector7 */ - {0x82, vector}, /* vector8 */ - {0x82, vector}, /* vector9 */ -#if HAL_USE_SPI && STM8S_SPI_USE_SPI - {0x82, vector10}, -#else - {0x82, vector}, /* vector10 */ -#endif - {0x82, vector}, /* vector11 */ - {0x82, vector}, /* vector12 */ - {0x82, vector13}, /* vector13 */ - {0x82, vector}, /* vector14 */ - {0x82, vector}, /* vector15 */ - {0x82, vector}, /* vector16 */ -#if HAL_USE_SERIAL && STM8S_SERIAL_USE_UART1 - {0x82, vector17}, /* vector17 */ - {0x82, vector18}, /* vector18 */ -#else - {0x82, vector}, /* vector17 */ - {0x82, vector}, /* vector18 */ -#endif - {0x82, vector}, /* vector19 */ -#if HAL_USE_SERIAL && (STM8S_SERIAL_USE_UART2 || STM8S_SERIAL_USE_UART3) - {0x82, vector20}, /* vector20 */ - {0x82, vector21}, /* vector21 */ -#else - {0x82, vector}, /* vector20 */ - {0x82, vector}, /* vector21 */ -#endif - {0x82, vector}, /* vector22 */ - {0x82, vector}, /* vector23 */ - {0x82, vector}, /* vector24 */ - {0x82, vector}, /* vector25 */ - {0x82, vector}, /* vector26 */ - {0x82, vector}, /* vector27 */ - {0x82, vector}, /* vector28 */ - {0x82, vector}, /* vector29 */ -}; diff --git a/testhal/STM8S/SPI/demo/chconf.h b/testhal/STM8S/SPI/demo/chconf.h deleted file mode 100644 index b1f2cd62c6..0000000000 --- a/testhal/STM8S/SPI/demo/chconf.h +++ /dev/null @@ -1,535 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM8S/SPI/demo/halconf.h b/testhal/STM8S/SPI/demo/halconf.h deleted file mode 100644 index f70fd1b9df..0000000000 --- a/testhal/STM8S/SPI/demo/halconf.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Block size for MMC transfers. - */ -#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) -#define MMC_SECTOR_SIZE 512 -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/** - * @brief Number of positive insertion queries before generating the - * insertion event. - */ -#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) -#define MMC_POLLING_INTERVAL 10 -#endif - -/** - * @brief Interval, in milliseconds, between insertion queries. - */ -#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) -#define MMC_POLLING_DELAY 10 -#endif - -/** - * @brief Uses the SPI polled API for small data transfers. - * @details Polled transfers usually improve performance because it - * saves two context switches and interrupt servicing. Note - * that this option has no effect on large transfers which - * are always performed using DMAs/IRQs. - */ -#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) -#define MMC_USE_SPI_POLLING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM8S/SPI/demo/main.c b/testhal/STM8S/SPI/demo/main.c deleted file mode 100644 index 917f623282..0000000000 --- a/testhal/STM8S/SPI/demo/main.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "ch.h" -#include "hal.h" - -/* - * SPI configuration (8MHz, CPHA=0, CPOL=0, MSb first). - */ -static ROMCONST SPIConfig spicfg = { - NULL, - GPIOD, - PD_LD10, - 0 -}; - -/* - * Transmit data. - */ -static ROMCONST uint8_t digits[32] = { - 0x24, 0xAF, 0xE0, 0xA2, 0x2B, 0x32, 0x30, 0xA7, - 0x20, 0x22, 0x21, 0x38, 0x74, 0xA8, 0x70, 0x71, - 0x04, 0x8F, 0xC0, 0x82, 0x0B, 0x12, 0x10, 0x87, - 0x00, 0x02, 0x01, 0x18, 0x54, 0x88, 0x50, 0x51 -}; - -/* - * Receive buffer. - */ -static uint8_t buffer[32]; - -/* - * Application entry point. - */ -void main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * OS initialization. - */ - chSysInit(); - - /* - * Activates the SPI driver 1 using the driver default configuration. - */ - spiStart(&SPID1, &spicfg); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - volatile uint8_t b; - - chThdSleepMilliseconds(1000); - /* Exchanging data, if the pins MISO and MOSI are connected then the - transmitted data is received back into the buffer. On the - STM8S-Discovery board the pins are CN2-9 and CN2-10.*/ - spiSelect(&SPID1); - spiExchange(&SPID1, sizeof(digits), digits, buffer); - /* Polled transfers test.*/ - b = spiPolledExchange(&SPID1, 0x55); - b = spiPolledExchange(&SPID1, 0xAA); - spiUnselect(&SPID1); - } -} diff --git a/testhal/STM8S/SPI/demo/mcuconf.h b/testhal/STM8S/SPI/demo/mcuconf.h deleted file mode 100644 index 4b1082e5ac..0000000000 --- a/testhal/STM8S/SPI/demo/mcuconf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* - * STM8 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL general settings. - */ -#define STM8S_NO_CLOCK_INIT FALSE -#define STM8S_HSI_ENABLED FALSE -#define STM8S_LSI_ENABLED TRUE -#define STM8S_HSE_ENABLED TRUE -#define STM8S_SYSCLK_SOURCE CLK_SYSSEL_HSE -#define STM8S_HSI_DIVIDER CLK_HSI_DIV1 -#define STM8S_CPU_DIVIDER CLK_CPU_DIV1 - -/* - * SERIAL driver system settings. - */ -#define STM8S_SERIAL_USE_UART1 FALSE -#define STM8S_SERIAL_USE_UART2 TRUE -#define STM8S_SERIAL_USE_UART3 FALSE - -/* - * SPI driver system settings. - */ -#define STM8S_SPI_USE_SPI TRUE -#define STM8S_SPI_ERROR_HOOK(spip) chSysHalt() diff --git a/testhal/STM8S/SPI/raisonance/raisonance.stp b/testhal/STM8S/SPI/raisonance/raisonance.stp deleted file mode 100644 index d9e65a4e09..0000000000 --- a/testhal/STM8S/SPI/raisonance/raisonance.stp +++ /dev/null @@ -1,1963 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=raisonance -Toolset=Raisonance - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=raisonance -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,4,10,30,46 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\src;..\..\..\test;..\..\..\..\os\ports\rc\stm8; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,6,4,10,10,40 -String.100.0=STM8S105C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] DEBUGLINES DEBUGPUBLICS DEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,6,4,12,15,0 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x100) EEPROMSTART(0x4000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,4,11,25,50 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\src;..\..\..\test;..\..\..\..\os\ports\rc\stm8; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,6,4,10,10,40 -String.100.0=STM8S105C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] NODEBUGLINES NODEBUGPUBLICS NODEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,6,4,12,15,0 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x100) EEPROMSTART(0x4000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.Source Files\board -Config.0=Root.Source Files...\demo\main.c.Config.0 -Config.1=Root.Source Files...\demo\main.c.Config.1 - -[Root.Source Files...\demo\main.c.Config.0] -Settings.0.0=Root.Source Files...\demo\main.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files...\demo\main.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files...\demo\main.c.Config.0.Settings.2 - -[Root.Source Files...\demo\main.c.Config.1] -Settings.1.0=Root.Source Files...\demo\main.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files...\demo\main.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files...\demo\main.c.Config.1.Settings.2 - -[Root.Source Files...\demo\main.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,12,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files...\demo\main.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,12,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,6,4,10,11,42 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,6,4,10,11,42 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,6,4,10,13,32 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,6,4,10,13,32 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s] -ElemType=Folder -PathName=Source Files\os\hal\stm8s -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,6,4,10,13,43 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,6,4,10,13,43 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.c] -ElemType=File -PathName=..\..\..\..\os\ports\rc\stm8\chcore.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s] -ElemType=Folder -PathName=Include Files\os\hal\stm8s -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s_type.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chioch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\..\os\ports\rc\stm8\chtypes.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.h] -ElemType=File -PathName=..\..\..\..\os\ports\rc\stm8\chcore.h \ No newline at end of file diff --git a/tools/eclipse/config_wizard/.classpath b/tools/eclipse/config_wizard/.classpath deleted file mode 100644 index 232d040e35..0000000000 --- a/tools/eclipse/config_wizard/.classpath +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/.project b/tools/eclipse/config_wizard/.project deleted file mode 100644 index 6611705c59..0000000000 --- a/tools/eclipse/config_wizard/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - Tool Config Wizard - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/tools/eclipse/config_wizard/.settings/org.eclipse.jdt.core.prefs b/tools/eclipse/config_wizard/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index da0e3846d8..0000000000 --- a/tools/eclipse/config_wizard/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -#Mon Jul 30 11:37:30 CEST 2012 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/tools/eclipse/config_wizard/META-INF/MANIFEST.MF b/tools/eclipse/config_wizard/META-INF/MANIFEST.MF deleted file mode 100644 index 30e998e6f4..0000000000 --- a/tools/eclipse/config_wizard/META-INF/MANIFEST.MF +++ /dev/null @@ -1,24 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: ChibiOS-RT_Configuration_Support -Bundle-SymbolicName: org.chibios.tools.eclipse.config;singleton:=true -Bundle-Version: 1.2.0 -Bundle-Activator: config_wizard.Activator -Require-Bundle: org.eclipse.core.resources;bundle-version="3.7.101", - org.eclipse.core.runtime;bundle-version="3.7.0", - org.eclipse.ui;bundle-version="3.7.0", - org.eclipse.ui.console;bundle-version="3.5.100", - org.eclipse.ui.ide;bundle-version="3.7.0", - org.eclipse.cdt.core;bundle-version="5.3.2", - org.eclipse.cdt.managedbuilder.core;bundle-version="8.0.2", - org.eclipse.cdt.ui;bundle-version="5.3.2" -Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-Vendor: chibios.org -Bundle-ClassPath: ., - lib/jdom-2.0.2.jar, - lib/freemarker.jar, - lib/fmpp.jar, - lib/bsh.jar, - lib/oro.jar, - lib/resolver.jar diff --git a/tools/eclipse/config_wizard/build.properties b/tools/eclipse/config_wizard/build.properties deleted file mode 100644 index 81715159fa..0000000000 --- a/tools/eclipse/config_wizard/build.properties +++ /dev/null @@ -1,36 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = plugin.xml,\ - META-INF/,\ - .,\ - lib/bsh.jar,\ - lib/fmpp.jar,\ - lib/freemarker.jar,\ - lib/oro.jar,\ - lib/resolver.jar,\ - lib/jdom-2.0.2.jar,\ - resources/gencfg/lib/libcode.ftl,\ - resources/gencfg/lib/liblicense.ftl,\ - resources/gencfg/lib/libstm32f4xx.ftl,\ - resources/gencfg/lib/libutils.ftl,\ - resources/gencfg/processors/processors.xml,\ - resources/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl,\ - resources/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl,\ - resources/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl,\ - resources/gencfg/schema/boards/abstract_board.xsd,\ - resources/gencfg/schema/boards/stm32f4xx_board.xsd,\ - resources/gencfg/schema/common/doc.xsd,\ - resources/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd,\ - resources/gencfg/xml/stm32f4board.xml,\ - icons/,\ - resources/gencfg/processors/boards/stm32f0xx/templates/board.c.ftl,\ - resources/gencfg/processors/boards/stm32f0xx/templates/board.h.ftl,\ - resources/gencfg/processors/boards/stm32f0xx/templates/board.mk.ftl,\ - resources/gencfg/schema/boards/stm32f0xx_board.xsd,\ - resources/gencfg/xml/stm32f0board.xml,\ - resources/gencfg/processors/boards/stm32l1xx/templates/board.c.ftl,\ - resources/gencfg/processors/boards/stm32l1xx/templates/board.h.ftl,\ - resources/gencfg/processors/boards/stm32l1xx/templates/board.mk.ftl,\ - resources/gencfg/schema/boards/stm32l1xx_board.xsd,\ - resources/gencfg/xml/stm32l1board.xml,\ - resources/gencfg/schema/common/config_settings.xsd diff --git a/tools/eclipse/config_wizard/icons/check.gif b/tools/eclipse/config_wizard/icons/check.gif deleted file mode 100644 index 18ffabe77f499a954f2ef0d2077da4ff4365e391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmZ?wbhEHb6krfwc*el+|IGh?|2O{ozxm()3;+LZ{{Mf=@2@NW{yhEf>xzG0SN;9E z>fg^Ze}BLJ|M%Uum$SaToc-(5;eUTVyuZ=$;dal*TRk6c_I`V@`^&8fUvBhmSl0Xg z?Ta@js=nOc`1WM&`Xznu-@aV8xPR@E$&WXszS^DpYFFOz{hLl4*!*O3`s0lmuXp9W z+Evh9=+j*s`0m1zovWw+{`lzF{;e+_-{~$4=qe1}xoSpFVQ_ar@YxwDy#+z1_isM2 zZ_A5EcfNf3@b%M&Q+qa-C4`nHMwBFkuWc*c&{np-wRBy3MR`I*X<}4KLga?FijD1+ zYul^VE|{}s!JLh)6`R^BH?>u7Y^^F!h$@SZEQybLeE(i~T;$q$v)9a@Qyw2(78mvZ z|9=KL0>z&!j0_CX3_2h?L2<&szNR6%smUqGueqbyIm*C~#ns9!u(Qd5$;_SA$AsB; zO0)zjBs z$i>CU#$ja89HeW#I+9<(L6I-mC7{VW+;*FUsDogTu(*hQ2gAV-Svhw}X?IUojj0I> vn~rdZYG(cTp~A|_r=q^(hJfIc%R<_gU3UtSm`+aiZ=Upr*|R7>fx#L8Moafv diff --git a/tools/eclipse/config_wizard/icons/chibios.gif b/tools/eclipse/config_wizard/icons/chibios.gif deleted file mode 100644 index ddbf1e1d18dc7ec632ddc2545a511658f25c3b59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 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 FMMF2mT+g^yws6V;)d~t=8W6qmUSzEj5ELsd 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%0A)y!TW_m;+qI!N8vvNqIv- zDrK4{8dK-tbpw<_cONrWKB)8&S}M@J3O*;t>DHH>4KD5sVWI9rH&+nmAM@$u0vSWtR91=rXgOV-k*|!2TC;0_mPbT>cYRpaed4uHqhRnQRr!aF=NA( zc90*BQe=pmpYdns%v7YXT@8jgEouNnN>zo5A+9A2IX9twIS3kJxe!r>z%edw8&BVZ z3`9_2%}^3f9Ke$X+P;TP>#N~9@u3TMe_B=d5)CRCv229!UQVJWg2Z{2>IxaifS!;a zCx5=<@RQUg>g4jcHKjyR0tac zu|*a%#{I42q7wHkC^{4Wr+G_?m?pF%sEbCjoQhHKt2HRI3a_)O=`^sV^@=7yn1HLf zs5!DbZ8t@=791z7tyOGDVfV^Xj=AC`0Wur+W|vE+35p2DoGNAZSMy^F)#oWL&`~`z zF1Lnus1koK@$vEko>i1NJzPpO6nBkiIYreq8SVGX`|*(O=7j z+LQKFOmR!AU*th?epjR|XKU$UL;-oB^vd8yd}E!Ts(f>Sf@@gffr(?N-l;1zl;X`o zpa)yQPmAluJgqjzBa9k!+^i_kB+dz_M!zx#rsoI-`=QR?Godmlf=Q-p(|%Bap9y*{ z^@|T;IO4%=D+<1n450iKO`{!Q(w@pRMMu{gc|0=7iR11$exgOLQ#0|0>ZZi~AM7TOgaD7W1r zCmqQ34!Zkv)FzBKqw)ue1~)zShA|Is*XLK`gzKQw0vd@&MBdy_OG}`l*Sy>3_^Dc2b&bd=rRxnM4 z@F)g-Xdz|j`dBF>-po>(zUfk)?NXXN5D{W#+CtjJDAntr-4}c>6@1K$Wh5lDuTr-= zu*`$mZMZte;`B}idv$5cI8kTucalz294rfn(Zh~suEhwXYmzE(3VdBX?{t#*0^>`b%zwF2f2a{M(xnZ3)7jKA7>r9fs zOEh6|j*keQD?;`Z@1>Zrf|wi27SN^wL1YM-1Lt)6*O9U#9W2x_aqUgF@jN&L-DCefK(|g>bI{iF1wv*uZ&SF{T_6))^`%Yn;N+#Brqk} zJkVGeGS#e@@~8zQhE(+((nPpYCCGndIZ0bg7T`<=bsNC3$sJ|f=O#ppFrGTVl@P|* z3rD8A(0Z5UR_DbGHAHqdIaH?bV~uF$C)@;NWse~e+tkgjKc|xiL~u;X z=!XE?{TzO=0YQr7RV189opOV1jNeP0qW>{?o)hej%SYQS4kZcV-rYTP1VW=cn*zDLtK;$mp zPXx!s%+M_EWPxmq$L8Df(QFf3K6E$Y0Xb>|b0?=XSp)Oze-J~Yk@&65u&V%s<~IQt zcq$`Rc@joh8K#^=Ii*K4z$0bL(0Ali9hs)Z^?;sE?od`{nYDa`xSf<$y{|-QyF}O6 zFhMrPGoj-~;u-D1v6R#DL2Jtcq2l7+eM*td1)#&QH-U1RF3tKC*{dSiy6msHayIU8 zMDDCpv;*I|9f(Or33b~Du5&ROSLAEh76+n(8|*-p(jFFN*8tvfYm2*S-p{&7PfK}g z*^+slfjwx;$vNM0YJp^ZLFH$0<^p8Rsy90F`)q^zx&4NWXW(qHbyUgNcUQ%0<3KrK zx03g0o!ki6V62&H$G(d{GpK=jB|yo!Uz-8K zW!~6(mY>^Wh3xX`aq|zr3lN#=cEzV_Ye9Oq)H~)~LgGjLVZp5L=b+WZNnMQNZ_LI!c!kSB;0%ntwZ09Yt7xMJUPCL7AaYN;SBA`;Py$=Q%ZxUS>?DFRi4A(UO1U&=3S zW~t4wWJ&5}|JG2I4uMLMn%w-ZmAL0hO4MS)^O*^OW@{I{D&(tkn3c%`G-)es_AS3n zNp4P3(VEzK(ziH589}`o`^y7eTD?A}8>D9=l=sGbd^2*l@dE8WH^lbvw)Te6C5(zB} zV~Eg-U2P&1JnC-%SXIg$j~X5vLv{UihvjsY2#&3q@5?lSc=Rs#zZMj08q^z(e*QG@ zPxtvppy7WuT|^xnZ4LjaBwEQ^$sqEH*GLK z%0jgszjo4iNEm*FSlQ~ZRx@`LI*i%bdYx<+B?CEZ19;QVq5wcfUkfjR2%zZQ+ZOIs z9la-S9}t-}f7!#R9AHfw&fL%KWosCj;z

    ^#{6 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

    X9VB$kzwH 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�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

    0%E?d((m38AIc}qj~<< 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�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

    }=XwQiEt7l-I+0EyukDB44n^a-%L0`R}-^ZMcM zgixF)8G&<9cQjCnA*DoU{aQe3F`8k|IN0p&ZaOn2I-oT-ncH|W=Ws%}p#1}EV@@@u z;U&2jp**PzGEUX!zt?hP19%LEaL#i-1Eq?dYzo_$a zOfQ6c5sW)HVdwB#wAi- zqWHfUd&{Ug+oVf4!5xAg+%>p+aCdidaCg^W2X}Xe;2I#fySuvvCj^%{&-ZqJEz{F8 zKUl2AKh|AW)vjH;cJWKjgHFi_Sr9?C$+n2iSc&TvxVogtJ6dc~?yiL-&3WcG!N)q0 z4xcyGHt;BQSR2>+CLsEHN>Es!Bo9MQ#mX^0yegyd&8`zJ%7a1o;OCTVQ;YKx+a&xP zp0}{|3`Vve(GICU6YG&JW5d|9JXRaeZje2^yzJ*Z1L=lNE-o+4ThtUa&s}dhr?^aW z#v3V!(=Q+|@XFMmsY6~bj1=I&5B`Eln zyS^-G?urzfoqrGmnK*pMm_Pq?GVG?HNYT8~lJTx)>Lf2Ok|Qk*b_adrhG#<8rdT74Q+Q;}oE z!+e$y573|&?39qTlvC$#aZIsUhDTvvA&J;VS;rYI%XE*H zvr(Ip{^E8&f7CF2`TjmyNF_TUcwBkPgCvUI*fsHo;ZgCI7G&w7#b7D%javF31B$z5 zhCttnL`!rm7RW6jzk;*0ri027IpKxX3*a zmUISP3LzXsV*U$-z2Y{q0CgT$$_oivFyme_Wjk67XD9NOAy9m^J@QHng;C@&L<7sq zeVWKi@59pefc0&q)K`3onFy9fAOVXGk9w1sVEYHDa6GhZa*CZuGRmD0Nts@zn*Qt( zj-81um%wRyF~5*Yo;&e@cBFSTiq_x{pM@C$nF>wmF!g#B1ZT>KU;+dtY)@>7+_kvD>^c(XIdKHIGcL^b(0idDy;z%&X; z`(1*LY!I_J)OyJ^ip#oqN{+PWdf{M+EH4@6C=b~$q)C--Nq9$;BT9Hg^$2W-kC0+B zV-(Mp=VXjCI2>)Ge_lkTgcsR%_E6Eum{iMNRu9x6v-6b-;20VsCH%j0ka|30SkY*S zDGgJe5$O-+lu@1`pMTDeKDI(UFBJ~f%LyCl`>czirbgMAsMgy<=98b-O;C`p2p6hZ zNkDh`@N-nVRIZK*Z7}t?R}=Gb$>n5AY1CJ?oxhK{Gw~&OEMC3kn2Zr*!BqI?`4;1( z*Wu@Af8GnsUG)RN;E&(NwcpQkZ_i*2klG1RPjUoL{JW9-^@~=}izTv38Hu{yKt(b^ zw0fMNu+n*5>e4sgFxe{(&qf*XM2oK?WddF4;mYMrUKlpN4QSNLjeH0<>M3c0k4Y}D zMt|#iz@PmaxqKtBaIFsBuT}wrKZgI5$n8x$|A|)q%X-np)Z_1yRgE=O{J-RvCL>h9 zd}wrf+fQh8KZSw{#Pd}|i)`7I*y|WJS0|hh5J&7<+koHMHmy1YEPSVNbA5Nzvqh>V zxdnf)y(#~4Phmd{gh~_O@t(YFd+EIN*~;m9dpk${Q0mAQhGqtN-1C#fKtg5w5W)kZ zjKrYFhi`H(5WqMp1^cPHg4F;cEh-9{v=tx*%NP!nMyi3mf~jY9V%++8S}>Cl0;yS<<^7f zIH>pP(R?itQ{Pv=l-9oo#u@I&uD-(hXQu5W;S64nNg&J11`|ux#ZkgggN<5>{Z!05Z0U<>68JvrAJ65 zcMwuf0=KAS2TqAAoT~%uosreK<@7!jkUpng^KGFuItV+^H__^Ux}>Jq%`7mV*lwS- zx`rjG-rxcZr#p~o-*VsbA|GQ^9$y7HUmWloDo!dt|3<%tAVg=zoG#5uK89#xRh5=J9w&I8dRts`E{B+CMiuLOtT-Gi?X9T+ zU5C4VZQ<(b3RW%Vbm+Xl9!_a~IIQIec7EUvA`oP8_#8wbI02@i?Y1M??abqPUzjhx z3hNqLoqo36SQsy0bezh(#QVT4*ayPAa0@K%h^2;CsRrE%Ue|-;g@!mbn~cP7H6`b$P$@$Bj}Wz zz^Wu#HvP$zM6J)rXOpOR!KTN{76a58L$~Ifi#>C}lu1uNfSd@)>I}ewG)yd-mt086 z!K4_9DAfbiy{}rVIF+^&(U7{+q{FvbiPg_+nzc-0)Gu#t9!5YkK>h6Zl?<=NOkO~L zcylRM0k*7s7Hw`V{hr31H=qCKh;{iOzyZ#A!}@b*4P1x4u|AwL?^Zv}pj?!3^3K!y zyj18C(mLBU@-HNe();1KoG!Yb#8)K>E%w_1;T-(z*9@I(buq}czV=2K*zu=g*m`Tq z20b$&6z6Md#4@E~HV*DJrm#Lg2R6`*+4rg2oopF4!P<7}n?RZa?t5-V%aioBHUBS9 zljj3$5CE9_5T;|nwPqFmay*yyU)dt(Q=I|?w+m0Zl0;3abGd7qM5*$-ChFcp+&ME8 z6W>m49vUfRVW}puNWmzcX4+~!_4V4l*3h^` z?N|>HIIbXs^jolm20VjN;nC;3M<0x13zLitSg%x3y)eIZp!U=&|cYKh~#i#fHOt*iOh&DXe_#OzEG~|KyPro}pg=dbNw-vi8N@Yd~&ED2%#S{rR8>Vcorplzf0Kc0; z5Qm(~?~7`%R}?+NT`~QGb^1${e9Ff{76ZN-1rL7Q)c+B9*xQ%_?f%{TC`4sUp;rh~ zfV>#1vLNsKgUB=#bHEQ_`S~QQRwb96K{W!`#zqqzxUOBC7Io~5mMh2?nmt=e7|H%dWK=i6a5so+ZZ4WcD(pw{3*uchB!Og=D&0Ms8Rux3S-O}y z0d4*#RVOFvDq;v@4!zI0c{>+3ZX-ke^3@I4MP{Lak$M)=Aj(Tv#$gTlsM*|L;=cBv z{s7hfkS8Wu5Ki2UYRccBpP`Z`lQC|3l(qHvZms~nX?2a*&3-s5l^-VpF@Q;Aq=Kv} zEk~^^^OZ_|iq2?E7nbRh>dIP;~%IPpD?#(BlQar?lCF)PKHKOj} zY&`Z#1-D%gaG55J*dsF4hS6R2w9|S-KSJ(F!Fz(aQCd6FAU40)-{P0`-LmQEO|LFF zEa)bFa~<2re#MRAku!R3RzdT%@d#n6fxxrg;*wM#Z$En5aq6nVbE5T#ZT&1(s)kSA zT~>{L0Zo*e*iQ%OdhAg^9xV&czi^Gzz?);N;i`C*w2IO!kTLYk72m682H-K2a{$iw z4Zd??Nq?{IU|_>!nhn)4ozY`52EEDCJ}u3h)7m%6%x199atpN~kljMg4v^RG9=nTm z&N2ofMMH+oJ|M8rqwR6PSi1ipjHbUvtHexRMG*y{q&u^-C4Z@pohL1T4I?JIEAESi zEtUPKXfL@dlP7;&6Ox3(UZJCNjZc>Ao$y)Ts4)hByyQquBN#Zt7&SUfGcK6GbN)ex zakIj#SXQ12N<~#4v%w1n2GHjbMjKjEZ#(|j+^}fMy!O#lG^iWuhSZ5w4Lkgg!K_4T znpCJGVsqa(mY3n5-X}$hOj_p`(2Gs{5uLVcmnA3GW?pSph^)>4S#WbkrzkjG-GP7T|5I!`nF6ikof}BXLvUoP{>n1uY|6RzMPwBgGCQFdZZr z9*!z~O{AYjAf6UHo}MtWTANz0#(wucfOKqO-sHp3v5^g&lC`86PjI;00fXF!E` z;w!XQ8AHrSd&fLk#54)1Uj3f4>bI@99uQq04%7Gc-sGYr77mo;Xd{iiSg)X$2}(Z} zc-~b$0c7~+PZvGox@dwxyYZ=ok`+pW`Nv^?5?zihA2LsG5VT#rx6z?Jv?!+@vGWT) zVK4f9Xw!jD+KOv4AbAh$)tgdHE3j)L8EKW!EK~2neZ*%5`u>xX@LwNe;gOS;5S(bP z!L@_x|KVf&&u0ix)wf3%#uR`=q_1tl(tQz$w5|GPyA+FqkwFz07l&p*A|G`PTt;be zOQ-DXy;LE#Ce=FY!?=Bg@4J8|5ZQO<6WLT&>nE%JT7A0a zFTZh{1sFr!xRk01(4B(fF8lkHFSN}2;!d7a55h_+Dwee;?!;8JmV0dxCArO{axd;V z2C1@dDqen^d?mpYr3=RVqBT#p){BSmoWtCa~+85uwalA?kYv2;OCcb*KY{ndQLHF zrYMPWjPhdy>FSe*9FrpbxP5yL8v|xE9}0>2B9YVnx$6)G2N(q5%vBmVuzJBiV56u1 z&8k|&)zZdA+V1azWWGQ4OM);kFaj_{ZZK|cFpLr~)!Q$#1^a5v<5_AFFhr%Z<5}oa z{2i73^12~qP2<0ft}b`mfnjRo`b>-`01^JK64F9mA8->tAjC17Ck%%qH+8YFH~Cww zR^QOX7sq^`m`spQVNeS8(_D&3K$ViJQqNqKp=qr9SoCpzNFMOjVddaV!As>G)9~rI z;?9ESn5U}KBj#N7kFf96L+j1>jc2hc(;0knphwKg2= z_@I}r7ZEtHr0lEu<67ti%Bq=>O5Z)RwaunWU$A?=t(*a&L^Q5aWd8T?&==`Y;VPbt2=?pjm(?A zf>fsADz2d097cSPKROK7#9^5E3a~7+r8~hcXH_d6Cwln(2YE&*{s%^-a%aHnAkun` zeY>3WPEU z4>jBPEk-j1qay1s+j_58tLAa+8RX}b)ZZ%*fxptzD;I}PJaD|e&ZXLXBbrfuvYfe{ zEsaSO!;q&QlFB5NFWeZn6CFG3gnS3FBM(`glj~j?=KYqGx*p;dHXm}Uazw9zsKXR5 zUW#0z$;2M=k@6F0WZHMjn~VF^*XoBO=_fR09u#g1Ky~(kl}2tb{zCf4^tm^RanMi9 z3bq5udBwhG=(2D2g3J|FvQuQ2=&AEUh%b~v*gKHo9n1HHD{H%}@6i8i(t9}BJ0j(q zJJNkGV;sslbh|=lR37#BQ^QRi|to&C@&+J}y1q_g1!X$bX?rgw5 z+rNU4Y7Sy*BXHfr1q1AVzeM@}P3r%amj3aA{{}$Rtp5Vp0)2KXZrad@VI&qIWDN7z z6rC!@M(|Yf5r!lbeypOnKo`EXaYp1f^u4a>{;(Rj{(jUqn!OF%s<_o&s7u3K4%GwF{v%k?E{tFY8a3)CQ5#?GQ<-R5y@>q^<(NNQ!;K= zy^2Up%lduD6dF_Vl34AjE!*vvBpH}kK$M(YVvpW+6LjBKak^`lnkLFym@TJ~gh~(f z3p*!7@FubLjU`90o283dP6ByIvH%-xa;KO4K9MLm=frh&$$zs@u zDUB&_y{5XTmEuA$Lc~hqW?r%mcZl#bNC_EKmLr8!r<3S(sF!y4%TIkC@`QFvB^ShJK#_)S!Cs)X=mSFoojO>e@IX`T``w~ zv7~K!X=#Te0TJVV4oe%XDg1CdBU>n$pjXgksv}L@e~8+>DS1KRd(J%m05kUx4qWA% zAc^|Q4)HUJB?9i_-3cp8@0i&e)rE#;$Ilu*1nHlhOnCZV%8WZpVCvcS!1OHM2I)QBx{}!&A zr{IMxwD%2)+7UNet<6hlg#DQkXywMdWXX6V&nC=>K>88ehB%wv3m6?CaiU#}Et*cH zu7?3s4-{MB$xkl@M-M{})E-$Y8%>t@2m+<TMA#rxcwybr4wt2c_bI2n@Z*x7sw(e4 zDk&)=Msh?V$V55ngdj@>ROD3}!B2`gro8@QqV2fy8ekurT#?n)9 z(C)#4)`TXjK68iu#jAj49#zr~{KMhe+GP3179CFZG^%?x#z1#85SW|brdnb#R>FB2 zWr*vkD!Qclf9jwbr=dP|QRGGfyl&mP<+fcLE4NeQ?|<{-9Mcld-{1{>A9%&*+iK$ z<;PqMF}czFvvy2iO62%w-h!&Ti~pdEekD%9S*LFg?~dl*p1D_=Rmi z(p0r9f;=l?rWDomNjD~|^H?@+ss*0CYBHcxnY98NlP-$D(><&hKDp4avhGdq-J=47(!h4>9R(#lQnX{AEDp|u&xnQvO~i=%Hv zRt(7M8?>6(oI*$L3!sxqS7byHHy3I@PFY$A6-wA{6zvGK*K9)~6Yr8EPiU0_1#%W^ zQJLH9VkP8W*{{o+QoOx?x?v9SHCa6%L zL_>VuJ8|L7U%PQxX)G=r^CRCoguQir8ip?7@CgSS;A!F+3@*74V-VK*lm=#IZF4~& z5)DwX2;5oG8^6b}`$Xbnnq=DIoMY?vx%>DSoR3Oxpz2Lw7aLc(y3T@S%~sk7&0>GZ z8hADR6Roj}Hc#`5T?0a}O6-*HWyHQ%b2GFCUUIyA(}jqf^U|b@u|Ky~b}WMKE_dv6V{`+u2NAfZ>naAg5 ztJ=XB`K37oAgL0VPcocHWLY)@ViYTBt&x_ZX@YPET&S1OI!E!6VRrrfr1KGdX$)Sq zdIUX@Q6d)YO-7MNviD?&o_sM3QB{qxO7uT&yO7s{XxwJ-@c>$J?Lo&|Y3Xva61WmJ zXv)|dM1Ks%i29Xjb^)G(7oH0~Yu(nxp`2%V$pV$7)YdF|Vf9b0n2x+-;!O~=cqH&S zlfuCpMMIvI?WjLO3nQU~%1Gyx@_H-*tLN~;JgA;I_5!2hGL0B)MtY5HS2Ek@{3BXj z9ImKr-x2Le9f^Mk+_N;80~&ti;E53OwFj*gzuu_8n+!y;T3AT1JD#z$L5Ljxcv7FBlzwkmzY-c>v!N%x13mVv=h!F2Y3 zi?qAM_EzyX8j+tbA~G65OS!-uvC)oOK}&Hq<7N8nqy50BF6=&li2b!6gKW%9{EOPC-485d~Pd1R{MJxI)P(=3bn=pbUQd zHwnEl`w-)Aa6dy2_kW-p|AvPCr^@`jh0)c-2k!#ArI{p*z)5A!8(7TDCJ2#WdSQtL zKn=h|$cybEhdO-gF`-hRqJP@8POb4h)%6!5o-VGXv-b4-Bl&aPoJxX(z47yB=R2S0 zwR`8um)9x#E=WL+29*6yHRyK>b+J3x6<%e)TN#R_c-Qx*U!L$lBUoS5fLG9hBOy_} z0{8i--~o+zWa*JvFy+)28P92UCNM%A*^ytVu4orS#A3o>V4Pn#x0!xtJSAF3ejZK- zbWPb;1|N!+Qq)^mPJ*T?npk4mstQHPlB;)Ux@cgmt~uG*Z`4swmlas2V^&0Mo*H#i zzms;;@saMLWaQ(M(`gJER^Oun_esKe*sa_KecNx1uG|@@o$*nSL#Z{ia#;$l?lz5S zuUx?ZtF>)rjIDa`fdU1p^#;iDDJ&LV+il>Ub2=r5#{^x^xdX)o&N_2?jT7FC>&4Kw z*yTG_<_}XF{F8d1ZPD*)V;%g;>3Tj&W$>DD0vn4ArE#qrtSj#{w ziuYkBt`O^#Wy#HIK1vqzQRQRg$WOT1l1z-JErFrDH#FZL)P`7L;Fb)^M0o}Kj)KRi z<9|~j5~)jmG8`r`%-L<$<|6fLXJY&F$Mq*en;G(0{YGbktu5lv`P?;D=i)W8hMG@B zUw64!%dt|fS3>+{3W_!N+V^)hlB)5-h3v0F-1q1Z_L;%_bfilT9;z6O zKQ3~!%lqaI5KaHJkX2*Lq zeV%V7S2hPTre#6zngHtdiCF@O7s$pQUnm%+H-x9~EeMa$-0TEdQ6-uXIOIJ#W5?WR zKRrl(X)nr@YU6LNXNkKnzVNI!CRaEvNaw=ZQm-M~sy?|-7(D|!IB=irK35i{-5~YM z+sS!GNXfwqh@O40ipK>8&R>$(dw;0%_-5fq>@|h&ef)x}&vF3W3c1{uDIg$7Hu4Vi z=4NY*ZSZF=7{W$HV?se;bF*vKUW4<$7Bbdb;%+^mGIBxeaDiPqVMJ#SaLf=(DY=3) zy-KS$I9G)ug~5QQ_{rAc_} zF!*X$7t{U*ZHhdV2@j%>f@i9|z;KvDbQ(j%?6$r1gvIeZ2TG$nLA1p*xWEVeGqdv- z2{O#_OsNTOp|-(^gZ95cQ&TgbtBng7owEE5l&XNQZv53lB{4FLg_8J@u8QOwt~Pm9W;M-JtIp+@VfsN<-{4KY z{;@5`zr)VZOfFQL-X;s84$_hrA~nZJ<5uWaYB-=1owOR#GK*(yD@}F#HP5Ga_h`Lk; z8LrCT$nk*h1Euv;M&qYp4Cm-X6u(JU{M4p?rd4_{cVg9jlaP!Sde5!Gu61ddw@IhI z-sZ;yj1WK9VPRO*D2Kz+%`4Kn?Zze|v&LKhVcHriSLJVk=-?mFZ*MvBIW-^KNi0R$ z7=R3WeenEtZvr){35d!zhRy2H7W>T|=zN9+-L-$Bc%_{#D3;poeCr$R19r6%x;L+* zKN2pFQcOuq)#HM^i zVY?AHeDISc>Q9Q$yW=19)c=YgmnX_t&$z21=Y&w$GX8T2AkR#;(uuCw76BA2^efs; z%lWq{!yOJiV+DA^fB}w9&i|+A{L5b61!(8;FFc*fnjLskEDM9r(MV3Gw|IR`BshU& zA&g6{UzD6q+-WDE{1V@M&2DAcqC?^pAhe4r1VMV;4SS^=)=-U=EVFJ>`Mhb24uMRktl8-#Il=?EU#zyDiUIJQf}cay zJ8t2eaYexP0lM=z2ta&`1K1LZrpU1HVZD~bJ))NnB1x5Zn>yoR+w%E6arXB1`w!nY z<@JR;W9|sXC<`ev%BseQC=gmbofDme`aXvkOC@;y%@t&kT?3Gpl>=|b71%nvud?#T zdLvPn60Tu@7)JFfd0j!B>ANo?#k_o6y4k*Zbn0UvqkTVNk!W9++gR=R6TjgOW3zR8t-+pkuZs6ir48}an(>~0i_MWelLdxZk7qVM|NR3oD8G-lCDKC+z&L@? z*Zr2`qNOTp1e-gn^lncUnmCkJFi*xfcT_2=L6G=LCYzt>CCz6(j8~crB}~(S+$1jX z!S{CFBIJfZ_<&(@wykq7*e@%neG)^j8+MsQ2tHlbUxMT}v<%NP;!G@Dr{oe>a7z6e zoPEl{j-uG6aB@dEviVE=2zV(BY%s}Ig|L13bY^}pmgQ#%u9LwE3%pZ_qA zSOdEofaRwXq?tAvMPXcx83XZRRg(|{IY)kuF%!ck4XzW6YX?`c+AwYU)Bt4J&l<9##>lm4WF&clC0l~O%D6UUu&6idjtbZDfYXmHm zn5~)cmy#b_XsK1hiJZL_C_jdP1jyjW&11hS_2)LJsThR;r>IhpMt<2UPQsrk*-9+f zL%FhC(8x@bs0*8N&IFyyL}eZiauOP5JRpcU*vZ?_Vq@#;M(nCNvk5b}=q@ntPc^kn zU?POr=+HB$OpsQ&>9;n|iCPv^)sgUPGhcHsvJ$M*`z6ElpcK#}t+@4^y8u`gBW!zn zgJYyIQm>+8?B(?&7Wy&Eks#mA>ArWJK1*_Qno`_Y-xTa2h;B(zm@IEJg|N%uE?iEc z!bVduyIh1x$-dQTlP>61*l<_U&c=W$oCl^8N9=Bm+7`EFoK*ld=>42i58#DPHqOz` zON2FR&NxN=PLaKw2EoM;A=ju_9d)PG6%cXJ$@79Z(=o=ArIpJGBu*h=G~32m-W+!} zyH4~vYop#9meJHn5s-RBp&q&mcJh*Z#J`)db*;`SdSe+@j1MbW&~;gHrIF@P^=7Y8 z=Ml@H{7lp45t4AJb#H8XYv1^@ltmhWPv}0Ad`LcKkbS(Ka0HO-9=$GLiP>M`2D<45 z^nmChXq~?bo2~Q;7xYC4)jzD`h5Ghd60jf3GM+0&<6QBmOT*v;f(&*{`*lIyj(1lO z?B}B()kPvetq)rzFwAMqt@v3z)`PJN>5hrou^y@m-&DFrr?I}Dwq{r4{02Z0+jDGC z_yvnHG70OLvc@0^h>AX+ZQvtAKvcvQ_wY}>_Fs?HYL)qmIk++rf-BR1gU$c+SpWap zWDSPRZzbt2i4#`Vt2(;6RUOMk(bCq}5@O87A|!u`i?>x*sEk=#(~%q2w1}awdU8qL z5TWY~y2mQM$ndv?=c8lP*Yfcl-DLmvbxt$v>hgh%8(_eIA0GhjCWL#^1GLy{lRgZY zVkpxO#j%d0bJiMtO(rE(8(8xvd)3Jw{)&~1?lo5@py+{AC*r94z|q{x?4wI}vIPt) zn)OEVnX7^W#V4rkz5!o_j`g3rNoDKzQ*6zr7Fm~@qt|Ps19j;H=0)ahU$u_)Ru;%K zxszfH)gq}ghS{RdHADQD*0BD7jGv7%Wq6Q6)HI(`tYps1Tb29-eP>UbRh{3zqPd8D zr|PpYqySlTs5=2k(6r49(-DmAZSHpHHl*aD#nv8zd}Nz8%B ziAZCwGG}oqO?HTJxI!HRUDRekLd_trrQDFa5hHr8bKZo8zVf(NtXF#9~{^bz_ec$&%&br#zLGLgP&$+|v! zDeQO&0?r-FGMdOgw<+RNpR`LOGb6pG-DUs0V0@l(E@eS?D5oYKCv8CqG!HYt6HM4g zdbORFc_L|bLb?-lp+2#O0lwgJ`$w~^>Q<3N8IwWrL`p}%eTX?035UX&9EC-y@)I-R z`;GC!K-Ee1MDiQ*g$-2J&l2UH&P;*(9Q<&vP)un!NV%5d(K{ zwBCUi8>s$UY4Nahb^*`1{}!r$-Bkp4cnuqFC#`|dk7&YmK0k_8x~5^H;3+9BRiXk$ zgP6={gQD!rGgoZqh&-~rJ|?=Ej&I^c0Pngxv$NVB==Hnc;8R*9Oe9E6L|T3 z@cEl3KQoYwNE|bfs)U(v0Ld&!vsY+VXtXGq2htLf3zrNv1oMp?q(t_!Cy%L3H!Ht} zgu-8s!QM%|k&CeW7H2)-+-6w@YOAW?;u0=4KXfVN$a{r9C^XaG66TziWn>xwYA94`tjnfH2%(C z&EM1g*`;{(>>}iI5DC#EI60PPxR|V)$eR`)I5qWBJgNX@uT%(7(w05QqWEb`!-Wel z$XhzkDYi!_;G1lB@ouMCkQr2Y%DbMzVBuj}R-0oi<=P=S#IrBOR4p(841BYs3ZxeM z!b{JrS41xwuZ&bG7~~7q2{Lt%3oEZl5+7(_e3J!Oz)erXW5pS&BJHD>#ZDgzk~U@t z3b~*@@rm7`ZR#WcdS>42&fB$n(iOFY>nqwiW0S#cybQB~1uXh~6?+bEaSOve*DQ2L z;KjYPbzqN*3;m>*ALZ5bN+ESXM;ohLtx8bpfxM(kmzY4jMlxkW4Bs=V2e6Jk%v^PmG_!D=h?c?UOGSea{1*$TCW_$5Hq?Y zL?L_>P>&G9u_#VMa!_co+a$0T2U!kxn57@QYYTtDDyDKm3FEt{dw`@bE_wC*V-z8k z(tChXQE}$;+C>5b;h(mh`5@OJ^JBf{*MoX$2*yC4fF63do`Xv3XTj1dF-LhPgSrD% zMrTvS8@+6R7RKYcPdI@lui#ZFD^#lKB4xUYg(*~<@6c_Fq|Ya zBQ;G{Xk#JsdU_-o{O;OJ-+9m|#^W~zDE_#XnU_$J?77J~a?)j=FLb_-h{P5>lsf4k zuo7Wn;BRC``qQkD3+HP&_mx|rnLt~DGs6?{E`kxS^*D;Q^bVR@!~sr-O92GYNH0Qr z<6JMpnCXek@C+0GIO0Cd^=V7k1+k8>zv)Q*7=xD+80YMLV@%@)BMpdFla_%w|Gc}( zMe*YjFzxqM?m4{i?z3EOKnyqK<&dQjQk-HPM{<+4O3F)65xoyOTd(XYnq>#13g&|b8?lR&%L8e@N=xHf=*k+^< zL~#wCIhmI$&3vf2g@=Uy(oJmIe$EM%B9nRNHx4$Nc4qT`%hCU^EVd+yfvR8W;SoGU zM8NM@cUUkny`G@6Y75e7b{|&Sk{3h-Jt|pUlSak{<6e`Cr)#8%=@B}S|89|6JP(%( z-|HW=GVk6-ZNxUyyk^HrvJW+kLSy0D3WhJ}5Bo};IEvz8t}zUUghyq%a@?G!hX(%0IAVELDvHq26LnIbg z!``-M8#!@YY`1FM^tm`{B5N`<5_eXIqhBe398?sKk2B@lE<`=l-OxX*KXv& z7M(t>Pg1PFr`a1|mX;Z@R8cZosW$sYQ-(rg7Ua$B+ROkH_9Bpt2&fzZ-`Xmt%p=)AcwTcj6WyKFzFA{9ym%8Z=EvBh*cC~#E ziT^dfedJ-Ur2ywQYH(@(Z$Q%0%+U1Ts`G{&SiSjXmT%LuU=^=Xx1d3DFm>~RgK9P} z;RC0P*P6}ASIJauRz9?x9L2LybQ?R{r20ur?su%BD4b=(6COQ@_YGk?F z{0Xj58B=dpyMUL}H1+DW&Lr)84?A5mNOW(Fsq)OeaR7|2(B4O!As&pPq+@r1 z^L}yhE+4pr>q=ex&Y&B6-f2r3krqO5Lxq4H5ti8koDsu7`k9Vly!?XSW{n|6?8sn| zku0p~IE5HjhFj8K>jM!n=%Zsz%^G2$JCld2QIg4_5bBl8zao=*ZK!Gb+SO;ujDMeb zUmo3d3y|}|do!OdFbk??IhUcp9r^i!UyBp4QsCdOiI?k`a<_=~&A9~)jh;+_X6uo5 z1Z_m_4J)eGI{4Q>Y*?q*15fY3UTe+kw_&!lB3{N$R1ZcnVZA;Y=?KU@#DYOhiYR+6 z)=uMzhk(Xwwy-S8G?gC^#E`PwiqS(f73f!+L@So7}}ft2Yx}0bx7}YZFYl z;N5unA1v;(?58gL+Pq)Z=5qaD;w04v;Pq7E2X*x+In3C^Cg)F?QQm{>HEV+ufEDfT5p5^{0pj|7Xns8Bs`~U zp(~avvIe%x8v#ESzCpWrnl@*#1x z5((CIW=7D6!qTaMRGpnitMn7-B%wh=4^QLz+WCe3iR;F>4y+aq=6Lle*j-)-iUHdM zunNvyc?$j5oCK~=kUCKt%lF~HMT$=(JrlnwoO?CW;<64cayCZN(Fe62z5IS<$@;Y% z$qrd4yyr$tgr7k@)&99xwLXg3)3f*31on-bB@SBCpZ)O=;9SI$9@iZ8wqVJVgEx6J(}no zDV|eSC#uuR4YkhZLQ-lg5xXz4(G3H8mUw$M_c-CL7k3rkBJUdA07itiB{_!{X%CCH zkZ%P_-~pbuEq4vJG(W6#Z;R{?;CkV$pJ<=@#N$P{=yO0$;@u2ZU+;2_Qf9Y_1M?l? zysrgP zO{dCy6XR@#y{lw~7ZG_9h!VCZ(aFK^V4#;G>4@PP-kosx0vd7X2y?y_kk>GGjI6}6 zif`an455!hq4{^qlT5e`hQBC~|C{*oAL-=p49Ka%UknInqyD@eA%!e34^DhlMK{hv zHaeU#jh*%_AnqZO{`^DX+KQQ*<*!7*mIwy90Xmbv?9M!a!w`4CP?(GX(Ae)&TAVC zDS*m^B)ux$rX$B#QXTp#XaB7#R-{cVm4|ykqncNwu%T;37O;h$!rwz_ZO3YE({UJ` zsSRswr9K(%&bIL45;0IV#U1O2Lswvj&d?ES3I{cKFV*DcI|!oh_>SoQ(mS(V!`&vg z1_OLEQO?!0W(1^EUFmp&GdtAb$H(!G3L|W-#|bET2Jg99F^v9H1!h=JAk;kfCg%ju zpL4B4s_&qRP5)fDV7_0rTgC>l813LW!Q5b{Fi+M_#~K9{HLB}=8%P|GeG_0p9BUz( z-pEV*?L)br6O!37!0gS6(B~0L0($g2a0@0;0XL5kNU9q;T&EG`fA5(sO-R6V@q^N9k=8(7O!5#9Fn)JDex&F3%_28RQDFuZ1 zW#47DT+lr$I+rq|I~16INfUO!f|~l!!R|#d!ti(??BGvWt+CNw@l_e^?v z^TYrfzK+%tX#>QFZ525*{z#*EH`+>Cj_Dv&D~wC5D)ijOlImUImDIH4LjvlBb`iQ}UoA?JqGm78tqny~^k z4RO!d{(+VAKn}sQ+x=M9VWJR2E2hOQH*+)d*10>gN`c`TYhm!zzi+@ZajaT)c0?SGxAy89pZno_-)c%UD=k$iCrXuFKDZaK)yRK^ zz@);PfxkcN@%m$KEqp4ViC__Uy|#2WAN_Csn`Q8jsQLW=Uozb+aFmE zWk+=V(0zb+u~(&FiG^V@!^4 zRY?r>NT1O6=+d&yM(IFd@xi7xWY#tkG>DjKA0o&&9a6`&`^Y~kL@bh7C(wH)oJeRb zG-9fEp)1W*5KOvpcaHwd1L?QLvK|Hz>J7o-&ICxp>_ z3EnvpE#i!elGdV0%Uwu_u4#o#ikD!~{0amUqoFmK1;UsUm2;`QApQ)XQ-eo?qo{bK z?wXAzlP$s4S;(9;%Je6$FT(%46+) zKZ#8mbeGT~^iD87Dra-EF>z>@L@>p~CQzqeXpF=cqm22&!=TV*k!QC-TyL}3i_^Is zC1I+?)0+SykMa9N6dmq{brlM_vbl-@N5Da)t4KKQtc(MmD!*Nt}mLPh-L!GiL0?Sa^RlcLe&3kvDd z2?)fJe+KzRRO~YW5Y;hV!keozeMieS1MTU zI;gHN<8P6&6iLif${HwZd z1S?3z4438RZ?3I>IjQywSHw0sUUFnPd$5~(J>xFLHvRdu#dQnT)TzCx< zYkAp11ca@2BZK~w7~bZggt@@W%3CC#sh;Aq_AX8Tq_bljnYtQRE9w@!o`h>)g8n66S`U)jLq&NBJ67?#+_1=7m>cyPa(RRK*S~)Vuf9SE7!~?o$L6 zRssfR+P>8MOGyWqL!6zWHJ=9G`UcCp&+MMD3j8-e2iN2mVbZ#&3fCmY!v z(#fF7WyOP>K>jCfoQ`)QBum^D0O``P->?!2_6-~QR$C-iSRKKWaKr{TL{5NCZy5hw zv?@S^NtxbX+~@)`>PeQuSES~gsHCAvG2ZXvCC$(c=6(~J(IyBF#w5CqTKqZ63?nb> zpiu*4OdDwm0+ z)9=FN2DwT2=S08&61j}_qBp@w0UJk_1FyXmYgtmRJ_biw;V5nA{!1-qN;5&Ijr8^6cLdt_nsSXbQ+1!UeDUc0q= z#l?gOQ*1g~4UWY?JUbq2Pi$+z-n$rwpf7-k^aWFCJI{yDpqgX&qD!<;buVg>1k#&qL!Tcid6J`HqXPK5nggY@%(aNhnE=kXK-RBa zFeEr(+w@fwbt#}VALy9oga^TN6_p*P>2b7YYwn&-nnaNa%wJh@JM}!GH|q&u*&JRJ zW`us-7rJ)gB2N9&7r5$HDmJoTe%G|4U-ydGA3~IP9x*N_UIpsoJ5uIFSihcWiFs5UKIbxr#@8gNliKi_YnRy&&$&@n#)8=q`C`*Evp^<+9_=R(wA99~ zl4-Igzy^Hy%d*37{$#d^uVR3pu<*b0r>UK*EhHbo$mTCFY=`V~LHLu;(N-Rbrchbi z!cq?N9lP+F+CK?2M4xaccnlYDnk}6&OcQ(Fe_14z6F=;6U< zM_N3n1z2oq^L2|%BI1gH3+1W6x|?iY6~!&sV+jSr7KKCb>F3>pwRnAI6e5gco*gen ziRY;pA%D7vdZ%9ECwB8Z$omhUzH;k5Q*C$L{eCC89^Hf3JwaEs7W_a(Y&h5@X2W75 zKl=)N=Ntz(_^{TSoD&~mBO_p<#jmrMAGisUW-eXsxckCx|B?|D+0Wl!j2WhQIM!6)UH!_d^1uT!oNng-0Ny{FV35bN%t z@7$TCv6e-Jz}Li~#`3;EsWe4?Y}DrU{Ngb7@pFU)?u5{?v@g578V<-a{my}3X+PM- zwWc{SEr@|r!q$hovO|J0kFvN<0aH_ydp`n&dlWMJ0 zFnKQTV;{Lf(bi3)dtWj^*1Lg%;})pkE!ZVN)cZQB;E5#FVu4t=z_;&PuVfKeR`<)5 zr?M)=>o}bRmXZi2(jdj_*gDreI0gt1sOT1)T4k9;+zC2xI;1r~37O>U{-z;-Q2rbU zxetu{r&@bdKadx0@ms_cJGy6OR>`>t6jBu!a}X2#EaRTcn3xrkiChE}JwcKGhCw!{-rZ3%)`MH_=L8a~2t}lwwEuL z-^$tPUYdX1IglmUJ=6%C?=CVt!Yw&UbfLoiaw0|fx&4r}>ZGb$bMYvVnTw?}K8Kd~ zc52p^Xfi(EU{LgyVmF@vE*eTkeID#j^p{E~yg^S`Y$ICx3<|M0#8uD|U=~M$ZzXu7^ z{z;{$frvD%3Ct<5^W?KU0$EVpco%?}RbU9}?09`#SQTy)Q4IOUwfaa&2z99H6%Lsx zvJq)6*_qZzE0_sos1bRker2%aKFNVom*~ZL>jz7byqOKYu+y&y0PS zNpA$ybx^)E6C!N&3#NMg_REY?G?3Hb`j!d@7Dv?+rS%uByXJqoroQodLZ8 zcb?7tRc@hpof>M3mLF>I=2h6yz*mE|1gKayzO4BgCKc1;^N;ogk?m&GOXnumyBI4p zLt_`k6nR`B)6Hn11{eIPd`=0v-=EIaA>c|M|B6)i*3o5@yM$cMKRt9cd`!w1?&!6O zdNbZq_&8V9NUm4>u*q9?eZz2zhmKc+(jQ;ZX;GH7eQ3+U?MrTbTmOJ9`HfI@1)b?d zbRGJuGldYDC(6YHmKTi!3w~7;)wm=bApS={I=F9*%1%WK3GeF~r{^-Mg@!H=c+qGO9#&2+0{ddXshuQY;T&ZXOPk8kvDST<98Q=^g<^J)R1rJG1 z8i)(+E{FJeZ|oXN326<|41AyJEhr1pfaXvH!rv@w*q3bkakE28m;N+sX?;K8Ex~^Zd z6cXeoj&!a|3dP$-LL6VpPl4kd2Z%hYiNe~}%xTCpO}w=XBO3)w>?2q^F@?*{>PIaR zn%3l?2jnK#Imc{J-2?amPX8mH*uwc8i>Wc&WChvemKL=pukQUrccixew)T$@kx_g| zm-$PY0-Scjyovi-e(IgC;AJSC01?dk!m;$#T|B(D@v!XI@85b-!m;eqsPhVpXTs%9a z*R!O|CSwk-w6(KeqFs4rQMVd&=kVvc+>wwj1!%)}8FH@}#n)zZXSP#5Q{tX{{$9bB zME1UUSCm1TkcfT3b#vFA4UM1W-r_RH_id>xS3aN0J<2tu8q-8NAVeG0GVfOjltvr^ zlt#6rM&P#qNv1d^UkRHVg4zuy=_lduj|Abd%){}IA)7pxBhI@nt9i(V7KC_5^nmz` zjv=v4M*?^1uYvT_j;Z`7@$8BT^kX+-Uy&CP=|CV;uIfwFf9FKGC_|~=@REhV>pxx5 zL;6fxkg=2fzbe;?(u6W(zoNOk7AFoW57VS3cOi{H$fq-nnKglOf!O4{ImvOV?C8j8 zf#H$v8K#w%#ma~IY)WXrLpvp$ESdAi&EmyI%Z|^^W$y@Nv0km(xT7s1kY^XJFU~>!{FEMLDHarca5zwx7>55ytQRMElk&|A=Ywp!`Ju?2to}Mz(kV&o+ ze#);w1z9IDXAWI)K59MRSAZ>}q11ecIePeP6FQCbI~R~kcj`WCz3yI_TjV{CAKVe^ z(2f4N;mC=T`|2!|{d*h~u^%2Z&7@MIp5t4rvkZE*up6WEB#j5~ z;or1~6MV0z8to?OUHS;o`zBdM97MEr3PW)=nS6#g>F|ccNSoNONEVl`@6M$tI0Z$l zHOcmn5|U4(e}p=MFZl{aa(-qDkA#rUa{_GP@Qxf^B#sHqoFs@N8zpA&`-~78XwFeA z6AStie7HKadvw(hB57N~OAP)UTJ6825`SA51`ufd$LTf%T7Lwq{0m!p5NrYchMUV> zuto#(FkN^ZvhDIxftZq#H719mR1I=?Qatlnj9<)={JRZS%Q60k6-_^w#hKZ94L{s{ z&whH^=~a5=%0JT9Q4|WZII;?Lj+aOL$-^W!p!{@}^K4c;p7cpnI@f>|Sa{AN=CmTT z1)w7$^>p9NbeM8h)J-tqdv0@#C88AdBa`1}LuaOs$T@NJ-OlD*0J!PMR$S}7gXgAc z;Iqft$;w}Lo&w%RaD5_Q+pk~zbT)6Qb@X$~i)q)|FB#$ep{|bELhtRb8HySr#O@e8k2H8_Aws+6dIkgJ8M$Ye2prmY0-P033k0HS}R&|EO$C(BCc%G4;4k=k$W9;i4ie-6qqcM4&%r?45 z^LNT;Z{M=*iywP291XotHDeuzj_Vn?Nim*1jT17&%8~hrSbULlyj56nZz6x!Pw8E$ z-vFeoruo&ZjHC+Zotckwei``zKKqR?yXz<|+Eh-)SZ1jY^aEi@>aP4p(flyeydyd2 zuWuptt5NhP}YLKKv<& ziGg8;pBJFhsPNmwh~eAxOojB1n_;cEAlp^5KX4To`t#p$g@GA{iw42f|G^rwvp4xm zb-o|GT&wqy|Vl_Y0xu!W#9kAAq{5esG!jO z(Z9+L*_Rl(>4-}#ne{5+KJngX(6nPxUMxoqt;}#T4w?gL?YFLbaUGsMx81M{z5Oww z%%t}k;*1pwL!2?btw@M7*6is^d#yXz_Z0t&Hl2Iy%(lJ%?n zSrgfx))>ui5kE-8M?_5w{%wsZ{lgl|hgf4oeb=L3oEt7ljud6dJh?4W+Mg^++o58BzGk-iWbA{JuOXxpkeOoY{Zo!1e+a4fpMGT5Nk}cHNZFO*SA_Tvck2u zQZ>%U0X+0QZ{)P7D&gr3N0G4Tvg79O0UJ5^at0s`|F=&l*LbWa@jSs-Akoaow~{FJ zA|X9Kgn15%YzQh{u8TQUoab8Y3Zlzo|l&w$tN8h0K{F3g5$CFnd7eLw{nb2ZE^!nFL!Hff1prq_ErY(MfxWzAEaD zim2!V1=t1%2YzhD1%FOj_&ptJ{Q^-~2QU#c`(kScMZZgxxz89z@@#h;*(hJ zss>k?T<5ynS}rQ0a~&0th|{|KqRF6lG{cP-j_gPrxUtnc>j>A>KY2d&SNVlvE0EJ1 z*3xPt9npM(>+IR8$VA0L6=Tg;+=Qt2;Ya&CxiNj}B@`3yUCb4R;j!}qiUiycx8}4E z1Ju{q-cAXh=RD79+LaaMEvG}Z;{bkDhfN80>xI=4;e^%d#{VEO{2KO$aPA{a$xmLecw1*#?nGm)RQ_% zv!+`Gvg7sne{mgX+U=S%GMk)*hJV})EeZMiL)H)5FRS(nEV{yjG#b1tgkt2E9 zzz(K__fpm4B`}3x-BSjuP`lx+!!6SdS50CiG)M-&uizank^3Y+almIcqe8~5l;rrN zaSO0qyYYDjb(v<*-~-&mWGhf~dvAEs8!{@fcc7(y?3B*mU{y{_LY^3E;=yd_ty=W% zylP!p3(h^T@Ds25-5(MP>&1kgZwAQy(EM&Ql{mT&fE6Lojlr8Hj|UogwZ;9!F)a0) z-VytwKOAj3idM@ei3k9CkAt={A# zn=~6?k5nYYQ4xN*ks|)w_GEP5ENJxDxh)u0j-cOjf@m!6Mf>`LzOhO(QV*lcv0uSG zfd#ZjQP<*oe6y*epNlx~sH2VP6Ko8)4H44OAZFqw_8TN1L}QI>cDc2-bJKntN9`K? z8Gj3ZK-jM&oz?lsAF2-!jY6T{c!QTuP}HZ_Cjb5q`CcAMui=51U{Sb*reK_{x-EFEEyoCRw~5Q z%7qMy@(k@EgCbX#bjokgdu6w8maUBcC|j{6wPz~~q-pcWEpzEFw@^fa5|3k~u6DRC)f|xK1wzn=}s-qeRj>U5LtJ?m7=82j6D7ci`dRi=J=ixDTl> z@VLn&*m>yn3OFUf-^Mdn7$9YXG;WCu=tz~yTwz-nDK)(-HXc4F5kzZ7TtHNollq=l zgk~x9+J3Wc_USx?4?jEoIB4*!Jb|bzWr)h+@bCUX^-3E-iniTsjwMt?+HD%^+0A3Ay8WR*n`K*shU=&B0ScW5{;2! z%P*M@Vxv`z)IKU^{uCY&{cg7Y3~M221?!iIR#Q(z5jwV;E_QjS8`iI2(3RE9@O{K@ z!~PxXjJ2itGuK#?Aybl_R}GIt_{ruM3r{tSF(gsG%-D`fudG2L9$Cg^L7xxC)RIN) zdyv-f@Pt#F!(i7~9Nw1Tlc4_p}G9TtZ1Zy>w4yY-`Cr(S1Vf zJl|T*1SG+~X3h8e&5h5G_7%=+LDWlUrsfc5i%xOuwvl3eCgi#W_;KabSJMH~ACCFn zmCBGuDC~WQI9p8(6M`0GNIhniIF|4YSFw2s2BRE%?R277s(O zF8U;2A!$*Rjm`x^hLP0%?L*s|z=!0p`xx;p+yoNCOtLHVlJ{xZRHNym-Nl`(_3<28 zQl#hR%!z0)i(L$e)}$XP7pX@0C=}u-q%N1>t?{_>WVO`hT!)_jHU|PycP14;@b&*2 zk^PTpq_wH%|J)_jsr`v7Ma^9eUJ>EDxY+)WHpcm3E27c?h7@=$fpH!Z18yO*?z{_j zcrP7D*rfV*NbD>@pNbdn^P}wHAXzj`)iU0S*%z%R7neuQ!y^U;tx&+uqzGzQ@=@jj zBOn)66uXF|E+s|o+Y&=H31A8HxFCCxuqN~HD7Pu%M1~oBHzpn6{B!0G;1}NeQ=5{i zo=j8YUt|Rw#ybG(ZU_07C-|fv$P973`!{U<0+&^01Jp2RCJsme9W$jGDr~zoU;hKJtXTw`h?XadmrC8x5RdQc~ zucm!10~`-*cdj=*`)oeH&dtyzk)F$?{7Ou0O?huMw4nGRnULw8z9I;*wHkWuc7ebNd{396C6t>o3-ZUBDr%ccKU+Fm4`9>_1DSV z7mwDyW#2=t%EIAgJ+SS~;$y22D(yL#NkRcwWSV;XSmzUuN1=O}E zn&`8zkvaQtQTR-9ffVGg{}7JlyQO&PQ;rY63=^SlOj2A_7A8itg5oEyWfv>Y8u%j zYmZ|jajLnQ^Uk(EvCsD1uKelmkMcG;A_90^3~XQWOQ=B~S{H+H1`U<%c4ji;Y)p}@AM5o(8qqCP!m!&0^JYpl58Gytd9V`6eua^3QFp;PqUN4GgTbgXaWBSrKoQoC}^XK~bm+ReO!KeXB-4PjF* z&}K_KU>MNMMz34T{G3LvGmIPUQWO3`mq+2PnS$Z!w*R6Ct+#!lnL;}D?ZQv@+Y90~ z@7*5EfWuYCfvhn`s=IfUbB)EO?uPf84vnA|dX|s0HRqqC%a z)$>b_U43w3iur8SciW|};V9Nf^kj0s24%Uz$sV(_fn1z^? zClqiME|gnONIuSd1~>U$9FNoJvrxB9L<13=c1*BBZ{T}fBkrD2`4u+ZWtr!QRg+GwChX_9qr z?hiD`=Lyv_4&Ov5j>m-RUgetXzd2m#3F*V+-y^q1j^)&cKe#p2w7=)QVJ#US{Z7ASfSgADryaz{Pyz^{_A^+@p|RWUme}g~o%Pb97i_Memh;&6D`q6B-7( z41gJPboZdjA>qCv@O2va^^>ZoeZmqZu~?q=0?u>wf=T14H0_>{S=iS3?=y5;MA2e7 z%B;*)~iPE7U zs~728rSE!UR($nL_2I*y;%)HTdNnC4&AO0tI&=8P=dp7rNMiU3N&!(u7=65~bu|d6 zbEZwZb9Tm=c6_(`UCw>?PP>#G>BixO-VzI|^Ds;rY@@agEfY4^z_IkMv!iN%sU9aw z3PiE-Xu(uB{laU+&wd;d$|ApWekHtFV_cT+G@{LN8UR(GXE)1LLq0<%lA$CwRZTRv z=sWe?@_DAonO#DyF#ZSEXHypgR19*c9m(ln_Mjco+a3#L%mj*5%Q_LZy$Uw`2F zfMe+^(A5$c$v!gCpQD9@FfiLiiBAAJ3;)Z2{C8jiYwtHe6@&tF5dQP=k&UUDi-7~k zRVjAML~N$I$oX8 zXA-p3GN*oyre@liMp_m$&F+4Vmv`ziC^Gu7I4SVOgzOj158fxfPxWK={x6qo0YF69 zd1kX5qK!HVg%FnT1>PdjG|n~_oQ@W&gP0g`_>)kOVNV&nm*7qZRV^s@Ii}t zG>nBP5|-GICInT~qgbB4tW%0taPllZCKgXCE7#I(>3%VSFC`;}NqWR>A|KFxP;Wh$ z0bme#5jfT}8l`eB3(EDIcI#de<)ry8LAM8Q%9vX7nR4*kRC8@fe^lm7b%!ChkwS%y zRv9J&Sh~YClxt7x?)zJ+-0-f?ap{Y+oo$Do-ic426C*KY4S13Xs#FoBJG8i6wG23{ zmxU|D8|~6oGe|FlkIZ}W%(r}e{;}CCEhEa7H(9syc8#0NmS;o1IS#wx^SpdGvgM9$ z(7tv3#%N)G=vHC4Nv8-ZfTL;i{+U~YABHe>aZLRV(_7ta_ZfQwD^>}T)~-d_^-1<72b{SRczqhed2AmgBDoAO0TB4+D(6m*PkIfMV zexzIVp?@970Y1*3#j+mV>2la&-Y7cgl&7)XeQG@EfSA#oy5lJM4`H}U9_uG2^~k6^o53%XlhE2@yQ=Ql z4b-hOrSfUw$xZsd^g7!G?zyodL$}51`s-T0@ky!Mw3Njc@1I|idIrg4ce{N`GvC8i z&W~u#;Gh`0&C5ip{ZynLuq?TP^V)ZeMCBqu1IlImTTIpHb3oBkxb_j#cM0z=5f(1F zxTln+$&#G+XoYMw{rvY%`!4lFOM#N*Q)kGE-(d~x5bZ?#C)y2?Qb_BfrVn#C1Dc)< zKuL}u*U=ZGC?av7{#uuMxtMpLluCI}Ii2x=+-x%uJ9E_OjD_y;0~7~?Hr&j$O9ZNT*qhGPu3P2gnHj` zo)+6oiF=UsWAT>5JeNa0K2m6Su-W**CN!+!+4nm8;TT+?_zW_w@+}`pU7&RD@pM;` zK*J}D3|>}l6H3GyX@;M2t^+9~pKcMwfK-ya`WWYkrsl98zAGev%R(mM3tdJwv{^74 z73>E{gM7yrs+NXe5fF~tvx7f~t3AT7tedOJu+-~%*BFA< zk2@xoe2P*YIQkbK<#+k(4EF<>LAd(A9ZUVI{QZ-rAyH<(kEImRp^1{OwLa_d`DKaKKwx->WDY#Gx246A2caUbS-cd>QTg8Is-(b(u! zKlkrjsc1ZC8t8A(tBqD<5lz5xDjqi2ZDe}pw3x-ShW$KkdKN9p!UBEAkR6#=QVsfY z8UK-T*2|T;s}b<;U;_73jZjrQA&_OTp!O>WKqP zCNbVm8dlGcnL~{9lwsO_co$kZ2aUO6sAUDQn#odw-WFcpxZl#!4E9|c3U7lp(Kc}; zxQaQ96lo@oEv}&|j0N1Jk99y%ILZKpqlm+Fb@Lr^bK@oK9;`TgQCIH90P!indx*zbI}$NFF5>Sf+&ik$u#SN}QxkGOjA z9n^Mx@bMd8NJhOs%+60{dG9j35cDYU+Z`53bf`8cJ*xQCnsoor*3g--ucku5LcP1* z;v}X*fj=dLR0umf;*rHLs=31aA#wH8B##8^k9^=;RQZc+QsbKNc{9kZR8L6+w;4+y z29W|T9v}hD9r(??UR@L1s$-mFRB&dm7W+1r)9*|su|CAPE zV`^vqJB92|q=u^6T4Rc!`B61(k6#?>)K1M?*}PX!{k66eVJMp{d?_c}rc@Jc-P}Bf zyj951Q#J<}k zmW&pm{i&7DrXC(N2!y=5C5_Ra9(^rEwqwBxbu;E{9fOGDinLhg{1B{CO$c+ zLT0CCZ{(;Q)e-%WneyqLgpc)}2+kLJPh(h|gE~^3)smyEJXQT<)jJp#w;x#_h!?Pj zSNh}JtJ^q_SdYAkyM_K88Zf*u34)L^whB>l|7oAY4rFWU>;U@9DC-}d-LN(_!&Lh# z6<|coUVzNg_YPpFVU5WK7>4OrF5#I4#0qvpqLPgE@8~kf4Hwx69s6Swt=%+0{?q06 zohPs5k?WZg$i_DPS_L!#8z;8;7>bUflL5Qi|0!!drP| z+PRGq!;j15kb%J~aRa1Ms>-{*Df^-W zdnD4qfgF(Q@m-;XfnhyusQ9uZv96Zl1%ItkjflAKXnRn@zU?OYeQmP=qi^pArHm68 z-6Icz@D!^Zp|Wv>DA~`)&_m3!9A?luFMO|%+<}LTgQu&v<7UJkow*V9_Q~i;h!^_7 zX@w_qlJ}dth3e2pBuo5xQM+v&xK&E&_khgcl2MP)Z!YdP$Z=An(7;aa4~4_%@<8!H zr0jT|#o)2x=a4(7J1Z(`2sx~7bnm04c~=R#wIgl9ZgALaAWKFyP~)G}2!DGpToN{w zUnPWTQ0bx=PP~Ch_(YMO_uvB7?6Lr-4ek@?{=R+EEt5@^qopQdC*1Ky?(0c55TdZarrRzoOOr2w2F;Q?J8 zYVEckkd6ARB#vTq$v!>?FZvA9s8^iRsJqeD+iYlVrI94dp2$+K!t;Gh-#gx$nOS1< ze|kEk3?Q7|kT#-*+-^nykv+)oKa4yv7-Mzpu5WfazAG{VWiVqhqZMJUyXRKMpLgb_ZBn-V%- zl8i?cu~31gKJg^d=vlTM@#v#BU%DFQHY9~wN29}t-(du_-O<(@AI2^GvOO-9V6Zfg zopN5M&>*^&U{A}otN6o9pwT2LtDZqmNrizQH1)ZLsY>CcW`$Ki#esj#L$#kTB-R$A zM%Z_%`UY>Eiy&q8ea$wSl@koOpD~mleM?PwL)mzIr3eUK$&-nfdx)7wmsLexFVtSD z>&m+v%(AfFdhA0eaF}0dm01<|Jbq^TT7sUm!t? z9jB(+HF%ZlD9ik9{8T`x^$%LYtt||#cG~1yg)Ri2k0*FV({3Sa5wc61dSdL?x@(@B zOI6zW!Z9IhlSv}eMmUkiFeIQgJk44~U?;!cPnBV*5Qr8gb(Rc8*Wb%1{7Tgbb(;LH5b@VqgKe!O*@ zaHKK35q9(e6B5$LxJI<)FF#^k+DQT~K8BsGu!z@8FxY$TKa0UxWpGCAv=kxtLQ*ti?^-kk!Yahf&y# zZ}V{}NwH%WNG^UP{QQ`t?bj-Sim$mK<`2aq8r<$u-(%ouH)&Qx!R5PM>%12cI6V}B zkYn^Fk0_|+E@po)i(i1{Gojog4Ck%f;kl;rBZuF*KkTl3orCM>N_X#VNY%kDUOu-{ zR`2R4uS9Z24-O+*ceOaG|7U7sf;2IFJnf zssRR~U_U3(!qhLDv?cJZT$j0s1R7SC7Zg+FGxgaa6n?A4_fQe<4Tsat zpiWFfieKbKrj~n5twK$tU9Xwaua6)B?*I7E(Xulw9&D2}OGTEEn{+I)8nu(Wx$=CLQ*F8Hq3 zY>=Hf1_4?#eny$ODuTQ7oH>G)#{~FL+UC*E0MH%fKRE$cAk&8)Q51 zB-*Pz=@1D8DBJT}X}i;*yBCA}Vv41Xciop?8%O+d*+yt!S6-Lp`!Yho!5GpyhuHg@TS7XLBZ#r+09G-C!Yq@wu(mGsTIT1TXoI=gJ z#D_daQawPC(~+Rh4?n%}kJ+n)7wUU@^%A9$#~pOdh#S&HmW}qbY#gB?cq=D zjZ;i1edkh$hAM-&VgD)X*U8e{;{VSM`$yJqTq1Htn6v~E))MUi1C?%ROn@$o0+a-_ zTCptGS{%I{r;D>{wZAZt`Th9J^;CN6bh<{)@Z@!!zuK3TIbC>Qv2Wk;P3FbJaq6#? zm&a$g0BS^DZI+6BWXvmZ1u%1{4t`N^+E_aaahI*Di`VXPN==!8C&s&pb)lnq0xVi(oqOX_st7u9Sf$GR_ZGHhAv5 zrC2UWXPeaqHj!9jQvEAIwTH8xlT$mF)S(vT>>`pV*vY@}mNKr_GmIArtQ8@BSnJz6 zN}5g37$z;Q2hDMYDp1LDDd=+&*S9IB%GnVQnRF+Nxb+cs4`hEhVC~G&OnNWbYV=CX zAew>%&;Mtt|B73-*CksmQLss|62H5Nq;#ZH{yQfaE=n_c^#lh5Z1t2*Zd5UWFsoi3 ziGn6O{t;)_H4Y`IecE_cXnLyTPf!Xg zp#X8#FLbY*pkb*_v{}Pl{^4vR5-)ugT>;gWH4pC2Ap)GUCzFzOb)cmQyB5f%^fZ*5|H9VIuKf`%Ecam+<#JQjw>WSWSE%i+*kC-l*tf;P?XtDisEN~^a{EwsxpP-b z(kZ*B8C^!w=FC3amiRRnO^#v@UZ1yGuZfRP%M~H!m=( z!nsusVSXB_g6$`@IL`3tT2p@XbedmgQgZ?rBDCpjUQGOROE=x7o$`wMze!;s!upaf zSh)I$3T4lKxI`!?kGKYA`p7N<90k1&1o%#`E}y~8GhKHMfmz5QFeE|QsQFp3t7Ms( zGB^CJqWB(g7i^ajn$BN%h$@#tAo>*z|e3fc6qAEO?G8VwM8WKb->e2i!|^G8~d zm_QM{H>Do!SjlOkca)Uzn4H5o-`#M3AZxKud5sm_(UFGLt0vORXuT&HE#HXTpo2=Mh>#F2tN*-R&WKyzH80nwwGv{ z0{tkG0mN)wj{+V*R+cQ>)POl`Z0J#%65iS0}Il9 z-Jck|24}T>xFZDwNt5G+REPlMUJi8rGgOHmYv;m;?`cwV(~f0V-Yb*{sN>R7n=pC@ zyZvc{AxxR19YuB-PU}$O!gbW%4AbSIODo;s)YJ-{4!cP3CzHBPxKHMO%g_YLOePZkQTX%Swjrht=!dt9n_o_0DNkc85gErTK&MG8HE*{c zvU@>JDb$Qh41jIPDx0hJ)EANbuE^Wl^7AtnLVuqJTD%cZ$$TKU(KEG7yVaCI%cJcT zINGJ5atF%}r(=vbwX|RFgMiOcqx_D7R{&_YxAtVn)qT!Ci!VAp;Jv_|A@Q0knxNR_ z_-Q=F%&vWg#yH&eKFsVxUuIq<5jg#Td59=#Y}pb9M2Lyr=PIu%4)36dD@*^~K|{#U z;)vYnVJ@3_*=U_^XlIUuSd<#V`7bYpH-Y`%Co(MhjXLo0lO*Kgs7{;m_T!HDW z|9_0V19zqC)+SsP8x`BOZQH2Ws@P6NE4FRhs@S$uv8{^nt$p^}-RHdh_3j>PjP(oV zGp{-4eW4F{1+xWink4_UWjX_m^8PMSpMT|yAo1<#=tRm8DUMay{8aoV_y-c~W~MwT zKsY$P@mq{`108Gzn^q0UjmEVq*f)Y638JCs;PQomWWE$WC$lLFzt86z*dF%wuj#FO zd$vElS_yjkK?!j9*MbgZOcTAtN?p8$gI;WJ^}eYC#zq3I9f>bAGcBeX0aCR0b+yzn z<0ij-6shtIf1gbKL_&y+bJd7oP0HNF&DNr#=<|(d4@aRX$da|>V9Wy9I%1c_GS}kt zpq!WG>1*YAqbw$#>&p})F;C(;)6ZXJQ87hfi5vRkg`tp@={>cY?{MtKZ<@C)rtLpDg&XY~w&5LMD|B{tT$S1YKdiOS*=nOr@f*YB zcqKa_xzrRV?RY^z%SWjf4f$L+j!LI^dY{FNr6(G&|~ zBj8)Gfwl6RvhXeiOQV82w~vZ>vD}{+%ujG~N$}l=MW9RT{1OC6B&+3?j~kEqC12K- zA3`^%W{(Ko@6^ctp2TR&jTy#-pW%&w$Y{!XY%`QlBE0@gd8s>WbkVp%*f2d4c#W7 z@^W9{K))k1h3=8gZ8Cq)(W!{qT7aTN3tR?hq|@B?xv;){5N`AAoi$?vNV+c@WBZO$ zO){?YB9peK)U9ikeJoV9_$A06xdtkQ4Nx~z45xd5{<0sucJ|{Bam`a-Ts9!XnSoQS zWh5uefKmKa2xC)|ZM=u<9KKA$Bo_$C+S&6Grr`-Z)3^ zak8(Bk=dJaox6_H1+3Vvw{MhEceK!PnPGY9Q{d(JNcCo``HeSSj=1l}FCZBRBc|R@3D%;v3uaOlKmmI7vfNl%x~mW?M`lmV@8X~(^%4B_ zQR*NsOe@xmL55>6;W+o)iYF7MkGT_^6r$|#f)Z!;ZyY2x@ktls^x8?g%aXy`4T>do9r~9yntUp)&8`93HNR^cXn^z(5 zOh*4t)oX8U`B$#je`cFUsmVCui2Z#eJNqMJ067ex9ZrHvhGlu1qreWv7ai< zS#?myYuLoxQII&Hzk_7kCX8kvT>g_qqWmXyJT)Pz`NvnWX=$b~5=ex#G~k)+(PjGh zwY&QRLJ;{39biAy$EYVidudIe*IPlZCu1}e;LoC!&Bl~65P`1DnKJMz><(QIcpden zP1j_0=p7J)KxZzbS^kYfASym2mvTTm^&1o*hD%+6s^~u3D%b$Ub0~{Ei{9;tJ zxPsK1-mwFXSN+|o(}g2e>yo-{Ejcf29L}tDPpV1NtaiMMA%JWeUPQ>06k~i`*oK1x z>o%!MFcg5}O&FkDg%vtyB;#3ruHc$QL9n7+q|+!CWmvCmE+bW=8kd(o$*1~sI^?3H zvbF|)nrMBT%Y=5=f(<)MRIvM!FN^mJZYcTaG@&;gC%m2j1{m&!N}tYniP8-Q{|f?Ypo#B>z;fZ%}1JulB< zFV7=tQbFX6hHgV^9L&iVx-vw)X*L3pzj?bM2ni*MsccfRbke@ZktCuwcNRH%6WGJ! zj~>wTyDA(}yRQZs^PZPp_G5K1aVGJMwR;1OvY zqf79OCEf_g00T9F{UG7|gr@pn8It5!s~b|n1rZRy3D zlDp23RKVnz^@AK*bT&dfYzcm{AvJzNC`*FgLxDqk0)0l0Y-H;neu{nj=0niG-_o;Z z4zCOrmya^Iq;#44Y4zbWpb&+rZ)kuRm~)AdlNW;VhT+&9Vd#sv_oiX;WS6?vZJf3> z?DdA&`Zf)<;9aueqe!IJ;}Brd*H0?1H~{y%7Vc}5arEXxLgQW>c?7QiWC9|ESKtzI z=INZhzdA8en71L~xxN+(Fc4iNarH#=++2R9JEB*4e+t9Ji3h_G9iD( zd<|bij0qv59QF#?#Fyum$(KS~7O&yDp(`d`XmlL|L~YX_-HH}y{*sR zIWS+#0xi}Y(^nI%SJzKs;j|hhlrG-^3&vIAwAf1WqAXoeh~H-er&0M|aU`;(5dEqO zqyYCSDK0;1S*N>N+Ef4gL_1&{iOrSZUvVVOHce~e{I1y1!9sA~TLUWnGlSJ4nP~sy zuaM*6{r=X&FVq&?O<`&XuOU+X!`bYw(ORoD8V7EkLJ*jT9%i6HiVbq8U~{L^p|_`sa?tI3;l zibRHf6wsM1A!)hl{EIPT}3?rSex-?YH5m*e6*5~-=#b?&M{ z#NBZT0|pYe@N6^8q3)k|`k2L?i*S8V;v}(mm<6Fo+p)fcb=Qy$Z!kVIHOT8@-VlD# zvyY(yBi5x_k3fE!|z;KFZqv2QD8z}fnVgY?-A?uH}7jod1ODFPO=ggRbx z0E}MwffUFED?WZ#4&sOcnsF+ctyBhs{bk1a`%LLBOyECvz|(M?5;Y()#Q~9t^`C0g z+0fDX|Cn{9t%0I}`Z2X1D+TyUH3*xVicZ;<3cHr9g-S+gv-VXhu=ReB4O#*d*X(#g zO6XJSb#A!pUPzZ3wnM$C=3PnmxA`}f+#sNL^v1)*`qt*rguY+*GpOKK8VLD3lU&3E zDJ|X0AvEvuy#_FTj+x;2HHDKWV*iTYlDjgX^R3APE)%6YfanZvv%h1m>}*y9*2I<{ zmcrGrI5*c=Mc&f)xEujH&M)1&f7wpoX@K`r0b{O=j2p-UOo1_12Y? zyHR-dOb?p@icWPTr*Ot}6YwXkV&l*U&Sv`GWSZcWQl!@rmMBfO3{3%=E2Xo?%j^hq z^XzQ4R||v5&fYQg?UP>uyug(3SW+W77hI*SQcW=V#S@6W`|OUo5aEqYmcB&g(jVf9 zRjkfYmyVD_*lWSxk-yyJMc2rB!{>8$Ot+wBXjjvTIkYut<}$ZmSYzIDJk({-qr#*m zuB_%)ilkq(JLeRVtBC3ttGL%2?BaNjGdk!5Q8xwRi8^39X8m3-V>GI|_#G4sju%0m ze4Q12CAT58IKW&E7yP-5qk7PNj8DkV|}oG6|7+|4HP7OJcg^7JShJ zGn#U>Q8YBIMZrd-se9L;o)kIdY5+y$Ir(x-?<1H~oSvH9fmu~rcd`$6acEgGYi;6| zXX;dgG;jd!W zoqOcw{QD~AO4u(W;({p8km-{mUZ4dG@NIvKs4c`65PU8(K;H>?Mu}&bxue--n0c*? zvI67I^MniRz}(j6oc8OXM2tOxm%X`wGHu4{j+*O}cuHlISK2HH(&+a{WCS<}zd(<2 zjka6h3l=B!)1^~+4K%dr*7|XUC6MzuD|#_8 zN!TXvu$qNb%>b!{T@0up2~rU(Lua1#a|E>iqAf}6?o|M-LEN-)ByHy9%*+ord5$)` z4$XW&pI`6<5!|frjk%$5G^{5KmijV-pMC9hnvjQuK`b*ev0x+6lQAJcNW4+bf2kkl z{&lX=lJT2F6Cwl!h}Ja{P5QSC&$ww=nqD#i&owp>U56J^K-SXS?T(>~#*4PmGMP;I zxmr*Moj2NLhPW*PYA;=){*$tL@Tc_4bNJD?_l;s(ap94Ck&*%C=4#5JZ!K8`n+9f^ zkO{pA({G5{>a(#&XEiI8k<9z_!`U|~AZtlV*F5z!d;qD2ozmQ^uW>nsy520Y1QhoB znw@8euNc3g;f;L5$cBs(1_A`r{x-HF`Yl2-lX$&z!3rr`@D?iJa)PhZr|o1fOm#>k z$MFZq9!=-fHn}a+#3R@M;}X#&tFZPQ9am_|mlJv{@^v(U@@Hl!%1F}8Wu&!D0U*EoIt1x||Ot39oFENG}IhJTz}E$S2>i{}vH(u4w$R z)nvZfS)v^V#1y=xWW$3J4q-x63-;lFL3#esrFLuY4G$G;0V zNmU!@aEbcC4j5Yu1z0~p$G;>hwlE<5Mpz#UYJqNK7sjIU}sc9-$C3Y z7Hbe_p1QZ%=t@br+iy0Vo$1tdhUWn{8h8do6S}!O)b(m-83rLO7?R+X?d({ZN zVjW~!Fqh3>K)wA=pBz;wmMu9ninSC@BcD5XhNEH$!Dq9sBdZNK zb4u_UONBHNfPOFfKRH(p$THRw+8N{>Fy8xxHD~u`j{MI{3n(Jro^R59dXq zcCV~xVa74s!Z%+Bt##1BJ3NCzBaY5HFKsHD!p)b|p89*2i^^gK2?v}ih}4HYkeY!D zJZ`U{*jk4HS$>QWuPSxH0bY(feYS7LZPkZ1E)sBEBO<|J`y+LZDe4H@%z0ur7?8p} zms*h5RvD?EyFuHp*j&0Is??{+oOT`q^U-Vob1D8@9d}phHoIfdHd^<$1+Bm_TLvjKMCDN2=D7k}{KK5jAck zRc@sc=e(%5StIN<2iR*m=zeb*5Gs>-lX-f>r8gF&2tU9r=qWySp$o_#C^fiOXDG>G z3aH!=Gt`KNiL84SVr|#e&7Y$24JCrRtfr*L48;b9N*AdLW~a zLS0A}I7qy&L)`f-EiesJ)qeMU0RSF5YOd!wBzKdydp?BFtHa$cc&n->TyM6TQlH%8o>2K>o00x1u`DJ zZxH|i%89RyRBsamoqh}>&mb22Zbw{Eq7vd?ItPIU^DpTN!D(3 z9fUr^x+F;ereT+T&VGws6X!Okeo1=d8Y;UaT>VrR9fuNSJ>-x4PUSg8y-j+$)vkhv zxLSGite%1O0q&XWgn^Z@w(9E=X;-AspQU(%48ha(7piaxXeFdhmp%Rw{>JD7l>D7p z7&vn`I=9Qe$oD4+O~z-^B$vj7A`>yIDdcm=Dt3w}?GmAAJ22@ELw%%HYa;OSDVoKy z4Rg6;8sr7j%5QnPZw2=k7g<+7w8Y4mIrT8s0(zYTPHq9DEp?)|_;Fg-)V_KXoYZmZ ziGh*K4Kp!rv^u?Nuzbf&GaBx-wEAA_~8JRiA8h#1HUGoOjzl5=BFK3{fJtT<$0v^v=@4I zPXhU7%k|ewmTRqNO?wL>^ipdZeX=VNl*DzknWSh+1<0RivgD&aH%fyyVm*V+St&($ z{9}lh2}lxk(kY(xsfllvfQe6()Q$tMdD`63s7cDG^>G@wakb{y}Ix$Yd=$&d+ zmcqEx`f@PsR%HVBne&2}+{deU4t(3LWN|Xti_`5^d`f*Ml|>4jRY-IY@_(AseF(Eg z7OlRTgUx%s%_@UJWyS;-XRG8LT6Mk3nC~NGe&Fhc=HaB+WBswvP)PSxzBpAoOT%x@ zK9QTZE=@0P%kJ`poAHfR=h@GTKI~fH*QD-*C0Xo<(6lnaa4C!1ob_z=kHMb^B3Qks}sOZqqX@kL@(e5=*^?~*IlfZeXS%vzEd5ZHz$oy@$+kw~3 zO?#eoU`OPV&uf|s_-i}bc>9>%EBPY*q%*AaD@hpJZu|fb55r!G{%UMm#<8t(k56Zo zF^?p8RPR>|75qHklVAw4kN%?KERX>Pzs#!2Heu0Py#paK_hSj8bvm}1zjmpz{)fl- z!P(9#I7E`y4>*c)8U7=ealeuG`rp?c9%I^0Zvc&>Y{H5zu`UxfU8djHXUPVf=t9t4 z^hTwUBE_A}rZv}tT;n#k?@T}X+&tcnOt%7ze4m}Z@I zly1b`gv8gqN$*VQtHF?E0RB2%C~irSm{Ugxr?*v1;59Yv$=e63nyEx{)%SiQ1jsa9 zQ#OEE%wj6s79AH5YDL(~s9?yAWR3Xxw}awJ0tddi%idgts&#KQPWYJnbQIY|4e&ul zr{|8sO1AW_$r8NpvLw~QQbw4Z!5I($`-z?i&gwif19TwSpV8a^lL3p8XZ1lQba;gPp z5u-GGyidvpqHyZp#=41ls&P+^&#=IR(DKzv|rx7|wZu;OZ`L_(tM*sbmygQmkvqF}2@c=&Y@Qd6W zpP0RKXmQDuD4^{IFOoDfJi0V9a~}5s%M- zDGl9P0a54RIK5nvDy7Sk@-y^pzs)V1w!#85xvjoh*(549+$is;DY zj>#Q%+v$QAija;#=%rd$;K3*t*|GYP|JbhRY9FA5E%Ouk)6j$X3-Y2t$0bYZ=shci zvTP1=IB281JLp7k+KRkZ#rLDNyajtnJaYq%m4tTl126HUYX9B%mx z?sYCu&DA%HqurNtC!PPxhN%oK+8FuPb9_^*!>T=67ri+r!$R**e^nYE|BB17S(-ih zoO9kNZ{29ZoWy$Om%8w*zUpuC;iyG~ZJ15!NnoT)DXn#@I3 zTBTDHbOlxxoM9^1$#wY#YW*~rN2>Y4U?tzi+?unljb9OTdMmK?`p=lH;~0G@Cs`Bi zqZsGeSF)|lR2(@ z0#}VDgPgFkojQ+T+Cl7Q_}HY>{NXMmM^Uca;PZFZUJ2EkFVt~6*aMD|H(Q5L`z3+h z-je~>U@=p72~Su#8(-gb^yP1As3(tA2Dszh)oJIDjoYkuf=;nV4JF%(GL>x2qH1+Tr$z(Y^=eFC@5OdRLu(12In-gys!qIUb;m zpJDP(ooLM)!jm-$M?3AKkTgywnP$W`ChgyAaH0RsJ2b5%ejtRq*OJYTj~C*7fHkxi zdnMA3EAfu;pKSp4uyME*NC%Mswt|1+0stMh{-*(wkMiGklV{$Xm@RT5!j^e9KWE4l z7de6w%R@xPU|?|5OO<2RYlG+>u&XZKsvm?4iElukltRB#l+Uq7(RrDfZ~aQ+==G?;{L; zG3np-J?|{lMc)+ySD!i}LrIpHEnF}+qLqbPeDK8rb{8)>=tO(|Am()nl?E?M7ZSLs z+QiQk3X5_}dgDi^Ad~q{%+$CsJcoMmYlzfH2(npk?r|xRl!>50p>g0ebksrlVzbu> zxbP?7=fKpBShNnywg+P~Su@b}Zr}HbA`VDcnslgOg#f04qd+Wm7ep1}NjwYVe&E#T z{1Tts-dg#~VwoQg=M@g}E>&uaO1Zq0z2Te^kksblpjXSqVq{Laj1y6;^qtYiiGdye z*u_7*11~=uSC{`z^M1Cn=Q@-(hL$A5iwB}Zz6I~)NN&b6W_Z5?<;!YQVs7Xk%UcSQ zW3mA|&7&({A{OxntLQzEF{P|+TP~f%YtjQ3CGlWpT3$I8j#}wvQ9Xop%{=kDmBDfA zoqv0+_-iyQ+x4*q0iHk+VZMA}_y+)RaRjFHlK$&o+0@C!+WEgOO6prqsK6E1>?*!f z2O)sy=TCoR;?Z|z!*^u+RsA{F*O^IopAVT}DZm zanv_a)Sr~&*=>^!J;*nv#pcDYz{T6s^YO~>;|WFZYZIxsJyRHHDi+~MJT`sB&IM_; z!P0;Z$Q7w!e&PV{Cfki32&~on2O+;8m%kW_MpCQEZa?Wmp2;o=%CfAgEG^5u3{5HQ zD5Fl7sg0)C^6lwhI2>+`uRjs_FL=PLBOOw{A$W_JV&l6Ys>~(;Tus7TFn9$9eTgKXT@>OGmOTtsov0+;ht+lRd6Gpzb8Sk_OkJggN zaA>;>A|I))L2GS*6*cR<6J5%RL0Q1!dnH9V#_q-Y>(jX z7c?DDI1}bZRjA)>0nwh|IgMA2Qx|fOF+?3+xR!#c*|mp}uxAZkwqF^rg5iiY8*%oC z%b#_oqY597tCc+1ab+G!?Krc4pjarDrR79@P=e(Xf^s|qdMU!TGa9yv(o<=3IL zqXhbsax4j&twXtZ862PX{!{YSZu5Zy$n21+Gl$!Zo%r#oBDGy~iHqx8>|VYi!*v9O z+f4vkfG z(2l;s4vuJ4m(WV^qigkOds3T?3m4MJ`|SnPjMsWiDh`rJXjTO3u>n!ke0k}BI zUi~VE7sI2BUD}JyK4)w1h?8PO%kSk&tU@v7&Kl})A^K0GWj+d}65h@!5Iy#h={jZV z1xTf$$6C@#K-PfDn0>BLdXr&yj=JV^_2Cz{smqhOxr0&20ROUY54m&@wJWwC;1 zrBU1o_Pr0eSmYoJjde~INSlE0me#C44>Q(wb%SrMZCyE zPN{{hQZ#~+Md~UeRz%ZgLzDVPlXC(pg$Pm=Mkd>BlsbTzW zG*Cao)D=79&raJ*Fb?6VTf8+$=x;;IlGs}Y15e2oz99iOJ|Sj#A_*I=%)C+asic(@ ztU@Q8II}v$JndAeX|!CX3iP%5gBBYz+iA_xkaGiVl#t|`3n|5gEsSCY^IH8q9(;N| zIIIMD?+Kc{nBP$6q{jR}%q`$a|GVQ`8h{eM8wjM~Kp-XgzqQl#L`0rsD<*-A_fHE)shh9ZP+fE`!Gjmss~u-sMGB8#*~?0U317xt+}*Ja*m}70v^0HEk@5#HEn^x-nA4E^=Ddj; zgpY#CKuuLY(iK-NvytBl?gL3Dnv>$L!Z(W=@f^xlnYZLSgma)PGWl6wo|}wz#a|1O z>M71CEca}!OuaQJvnYy{imjMpj5~tS+ujmd8s@u@eUN_`R`1SlP&+NQhjE#?O_v zkUwu^a%`eEpy^?e=Vl@o46J>u8PC0(Q%b93$|nafzNg?DWPIrZ$_7tX%)M3}8){h( zQ)~I#boy>Jnb~*lYTKvxau||m5Ir8l$y)qRFX@hdc;Mcgl4I*Zc0JP?GEDq&c8iCU^(dfb@#1~%f3S-2q<6-gTH}_;p*!*!fFfpd4R5Q zZXAro*8KcyiE|N~{SCW8eWl<5=RXH24v3<#V&JRdB@j~oX`ga6w01H5H_yMneGtq# zoYzfhpeQkfXfP~g#)&tBW54uDD!+gb-GtFzKvk@-ws+W^GBCZEL_R*{h9NJA9srq@ zyxJDv)HDpX^-f$)Q_o#ocav{#e}D=t2ib~HLrNIo zroaakEMl~NY9}|_I3aD+0G_+#o%T$1hz2*jsR)2m4v*)iYb(D7JDr^p+_Fe9CigOX zE5}*&wb3XuZEuc+QnupwbAh=`0s%GpfaNGa?hFT*osbwC8Ge)G6|_7?NIvXxgbR=2q-96ZHLvEjEA zRGlSza6Y&KA*2>~w+4s?#l@M33he3~ZV_fmvorxpr?{GBul;NFPgGNN)YB>c1{^ph zy+5s#*TUWjv1}V)7YrXY4Q9vueFuczD2w7d$D(}wL~V@s9654L`}WIZ9K`c(_tas} zb^-G!z3EoyQWF|&dk5BWG}?)VbPjNMV6zD7yt>n220{I(@3HhMitm$sWBqd<-25*! zIt^XnF5^fzFZD;MMtcO0O+wZ%4xU*?*8*X_?T`i*C2{h61zluK;17At-tlX-c8S^f zfkSK6pxh4a$+TH5ocoee* zU&BYTCeZWSCSINC3Ppa4pFKjH67m(rW|L5N3U=Io^O>U=C|br$+B6XMjF39fjZz9% zd<_+2Xd)u$?zMq1pHc8GaPEM#Prl72sgOVS>OtSWsYDap8|IbQCUvw84 z0d_i9V5j>hDwey2vkh=`{JYl$E9)vO2%_@MzaMKw924(i)E)dUJqinC~37`P+o#Ln5Juj=n@*p4L z<4sRsULfJvzx#T9tJH)WH1)}TaR-iq-+y zvEXb*TK(04UL3NtumPGh*hd+>46ZCh3_5`PA`*#IG-jN*tq#yf0rNL*_oWfgWmjN* zZx_1%?)!}MH3+rKS|<_$TmOdaFC{j0v!eJ1Cn*;}WRbIrOLu{dS>#34Ou=reGxUm| z&QZx9M3IIER&2+)LT+q+xGxsQz4lSRe$tYxyL%!$G)a2h+Z{$s(N`y2DSS0Kf(^)M zRYSkZ6K5du?eTa#$FVvp^-J4Xq2c6K+0aKIu%Si$#cyjIM~%BdMV(?FXr1v3BAH1d zki9Ov$@A>rSb2Z#5XojN5C1P>0{8z_2>(M&aP}`TK~bXi`j)PIQy@}luz)yl%?yy(3SCo*S0p1nSBdJx+2(_7DWvqN6p zw|jd>Md&2zI^nM>sQ6bEz%iGdE4smW=d2-_CQ{iBYR8$4F-LanVDRtw z@4j$iekb|k@Ch^7l`WZYtZA`+rOV$${E^%MzBk83$QF)W$Esl;oTduPXQ-L6{y(cA z;z0(D=dUV&g}W#x5|77aB97Wj@!6Rg#tC8`xEhx6I)G>WXRf0sZC%)d$is3y=8ehawUdB(CTDgDgcasO`LSkmf; z%de$L@9wiP1f#~;s-jxG3$cps0bgkt2Vr9b8gmN!ZwG|Gh?%LXiFQ2bU%qg%0mV=M z=eg(aE)ew{(mPQM-Ouh}J&Pfsh)kJyFt;>OP<|l+6af~UI20VL_ZvqB!)Tuwhpqn? zcGPi)QwMag{RN=EdueFw7Xl-U0eW`S!D@3JrTfa^&a~gpx4^{oH{aFAk53Pltqcwy zv-MAQTZo^A=NkSc+c5q#H@5zd+nr+D{jXqf18TTeM^8V$MAOK6D~>ISJt0-ct@V>v zCmCdg(UCVxTXlxv$Zk-oX&-K>M#gL(8hN7XPqtZWo3a3rL^+?+L0Ro5}587h9k&EU5QynXGHy{DTsm1A|GnIL-B;-Gf=?J99@Ip;KuWKOHt`45-WCIE_JyWfr$5 zXts6A9H(Tz9?7WLtJ4xvF3M-Rpes@=(r3D$A;nv9Oi6R{K{1J zuv;lBs9gT)w4^QAp!#aRq|w7$_ON&UQIVu6)_yf#a)JQF~}ZH>`ih)JjYuI-`ei)7+P3ZCA|$)g=Jds*dBv3EP;la#c8f};1D9XzOh}Pp zNlxE1!vGdlQyMsuoMKC&1%@<8vr=&uRYfdu!))rZ1@6S?;R_{-cwETg6sow~aTtrt zjOwC;ebzF!gCb69mWP#soR&qcX-l|8?!e5G__`n%dOKT5*5cH|#Cyv=i5&Gm%1-=q9jWNFl~B8Mu+P|`Du)OqFW@PfCA2#}=7C!i)^ zQ~{uIFJn^WI?~KP;`8hS(lPT`ld@%l`jYl2=SslRM|wE8QK89(6p26~<%AfAlzU2_ z$%BZOMA2$S>!nOjW(^2=$&g^BGRdPvMM9C)i=ewx$qIh|@B9sGw{~&)DC`EGy}&y0!Q{;&_|mb8enftHAX- zG0kuOd3X*h@cJ!91vzn)l0xC_oTePr=lO@#4vf*Osm5ueAgwJIaze0g|Ek}cJI=a4 zV=jqL6!D^&x)_Tg?Kh|j!6yfNz2o7CYa;>rB(}bS_jB!EXnERG`@(V1Gdct%aYC=r zzo9@I__8P|j_%)Bd+O9w>S3Q(-OjzreI_%523NDa4@Qb4UF}O4Ei23vs|=8Kwjb`m zi>f5vfe*fNi!OPZyuGW4P=O6BXTJGPRzD7WA-)9(hY6;lBL)#&q$D(}(P)wH3(<(a z*YYbcd7Q@A%PkhkaRkEW+1pIytMfM+1X^^cqUq#1)e^0#(hZBqO~A|~s;=r~F`t_v z>pD@X*oh+{Yz%YaZEx0KHd%>{o_wsaH)W4qev+WkD-n~HU}tY05#Dc^FEwYy*086m z%IM0!9zpP$mY>cQqjTY~1_eI+>5Y`jG@OigvX{4;geh-S#&4#wDhN>Qnx5w5!Ln;N z{^XdpNH65De36ltIE+55f|US8?Gw6?5c^*2_(Se6dWbun2YbFvC7oj>Hge)TbZ?B2 z&9+hfeC_u^SY5R068=mqPYZ~ToZWeNW|oQn(A0`ex~G6%?s7-Vd3NkQkK6Vk7=7aH zMnWYa0>l>E^`ui-LKoKt@2n$G%7ivFn@5C^U6lJ zSkX??E(6gNaqO?IHnGr7t> zW=~CsM^+U)9Pt=l3t5&%n3-C*FZ8uiXr`yjVatrlNt|?ZnX221AgJp`ddE&0v(px~ zrL8Pv;!C3Kxus61N5Kys+gtOPDP5UP7cO$o_W_an3n_e}`<6kOBc)ALMI)(i@#6JR zMUq?L%HhPF(i*zF=?|hx@RrnnT$}*&h>po|l}V0(3Jxd^%JkW#w6*oE$&ps35%Jkj z6-BWQaIPUM$FV-ZF9pilh2t}TJeCFzIC)bh4WS6L2lGB{&YV13wz{kjfttabgZ}qt zWeqHFS5g}{JcumuQ=Z0_6hPVBd^nVZxpv*D0pX_qyGuq@Ixe$eoYR$>f$L~1&YfuG zsl@g^~o@ktZsLkk~w4%AI@4`JT5`Up)%F*H>Y&&!&FvlCs~r5 z>}#hEWwVKOa-Rmdi%jJTl-YZ91NT?CoHR1E7Ths4d#hpnc*_K0A31-`4?Y9&KPu{D zf7p{s7z|)(qpE4N>a$G;cb}(_xJ2k}(z^~^PF}QH1-mC&x!H|oEr??r#19IitR$=4 zjces;_3sRi=c#xoEuB_d*1}0E>?p34qK}a) zTp7pYVU^HJICh~!+^+jd$<*x8W&?{SemV2)UEdEK#uRl~N=UNEY|6PqWjJ=nrXP+T z-PbsB)PJ3Zeck!#<5`wN7_N&556*7)eHxj+Q~c72&%SE%RJ_*sM}u*?<78Cif(6HZ zl$ZbY8SL|}$v|7Xr5}|WRs|UsY=nu5O2~2%yY^xcOCALlEC%NHlN3n(Q?-0S_w{VL ziB)wu7hXk)Y_!SfA*+ghqVIbT#22aM2Bw5|PN%WIrldEkPIIF6hA!mjmu z2Jp>^dNE-y4Qzi=nl;&znX@(P2rJ1F6_2c*vW=zIOrtCXzm3+6pNTVu8~;yg(hWqS z{P>Sc*crmuaV0SxTT{OB{qvy(P-vHX>r4D7T~uzO2H>afX+kvecudWp&sfH(}~d!u(m3 zO0)8u4dpH-5}OX>C0-Hq(N@cBuOz2~D<1f#Di#GobX$pqa3r^_YrS2u4YOn4UG63> z(-JVmBC)-tvrm}3Oea+E9?Q`4G_nchYtrdquhKXyXHW}pz1?95<-rhtdW(O3NnoHN z^&FL;j?YYecE|dzD}QXC>nlCS(~5RYq>M?QtN%69R{^x22epQ9GKaa3=7u_rx`ewv z5gbkd!vH}Ku@aoOB8%BO{Bta6Yanq1gv=7OuCnSpRrC@BkCB}~80KTO;RX9Jgeg-nNHT^MsG zH0As~QTTtxXZp8X8%=n$K{FR6w!D`Tt^gsugG!l$?aEm z`lX6hI?lEDZmE#70&9%CcTPY@_;>%zB&<(aSjuj_vjUF760`ZI z^G}GH;6SZygH^_m8N}YNWe=mLLMx+-fiERqgxhqjyt?*c?U2mV<&~Mgb-2kEp zPrW1*)1h^**om_|6V^t!9&WYe$1>7VW2Mm?0FveY%Vdt3jp9D?M zxW~gMK z)W^b_Z7Gs!UoeD>lOL49+SLQV+-V(x#)%Iyx8z+1nDsfaX8-8t?ZdG0j)TWQ=@Q+O zu}M{UVvb^HG5oqi!`d|msDRS1y3x1Rlzghe);I2N3aXiZvSX(ueshbeY1x73@;cTD?gEZ)lD*P*+M zZ_e0%2|dY0ZPgn>?zFJ^4g<1+wiciGa9ojn_4g31pJJ~iu>Gw2DS`wRpIC7CDc>31Ps z8Ios!h#g;gKrjT86a%%uMu=*#mwgU96b*rCVaQNam3x4|nm00Z2f?8=N&?B@|0C=j zgENb^w%yoHp4hf++qP}nwrxA<*k%VE+crB!r%(2~_gC-Ur}jBtJ@r(rAM4MmHP)PC zj&a}DC>8mfA1jH(+(!yfwgI-|!ZR<8YhgXGjCgI1Yhgc_M{tUbYvC-`#+7lp^5*3q zEl`Z6s2~4!S2&evE{DtbQ;()>Px#3=`C|V7Gx-z=^d%>$&WJe^p41Y=gEd3uia#A_oe6uos80?wRS0ntLTFnYxAkB+C|?=!qcER64E`(v z={X2X6PU$`HMHteoEMT9Go12TAo~uxBhX!yNmoo~KrV6MlqibF2;CpN`JThl+&^>p zeLzj?bQ1~7FhIt+&+gqr$BRt3i z&)MK#I}n~rn{WwUKf=d*W%i(N`R+-(*{MeIAY8>aBKdWW?OUvQ~M zeJGoEciNkgt9N`?7$13zxhpC10#(B9NQ{{a5z4Y;r|PuCQ-F zvI=y+;BVSwrQ}6Pd0K$ogEx-`}Vtn}cdtX9zQN%?naMp@P}6oxJ-nKQqg=n0l>SrU8#N4f`> z^V&?3EGE^7Jig;~ys@3u z5kBHF%RAM1VNAs5BU_P<{jB+@$DBU|kR4o#F($Ek#&RTGV`bG&48sPKv`Ee|rQ1U` zh(=!)>f=Z1r`3MtA9iGczB@Kv3=1s}W+%8!b3$PT|6Lwud`noJT4{`wyu6^)@=_y; z+wiRVEb0?R<~#a~%rM8SP)DR>rqw3~k$HR@6BLLd|BXLqz3951WRY8|r^yQR;|sjD z?;d&ul3VM}s#pEUpCtBH^&V8?oON}!d<{)elZ(3K8`>XzoS7gk+x~^TGG?)M8Y?;NKb|aBL-u)xH30V?j++KmY&}B z`0RJ>WAHKL)1SYdcGOzO`S!k-^=2`{<#HmBktXnUyN(ESH6YM~8MrS7u@0dd(Jh)u z>`Y9H?1jui93PztaB7eA5#6FW;75Lm@e~|kLPm`ClpGlb>7(95X4o)_^h}*ixZihT z*tiSDP&lCC=lvD&<9;8D;bx@S_sI=-ymu}B6pVNF9#-Es=_}P*_GO$_g`*r&@@D~) zbGo&ri8b{PCRWGwwa8fonEXTs&S}CcSaAryK}-=p#)Ec@9U_CR3@EX15Fr%U_o0u; zh*I)5iIRCi&U~mvF1(C#WP?~%K9fF5xgkwLY@GPSr!GNO>?medG4Vr^l6z6Ys{}ZB zmyo)Wc|&5PhYxWm^3M+`CM1hWcnNzlp73n)Z)@Kw{B~DTQJv4zrT3WROhFcDXL+H$ z<-V`CFw5bEsPv(&X|i?n&qXeJJMUT%Zl-oRPBUw5ZMFnU^8jWO>pvl0d}in3TDg%A z5aub`D+^Kl;prnS=5NkUba`@B>FC8gDsUm&HCJGR=*k`ytgXUrCI~B;JYf= zt$x99ilr)*(%P*UuXRn@O3Gzt%_IX+G5xMmXEDd5*I5LYCZIWN5cBnTQJqRO_s%w8 zV-A=1z5bPHC5^&|u|)Sv^*pI{n-4N7Zltu_>`zs!5G_Q_h;b`UvzE%#ab*9oXf1Ck z+{7`3^WznrO^laGR!`Q_^965W9SulZ2oEVyGy&9WQ7D0t@(}Qr=$ipK|30ZIXo0g9 z+e9-_-30`)K;EQmB~@_?|ENniI{sG+Gr81lsdZIU3#vO+7KfZMhtXQqDV3ZSwM@2o zrS8N@thsYP6$^_OO-?&XcG9#gx6{v@s?cLwvp2VFD|1=mt)IAN9lm53 zB)YZ9DR9>`B8-^@*$a{Z50y@#vY2?Nxy3YYB_`#f3vPHQCwKLsq!kp=FJPaVLsqns zo&|^kgIdrruT`N1POrc-%&rE7%G^`eQ8?dzTqU|w6K=W|OsA@B6#sYws8_O#1gTem z$MNcGTqxpwQsA!iD;_zxFYW%zYe=91>1UG6XB1+<$#6xc?#xWIPPpYn!;U$H!+Di| z-yp-cvujlw{QSWEp@FHS{Bhzz=~cu2)z55H?nP=(4(Agxy+(Fm z{{!Nz^8S;nh847oIyX&m*)v)(w_DXzOY3a?I`c%Q8oNeV#;IlJX&VEV)uNt}j}Bm5 z{dosM86o{WRMcjYq4iPdtYZMuXu7Pf6T2y|V&+DWYptFy-0hpeo~ls+-AdOfP=4x4 zV-kLi?n(sHp_&C^-`F#YXP}dU)>i8_lT&F9ncGt%O~_|MDcp~F@bNazfAk{|Q%QBYBe(C#$#XhG#a?>6p-F<93&k!eAwf{c#r_Cg4v@(5K zad?Fsv?-PWcY~nk&oHqeU<`c;&mXWHNIR!P`a>Ujn#8`4uj3QuNXW%-zr#?_gEFC72 z(%A%fIJ&0~sGpbv;21*8f#Fz3>_BN)K|BRc8NH<}m_gi*-r$C8cNk+yU@##5mh7b~ z{bInKAa^u*;&QuTpRmv|;r^!X{K#JHm0QUT1xtk+5yZr8<$*7V(hmH55%}lMN!!QL zzT}P2-UDCP1@?Lwgm&8pyVY3_nRvU)Y)1SEp=(+wIE3CKQBxGBsII6lfv_P3>HTDW zAGgj0tevZ}3d#z3b36@PcmK*WCJ|$vOP*Qp;dKjy|MrT5cJsFW3Ny5X z?0(0K5^(<{26bCB3;av0_Eh-xa58!zyjbo!UU4^K#)tqfFEoN{yvb!NApbC(I9qyE zUyW&9TXc%pUHQ>n>9M}vV1UgfW=${Z1cNg9=%^J<&e?UgQ<|}$A^<+9n=+9cd|^oZ zs1aOZK1}QJ0ADxGrxEf+sg6(Z%`f(QY|~ayMA1Gn%u7iJLBb&uZxF^kn*4!P?hp%S z$oC|tMJL~HmpK~4p21_mY5zUSS4hS^mc9{w&m^`}@PucaUeKx*!H%KN9r?pPojZ`j zrj#qZTPUAung^j!zQ6d>BS5+sdx5IXb23#WR-Kw$m#Qu2>x_dmuBY6W^q1w1rukt^ zE`0GXsoPE%tf#g$o;J|r66LPo`H;T~E)~_8pyiBu%&QVC0yR~9t->xdWm+opykNbh zUM#;_KWjaX^D69qA)K}pYpGC+_HoCOu&yYsJExApyBn<<^E_Q%R(0=0p}sO-=MAQ0 zLVghZZ>stafrRo1_-~@`G?n6;;DG&K1QH@fE@uBsIl}%0X-H2erwcL`5-n0bGPX)O z&;wSY#0a8}CyYHi3vCD!%yCUl-T(1=RPuw9#7x}6_i>Qm*pod9oGN3+^u=}d_+!R{ z{q4``hXRm@C$bPMv(X46ZThBhC+eWyR*IuQFcLE}e&nB`SP5j_vB+4ZBo<|Llzgd7L#WGVwAq^D;NgK4Ok&?3rcRqHav?=58SR`5)hh_?%-L4=)2_=rlStT$ z@Y`4xnUeV!nuj_kqsl^VudYEDo%^x%@U@I!%_k7wb531D`f0x%7x~ta))HfL{8EyWA*k~;W$(s z5FL$ENCF)3rMWw(04Wfiq0&%Vkq2^*rfMT>?p9V4ZL#o`BSCweZ8a9~<+W*Au5^1_ zWoN_QTnoz|PIBoFUiM0YsA<^;ZRY3nV1sm7W-^B?U2_z)u9zqjFdIx|h430^u0%zJ zfDAHOn#@63XismyYW9`p{p}bh@L8sD!nh|(RaPP+eIXQ3SA(Cegm9yXa*;sc-W>9! z$CdqyqLxhzBnoi&@>*S)Q%0$u{5 zjfvXSP9`Bnj9NU68${|9Zr4{HAwur5449VqTBFxUF@K}@s*2E}f105{6mU;aEP%K}y0~6x_?9v9<#GN`AhIv%{F2EChVKD$ z6RB>t2pYzQ=!4 z9{nS&7v7<7r~X#lI()+#c>mjn5RVr!4)eEd*6#Dfxx1pONd zi-ADMCVV`AxFF z{DE5*FC8JL2r0(G54j__XvG@^dj4=;1(_@A%<1GHp#V4w=_n0Ex!S4@W!rfzLDy+F<*DG)1n>m^m5W2U-xL(WX;>I( zg{J|BSt%pJfKY$YG3I#qccVB-3V!@_F#DmfSqKWk#+avn?|EcvyQ(a%onr298x&P= zo0J}^>PpZ0)^2IdM>e>*)f=o~W^i;gF5Mpr0GHbD=v)r3GJf@p8%Wi9n?YlYqBklqb%}h@xa%2ncfnw7kvD+&LpFr6U1b#9F($&eQqGdwLSJzY zZK&Ky(OV=`l7NvN@~VhUMfKKk(%z7s;DqkrH`a4GYQs-3Q;@@!3a9YeQa!@lX=>Cu zVTu=ou4nx0cO%5(O{Pg_@v1#r>scj+!V9Zzrzo%(fq$bZ|04#8bKeI4p@Y5u_SgS6 zmXyeUi@|@c_GxO{%HRA1zD;!yqGFKZ;C{+E^rEle=weN=7(gm9^`dJA@~dw9P^=P8B1RjLs7n5Kwz{Yee$pNb-q*I-R}ke?PE#;#dTh4Hk49-Zl(uJvd_5?w`opK;R52#ZL`UIt)(SVNb|Oo<~-(VAjxqu zk)^fyXlh$~hs03Vlk-cmTcMC!BM{?k%hg6n+{uK}#JhZ8=cwgvGWM5OIv$Rr-h{~*E)I<?&>x%-sa~(Y;3)sTl622B!UVf>j``4(2+crpUd)q4TAqS{6nwUhd;K7Z)F{8y?GilF&0Aal@pn#g#E$o#iJrgY;_>G_+yQM_Zpo+sryR?zKQ zRk&Fw*oj8NA#%wcO7+Q5FYOIwOTH(Lp8*2652SBJt-ak*J${#%CwCl=RwBJ6WlkDhN64ZmZjwx~#7&8?Z zJK#k2Op-j2c?8mv_=&0}z!tB(%@;{QFZM7hciwJ*ya5-8xl#3nH}fd&bcN-rE2gK+ z?yx-)CE6o~2?N9z6#SoWtsB$k+0YG?#@WI84R-8N7IPu%%HRmj%UroHW>5BnHRBSO zqrm<5!Tt9TR}o+TuPvmTwZ=5>dkazf-a?4}>lR{XXJl_GYi0kh6wOaXOXb_L^Oa5` z6AQ9`Cklxsr`UvB427O9UTn!(t5`%!V45t;9^zAKP9fx<&M!Iz=^rRC+2nx=pPE{= z6RK)8%>N;Ep#X2DaS2)?Le>#s?gSp3JfL|{qC}_f0 z4SL`CNs6-OipI#yZ}nK8Y`RI@o<1W#C~7IikA%&m`@}eDS$Q(csr&NoFvJ(r{RH+nv$Cue7N;mOL9Wbd4 z^`C-3Z}R`6Db-!BRh?@d^Y9>J`-5Cl31Z>dEe`Nm&3_=BsGKfLpfWy|&w~(S3{oyi zsH&n0rN3LE&-flurZpEe)u1PFCzwd_gHf*PA!j}AdPrP6V5Rn|o7hky83rp8p$>pG zH!K5>$6Ws&-MJ*Mj+`w+QAkbGDUkX2^Xm7{ByJQgjtf9Nl}XB(jkur5$HzykYoqk_ z4=X)`*4mp|=DsF6(AB>zeAZqbnBvHz*O$+68S-zuCKNM4`>aPTo=aJEU{;xm!nSm;vgt@ zjN;F@TLmT2CE!kRZI;9){jlgCd_~EUILD0~u)r)~nRg%HB$q@uV6Jx!Rwyb(LhkaX!F;f_Y;C;`qaoj3B3#5+$b_S(UOa4?tfP$9TGFP%3|YV-07vxK6iNURG~!1%Oi<(*#jyoTm5G z;o4E5OvFNpPI|(FvtyuZi%Y|su&J?cEHxJ$Il_IIwk#q$K0~Gwt@~IMrlmL0>L%-H z?B+KNBh~GUx^v)M#*Uo)3+PvKMP?WmTfhUhZ*d(vE$~}9gI#EwdmW^8MhDGD_}YBn zV1JQJc#WstcGhafAEjk4o;!YX#TT1AGahNNP_;G>M$+T&m;qjyF{t5JonCMg=pHuZ zj-hhF*zs44rE#BH%knDbc`vk99(tR|aIqs}mM*g{l#Q28wQ*cgG6q?ME z68T170{KiwV+zln6`SmOecLDg;%kcTV!!M&Vno81oAF(Yr&i_KEb9+%6EhB_F67GO z(#1D*TeeIRY$BFk-XVJlNldP;a`!n_Ds57hMwe(OxwYly1!7pQr{}AKko*LT9bwcd z{YB1T#fVHTbIWHS*pUa(4?M%YqM7~K=}my|)M3)*FJS5+GB5E#oW4S$y{Vp%q1ZzW zHAU0K!)<=X{Z!^a4z8y=!jnyKsel4_Lc_~79RQ*|S(MHA=8B4< zFY}e)IKrc;^<@=`(c&_id6Z|C8gk7TE>HgLy!?-pN;C`VNeK3PIsqmS5cPjwlO4a? zIxY_OVxEr9W-cz@3I0EWxK0!Le@gZibXKdEafd&Vqg*htpzg~!OUYPg)HXTyjA;hd zg+)|iX@3B~y;dbJaa*X+K+q^#1Yy~rGie}^2%$xZpgpV#t*FXc=Fq(fTFT187H}+g zr|V6%oB=O11%2CDUJoa~eE#y7t4r((JaPtd)hds|=&Hmb_~!T5t2yEI4fq(SI`#(R zc)o~(8z|qIfpbuGXbozh!BKUH4XT50qHR_0v4ao8*lRdO1oHs4%J%HBHqEZSXK$}k zu1##}eYzz?TXkrR`mNO+`12~pf_o~K@jd@st1%|PKRAluGV6~Fp2-URL!HmakUJCpgf-_I7hg9THs z;2{-HS7~zBdT_OIM#3>xq;(BObuiinJ#vCGE><%lb5rcr$58807Yd>hcTSN-_IaGLLmLiT8dtAx0 z3Dap-bmk7!#xreW8g|G>(KTY?5Mu;at*A_7v%9t*us;wvMux>(2FvHMXNxnDo6{Lx zRWVTX9qAQpe^D!Uj$SQek++S*@o}#0mQV=q=XcC3Gm`ATRyz`pjU&vP)y0uv$ zmgXf=)KVcguRLF>(=J$xPNaryVW~R^3}4ym%iIz~M$q*V9l6R^RD>W!K7d0v4&b%3 z!=G)*x$Br;vRIBDz~|<1VpZvs;#^{xqqD|ze9uSZZ7f7M{}Y3fy9ywpq_WiE5Pt;5 z#|`z+Qf=2B3bz{hNj5bN)+kqBk3}ONZ8GtkDP{zq@LI-IZ|&Ath15PM7iw$KIAx$l zV_^#;SvL#);8LC##J}Ncox+tBeKcdjrv{jWjo|imL*Vr<&BZ;ig*x@c8d$xu(Jvzb zd)yt2g54Rz^PQC{0pdz2p&7J?cVm?Y+?-Vfaauh^>yhJHLSMIhgCEAh1p=DIas_TW zgzsX+wMkzOg9A38$n!$N0hg;Rdn~vau$m8s1_k+rv<6nXhM72U0i-6CyEB$7`>S`{ z{w4eETeNunDfi*wyN8I(J4<&Gw)1xswkvn&JLN!hXgKa5kx)tZ7Vx)w4A@`M{Z_9$ zUqpum%wJ{udOhQeHo8Xj`+lDvnA2Kg426{sIOWG{l^;G<{O24WpS?`+AmE(^78AGu zJZk(*mkCi`aSayCDXi)vx}gvylU!NDH&^As?k0Zg? zk-^8lk_YG}gdb`tWj(sgKAo*V=y80mKrA{$R!XnL1byEj>BNstpI-ul@w)0f5~{a^ zQf$;e9lyAS#;#@#z|IMmnV6;ST!G*($TM0fOrgj+lpnV6((jomx3Pto4Vh{P+b_M( zrNYjMqVbe|Vp2V(cLc)OM`ue!=xo};J)uYuGE3&<-46oJE1-QcSsMGqwy_XMLmg#a zZ1Od!E48cm^Ku}CEX>wR#dQH^Xvsgu#8vNN>J5yHCedgr!z(K-3f8ACi+iPQGafy6 zaZ|5op>qe2cX__OZsdmD2hl#P@lq|2$y$;3Djm=!k zP%E!K|0$4)eTl6+lb7zYT==tYMu1|xBQbUEpe6cKTy-s{#ZbJ+E7`G@4@)`^#sWu> zBWiv5&HPx!dc)T4tq~a|gK(0hxTr@febgRcnPv7}K+I{+ad@MrtqCg<$Og~k6e7Pbf4?c7jn%r_HEay+& zxy7_&%%FTXG(X0m{7wny+xEoX47BPH;Gr&LJ_;>>M!~0to)k#6qQPs4kN3K;WZn9^P&;L1(#0 z6JL*{9Om`gnKA@5G-t3%qpG=a@{F$cw~C>bJh1VC@ZpuRr(UZNGKX7Ws6yP+V zLw!OK{l?5BUUc3oWin) zBswPTN`D6v)xt)S3-d!2ejVmx(Y06Gg?lwI{&q-CPKA;& z5pPGO{N*)CH?h+f)>f;q|A?mD2{HA03CF|IWMx&?0sf*KD*jer_USo!+@kZX*Rvf>g{yAYl(9jOsc zR>c&BUm*#U%S?!ANKJ0UDkwkNmUX*fNmax+M0t1YfY5QoqaSD24dQVkbKiGai>Yyh z(m15b_Cw@ggyv|1?uhboV)5g*HDg;FlOL_Kg|;`5!!)0A;<+5dyJFrNtsmdE#oS!C zzcNHLrtpF5UVG?>=neZ=>t3Uq=rE`r0aXS(OD?a`{2J!BLdH+txNBI7Pjw~3PkY{T zI%mvJjo-667vm-A4JTQ+^py9;kq|rQjGizR0fJb+CYOn)*pvhLLZODkNdCjD)fC6r zVCjxwPfSXiy&Yo%ogkmhC(7#94G)iG&C zbup4g5YcaWodOo1C9eoAZorVEhby3~?we6b=JBGs|=A(wXn>rW-?peA{Bh9TCu!#+54%bCfDUnT~n zDhnnC&Wry5NrhCh)UD=3;CZ1$iRYx&gbs~B*b^) z>c9E?zYmcAlYg6;3fnrE*!-)isrpZ#MR>YB6>O@qkQf+PD_zFHALSlFtJX%e6n0EM zrYYv7B=`39ZT5GSPw<}CLUE$`5eb4%r7@PxvZVz<+h!N{ncRoG+iBnC{=dF|p$(B0 zgrP|0BZ#J-jPPNJev_3sP(|8&^WzH%kw@UI93Y%zHa3N}l88J2TPltPL=CiX`@E)^ zamOCCGd0<*Q+1{G+Pqo^%i3Ztp5;R|TaL>2au5LplQN2YseHYB~c$Ha9 zc%v-wn6?BQ`0yyyLrmc;4-}=$@H)aW!z?1*6M1bGSrJ7Kt;K3)QIq>mow_12nrtO` zbUYbMGpUO8z^y3ynvl@uF}rOPdj2PxE8TU*x)bp?<9iL&e#;fQJc}?_F`j2jrQ&ML zF;IYoll-6vAmL7PFgjYTR895}1r$@9XX?j_hkJ(@S%!rxVv6%>qLE@o%5`6DDAZ-$ zkcv)IQ#4J-B%{|Pk$cn`Cu{hW9ddlTCz@Nw2ONn#;*jhK`$kWTjBEPCHseKnCDbXO zTP@aRcB|jdIHF7%G#Q#OR=4iVzXht?t@o&pLvx!*ZG<21k2Q;}cSed63vfOWEv@n% zHObbK5>3+eHf$Pwz;)_}5LPz)?z+0;%WJ%j2L!Iu<&ZLuSx_Qh-sf22p`pye4qA_M z1W;rM11K)La}QbOe31*BPy}&SuTnIAKlk8%iRa9lj_bB0E)g36pEAkYpgeGy{j9V+ zpz-!MvXtLoxNG!#<(V&7kf4&#n%$Typ?jpHHw>O*Snvs4A!ia}LFpRL_qoEzPJ<|2 zm$=3ECJFjPq+~!uihaB$VUtX@1_9vcT?cMp`kry(U&r^{kJbCOzl#6Qyu9m-i&rVQU;s|V~8xVWvra@ zoDDiPH3t<1)UHs`a#20g#2Z_OIeGd>j{6b(b#n&IqCD>#$wcljmvQc@p$rvAp!e z``8M2vday^@f9_d1U-lK=7LUh`x|=AQTp{o*EQA7_?YQk$!~CRZRgqEax)E!8v8e@ zeFu+Hf}eSgG>+H0oTAh88D@Dl*o&p-HhiDKmWo16fWWSz#8rNse#aeM|S6 zg+3Y(E^UY0(Psd?ALMg6cr<@ZZ#ToLudmS6K^3^VT{SoDRl(?6JIry?q8}*>QMi>{LpsnPpWlw4^wc2IN4v?TnE?aSaNQHvFc{>0<2< zHIu!4#etTRAGqlmUF9Rd?Q5Y;qWM6 zjqySJf)8hwnnen)!djKAAx75rc9|t|ej_1uK9rbq29=Qf5`P90x4ag?sS}ItNnph< zM2$Hc6p2k{!^j(V+k$d9hrb0BiI+%VX_~-cTWQ56g*ohyPxK{i-AeWdQpEV8+Cer* zF6$Ta%{E0X;oz!!uA)qs8FvbM;YVP8kBb|}6o*pFXN*nBC*J*dv_t1@X1eS@?0)$Q z?R&!&k75XjitkCYCvJ9%^k*hTT${tkV)mLcr32XNsyvo1ba4aY2Vy9J2l=IMuBP?fyLS>=Cc{S62rbM%bPC z*!dgcmC(BZh;{0U5Cpy4IzIhSNj{|Np*WNsXBTUDxe+$OzDY2v5X%F!74(7tJj>3% zcNYFZM!_8Ex61jhUd@01N&jmV%ii3|!p-@A)X7Z$D#FIf!3;4Xh3&p#=ycEZM#8Sb z=NA!nIM1V&8fmMTz*y0EvSHv4h(sxI)cX#HykVaB@H%(^QK0}6A)y}hocEsOHOgw5 z#?i1Kk+qfx(QucS<{LGsNVHv7^oVGYtxGJ;fo!ZU#l@27_$$qSSl?H5Gtf8)6dZ5N?EI8G0X4GRL_Eozfs@@V^V(KOSz2K~LN7TYWwIogMr) zbmaE}_rDJ(W9Fs)59XDkk=4JN?Qu%$(!<{@pcHv*mBR(?mpa5?yR;KfGy|AmO;tr0 ze)&sH6BCd{@J||WvAaRUyOJdz6=bWJS4NjrmziFcTY?`BK-6o~17pRoQDlATc(vS` zsFJNuy@K`bHSd#%YD>QraN4`pw^18DsIRPo9{rKPw?Tuh4=gt=%T+NFmtUh3Sy~Af zD0;iY*)gh-tqFFM87Ed8Xn*C~pWiS!q%)+CU9$^4y&LvUdu_4E`C;BsuJ4utAiNzL zZ;0T>hrw_maX`uf5{MajYULgDk2thHV!*)PNpt*XgyUN$rW$$I(eN;^pk$Lhr0{aH zsQLv{J@SpxJPMM$WefE|QbONCNe`uitgMWpe}@6XE&c?F8fPZH*Ze8n;IhliuT{T( zOreP=aAYMf%|rAE0WT2x*0{ICxP}MX##pcgn@KiRBV9YEo5k>-Z?fJ-SQ_k`0NslG z-}&(W@g`NwTwSf~EmXc)u=W;;--`PGGhL=m{lf)y74W6rm2TR&CTxg9B7$xbOABp_ zdl*QBFcxlToDacM&T2|lR|l?z(oJJaAqOh8C=3dHBot{y9MQr_L`p^nRX$yskR{7= zeP{DGxBRqz<+rwbu4}o#m0zCE>>+!6m*|@<~ z!B21PunFb1&pU_okS}Jc_+NR>d%iy%P8gL=3Xpgwb zY+Vj~aR&rK1@)hCBNws5cY_x^Jxduu5CG@=p zSXgSx;V8E%ZZIw6YpRX{HkA`6^l~W_9f1gp%ZlRQo{vMoO*&6}JT%5yawT->)*w{k z2JJw%H}{#zOiQlO@(hi*lxuDmlUTr0wXHkzvf3;#$<)>0`U zH7@a!sqx3K_D}FM;kHB52Du z0~^A$u=OK?*nHwVSVfncG?tiwf!q}EG*$9sY3mWmOrA5jN*&pxK=|hiMaDkAFBp#F z)WiE^2{Uo;+>FaNwet3i0+)#_I3g)6tuwytcGW$;v{brW;52MxlMvKG5PPL4AM z#Z6T>P3C7I)U$eA%aGgAKe#0Y=}n#A@=N@}qzINt<>a3!RsHpHsk-nJRTSf?e5xd=29EmD&_2_cgob2TVRgRqwtLo@ z?#mTdojWgDmu@bYn-=nuI|Ifoy7S`{nfWj*a>O@#*?-^Q?TFj3P6e)oiB&7fT`ml+ z6J@Iri=bjrGvwh0b{UadGzqt8NHH~)v@Cll1y)Je!}kVKC}yvRT znlR$qeSw;iOxf+{O#sw9RQ}djBuvO2I-i^4i@p$x_I~eneYIyg;CrlrQinv;foIT( zkycMgv&CC!fT%TzvoywO$O51LCG43VHb1NFn9CQ1X)~<$jAq|Z_nK+Pf^1!~wz>y! zMW&A}F*G_Jbh{GfFghM(dz||jB&|DY-}LPxX$eWH4Sw%skvwoHos#nNg&>Syj}HWV z4njdD4>MVK*#w#}L&l|n2^%W0@+V9e&r6N~Uy`!A8&h2tZ`}@|*5bg|LgK93$I4V)J$P0^?16dz!n{tp9(F;O5T|0ssN?ky)pmAT-uj9EdjMgY9zcoI zur*UsAF|9WaP0Am6#FWOU+8|hDI)P?M61}s&S`y93B8JLGgIQvU*MrUcBq#@1tkJf zC`8my38*1|ur(%0TcEltFIzJa(R@_NhJph!ca+o2SXkQdDcX1&*+CB4pa4d|U*ihd zOdjZ3px$CXQECccPw)>p?>v$wT)`TzZG4QBy9{HLzEL4uYAKLE8`n33@H*U#JyTCpKkYt3-_D03P_p{W$+T9JM& z{Hx~#^y`8$Jl}wip=UClFQH&Q+X#N$3wSFNlcQgp8*5YS4jVB$w%_>KcbC?S5+ilx zLNZaVvROCO%PN=OR`_x}Ac)A>qFQ_LeCL0kr97lzPPu4}PA3vpDK~#ChIy5o$-uXU zO(z1TXdwTpQ19&{!G@`DG9C`XnGB|5U1?n>+_)ZB zS12am<6#n;zRDFBD~z6Z#P+wS;H!49z|*u*5DrCA6!We|?*Q78)*F;P+(y}AmoMhq zvzaLhvpq$Ed6hqzL%Oq@G?E)=XNpJz-rd0c1U8_AWZLr~A9vWFe4F?Ey=_q*SJip6 zW~w)%)qXXD_E1t3|JxmjMjB=>!>pRUB#^*l%{o1FRO{(wAdacrKmAZ{VPfTncC0EnHxApe9t!eQ>>N;pko?m{ZUkHC zR@7VSTG}Ra_^e_HMqY)KQBjMdmdM8#=vTw)!}ywLH3QNOHbhYazBNajKDw!q#*geA z%{)90)6>n}2K|2TAch#NaJ;r%YmD;P*MY6rFKND?3C4!BLsM0+7FWSTS_pb4^ zoPROy^@`M&>5Y$-a;1OE8Z<6M!*11NFh#VU6+oF7nN{J|Eu^8h&+hjX6AweOKI0VK zOg&2JcAg0gFH$A%{Z&U~CE(%}O~Ri#>pCe}0{4&motgXhv`4fK9`gZgG|!kY0Wn6B z?fjH3w6SoQ%yo{Xp!cfU!Wrdy9(Gk)rjAKQ$E!^RvD|n?*Y;sU#wRet&~AvZTB=SQ zGOJ@ALd)BK33jmD%ZFmm5WTmc{u1WPzS&LRX3kVvMoHff3RaSYUpT}Uv6^JJNV zOrO+p3n!1WnhTU+rI!h24BQFDnLwjSuF2CK4Y-tJ@>*b@hy5*|>^=nuHWM&XVIT3r z5lW|^7a-KrO(4?SiX_sjHOd=cKd`qKZwe$^;L7&u2obw*OJm*h`?vD!KMr9UYV2*E zgx{V586Y6y|4WGdGnDGQA$@U2pZ@wZC)>Mex2BlsptqTJPFT}tqF{kiTYNM`D>XJk zN2a(YBNp6@Y)^!td0Uc0AW-%CWE&g`r4W289X|l7c~jz4mf+x3_y} zPt5#%c#+6o_u_dt`IzkSV)0S%_qhcHQY=H`zBlq62}_-LTKLGd3+K(?ed9cz{R|Fa*t38}&VPO$=tWs#@}JqX=dhdQ-HEI#<`ivFJWWHsYtV zFbls>*v}KYs<+!PLJy^DCpJbQRRafLB#im3}@ERcBU5TYYMZI*K(? zm!ldh4aH%}=1(Xzt1{(Wa>-Jujq27ouwmJk?q%i_^y2xWu|OkCAFRFQIj7_l@hQ<&WM! zbaP9iQ#x-HN2!iThH9ea>$_Fwe`)%CHc^1yp!Mq3x zLC?lasXBF1*BkO{I9Jp#k1QW#!!@euPK`2XmR@G=K7Bqz_;)4cs&0*pQq$YJN9&B# zA>7N@>mG-Chy{edrp+9#elAUo7K&_*;Ynu>J9Knx6Zv0;CXBMv-|QX8)89BpUL!Pu z0wb|1FrLA#g7+jvG6W~CUc`w18QfX1%$!WyaU8)Ym#6W~(eMHV?Mu@aV54Y-T!j?D z2@yAVDW^9GSR#NS=ETXqw8q}TquH`S(uJ?^=I}fP?-|_j;_e@X%5p0*B)xzaCld(W zDt{i+_K+E0I7uJNX7@96 QtldSq-B~yCDWTx6LE2Xu$Wh$7dxvIFhaZz6S)ycfFuC}?gwO4N?ExNX~)7I1*C%($I>XV&*zBF-72ak8N(v_ViTdkwN zxNyM^(V@Mm%{$VS&c(*Q+Kr=)++@A6naz{V-qKFbk;u`h;jz@_gT28kho{^V|E;TY z`5yg~shZr{2mySF7X1!@vig4*d&l5N<8AGGVs&g!jEQaAb|&fAwq~M^ZQHhOOl;f6 zOgwM)+56P9&v|y$`+VpRUDZ{0clG+;*IMgd>vz3x)iUA~3+oQqKG*9&o}U5NnYm_aX@>pRGvrBK%egX5g=Hafyt9h1czIr!{5e}X z-xP1MbG)wi1!j7bvpZ;?Vye+)#CQq&rX3-J62?w8jH`PzF7t)$V^;jltOI#ra2dyOKc<=h?N1k0+L56=E>BfPHML zT=dJ!3j|xs>CQw~-_;k!P}&Mg)X@l)3sTxt7~Brroqtp?-0uFwci%xC!&KC$Y=T~{%XmBaA9FK;u!1& zQO}odtxB+;3&Na)+TFk6>EPjnRu-V3JlIwe-oRMAPpr)DMFfH4Ak~5@EOQF~XitgF-bKEL!V70v!`MEjRXW6W_eGYSAMIMe zKl@z5+g0XN2gFJ;w)+nDBk^eZUeabb)@tc&5~Z62lG*QHm_g(kdHW%v*8^a+b5a1z=J->sq~(?9`}ZuTk}Tg$rnBt0$7&QX7s znA^GvEQ9%`Q^9P7Pyb@gYE1-p?K@`XoD9IAli$M{IRV5{*}cZ1;1dBFA=DHr`3(!#dfiU8I&5mCQkkNDDTdM+aJ)yy?k`@6?Vsgyr6sr>Y)hk(hZC z65kdC#2Oq_y+(G~mL=MZ#l54V@VA8;w}OgQw@va@*0?z)*8K8ROCPiScmlL~!18=H zQn}~T2N;rBfB#l~BCm&}!k17k`!w6`uKq!rqqBaIi!^`^HWVJl3eX1LSE za&k$QMYxBo!u9Bme^Hb~=gdZw*+cM9iHlkh4li?w4m|yl$)rlW8$)@NpIyp$5d~VA zrNrNV&-2XwT4fcmfB$=I7m0fVovn+s4B1nzM|4A;2JZSMOxt~qg?TPw79)GaG$o|f z%hrRTVV~Pdn<84rCgaF3bn>`JAd!tQb^vU-Q#@6=z>za9Ma+XS+dDt&Z^=^uL6u6N z7w36jF#`rHit*;vGtj`mBG5ij1*vgHE^WTQo0^+;wUc+S@7Me?F}x%hd!LcZ-w7_PNeObfFk-@#;dRiFygBjf=qO}p*q$r;a@Aw3 zy6v)5tA&^P&e?d+wc2#2e7xEjS}q-vuqI}PilKb4WV~iE!Wj?|Av>xjRBS$<|5viJ zpB;%mXdfp+T5%=is2=*O z4OreZiEdPc@oQBAQ8D)f=w=;wF!%iG6bEp*RMC<5Y!J+z(;?oHAhU4-J zCY)SS(IUzSyHmq?mrmQVD2cEYE%v03lJEuL+@B)J=_f|pe!(3)cZrmT;rU!$oXnyJ z)41GRoGdiNA;A@p*&LCz74WGH@MZRXHfjfkJTPo2_77pxJ>XL;TQO4NWQVf`M49uK z@k`gE5Z|!7SIF{6KaiPFkco09LWD2?;TMxbdAzJe6cCHTiqHFo!2-QA<92A8H7 zfa16B6(5wY1w znO)W?SVH|565#=-D@?O8Ci^b5Cp>IgHlJcFj-{&2; zz1Z}|;_k^Acv^3q95X%i2cT^h2J!b4@s@!6Lj!gO$6tUy5@__Lq|2T48yRPSvD^J< z@YNq%U+FdFJAcu`*fyT`=S8J^gpeI2c_fK;R)h)O!`D0+C}gpzm-Mu(FCSjt#{<3M zVkkRte0CAP|F)9vr23HQ81tWs4Jun--Y0~OHCi_Q>Fg#bFTF3=yGowlSvxnl-5Te1 zc67pnM9jLUS79MrJ$I@;GB(a9SDszG)SO<-(?ThLLCih4&3;?w5!XKsrkIM?TsI}E zmkAniCZa(`BaAFAP|Rjv>qI$c-xvkWKnIxEtqv_$0U@71$o7(Cf1_{NJ{T(&lHr6` zCtUqTE;eF^NmFFsh-&2hP<@L4^OKO>%bhk(f8xwwpyK{+vFBWDPC+y>dL6Z&a#fJ2 zK@t3+;dUdwhu{Sy7~sjjbzW&SF}xEEp{T}gN+4|)=@R~Xit!FkfE(3dz)Uz_ZVB^& z)}lnKqrSm2Gi{0Xn2#N2WWS=RFNc(_qSA-SdrW#u%;QWoy|O|42x&V#&bRk%4FT!Q zuxi)TgPRcFb}BK9ZumPKMsbQ4P1YGhG)PJ&Sq&Mwkt3DdSdg8Pp_o%392^4U_pe+j z$DLyj8siV1S+cR5W9gEd6c1TlHY)?$D9Zk{?dB=-$?Uk2`-SW20Uk8{`HqBMku^qz_~J@? zd$ZHEAd}9dVNCkbqSB0f8XB2$QR#V%kbIs*7kNh&3w4$oYWZ2NZ2RGPb_(>G`5P-4 z%S1W~T~#OQ8``$?y}crqzIL^M^T)!iyo1>(A(~1S;V~-vI&KQfC)thaU4_E=qc_K) z#%Gby6)G#PO1XTT-l4AXgP_GqNs5f%l-@KXaMmhq-b3lcri^csd!(L6mTjvdzZ7Ji zX($sudCQpK+nH=Hq^R~ajG#%Uj>?{zWeBd|vDuV`I#}a(39&v$OL@_X4739;ciY$c z6>PCH-E(b?>*{;9B{m!bWI`FRU%KblRm*?USE?OP!0f5aDUtUoZoK}?rT>P$XC;Tq zY)*CqkKf)}*jwr$Yd`;m9QZaySBNjyv&j?gm(HYwTxTC?`?``VGX zMtDo$6GB~;i#t~0IDK>j)8U(u?){`2Y+fBA$Omwd0A!-e@)NC}SH7uud*RjGelSv&7C@y?&eh z1s&^V6}Q*!y9uG+o!S!ZOcwX_tMK6qA-#dsN~E=qivrPp2YlbJ*~8mWwaTf95Z2|p z=3!7Y`Jd@KI%_LC#}T+y`m5$c`d=0M80%d$lx;2q`Zs`aDgHZb2>rLb=IXYx#m)Ni z;$IEpw$+t1kOfom4MR&yK$!2k1tGUk78NCqrh&ZOtt`(8KGvPT%5~2EK#eZbBJWrO z4Ui3(ekE)^7rR7i!pbmiZ znXMc_;ioR%FjiroJfsy3$C;I!!Q7o7!~6K;ue5LnH_h{nUhPc9h;Yh%XRPI9!*ccM zmeOzAxmUN|<-T06XCZo|(TA7jDcbL=6n9OJq~Egb!|#cS*1`4b*_PesyLRSD108gR zA>9i|T;%&F11c=3G^~#rxgtyI`$XasbjJI~8k96RNS2oE)-;6=GwZfGx2R$jHQnPV zwlVL4#N6+wodV_HB#hpSgrW&<33WAvmjo<<3i`@5f;e&CwOxMV8+Tg(UOV5I`li-` zIPv1$vk4#+8~Y4J3ql>4URvtb3+L*tbnay@ucfiyrq=}y;r}A<0*VLFp0K}627^Dr zcNdHO=~+Nyidfs$T1#5^Sej!f`t6>~5hYpMI8hpv?8e;`T%<2l$ngQN8^WCe#GN`*vRDm} z=nnNd)EP>l>LEcuBufehWSVJpCCO;AX*8YlgkCkt=r?D1oPf9bEG9=-N@aFWSoqR( z7RX>VLKaBXvUCneaWzcjzK42#rFt_+GeF;Dy|-bpHCEE;0FyV)QDt(F3T?x$B|Tc_ zNe$ejHnWP%@kn4P6I_y-S$Y*MEfwMbUjkFkcmPm~34kEKmZyeAIg8bX#F~R#Qa?I= z083k<3w_~FCY^bWDEx?I8ADe3#*8t>0yXv1g$vzjhb|S;d_av0#;mukQDG|3^9G#@ zFcmW70JhK{yyG8XNTCO)03u`pQhp*c1pBo{N_x{^)P9W=h@4OcP@NAscqyu!^sNeT%dd^AMzRT$+l{(34pQF-N_kRc1OWo%JoQ+)Dh ze?}ewWzYizmF$l`Z1O`1r##W;<1}T{LbQC={)uL1B)?`L?tYc@RRk_k|4CQYXvLhf z6h;(DuRDm>=NC}Mx~btc0O@%I18yWIOjsw!%yKip;T4-PQg9O%aaFLHmfsIB;-8rV zcTCs;19j_Y?EXj*l<;yfy3s^|z!LxN!Z+s84G4B?y(TiHmXyc%Y8ZbfGVsAZS%`RZ zbJP~T$>7tIdRQeRcqLLYW&{UipEYRY-Vc)_Y?R^M#XyQ zKmw}B>4$DJ*eDOdknc*V5_x1uU86zY$y)?KTLD!ZGpw#BX_OC#V>8(6BKE9#+cHus zft!>r$fAtXB&NhI2PlpS!uoj#g#;`BM1t;dWNB_w96avOF^6pO9h-0^Aq0M?7zz?= z65?}!P{MKjM##G1QSDsXq^bgIiD@B^<(TgG#| zQdh;7-nnU{M>54o1Gj*l;OzTTPaK_now##M{9fVel&D`=mukabW=yOj$Eew)A`XQmwu8OYgVdmZ##IpIZi2eHu3gcZ@~(9t`svx89lzL@720XIF_%b8LFJvOMI{ zKSVp`=AZ;-7aVgn&v2qVL_zwZ3vcs5KY&BL&@|6DyPR-SKCq9?OxFir5yHHz;XLT^ zlQabTkqGyM<{HS&v_yjWhJ$s@V|i60@h=DY8L>Qkv&nOhYjU*{fOw%pfB9oPgYaNe z%a=Vwf#5&}=YS69zzP+tO9wv50+mXE?vB+P!p{MYaRQE!3Z9ur*K6Ah{;=2148_Gw zDU_Gp9!=KEPyQuXgn$xEVi@J8A_3h`V#OxZTqW$>8H`*q?Vqo{X-r z=}rJfL95c{X}W{#eTrXXM_^&u;i1Jf5NFb z056(&$|gIlK_j}HyD>}PB_o0Mh%`r;Ot(K_}C`d^e6beg?UCb@4CzU>PtK%N^tX3^X%kJk3FnXX67#T>G4dz zK1!qX^^ngfCPJY|hah+|#wcyY3RDTAsE1NnLK)>O%Q!VeIDi)6u$Yic3?}K+ z>02Z!G;|U{Ti+loKJ<_~%WCxPCKn(BdMKot7QyzODN}&@d-86UMTz=>nsT#L+aB#Q za_9(hOS}&+@Q&%tLg~WcolAj7G~Ui33zsU3LK^#Xay4Npu2A0eP>jc&QPE?I>CJ>V zlkv1|CZYphe2784y2sLze)IIgfv`kn#M% z6H46bheh?S7ysQ!ACF3(QX08~VOd&LU-JUohPJ{*pBtb#OXT<{&?@29W{CmF^7EI= zH+Ea$3B@93;XOG72&P7z^);RB|ZpeQI@tW?_U%6mI>ydv;tB8xRwN zD3urk4gok|H7ihHb@2TQnfE0}+F-9>Grt-x)u`Tf%#G`S-{OP=AcT43<1aJ^>6+{|>hd9zXd%feT_9 z>}l=^iiFmPfu3~aF#ckS@8K&`c4LNwUk@r{7^Kirr(=>VQHP(XsfYW-HHy8 zOev{3HpesgRdWqJ%7Adx*y=>bFuW7#ZiC|KzbiQnR)ou@6%}MvirIdJ5jQ zdN;4*g;s}8zak6vBI2CU76i^_j~bPU#}6Cx9bwViu;)}IChq(qXoNV>W*NO>XN=u_ zVBd+@OYbUkq$7Jy-x@M|YXb1QuON8frlas(tqih61&Vzf+(N1HRi&Vfk$q2mxZ8!< zj``{(8Rw7bolGdf#~*3kQm4vb_4YAZ{S*SmIQqeyy=edlAu3A26x6YkX5zPm-dujq z+FE#noD7H}G<9%H;)k7f8m~vrrpUSoIF5gA(s^nF_|UxVe+yKt%6qNkzj;e{`kuuF z&PeX8Z5+okk;sBj6Z>0!mzV|b%`5UXPQ_a32?7R+V=;mN)y4VLf2ZgmO`%@TF)^Jr z36J$Q;ekB;(yDWK=2V=GYP<3-`Ss4u11hi1i1Q8AzZuiZ1CyrTuAr)@GakSNs6iY! z58UobN))3Nc8Wzgpm}Ff=SCb)WKyF=4J(dpRScH1R2^0~-7D{}Iw93lkm0KyG9dSS zTJ*^BzabZyB)gA9MvTIQd_>&B{YbnhG5=Yf370mmy`wVKOiebO$%b4rf^Pwj$#Nr+ z{ym2+s(3{fMyxmE7Ha?}!@`7iasEldOMYHd&+*33+4XQB5mTc?O+YVJBv0!n#GPS2 z+bu?FYS0O|12witwG%4Mkr6_^C1t*)2UsvhqN4R_*aqZ}upSnr4e2iFK8HrkA*N3C zES1>1R5^;a=ig0C{<&SMS)_1KG=PSmD0Vdp6scw26ypQ_j)Y(lrd0)*5-y*Z+r$*q z@d;qN6V#+~bx`p5qC=2Vlx4pj59S-5eNwekW7xX|`s*xLXp8i6JMNGBzv_WKq&7X2 zHi3nG>%%jKlYPc`Vx5FPtaDe)bG5!Hv+*^;Z0Q&LFnPL%?Hrl<5D-x<+PzQsRx~XL zyI%c%W$g8V(7)q;t*%tlL%M;y?lu6E>HHS;F)rOfb4VAEm`-m(T`Q!yaU!(R>AuQ?C`;HkE=3?d#<5nz{>|?;lYc4_~tU-!af4o z+Y<=t>h_q!3qkmHP%!cH+P`FL?jMXphcO>tEWC%@;upXulw<(ry>!|sBEgler4)@K z!k$^V-NH(LA;rftm_$ACk7%xin(i1DXs)9ib1Foq{RbRE9)dAGd<#%zlJR*}qNAw? zgdYAB+H;SG#8&yR4YQx~bD8*j4;PQZASiCFnN~9P+0G|BAF&<}dmCeVBjZ;1VFb*w zte+axciN5+@9PM=y>i6;kv{p<5NPJZc!e8sE0}=$!!tHg{iCj`uXT*;OUL+$Lwy$z z`7)^RJP|eb^WTKL&R)_!N^2-o&VKxI#qPG{`&PE`v_O9&tStbU17Qwnd4o%V_jY(~ zT;B5)VoTvMMNLrg@dq`s_m}3-F0~%TM}x2LfBzRU>o#d}`R#K%<{w1n|F~A>>g-}~ zE9~+)Wo+c?^51Agb$xq$aSZyoV0CP-1p1>0)l&WVsGhI zo>X)0AIF(mTe4|u)EKq5H7gHxk|ub@d2@f#1kCQ)x*Ev0s8z)=EZg0;w~eD*EIlHb z!|K~x$=^eZepS|5E2gQqj`yrzS@0-Zu68UaU((UbJ#lSns=|}6bB_eOpD;@S=CztT zY-vRCZb&V=29`8*RhPA}7F)7e^CzhGDsAqROAD}uQ80>pKy%_IquWs@wD8h9$!KN` zm6v=Y8$p=ipI z2^-3+S&o>g_Fd^hZo?u;mvFIQ>~wWnmQPPWW9}1#cBTDA*Aot9GCWErC8x#tv{dTt zMqzTwimmYJ6u71~LAPa*@@hColCA1;POkpbNiIcOtbqIq2iqRYlk{AMf^bunvtB`S zoOa>RlF+!uSd<#9AKzD{Zyrj?vY%BSc4_<+X9Wrd;q@2sl9TiGV`?M51Nnmq@F^4U z)gl9QxV4LXh6S$k)Rv+0c@?tp%N+*6A9;z{Q@>6Dv78rDzoT42GtPZvTK~v)V_p_e z(2qHgIxj`R{{`exg^j_G>0o%nvZM8cP38-*4>_W`8Sxvmp>z0IrgihhJR0Sz_YD`W zcfbr8!jmc9G?~~w_CliI0J)uVF5dSchWH(iV1*+ai+X*uUx^y`SWREB;v8W0iqo{S z?t#RdCfaNWqRongk(P9i{F(NTbIJACBO#%H46F zgmtkZ(M)cIC?f?Sw&xmVkbPlzyIUB8gT=Z(@VU7VoUm2iV`@jf`7I*W(oCZe~-~ z6438qsG{C-LNQeThNhzP&W?%75h7syfDNKpAx zoUF6^^jT;64`WYaKo?UHS4*4EO$BFiVIyZ3C!n#5w5sBN8&OB8tt+4l<9rm;yOd!T zl6rh0#4Mz1dh}V65l*0lWDr7c&0tXFsn4=?EBPuA5VND38cLpi(uHjLW{!sGGR~Sx$4Ht)rK3f>~%1b*W z{??SCKsq9p2abgR3t3SA+qXIz+U}Y2BnoueE`=?<1^8yHPj((2bo2NQ?DRRPf1R>P z;Y3pA+kFtQ&;zGiC&z0nHVtu!`n|Vv&M9x*Zqz}W?XA^t2kvhXY|`SNNZff9)PdVH z36s*uGDiBPQibm7Ccr0QQapa6=-G_gR5u8prP4!~`kQnAsE+2d#Hqy_CzCw$UQ=NU zP&B!P*NKFQ@d1R?%r-D&^sZEH?xh;+ZzpR@v<8;h#Q#-P=S&_{M@G`vXkNp=%1k@6 zU}Z;h0?PKOzHkYIS*KeMK6HeRx#tSY<5K`~#h_-IrE)3tj=GIdX_x`a;6`o@tszP6yKx1De2J-3Ilu*R||`7XmtfbnJ0EW{_3(~!~g_xnFwCxWw9@H|AZ?@p0T&r_H5iQkf_$%c{z=Ib|RVFNN zLOGYX$2v*6$GVNU#d;D;#-I@v_dwi)lXA{TrusF~bPVHYZ$if0x55s_S55r>R`T1r zgys&7Az?_vPgW=WX`{`()K_A9-29>Xf>hT*Abb3<(JbVegUcMlDrTC|#=yk$jSyS^D3 z;%Kw$DeOqHA1^u#34v?6>dEd%^fWt^*Uxs>}|e5)8?z&PU#~<>6p2~C{w+KtN<~0wF_jRHc9{tLNy^MGw5{h zvjJ=l({uM#^ARHZ+%UwP2g?%_*kj}9$xr88a}{rxmg$Ill)%rEEH(h=v+GE5U#3vD zv6=oV1XD&7%N_$PW^}Jhm=+HNw%3?~gli7>PWhh=>AFhq+Fg85&swD|ixV}-hO`cW z2Qr{0liRkI4KC&9e(caqt^0!9aeJ<_86=k@!HUYX&utb;yS&`}<}hBaF$XtA z&pBnby2$u2%nkOqVLH+B_3Z$Qm1$?SKGQI-2{KK=A#06qqNo# zb+e<CY-K$rxT_r<(QdjoNY+=#c^%&Ay2ONWB^=N>%+CZcHU#=h<8@xJ+ZOT}7Q z+C@5JPvw2dcTLD2VK~KJQKzk9BhI7 z+8;mFij6lJ5-8wVu3{JN1Zpt?O)MG_tO#Ytep6GazQZdwoG7OTz2N8mXkRhpk}=>; z$Nd#}YFn%MP=`EXK@i@@`;;!xAl{3iFbGeVNuIp+M$FHN_bckb`Xa;D$dLOUY0W-$ z>J70fF*{`^JajTC0YTm;9;s#^9xd%Z$ z#m2lf*vD}@v)a?RvX8;GcFX1f zZB8=`^xz7?ol7HEBO@=eEccw%#3!+&Z042J01K>zqchTx?fhS3zqc7*JpKNG5=Z)f z(7#Vgnt_Nkxr(W?tIfYie^r{#&KTl2z6mxgpNeD1&4%idh{++l^79rz4GpP}C?+k0 zj+}Yn7T@OhL-i6gAl4cd$;E0pj!kDz(v;^Qq zaZgWje4j{ThwpbPGPd|xAtNK)Rtt?uXL;!ubi$e05j>yTOgP&*i^oQ|eukYaStL_4 z?P6S^#y3=Vy2iVtsxGUY?7(4yxQtmH5MgF06>;utw!})$iDiLWQSLi>_Y!1Y9M-hd zD0giIwZ7jlmwlyBPJaDz2^fUt71gxXk(ad@dvr%A89148qFl2oiMntbU_ShFU?TM* zt)m;9G2sP|XEs2KB{km^yF!1WPM1B>u;?;Io;r%BVQ;MaM`3ruO$Lta2s@d4RHdS-;BD{t5~nQYFj#uO=H660Zb(~@~7 zt@-fS)gxk-5&m|af27f?h!-?}j)fI>9R;)rA(q5~No)=q7; zei(F&;ze0S_FUbVi1x-Y;qGjm5q~iBo@*w;T(@VbTw?BDn6O=zW16p6a?N6BSiE8` zPtGyepyD|6H|zP|+4AjL+w+j|v{@5EjOqk3Trsb$pS}>+8y3cuWu9cyqhfzPN8(D{>IF)z!@T1>PnhmQTD1+YRn*z8&(`Bd6FAA zwothZ1~J}7f!?{4v~tY3*ju}buWg_nDJG;meBI3I$J@Znfe|A+cup36S6q)D zNi0djy+3PN_#XFI6$4*zRr@&NL!?@82}qBJRVfDhvk50}1|y~u3kLg*+@w1?H9efz z)gN&5^=QAqPf1T8&{AR=&)u(_(z7rkPxTBJvift?G_XPfWq=H0O_@Ap?+=)z&`#oM znzHKdwA6JfyoxW4QTsxtjR?0t%(&kLv^C%bl@RIFt~$BRCzc25wHN*6=((T$Xj6$9 zu?o{IRXc@C(bVJzFB{yO9v@m+#$>Q(BVBloaZX7z)WXiQFoh%4yfbpn6Px-*>%9=W z^O5SQO?r83s=qs~mM^NxW_T2@BRO)$AKLU2euEP2IWoUnE@62#^m*Yes;Ky;PWSCE zL|8tY<@0pw%=3=Ch%lK*=y*h`{eEd@#C!H~-S&NQ@g&}856ef*kosG9I$6jz=EXUh zWG=ZzWFFlt6XrN!B&c+gbHV8~4 z1Pv=c&~fXY*c!B8;7_Ujep z3ZuFuEBcZDX20;1W*=j)@)2!t8^VJ8;{~@TE3G5Pb2I3CWh)R*Pcah3G@%uYGd~_y zGaoZUoBdVG-=Bb$U!9D=Rv6#2D6zp2-A)3xZk_V5Sw%=AT&DTb56TTieo2Y@he}#& zK+mRzQ)9NX!R*U&lKKyb|Cx~@lAdX?f7Wu&pIcHi|9`dIKegv@rM4JPi%Ys<5OFN%Lx#L$U*Ls+)-Yf0Gh zS`*~2M$(+Gx>)aDr(+Dh&@v^2?gP;@Ym3NI!~mXzF|HUmd;RX)mkT&5>@;mH=UUy< zzTrK4emm4G+3++Ate_^5_b&E&xsmu0GgVI!B28rLA&$W2b0SBOi@wwrEHvR&Q)RR$ zYQfc7@_aKN>Ptdyu~z`(-DCC0bMM{D2CMDz{!w<(lfqX5iozWH6m^RCXbY{t(2D>* z(Yfn3Dwxgc=`uC9(b!rW-W$5tM7=Xw`4_hxl=~jP^aKuYicG0`oerh3ZUVUJBnSre zCax@XA11)q~~@wl?=E3u7$T7Ob^G}^N~ z=Z(#WNYH?87Lf`ChAc^#HI28cs9TiVN=JeRPe*N%;~VY~KW{ zpWhbj^m@@Zvp=ny+Zlk$-SXvn#!d8b8!QHHigwUtzli3UU`$RZ>%B#t@HB1ojc$Gp z62wF5sFiR56uHcL+6C@P3v3+$P~<@J=|`2C$zExBO<|I0qw{Cs)i`!iE{ZrtD)7;T#D}hCH7pr zK2xdxu7&;yxq`-Ork@x>2vEYnXrh-9N1fe+g12ZQts5HbPQ7ILEP#_Q?1X)8m3?Q; z(a?!~)eDT+ZegAZBF&R!QPQpQEzN#sa+^;*Pq~{F3;OxJBjpmilUj)J0U*L)<$ZY+ zz8yxUzYIw2*+4>Yl@#Bjs=$!VI0%o36Al0#O=G4H<^h#LxS(69OzLzY1-~ zpG~IRgEJK|S%RN@q3JItoj^yGu|DN`v`(D%ShhN=Ij(f`-S+Jwrx_9HJzx1iwKtg| z9|c2oNTqN9zK_0~ESYB+~BlqMRh#l3%8HJissTC{ntoN*3Br&`S%h!iRne4w^clWJI>2?Ja9t$9S7#ieEn7*m@9CqdH&C znMboW!iEmPHo5ost@%N|i-v`w;sr8c@n%=jT?GgHk59)9kja^$gE7+8iPQH)kG{C_ z`7HH#CbmiE9}{W2N_5}3rM|V%C}7y*rg7LZn9FNQCX?V{9LKtPoLuxKTgFSd=Kny$+Ur8W<2 zNzUHHm&i7Y-JoA=>d;|rRs#Lb`~mHYS`gO#bP&U`wJJg_HBRY0J=yiy`}h7cmD98R z1DtxlE|@P_jxM9sngkRO%oUCmPo1X4>^ME>3kre_IiAm*fIm_OgSSj8L6J(0TSgp~^ zE`>9%=p}hbVxvq3*0NI_(LNKVLx|)xfYNyw%9j_MWOxWCJQ?_&2IWpM;DtpLi953r z@`A$5{hu7-wzn)ae`03Mrq;jZELu^yRQlayjdKsV`SoTQS`D{foB^v9(Rqw~1q*?p zjlb4?;}iWG>!L$Aif^PcEJ3S4L|`h{x0ZFDgK8r!g5)?s!lc7*+OrExi6FG;U+AJh z>gSEZB8G?XJ{y?&E0?knjgX2IK0p?dEhWOxgx~mrDZ~t0J=3Y%mq;7vWjLz59GtEN zrM2zcMII6|0vbZHTMGE;*e2371e~X!jK=y`@{NAmesVKrNq~N?!XG7P)*^eu9BV<8 zA5C|d!^{$X;@r@tLki`Tq|?`>du-2WYVJe`ah!p4S18%xlj3fu#zEZWEHXI-H68L? z3La5RrsT}RsT}eD{`~15eq2^>Fv>Zf5y$%3K>qrlZv3W3uI3_6roev@4TDv!|0~{9 zWm@QE`|gxb3#k_c64iYWj8rTT>ty8MAoo))-6|n2uguzQ4{DxZ-pa#%&WiQC7DT!y z7gzDQC#<&BIA3jWzaC$IW*SE~eBn4|WH@3hA|3e3Yny7_Y8aL#3k(&z8aOQlu*M3j zAe}3V)(T)YNh7t*E^-!O7X&AJ}_@7^CULKC%W( zmOex$3}lbYGT&uL1nD>IQh>p@XB0nq67She{hY|uc~f96v5Z# zIPygi>t+*dR>k`4GT9hzNircc_N$GAx-(zkqbt#M#w=wbu!HdWmHyN^m+Ot75S`$B z3KsI>9c+v%U!N)>0uR=$+z5qUadM2C-W@^9Jmo-Wz5aLUM0a#dapgl5AmeGOgvba0 z4S-&vm<@c%lx8LOX6baR%~+g|5X9casj%kX>P~F`8EY*=Y_sCDp-+L1NiP)woy4o} zYJF&HH;b8_(wjREb>N}CB9ka^e)c!(b)FeAiI6Av}g(C3bzKjYM4H{(GCA5SE{s3;A22m^LhU{-+hU}YmArO#ZK!YNb zx#ajT-!3=wE%d9R5>(_Kl*C&qve55ON0VYmi5p=G%5WMyh2(J=GuCaC70JKuK>{Sj z0HZkpvft>tRW^K1KTob1Y%|AyrilFs&)qV_Dk2&;31JEQ?BB zmM|9BKgIg)$cB&{ymI=gy)%_WjVDGbRxiga_3+kxr02N4|1WsH5~+Jg{%24heZKya zACZ`;8St|eq-Otr*!krDqK`#I@*;iG$HdH^gM%;<6QzXkBUo?ZN~!yyBAfh!cD}9) zJFvqe_2!{K>%g0_&k0oh=Fe{7{R!##^Q(|p=v+BRc#7v(P+umic8Z-UJp{(f@SNl8m2o1k()1aZzj4Ooyz5qpL=)>y{e^hr7q>ju+8^c z`pXda8&CMB^%n(U1SW!{cY?n%+?{?`$0eJ-qxz)X#{he1pA7MX$Mes1QSlBwool*&0C zd}Wen!A3{~?`(kQtyV00HCbFUd9(7wx)O^TAeAY=ISc;U73x~_)J{0)I&|LR;z7#* z%NErq-ON9Nsv%YXCX>RquOJJ_L&WqGIEy1QzxY_%Htrb)1WNrR(eH8?Fh*U&5-mP! z@{#3hC}>vvO%fglu5H4UzYoNUVfuCR@OS+e({J6mm_j?T@Hdps^{;K0I-QU%P7K}4fdDUl$?vGIVrQ6->5td0y7gi(3Wh`oE_PC2 z2)C`F-`I{vWnuxwiAEr^uaD^ery%}EOz%#_Jq3PdLZzQbw*OcV|KG>=pTQfY4phY# z$MNHU({thn6OB;HQ^~VM6A=}!1lJISWyb@jpy6n;<%@@^?%Eid2u_~84SCwUjUcwL z21=N@yydfgP>;BCG9!|kJvnq-cfVe}3cOx4wEXyce{TP!IuHh>w>}(59^6ElzHaoC z7LXV)J@kYCWx1=PZW*gwTPz}~;;|I$Iue68YmRwGPI7>`p?QM| zfzz01>PQ7VTcoXF0Z>d}x(lB3fSS--WVAozqjbfmm}2$xrwEp0cHfsDdMxG(dd zA=ailEO)1uWa(_fHHNdJ;wv1Z4TqNv{Xi=N%Zc{MmdEtdqYHE?7zEypC{4wScwiZX zq4l(bO~oX=JBbfRF(BkduE|tJ+q>N|k>iQOeXx%*2h(%N7GSpXc zG+rJ60{|;X=g_-4X@sz+_Q@fIrgjsi{fhfa*F}e% zM^7WF*wm~}5ddwksGK}m&G#htkgOWug-`?^LQ{h2@s`Q$l7(&hpB%}?wHUo z7~L_TOGn&AMIismZoQmIYQP*M0OCE_Y5!6P1f;OZkyh`rY%Ma8q=$sE1Wo${0hSd; zs?RZ0Mv60PtgSp?_FYb=zN#X|IH-Q@5D^TS-=JS?h6@5g(OFUNSVOyM2S$s7#uNz5 z5Lt9^3cr0-UD6wf93qt5R>W7=R9iK*Fx0xP+z1-NbVw+Q%E9VztSs%q-8PgV%dYKAM+<;79#kZZP@P+I#okX zwBO+%aG9SV#*t6bKKNg#yz*fVZr`B}q2A^&;$RY&0-e>`Tfoj}g~6IF)JS`TSu@A& zj3IeF@MGY{(P?dEa#3kF6sJ$vy2iop^w94Jj8fy;%pC(c4*I;~g(Zx4eA8>3F^az1 zOzyw8Nz2wesF^@j39L`Pg4uCsT&ZT3a_ep{1{*`(IsKg#Exmv}MpE!N00onnr5C-J zz^5QpOW^yg^?%qj9MB02N}>(Z9Z|f>=^aBymN)^(&zXj!^A2NfK&9TH-J%aLFs0ms z88BJqgY_>;gPGvJ>A_y3asGA(N0>mQ5)mZ=GVk|Q2k~={ zXUTk1qERP_jhU|b`=815JmB0S^Z4riEXh9QaI%)EI7N`Jc$?5mC&H-&#@2>}B8Z-ugMj+4o7lhD;l=cuZrW`a z)Z>Iu^hGK+)n93gFdOyIU?F{(WO;kf+*;D?;)0&sABJG$3(3=;ApVOSt^&VsCTc#F z>D+yvwf_6ROsM1x)x}}!zOFf{5~0)XrK&Lp>(bioM+bD!Vhn<}QeD5!-F^KTa(635 z(d+Vs6^u`VsbU8%a2)wA02>};%luH}4tdP2-?>kkT?Z9IRk36Va{E4d;+ZYKB=p7# zGUaLj%*RRWNHo_WLL2l?If0fMfwzZ7pFTLQzU$=j)VAg>&Z5{LAI(Go^J!`(fPN^C z{r|_#ZD>}+qP||V%xTDyONi4`}BCH&**!*f5V;&d#$!394&K|w#5bkoBYj}b+)aC?m0^sxjm&_0B4+X)b@FpTs9l1MY{^l^Y?HiIO z$+nn@R%2+K!BZm|Z&h72!?K%eQ8k=>wXTpGLfQ8VqK2)A7=2!u=Frq0fVlpn?A;q7 zy=jH8t&tV#V8C(*opV2rx%%=&{>V)t;rpyZ^A+T1C1E5dEbhs|OpqKHB<#Hem4u~x zG#FR}mfj9&kv-q^pS>wKbeQZoVOUEVON?F$koR0e%mOU618A5@;Uu5$8x|7`3m)j; z-g~%no)mVM5OP^MuW<&g{auyF5|41XpEH%$h~ZQsyOQ6A?xqga&qcEOgMUxv=}D)b4BqIi03+6BV~v$w?V z`E|tZ-EA|}bQ9v{{!<>HaU#%4CxnvHO*B$Uvk0k8V_>qBf##4nk=5V8UF5mu z`bn?kM!rW+SeJaQV^|TY1;)0b$^Cb4xYsuD(=wvrPmtGQxOl>|uAzVZzW$>{pjQbY zxB3pOjBgeP=6@Sl|6KGYscI_EE1-M=wA(O?RL=al!yAi~?1cxDfc;Uv9eR2pvIOi1 zR*v`ys*6K-()X4`<-S4)iSC)|i8@~`M{4{2&Q+%WdYp@kR1FihL;EFg@m!-3z; z6PQt~GClp7Ie|_~DP7(~Rdo?>IeM`owi@4Dl{QrS+gB9;HE>_E;KEu_G34mFRL5eR zmh9icD(rLx1w*F&x&kdb2@UFKCJ5Dd%ql!pnS@rvT0(agFPtV_&R3&_<+~gSWG>nO zhUB#unGVOu`4O+=VK6I07f03@=`zU_70;5ntMa#8Il%1euJ={iSa(N7 zS{@it7cEO`<^KH+8+TnJ-ZTWtB!qzwp#aA5+g=*Wlpml)>NjOluDME_p0$i)S%xy6 zBg0FsPY?9^tdPvUGqac0IG^wZEX!-5TlxHVb`efpVv>cw^SV}vq z=`^VozmL^IB}02^4i44EP`2|knu;TM9||u|JGVsDVdOSkn*dCCMEM4li6V6nEDW2ZddC27?F;n zHrjlL7wK{ejTjW{X1e*HK*HCrr{as;9!4C6SFB@K~b+ybH!Nmtt$cmp2JE@^-?7?|i)} zQ{Mhx0nogMeZUV>vtEgSDMp+=4!MLw8`NOt!rn!WNPAYe1L8}ZHc3Z}ked$vtk0kN z`e1&i6Y`C=dBpc1wkG$!f-@n{m~NbSZ;?08;NUS7Zz!ZmB`3@-FmreTEK~cyjG+n} zcseA`^qL?hl5@i3dC7MuRSeTk+@Ul!#AA%q914C&{1WtL!ukHf*St`I=rfBeg0;U58tI4_UU_3d9*hy8!4d>#NpTTA0_S!_8&+kaNRCUt0cl|j@`^Jl=- z<{?>NAQ&xQ?~ufly(e7V7xBE=dE_r)H0m=3cY7Z85d8)gtY z4EOmSZSXC&8z+xea+nXHtIudZeJpo%p(kq2&!*_@k zEPDw9BNwNE=Jm>vLD#}YMw~inFSX;JCIgic5xB$-;mD3gPGCnUFrRYV&m z(2>=yLaw&r+5xzlHmsnW3Cg&DMt|w5P~zb*N!q0|5inqo#_X+8CyprS%PFnw5Z9yX z+@umw^mW@yL29#Q`;^?C4wmL%HO@Hu(n+|%Ba|n-C{hvW_mfOVr;mUss5hkZozW+?dH^55v`NQbfgaTbSxx^s_t}n|iBHYy3uRdSO7$A1Q89(qM_Jc#$gbYzQ;XuoTXq~ODxq7Z4QxXf)e6TnBS!KKL2R)&XK{RSt6s z5$N;~j~wO~Pub*y&TCuH2d6Rj)h-16+g&Pw55n`52MOk z!ydy_TCFUQy*fEUhG$eL8I~XsIZG@Z%)PE@eAmsPRt1EE>B`gnt zY7$eKyqlN!vrNfYPM>L()frVqidXnOwut4GySJ!Jv9dni|C$4kopt!@E&7UbU>peD zG4l~yglHA6O^E#pAF5OtyD2_%!inIb0ooCYu8fg995G7k?B(AERx>}Q90Oy2pB3Fi z5M{;-s3?75Y{gg0Kc;4kvISe8-xVdTXTV3dCqqE*57GdlkSa$HkH>D4&;^a)Z9!zF zyxyH?%eS?kJn>gkt}MO0sdc*+9P*5${C0-f97&yp^{FT%HMbqrJ4j$y>VN*((Uf7B zT*^9@eBo!udzY}UsLL?km~YfA2Aih+C!JK?jhMQZp)Iq*!;#g?T8F}X!u8-nD$5nG zel>eEf$m_mf)SCGqK^nCrhx(5+?dX=ilnxQ=Mu?(S%M%SF%l_(9x=k&!z^q{$Haaz z0=yYZy~D!4Dpn^&$ObokR%oE36|c(PqWAVdPjW0O;!m}MEt2_bRh&Rwrj|=}Wo8}3 zpL0g1A;3YhHK*}7kH;F^3)mP>#xCV_>dEs)L?w^y9$ciGAu|i%taFm{Zm6Rz`CYP; zWxlH-`dvGtq4ghgax&WKw9I45)1kQbu_nxLPV;afv3`t$`Dh1@Aom4?IL(Xck}vC( zF}~;xnx&82OD_3X$@k%zGw(oql0KaXMNd>xHRN&DgD+skmwcgeOuoC{nTFYP$n&$& z(hJqfFMjhQrJ4h)6s+#0#J}N!_JcNPMWT>qlPE>hsc?ewN$%)GB@^F?#^~!f@)zZy&#w9RIapaG_;X5v9SP zV1Kw_Y-@9y`OXeRf|s>o#Zb=DK%qn67{CmEK(Nkq?-l zWIwP#j()N>)$3lqUJWI_i{#n7R&6POE}_vr=WTqQ`J7BmHu*yj8$mEGmpSIs#@KSq zNBJ_z(+Qm;?a%K;K$jz*o93j2l>0r#CFZD!$tBOqEoR#eEccs3rF6@bvkG2NF0(KE zotecSD*SdX-DWH}hD+&V{;;H;v_v?;-u56UKg5Vs?le^>pooq}cF-X;RY8&#_5eDj z^+BapQE}qhdE~j>gpWLkw)}oY1FG}BsaY?tGka{0v!0R40x)Ch4hlP0lQF2L?YX2F z^vn!}mDzP;7~LMV_C!Y>-|Pr~ws#@E+P@~W=>yt`iKzn%x%tfj2_FW0jUwjVIafs%gLGCe}73HRC#rgZT(E(+?XwvQd3B`p# za<+}cl#x}R3?H|SO>$RcwwJ{V(pjq;BV`}z4p&BMrkrFkE&qv>axK1$f}S>`8mX4B zIm}5Fc*)YRTB@f_MtgKYoGR{3LU+`Bx~SCsY}`4fKV{J=^>S)ZUBwFjcxph)JL$BB zoDu3ZEu&QKtW1z>u1}<6gyTdg3T99XlheBwxnK15=UV#M0;bdrFIWMldi>bThn1X7 zErL*$Y+iZ8laaS~K!Yh`zH`DHD_`yv#5?6@ZOR@c<>2yOTi~A42zgHUM^>qJwG?i; zdW{sEq_eSuuQL1-RmGh$*8Q!^9xaMXCshR~Kp}qn<=-q-2I?k>G`{yzMc;FL;{WD@ zE(&n9bhHEf!+ZTdS8qZ872gNfLBa;2?#HLKpe84VApqqkM zb=8bj$aWDt9w)QuX5%)mru5!vAmfDc`}dzckHTb~_Ibi+nHZz^jO9vH4_PJPgx9y| z%_iDYZEY#=LLoed7`>XyyA?9IE>woK@V4FYg*)t!HNS_>Xuo_Jnkgf0!FY!JV za4CKKRHVTrP@=&nXu}6)rrC!9?J|rn!d$b=92Py9>sSN3z#NZia^kqO03w2S4X-i@2Z^nAIpFtdT6>twNA82D(Zb7kX| znBa4tSol6wVFM=t{5|-l9SyNP#uni&u0wM);kqm5`#w^NWF4v{9zKS>|hn^ z=->^0Ou8~|l{H5)!;jY>++^gktk4M1jQ48gAAA$o0{7|sfV~}qCoytQitz~+Zcf^M z2aeFy6D*eWrzPlDBD^>vafY&PbU6^7)3n(E@|XvXUnWVCo|}TSSuDDP z6f{nFt4NuE)J|+U1OVGDgTv)w#FgkShvPTsp~Fu2z_lRG57mic!oUzD8xLOQt?LXs zv*DbnE#Dss1Dik5?0I2ewGj(r^+Yh(3tgD~Vd}9QvF@;-VD1IS@03Y{o6hRUMMAvD z`ui^|sRcXa}u3WJC zxOZSPh{DRP9p7WUk{`qcRmTi}1bmJ-1gbaxxrPq6k&#YZBlJr@ROi|>=s_4W$(dV2 z0qXCRX_|cBsQoj~a^`2wIoWwZqE5i2n*q_sfq}_7XN|0XA_7x5*1ZGcb`p7QNGZw-+2+i6it&FMhfR5(pWG!p)k}QMy)()jlzX(=ejZo zlC!pA4}D5GBadokC__HA)WUb{W?dMM&Cr~0%{Ht!jZ`lw&GYEy!*TFw!7<^NjG?J2?&{lI)%bmNiSw4&))= zEQ(bR%_bEYjfrc54gwIwdx0d6cL(3a^ME;M9b3XLOly#7r?B0U*dsdb(eK`c<_Xxn z%0lvffxMammqo_0;2%huWNazPGCf0$X$Rh2=TeoT@)3~{m!yv87NH&{ZEyefCBes_Z2OD2NM$+94A^pOLmOF0WM8)m_o-(+_c z+ID?j9t&IML{;J2)9v-#;TRPowt`OnPHPosoNz6mCCUpZd2_ug2EGS~_qIk|`%OL( zc56a$-rKy#gLc*w2BN}v%Pcy*s$dmZWcK3yD8;CimKwv*Ok)bj<+#@Fzw?7J5%G+Y zY2r(nZ#lca)`tjng9W=)x*8Nk)JfDQU_@gKiTq$8O|{VA{rC2OJ-nD#>qi4PpJ|Fu zx69&yP$ddkC}lk0_9%bOPP?9#I%YkwQ)uS_(v~tmVP$GE1?GM61M5n&Y5%fxK6;pm|=4ZVWpXn1m#~Qsj0~r>=3q~Q5oysa6(sdsAW1N##AysMm zsh%2&^c_PR6dw+7)MMq@sHmB1^G@=jAMt zf6PH%8@jYHUB=Osy?y&vySaSV*UKHM0OUEBbD?o4VZlD$k&8)Og3>RP0^PFQg3xy? zDJ&USXc%I{ez-Xj88tX>!t@P(q%KR3E(Z2Z<8Me7+xIgGS9p=<}y*Cx|%+&m@;$2A5UTEB$@w9j~rRp!3)>FtI~Q1|W)0fI>y zULr-O5GX76icNDLa(;n$Uqb&|osy ztM-F{jJuZ_F7|Mc!SM7MgUBl^)tc>4l3A>SHwW!ZpLCbvLPbcJgFE~h3J?on7ye~o z`?rmYw`4LKqbK<6D4EosptDin9&LSB7O}Baly?P-NetwmC+KN+Ck3I4)!{dlw4q}~_4dq*sfSvU(L9#r4fUjO2Yi$!8qbNRG3a*mlyJb1}E zRy{DA1F4W)QY%=9J@=U3{}38Kw}V(V55pkPJJ-xU%S3oA&>f_O0DjkYp zFTso(9tZ@(Dlb*NF(Qv7H{rmpk{RRu*q4Mn5YEl+NTWg{u2W2oo&vK}fkdgfQq^_t z@w(Vc0F4>hC2hDDOK|^FR7c4T!*n#(3Skhkto+%b82A^pbNG|4&4fcpszB=o@JfWa?YiJc zp$k;k?!fCmwY=Okfmn;PBa;|xGbBM`8G%wNEk|inj=#b#hlTLirW^it+qa2W7?A6` z)k!r;b;Olae*B9#&p#eyldP|C=KDcT{ud9z{?7+dlC?u-MDW?NaqVX#AuUqi6H18@ z))Hx9hZEJwC#pi}%~M4<1LDNCvtC&lIdA;S`WHTvO7WJIknmBQaA+Ng%C9G$ce)^r z-EN5Q@9i$~Z`O?%gdNvV0Eiory9OL$Nb5KPPn^_R2~5-0SZwe0d7Xg;d?C_wNkSaM zy0=Pf3G)mleei~a8^7C|t9&wyfkm+t=JE1uNnh zpL<8I0zbnXlIY6%X^EvO7q+YuxLt|7k+WQEQ6N+vM*d{KOhS~0khbt{#VE!nL`1e4m@PzS|> zV5NxVAjec=ee{&#rt!&V1AFjNjS{_XM6h8Ud#MhXdi!WHtI{Q)5~ePii#J@G&sIs& zsY8T#dXu;B5ZS$ktI7B! z$9KMw;zuv~ORsvPza8r4ndTU0mM|`j3h7#FxagSk3059fwYukNmIeJJ3xB1_j(q1f z{fQ}aC;MlP`&)_#JbT4GnhQ{P5x>Hz?FZ<8jnG^s5b=m_FaW-L_W#c6_g|+O|G3o< zvvagHbpBp${2XJnvpn3gJmPhb`5C497vU&B9EkUv|T~aFru=*-&31W3SYVd+Bmdg_S7*Pkc z8%AZv@u)#D2^Fg3u8tvVY(0&?EGCC2f9w>l-8!sy4Na&0i9~g}2w!D5Qjv>!I=Dw| z2Vumniffpl_GV$yn>hMv=zRH-s3|X=(6ou=?WjjL7Rq5|#c%F(u9$KgXx`MunP69F zTnzENj*wbuB6J$hOH>G>N=E42^IU+wp+@COf_QEX4DXD9d$&ZZ(rmZ}1y zq$9f-M;*3Xi>ojD;Te-JI&1yjfS3nt3b98Jk3hT;4lzeS*T0>f+7I|%4}K>)*KaD# ze@B%6S6u&NPw!-JX#AfvwFE`^1p$QNuXXO`4b5u%GeRPJilKdi%xf$mf2=Tcy{o== zB{aa}TD&dcEixexGHh-bd`J9EUT8yx;}%F+HJDI`% zlquVANTY%7NM`|4Od0d)S(FOXY`tA;OyPuHsRgiE1u*L{+_97=g|5Lg3nmWG7+-on zQ8?v*GEG!6D7$Bs@?ug2BJEU-lTyb#i`u9hqz&Hl><||EXbwL(5^SY)QMY*>Rkj`W zJF$bTn&5Imi^8F5rW8uMi1@9uC59r|xrHuCbh=p45e^-|qtua3PuI;X_7=dK<_b|& z$&U85JmE;rH{Xvj(!E_)V z_kaNfOYFr35#qr`kr^E;%#KQ4VTI!73hjh?a?2og4yAc*gEPqD8^D@Ex5JY1E6?6< zPk#KyvN9FtS0K_?FyyaD2Wf+39zXHqvt0+V4-w7c;IEigZ-}cv`;yX|Yc%x+q7R^{ zmN{G@C1mCstjS`FDv#(r)FBH;i8Dl<{TId^C*;BDV3Q@L>Hu=r%s%0CS!uD8<#PYO zVE;ACjf2o4BYbDMhHo@5{tq)-ITu?aQ^$YHb4g0$fbZi0UgHc0V;Lpj-Pt<|pP7zy z6IsNJa4A$Ev?{7zK)f7wOZ28(W@sPyE&3}k+a|#*QJp~TVF7}h4f33dkP)NX)%k|g z(e3^6vfU4>QqBA8yM=mj4yTBh*uOX!wg*kfk01hOKF*>o`vd>bB1ct*fMZr z80t42wv~v=$2fe`6hzTX(c$RY?HvZig7WV0{cTlrHwI|2slRR4=oDqb!-HlXr#_7@ zI5qAhe3guA0>ORKVEz(=c+jSGbg0R;OHxPR{1n}yKATC?d4<;a;|Nut!yEKU8LSs& zh}I*l@qvK(E09J#5#$I7qk0z{!7Dv@Fq@2Nq-4IB#ZEb0>=2@oa4hM%Hd~z^8M}&E z2PqAn z((Q5XvnCHz#{ayt*FC=8Uj@u%$g$YdH$N-pZsw&2f$0oS*!@>{-A0EnIPw1YVIKA4 z2jTx4UjI=xCw<(!u|=O=GU~N7^@gKy$ra0m)A!@S19MsC_IEfsIS4@qlWj?xO-ML{ zw!FBlkUUv02?|$Ie@N~~P>5gSxQTP`aE#$D!$*5>XXsX`)$6=$@^^dlT}(_(b$Hw# zEvAv*@5#&a!2T#`!o%Fz)1Td!e|Sm9+jiGL{Zc#L_Rt{yYMA=k17iQm?)pf=^PPX) z<~2yA{hE2@=Z&5G5~cqt9`@yVdGW*JKl|ujxI^ZR-Vy%6i^0pm3o1uK;);sJtMf3! z8%w{TGM*bUOw1G{*hB-5P3x&ZtBua7^0XjY4Ivh$mqw)jK=#|GbV(guPxs-z2V*v; z4R!Dqblf^l4qF7TUZqByaMZF(#~Lbp)zP^}-+(6*coNW8E6!oFD6YbPynaNcE4;0ZrkHT{( z4@Ia}gl`^jo;~oRetk~6XHt2%qE}naK=CUXylo^= zUZFkbhK72bI^aJ7iiiI`xc^?mD;ySna8DKch{ubW*;kBNp~Nd#qw~CY>RC5}e_WTY zp#{vI`PmKZFU*O>ke}4WknBqWf1<=)L+SF!(!aYn^nhH42LQTacX;;Erj=f)Tim0^ zgaHnzxqLMd=+3wK5PXRA9y`Xj*1(RikM3!F-9j#U zx784zG+Xn7?|@rBh%WT*yy1|C7uv^{EbWhMgs)IM{P}%kUGFnL{6Rro?;|u{`-thV zGyRzoh|}A8ZSPYwU+0LL4S$r_7cKN{PmN$oTi@bg{hzBTF1NgsHzcYZ0X4)x61P2rMwH<{E^ zJlZY}lV4Y)F#xOBq@quG;`%ya4`=l`A+qs*T{wICi%0z0a1IRTO?+E$E|S3joFXaW zr;erCaQC&Vg*ZBn9Dp{Q-DKj;`q=VGdcyaKfUuXd-u^Kw$ONDs|8{>&`S8w+yfAJQ6Ic|dtYf4DP z$72FU>sfzOliyF5vM^9!*w2w60TURuXi9bbTIpndG-wu-6Q$v_bE;(eR7S7SHcsdin$)gHzhxXOXq&L8G}KZkwwLqC zEf!xAoakNmFMoTN-0WTn^5Q^E-afpBiSmhi@pBb%981tM5LiD28_Nm(rZ~YaknYpC zP+w~g1}WqNQDD_wSwD$fPgfG8XpPROSYsEMH!cR}>I?)J()nIwXg1KjeNS$6Gh`rf zkMc`)aNZNsG-D03rUU~{>$NzxigF@Ieme%N>{*n`Z?Oflw{ws@D_@i7ZYs2Bo5e$5 za1e_t)7|sd+GCZPcytI=)I~g3yF^DxDaR{t=Q+obhbSCL?%6 zfRK*UL`?5ZYEqnm45Ox=sxpbcc2kc&D&#awhy?-2W;LuUkp^ls=ul~Pe1BCpz%iLUdP~u$#hf#)hVxjT68wZ%F>MHn}=Vfj!o<~Dpm)tg((xXY07Pwgoc?KoXL7%&+`J+t~?Yexo@NLka`@>*pQau?;V zBB<3;R1q7bc+^jc*rP_W$fl@XnQZY)&|m0Gepv!fl|_1RJbySyMdJp=eZS8z}aGN?T~0nz7tjN1Z$Y z7BQlkKPzj$%>yeW{mx6XOT?`TOk(4YOcd^%7(}w~s2Tp8Bi<1Cf|BBDDo}!I|0QQI ztG)6qoT(4xN2wB2PE8gPK}=TYqChf*&T8lE>6MjE7c%L}%JJgjqlO1s*NAjCW9BW# zh?I!Y!J%Z5iercaOXIAyBwX!@)cCMgZX;7j> z)5|S@*B6k_@bZc8l8|}@FN2Mi(+zBu2bikY-pVmJ5ieDp#GMGrduNJo#0KbBiAPJq z#@D^D;xTknA}~>!^d&LlBXI~sR|;Kj9#5z(nP-T_F)Sqn@H1b^z_k=-bQHZp$o}fU zB)b7rkea{DS3H`4=O+5+;Iyy?!g&L0;Y7`2<&Fw-HxGzt*4IL9;tDcTgW^mf<6;R- zNqGrFpyx6y^y7x=7&7r`jzYcQ{#=49{t$|i%#Ldx(%0|Svpo!cde3#wrS4q6>f~mk zP>_!Ywleo@Aqbx>E&JUlTP#h1mA|6dUw6=8-7v|-k6B|_p5{DB<~u+VS}}z$nh_I7 ze)jD65aR^xA}%v=#Uo^VgBm9=W-wR}L?bb4P}p2Xc!gQ8-cFYFMOJ|EK!`A3Aev{< zB5)s(&@zdJ#JiSd&`Oz3XCrrFFVI4a zguCd3?Ag-VSl(vf!#e9PwctmA1-Y3a(@1FfF}pBQCZENx618Peo|8~M&UG7VvH7*;-NL+IGZju5uu=u?t1G+s6e?^&>Z7Jk1PA(B zCqChlnaDNKwlIF?C6VYY(ZmjBArYUBsQ=k%^|vBFK4gv8P##wTE-gM0s7lByle{|m*v3mpIlk5s+$@zgxOi|axMerZIGNRT5oU<8ZO z#+o`piW|hK5B@rK69}bL-xi@v3d?y($Qq^B(uvN>VoyVH`L@VgXLNHj@0t3 zr-9!VqsJ+d{r5<6B_Kl8ligG6)XJj6HTGgIhMk!y9Dgnk{5G7{VpeaNIpF6Oe>r4M zkcqnMPM-4oC4->Fjime71^v0^oln<9!!%7l+D&!+^a3cub{mQII4+q7ztkFQgHTsd zEfd}vaCf=pK>quq#I)c3*DF#Zakj+-ewb#RyD^q+RY$265>Ls5@ka>WJ^WCHK8ufGqqm5nsOG0 zih2lM*m9(SurUV`HGH*sZLW5zi~bC=5TvABQAoO~qRq!NTgK0}`il1GFCbfDl$DDa zLEedVE(oyw`81q)=2|cp8o6DJgczz^E`++o@%q{@kO1R$hl*Ib9)<~BB}DfH$HM&v zLRNImNS=ISaV|_eAO?ut6BQrq(%S-Y!4QMA^Cd$Ntv|so=WW3N{nF5=M2X)41!29! z+{d)mm0S++1y(oeaaY)Et`{2M#$2kf33DRR-q3L48f~m76~Zv(nKwhssY{$4u6|Zr zFZ)Og!-&yNZGCm^X4G&lAJai=l+x|w>WkVff!Rg7#XlWo6Buv6za%9XJ89KqqyixalIV%m|+$mY+wfCzY6!e!@?Xa%!?YPGC zfU4kPEkG@9;1TW1PR+eJ%paj@6NX%7BJ2wy*S20d19YqlN7tas+yGQ*cU&zEk;=HNCJ4L^%xGcJnHF|G4D_=dhqkn_@DOR8_W}KuU;fZ zcf{|FF<>ri;zm>j&b4dCsf5+W6JVb()=h8xke;n1QrN1XPxc|5qk8RjTh8j2VqKUl zZq_Xau@A%oE)CfY?ANlODTSBDe-mP#AQC|x6iLc4m}syK@ssLj8R9J84q~>oQ!blf zG&rNl(TU4yt6sl6aZtXBHEg-#FkrJ8?@c>aUIm^Mu$k zuSC7X9_K5J+#fIn_{i&Tn_Xkvd3*TvO1qa4(kE89cpy^UUu|MyR;F!E@03k>erp!=I1>>#XyaB)Ol9Z7DG z6bebJTB7G5)&B)o+0SDKkFqCdVLuev9t_Nnzy){GK!@FYJrZOgG4%1^DWM1mF{gU% z0cKD6TTPbnK-F6WYcRoCGk3fK)+6cz>~^FnxFdRrv(z}5sKH?5{8hEBqc@g)EW zyAyXYZ$mJ7#L(;_f?9ZsCI#yb&7*?Qu0ZZD*SAy9!Q~yC@YX0j>w)eENF*pqb1R4& zvYAipR5;3Pae15nOJ@>1|2FZpsBbL+PWiT$fNL8gnyS?f-$N!8*8VBf>}=zd8PeuE z?CTH6jQ|We=Vvl#hj@6*kCcx%IuRj(YdHm4HBs?-$zmo(QF!q9Q} z#kr&4^s{qFS-$>Q_;LNSJ4B)9S-QwHT#NXRzXrA3D_P*{6AG7?B&cirTQxmnoq3~) zXZNTlcZ|YUdv;ikEgSK{`pH8KXf2D)8^q6N^I>R_iUzzgk){sN|j9K4FwZgnLu0q2g&JEQr;JU$)RK5^!y_7!aj zJL@TcBE8}CT*d}D(aV=g3YnPR4IUz6YVoG#hYhL-2-H>iiR-P|)@10@$|p5(RuBe{ zedmGnh;E@BfaCHS(RfHtIjf6DM64wZaj>{#mVYKDo03$>yhkTECfV6LC4jH^sns=M zpwbev09mGv;m*xdHk@jP>*Bc>TN8)mmBkQqOE$#RwkKdh;Q5A}0dVa7($B=SlRlj6 zNgjGLKsB=XRYLHmr!B;CxZ@5sY;2d-vx9a!tUc5!K&E1+qn4xmoEk-Cl+0n#55`e| zPI1u=seeHH^wjMXs|YT@ngzrnI6yX0R0+S>LU$=QnPo-w0=>;Urndv2Yef?Q$`1DT zG3!_s{!)xSKv%MEEbXF_WvH?eYZ!B`;QDl)b~B(3^%OHPuK3MLNtKa*PzX$M{Fa{RET5*0sH}Un zbp;{CAM>o6GaKIZd8QV4!s81(y0yK5bY1uCUbkO%Vm1bnp|*Ck6{+@U#+6B}wsw>CU289Q_yC zxY=7M&>1Bgv!{7h(s3e?R>$U^)Ft1`g2XTbOgA~5Wl02GkDt+4 z>`H*CsbWYFqPiHcKu-Z8IMpp99cJJz2Y25xz!dDHj6+w*{%L-;JcattGFx;tVhsuo`C26UU z=~XRc$CrL1-%g<>-@wy}F~N=VlH;izt~wDL0Vl2}fb>vGbdr4XUI*2Un9HwFOJ#gp zB!QLol_5O;^dJ`E+_v8+3LFzbWXvMUfh|0OGE#Pp0WQwJX^jY_W5}rl_wrFRnL1i19T?Y+5OQfha_ zgo8=o1Yo8IfsX*L_?V?ln7SRQ#@V*}Sp^xnnp^W`q-5ykIu{Btv(Ab`?SrNQ5H=Xs zn)e8t3p-e4;wgAr24zPri*EEa#hqKC%$8*w$j?~G$9Ckg&5hE>BYi8BrHL-J+miYq z6LCY$_II;qJI(!)at2pRhNQ0S%{t0)HO);uQd7Btk&T;k4C*}zt&F}H_fnUeo)Sh? z|C*_KmKTw%x=Hev&tXes+^%xJqR$EF8vU}xu$(~g3N09nDxGQ2XbZ)a{rHpoXo==fH*gEB z(+)eHk`rCNFdG8ijEa}$<28~xgD`&nK(xa+bkMly<=9MmdfCVw%?%TpsT z?oFm=^~z@9Kyf5~H}XpFBZXW5IuxU>FJ zrflM`Z#=bz5cuY#c0hx=4-YivoWLx70$l+f5Js%&rK3;BQY+r;%1B=QKY}6k$m9E> z1NFJ+=fKWJH0I|Z3Z?0x%E0C7?m3XE^;9uVW^;ym;s-d0lj-@_GM8kO| z3Khq+<_dp4p+AqUevtk1Bapgdzue}uXFM)Ny0^sW<}QGaZkm`FF}~}A>@s|5&vKHk ztMB|mWOuNtA?)9?)YW`&4DrA=LGe~mHj#1&VYWX&w((lWKG{2bPE7!O9<9{ zM~mYI_1$A^T!3MO{^?Pu>tnj57WM!e?TveX0*~{yQ|IzN<6J)JRQpC*zrlKc;jca*J%6KmUb9?&Qo)7`P}n!htYTp>;B?F*V%rxb-n|j^5?I>@;&!cl0k{_Ptza>rD?PXF$G^G zw8KdI)S8X`PE!U~=(ot9yzu(RJ|=R9rJ{9|s;@y4V;ky7CRVDSu3;T~hh2`ZPuf2} zop7_?hUiF8>fCD-*OHo4ZNAiAfw^fLkbEYKhXdt>0rGzT;OqB>87 zFcfByEa7y0Y)^12x9`H9$N6b@o$vI&BTDg02_$lR7qt<%FC(st<}S{`+l8%4EP3VH ztnz$f&loDi(v@5{!~E;)z5TxVGgVE}b)9JPYx$t$v+4UDFJ^=RviYJ-39$r&Y;pn3 z<+na_K&Jy>ZFbZQ!^^~)AR?v zn5}2K#jOe%v|;O-l2_hxMswN~8)LaC6#QwMQ}ZUUUM=5%(Cidi_6u&t+w0%R)wJ&O zeMhwBHtE-Y)=@o27W2e;$9v~Je^9`}3SCynEt1RKxZ)m?m%f>MP5d2X<<>)bT zGUoAnUqas94ERE(v$8!Xit=T|i`|56wrxuu(jDTPNMRH4M^?9C-fi^hs3iJnUIlgU zpF+=Q#tSnvC72TDbapyz>Ei`e3=@Nyda;OZr zwE?f2-L6IRL|}s`l!9$32SXPKqxlO0k^mxJ>BL)WjJaUl#q2j)-Uu&0*j@11CZ0;Z zS}iUHSB;IP59C#keKu^B=pDouz}AO|F3i{P3vE~Y=r=fK@XcXE&eQ-S-e=?6rRq@; zIpORj>*EN$xlW=^iy+H_C&xd)dy3Nhe2Gl6Lw+rVZz2WDT*Rt$B3W0bN?`Ej%bO?U>Kba8TT)9;A2fnDGW zDA>D+@ga+X!fwT|&EPS#ZwZa<;m zjWI_rw&gGO5<#yZj3eFOgbRmJ`w%f3o@x^wL%2?`n&BG7_#_k|0ymaUkak0!ocLY( z5qpijR@>LukDd3qO|k>|VLaNf#dVHLoh@6^f@!$vOP*(Q(k5{ChTZ~+X(fdn>C6Mk zzqoCYN#lvp%BC+j=m=fLTnNQzbmN}o%&|v%U}l*P#BnV-5yj(?4qEb}&D7m#EKI^& zDD9PxMJz(ckRR*=zc)dbqyxU%!+P4nuY|^h6w>*Elt%E+C~q(zM^MRJ79Lb7yL%9k+Bu4 z7&moodiqrjQFdSqV%5M`ue3f2v@y!37>`}$!LXE$_@1h$u_Om)vJ5Y5!Sjz$|K%4X z)5j|Cz8QP^22QKUEU`ENcEi(>8GCIT90$G+)=rGbZ8Zl8#|Ci26=VG?A*-zf2iB9y z-7gC(5dmPmz2Rxt`dPE(QA%oYv+V`gUBg9nn~h)jMpvx=wOGrlHmcgqUwJtvGdX2` zb37oTdMPE$cEEuTE&p9FSEz_hshnMe^}6QbM~L+A8f-6d-`wLB2IQ><$8SAUqzN^{ zOa)3SecY(%t@%|(HK^WS$V^Rxp@MZeGrTL%@xD^!6X_^3lO)j=f|W*>reZ`ub)|;iKm7d9_AeN z#`MLs{NVU{IOYz$Q8d2cbtCZCOf3rS#iKtU-|2W~{2(Ca!@lx-;q!~+zfj(hzoxz* zzl{tU@-D5@;*)p?+S`LZlWPpWjjR*gtJeG(@xK#u2jl9)+h*_&?N$a@){?gd^Y$|@ zJ?-k#>p$ge{1G<&!>{rI?;N}`<74bG8BTM_Z;786$KNVLHxx;%uPD_b5eOpW|A?%o z*&n&nvTY;YAY&Hs#c6sHa)+=+R_&4!+f*CuxkfRwE3ynx9dL*JrpYE62&o;D%p#k( z`}8yy6O0rH<6erZ-`4Pl9{Ee`lSGM6?lP`)m!Tba&)?uk?MQuV92`9xkSn%|jKW2Q z>Ws(~wZy8|lFCGH*WzKxW&`uOC?1d78IxXu=6MOo@A>1#{(4wz@f9l4HRm?&;iItG zlC~5L?Drq&IgI-f5~v`d7qyO@Za}1~qieMEnbIV#jtO;dl@(LB4V;?wz%Iet>c0>% zKKG}N?P~yJaCD~`!@9vshYp{b`WeRBzrdDjO)+WpB^npOS500(&TZA<@zICj-6xtE> zcch9=)rTmpdxwZCulSf4voxjR2X&*LuyH=K8-T-iZJ$!9^{<4;)}5YzOm!mSy#O$8 zQUIs8?vzY^9bnf}-IGM4MnQ@8b7!TcZ{j#x)5}(kU0PObeD`p;&KQr+UiYzg{Ms5V zt>M}l=rvVg`hT;CM$>ERXT&pJE_?e7rzP;!F%N+_EX%Hr)L(gBI_jfRIv7;mkihRW z5Jc~GKoV+b`ToYR>Ej9Pl%Wo15!Z!>d9W;Nl+2G$J47*59mcbq8>4HD!gr#+I&uFy zn_jmMI|-|!Q0wATQZTIt>V*A_pt=NkJo6L0h$Fj!AyMOkT7Q6eHlX%2&@Y&f@_|lG z7}mIReeH>RuV57mdSh$^C%n+@x| z=ei}ypXAIRK?9Ihv))7pX=j4C3p z`q_7pKo6&Ti#WRn$eYIT9;?;+Z6p^huSnV(!pw>8){MG zolrPnDltr1y(3q~vcZH6sRD4$9)WXrbMy-?{c$gj^Ce*RL|Ag=BLp%(wBb{V&VyFU zi?#)~3614N;LD`dgxvICP!+;Q4~E^r=`|~M&xnLR2dSck*?-9KSS zb`zepY=~=j`1uBedl889CTKG$S_9vOKoIl3HXF6u=pbPJ0Q~r&+g5e>idcQ#);jz_ znKK>BqdOK(d<6Sga;@Z72ywOT#vijCbDKAKmf|BFyriqU`#?xABazTEx*-`O)mDjC z6pK=s?@2CXTRhh(8_7sXvC92boD8Yl{+V)?iNEqmQ$ea0_|2D~xIk^E z(kGM`?I_T?bP+$l5x#+qA!8f_F$D2{Fk=oegcp85V~*B^RD4ipjMs&|z4k;HSce0t zAe}Q=$g{arM5AUWJoK#TFC4TLj$~PuL-f!4(5@&Cxc_Ue5bI-F!D8TQw^pWd4<>0^ zJb>tW95j#Ce<21IT^{E2aAzV`@5=u;-0n0~fVtd;7imD|K%)B{N$HQPEmsx55MRt? zzgZjB+=nt;QY?mZnVe9t3dyaz*IM+i1CI9te(c1(*tHj;<{t=StN`TV8;NAG1fI@i zK{ztfNrX7o=j)XAn{Ko#^LVX*6u7ZFwZJuS?9GVf3umAC#vaR?V>wQu&!aIrj0K7v zyoM4RurKw~R%dwxAmp9(tJR+YS8;TYDtxyKt;}YSD!(t4AFBIRWen|oUW02-5Rei( zK&fh+j0UZuNS94n-J*CVL5VBN;b=6YOExxpkTbiV6R!9O?@s8osJOkzyQp+rwh#}0 zXW3}3eEu^5eo()@J3#(Ti{gn1n!5r&uB#TzAhg!yBo%ed6*;WhHAN8|r(c5)cOY$8sSz*WgnPpH9som zM2=i?M@jd|mvmAG-`Hl;*tYZpKmSiuKTrHotn%!eB=!u%ppT}yzl!#l9|+=w3wB+s zsqa*0FSOfg+*h%~KvwU_-yu<;p#NVT$nY=rD3Cc=24zZm`9b(GC6gVTkD0B-%^1Qiafe|XmLc7YtquL`iT&aIFi zCN6fHEH~K|!QmyQJ1T7gxv1Tl#9~IA^k$+E%A&2aLvj~aGBd`sLheX_jehLV`Y7DB zwfZxRDRNLZ6eGFOqMJiyF9P+|ffYC=Jn$#+vO_v2+8zCXz*6-_XN)cttvlEXl>9A- z8+CM*kGDL9LAQ?l$QM3X9H(6d_W0PYd&gHpA(oWWuaWtCqLx=D{|k#ZycX1xuN|Ah zzH<_rvp)#@wX{1B`Kk*!HMf>DJ}rWBVSpSc&V*HV7e3mGde2-$pvEX_!fx1li&_nZ#vbZoLLwAbAL57TNgob-t^As89)=TJ@T6D$4Fh!%55)&xh0M4O{l@Bd>2*F`EH2T3)>Lay9Lnze-I{7r+inLEp5s1DCe&y5QtWfBs$YR}bMtpyM}A z%s1Sx4#tw~&D^$UkZ_{1@^S&>%V_l1Bpbe#`S8!@aDhq$m${yNeqLMuS7~35tPQs$ z{U{zqf8o{&0rBNC?!=--%W__6rP!vbz+zEE@klsEp`}4mq%f=^B=jgqS`@i@aho9S z1~BZQbNG{tXoV=UkwtsA=e6#eND0C|!ft*WoxcqH|=MW8=>@DjPlJ>Q3$1uMsFySvMwUO6XdFqA3y zm)O$ui-%tPV6Sf@7J25=x1z5s_L+8%xv-fZdC*Pf&G>9dkAR|qP&r;Jf?qXlAqc$vg*cB0RwYYj4s4NO+AJ-9OVx7HBe+$+~~;vHm}|m-rOOAuetYiVpeh(@y_IZ@VR3gj1&JN^4DbE!Rlb?aJuzw?Xz}HCz&Xahx}3%mcPFI(>YG$;kB>BB!lhRLAe6_SAVptkjyRKk4liWW!I$`TJ?#zkbS< zmYVa5yCI7K16s=X z@!SxEepIa*S~CoUeo{`n3{4s?)X(bbRgjM36cYW6vnHDMUgHHP{PICngpz4NGI8MX zxFDWRxQ~g4fCAnT`A;bm6Toy1zJ%wSSOmF(@R1QtVhuVmiK7>Keh);CLy3t2Jh>IQ z$fHgCoa$J@BB4xP0J}LjYyu0QE$2$mq9k@s5~dI~W_yFg1*&(+=*tOLf`kvcFsTHD z`gmqMl=GB$6c^tcKAsI?nZB3{@&4G7==67}Ze)UnJI*~C`w=$GJy7zj*QN2!1n){+ z>eFuB8rG%9Goc!lugaROzDtjBA0N0zHLiGF=w?6|2-5^XDHm2-_2J3viCI6 znN)bZwf0&)J3H>CoD_aG>9_U6EyooF)Y-yq{s+EZOkuG66Thqj+yRJFmZeZ6orwv0EQUe2g^3nMoW z5&Gj^ht3*hkpa@YJ+GfQ5l#P#atSd`EU5*+xE@R(rWDv zU+^%~=G7w}Sjbj(!>cOcnQ52ncL}Pgf%G2d1^bxL+~@-A(FQ6zLHqUq=6qJd-Y(f3 zOu8q<{f*w7&JJAgF(0Gw4vg`!Z#hjiAghbuWCFrLgCHpN9&kHpAgsv`%rPdhPyZN? zpAg?)?1XTcJ#L;3a!yb_o*I}Q#L(ep)E@FdF+&Ap3lvO~vi&;N>tA@bVf<(;j z;Ei0c{j92wfNb=QuO-CkZ}>0TtG$z^V6DGt!+ z1lhu#bvA!z4pgx};h0(BJ+lG=vsQ(Q+t#N8b}Tk$lvusy@-8i+MVOx(ELqo~sMf3o z@z%`NC_WGxFld2Ts(sb8NkU!GtSv{0j8O0(xnR>%<;Ko$Dt`mk+sLIS8#hSLD&*t` z8)Lpw^s{2i74$ZmnsDwYcQdaM%lTdZah&<23oc=*Ohl!37)G*(jK*! zd;jHS-R+*rzorBCMZj zLcrxA%O zy3}R&AW5Bl_C7J2=ny!TjliDI#1+}gc#qN+p|oLix&((69)&sSq!M~L&S|bz37gaV=jMQ|>-vGN;2@la+5hK( zKZ?LiMq|orP>hy<3=LTUo=D==`V5Q2|NFv0MlC@8M_5f-ElQtVnkcsfe#F9rkyLDK zL!vxZ06hK~%EUUqaLPZh%?~QL0k`6F9;ttg!%=Z8U#-`1Vb1ysZN=mMM&Z@@BO%l} z6HUkzUFoP3HPc(clhnOSm&DbzXt4?F2z!HsMME~ zP1tT9JM-Yx?%hC4Jy>1%RiMwL8@DzTyVmm}dT`xtLHA>k+A4%c$EQ#LJwuGsQ?Rmz zKj#b^rdb=bVVpH2trH%YwXO)!9`-LBJ(7J@4WgW5Y%q+rs68hQDBVMBIF62yKDycl z2cDJehMq;X9d-~F!XX3U_OkrNY4uDd`ZgeGRe8ScNnXpFvE+}{6@=3~R(D*jXZ^3n z1%yFE9DlIU2~v8XFKYkkgP`o?8bU8R(LZ1-3}n<(25iWXdRA%mx6Afs)jXW@~0j8yC2 zg{GyZ_oyWX5>o8lCH1b7EYPiPYB*IT^&ZX8-P5EaT}8+=kxWYiE35=>)W=qHY$*Ra z%!CT98^pa ztH7>oc`EiaCts#wz6AqQ%Yb!`Zv|Ow5gzgEK2>G72Ca%l*R_#SLd2%OKeVc))^P1j5l<_=j=Ztq3>OE);FK*gtSldMZD|@SJioVnv%D ziN0&tRLrSB>$lDW9(Iu|zPx4r_znrQ2+B4_6kwp$?Q9|;I)8RRi7xXOx`5+sm3{nS z#k|W8o+o%cwG=D~bI%QW9e{VnR|$f5_{*=Zwmwnm9z10nII1;mx0XC=rDpoOwBCJ? z$L&g|!+P4-)n&6I8f4mD;6j_h5NZ@_MCTK(FXs5;bru%T)A zSvVG^8}o~dF7-Q6ECAMn zexf2eHwxyHB~3|{{l*9@*zeNn4z6<~^;f!Z#CFKyr<8j6y}c7ssv@1d$+u{?7oN|w zbG^ZzwkQN)9X9AGf8(hj(+K+^_dV0(>K7_?u4(FNYi3k~;Q_C*#K;w@4? zFaV(+mzDq6vF&UOa4;3Nu{Zv2m(WzTO=T1zM84z@8%gwtUq!&skQR{X5m6X@Fi=n! zgJOl{2mRq>SPo?Ca#!?J{4!Ofs+Oto{I5!Be1BvjNQK`L&hzr}oW0&3?fgE!oZ=VyiBy+q^)?wC!!*B=)t8mYra5J8dD84~XIMaArG||##|SiY(%CK|bSi=@?^M$c zwpv^l3w}`OFxsIQf0()23UE3eq5ypJu%2jhYUYQXs8KkJLcmtVPf!B zJpB|z*umAE!aR#m;5x)XMHZ2j^1o@8OY@&wwm*Uk@bYDdY^~L*y4IUdeC^bp#*<0E#-%JD~NvBP>m)1Js_QBdU+_ z3Kh_vF&%fy*y7j~TvPgDJesp1>W+pmp(yh0_aRsKpLQEO~Fy6$LTMzzSklOcxv& z&)I+-h*MJ>t{CuPNKVStJpefQNN&D2Nar6hAOZ(31iv8Pz6ku-IhU9+dc!*4x?IGa zP%O6~9Rz{tu-{fG&L`#u@+!BG54~1N12Rok*45V^4)17r&NK5g_(-W+yp313D-hpn zUL>DK;>IcxA8ixoI*l70W%GI^MjPZ%H}|e#%IhBD|Bw^@%S@#{vQI3XIsbPa6swny#uzG7$238fK zv=RtA0uD~jbYYI{S*!gD;(rJ6DP!nQYnFaL(*9J^<8wDdPDYf#x4?J0+2VS+^nGqW z-FiFS75D;87)HSoX+s;t$Vgy{tf2f&HYM3cM-rrSa5G7H9pR|{;Y&sm!-eHJHOUzd z1{H1ep*^roc|Fb<$ps~&L<`gUVp?seCN6Md6mghMxnkrI5U#|VbXya0gGtQcqT+7H z{79}s16xQ{HHLNIxqSq)yujU>-s~Ezj_g@gfJKv46K(F#bYydm2F}(CaMoYA9Nn5h zqs=}wv&vFh#@%MV;pt$SnQI--B^zCtmJ8EvT;AC)Z7k&CZM{@TgOvDl8X3;yH+Q$# zI8B4*v~`@TwP-s@>$r%eaNOFQmBzyA%yPPq9O)p%X)1|_oiBV8GUh-Z0TnqqjXn4# zC>_F}>ezfKET8A8y=O|KHJm(|oDbmlB&GJahCDMee2i_I?3dymcw~+2KGyYc`-X71 z^|Tnaoz1-w9C(36HnqvB#=6{N{2edbO`WPP-$tUHju1KSaIk0QIsW6l;HQJZ=3CkA z_Gdu5pHUS`fO4*$zObMGk{N8UlyL1N(hT#A_bz!k7S4`l4ahY_DAl{5tDHN{N*zw5 zrp-(X&`>Hk+CkVrx8DE^LI$Sc5IewcauD+7D(zBM`G(*ngTv9>Qin8rNxx)aax2)V&fD!LE* zp6=rMB8^IzIGSQcqqJ$%K)30cnU^3&sye;%pRoj~6CUHg3)kHbY&(GK2S~tw$}&Qn-7wEMa$XLB zU#8fBP$6fVXT;N}vyeB3$gxU30h1;~xF6E&MEjJVJYJaS;s!*i6~!-H#F29|_ygA7 z5!F}1*cBvMXH_D#Bx&oRjRGBuAvmP!eRz@?VzADVhWKTU=^LYsF!|4f38E9RfEaag zU1{Sn!;~&bRoKGb=0f3K=JkbiHVC`mN*kuik0z%Ll}1cR(5I>y+abt*HUy!S!^cNL+}44gpQK7!|XCBBJKyB154FG>rs?p-m_xP z-q=?B2&?-7V&Eq%EtIZo@@briZ@gSDF@k0K_y3EF#jQQ@cF>1 zh0fo59YHukKM$lQ#S#Pgz2i=@Fo5mkL07qs zeOu~OCc1)|n+$rZ?I0>uSf8&5=8Q;KqGadL8FsM!$dq#!{WPLagYMSRN>qbd z$>Ttl9hQ>;%)cCsuxW=vuu1^WGXbd=M@u`4ZQZR=MFEdb;9peC1v<<~yg_EML>LM* zTV7WyjbwjA#HQ8y2-y$Jg|4-E7;(Qyd&lT#+}X<$kMW9yJEw+0hZb8`@OTvy%y$Ol zLhg!n?uYKG=o(yEt+%A=Y%xH?M91WWw;X-aj9h&c0!1(x+CmEIl+ z1r18JJYy6^+1*NdSmj4neEPP*rf-bz&Y@Mv?iS>!&+;z76WeBi)kbSq3h>m>nPVE+ z8t5J3QGHJ=P;W!A^VSFGQ#&S_OE!5}j;htkhZk_;{=x32{QL?z$A|_eb0wcuAi$;< z10S1I-V$L)andLr#=;txVtgd~n#Y{DrwGe#5%xR6p6-@$@i%pCHO zS&?9$KsO@TkJQ-HTN8OH+VTnh#`{1qK-op&6*NQ$1fhJV@0O=Nt4igE2wj1_GNY=U zAII&GycOat6o#Qs#WZyn8rGUf6D@XCR*F$PM0UnKbqu`36!S%GmwZO1U(HfTNL}LF zd3pK`Vs{j(BUF>O;y8*_vF#&noWeFJai-~>Evt&iD{9dTWw8u~T|>SaI3UV&k{6Ct z_U1WOMxh7de|a5PNa9jUAe{P&mQ%iGqJTk%=E9+&WnaLfS~YNHAZIf3#!^Q^6bebXV)`sX2>GT>YG;9I^IGx;OD6=^Vn<_okU_V9);Rny9~<$ zLj*oPvzgOo&gb9+)_D}>Gd`!Cy}NHGn;hSt8y7(A2l;@@5QeluMmIxE+WhhZ=AwfT zk9HZ_eAT-OM*i5&!8V9|r8})VCwoxtYm}6CH6M9Jeg=Jf#XCdLr`Mpca8_R0Ap)hl zVaD3Px_zZPA6Z0#)!UG;Wb7VNNrRQ!RK~m^jloxJaj@f*sJie5{4%fy6(dh=+F1(^ z^+9Lsyj2JBVHg0oqxNt#z-B;(dW3i_$X--2+CJ=#xu?{KH>l>-4Rp8PT}@WBUame@ z?T!y@S&HKD&1~d`Nkt?r$Tjz~*0faa1%6WQRh>JV*_UQMcNf>`U-c3^SSrs|%+-yu zBEIdl5~3A_o{(HwZbL`dLU-Dx?elNRiVK${v&vBy+q*o9un(b4mHNsxzJCo4)%Ok3Y0D7SS{56R?}L$x=F4{t^#ro&?vJQrcSiZoFu_8j7agxh?kX zX42p;RY4KvZv(FV#fH93B^!7UuM`UfjBO(`hbQ%!l9`!-qW!S8R*Oc^D=91D7u_oX zxt8wAB9_`3@N*(kNax2p6OVHF6=}@EJ)x;Cgzo_ErtV?Hd}|xR^(GO%)+g$ z_7I!fFD(DU14UzvZY`=&eSsn!fSqR&k8{uiVK%gLR;(2qgq2BPoIp7mizQn!U~mhM z(_+46bCR|$VM^^+aj5ay9JPD)N>_XKnp@xIW{2m>mDx8<+~;=q!fm6;{S_eaS2DQ9 z?15I};R{O%$-8J*)>HitVEUCbN3|e4dP{ZA940kqI={BdkIbss~4yBv-8QGR4q7=+%nyhM|!+ES|y{j)@lZ8%=mVH6EE-A-1lW-s^62o!qVO(QMA zu>YCIZiCjNorv3DIB1tBweTvHz`fPQkj0?*o2{DYgtdV~fbnSBJ%3EwDP(^P5ndRo zOPe5<#>KFovl805uLu#1ZPxv@Sl{0JiYj?w+>IjF^w)TWQu?CY*T{p4Jox0(I%r3j zGHtE#_wIi1qF!m{w9}R{qJbe|27%<<6PA3sc#JWy%%RDi&k;1S~uPgj41Hm1Y!_oh2%QI zUC|y8RZbJ(7pI$&emS2A9Cf~2Lz-F@jz}z8GG+9!B7anALq?LwnVM=$p^^8oR%Q91 zbakPip%<9DAjT)}R5HRtb#~d$HL`dYa{)A*q{I3n8))3*PMq<&v28g{VPB)wX}$KX z?I}IUYp=E{$`A*bv?wmdn}2@%p(Y}iXsWv6n!FR>hgty zgOn^>V?}H1)Q>#bFK6z$0^G>DoXx6O59WY5Br4%*Xfd zhe%vAI+5Vd+$Tx(6>_p8Zblts)%(eOba#LoSTZ%mu0@R|DN)23l8$J^YvVhDJBe8% zP*)i*aceKEOhM;$w9V&qh~>6q!f!;_uG8U%fD?hE*v`tJ#IC_5X-HZ}`nVP4#o=3$ zE;vPCCyr})Ye^b);fKk{m+vfPM|4b*a1PQNLNrB9-_F9(pB_n*Ec|+ALEzj)~ci>pgSobj0V!R_Rnc;)8_ig}~~N z(0D^H-n`pFG17^46sH*W~!rPT%x+8R!>lM0%X0! z-aIV25@N4JaX953^N5oa9$NT=Df3L(^Nbz&X9su(2Ydp@dd84_p(q$fe7a*sne^MX zH#IZld$8pjBizTIQB02Hzd9GPUI_l*BM@m6m+Z_R=`#Ei|4G7#%P9h!oK2nn$4tsK zMh1F75K*-1Gd2=QH;M+Mmc;{{Xipf`Dag@+jY+d8x|(H8R1A1)*88@Gv zW!7sbJwf#g2x$B#{?lgYe-BGqS_EKY|2UW77#4L4QIMt<*qcyblI$(BZgfvYu0roSn zW(E-diQ(k?S9+tjEuEamMNhU>=~dXIt?x9OJd@!acFqU26fV8^WW_|pl9U{hdBPZL z!ki|4>?yS|2{9bp)#+kN{I?>f>J#>S=BW5lY4CTnZ{Xl}8j{6P6k#Gayd619)T`rF zuPSHo@Git!DA$+*nq8o^X%BpUx8Wfj<^?WT4A)^!k8qcRVWE;_rVYPwwDET*(6q1} zp!1ez&G7McW&q##9p?XihtAc0;Yt5YwAK&f_CHa)|Mz6e+S^+LEKC6=Dz3)HKf?IG zx1dV%(!f79P=9J`?6j>+&4d~FECQ|L0guE`{pf-F?``s2?bm&m*iTw~V0@3ie8miq zx0Qk;V$2M$x4dUExtve04v*0UQP?o3QuNj+dCEE00GeEhiL&xo%1`3?{nzD%hMF&? zr1WLUfpe=qh{~l$RRQ6?wWZ@2Vmw&m8HIZ^Y$qiB;oX*q5gF3$50uCqDEFM`Dfs_5 zv?HKajSIU4E%#j+YTM#McfKoZdCHjs0ChdOE=%lYHR0$YR}APPEiag4B#C1I{Z|zg z@S+;nH*XBu4{^H>xC@$&^^26p}UwQ?jG^i9MBB^E4@Q7VXL$hbK{H)d~5$XAFWZ$CG$onkQx za|K$Mn*m+AA;o`Xa)m0wvpn}Dl$tBfmMdSu0y#s<8NFu{lo69iK}6bgzl ze+B<{#>nrn$M^m0*(gW`k{)ftl)rp|o}#F>fIFL>ehS#Y@;bg^aD!;45t!zOMYeUqKL1_{3{;KaF4x)N0<9YKtVG@yNX7O{2aJY0F0_pbF4e zR0KKZe4ZN+U>hu;8VNRh7mIm|c`yBvS73$RXTdT`(nz(48#4TDK_QeH-kE!79jP{+ zse5cet57?H9?5%jL9L;(&lPk04?DJY^fjYaxG)i&G{Wd*fYuY_ffEqEkg6lAA}LBUPMC!|5A$Hx4j>*jGEVdXW{35 zFh{ch)EDuZwZ*#+_u14OTD9_NSS@x3xy$xkXdzBmp3xb9VcEYumTl1jcz<%O-(^tU z$p}3Qi%5#nF1-jn%RGzOu+pwV^~`Q)UcV8Z&$ba0V7ogJ{Fc25EjS85FMbuiJoe{% zF@Sn)Z$i9B9QnE|j*g;s3AF{?KeIjhh2@bwe({?X91)M5{$S_}<{;iQvH4_0(9eU< z-w;Iztj-2Q__szoh_4_uE$2o%7UkSK#-AJVyx@V+CfFX4gbB`#Kg;v{9{p0{;pQYr z=H7Y#D)2LXk|w>R3KJX}4?Z^D=hw!hDj{H?Y zJeyZN_{S>3H#S!W(>*pye$IkezHda3T{J72AY4O0`>4gQ9-^+mAY{6L!1TBtrf+p- z8m4b|=6svWzdDD&_UI{`e`DJMC)Xtbu!WV1q2t;NRf%w zcaS((C;_&2YmX2`a|?^x1m2w=5l4K{)j%8swESwKZYWpKThxj_2Nl_rwE=V zc!sh(OYoe~pQq~!1TPZ2MDQ}fD+FX}buzU&nOdDptxl#^CsV7xP4F**cL?4kc#q(H zf)5BjBp~~$e@yTR!M_RqL+~lVX9WKx_?+Mif-ecaBKVr%8-i~Mz9aaa;0J;q34S6V zo2vgz@CyMMRQ)%C-wFO8_>DRs012;P9O*jf)oNDK`MbskVepn zAf3QZK!#Oh5Og8vN{~s=ji5V04}t(ePl8?qy$Sjd^d;y=kVVj+U;x2Df35F01 zB^X99oFGV$O^`#7OE7|9B*7?x(F9~3MLxk8g0TeS2nqmem`*@(q@Xxb6cfxOIGA7-K?%Vj1hWZB3Caj4k`xq43X)-QD8W2}`2-6H77{EX zAmtNF2*?}?GKXRr!E%Db2v!iRBv?fdB3MmONkC>%gbCIVkVO>h2&xIz6Ko);A*dyY z5Rd^B^#q3#G!RhCDJbR?6mtrSIR(X>Vl%-Of~}lk9M0hw0=65W2c|~Rv!nODHx(69 z9KpHFf_XUXrc_^oEQH%W_z)<|HV%97c0A?VEiJp90L;kz>lR=4+7@9$fT-{A~@Qoe5@@N;uwmZ7t@nt zh1gEl;|Pu?IKju>5hqgWBq2`rDfd|!Pa!y!08KL!6g>+x&4;52RqiG`$^;r|U7Sg& zvk19B-~I`6N*N| zQ3m3WLyAH*HJI|3*41qYtqX^$<~LPVhNJk%XbjiZ*Mu6w4EmO?X$XgFLk%0k4I^WZ zM=r1v6S3ad!}3rq=FccyAKDliSrdw^9XY?Tp*pe_^Q6|))zz1Wqm6jWfR!*vi*BlJ ztX$_j6V;KjP-R0MzFo?|R~?zz6sc^iu8S~8k770Ti`P{*hNJbNN^B!VK3Ndn+=vCk z(aKOg^{AWGa#Le<&B)T~$cAuLX?3&_Tklj^7ikPf8lA?>#<~sR$jWG4Qv+2u#NEZp zx`yz`nPqcB4bgDJ0?JnwiiFmN8?d7E_3KwwN9vmzS0Vx7P%VQ2ZHmsXMs9?Q)`c48 z%RE?2lg%;c-X^oGpK@Tu5$udEuN#m7n81ET>g%G`4GvqQywT(h_5oSC0edrz1`bDz z3WRG*r&*P(rS^20buL%CU&dDp=k^kZ>~o|qbOw-4GcyMYb(CP+oc&>SBvVZP=wM^ z;KJoiwX0EPLaS?}9@JHaY8HhWs_EW-$gpi5twhu(RY$5DCo{+&*0F+F^iU*3DJ_$7+M>v zV(j0qLe|lxI#O9zTOVqyUM-a;vX;g>(`z&^ciP%;V{t=69jaKU0o5jZSUZ|E+{+j- zEa8vTHChi!(X2FtY8Z@eTS;6#CVCUXYolmRIEo*G-W?T3l_D9fYz(7h`ieJKhU>|= zMJ-A!!Eq?*jE|<*)zySU5$9Pad^Rf-U6=5H?3=5UyOueT8q|h<9rlTO&^hYnf>kPG zbwcCT!_JnSt%{dtP}p(x9W%s-gJ}11zl5SoV5mNsu2FD!h*j}M@;o^mie4G&X^p#( z(unqZ;Qq@@lmiy;bl+k7=~(Bv4b}K^i@Q)NY9(5zb>S$fEox@8sRqSRi&_HA!(_42 z7exJvpddsY-bmXxt)U^b#ddx@WTkU!nxbXZk)~)u z?bX&Z9Pw#YRn?8v8^Z}rG_1o{YJCmm;5Bs9qYTNeuCJ-C3?=7IsjEj}u{?H0@!?IO zn(D@czI2@zu95FUHSWjh^GMm+4)xzB$8v$?>U||uINa51s>%L(Nlg4biDGq?m;Fe{ z6NulC>C4aaOFK)$iQUFY4%fgN8>Z+zStd0JC6KR#DP>O7kOv>4S}t!T1w3#lY4 z@=~+5l<+mRSfx_3#+&q*8!N5}*P`v9&>Uw%Way=tU0qXGxxuTUw&g_in(0>VwyITP zy&`q3w5x2Zu0^qSLp8D7Vp=0PT=0(zHN zVBi7eQs+04`}a~ndXt#Bt+KVvqtiMC%@aDUuB+OD&KO4-1t;q1dND^5=VoHOw$6(s z@4 z-im{eg48fhPpj~qyz{VuPBnT-ZG9bu^xk3T>IMwPOY1^a#F>bv?@P?2*{fm!kLu(r z(nPcg#2>7#i_5)`6D>1CdA%`t75iKsa)+P7i}|UE{ssrTP0gsfOCWB8g#cfU?eAY zl+~%eE^50M>p@yoHF^x1qu7EIkve6250xS(tf7{wv@*0E2fJB2$Vw@Xx0X3trbJ?N(^{G{)n$ z&cppS#l>~6;LCaK_%&M~Q5`U4>9D;9>lK-`DX-6$i^JYZWW95mstiTLB@wy&+lCYP zibCCJyoA?4CsvqZ<(5R7RhCA~tZSnAxk?q{Xn2j7)l^D#Oo?dnA{R`&J7K+xwP|d0 zCL}&K^mA6PM@8|Bfs)I2F0HGJhG)bytC)D= zWtU>B+G2jV(OPi#G6{1VXvLs$i=D~SIkwHyWu}wGA%xa)aJ2NfMKeN;=xtKaf^4)W z;^_+`(u`LX#pG{v+eJlNn>y%;Q(B|oDC!k}mQ`;mb zaWLM`k}IKhtc@B!jF#n$n8U#b)gkQRAQ#akH8tV2(#AAV8TY(H$F8rb#^BQ@r&w|U zOFGhp^Gax)p)qL*-h0U_7N=r`xgF*%!Z}q~dXU&sS&Bsf8bk)eJ1i^hrnM+1O-5s* zWikv**&fQoWJC4pCM1jMQ#K&um5sEPFQXzWB=4MHWGzda-sXuqua4F*cvW4cwK0-M zyC3SX5?WhSXlsIRrfn7LRbDKSA4`mhCC0`Q<6?<|SYmuEF~Qo0z$QjHsnJd<&q?Jw zsWDD!tdkn&qzbGZnf!Sx^Yf&HEG2TI_12~aJ|0aC#nPk3$I}I_=XrLo@~Kx&!SPPr z6Y^Y-3taV0a6KRAWFPO!J}OS(*irEuZbIS(^WvHF;!h`xj%OY>A)aGQjOe_0y<_6Z z{CLtu!)PZtW{isloAddS%dvJ{9Ljf*a5-GTv4DXjko{UA2#P z@!nOTt7M*QO!M6Aaxr(TYcSnBcX!Fv?Xm7I#YJsQoR%?;n7gFFm2_)FT+ZAh-m_tc(?~J&(-6xE-sI8bzzh%?H0)~uI`L+mvwQ@O>w@9Mfol=M~!jB#Z_azyVU|G zhpT;;rsTN`#-%Ub=P@o*F*e5II0whO8q1H5jC;UFxhiwo*7h-Ov5nI^A)a*GgSPn>=SsRnaFpw@OX=cF8yoN3SQp#f zitEbZ?rJ=@tJf||G}bMx@wO+p6yBv1qejPgB&# z$5=vQ@+_V$#BHXyT^ocq;trfX9EikF-aAckm$)0{x4im*IR{Qm9#p=;k@ud^VUy}4)FOFQB&#}-6`O+;W|`uC@c@pmuP%~>gAv9D4}J>D!+4_}r4n}LW2I{Fp}UlBQE&2*e3Z#25R4}%AQ;Edns>ENsALUmY-kFPTobB^ zhKHNV9_43KJgKfV#Z%&GkJeqw8K!uKPcg-_;yDx$k5eV4c%B%R%9H%6YCSUQp3I1P}a_3WK2?Wu9LdstGmNb-yTDgm}pmFN;^u z#=FLOOE@|*QkR2@V-Mw^_&bMO6J6$+sY@`7BOPd<5UQe!$BL>cUKeke;!SOkmx{Pg&Y0pY@ivN{rvs!0|CKnR z_ENC-5gJm;cTBz7JJn!J!t^f1fQ8mb%D)e<)n3%p09 zy>Ie4)YM|)=}Jm1p+@znlmn02XfZw1P#vv{xEb&PnrE!?LzAzfIx48PC6ro*DRn7T z*@ivxI%>C^Ej76Bk_fY zcTPT$BE*-b_)2_jif_cXLVRb6@5K)$&*8Zk5ctqKWmQL|T?u8OVX3als&@J{g1Y`A z23cfJQQ|$$sE~q;qEoabH+ReuJP_fuCb zl7ZnQ2@957E6*-t6toU4cWr1hR*>T>vR+#Sw`A4g5Lg+;jzUQd$u-)ns_M1X6fd{Y znxvy8G!D9{7V>L7ymIL zgEFO>%GVVCwaJ-q(1LQBC`;|0kMM{TTt^*D0+JHM7ZCT3$W1#{TXs^j%jr6|rdTP(8am8x4qWh+3_h{BR0i+8E#XX$7h>-BeeSC+Z*Tl2u<;V_lYW+9zvWxFL+a z7<@oyFvvjPZ5n=~vuR|I*Y52rtB%&vo<33;KTtulswmdltAp2GBa(QKgZj_~=kapW z%{01FG&<53b|Oys{2-F=*bdi0)Hk<59N}e5tOFKQd#2~K!Z|ZRS-P1ApYX0ZLx$MbC3-mAdf-hqB0MNhsoq1V)9=Vu0)S# zn{1rllD)5PbPPWE5&9k_UKl%C=o?TJuhyz3UOACKG}0+>Y{uS=wv-eLPeQlh-MUjn zGz)FWIuym^;z-~GNf}u)OPyDT*H~U7oLoM!XcRfs)96K$qhkA;hPXKiW2aG4Vj|in zp2Z?F>3y3(Qw|P|VQ2HldLkTBvE1Bl5UqUAaULSzjf7$}TErn;IM3LzMSiN+xaYQ8$gLwcRV9&LP( zbIgLO9qJKAC7z9-T*EwwbRA(Z)k>nPkJ{H%`;oPu;H#)>ikogJOC-;+F{J|(mKfXq zCfbPMh16wZxDmw3w%1_?q69s9j*)8`BhV2WBWcDx!WXHt4jEW-6RFFRmV{VsKPRu1UJbm?xbGATmao{2G3($?xVnO@0r->va1O|JdaJ<)54UEB>{~f8oEH z{11Gg0)bF5C^6MEQ%zU>rkbgCGu0e5*W{1$Crthnf7;~F^5;zcGF9~|!3$I@OYLu} zgViA>zn9-<@(1}tCVzxKYVuq7t)?+r`O8$Rkp0R}C=ALkIO{O-)J~?6PfKcTVjlO2 z0aG1~#PAFFg(ly@FE-VY*qkv2IjfGPFs$Ex*C81Gb@45XRD~OAwh+TBL+B3aO;+6e z#*A)kQHs>CFv~Q?lB(o)wAe6caYJ2XZLxC>&WV}3wfDk5f5E(xxhogXDp^oGf9|xR zVv|qh(`eCCK3`D0WC0ys$D5)BE9X~~FPOH34r)bLT1N=zltqWjAFcxg493NEI%F+F zVK@@2DA9W^oL4e5Y8jv`lb>gd6Gnk)j5j6-qtG-a(&S^bG07Bf83&<6m)AvdZDv`9 z6II2kH_0bsn^>PQ*}!>@&pEh&ofzXqnv=n*g6gu2t4)|NrkchyW4dV+88gr>ER1Z3 z)NP7n&0J8LwN5Vc#*K6#<}NnXFzNk7oSPXlNg)q5W|>@}^_xFYEIAM`63|<*huS!8 z2nH|hF7zjVjA^Pzl5MS}qMZp+==KYOZwcNcc%I-?f^!KzB6yVG34-GZo}sdSf;56I z1pSe2tt-8KilBy|fuNosLhw(5D8VLzEd-kh&LcRQ;3$G7f@2A`5u8Zy7{O@-rxTn( zu#4avf|Ci(A~=p{$)MB*f+GknCfGr65y6E77Z99Ja3;Yi1XmJVL2x<2wFK7?TupF2 z!3|WspwzPjuM@mNa67?m1h){}OmHc|odnkrv=H1)a2LTH1UC}gLqH3jnnsXLx8D;y zPVg|nZi0sh9wc~x;C_Nuf_n*e65K@a8o>($FA_XW@Djm?1g{djLGTZ1trMlH3DyuC zPOzS!k>Fi|mkI78c!c0Bg5RjDLExj?lL-Dza5lju1XmG!MerQKc7h+NgifhF1V0ee z5&TTBmEZ(|KM0x$HWC~|a2b`QRRwh)rBnh=pb!AP_>16Ag5L>#CHRHlCxY(?z9IOU z;7fwf3I0p)8NsIn{~`E<;A4Uh2;L`nkKi4Ge-XS*u$LN7B`^`VK?|oT1U`aP0+Wl_ zCQs65?I!2s+}loMlD6thp2juKZzYJus#95O>nE*>sCA0H^d?Kk{*<1Z8MjjL}+OQ_I$JOl`0>#8mc@(dj|; zWnz6sxiLo=b4}w=?5{CTJWUP`oCtxnfrT{$G)zqUfUG=7<1U%Y4he6 z&saI5c;>W)r3+S;lo!n@n>%em$@J3VmBr<=rj-{Jmlc;Uz)5G9P*Wp1)JEjxg7`Px z8KIg+=d5Myp&qKQmmjU>cz!Y8?s?@D`H3ZcEl)?EOFGDzDsvXejX3&6in`c8D6 zXNG=cnfxl8rsWm`5-7BfyLQm-SdR|1`-xPnxod01LhM~iFg8@E`y z-!rQl=)7X$P&&tNjVk9XZw6+b7ERa^Vlds~L&C_$YK*<)Y448DS~?#xW6fpAst|o& zYszMvPq0(vZH&o7ys9HxQQf%3=E_36vwBt$j+WQ8^SS;~I)EK^4ac1Q{X~HG*@X7K z@TafvLseBtt;fa%TUVpiTj>)=q?0n0cyfQq|0|-}%0*U(Ux3PAbC}riPY-nPj!IAZ zKbMv^DD=0xp4i6&;el3ND@CsC|4gd)?=Qqo*(7~mA%9VV#5um37FjDzj@S2O$+;$a zxYf2bp+T}X5l~n5V*;&w6O%;LeoD0ZYMfsWLAA8b9>i|{zGUuicpSZHvrgfBK<$f! zH#s*AfAfbi+S8Q-_+gd!XWDut`p#*MmZvOA*rO+}8meq0<`~t{(r}|ps>6y%+q-*= zh2^DvcvHKeZoaezV-BEC9zvB8ZCV|*Eo3)3s^sOAGrioJ{B&VKX~LP28R5$P3y)J= z$j?gWtZB#2(uu0dbz$0Oh<(^C&8<32nwVT~O=-8M!@Rs;n{UlYnZkdPJy>w2|Y>EkRc4IFQ z_>d%LcxXaZ?0m*Ia#+Vxw6>qpW&e%r6bjjA9>~`pz--Xm?tD9#CLHqt)RQc1Ac{zc8|?fwqM8COc8kv9-47 z^0bW^Bxp_1#=6>Rv4#EplIoJvv;?JN&=sq*PDWY>QK~nF={MN?^>xukxmZ<1bM~fs ziYh#Q?5FJyxOh0{__CKIp{Mr;3s&fr>9O=BXWsI6Cbcz|N*Q6Ry{PqBaC^u0Gd*8m zcwono#ZE1$q;HNsb++^uy+k}mirpm56nyfueTg;G?6S-&h91@44+Sn;R^m}$_#)^J zDayydluuv~03CP-ywC}EdHq`XMqapSL^1ci2DzBL`zd}pI^4i_L??Lx02U2)|_e8pS;nPi^)6W4z zZY!{gR!}N}Ex=VZxC_)4&`MiDugGozQI@0a0;3gDDso!Dce|{vH#JT_>kECL8}x;K z_}?JN;(hQ*mQ^Y5D~F&Pbm#q$c_`t~NwQPH=CgQzn}{p$Uc>9yAl9B5%-#uR@NP)! zvlBW6v!4K8_AW?o1}($C6FSoi{Oi0EGJ=`vPUv!nLrhxAwGZ)q%noDQd*dNHi!?VpDM=G5ackIZ%H;(N$gOY*g9-Q$7^~pJEu>k znyK9hU0WbCPKHlbk`J9=jBIkUmECDF-Dxu2X)@huGTm;Ho(;nR(`4hr?Z!XDd+KC` z)p!eZ%hYbf`$Dk(M|B1857huh6049y-J4+`CHYS1(F{H8rMV;mr>hlCS1X*Z zRybX)aJpJyca>5>OzE=I*>FR_Y$>7G^<S{C3X)}+HKs!Kfj^v{dsm(L7x76Q>*$>0e9WXA|^f0P_7YwI%gH}2_BL@@ohb@-3 zLT*Jac6`J`@lIR1w-8yr2u48#4$3k~ND!ZoLbEX%yG(4J=#Vs#=ka_=@ctuqqIC|X`7TN)JCsg# zD4pyo6>Da>5)j;F-Yn5|B2EG zo|G1}L+SXxP3dV!>FG$>SxD(Q{}ZK!e4A)(<(?KM34fEvCU8@>h`z7`w44jXPh;D!(K zY=#ZGC8^7Te0EWu;JUW;XAP5I}fm>#pr%z zYWi*{LP?l$dv@F`c9P?{6V382^hWo%n(O5>*UKJbg^n9py<>B2$-9}AWwTvST-FSu zrAXN#n7a!OCW)IBmp)q{QTC+Nnj-T62=q0FmbwPc@}nQ4)O_L^G+{S@Ubu~nbf(X}?BToD5>A$j zk}*%Y5_}j-&Tqz6@RouUibfB`zs>mffc^J`{dbG~_oh!NlBJ-gu~_pl@?gB zm_(=rRz4KWSk(fd9T?uC5Unn4-uJzW`75BiBw#mukCO2NO2tno5qsbz_!ZuO-{5Wd z6UqJyK7xJlDH_MmnF8N14&O5ker7uS#thiYQW#^Y_@Bu-vosb!9KgD{}0n>$QD^yV^7B0)7peZ+iJX(_z?@dpN zdRadZEDKE5AG)#u(1#6#VQi2q5D(gvn9$dj-98womSRdlqcxD1VF<;cD|F-Km{Jqy zoZ|@IHtXLff#3OLR;aQ6Y?OV*OpmwwXV#P ztLidau2c`Xa`9bS8#WRYHVOdm} z_?69ejmhu!m^_a*#u^C)e&usz(5}HA8P=+3$$pTdqa}>Vq0X3$!)G)ZIFF&VU5`|5 zC{%;~4M=rqKt<`VS?n=LH%T)l^?fol7@#!dmL0FL=6z4+#pq!Xyb_j{z{otC)<*wds!&tF3$R+71@1SpwZH8IbIDe87o8&53Cls zRtKZl;V_;xz(m%F9BYDNwh?Br%`lH`fhBA!tU~P!vm>F79R*w2(JndLW^*PC-EG~k zb97&Ut$eYRxbZN$}-g*;BSRZ71=0$o6Bi(jTUhWtzv9xg{}CQx4;qQQUtS60=MO&$q%{2 zZz&pNU?+mcPC`R@D)`x%Fo~Uwj64TsvU8z?osZ&o0nBF?!XmZgBr|-ui{Y#3pTuG?v5uo<^O27OL5EP{W=_34Rf_u$NH(Uxt&|tEm64!P)F}xPZL@SFtxS zYJCgtVE=L$e;N$78IMe}*=-=>Eq43h23z+z+|Ca}Ymq47D;&lzuo-_R_W0-+*N@o& zSGU7;S_@i+e}{p+4n&e3^dDy1fxMu9nVlRO^e?xQy@}2Kb}Yit$mfh>X@ZesUF6+F z>uzEzY)8%q)Vtxh7C7F`{5ani;nV}zM=0nYqo99+g8pw5^iN?1`wR|dpCj+TK;C}^ zOWD_O82c91vF}jGzlV+NM>vB01l!pjIEDQTXR%-4LiQ_M$9{v`*DGOLcY@B^`jQA8N*(m5aacUJK%?QtjQ4oGV)k~fA#pcQra`1e=-e~ zo91hP6amiB0p{S}QTR6@=s(Kl`uw0jWG80@{YTo#gM$85@xfXdAFLG#gVl~%I-$eC zip`XBvAB8GD>l{#HtU9e3I@x#VB~J^e<;mfNG71!BH1aMF zQj~niP{u$&84ClHaWGUVgdAlej8Z1SSY4|?djZSr-Yc-m=28k&c<`ap;lmyFBzqe6^7I%N&e%bsRxP=Jk7ei2q>i823TMfV zpPgh?pLKOpE)^@~C?a#PoAXda7DIPs3G`Mfpue&dhA7Lhi_4) zEaWt2Kqol^TIkV{D$kCb6YI#ivLoy5j+~Rwk@I9n&fjlG!q|~D*pX`NNCZ1lhaIWM zjvS61X~2#|u_KMxk&XXTN5XuK-I2>|$;`I{Wt?KwVFyS|FTiv?O}$#7fM#147OIx8 z<>c;yivnt#bh-JV907)MB%~`xL09Ey=%pM3gOy{E*SD!oH8JuomWbV6QK3flCV2>?c5EH-nl}s96jNXgHv2+#Hcns&W!4-^s{< zQ=vfl2M*lnFiklFmFz5-qnr&3m2*(h&V$v;`LI#B0FG5IgwvIaT>Ca>+1yg#48B3e z?**t}BP6$0!w9*<#nDLiltZk-v5?Md+RTe;dBh%UhCHsx}Z$19)_31?vx)ypcCa(=^=~or!#-939#e+$4p^4|ymuo0F`< z7CyyRuxuF`0><)X?JC$7SvRfD0uv#>~5ENQaUPR4%36?0Y;NZRrA?0-p z7v6yN%3DycybV$19oVA03)_?rV7u}mh7BLXKa@}44COztL-`c0P(FiZ<#U&)-{7os z-r%frHe2(>1Qu>}SlHhdj|)3s;bhxJZIFU$v8GqBGaN%!7iHF3v#^}YjXPivt${gw zNcG@DE8Hag%*_}nJn2LVXt-{PM+zu%x4KQ$WHiBmQvgNz4o%e$Fkbl)CMtVSOMZsg z$}cb3rKajfa)eMsV1Ku|z39 zBFVUKi!lym$8xQ`gZ`zYP_1wqd7sWv;Fm?{tY=Ub^6LH`0PRT%U)S*cM$ z|3)W7+2jsU%yvQ)^oDoe13NEyb6__g0Z;Og@C+XfFY`Qj zjgNtMP!!+iQ`ihXjm_rMSvjA<7V=`YgdfaS@>y&(KZI5D*{p__u_!NR8~I#zBtMiL z!{@V;_yTq+U&PMli`jX+f?dLwvdj5$b^||*-Nsk27QTu-&O_{TUdevvYZVP6%T!*i zbiwGUCq_p7d95;xN0hO=PMN~%W9q~{N2RcLf|XbZO({#Ao@84sb;600$v5(2lhkRu zV=}I{O-7*=L@$>1+76|yNa(_k zLgRKc^ykMw4$@G--EnoHV+0Cqs!cQ=$4S%M1p^t&^yXk(eLO!Q$@HGcPqOL1&Zd97 zJsBvo_FkwT7nE6hFXcGgkF>(0lKRKo)IZ*q`cuK+r(sNbI&|e{KrenKhKy%Hke>}> z`8h7?$2-)Ix2ZQ^6h9f~2Q(|_W6uhLa#nCk67{F@f7l-PZhKbnaR=+vqiv5%0VegB z0!*A09BL`ru%Le)rD&DfQo2s?cNF8Hgo+W$nM+GhtjSbXp#Es_ihsQ18Al~SO`9k2~|j%8SJR+C?Wq`rs)I?}SR@{wvivc@&tYg}V9Aoo_H<)wF{$~}T4 zKZ^6}$6yM70vY-w%;8VLJpK$E#-D{s{v2%JFF+H2(G@msve}Yvdt?TaFdA{EzuG2Y((ALToczXQpi{62P{d`-+lcCozu zEx1wk;MU+DjX?zDHc1T)mh_7eD`gF(-+L*tvQQ1?w!ljPEtfX@0y=4H`x}3mU~T(R zn;FgWsONHjXM5l8T)XlAr*vohExMcc&61_MSf%`pR%kr7BA^BI7I?W(1VqdozY-8} z0lo@`p;*0vA?BMHUcLnZ{x-bJ{|g`S&zYZp$-48eSWo^9>(9SsgZTGsB>#bp+RklOb*i))tFRBK6MfI__)l~Mb zn#Mj;JF&0TbhbzB%>Ga_6i~Y;LhY(#s6CWEYACqGxNc%&%f_<86jG{{hL<%*K7jFx`leDs`d6}y06 zXxo++drzY{=s(zA>Z&Y_ty^cuR;rIBXD!)`G1IFR*|eDVS_{1HUIcr??egSGgE}09 z8U$0#hAwIj^i*@9zd8bjsUx949R<_X(Jr@F>>NOt;LJ`Y+lyht9Jf~>yK_;J+uOk} zwz{JhV_j)TM3m+!v*Jf3FZLP4iq745g*=_dB)RikB zlf*vbU3WAZ@ZAINjnkVUH&b+!Lo`EbOlgP$ED-QzyuS-R*a1F&Ej{Rs4?eUXl+gpH zKr>p?)Z}3Kqj<24adM$anFFS~<+f!$*>9QVy`N%7u7ru$;VWT8as~gkOZsFNDg1dJ1wU=SU@Lr9kxlKjz<&!hc~<)~nu32G zi&f--n=dF1QQ#CdoaLZM(sdPlY%9YTv=gWnfTE6v6m~hMDRV zC{d@u0(Ax~S7*X1^MP0%C>PpsAUB&vVtJ!e1p5>@vHbPy)%GGMNO5MO# zt2J!9T8EbFaCV^@WtXXq>}s`%-LGz9FQ{AC>*`kaj(P-pUpUO2C zdYn?Ao}iSdCn<~7la;0FDN2?452ao`O)B(m=)%g;zS1nhWFsJtPshk8m2G#Pt(MO& zq0<&DRrwR2(f+UX*2nh7Qc6KA1(ob4eyKc=zJ`6zFT<38jqD?SImUDbY-R89EBQas z0xrh+NGZm58W{oGq;yikvBd!8aDKHkDJjZ&X`keC>E43RJ&og>NeYC`8{C>icuMDQ>r$ zX}jGiL4Qijo)yx*|My8va#xeNvPpE8Vi)|-yzlJx-SiB*%^dve8uaJbP1yCaj;gh7 zV>jD2_9KHC&|`l0$AF%+b*Wx}?%+a5Q!j$9>JD@V7o#h<1jeYBq83~MRq9o+R=oxq z)N7#$Ckxxu>rv`&fRof4;dJ#TxJ11fn$=t24)r#8OT7a=Q168QsCU5+>fNwc-N`g{ z7cDf`)PS=llkoBj_-U0l$ggoa9w+!8wC9`|57bzD^4Ibz4%tB)0xksP1=< zroTNK8(_`G`a26C1KbNB-8~mP_f+K4JnH9|ZK8qrg-lbzR*d=>4#eZ=m!E(P^+}kj zJ`D$}&%hz-b8x8oJer{wVWs*Kgw>a!R(%z=sIS5C>g%qpn3J5<^kXa*!oe`rW}yj3 zNOp0^!1(_*PRjsWq}RSZNwMz0X_gg)Y_V54`v?6Z#x9KKex<`?zr|Npes`^`$OF~t zyV#NUup{q7ruqT&Q$KVqclLLP>}eBe;v9`gQ&7`rx$~~1wTruPZf6m+2fInj`ISMx zPijQP-SCIHYA5_*pS;}Y3K9|wK+vBhV+5;26_#j)Kdn_FsY`zq>Xwd3x3Sl)Byx78 z{ujISIdoRPfNtuS&`13W2B}{|w)zc>R=UU72evf0c2i?Tau5W!R?e2DiGTYb< z!nxTlIVJ*@+Xpx&K+rOFIQh@B#d?7>doAc#-ORYhiy5g&%!o0dDK;S}O=8Bt_L-p` z05kR?GxkAe9O@n#gMOLA{Ra_6a`*Jz)0#z>ItO zeKs?GwlzD#$ntlKxq)^kLIZ63y2%PIH^mr5%ORHi>|tp#8gvx-eNurLxD=Q%w*pJP zXc@q@F5uI;Lb{d-W3=utQR@NIv;fS|dchp6FY=@x@+1p3X#HJ^8?pJ~gDP7m7NB-m zikl8Ad8>U6Y6HJt+P+m%aUV!h+z0tXwntoGaf4mT%2+vT*SN6~+qR9Ta2IGh5yvLz zA5ZLSX48WH2^~)6;T|}k$-K;WAb$svKl%Ob?OYS`NLh%DY`_}X|FdNDj7vt$?Dz6o zs(BK$?6Ov-ShB<2vZK0XN1nOUhJd0C1)&W?xe21&WW!`F7mBqJ%+L;EY1(Aw*QT;w zS`nM76|;l2nXF7Zn9bEn*fOn@t-grcdY@t(gbDNCRnI#hLzeD$4ySM7yC&$ zLr%w*+5@&wcI?Tdjy=Vnw!@rX>_d9}Nd4Q9^9i=<_n>eFXg6OTf*e7N$hP))dc>`$ zTh@DftqI|v?|}T=C*XoMgYLH{ajKlescv3jvCdTNNm$vYSVsHBF#pIl`Mb2Azm;{Z z$ZcVn&Q1VoU^n-&NQ5FgZ98hCB zuuMA(LfY9-t(^ivxXGKrPy5Vn<3(K*G>HCJbeAjuR7xK3?%I>y8m3>tRQTr~(03gebT2 zwcC)_wn`+^EihBN2WD&cqIS1Jg?2xx#RITbdkFcw8@6f>yCTWh z`FJ`DZ*fP3&GwfA^-@KiPl_a8h|L+<8hd^1rS`p}JONKU8E1P(;?ablf1F&bXFV%e z3+v^G6!x-rGcDH@*o?Zs(i+N`>&}=XGg{p1+m0$-OuJhi_Op-M0`+ZcM%^+k&zNXW zVMOvY^7vWg@pH)E=b==40V9!@V3GDR%JC~0jl2r$wb!6YdmT1wZ^CifTX2f@Hk_@! z0~cxU!t>h4uI0d&9EsdvZx*bAdRrow$&H1DGE#XSx&Km4&0qskd+3)38$F4R(>2l~_NwSWwIzvCwZruCa zkQLd`d7#m<(*XUz`Y7UH{96|EkG2RNP@$qzA875G=Q+=~^=wAapC5b1?R=<2W1MGp zK1&Sxb+FOH2Dw;K4qcEH-=psQfKkFv7$xk%2;pb6O~2xp{)YPUJ1p1!gi7r%sMYpD zJvz=!I)h_%1&-HMI8)c)d|ijjbOW086pyn*6EPOGKg*YAhh9r!hyn_wDyo+ zl!@35P)d6|rFe>dp2Kfz6P+c>3;H_|OK2~%Ht0{Mw2o=?$bL#|leNi~KFlFkaWTwl zqY{G?*EJKp3-UJ0a|eSBp=eD0#z3b48kV8E*wALVb;*Vm8toYbPIMEumf2Ra3B~Dh zkjFCE<<@5dR;;MEvf&j0BcS(bVZlOQfX;)NvqV z*BTx=K|g>XJ}?7Z^D8!@0%;mqX!3DsnQ4I(`Po{JfEh^1Or!7A*zjF!)bVModEdYB zq1eSn2h5l;%?p^fx5vS`E}Ap`AJ9C|UQ>(DrBmBAAuV8iT|#nBHt#s%VbDK_X6Ajg zE8u2#<2kXm^R2cM4!`(^$TCRq<^wM?SeDVRfEk`;#(0#W9uD&K=VL1ZsR5%;K(w%N zg=vAb81D-LX}8N_gFTAHtQH$V-(~B5;Cg4!^)8UEcY{fK4=BIl0F1>=s~zf&xRZI9Jo^-0r%)5;T3%pGxR)`uIIB% zeGD6@k7c9uacsOkflbpVvvvAZR;N#64SEqfQlH6=(+_5s>9g21dI`HxKZM<*&t{M7 zrR*iWoc*NFWq<02DvCZ&$3W4ysxMV4^kvFAyhilHlqP+Ja*V!GIZm%s zuGhoL?fM#Jm%di{R9~-ruh%NS>JeqHUdMCv!+E~mz*p%_e67BbpQmr(m*`vhQ~Hto zRsAUbwth7KNI#Z;uW#pn>c{bY`iZJfKS}lLCrhh*723&@V(aqC9Ox&%mrPSi*>n62 z{wBJ(?_nr^i@#0VYHAPLdKaO6mXVM$oxNdu7c6_{9Q~5c!kg8?_s+Jq^l|Xee~!lY@o7-f51NkpR$+rlxs4n34Y-t{;|FG zkcxHraMS~=P)ENI^mmSL_qAu}`apcEuZz9a7qfFiI-IS?zlEhWh_12K`Jwjee7&<2 z7B_>MJR4&Kj4o{aE;eBY_ySs?-VD>|Nul#ZG{+|yj@nGLy-kYrHYo|aX!}->F~j)> zn^a-#FNlEN!VaRQVvA{Pa=?hYb9o>}KMR%OY)I43feigz7_XlXQ}hd9x_%Lq>6byH zekHo_t6;l+HJqSd3#aMV!MRB74*hz#LcakO;zqbbzZve=Z-Gbk+u=R^PWV>88-CDt z!mnuAeMmw#-TH}%dPs%$Y@telD{#vEi5%wBU=9Db6qX%OA;p1akAc{SxlBl5VUWg5 zdx`E>=x;C4an_Ch#}Xjcg?~x{#C&qG?lUkFMC8Bxb36Qd0_&$`uS0_V4EKhOYxOo3 zJWr9V45+zuoR3X)uc1t{+}AEP-MyG1cewS3KC{{SoM;KMGm;W00>u4wLmK z;9&hp*W%kDP6SzGPb0GI1xPyBHIjc}Z9Kq1k_+^cEZwnpUnVVxe8s=E1EWl=6@whL zzjG+2l@(!lJ0l(>8LTjck4xp_$l5Yv44-jy2SHtf5k@;q{{e zH`&gQ6!dT_a5&tp+{6Db${nxQlkaO`a|_c0>48qW*r9>+%+#H1UVx7B(P(EkGu>i>n8^v~f9{R{X`|B`jpzh=GkZ&+XbJ2qV3!{+M0vibV& zY=!;@3+aDhl(d&^(D$*k1Y;Kpgju@g`B8Dl~is8y_BB;D4Mk-&4 zJnk1`cy}?D_Y?(uuqfm?Vj|BIllUqznXeU7_<3SFzeE)Ar^HPDsyLXxEoSkL#3B4k zF`NG>N>wh(RG%nUGsPUWub3N)me@LWJU>pFZ#2EONngnyktSW?YvDfosL~sJwr$A2 zZ|bbuP9Uj(-^$p>2mR6W(a&S1 z!XW+^r=RIFF&_J!(@$ikq5JrS@4=co@jqcOI*XstA-bK#FZ@^A6`pOMX3h@!d)eo_ zzAO#;hsz^fY+*%q3tQwm&BYeGmw4pDxL6EAECEwgKo_wT`iNyPOe}XT*xcW)r z=>*pxi!JC^VxKeiL1KU7zb7r({1Kb(t6#_;S^_?om0CX`V}*B&rkGP4C!P{Wc^EFe z7`oB5bq8byQg%b@F1CbXDxB7hE)@H*6h~W@;%K*}7-i`m&6g|aw}E!CrL-H9LaS`; zx*e=;lPj$3YKN8ald7J@Sj^*+#|hZ<1pW^+kG8Fw3}ym)u5E7HCAKfb&t>+q>+BWt zczJd>d-ML63XZn=nm|jwO-oHXpU>>CFJrv>(!6hsd_C5t&dNNlW0(Gv-OnTJh-RB* z$+uY%%|mW?fRZ(p9#g!o)1h@=z{hEs!aC2si!GxkczZdV6!6jEmk%z6Bc&-XObv)9 zVVKLp2U4YZU*2}!+cwi-h*TXWSF|%vF7R*%0qqIMY-KBPVt~HDpx}R1Gi2CLRO?A7 zw(vqB?COB)r(*ZgfpHN6MXUx*R6?q#f=(g~oyA({A=W`(Q4JHsdYCF|ph`qwgQ$au zI2^W!M%XTz;2&ZWoGrG%J>m#>NNj_r#F6lmIEM8Q+gU$x92+1`V7cOCHb$JnCX3Tp zjW~#&(O#*}uh=>`U=a_Kmoj{U)wcKr}09 z;wCiyw<^8F?aB~wm$E?YRF;Wd$_jB08vlEh4dOnfL9{B{#Qn+{;sNDK@u1Qy9#U== zyOo#4qnwGSxGA3I8R8jq0?+a3;sstNtP|2ezdjl0_d(m%6muN&{c8Vr2%vSa^({y>ZKQEfS?1wJDyRq3))3+0n4G=Q!T zRXVU*jwUx)nw$_bjgK#yq46bw>rLWC-$>I5>&pTfV<>erc?~4KQ0Ya8PK;qFA9l`R zvo-E>*zyU=ODb&)UP80#B(72T_MpU=}Y`mBiCt^lv8HzV$~ePy0ki*z>Q_q{RU1 zhmzA4qo&gYJq;PNR&IC7lQ6jy*|s}M-CPrsF3tO{m!mTw82bq>`D?;#t?L_a`Lko< zPcRGy>4pN`3=RVg6|xNtMj1L38Uj`sKBzQIh!|;bxZ#H_hWk6wBb=Wlh@zZ+D|b3- z?9W$5A@lN*e?dXjRNY>b*=T($&Hi+LLBVs`lD!7;10A=t|3~=_xlgslS}p!$|e0=#`A2X^;utnGz!(QEvae;z1wZK+uj+4 zTsu}Enkg2eHU|d%y{%2@Awhp1D`hQx9ON}aLoHrc*2=0Ya?y*ou=Vb3*bVMjTI#2< z7xipt6;tnf(m0bgp4X!YlNZESOZ5JYh7{nc4rIiVB4gv zbv_F*V5^#<`jB6ZIU748eMNbx;|bu97}c0BLit{&i0nHP3VO&;~4no zhaIL7H!aSDP&1?A)HCM}?X$hKBj~nf;G!avv{jDUw8gzuVKZt11$9&F+PkUP4G7qm z05@m8LK#CBgKHDQW6cR+sZ&`g*CErnT- zADo;dAKdS0C$8{@UyTQ{t(s> zPFPEv!g?YL8%QZ(BPl0rCP~5;k|J!imSiu20Iz6`ZxCX6)tC!5w@CMp8iujlhAxJ& z_(?Ub?V)qQDZC$hP;@RhSszA|B+Y)tkV?pSIJ*){hI3N>)(5PfY(Aucp_9}0ZF<&34&DTeUzS86C zM^F_^&b$})1!A7ZZLNFU)^=lUVT_9sC~K$AbOHB^-l+!U=d(cm*a1ufa6oG;9&h!gk>t>=MpH zuJ9(D6fVMf;S#(fT(){v1EGZ0d5(kzkj9th%V<{oo}s<~>_(?iR@=(u93O4$tof#< zQXWnklL2&9+%-Oi`yq6-Eg#F5Gn6*Ln7}_r(!+ko9BmVvl233g3#sMJjoRliyai=} zbDL!d2PCv*$M*c>v&e2);tqXA5{zdz76;uEd`C%g;1 z@IF)%u*)mlK;?V{slul)O1O#j?{n;%eE~CsFJZQD3l<7r!(!n!EEB$k)xsUvD0~Mm z3qPQueuP89T{tcLWP9Im&RVu~##jWs3)=~O0Xz?<`10Ck$d5r!LoJ8s+Z0q}$omF9 zj*mB#0meG;hXZnBy?Z-ZAC*kZTe@n9>oBy^_EN%zgVvF^bI3GpBBVK81MsB2I6NwX z+U<1uG@H!m6_A_gqkeM+YNmZTxZZ0136a8I;1&MHrsf_*V|!3RB+x+QptcRu z$NpYwuHBrpO_D?(M2a#fq5=t`A5z7VD3nsrQ7jGJ#4^xNjDn$JSr{uuTY^c*TLlQ? ztrt|I4CmX;c>TsfN2sQW1H}wUd{w?0{$i-+a;xVvm;j$(bTM`t8(j4(q}w&c=ypxj zyIoVPZr4R)zXvbre7VEh7;HkOW=D8qi0qW!u}TpY=U@ zHGL^kNHG%mB%>Hv#*+WkfLzu#47WG_yzv(CsXkh(kG-aOc1=BP*Oay!gxCNzl>%O| zA(Rvwp(!_pII#)T6jPy**wj{uQ!Sm;w_X~WD>J=N)A6ifwiS$TfNN?xsgX}7HOeg_&>r7%r1bwk7hGWpEB-$HsZf9rj7If{hoMi7u{79S(D1f)e|o|pqi$6aUiL9 z4aEy}PTCk(hJjO@>k$K&;?KovalVWG%}V3SGOnXqH$eZltwx-Tjr)AGv2QS5fbmU? z7h-%J<3$+1jqzfP-@teY#;;+#6yqZpFT?l%#?PeF8Pja?EXG?fUXJk^j8|a10^^k! zFT(gajOSqdJjPQoegWghFb<~EZE~{7DvXC7)$yIR!c~{&-Zit)7$KqCUTYQoHAZC)^#g}ax@Bg7!D>U6Zd@cH}BBZ+1 zHb+Thic$B^8?HP({D&^uTtH)^Ba#OC;zRl#v34SD7hC6;TN<^=F~8_bvv=pySh_Mk zsP2_?2AqkVqWIGwM)4$zY|$qBwgw?0^WMb30rFxHd>Cc&8z6EYd1((Fza?NxIh?iiyco}w!SKz4lHk=jh9}AwhrjuUP#(H$e<&(yAk{ga2 z3q5>rgs-D@Lyj6F!B7uYm#=52q>r&3-<2>rpx+wJ1Ukj5FQ=uia5Xjoh3?cu1)hq@ zS$eV#CTHr&s+gQ(*GSufG!o7NwC{S%{L9;~%zIrl*mmaZ9bI+%vW~|O$tK(KFTfQ) zgIeO}kRpBojm58^m3RwPa~nE|-(YKY2V1l6u%Gh-_H%xON5s1@LHrq>6n}v|;-9cz z{2Pvm_u!<9gUc?5Z2|5TYjc__hB{J=-F!o5QIf4DW4gYqpL^#p*^YzT9qELA0*JPT zgQd(c%}7I|8EJ><+WLJ+TszEtaj%BOyo!Qb*uU9h`xRxo;_<4Eu6bvM?y`4f=q`JA zhVHWWSVq^LVRU-!r#*?iVdNcSlXsMU9}-7}xi9V&Q_QOz$T>5?bcp+G&EYWG3v~$~xI}QdTu{R0A*z zs~H*KYEA~ZT9T2jR%D#3HF?~XMy9#ilIgDYWR9x?x5qV!+wXduJLY*n`-CYF?}OKuLhlN`9YR4wDGa)X;j91 zRK_A`?pg+IT+cu|*K){kt$;4B=b)$SdFbs5!h^0=@Q`aYjB~Ap39fZ8$+ZEdx;DZd z*GsV9wGEEBwxcK91?OG6ZSOfQSPj!DUHH%jo;HOKuQG(+$P)fyqZ{1@8{2U2IO6lw z$@qM6RG9nXUh&1eih^6%zuDsgvC+8pr<>C=8TnrrXfw*LT;N@YNG;cwB-!;9NpXEm zTDiWpb>7Uaf_Tz`(RpjkH_?^k{ExmFkYiZ^yUv;`f~mFo^UWT0DtPwDQN!uDzx{RNY7-W?|hrnZ91$~1%7fs zKLN0|HrbG+-&EIb===lSy`!zM&VU}6M(CE^+No@Q>r^(n#f?*&t8t&^l9SAZ${A74 zGf*)kube!16OjHYn;fKH^`C~)+5`_>D&aXya{EL%bI76NndB41Jgi~*0)fOFawH4< zndCe^JsR?qyqHO{@aZw_sj9t1)&Ja^N!H*$9M}Hg6D$Eau__<8lmFxv#h)N2D6?Gh z3KlamDl(V6iU}b~$R)242*MJYIz_+|g@`2(bIEBA=voRCRQ_zvFtTx3KbN$LKQT(m zCTBAtN&j-lTmXV{I+tHdCPwDH(NqbMIJ(4gzOI#XHnW`Pi&M^8;mdiDywS*I&~{~$ z3z_%cFqi~F@_jS!`@no(24?=HhJ3f#h0%WO#d>)O-huZajZ`2>q!x7KCULX4xe&!k z+&(S~@9#RAIGRC6W8Gp)`h|__E^w}&pqlF!sOkC@>bQP~RM(#{%Jnylcin@D5`k$F z4_l;2$dp9bC%GU?a>EhH1FuS6I4k+!f+WKwNriW$D0pA;!*!_yDJ_*HWu<6RL5d|w zQaMsbiX#oBc+yI$K-x(a$q1Cdrj*lUJoW zn^Jv_mr^)MYQ&Y08go^pCR~b?%C(Z3avh~++(@YfH%V&6&63i%xl(Ix zp45ihEw$zLN$t5TsU4Rib>I$39l6(}bnXo)gZoD6%-xl`a(_zQ96qVLBTnk!s3G-q zG?eahG?98cnn}GJEu=n<)>1#mNa=pZXlamRyfoM`QF_oZQySu!Ck=HhmGl>gU!l*r z4vn=F3!QWcns$m|1Q`cWd@5b*z|Dhdd{e#|xVaRV#5bo4__4}8hb7!V4Y(H-v%O4$2wjlC&3Orjc*GPjyObaM^PL#K;ql;)xhO&LIdNs ze?oKpw~iLpZ|_1Uz61R&T;SI69krckFLA3K%aH+3%5q)#bZsr=5pJJ0`$edSw-)Uz z(Z9+BW)j7n_7*vWtniK?P12)KSsD-N(gf%(O@#ZT$uL-&0#8d%!a`{VJSWYB zpftzU%UNx{QG+GgX#@m2xwDLqmjzgkL+#G_dO2OJ&u2#)XN^|TW*aUC={c3;Eq&>z zgO)jgWRokj`{vIkZ|7^qr6nLrOOg3;NO}#Fm)1d5X)Oe#b=D9XEtv1& zP_-hYT7&6Sz9)AFsjK{bMI?Sbk2s%4oVSSc#Us86iEl>YTaow{B)+xC#CsKy_>DZ` z&OG8yi@39R#9v0@+mQGUB)%Pq?WBJur5d><0u zUu5Eaib(vUJmQgg#3L=@k;NmPgTxOa@k2;F7l|J#GV#7eB>r(8aUqYmU=bIJNBkHP zKaRvtBJmSQ{A7`d_p^xaGKe>468|KRxNNf(InP++eAZIU;7-5fuZ9C_8rOsRT5RWj z3b~&~?q{KzbOsWnvljR2*g%@xn_JwQTip8>k^84M?lyCg^Xx^AEFSkakoyJXei6C9 ziQF$1nfrhua{tW6-DWXzp2^5U@wi_>?r$UaYsmd7a=%t&?gNX+{icn(XyY#CaTkln z{e9&A0dl{A+^-||8%5@Re-XKVZsYEL%#|7Mc5?B69!2 z#$B>;m-4tv#pC`Ja=(S#ZzK1wk^Ai;b01tp?qAxtyKUUvdEDK_4oB2I#<<}Vhh7LMCbd3_tDiq#D zA>5Tfa#z+M-TEJ!12lf51=Py`il?W#7(ht)dp#kKWq|8)LM^xhP{N&nI!d%<5^rTP zipAC+mTfHrtj%Qmhz0b7A?6x}n1^U+@w%Ah;o67AOZ?R>@sDN|h?R|Apq5ymR?Gs832QecLha@Uw%xSD0<^~hbie|1 z!~$d#VmD)1#D|9^-W7>=V-g?70xA_2=spDM#RPhk1vDfqP(K9f&jcE80nIc-S=+4R zKL#Pz6y#l-P=7Lw{OA0cX-m1>gHgH@J#%2M33EulvD^w;p{!u^2qaT}yHZlp>KW<}P z-tuFL#d;!(wG@{1G-UlGll3GE=x>AdEW@w|YG@OTx_Q5LH{7@zq}}x~?gndj9gVy0 z+Fhz~*F(FjY1~Z+sr?f}YX2k#duL^HIGEAjQ29 zQr(Ln&Ak{px|cu?_fqKNUIq`ipMl}-XJM>+IZSY`fEn(!Hlfb4OktWO)X6NNCWjU3 zMilBMrcfWZfZ7>ArRb98{Lb2j=%p(|+%F+f&C!64?vVV3(C2(p{hFv zo%TUUcIQGP_aSKIK4w#i`BG7aWJ@JeEvio&R8tIotu+pMm%yxEzu8FrZp!*UY@hKe z8r5rPP^ZveoW>UM3{-NTg(UauP~Uyt#wx`!l)4tHX%?#?2CF!O)dL|W{UAd*dV6pQ zbH9ux{T4E~g0i`4%Q4Q%G1|)UNtW(e@Vf5bL(#v_)ctf8&;wzCK1868m_RdFK(4Sr zpCQmqCeTa^=n+Ghl}&yAVbkZIrau45pMf^l?Y@N){TkbV+t>ztgFV4JP|^LJO{$eG zsm57SoyBz7e}%a0zYB8NchP14f@=H~UH0#Vxa`?hW*rQHm7xcDnzhcTa4fg*7s~E$ zDCNFqlV2H2ese6`hWIb^-z21ckEsTa14IvRgOMzlxh#Du;q>VdK=O!8eLnTCOx5E- zATJYW9t+4F7Dz=PKNIL_7Es@?K&26=3=?R+1vJL6m#QK4-ZWOayOw6G9AO%(Cl;KZ za^Urp2frr{VmuX~vZtcWeyUo=TEViP1x!8vqb1SHP!;uDjj88_EMY{16-FWoBZ(=D zMgN9RZRAsj$!9T(&&aTR>LZ^9Og>92pn+BwJrBsJ&KwtR80l$@$f+QEnxa0MF}mln zZ5X-K%4?L7S2e_TgyiI~IS!U3Xbpjs14k2f#=!WN~ZiG z+47r+@|(nz-*ZeDfekYSVWu)+o@c^{Y?v7cGm{DP0u#o?hM9{nPcdPFOc;p`vjAZh zGGSIRVccw(r3kZ(3A372Wy*!EGAppktYlW1H5Skw!=BPjd-4RKg;~?RK}a^!z93XL z({kQ$np13^LCw!Y`?k-s3Jq~JxIJso7}uipuS4&!9x8b@Ky}YXsO8xN$)3$v3${QD z&sON**={q~bjx7dS_Zq8B?cj^7=R}p&mo?D3dHI(w)X7=tg!<$JNo0&w} z%%m*aOuk2D{eWijBbv!wG?SmuOnyc)`K=H$d5O`lVl=pnuAkno`U~^@8x7dIgB}x(XSPZDUQTk7G=!KN@aI-RlL(>w^+r8OnPV z=9K#O@LhtKa9si~)-G>pP`qUd=@RT1-&&*_ce=ov8h845xR!CJ_ueb$cV-9IbW5xOoOa@fwZ(Zo?tp`KBjcwu{Zi)K=OWeDe zaw^Z3Q!|uPbEcg3Fk#}@FgQN&wqe5TWx1|;;ar!uJ(_9mazA; zidQ#m@dje??q?S701K#2SfB?HXb2N1i>bHDY?u+Kw}+T|%VzmFu1biHt5T4U8;#Io z(Y(i@M8_B6<8oMquN}7Vld$lUnT0>d0%A34I?z-En#KgmWlFIs8)haJbrw^Khr%0e zHJi~^w;64~X0!=xqn(FF`!pKud^FkxXtWDa#EZ~q7o*WGL8E=P5TiZJEL%vOYXkqL902~&#=vkhUkGht3J zVQRBsb|cIlCd^4DOdU21jw!tCF~uvaYEdg}waCS4afn$hUS$D|3k!4%fsQkQUbBFH zGAhPovtrb>UfJbv^@5OLrju=B$@;djWCL48O0iX>hPH~-D8z3yX8SGeHJ%s8DPA0> zcyXNK#c_%k$0^=(Sh-%u%5@%UdEbC!?*(Y$eG^)EFG4%-CCKnzh92IxppW+oJm9?! z!@W0PqW2?PC7f(k!tqumJQa3a(=((4abLJ`jrS%p{Tw~)7ubRL63TgR6*8_l&FcJ5 zE_k*{@9BMudb|Uryx%c9|7QwW^uaYLY|)4JE@to(_E3Mu9_la59_m?UO-N4~OKY5MO~o`5P(1h+2<6kiP}>#GUneYGIqt7}tv zqNVbxmdY<%ECzwO4$WZE%;xi&Grfi{1#@kPxi-RF8)L4ijJ0S^C~f8T7PBMRBE+G# zD4-+gYYC#SHClEXi1oECq$7BRwItzTn=5I_bWpyIsIqh@;mcqyNqC!Cgq9&iXjM=V zx?&M}U=ey^5qcF;gsUuLYa75W1$K7u}OH2S!)h0L?O$MpGa*t8!*9Zg{R{P&qKX>6Fs5#|Xd z%m+-EwrrRu5oS6Q<~qy7AF`QvJGP0>MzzdA6Q9d8@f%EX?b+n!Be?}kavw5bI^r>7Z7?i8r&MJx9bY2x1SWZcjViIn%NAc zd|Q~kqfeQ#$Y9IjB_#YZQx=~wVLGv4b|TC!Cd^F>X0ajCRC9(jWH!-0b!xU`qYGLZ zroEQ*?L$%QMI@Z~^N-$AJ3I|Pk=hiwWlKe>v6N|pjXXO^%tyM)KFgeRCK z{DKM7g$?r>!kl8le946A%7!_IFt0OVzGA|3W5c|OFc+CHx0o>9*)UfS=4~d-*Z*QM zgzsI1d5;Nmo5`jJ8|DVWe8`0P#)4U8*kanhH9*q~^kjPhZMwwwDKfZ;Uf^>m?fU|o zoiEWSZ$T~JZAkWg1Fd~`Y=)U;d4?3rFu!FM_da%Uf5go0GK+hM3Db)W^DDyq#)SEf z)tdJX+nWE0HS#ZJYyLfxPj4oSOhA-5CZ8Yvu`sTBKpvleK}#R&4UGI)xB;yk0g^0$ zEQ=5$yP&Ep*%VXV$WXTR4}N5cqD(kZ$UcOZnWDJM0%{f(s00F)WCH!flxbf!Occtr zEK{aGv-s2q%cmUjDbM8d3zJVjHcUn2Q;EsvS0+qd0HJC8J zhadk8v~@!7XB$~vaLV<-EhmE_*N3ulN+IK)|1e1pVv}xyq*Ixs|6r~A>Ycxu3=X&M zOKyQWZiRKDHP($bg{=GflS%mjHs$t6xdW5(Urd+>*)W|DrZW@fZwtou*_2^}X1Rxi zEq8as?FnA_K2%jNhN|qJP2FQvn;v1S4Gz6z=FrOt%#sgf!wf=(gIOha5*DBCVfo;| zOJ)wdoE($SFgDD?$Y&&zkAn#_oDDMuVa76HcqYsUHVh8SWahBU=?q_uAF@^BhuPKm z39QCbuo_RrYCH{XV|u~W*crjnMRZtQ;Al&p!_-Bj3B>i#X_Iy)?U6x}YSJDRB(=@- zBSBKxOpgwdC^J1KNIYhGY>*H$JuV18o9Rb`aLY`O55f&I{a6q#o9PKbIAx|M1|io> zPYS|LGd(#78_o3NL0D;~p9sQyGd(2;)6DeLAdEB9(}FP6Oh0Lxou6)-ou6Twou6r& zou6f!ou6%+ou6Y<@!b46_z)VP4(6kZ7odt4qKX$m8F?|p%1fY-ZCuY)=AdYCV7fMxPV zSSfFUHS%WIC~tw6s-gw-mQllo8U5-f3-~f>TF94CgF?QHx<6!Y z`~HyL`M_{19pukYk=Oy3KL@{z9dP+eh?l>DfP4#T%3ni@d>c~bZy-(n7COpzP=Vi} z0>6hL@~^f!J0vhEPlYt$^TIXZN(_ifIV@UvD67O3+=M&5EXs|- zQm%xQnO`D1ePQP+yN1qHKFw@jlmO}@0ZAvKK9W!$H4C1rbjntK(~bP{-yP1(CN1_nP(KX z!M`c2^$CCe$ti&?d46v2FfmQN4R>@1S?6_fAJ06Us ze1KucE{DK3(SgVnZJRbAIdbD#=!+ zp@KzA!S5IfKK#E^Fbzs6GA(myIf9{KKevqP7(IZl<7cRj{oJ!u%YJS-)w6@4WqB+^ z&5pvAtdJT1Cu(*SsANC4!lvYvOeL?>mAo>)l2;a_C;i zWIy*js#y#Fsc1j<0#&u23sPnKxm8r%er`2YxSv~Nsoc-4rApT$ul@%ZIZ5s@LjEp6=J@*ZnMVS(%NxmrUJrak}m~-qigDP4^p7 z_t?in?aOXdKMe$h(0Zp=bw9VMvsu}7XN%h3Otr85it2xhuK%r_L#n;fh5oam*Kbw7 z^K1FZC3HuZ-v)Fi9;N?HS^cgMJJ8W9=yj^19+}qgBDDrRr>Z)0-6H&4CbbFuQG(pO zv*`(Ruo`~uCCf1U+{@H7^r()X+eXbpzpJN5$$oA-H4;6e27Yb_H547Ap`HgC%T8)6 zI(`$qe7d>lziOucU32}%HeaEcjQ&(NntYyu1|4W%^Aa@BeT0sxdkH=7ZuHT9ZdZP5 znaeqpr_fs5mZvywc#6%%XbyO49W*FLbCAy?(4e^ffCm4r0Vt*~ph1z{e?BjuDO4^; zHL8V$sMOKg}u(hFb;ooGK*ZpA3--ng#nJ#7`gi8tnv&@QJ#ev%5s>itbkR@N;s(K8~xHPi06Ud z(Ve@40$hVbLp_B8GkU_9a+Y$IrW20NGNxGJ6?(`g#sg`AQ3ToCtJ((ec$dw+_J3b? zeP9p-m$C{pK-plGC($ZT3tM>xTICsNmIuuw>VIk`r~Y?l zvgu!#$!0W@EodfN(M(=MGs#3Vc?r$rWi*p*|He!ll?^kA3Tq~({|9EW6U}57n#pc7 zlRa4Oy;$yjXeRs7Ob+}TGttX~W>VHLlO&@&8~+<-lJH+KhYmQN2POMom_rWqRu000 zN-m604#6YJVVI>Hfep%0OLSu_(ao`mZlfi-jgB<#cf%A6(P`TbQqgt#FO^fDFgXEE z4`(zv- zTTX+bZJdZnEJ7x7qj%J{v$->Uv$Usr!RQ}xXQMa3;6R@PFn}L~1;rGX!w>3 z0xdNgaWsuJ3R;K8v32ON-lw5_6n}s_M|Yp!q#rHEy-uH;Z^UQb`*e;2g>atcu_us7 zvy7$&mCe0z+>%QgC@7cLQ5NSRNqGb6C>J1Ac@x?y7onGO3HmFSVYu=Zj8U$@W6Im` zlyVi8;j`zI_h7a10qXraY*q9PZRvU8V<6rc>nw*783-ww{HRv9S@PTFEU#_b7y(Rr(NRdj`sB8&tkyldQ2IZb7>JI^;Vx)DL`AJP z=2ow+(m%!2sR@Xddp!R)@ycf)DL2v7K8Nzk7tl!g3Qg@cR-bR-e&r4fQ@(>~%J(o& z`4LtqcVWBolVyg3p^9OA!yw+#O*>)_g<*+try)kgS%FV5s?g(_7y+6YmREEm%(Fad zDiAv3`Wuu{euo6*KTu2g0}ElFs&8fxQk)gBHkgZs^fMZoqD=NqITQBN ze++__@kQDOT+)5O#Z6EWqf0b>EVf2xO=7p``P$r(Z0<7k3%T4|^rV7g4if$$%q>C2BY;LIGSdHI41&eKZ>PiRMKNAcf_uu zCuCr=gnyRJU5%lW^^|oC3hp95B)W5+w;f1N$xur{q*@vjwG32NqaaZ&i+YQO=4uS2 zW86(G2R+pCFkFp;iE2E|R4c%2wIVE2E5UlTGHg_%)3Lq5#3t}0#5j6rjm(eu??+dIFM-B<53SKQnyQ&v zQ&od{=M69#wI|1If?@l(r7<=5*vU@@Au=JB@3D`2&b)Ue$Z@fQ=%e+vN6qy|yKIjJ z>5q1skE8?zX3%GvF|5*vO*gq#ONgl(gqQ%Y84*>VBc`)WliFXuLtB}P*m1#xLvwhv z)bAeU-pEMXbN@E6zYOU ztp}ylWUR*ZAWm(76($90s12d6+88?-O`x5c3SHEu&|hr^gVYud&Bo?ANWP> zONiQ!c-8)-JjRvPftCsRKruXR2YAStq#08(%rTxFhD1F@98ke@F(lbAArGnMtl_K) zgb=9btmUkYzfhcY%&7wHcs^=gB(G*f&jEUEc1~OVdZ17#s|C90Rj#odR+eHD4 z#A`h0$9>PnYaw3C@mh`7W}rt&0PM%>FkY|Xbsp#;uQ}wsUYRh19+-mhWP1Jx#$)Mm z9vF|Hr(<9|h#oe9ac_Ed1IAtGIS3fHqh|_W+??*uk8uj!>%JE~hBt?NfpImu2Rp`b zbU$;9%h0{SF_!5*+ZYRU&+1-S#`778XYP?Xgk=7GN9%a!N%m3f^np48oa#epp$|g| zbrh6WAAx%6Xn0y3gAQpdyr7PQ4eF!tk~$vtsE@%xbpo7FC!*C&f=lXTcvpQKK31QA zuhc1MaZ}+pbsF{&pCp1hop{t)L{(>#QtCq_Mx9IIRec*Gy0>)+!a0+%yTm~xDXG~P zq1v-FTi&iD^v-xf=($4-ax59ppYf$bFJGH>2gOOaO;65h9dHAS#o=tvrsykteY6 zOwpRqhTIoG$8S7$ldc^Gfja;q_a&4eA7K0ylqI>&_7U4b{C`kO0|W{H00;;GM+sp- zxz-i^&lCUv;hg{g9RL6TW^!d^ZDDe2WpXcLZ*pZXMomy*a&u*JE@*UZY~4L;cbiDE z-~B5XXLiO;Y%6}mNj#1+Si&(UNN5pCCO65|!4k6BAfW{mk9R!(efzuxqT zPT}w7hN7HaXlfgN0bgz1Hniqh_gt9-p>p2oIbr06rwx1^0yk3V(=)UE3Eg&jv9G9x z{;vC`rFCu165M~W-`v2U2Q+Bc?Cyfkj^0&`K7c#Ggg{c%GyF*S-D;lN?dECE(wdEi z(hY8u_}W#RQM_<`Wey(V&90PDFm`v8D0ada{M^_8kT+g@jX>vNFkXyeFPKG`w9s`s zPWa6Ye~l2N`{z7#qX+;f(d{gD{@mLD*PlM!P@XFGwHGPiKZq!Drr^PmVuo6F2Y9GA z8@Uh^f|ync9L(L&iNWJCI{e_qjbaE1ZXUT~7u>f8el|`UuycUZZTOFscYGsZM>}Dh zrN6tdl@IvGncCM3y$fzsm9E;+-fY5-?r%18;!YbXM$00?65ueMoV*c&8`?SlSWKm= zTv*!qo6RTi;Rl;dk~i@2iAa?kFWtplwwT`rVv^#!-(8;&%#PwHz83?Q`ta*_C-j_4 z-`#26nvJ?8hM(T+0AoZZ^+?z;~V5 zGRRk(O~Z@gWniy2n>rXQu{ZIcJ&{1|KL>12rRqg;I50xa7M>66#D_$S5;7^T|0b{joB^V4Zy9D^ zWA3kD9aLaC(a0i4c4AG(a9sb#4Fg~hAS^Njix~t?ZE>`xY}wE@&w!zzo0J=5!$*q{ zG8HsmJKx>ZmUm5iZ+qpI8rX@!Y|U0;|0p4%=P#m;H(Nxk@I*rhn2c@^mw=R+!hE#V zJ8DFPKmNGcB1eGsN6SzOPIseV6bMtrg#cEWou3gpDd#`@i`vjWFp&!;SahU1MVn4DhT#ro>d&t+C zq`oI=dB$W%V0rIsJq=s_?Gtjx?E5$E>u`A6WU3AK+DnlvQh@BilHy?wA(Z(BYTFN^ z$PD9yZJL}5Xa|9w0hQurp4AQB55%62bteK+v ztvj?878jvQ z+kBE6VrUDF6p4?8qbrL14HZ*iiy!?6^&<223~<0VjXKPvEq7B6xmS07440l!CDr`+ zyw1M2n{e5H<3zLPwV-kIb8vt0$%|EK|I%5&YY>v~Wv;~ZdTTOm@%!zMOqH7}`BhAR z9K}X54z(C@R>K!=vI*?Bnc!aXYP$<~UbK$Q&4jRMot%&2XIdfzg$=2!=L&>)ib&?kk+L~ z%AVizUxVBh+PUx3f2<-ND%BcY6Gbp-A3z^SS5GQa$gQ<(`*M*dcez8n8GKM>0&ag( zb6*=EDbn;Wn^ZLkJ@#xFZMj9BH@;;5}X}>#J<>k7* z9ET5!K^dn;9M=1N*9ey+htCF2aZkUE3o%+DB>+PLtn;tO3} zoDvQhtk`=B`|Ey!1W1eIEdsX%dNul1ze%fR7eq}3lzI=m{F}C!&iMD)Z~dn_fmQ6g zt6>;cM!ArbK9b1d_8V|pDB6?Rv1WCs6ZdLlxgAkCrmAp`k(c^c+7S3nxTDuD`Uj5c zb~+c2rf8_`Zp@COb+5+gK8nuQO{M^YK*~&_kZ8`j)KX)Dew2k^FQ6hz$@*MXIuFxb zl9g{Z%cCI6aJBK{V$WhSayp?suF6sgO|=elEoat=NI6f@#k;Aqy>{k$N4^K`L8D)< z0?2Q)_<&U}ibt=;xBloZ+|e1R?plpmW@XH*smD~|#MgP+o*sK1d;zIvUlhss9P`pa zo$duT_S1im>bWT;!sVPlvCY=>J0F)D4_&~eh1`95vEzWO-sBo5wb}htD{YPtQ`eQi=h|VH+y~q9 zm;pnin<3X!YDoM?b7lO}B`ACDC-Wbd`?1;ue0ZJAD*%TuEJL5G;NvB>H)L&~2g-5> z93>m`bDyj)Lrx-vj=F$_PBZ~`&{>h8K2#94)E_6aFOwSwto=2t*T47)3#Bxq{NmD z$8kHpr^$q&AjyIltEs=W31Zi8g3VE+wsDR#tj9JG8i(28xRU9AlWpy`%qaa$nV5BP zB5$C;Hxkzk>kCJwnzT{R6xGO!OmuthpH;Z=?fb}?#3y}1Im3{}mu*IDF`gzLv9{j3 zAgHaQ^yIw9I>4pNezc#&Zu(t2gU&EBcAOQ|HS62_CG~@(%LDO{I|s@rwjCcCCu8~F zL}(ORfe?F<$SAL4nns!bMLEMHy4nIlM_Me+v!3#|vF*C4t|qN8F(@{Q<0>H(xC9{wfgv!wVdkhpZ#;K?Q<&zVP3!==` zH|H8O|BsR>`sG}PL^83@=rJ4%vZXcpfDbBz|i%|VS8 z#jgW*GxV;E21dk_QQvjnq|YHBc{h(fH0L_m8>WP&y#((i03g~nKU8b}vD93;hU+ilMMiQ4qQ3jZbf;#LZn{?Fq z#7q;svquI9%Zi^1np$a7JX9y=0aG?#b*V+8#9@C56WMC#X;}WE{+R?lC|5V&r^U8T zg}qqV8${Eo^+7aRRB8?Bpxn6n+Xh1@2XhP)M+bACNn%FWM?DONwxRV?DzIU8sQ%tKfGfIf%UmO##H08l47f`rBT;4MJ;m>^5o&5NpU#hn57eY ztjlMlLi~h8Io?h$M-~q+tQ5by8h3VMIrY03C&^ZV%HS zSy)`^yRpM)PB4X{wox_u({KF<2|NSgs*D&MPd5R*UsPUy<62Ly3y3_B9;t!Daa_?U zS^yoJhHzmhuWySVK34@Z)*Hs`>A5m@9WSizAgk35C5HJm=F`RC0&7e4T*luCtr*cZ zm%M`XTaqUYOiA*ns7TDDd>M!K`E$GTj*Vk@ox)>ew&sSqoN#k`vX{CAnZE?oMcK7~ zdA9N46~*56bGf&K!%m=Gp2Bw&8*jD;t)4_<=g2hzt8|}}#I>qr0imz@3tofn=9mL> z7Vp3FX1<%tQW;bGu+25_j;V+;mg}m`)yh*-%t{8YDIR5?8nf#=7k9C;MEfgXjD_#c z0LI=-NCVeAL1&h%VhWlo70y}OnjT<+{-VFkO^#qbyA2!0Jbz<< zFvgPH@ zd^a8@2|7NIm!rie=q)w4%+-;HiUoqRSoFGvkqIP#U0movq7M+fV75y`-XRb1`ayzX z*2@-Y;>W@*NFJWF%er2suR zhAA}X1cO1zsV~~ZRgy$6K-ILS67CpAf-BpPq~|_wjN!FF0`cXt&5@&73L4oDHG2lx zS5c>1r}YE3NBg^8{kr@+$I$zM-fLqlF@=c-O!M`odPVto+_4=YQN>AJ0ZHTxdIL3- z?O~$2bIqy35)@27QmSXi-*fXAkFIv(58qd=4q+7C+#gbfV`wYFlT=cRi)58Tk;wSQ zqm2)1il8OzKRwA~?wG#uAmW57p8nF=&lF6-$yx_lW$rLe6Dv204Ck>}F_N7ecnm7YvkeMk=sLK0&1 zJ#2L^NhQqCGa#|2A`|fEr04o+o#;;kGEgncoyBN9uy6!DL?x}bsKkP1D5#-{c2Tup z*d2rY0#BF%`>7@O()*1t4xlG@`@#{>+mgRMxw2*AOk;Lpe~JcH1oOg{i(Vv{b!cED zQgaskSf$NwU?9&;$Ix|EEwtq3;jR?U5!rM-iM3sl7SjWkK&kH_d72Z%o?B#Id{mFz$k6?$P_g+W7N z&c{2Q+T|t4BFcS*@7o*Ga#~$kaan?*^cd^8+cu81fBr7^&=p@)uC2|c$lD?32Z&%l zd|H6$`l^5Ji<6md1}Gz21kJ2}p>|$zbtJMo9V^KVUOR={vXme7r4o_1>IPor6+^YT zLHWoRQ$cWynS8BJiT|~^5St`usj0i!vc3Du#l+(TYD~JT7 zOgUO-q0x)ljOAD+J+Ubclwv>;NaS$18UarV$7>`jSpztFt@|27{9mZG=<3vD z{Vk|3S0Dv5w)JDkWUnyj2@t3(L|j=RP`&wVO*EZhcdbr_gE(-NbURHgL4E4t8@=Rj8 zEhC-Atri+^DflI?fkfG^GbV`lsRH7i<8)D9j6zXDeuyd_5_Ge|15)+ERU)!o*L>}Gna3-E|GD2$~X7l_w zUBq(^#g#)2D2`vyv+>`i1*fhMEOgC843kiiF+9D#3|!7WrrYJXz>A?kcKSrUCBlG+ zOh-9VSZC^3aBr1FWRP#5cBG=ZwgO`jdPeHdRIhbb{lBMqJH*ECDTeAFv-=D#1Hm^r zS+XSD58C$e6p&Z8>6~tcRQ}|WNy4$2vecxAx0aBB5RG~IuWc=At5TV+9Fk~d%gkcY zqzVjW7O2TRTnqERDrmxbs{~-W?@a$!2^IOSgu=B*JCh**036?CP^$k@2^Dj&cXlzd zcX4Jku{Cmbw##rgR8_+q*~thwBnJ^iB!EK}_99gP58ItQr0`^o^<)c-;D&_8hK?*X z6uGotxaxkX)X`n(>F5}4k!Z!bsJTAJ+|qa5`giTCG6VhPdx97eYPckW8}rO@E5o}`v_8s#OfPyHYiVI^iI7n3KX1qgeg^I^^H1P zkk2!Er(ZY$+8cHxo;}DL7`~G(qyz1Z-&q%?WmN;`o)6E0i} z0`dkX9qDI+rL}Cn!Dm_WJH{P(XCS3e8HC1Oz_Shc9iw-~g%=>9kypyuUwI+Jcanv8 zpx@LZT4^5ZznHTV`Cdb>n6qD{RKQ$Quc$MtQUlh1QD-=%78!oik9eggz+8)WhJ_oT z-|Qn)DHc%Q^qp)W5BNFth*jFl`Y-nEM*hq2oob;M_&NPZRGJRdH-BeZpp*YPh!{lK zmkuFQ!>>3V1CLvDEKVbvO5}}ObS@4gL*rqMBunP`GnPn$Z?zxcXi6(p`peWS$63Kt z($3V}&J>eJO}{c3|9(6J9gh%~-~tc#;tUV}rgk8X=TP1vMJ+f)kW_gF>zuu7l>{O_0&Z5?&INpPQi^G1Er91cyeDUW*9_;eOcxgSF}>=c}O zqjyFTu7|3l|N8t?;wxuVN1RQ*yNbsuU|RmJB~TU`O(F2Bk-zy+b=w9f@NoznY>j(GoJ#Q4IA*wWm*JWk&cM zH{Uc3SfhwB;6;3&rL~)2o3|R7JZ5c4)^eMX^)$8^SrRx;`DE&y8b}p#V$3gGGQ#%j-VWE z@DU_qr{dgSyx9YYZYIEa!5I|2Y-R}&Cp3Z5bdcW~!J>&`r$`yIjrdMc#nfnru#{|Jx2)-m>4Usl%w|J8187bEc(j zz}Z1;fW^2Yt%5X-s)LMED2-~uT-uxnqA2iCj)*YiBRftf|u} z3&$#qz?3us%5inbew3t>TyZt-6CN*N`j3#$5I)ED z=DATn!Odj(kH`-b-UF&ed%iTHixDjjbEHxD-^0J$4)i_tZdny%j~dQ&)vFue8WoOF z^+!f^Q@b~+mVbs{Ew26a$y#Y=w*~4*$ zrTQ9e6Zmz5(QlD;MTA{>1T=h0SEZDx(^!sBErkLnqm3R4@GqIw8-X?!>0W6Cc0BNw zmQ?C%i4!;$DX|tNaoh$I4R9J1ad?TdZk;W&&btvwA{$%ZA5#rWRle-nvqSIla z_&58DfZA)uWo|e;Y|Pl4GaMjf2A<=LTwH2PX#{={_SO=s)Nx)E*?ErM8*&S6unVi_ zo@YK9m38aCStvONC(~#3Xp?Uo2h$&Lz4@l-fE)`7smq~9?v%_Be+v(eMp5qJvczVx zi?jOL!S}Gxep^zRQUAcQmn*$@D@fHFus$F(7vS`%^B)shY$YmlJ)e0E>>2c}4)zuM zs}o$G7+CPngO{hn!qL#u5dOw!DXBz&5*q17;$q~rPs!iuWA6Gh(RSxrMDsj&?=Df` zUk(_gxeMhVU$UZqWW%ObO~Wp6S+D0TbzjPd>ZiS&*2&ZL~u&P)L#frxYacRzF zvbuIUm;?0;ScM!DOUk`$m(=oUN;Q$0yY{i69$V&^c#<+Y4yfcdaAa&z$wj;zK}J7S zk0f^AEm>$9h{A9Zo3TvV^-2-;-7-p~?XEcC8ced#$J|gx_6B_RfAQ^z9-I7S2=mub zUiC=9E5e{!S;lN2*suehuM$Ri#_7e$I?3v~S&f;wbBN2e$8JSC8LNmM@#XwU5oGKj zty2GO6{Bv-T7tL)nK2C?A1h;c$%U~NZD;xuYh&z~Vc9eZ#U?6UHbXSB$f(9RdJkji zUzn%NYK>+#YW0+2lvJ(K$TAjd^4uL~M~b@2!1qJHQS%fHi@m&XU&AyjKnlUiVD!PL){edlavI&@&66Ham=W?fE_+BEnzgwE8J* z{ED%Ox6rlNPCITfFZ!k$^XrG>iO!Z!Q9SxdtQ)8QoY9&(=DfMU!@rV>=a@DjJ1AB9 z9&}o_T3FAh9Pwy9CAsLFVN5uk7R}Y~kN+#%&Ih}=TzseA(r=X*$7H!RaS#8A@lXPX z_ABpJ7jDY^Zd7WxT)|PUcmsZ})iPhTUjYl3k9hvY7b&E4vm&6Oa7C1Y3vT*imYQctWb{^&AH_L?DKMpC-cWHVeyAZnp_&r7w)^ z{Nj5RzU;;n@o0RJ9om_f7a7mPOYGwd(K#N^s?eVf3y+yR9^Se6IviJ1~Cf`|iOz zMX%kvFEoBauV7I^(4PtWNWnsduSL7@G@snBXi-8ipDFu_!9qo^jk~inJs>_s`?JBl z`LEHtOf)?(A7;Z`!M%mAn77qY4q!VquZXufQ8%FeYIj?^-st`aKDGOQ`wTQb5N^3J z{Na3h_o4cbX#Jo+>h>Lidy8H>cW-F?z(30OZ-V{vU&D8aXg*n9siOR0KQs38g8d6# zS#A%a@&G~=uQay{QT{NWsrwdvv$UTauUt`iU_!O8t-Cukp8~H)Q3inC^4IuXA(~IN zSEi^h*w3u}-r%o-*SuYSnoq7*p(q2;-m2H$T@CcF*$)+^jL1HeVYOZBVYEJuD4YJO zHbmXpHV}U0JMvr8;n-c8sI0z14_c4R{j*)1D2pHqnp}k3qF34L9u!`dkuUrck1W9oT$#ettj8yjHuS2gDAA!;(c`PY7ac_B5r^M z#z~(*RBNz1^)*CZi3ioI?Qmz`3H40ytlB2jcC`nRNA14ft>EzA{u3HP0FjapGJp9i zvWN5?^Q+G=R)7?Ge9$O*d@vGS53*0YehfSrikLLBXr+ty)wqq=5>~ z&e{6J>kr;fvYrJSx&yxM8rGhLi|^pf2jniN=6B2urNXZ%e-!5K$n8ty?%`jRE!<0W zJZjNd*)}(B<*l-$A`Z=}5Z!3Syr*Oj0qzm~fX1p$$QvpBHGv;tu;doWd#Vp40Pi=WX zc%^=Xt)Jj4@&I#kI0SO2X;~z8 zs*M7H2Cxo2uL8b9ddu3&kX#B2G4~0^(={hVm-NGeld<->u1AsC)U7$eHLxuP?*i}3 zQ|}U@b*8`he@%s4db6Pf6e07$oB&?Jh@wan#4bvRB1q%NF4AEIgHD2vKAnYdhoGks zF~U-2=)9CBbH8xH3DXAW;EqI3C7e(mjoY!kB6UFpj0K!4@B;~(k0uX)o*p@|pV~Rq zBuq}traHC1waeBp3u#QI9-rX0)3&X(zf(E~o>tG{>XJjzaL;dCLiqpv0{Q>ztk6dM z<~bk$K%)i%p#3lFEL8^^GkXOidn1c)^~ryhT20+hJ{S@!LV}Imo8+Bb-NK?WoiJw* zNeRNDs6WRLx@nL_1C&tZL8VcURWBh_i>XmSH9$m^qVoT<6&B_jiqMx6zeWU2d`)ey zWjQkKK6vlEAmy>KdG|D)WLH?2yFVZA3h}v91+2eJ5zBC(QjxH|znN%SeL>IaK zQ#eSUoSIw&1t!Y#nf6bNcLWDq;8cim%XYp)Zb5>S0jU^&yZQ~g>j?#`ZvacL}jMCVvtM;7=?LVrg>@ij%oU+Htd zB(H#CLh_1m>2ssPBNV5bB65!yT}IM=V^sbhK~&PWi%v<}B0m-7 zrr3tEQ%M)(fwQP@zsCRu3i5U&T^!_^a!!2Y$2?AVT|-sLz^9PrKyao6LoyN0`tpB8 zW{00xGId(UEz(nRs1FT8wiK_NNzQySSH!P$sEx@(o#Mx8k)8_uz%_*+0m&i*ioqDl zn)|&I6zf6Ht+hM^>3rX4F0Uh93q=lL=|h|~ieuMEPch?X*(t$DPZi_sB;Y?(XJO;* zG@v{AasCi~640IESRj&zo<)lM*f;V`*jO+HScLkJIOIdmk|#aI68WZTESL;DKy?;1 z7EA{+kslWiWhVidD30kO-?WW;5`hb-57k52iNG6aSPrnt5hGKEJSC25+Fw7_w%Ue16%d+T4;lh_dMbbUc-pBb zh%FUIWsXqp8i&XM0`P3kGe=g~mpMBCH}eQ;OK3Kky70{{HI~AjH<^_z90-m(%x$$O z;u>5Soa!116=y<4H5KP>ZM8l2e_}v5TDjKBI2AJ1!P_e-Ii4!*$}8+EbB-sDbU2zT z{NxqT9QzHE@mP=7eL`au)QYHS6WwAlxOOKamH8R2)N=e3V*XkV?J`4f9m9E!l?Z@G!+{jL!*qT zvBOnW$q7MW>uN$ED^cKWR^Y8x;O$o6EmGiZROq17kbqqFmav-;{%eZ10L_J3C6TDz~mAQWC0%tdt}@`$V%T!%l^aWo}4Z z79PE?N8sQ{{*6ny%ucSp!nH{LTpRjM`n0lJiP+X%;Ag#sJy(bfCgS&nYbo86rWv7} z5bpb?G8$KHHO6_5moX8EW9YQiR(khb?^~H!Ich?#u4qRbmH&V)ywIoi`%TcqdPH3z zXK``j7v@|Wbvf7-Y4b$+__(<7G;qSpLSb&QK^yd9M*r+m1meJ^lFAqz_dwaPsHQ>A z7|Lh}Ls$bGZ^Gunnzr-@q22;BphFJ`HTqpO31rn! z`dUQ|>Ph%K#I6zw4%ERApgPoi#of|UP(QAvaK6~FUf;}N0$WL`5Y+#xh&6%Kqjg-{ zQuXIk@%u=o&k1%|SVcupBEK(c3Nn2Zi>yKiS(5|@v-O3|I$}Jk_ukbKhsu~R*a6*2IQtke)=Ll6CsUzRK!+$?XGTSl1nZYJ&Y|BZx}=R0YXo z=TyZ-^$}Mmm7R5=4hJ%Z*C=Sd5JO-zfJHZE-p8k?@f-l&!qfK(M8#SM9GTikH@`Nc zFdKSxXJ|2tlV`zTKYL}xm@_U}84Rz|8YdP2YzO8zu_+OZeC$5qjiFTFf`BsQpf3JJe`O(C>#3}ww5b=wi_oAHfOEYSeo@|PG31mZDJf~F!df~Nc&a9aju~xn33U>Ka#A!Y2HRC zWIC3oit%vLT+qDjV<^z7Vo7AUILVK+#eUkGN>3=jx3i@ApwWjK`ouJHw7<)k*z5LI zaG@ki)^VCCwExmlsb#P^kDbW$N^aQ3mg|8@b3&tkqSVCgUq@$r8VQx_ZE-x~qSbv@ zfKB&{ZFt0^n`~3p8i`FY+Z11mtv}2%q~YrS=@3+cQl+rRYOmYYWCNG(Ry0tuRqV($ zlJtFH6I`wvCha?2sIxwX>Jkbh&Og+QO~Yb@PDtWL{U3IEb}EdLiMgLkCcnh-qYN2K z3qPar;IYURoZ8(B3>09>gWp{#-{(Wq7X7^#xEDa4!aOCKlPQ&Jaq-c-2UEf9Nf{yO z>to0+9yhX11>o;MWEI53d>}SXa+UHC4qKj z1e9_v{V0@^64SntHz^@MQdKOBEqJWWTUXKp!vI-^GH@_U{T9UE3U3;i`nBv{t=fZ- zy=wvufXy z;@o~ZhF98oW`Z62{@Hys%&su--UB&I{_w-jU~s-$I?NABlxD1(#@#LQC)~YmiJ;)a zdjil)s`ObD5PxKl@Uf#&Z~@V|m)i@>55dpApdE@n<)rrr@Vtb{Wb&O~NjEAYV@F)%I~wGZR!(nd?H{?DZeh26#BV(meevY3Y2ZT1lV1rwy-7YN(minC zub}`enR71Gm;o{d4{#XC%BcWkB=7I~x33J(@gv*tcedRn;cSzV}h7ly|_eAwk2)dE33j$9rNW*6O z2!OyWIA9>&2Z@1q?qd0~IceX&5FtpUPR8Scs>#rnbc!bn*{91NZ~Nz*O0lK_Ol;y8 z5jMGAN1rA7StA5oPu{6l0=Qy=AvVhC!s3~2X~C&2QrGDh&WV(2y^SEwNdbR1VYc=p-9SDl*W(i zTb=Rz&t!!9x&r#3y=_lS@EqdZQFR4t_7(>O6_Np%KE(jQi3lkY=q3T`mdqRoC_dC8 z#26$z9=L5#A|DDhYB`t^KXOJ`V?Y?#Fkl!okP~~FnIpNqEov%81uq9lC!aAxH-Yh) zmj0Zl&IcerjPa~b@edXbG6kMCM5eKPc5Hwo^&jlt7p8iRz8KA)EDa47y`s`#s*jf{ ztI@h5{P}e|9B)j(7F<^9&|MboUQHdH1yLx6p2sV@(4=xQ0ChAxXCR z_IG?3(NPLnW(25h@!+P~Hxk5G>l9g^Ynx+(M+adGf61zGoME#-i1#q#;x8}KBsdE8 zw7C&aTZU}I8efbjGZa`)pqpsm_zUPbe58=0M|qp5T35O|8MfjcWFR?#>q_M~7bt76 z1@W2J^j{t2 z{flN>aX3;@glDDpZcsZ@KpTRqSt@Vsl6-!-CF!4>4``Ab(Uq#FvH%+S=d|OCp|pXg zlg3Oc(Tkd@OF*-jda>=x;=Yuy&`ZRuFoId~CyWGJ@&iZ2EcsJL24nt?^NSyvG*FT- z#Yd!b>?^a^6y90lYAkrb$J$u(r;XHk1#$ylImmLQ4`d*PB0Px6YS@h9=<|tNl2Q{; zxUgBYh&XZXRIN|g$&SaI#@cd4-q@`8qemL8e4t`auzwkp(>Q7<&F}@Tz|@b(RS&nM zqv%Jaa92Ch8FP+y$7s6Y?K=fdGfDI#!%QYDE&ssVjuD>;*q5$U~u1+WBBdh5NE5hIxN8m)|7>u^Jt% zL18G=fLL)OOLS`}J43N0YM9u-7QBs-2K00@8pcUuy)=Qt23x`k?}%jK_7yhiMubox zUL%GlkJ4XmJIqx;#LG|9dOImW&T1xW%Wg2!yHx+~6< z2wa3t&}=VVHwxuW?1tt7F^LfV;@L+tXW`#12xnV21KhSy4UAx50cafvZ}x}_U75;! znIu@OO$#Zh(iHGBk#y4$8<%Yzo$(ih$dkgU7{QTON^vOe;r4R-`p8METG>BMLmhb! zb0g8&;UEWX`>q4LPx^A4m8r@bxKHn4ECu0XAc!yQ6I_r8Kwkoj{~AH_1GY{{idL;6 z!avkM%IBvsQbLK?a0|GSZb`dV%Ts!qeqx)B#t-%pr{0IGiED=c9rJDuow?o_H+L(v zkqVseBpF6)Q|w}C9vXEJ``pBqHh0Wri#+a1$k9WvH)$G3EiV!(JE{>6MBeH^y}zAX z7jJ6?OA#irw0qM%1luc`yN?%Hq7TZg!Biqq;56uQ z=2Rc;sEQk&mOQCTLf}>7gIr9yyRNZ|_ZH%6YBe8|{T0zW0Yy5cLGvY$ zUmL(U=<1zsFKi}klFgla6V3}R?R+%aANd~5t34M)4&9He5CF=jR8Dj*&SptIs3#fL z$tpfr$vDmYw_(!_{j3iJlBx{HyZwoK=33Yv*U*@a*Wp0KF$K)m!jYGwD4DaYRPjTJ zeaU5P4E;>lJ667Z`V^zk+YfFX-YD!;cs9$8Nh}DAp||GDy){!XIdj_(crA=3fAPEg z$ugp1{71v~T2K@Txz@u}6^{MzA5&@#C^Q5oDK%j&|Lr`R&$2u)BH}j}b_a|Zc5UU! ztb^@@)x4G>*u^bRyIaDdJMDY{;hiR9$S)=#bngXDcuw{Ka{nAm@ay}FrWH{kbSbl$ zmdMOT4%`?%dppVICXPx=8+Z-|X6>TO4$0!I^Zg2x94noWjGw+%)4!XJt*(6cgkNy9 ziZgJMdW&J$*i0dee+EZ2YS+$?=*rnldo?d#dKLZf#`&@M#9uI>5mv@e+n$X(Pi5o zSl{J==12(=Ri3JiWue3~=T-3rthOP+!O6$L}q4yj}I;|+)Zu~hL0LFB#R z(4)i!GkxHvp_LgD{NwQWv#`t23!&%rW)w~>RNHd&)y?ucg}bok zHY9r4Di4h3;R{EA9}Luf>o4d}K=?izH~v=)*{$a$h`~q>HlY;D5qBC+%mFZwI~OOo zlR5bpDH{S6o3kTqBcO~0Y2T$3=UX>*U_YgvJ$N~~l`+@`^?-9d?i2TrvCtOq2J&J& zvnP5C%4n{&nWgp%2QO@LZKf?LcF=bXoIhZC2y9K4KjK@1xCY_@&4-F)aWg=+HhM?x z22*3Ku|IDMS7W}i$8rhhf&Z7a#>{;$@)FMjwUbEE9BJR{S%5!OAlAWTb{Fzl<5D+L z5dOgnaXV(^0706R!l`ss-UZ4J12%kc?>!mjGz7zEcOGbhm9AVcI{WZCDz_>u*?3FnT=bTJ4w($Su11y>1R~ zX=pM6Wb_=KBSMcY-(nU4mUzMh!4`u3I;gw`N7L;f>Y8% z?tF1qCFVL-n~EV@JVN~hnP)62)RUA@DUyz=I?`mmL0ExxVbu#XPlB0Q`=~>7o3YFZ z7zp4+Yj`VYx}r7#8_JNJYFudwtIr>jQwG-$G`?l4Te7xq^qO|5)_>XeRech%6fu5e zSXm5r4~W0i63afh1PIo7=86HK4W z6aPT24RqaonA5jOL~_d){=kO~6HE*-2s3(7@~dZNIor^OSz?(9YZux8pqyeun4Pz z3{ITK#xJLLkr|%f4ZRMhv@A?#L?=5hDjcn?RHH7=Z&K=+wbx|4vH534)q+^iPF0yo zeXpIde;h(jv?yMeC`K5(B<8f@@2CYnBYgL@Ub01H;op5Vkg zy_g^@R{dAy5j-X%A4j&LJuGa38^e#=6M5v%NSKimAo2$vS`-tT(JSpjoDmRO(wvtS zcOe7DkTgSyG784RH~?+Z#mrVo<(HDi9ph*gLJ8|8L)x5erWg9OBd>nfw^gxYSDjsj zE3ZBf%Kq2)8L+4CxU^~MZonyI29Qt~hxK#uj+J8Zu2Np{+ye{jngcA`zW&~O zAJdic;cJ*BO#cf+!jkPN3I}?;6@)=l`W<9HJsao)IEAx#mn8oROE7NtBrH+Ma+y)M zN9aPVy*4mq>Vk0-*rwwe|JqZiYg{?`y*YiQvatm|+4j~gN%$Ax_2BEDKG{wV*Dg~h z;!R1`nCA;`m&2FDix9IC*yom{99I5-|F|=p(n9Z{C%}?puI0k;1|+aMO{m7d7AuCK z)-t~eZ}KJRC{2T5?()JgI?z!4ZrwN7TL|(!<1!+9WjjzfQuwXfvnw35pZl@rH-ZBX za#QrnCnrC4^7dD|r`~HH@G+2Pnd*Vklh!^c7AzC4>D1tn|BLBWKmR~j=*wGZ&Ym@m z9a~EKy?4_9ksY=i1o~Xb8}*bYKSy}Zzd2d>1m#aZ!kM42vanvDY+%0s8S~2NLqPr% zuPx5wl`vFbevfP0ENo*_>a&Fny^>-kAt?By(*?fQKkNjZZcPIyURam!p@m_T>iwnV zW5jZhg&@8$)(UGmqHr$+3+}s<{_MNs9?;Vv{DNvUG;Z4N%oda}B ztTr9guBS)7w>9tw;NO1NGZfPqkO7iY2m^m(0-pz_oW-@5n=9T=0X^!eDLW3QuJH> z3x*2v_LRtiH{_kqgde}e z*MsBACU)l2sOhiQx@2Salhk?W>V~?z^v|rOEgC-X5liT*Hqm^du*>{a7Gl=kz9dfc z<1QuE@E5R5fXj(O>stob)-hD8{X=&So<*W<_Spq`Lp?Hw6} zB`oJ#tw3#Go)oGxbZmJu%Zm77FXg5#k;L5UB@D_V$^UjOU#fs4Xg~5QkoL8y?_vTD zF@5tX(eev1r~$%O^Umy{fU|1AkW zG!f|pssKD%E%U6m!C&(+R*?b}qg$jNNc!T`cOd{xn0D2rD28Tqx7+})=;wq|wB1~F zLrlOjX0=Qss-Y7dGcI5U)2{7UE&!xj7zW_SpxtvU6>zCe3W{}rwF@bp_We$3?J1j(7Wq>*%VQybQRgM_-y;+tztSkP^vYv!wG9>|i zQ!FgRQbp7|Az^i&pqv5~M*BB7;k{r@5mh93tx!35t#jYM1nJxNG}+sCd~)(;58o<^ zK=9f@Mi~9?M5qJ|9OSla6kUMLgRqdL(hxIZlJ;Sn`ZRfR{#Dw&A7h>JQgrYz3Z>wG zKB*93)Jj80h)GI@f7hmolBcxDjs~xMeyYQC65m)8G$$Zhu34HJ zfUPa)(9c?)k^fCvzC;pz=HPY0hCRuIEdzOR7uzFO5#^8`v#j4NG(&~~)1gQKO;|Ig znPY`XSb$A<_WvPu0Y9IkFkiq)fOo^n&_SaO3Zth(uXzEBx;V)QbIt?kXfEHe*@C`R zqq~KP(624Rim-elpw;#z5QjpUKj);?rg$(=kM2;PBt_Le5lWr%Ut>5I)8+*EK5)g1 z*e)+pDE?gJRr!Hndb3>^H`kGT8C+rV^IMU8q6BwJ0?IL2ss&G$r0^p~;em^LkCLjd zln3F7l_y&Pjtc(>_J|tGR@)-@A$a`lPw6mTwh84)oq`+(w?js@hMl%X@I%tLmc_z7 z{7fU|2~C!|sUsl^&&z6)Q?PURxK%@<6Np9OIF8*y7+!V(W!az7SQhSKN~)Do1!nFu zN~-Nr4xH>ClvG2d)9loT);{3##NNgp3pTWeds+-z=6BfKBhX zS8R-MuvwacK2%jRV0;% zXKHq5dunTEyQiN)iCngj#zAPE;{m#JDg)O#O>Q{@7p{(bFoAVVcL4W-v9A8@j~vTL zj$N=o!H7om4bwrmRjl7ErD*gG<{TA}mqzAXJ$D*ljLD%>nOcz?sA*R<-+Uv(BsMW3 zuw-+f`}L?9`^MEOcJCYTN0x3;*1P18%c9BHuFra3K3dfb2WmQ0UFqL`4a%|;Sh7E; zPW2K9$ckc7`!OGTaLIj3&x%?E!~YB0WC)>owXIP?_?Gln;B1gX%ZzcXgx)hXAzjd|_V2YX`(-KTq5zz*Di?Is6@R!6Asgr-=6G$U!fG~RrZ zavO@UiD1~k1WAR1;{1Nsl4+H&>)|GLOnpSu9j?%eQd!tKhL@?{gPR`4!KSvl(97rK z5U^q{dZ2kl;{!-R3%}})xB~UJR}L(n*X<@Lw>Y~rtis<+|G|eP>0pTGwxEf+H$}WB z@V4de6|XL#al2&|aWYv{1?=wl0B))WDs$^-6iB9z4*60WNOnd)*8}9DajaC&U2!)C z^60RoFfYJ1lriUPw1g&MQ_BKg1CyNVvz!Pwz4eZmdZbfkH~A_3v&W_ z=4YMCbY^-H0lO+gcHOVA`{2KN7ByrD^GLzd@rM)BiR0F8Z^M#dB=|lNT!n3 z8*f$Ba5ePP#tTRWtXroD#lOPV^O5>&ga#KQqw1o5apwFxQgQ^U2(3=UT0F2i(^KEJ zlK@ph{Y!U#(Rx;9M8#x;#kejF#e=7sP!9k(`vG?dfIsY_xT4MDg2Qk*;iC5d{(v?3 zr|%h$@6aH7s;vl^#fKk6(fH`=Uf;Mi^=YS6QmWUW_P>yX* zuF}dkfk}K(Hh?djD;9+V8{HldSp%L6>%e|kAM@tjBtuRo?iDK1(O$35I|M}}y`MkN z$$g^u*2QoX)B{ZeBLZy#2vuHdMZE($;97!W$S@L6xhBJpe~Cr|?BKny517TZ7Q=P( z1JMG@0?!cjP;Wj?qVCuF#SQS{pezkEicH#xMytG{i-raGi4H0wMj$f6mBFW>-_&tt zue0V%1h7)H3U%Re550EB*K|B=rYWCqiSQv zL=q=K7B@m^Be3F`bk50qPd8E2DM2p-2mc)81rXB>-kaH4=YL9;k96Q9^YB;{q82b1*2dLDx8F)_|bTVWh}G0vMP!ed725gPNNunNFxYd7YbQnu-F0si0(N2ol@kWAg$k2QP?3`Fp zmw+71rS_$FFr0%ho_~|s%gAtrjaN&-<9GRiXSO}Tm(zY!lioKU`?a4(P(me)(9h8j zp*%hxaefA0Bw)>+q9LOmB?gOc!@`3JfVnXgO?V3t-R{xYT1FqgCH1280 zh_?&Yyf{D8mHhdy-M&{Z@T0%g-(L>QS;=fvJu&!151}3vi3JAaWKre*uVmZL-NJaK zrtf}+H2i$o)MJ**bMpRVHAA05lK*k_iaC#Cv{aSdK{69D$dg_G17)xNz~tXvbe5PI z@%_}dKx4mO-#z)hBORg4UN60HxSmA?zTzO5fh-VkM)5gBDBq)BE7^|LKbl2aV?Zeh z_nvi9o=qF!d^eKL+c+Ek>NJQgFXybsL6)b#T`##$KCn+VqVze5PQE(5iRQn( zU+Lg&xm*hy_4mE&659l#?B@d#`n|#Ahj|9+mGYFoOhzHi zNLGZD$jGY6+5y5yLHryP8%u99K^=tvrxdttc0j+0I44e>Cj9>jWu2z!UHv`Hw7Yx; zJYokE?h@nwNjS9gG*}jBjbSD-gr$LuXqWjWt_K2-{;vJ(=6PR>6lD&i~o+Y(vw=9u*wqYFT>iWa*ZGJb&Tncn4lj-`NE8`#I!rk5w11 zs4gJ%k`?guc5Frs2iUVu&7GCNAN0J_nl=Se-DMp{m*hW&=(*UYfXVQheR2P-?5Q4a_g+~n(Cd*PWCO3vY4`{kJxdrn}{ z*xH#@$tv#Y$_y_LI2!`)fpa@Mq~!+tA4D}E+;B7UKbb@7gmRdyEr0k;15e=&GKB`lT_V3qd%F* z`}}qhyp<`|fOj)mKb+TRzJxy{6emhaL2rXd^#ydQa_wE(3 z6VojbKEpsoWY<8?a|H+&=H$mEwAjX`{0{+yGgs1kE%~Vd{U5CiT)u{Y(vV87Q}>$o zWcq=p77*9h)OqRsnKLV%9B|24=6!2Ee}FyD)c(rUSpaJh&5=(hC=LBUV<{V?>;|3!N?ephTAE$rKxx=k^rvo_zt5}!SEmjg${J@J&aBu(m8V*cZo)x&CoK??VTfd1nyUU`yX{Mqz+zX zAJon8w z0fXU}LL0=x#?KDuMST^@5g~QMXFnbi8~l3j&kn3aqo*JFw{k#wm{&;Ra5x8ru=xgzS*)1k(H@8 z%RlheNp23TP7MWgNPVMv(S+1tsUT;f_GCMOj{)t`4dM@i5LdJud~44haBF@eU}>PP zIT^GBXGM8RvZ;DzMU~SME_Zgo)tV2LS~^~W9YiT1-I(d+-JQ4O&j42K*IK85?ZC-G zo_)PKX#Uv&hN$Hf$3n+nU?%3l?>d4dY)7yqAPp=(yS5ERK7*?ZwyqtB#u^1A6#kw( zt06%fYCWbx8v}56 zh3ymymjOhJz}!w%z8l+gDvw+`yYY7IgMohBw#lCV0KsB!m8^ygS$9HJUR>Mj?H5Kz zG>=2c^TWR>bvWf51j@Q$1Vc2(51BLKtNZ>y76iU5tdvP5vJ2;ccB|{}EpPYxy9y-k zm#ay7WtScwN|8OShr(}~!HnU#%%@9y_0H}D=l(W2Dhr@nZp9M9d>fFB+7G2l)lQ z%d-wCXmwu%Xotwx&1{i#OilM*og*^*msz@4@_#^N%@Mrv*12{o2%@i~Wnzv5*~JK) zLt$Ca3bZq-0sf@`plplfHRwjkHI2&^t%t|8%J=$#tM3goi<-&RH$A}u^B`MbK{90NKnAc(ID-?%R7jyJ3es4j@Pxh|@lhPf^R{sXr% zM#t8$3ZYNOx<^#-tM~o_OUM^K0`u^e9$gObUlb!h9CX0`P3gnke|EFssivZDTAmISq~(_rhaF9H3GRCWEb8~7WJAwPz%mcNlM-!7ZKfp==sltX)1 z1-aNfe%uTV471GV;#_>Vo^#u0V6|xcRji@q((( z``PP{|0|qF1jC98^qQ{A*V^UrO~Zp@MlM_**biv@~ZH!La8D;4bzIg#ZEfGf)cgZPj=o0m_4jA5FZu(*aK%$WZ@F=+-c@z#vPU9UECZL$ zXSq%-u@}%TILh=vCxB=8wqP%aUHtKZcY%by)UvX^O@_-q!Vmi^^~fbOOFr1Tub;l* zWun&EVDk}g2+#U{J9{<)hQVcsT2in~BVZvd41}y^`ycR)o?Y-OyFL5t0~!$?5CqU4 zn?zvKPTm2HlL9xMYY1m>7p6zCzAM@OM||)bwCeYg*iBSj2-d&2Kjk9T)Ois<)+W=(v48`ZVqrb)Nm>c0`-- zU59O-_Fc$-K>FJ#^7+~bh}{Tc9_NJ4q_H3iZs5W>6wNs}`M*|f$HKAYDLOPyAdn$B z=9eySD^UG`_kd#w>w7yQ!*mq*?I`b)z70)stW5#*U;0HxJGHG-PO(-P-o|i`pQ&V? zi_r0wpPh@i2?92PXI18)(8?$}__i#)ygyd~bbyx}RJMx%It0N~EONJ>$X}4FuA%o2 z7WGwQ|B!67^%S_L9$G|yadfb%fF{wj->iDrg!`34Bk`&jS#a!3r6adb<3Ia(2y{72 z->C?W*KI8W3?-g}ww#IxCg2{(1m=G_c>M{rgcppuvo@DZk0yDGhf0xi*xr6uSbXUe z9A}uTchIuzy|k#ZWDg;`l>tt0kkcLG&Vd6i2Fr- zWUS=sh>FSn{08Lt--okaVZt$Uq6XH)j@!^+K&yErWVb}##QQ|ei>{HVD+4Id<4&qC2Y5G7n$_doUsUZwC+8lfP)4d4a5 ze6+*<3w;TWGD3X#AdrYgX4!IS5wJhqPgqp{=pj{7_#G|(XS8-mZvOz2xCp09cvywq zC#J-4?VvFPKO|$3+LSWnwwbdHn1lg5EFQTHeM8xb|KVP6LmRNB#FPQ?hvjbngY%1+ zr#OEb_^p5}6SVBLA|>Apg4LC7ZM5EwK$l`k|V(mgG+20;s z@*_%+X9|~xyzMt$Sn1QW`1bu?r3T0Yn8V9V-)sSPM}9^CK2#LLV8q77uo(}4d&MOX6BKtR=N=PQku9o)t+#1ggzST5 zJOitJ8$N72JNIw?t(@-fo7$ z5WcP|jhOh%xUl#jZRFOG{(OG>0D>VoCh20m^@6u6w5TUzHh4)>GMWf+= zqT?p%^;&=U%p6v3i*C^0+#S-(O&N}+ z8wPRhbLJaXZjkknq086}M+$pmel>3DMb~utOd_Q(Wmk2NB#|Ah%`PfY%|FcdC_pyBzkImP^GRD|_8+i~^*1q$V`FCy8@`LCZ?M$SGIKeZCI2mxmIhl*oL8zQ3*o%!rMWM2Y=uR*r7uf! zMRs8fW}QZjSd#vt%E(uq(dpjr`g=9FNyv*zNd&f*BQ`usHL<^{PfWL&!xlV7!ff+) z(RqfhsM2kk2a9xHEjZiT7XBFe**0kNrEe2V?0FW}3bkD=z_WptN50|cpJ?{o-IbY* zv=!Cv8bWH^D+d{{9;aqu-avDQOM&sIo2Mk;u3O;myO!># z%e_UXwbv7mb9VPU2p4Dw^y~Ni*|^drs|86ra;@ST)xzOg{mJRt%!2Nk%i`kNeYHz_ za?N$y-%HO*%k!(XzpOWY!R`N^ah?P2QSZdgD;L3S{ubo79iyywCW`~UZ3{HQrwheC z0<|N)c#8zW{3mkR&JByjBCSi7h|61?v2G7s)f11SCjXuVN9`{>gI0I8jg4*=2RnAI z(VlB2{M=h7aNWZuEKgXo$rrSJ$7{X0zWW-)FZ!mDKNrmh3gs*=G}d$7#mq0HW$f7Kqi@RLIgm1fAdeQwP&vOChyXL%jPp0rps*2h8*k((T$Zwd5ZKaUIi z$K2*8oTr`~zWjW}CbA@G_9!2x(UWMR{$|NKw-hR0YvG(aPxeLo8$+_)>BO#%!|qju zSu@!@!Q_Kzrx(K@c}uR`L;UNcYIhuTqj%ky8ijkI0OZfe(v$-Z(~;akvE8U z3?j@sa}TgjI>%ojUAJs%?wD}8_BGlfeCQZo-F_BsoV+K7be<=#Aasa0M?V$-e9>%KK}d80AF z`|r8xnN+8ReQkEI_u{#fefhf589}G-ic;r&)4vztP4{Qtq4rHk((>^=@_kZg@9F*h z=GrCp7S>0XLm=%D*f#V_ak9hXL< znRota&*T0q_wBIA6_Sz9>uf4js);_XF-(!0OV54|MU}JeiVWTee zHli>5ZNy#}fnf0ULeL&kqS5$n>9ROMU)z zo%y&MzwxH(4DBOf?Rz6e?Y}L4-1kNr-;G2#-}Odj-5NnizV?Oxcaa!K^4JjwdH@7E zTp%D|UrNA>Y=ync+HpXAiR$FO(Du{VFz;aeu|0t3dC4sn`0|j0(!n#>uZ$+QONZ>X zUyMj_*@&chr6?xxSSmL6aw-=8@Ih?mVNuNG5fpT`y^qAQb&jF;cb%Z_dnd>W-``;p z>$M}N{Uul|>>(^jc#j-YU`T}UMhNCHDfJp|+$%y*aVZ~+@JR3%_hsfU&+FobhM%S* z#81%?x09zS&R^JrzLT{n&7YzvYModxa-H-Au9L(DZ(mQht>GeZvs zi79wK>sCp*<8M)3hd#)(#t`!>$V9Yh%0!V;6-d5?(^1i(TgR%0{2crsZn0w^uC=o* z?!Mzp!CNCW7`Z~R1MZ-BFX>15UMdSOg32FXjtWLNoL3<(rBPxWEr<6c<%a(R)6DFjU%zRHPZSejm?-lPT z-z}FyK+@``()%JQ2tg6}9@jz|8_z;Y`Td?GFRDxaIsP7)4UbR~6ylv{^qx?Oczq=^KD3paGIW*bSH^i=5tov?(wR?O4!$jLQwF=}O zP(|0EwLr4`=_JyC{v_I0gAb=wnvb|umG6D4G9T&lA4lptrp=xO^3eQh?NDXgILFa> zB|iH|Jf(%2(D(+!ZiZ!*&2P(AnKRZDsdF(Ujdlhl}np&l3&P-H)>9cqZ z*x~qYt>OH3LY7)@Qa2S{xi>XlSvQptbj^HFsrL1;j1+Pag{X#pgn9%nauH__VTIZo`8rQ^LtO*l8V>qrh9a6-%cuGmIT1yivgZ7u~ zS)-K{*T^P@LmnsjX@$$e0`QwlMmc;r-Vg^uYljb^0pdaEe5uc5pTt(uUBynZy}x2t(+GaQB&?<{Vr?w1&nFcOziCM#!CRZv7Lw^nLElRb+zlqR5arI^W# zRG<_OuTGvIu9h7muKrK{RNW}4TOC^ts2(kssn(g0r#2x!Rhmq#|1oZB8onT;&XIwG z#XwGWBvEbVoy-U8M!8h$Uus%QwhSP<*o5?kFT?W7%)7;>324)6$r01S@ewoQGKJQi z^5)k5@&t!LUzM@rp9;Zp(3#povBUO)zlS{qCWmv=7dIcKf80Dy58f0POdU?h%^fZm zRv%W%Z%?ns(-!zsC@P4s%oW0z=Paw#B)&`8j2_S{j{Jx(vb+iL)hOj+GE3m1%hyUv z=g>~ecB-uVwEf{Q3nQ$KecSx-^(Sv3@@FhrY)c<%p}5QZI{NLrIzIKJtkF6-`Ojtr z=BY!|SEFAJQ%BLP&G$sDHTO`g-7Mnkc&@RAVw-jJlAFc#vYVxrQkvzL5*`EVXs(-X z)b=3L4WshYcccCVnFdnU+W*|A&;F=RXZ_)yUi%X|-SMZV5Na?WgWNKnfaPxR33$|^ zA+X|>=vr`0d)V{GyCC1-UOwAZh!S}G^xL)Vm~A@TKEt&pJ=wKPpYHJ3{&JdkwMEvl zB~fPGtvtc+ghxYQ`M2Ry;qvKpvpu#vQ432ftGl<@Q~NT{p;{xPaAZ|D>5uEP-c#{1 z(xFYGh&gR!>>@L{?jTxnUj@DHkX*uCh4><Nh6BddNb?Qn-KrnBfgGe7$=2S4?< zRMNEFm}N`5R$%bFLG&01@h$y!`xojCG~6fAzG_O!p3_Vl}7yb3yt z-0^NwI}k_wg28G*!abd z7LwEU8Isq=*eGk5>D}4J1F1e4^ffe0Zk003er{;vxJU3*KZ9H)tz2Kpdj_?!On}$2 zh-lA8BanDOJCfgU$1zDY<4+?KJJ`*tuVnBwmBYc zvBO^EqltE1gziR&yhvl&?jF9pwht&@6_OF{jtITRRo>JM!)`DVEAJGvQnGZ>mTT2; zy|6TUvu-1%uid3iAFH-jUBb6!u95ndT++9euMKE&_6OvQCn^(TvWOBUv-}xPuRqWT zipU(Mtcx8cWamik?lVq3hDNY-iieMo=Tq+}YvElJ(K9?^GnPJ7l;gQN@n|N0K+ z1W65V1SJkv1t|_+1lbM$2of3|42n*iLZVAN3R+L7M)GIc_IhN*_X=ge_b#M&Yp+Rs zGW1RSZrGF1Z>XMN-EKiY;6yrfFoQfA9n%Qfxk?hzTA`r&LrhJLV|`7T zV{lE2V`WXlMa&lci=3|ZLw-#M3Ij>xS95jMfSN*jInUCP$eQ2u5{rf!e@>V`mYguA zm7K8JsNKC^tvq4Tt2kluGF&vOlj2voX>hJOK-g88lHGNjVjGUlgVB={Li0&k?$m`D z?2Ad6lr*D=_UY*&o*C#O!p7%XTvgB0WbnYTfu-;78p}(ul_GcXS+-ThSTt%GG+=-g%7|Yyj z+cZ6QCzmPs%)%vka`op#R`uuPjuI?JUn$@hFG--* zQ>j4P4UwDVA&uMD)MSAcX3^iQk=g@Eh2`7B!?UR72yY(@__HlF()As-SxYK+B}+OD zl9^ib6-sQ&MdQrN`QwbwI+^P3YMJ_X=>nZ64sK%2m0rr8DJ@lkQth3B`o1}BjZcn` zIJdD^u}67Vmq%My{73P-=yNo?%H<=&|K3>7jWn|v{N)XF{lpD4{qzhB{B#YL!!&`u zTy6&0C~m&lR&Hk5)Nbn8ly36mtxsy%AKmn`1>C%|TW2$U$4JpJ($4JdeNxG)L7Den-Uw+jIB?jiuSz zqpHf9f)#$cmmyv)TOV$hBlc&{nRv=YG)Pta%N|sq&0A)-$q^HCE(Atp`%J85omww{ z3@e(-UM(6+l22Zb$nW@WBZL&8BZg&$_4kdRo>9=hky~z_C=w0{|D#+cuk%<;)@eIs zAzXc}>9bikN3A-qM_gL330c6_7e6J}?>?bpIX$stIX&&v7tq+#p=26iQB8E0cisIY zudvH5Z@ViK`P;d!P~JS4CfE57P2m-;yv;6}yv44KeB-cN(#bFp3xA?M%PNym^^RtT z&7taJY@y{YUDC^NB{R|=5xQBSgjZlEJH@T0<**;I@5zgc_+9jr$$mC|O}3;1KP)2# z%DlAspLTr;eO!c2!?Wmi0#(z`;dS@D%#;WnBE!>u2xDiVztUj&6(ZC{TrBat^)+KM z7gpJR4p*CY@G2bd{4FkB*4e?{8FJ`$*nYnz=5^jqgakmsCHeFzM+UqU^y!lUKuSzf zOjJx%5(yEJK~5FGu&xm2ec#QBUfJ>N3p@9GeLms0Jo_3at7I{*um`cAZE?Z=cy3Eq zM`y}bdXp+NX>&Rjmui@Svua|&x~f+a%Y8I*U49TvJC98vOID4GHoRETRHT(5KVBVC z?Z*r8TL$Ydr3ca41&FV}$DD8;CXI#4z|*p#x?^2lhUtko{%*jgc9p{KKXv26`wT#- zr-)R+zCyjt4VZ+JL;sbNH%VNEqAcc{%fN+~CWfDjREMu84$dXG!CmUY$p!wzS?Y0l zV=iEF{q7{L?O||$H4{p9(J+a>hth76HA$3&4mB>EBz^)EZ5MLa>(0M~|E5^azgM$yu(O=q%xzByiG>-n6;{4(8p;95s*~d`1TVUY zFHp@W=-c2@L!4kXY=zLN_5__4Bs_zK5$CyjdD@xGs)~@T+KAt`AUP|&FCIL(QXvPl z4f-gjpX$OU#l%H~Jq*1<#_^w4QP-*C>@#VE9v@)@a*kie!?w^1VjCpCGZUGAWb4VO`?4(5wLr`dVQU`o6B3m zq;k^xoLqoX%d2}!gL_MsQj4m)?Kettor%B_ZCkiID(952384V< zsMtVg^FbXuxd9$w9!WQ)D_EzSy<4rHj+!%~DhL(*{IhO|rh=gfx4NXxNCNIWhh_+- z0?-71MslIMj!^ik0Qz#uS~r-1#E&D`l*AAC!~Q|4pnj9+^YqF^ITV4!Z}rnowE~i; zP|mVDpbq()y5%?gD!C9soIDcPG)o^c-0BCQF-k5pQT z-pq5vvPaq9%yI;Hh8W=z{wb)R`S3YUIwm9!lnInH09zopfPRS^-dM-ft7zN*;S)rlBM>>Uwe4z;YG zy{jNNAjhn0fY;(lq9l-^j>gygs@sws@AyjxdYps8`$@G)_T!?+r}PUtYE*wQzfD4G zm2*+-O;!vX!1qXup9K6KiZ{J!6}C~PR`@s46>c5~zQHF%_umUCmuN{NN`E+MaIq>$ ztx#$7E;Bm!m6!aP`JH^=-hteC=*-lI-l8D&s!aF&)%lz@Msa#h0{432<* zki>nj8YHP2$ZQH%6aJYxocJn|kqcj9QfxLi*{a)^10WrtJ3Twllp@^Ucf-M26y2lh z+XV!Z=WpNq6%i+A)h9pm@Rj7HD1OTE#=oQ1ND(eA46Bf}Z!Z0fT=uTGqj`5T%Kpot z4JGoFq*7k^7fF0sN&Mz;+AAEz9h$U3WMQ%^$wXdS92J0aT1_V^W>lY=yHmJ zSv4aaPUW>B)3LI@V;GmwME--CCXKEgp@TH{9d_1ruVhxFKf~GmO4G$r6Z<3IhH~$! zy6ZQ@vymKqvi6W=hUg-DlVvXAU5_7)t8aulji3b2Ck0NC!dZ_d!v4h^Hzrt3VBHh^i?8^ z{gJSBpmyJvVCD76|LU&zLMU?rDkV$GtoZBFz_<|RJGZ*y;|<+~N7rq6bzY^h1vj(0 z>3$>lWq&it|3`Z2wzzijSQ!)@Ke{(-{4+lG138<`MG*c(Zy%>WpSB5WY(_e>$@s8h zN&I4Tb>j$WgmTC76mzYRQthZ7rlG4E+plPUP!hwnm(R<>f#&z+RID1#)66*Qu!kMR zyn7vxEY>hZ%N@Hq#a)KNRKmi_RDvrkwK$2r<>h^Q73o-XLTZ)mWWj;bN!HX{!h(yE z+)c0>z_qspPGFfzfD%nQH?31mZ3zu|A7zD89-E zWxzd|J<`YSJ(f^g>pX&Ni{iP1_Tt?;TAzy?GFt=L;Oj=rf_e-7~ z=~^?b>>BZv3qA0P%-c>|R>yhfJlTgW2{4u$ekpBZTF^SMa~!QbTnK2i87O(N7GyK^ z9rX7%$1NVn>2tAmewmC|CTkb2fA&qPIv?^aX|K0T!_*xdr{aw#&xcPExzxZkbXM4x zzoc~waXIewGSk4x7uPys{n)luVE-X|$k?_DK(bf;s&}Dr1qkmFTTqExq z^_tU_#h;noR}Mx~PmJuy-7z2XY_HCE-s{C4Po`hY$56er`Q@p1oHR-#qkLES^wND5 zq;eRuA?N(xoE(Xe#C9sMWv%*%w2_$B+{-AYwBF+4<;o`q7Fc(n$n|B?$eJ% zF@o{{R;{oVQ_MlS`H(GBJ9@TxiQwMvRuu~s9bPb~C5x*y;t1*{o z8>B$J?pDzY0ACh&Ns)-mNj6hUSBaCLvxrqSt4t zqOyhTQZ_8(w8-ET_bub1a=wH^I^i)4f^3uTkyI(wTeYJYPF%I3K2f^V!V?uZ1MKJF zW~pvl=%dn?QWjx+S^Uf$-5Iz>=ByF;sU%y}^HfSE)qII#)Jm4u5u6KgTM7*k4?N2% z89nYe`!%b5NGG41D4sK#Qhas4bSn|XFFtNLyB9Xaty2Fng+zQ?kl50@Yii08VzM`` z3{PL|>|@E0Ul}%WB1!(_H@Zs%aqR2O{Nm|Eq%HrF;Vrk)Q%`j74DIt>VZVgqH543F ze2?wq(%Z8_c}d@>CfIL>qwLt)OWxGJC3{xo5dmV%+Vgwwzo!&w*>t_7dzSZreqZd7 z)kV^;n-5=b?$pI7Gip>MN2$ zI9M$8wKq*7%y9Z)CT`p)q5B1sVQZ@ZG1+MNBtk~_%VNRFA0IU=ZF7d`@}z`+n%Z*C z-0@ef0&<}%4)Ri~BZa1C+-kD-VQSX*bZQ^&E!A}I{Yu-OOEmuaN|zmUFl%11tC>d| zm2Jt!lzBPJ%?XAU9%X%2!&G)FEh-MwSe{WR+qPz!yM9Zh=KW6omtcNjf7ZW(qAY7Q z&I$O^!hM6%M9bRQ`C18^{YR~%1AYd#t1n3{UiNaUZEdqNOtS55xTTf6$+Hvs3Lg(x z*f6hnV!wMW%l5Rj7jCXmOrx9=TPNIeTh~G2Zrbiytban1xW-$>y{1~VycVAWZz3R_ zTvN}PTtnXCUaQZwT#L_7JwTjWN3p#_N@#f6$3sM8o1br%_7vKFy#E;M@UOy!+DR6EN*%!s>4jc-uoS(ZcF;(haCbc$3|`=kZ`n2&{cWcR7G^xR8@{lFT4LS@vxU->v?u9=JeD zA~+X*8xd3tHr+UcLl%Ti0+e|{X40w`b!D6_e2>)|Z}CG-t|&kRjIW{0fuu2PG5BbR z&SHn6WF^Fd=$i14IeIy8To~^|XamJ3Syd2QkRrsgMV*L==}{%%3r%!#n17-sgeAih z7>nmnwvm-!sKaZTxaWKvMb`-14NR*NP(hzZw&^K)W2wR`AxAd$BPKa~X8(@kM~uKO z@)M8(CdZ6ds*4$x#r|6mNDG6b6}rPVnU;+XkVO~^#IA!g%Ar9-`29&e=e9FQwlnf? zK@mbcR%Ed3;h?{u!V)NyIfd(^AF0C9^AJiVm1`d=OqSXcPulb98pf2+7wbtL!4@aI z^x0{X5hh0FhQjUHTRk6jLW&*V@hZuFc&v;VuUG0N047I`i_^GrxvLzyt9)N_b4#xw za7$5gJL(uR3kz@G0IO1!NC0w4D8=g zkqnLT;I~sq11}Wz zUJ`$K3PwoYlgDSxB*sprw9z0#PF71v=q>~SiLJ>O91mp&HjIA!EhNc8Wc8&IYMLcS zPF9KnluQ((=XAur3lQK&`~Uk*xRMz)gc5gj4&)cW^hcyU@lWj7H(fsL@H+@>RVj7w z^2T33edtHliXq%EFokOWT@IY9qOW?lhFKAc8F+7^Zwx%astAJyDmpS(eNcKQ9D*Kb z=O|PKJbUNO zNgi+w(KB9=MUTP<5K65}el%*{I0Vd=s_u^dV6^;>P*9YMk1mXnK_&1QdaxrnHAIsa zk1k2qiI@3>TA&$Y48Bt$tV>hvz`kpvE4yHF^}m*|qmk8SCc{SN2SfmB#YKPuCAWZC zu+0|PRIjhf*8s`XVCK(3wx1DXKchdIlO2taSy6cB#xskO>xP)rTww>ylIM#u3fm); zc5|c4{C>=aD}70hhEoI5h;io?d}8oTJpnk4)c??6+~XEUKXJu46y-$DU_aDmzn2l4 zIay~e{b}n)w=y3qkqJ2U4B^3{gc2p)7%Yg$00~jd=`^~PNND~DQ^c|HrsD92fy58+ za=o#OyiFk zo(TKvYa+a&VMH{HA>tERb?y)X4_7lCQrZexwvXL=U486AGH(<)_7vn1Afp0jmW3NEv1B_hI9pn>qET)4?eHj%($<^&%Q0>P?RTufTSoXd? z;h6ni-6$Q8iBIwbq~BM>HRDFZm4P!9X(0Ebj_pMI%^fce2?x@iq9;e<9Im_kQXAiW z!cRL0(O!t+)p}rFP~x5P8EoV+8bWO>{`ZKjG8RFs`B<5o7P|YfRAsEqxdSG}4HJ>( z&b+^8QyD9mEwQMZ6$-G~^TjCBy%sF4iA^h)z*+8TAYfFhmsjKSP=fk`-^BF1b zk>W@jEg7P@iVW7W|6%JZgX##PbV+b`cXznBLvVL@y|_bg3GVJL7kBqSaJaa;YamFF z;PBYDTea`i?vK-R`plW0uAZ+>RregxJtEgwsGL%rcok!pd(5byc@jWCtt*fi9Fo%e zb*$46q&T0^_CxXPt5VR^&BsB|)R=kDRQB&LIV-mtzsj7|I_M0dzT^PWpZGJrn;ZeW zfRIpYP@3^SSge9KT`k9Gt%CMlx#?I>B(@F(tqXHQ^OJ6il3WAsq74%7oDo2}uIQY~ zEYa!U;W^t*sC9-6iSEOB>v{ti;>3w!b60P7xw;<#X^h3^uGBDx;8^XtfeKem8qvCG ziwrw}tSfU_ra=Tf;|h=ge4nM~3RzaWnfaTX$JA#+nJwh7Y!c9ke_OMei_hF{VU(oL z=62XNDc4EdtaLeMpC*u0XRCdjxf#dD_+Sx`;mhWE)LSEcISO+WWUu6nmSao;PEU?# zTsqpbhxCTpkRloO$dGOpKV**8#^Yz!1hq-`nyr>xc=(*I%e zW_W29%=^hQW8yTy!KW3FlXA$HOFnbtI)>P>ea zwI@V?DG>Zdb#tN=6T3?<@3~k4?a0!^-k!?KplJW(tMBRIehaA_Dh^$ z4xGYGL%lsZbb30wVe3tLCH_eD%XMN7oN3QczBW7}eI&V2e*N}DC8GD9RX|m+S3c2q z?RIqgs`fhw2oqTR5^ZJ){os2`;%fDnsUuEFX?Vwc=Iyz)N!Y290|E9v|WDw6`Y=lW_gpE0vXp2aIy@Jtqb{=Ycdq0xmCw_h2t9`ApqwyNAGdRNG34~}Z%?;Z-K*|O zTX4pcl=aT{THsxxXQ%*?^*&>8;%(_KLZDp_cn7-ggfxETd368b4fC(m2WQXt2hIC0 z5z@d@v8;uA(xi&TZD$FoBG8$^(C#Dk@h{e61GN9!rw;H63*nN$^=jNyN`02c-v~L_5 z^XP}*JTBlSWXLWujq-Ftxdy}XCZDwO*;b>k{wfV*G-wZ!|8V4Wg3K7WqW@Lu%*>xG zE{5VP`$_b#IM6I%ZmPR#kHRnp?^uvC>xs7&7a0^DgS+KSC`fm6f0_L7pO?$LaoGyL2Rjs7K)A1#88Ko2zfK~ zExrI0;%P8T(qqoAAL3c}VR4P}F6VoV63-XnxqQvO`VG!M)L^=?cDg~niWSonbed#S z2^+NQjl3OCxLPIsf^lyKsh?L|K7SQeg{Rp}@X|HsR>LCm)N%JO016v7*|HP;ZE*@i z$XHn@0PBJybKIHZxfJn@^r=*T#yjBoxS3yLrpT3GQmM0O(uK$3>dQg^`Qsl#*Bb?; z@V_5TsM_QBwq=3g>fy1Ahz4av8Yd*nB5n1Da`pA@p50s8W&~^wng8YxLJhw4{=)vE zBMDVc5mX5EP19l)8{3tU;7~nS#bB*KhQtoa}RVn~t5XwxP&ym%5X6H+NS4d|6L0^Jo5ltVG zl?+BJ3t~^TDM2z{r&BIp_3tpz_tp5a&R0|l7-)MrTrt_W1jWrxw7s0FTib2;-(hpM zT?j9*4PSEPfh;3JiMo}=;|onQvMXyFEzkad z2nRd0d^xX*MpV2XNIAn#-c8MUuh8R)nh3mr$d9S5Xd2rQ3gE85CA@cxTb=&+(P*yP z@xMC1VNiW)+~vt9%&7?ia!2LbX+f()?~bU7e*y>oW7D%cMua+iqD<-Vx5N4AgDl}J z^h{)5heNt8=0PXxLxP0ywqVR0*eld1GGVEcST_TH<)rYmaN%6(>p${BHJ3@)o zxE%Dt?uSYXqGy10s%FtC>Dn_~f+W;nwO5B;t&MIlPTQ-f`bDo97Gn$NSYg^xPA~?_ zhO5rX_cHnj8|?=5+`@ULc77;&rb?k+cJ3;MXG{NAT>t_WYQzrOG5Eco=VXK9W{PlZ~#(NtV*f0OWSLy&T`@^ ze65uPruEp$J2A@~>02n-H=cf?)I4QrJ*HARC5h4Uqgm*RA;TxZq*145Q0L)zKo`|| ztkX5_pmiO8i>H=-FZ-+?S%OwQIYlPnn7r|C*IQYR=r@!L&;I_a%id52;J3>4{r;t0 z_3f9brN$F0t=1E(bl;K)x$m*Idd^QxSg6Ss}}t$?ZwABsT#Sb~z1 zj^s?R3w7$cODVZjoVq|AXMcqa!zgxJ_mRpk59hiu?shb;wxY0###XglF>tv7MHX`^ zyR5LZU(cn*m|S`w%z4`@hmOqOnMX<%J~!dB>A&imh8#O3ykUMMq#vfy>SNiDkCJoM zlTCSIWot_0nCk4rgav-qi%THoWTuH#*N@Z8eXMyV>NX`#AaH}eBvwea*P64hN4AN< zPHSF){-LI9$fsC|{K26-F{e#^Y^fq=)SIwZ5IC4I3Q{6B-nc%>;P&g}$bJ?-0fHVr zMH8Qzp7!O5Yc5LUDe4&noHt*}69a5Ytg)}+EEGY36>uWFal(2!3!XGlOYwKPvQ6cC z3d!QrS>PMX=RXd<9NxD*b!Ww zyYM8{=<;!sh-HnlfY>11&p)sE%8{$`#|^hHD_GqluW4<07JLyDq2N_4p>S8h^aVDd- zx7S_P>+h{bB#Ut{ldOJod=R%cRY5uKB+HbMjw#D@1j>^cT2!KHY$kE0h_W4UrLYN6 z-N?k06^LE`;Go60WmBSxs?3$i^?YE>mANVNpoqe$g8k$KN1{r8rSK(T`KZw*QzW=h z&}Y|S%0{{8$;g$ROQ`W1(k8S2=1)qMUx_O5>r$dhoBvKx`I?9srJkbB#LoUvi#gtI z(jE8Xe%P84EiW%A@&tZ7^cYR8pTww4Mtg0vGm%PoK5VFNCc&A!k#URCK&E(!SrIqc z`aWiWA}S$F(zfJWjD5g`Jd2zO4QJRuCOI*Iu2`hu4C1;9Qd9*ts0szfkQk6V2Aplg8s`mLpV`x><_%I+x@DQ236=%(7gScV zSP)cP0j3s*6@0(bFDM$0+-dFr^HsIkS*xnE#?J^WT>~ZehxZ9tp^)1reIFoE4+PFs z4(1`v($&}w{jwtc7x4}OW+&IR)klmT8fWwt+0Yx&7&1-t|vu3=6A?i z?mqSEiK`WYj!Wyft>ERMTHC43tQMThTs?VDquR9YiscbQCA;&w+EzE7x%KXDTjI^P zmiWs(J=zDI+GgM4IQ@dl_hcaiz`NVoGT-~{MPkeK6dp!`ExWrBi1Q`94++u z(CZpA3=UmZAnw82O74YbW#0|AZ#frFN;wC7MN-kC@A9|D~@id)e8X_b|8KZ=e)bSrEe8G`&Tw~8z9^|L^8l}C2^^f4<=qQa=RL$NusmAYX80ktPV~mDU-c%mRQHOnBk#appzdg1 zlwGxXOpwlAJ`S!M1_qHm%EKh}$t6Clpme?72O9-87tZW(pFVgZBE0vD&WZ5Ty?8=# zee|2m2GZf(kfNTwlZKdnWEJjxP~-jmz*a!(FtHRxv_x-$X-1R`<_nGP-xM1(At`bI z^vzQ1sGJfrF(D!0poc@pAW#MmhpF~s478ZYno2dKHjwG?PXjGVknwI_K;(fORD3Ly z4oMp>_`hKuh%%D;otIqj@sUqHS!x#+$_caorWkV;%H~f}H=Er%!gJ@{2trBVo!uiZ zM~)PWAcj*UzjLhWyp$i2z=aOnY})I5hn);*r)h>^OwJS}@(e%1pE$$ySj)pnZR3^yfR1ts?fq{|g%I4{&+hNm`XzOTzo* zK^6W%9JLpyO%lh>()^?MFhXTycQ^0{`};ps)saK#!r1=uAXH(<-d$%n80l|iyUia6 zz}L6H4Aj8LcWD;V-q$FVkt5|$c9wS45rZ64$u7Es8&1`cqdC66j3mMM83KRu&ogq`~+hGez1V=5vR;h^Mu?G1dXs)GbVp2ztbR$PREy-!_6%X6tq> zT3C6piBXiqM?)6oe(&a-syWj#0p{1@*RUdA={vB$_B#~9wuhj<;`u;}gpv2>0oXeTM_?a* zh3?`4s5@}CQ39Z2f?xKwcE7Bm3BqjzN0@kC1OA|rgn|06b~Ubf4Upa;c!EXxf9}d2 z!smP^@BR*F5v9 zM#1*|6Ny+oU!Owy#JhLDpQ87Cfea2zsvpoVQGFvcLfrm<1svRu4#xi1@w?^E`bdV8 zpB1j#ZYCp~?q)%D%8F1kY7+w4&;2C{nzyxi0SA;^=;YZlWZ5!Q*<*5?Nm14m9CH#l#ZmSu zBB_{qp{}CkDn_T6a>1rWVjmEeuas?mkM+|xd!%{*^PeBqPuJTvgRym8ZONze4GOGk z&(Xm`3;ujX3H{j@GFJTa?llQ2+_VZ2pd7Tb->)R%)@7JR7h_wY@t71p5vLXD#46y( zlW|v)WO&LMhGmTkH3@RWTZ{nW)ul5gEd4tii`{MGh0=!ZyBaP<#sHIgI@JqfSpE5-N{cAFmV2r2sQVXSZWY_5FD}6PS(Hi$aAq_7uidO! zPo`L?=pk@6)>}zQ?ucn>+htbwUso7JLk1Jn522S|63?JY+W9NFESV2cH3n&G51Zr* z>Z$2g+W9^k<&pxTxPae9Zl@+MyL9Voi~-Y@8(5PqE`ENkpBHyOzur^LrnO9)p%H~v z9kzzDfDxMcov7l3l>=J4G6lIn>oY3^%PtP#0QEbDtF_GE?1UVKiNRUZk;?CKSn&SB zK=AAA=Rn$W_Al08OK!{cUn2^3Qn%G;IqWl7ik&B$^o{Uysa5`8`g#Jje(pG|w_JkIE`Bb! zR&NN&T2gm&ylyDL(9yCfkw}n~o%u7bZOy;(2+*-2q_kp_)s*lL&~YGBe6|QzJV7({ z#|rI{wz6)#pLf%FIbQs;3;#sYLRQY$Wo4n-zbh{@3o&mvP4|HIh9V6{!KhgbF;f1% zzMxbGX1bm%`Xhe(-o=%+eR+Y!NR_~x{REJ{O@UROK-jFA7**guJ24T=E?@+oNKsGd zXTU-&E5Xm{K!AE5u9W|W9ml==*mq{Y zy&uspy+oxv8kY#tuR5M<5a<8sesz%tlm#?FqBP%Ll$n-oalT$by??M_KIW}Fvo@@V zRW`0zoBBccGC$(|Xsy=6 z@=uS_@K5Wp_-eKKIB3=G_QNp!wSYz5h;<7%-px0W%!<1blVdh}&YK$MCyfKkt?{*| zD48r&E{K2u*{6c&cXeunUlD?epawiRqN*6Zh~RWsg_)CFgHRD=Nz_g3ezr*k^3JG& z+(%>)&L7P-SQuF-3?($X*u2Q{)V_kR3&S?(9ii2NY%$vD8B`=Z`B_eUa!e)gcz71V($X4`LPRi7 zgCaELhvpN$hC?v@2Pw`(7*%NE4`Q4JN~jdasQ3(e-XV$0Z7Dq)8V}b zb)oTY+TuHIJmRz+0!5@=GJD1NClMc=`+O7VXQ>_Ga2xP zht&}*e_O>eo}`Kx{hDW;{BmZm{9b0cdZkbKML6$hKm1Nv-@|4V-HeJf2FwLAI@U7Js+U(;~rk8PQiOY2f|_wyN_f%x5KovIJXiiS|1 zU767@E`8Qhy<%LC+PRp{z!mwfk7apZyq~e7r5X27cQ^SBM*S)3^{4a|+BX^tjJ{{* znt~ViRrw@7Tr(y=yR1r#25*y%7C3b4FTB<353;IPZkd+OeV2d72^O5i2^pU%3Ps#o z=BxY2&(!-c&KUdXvx3@hVeaC$8@9*wzg?X%*LvPA&-(fhp8xE*xbNL2@e#RF@h^Pv z_D}RI7G4w(Cp|VSLVa+YmG%;ullJagl=e+HGw&(CYux5|=Dosxlf2S=1Cq`g|Mk9u z7p_shJDM+lj6PNOAHL`DJG!&!m3wwKM)nV{Z+lO#j}l&3Q7X7NFQ55~ymaznw21pi za~k8na8KRa>C@y?*}K`UWc+)hs{ZC;e&w-ue&t!|{M>)#4!KwV*-`}L^!Mey_C2z9 zsz7mPZ>BtOpSAAlMtfG|R;2XmZ~Ic;HR}AsQ^8W-jq)<;v(=gLi}vq`H^O_TH{-L> z*ND5T*OPn9_v&ZVV0jUGs5^Brl($%wZz7BuOEZY~cZgz$Z%wmCeH8BV^$0)j?FPu+ zx~^*i#JzMs#J$A(=!urE;H>Vt2Uwql_M!ufJ8)q3Eb-t2BXs9TkB6LBnUCRphcHb0 zbSRl3mBS#-G8#S)@a^_F_7Wcrc$s?fxQDa{%XsN?$&}z}qbCNkhK}|o_n)29JB}tc z_^Tmm_Ot~iG9KcYjfLsj{GOT{k0y*iJMU8VPdCgi6B(oF6EsDqH%Fu+>8v|M`n`VN zKW_}9l-L!E%o$I^?J^~gC|b}jkjzgUwJ_f)8^Ts&B7}KWd;U324l>uS4dF@>({-@U z`26eogBT|hw+>FP1K|)wJH%}7OohUL66QFGsU`xNv1L8zT241%Os9xzxsV8XF5+n1 zVLNu427$l5bG38I#$-miJaG85kW#1nP88jWs5_IxQSnPO+qsFu*{GMu_rVfvf|lxe1vy_EsYEGk%B&#`lcklC$+-H-)t)J@CQbL>RX_a#~nn5Na|1c$W$p zi<{T)JlK@O)Pst;qfK(UMoq!s4&tGvv=a@v*4Q0%`oSv54C9`7*ckJi7c)O=c>Wu` z3)gpE>5%5PA{7;NV~g@G#0=>yEeKU|)KdMX8SyxWs=oaj{0x-PE4Rcz^F9d;dAd_@ zN`3Gph+fI@V*KZvMwBdgInD$vE4 z&jq!##@@y#AL5?=>AOoGE?J-G%TtIjSOk-f@pP*0tT~?MPn9EF@g)r5&t_kv3Wh;? zIajsGJPq$+!>@I!7Ic(_NGI81=EXF!xkjDE;4EH?!iD#J z;qZfFk3bb)zD6Iz7M8QU@SJ7w``Q&6_#=OhR5s)e6A7Up*lM8MRO8Xgi`)-pBx0sN z^qLhw?MJeWWc;Ij5Z5%|5rYZEI2?PAv4P=Lpa#)6Y--Q0LCBBTBlP2k&|crJ<0H*Y zgcBv#D-ZjCr%KtiVJf8`>Jc{tHUN#m7EsaBU+fB#P=&{$vEU4P4oBtUfm$3#nElvYZ02ZYy)OT!=wHYX3eTna`4+&h>8&E&hb$aJ}-V^59QAXVKptQnyD%g&LWCAOEc z`R@}!j$wAos6R6Ln{BW${$*Mf$EPB-yG)1=p>1gTSCir|3N>8Y^4Vf${b}@}b;SBcB6Z7yw z@~6HNfoQ>qk#b`T5nUM1NZ)1@Pr1Z!W&LZFPlbwAU7be0>BD~XCGr)_n*MLk)NQ7mBOYNn!mbe`e*5Qe?~_7@_@12Kag6&f4K8v($rbKVqjva|-tO zQfE$y77y?lk@(f)W#0md2^vF8v690C~P>_bZ8JkRDhC<)?lVI&?tIj@vEc2sDIu zm%U(LfrX0-zqn0kl+)v0)GHCQ1sXnfdh!;Ndrz3A}#wLMYS5#%{J z5W&hubx$2WWLTWz7PW@7WPxxw+S1}8QZ_e;OO*W_EN+h5BY*YVk=T?z{0YbZdMznc+B;TpDp{htY%mG&ohH#t@`O)MW>(_ljMdVjGVmJa z4^mp}CO!nnS;A80mJM^ESyr4t z4}z&o*4X1oVGy<3nDy``&w2x2T${Zxh**F2^jA87zbP+n`VXTN?!WIKMuDZ%>1j@% z27x%EKhPkamz=qXpO$y#PWW$~xg+1|^4TKo%#e<=@x?paMgW)C2l$sl=Dh9Oc>NCS zQmz|us+-UUe8MJzGq7=Neyd(VGxo6u=lBOt{Uh?P&IiDNlD`Ze!G8%p^4XF^EEM+p zIE+q|@zfs+;wtNYuuW+WWL`2@O*(6GZo4i4EW2O`n+-VP*6O@Rh*reR^BLDNulOyP z+_%`bUAA~|I`Pe;Htd+bX8@A79O8~Hr$-PxdCW_@>l?vB3py9ujx{bgv2pp6BQ(lN=FPMTe}l>s{}z?kHcs6JH*VcV|4p(AZXCP~{~Kl1-MDbu+&JOZ z|2XM3{m@+I%{`aWGYnz5-(YNkKPZ-?*Ww`eitzw<$K{~s3id#I z2mhehn49HAojCNq!-4V#!9iJIipxac`lJ3eo+s3J z2cyYBFB-RKg(JHdX$m$>RxV)C9iCFLyBlRKsJsO=Rke#LF-?A*p*NsUUHcOAn!Yp-L%j4wF zTq~vjER8C2vZxffZsl_(zs_?v7v44M>a089B-LdNe>H9PB1_SwNL*sV9y3oz;pCWr zk;*>$YCd%nggX@-1aDdTi>6s_H&mC)dA$aQ*KQfkfZYyk+T3O^S3{}Ia}I8ue0CLY z4icQVr()$KoS2xTxj|^I>{+&_DFEo3jMzsBSu+0N*)SQlk73NdaN%i&yfpV1dYhW| z%3OnHJ z*h)`&ufx0b{!8gp5wPmT)R-LZpFd7Ek#w_Zh|VIaabQ73;n+c*=GKP6&8`lPnOf@i zoZ{-IJbvjHIPO9-uS5NNJd$YQh>*tJ9?G9d8rqdb8t#+5AqF{lQM7hET10#tKkIm# zGK+gWJuB*_eH!1XKVunCcf$5?`ZURUUwmxzGvp~vczd&68Gw3PpJRN^G3j(id~Eub z`&1h+E?E3wNwV<4*@tMw(TBRitsF|2DH2MUBNC>cO*_b%T|US-Suj{V#j*D=<+jIs z%(};M3_WP|ZVNRT6K-b2jdUBWI{3PEYG=d+leH3Cbc}3X@)XfH`8u&`wauxN*&f?` zyfcD*Tjw&`WA!}sQbuGtIRs~S9PMn`2uBylZy_YiAWLM zNmrc3NFnOxE5Y+1HE`UHJ}8J2l_?^LF?pV(fQ~gzFQnCUZ2FCzA%nt;W?)TA7a)yC?%EZA)ztzo;sf2^m5M8L z__bbX5~&#e+kGqhdY9b8?PI4Y+eoL)?1jW`7rX6!7Vyd-!Ffdn(XFt%MXOu>3jd4~ zF?KEJi>vzq0lS{xkqHY`;B9} zDR8e;EuXISVzwub?ZpkJ?S%)I?FG4M)_dYsCjGZiSPtr_Ycq{hI8v$M$ZK?(AvRjUj&2%T zg=T7^kp_nevXzhkR4GY(mEww&8LFT`&jM6QN?69)VkSX@_$4fcD_GFi0JaJe9t`Y_x2HwpMyZVXinka8ql*j%|p>c}YsIuO7w zBcU4`kEx0Rx{9Jpn1iQaFu8+7$Nt=-Matp5Nk{-=l`vGHLFy73!>63+OMvIB$TPe= z@?sb%tEh^oIX((o(>p};RyKZR3F255G*w)Xaa2XboFv7W`5i1eGT=ESG92$sQi5`_ zL4tDxNm>GP(ksdff#VBBwwV-7F}@`hMfSn~WqV>sXnX2lXnQgTrV^Ht7a^a>o&!+N zXnnjzrX}OI?4LY9eoaUkbvUZd{try0*Mrz4Q=p50%@S3AhI7X9*qrZP?aLw ztT3B6JjnLS21!GF#-u}P$QdaRlkF>Ic%&6uaRNUEWn82x-rOiroGJ@N{$K?FeP)55 zLyATdZcsnRNJ%0w{!G?G+ zJl?W8ANn8;1Fh-f5AX_`pUja3l0Zdn@E#^Zx!GeXm zgV$Sj!;G|}!iPD?#;`MTO`O&YAS!p|4#(7(?!Sgib7OmzITA!FugFc<<4i*Yyeb@t zA)QqC!49%&unaiogNN~0)H{{5PPH6i357p=uJ?CWLWtOYdOaQ;mQha|;>)k#jl>?Phmh(>4Iv-;O+DY1E$3rIugb@F>sUE`N>r)EAiC zp`;a<-I1gTu<0otvBYw#KjD9BY{t#8Fo=wvaxgrYSo}<21@KE8W#Ac>xw1-WS8PVi zF*EcHoN}kVu&HN)Av5X4jzlN1%5Ur@QwwhhY2VQ-qgB0E`QB^YUL%3)vS|(W0`ySn zF0^64nl4MwbdHG!AJYA4!}{5;O8`1J`B*R$Ln&PrYhFmS%#_Lq5x^tay@p9adZP3^ z+O#S5JG^PV^n5IwiN%xwvo#+z9VT;STM+Pq?bSBRSIvvbR~aDzc+F+Wv4!IZl|EA2u>^OBqdAm>)LVb4vwGT9m3aOmaz4ST?EB>!uTcAS_+g=*`2I zVMCeC>UtKkoTf78n;%*DH-@-?6 zq+RAjl-6=plj?6(dSsxHTI7I1-}Nsft(ml@M zqqF3bY`cuCnbEASIyhZcmZ!-40&hFf;#$bhUW-^!SKHy^!F>WneNriBDU2C|)ay2UbWK~dkW!p1H?F(xr5F(OeRaO^I_{_Qi*A81lJ>syvgmW1vP z_AGXVEU_%PEGgZ@CNv;F&=iaWRsd6^QmdrP=+c1M)zib8YEpq9CIKKH-GrmPY6V?vaFv=?T+>IW)HH@Pg*Snd%BEbaNT3-xIp8&@l?MWO6-@MJ3=Gl;-O=EM{kmd=mS5EsW()Tf7?mVD7(YpP1s1l8~Zx#+58b(!-6 zAXK#?-fQH$Pw%ZO{>R6Y)8znXt1kyPrKh$Q*Kh$H=cS}|6J}Fv|ImqAS#JQTR3)=o;b=9VSNOtA^jj0 zSFLE+eFZmhw={iB+W^TJly4E|0<0e3%@l$Ijs_rZihqmr$0R?@eDBYD^qz;>KWC>( zf3FHZ9zg`y!5K)i;AMl3*^e(O@{mvn5D;*15aRHr-!Md^`ue^=KxjciK+r=#e40KW z(81Kz4(Q5i?&Jz&l`^%rH#0T2lXY}+cl~beZsX+0Vs3Bh_8BoZr-UhrCDgv*vC{fA zy^4+^O-_xosTY?GeIvAF4i@fe0ayXq&0)ds@XF*rHv}v4D}jA`izRh2ykmSi&-WzP zZ6@!tQcJ-5*M^u2G)+PH#`y9t++PK68-IgjD=z74H--D{u5!`9u*Vu0=`V5<2?y?E z7mavS29*zrOv#w0n(4U1O)oW4p%?F2Y3$hl#MbG!wWNfSs36geiO!Om4_4_x0-N$f zjXmz6mM^4I+RCY1{Augo*(viEF$YF!dBs-WlIfdX$41>q^+VH&++oECYge6SR#RuK zukL1sB_yI|2T#XzOCuDF%no7sqHDp}Iu~QH4otobISvl}NZna-$iiPqYYB|V$QJ+U zSwXY!+u0jXD{>v6>wUP0hfaAfHY%`U?pg38tqp}P`Jn)d2bEVqx3C@kZqUGyyuD?o zPDL?iAhDCm-VU`d`1PiPY;(_WD2Z3g=pDlUKoOq2eyL}*-_XcT9b(kC^A|=sep=Gb zjV!%@?>%uTKHp@_%jR!GmTPB(E}RMz=!Y!58N#%NXc#M0Jf8czuIt04pY?9>+dIyO z*ukOFh!scPwoc^VnWcr^5&wS_;G6#voB1yk(EM*Gu>bC6{XZZOre^500KgJ*TrWd5 zB_%$vi%pA5z!@5NfgxDeW2-bn%^7LN?U_zoO*znbW%9zuKz)S>z}jDDCQP-FXmWFN zoBqqk^Yr(2!xQ5CR0__8X8_|;QfK51MvK5Y!VAqTt*Dnit)(6>Sm`0LsH=7dF?=mZ zW8Wc*6yEIbu5-d3cGX_4!E0$GqIOX`+0%hw_)qzUbPyy9)za+w>+NUreCqJ|9v8|rZzw?qZ`BJ#;URO13&#G1OAr@~ zniEYa>g@FRvkM>Ryshov-Cxr3L5MsE<~;m%SdQOboB@xUX4-F+$iKEFFf-ZUKI~<^ zo$69wQhe_VGZbi5f<2KvsD54O)a+(r6v@k&gU4m4%yGgYG)1!UAO-aBt$e1$Y(sNXH1VcL;w|UMh}?Oxgn!)Sy#>Hfia-3$j0+FM zhe?=co6I$W9&|PwGaL0EKn@W?A6LBOkziwrh8$0nJ@$Mg@$@6n$m7u$7)V=Ft8CGd z`~I89;t*Ps;?ItHV^svEsD`fLW2i({P?`)DY_}jCiLJz%KVxxn7eV&nMU;FP-p zXh&%;Q8(soi~!Y5h;mb9eEfl0rH;rI~@DXHOoxL5btRVRKlB z@Zs+d(>Bk1=>xC5m~6O`xCkBgzhfijOmh;-q#}b}p8vF&x9)883kg-QZw&Fyo)Mmv zCTZ1a|81({#<`WXW|`NLxSSG7-KKY$+TM!vuGi!-vlec70}a)fDm5rIR;wzyliC@7 z0!$)lKRQ1hE)1*X@!BS(zMi3~DI>*lyN6GsC+8O>7@5%J*#!HG?pR?w1LVp}ktgtm z)ML@JZTZZIFte@UQX(;t2iH)x^zqgi^WVc)UvNt2Bm%plg8C*YHK49@uMu2oJQ_y@ z{`^IG!J2Me6PaJpXq!~dECA#_eQA#B7YB2=uMWOv3*J)Ua=uJx8Q{Kn8<25_vFxh} zJa86eN@c*~6HJ-lyb(+#IsP!i;9p1+`EOJ9AGqDT_J`T}#4H;k1O&_ff?F9=H){nO zcc81OJ(W7pl3l4{@48x(=8mt#?Q0Usk^CJ@iT9r^#Ch3avHYT$-_UL zetkO+{(V=u%`Xokf$z{JXb(VllgS8=9@;&B{OMOR8dHN2D3nObR6uato2{Z+>MRJ+KL0 zwrsXF)|Oxy*Fl2cIhM|nbN~d#GJHRZoZN%s68`c91vjQNm3y0|#m}fA`k|=0WZrsh z%=$9L{BadItg48nmWx~{G=sL(E?cJ1{q#zFM2myAG?UZ1Y7~c}Qr}ZF(`-(L8!9E_O63REzF?6J^E0B9h<{S6|9fX&{9?ZCON<94P*ZEFWy5 z8x&s>3}-#j-sf{mCj;Ni=|~R{J<~;K(owyp*TSyZ;}&Kp00`{mo6O*)I3p#xbfG$ZIeYQd@V8Vd&3yz%Vhd z)m$wr-33z8(6Hl5BCGTb4?hL}t_k#A?dAf|$iy_5ei3Lx{)0_hl2&1s#vg0%LW;fF zZR2#pbL;*dfLG`7Z=PD~+|h<6c}_vHb=pC?B?aVGm|SeFQezv^5u#v60aUQ~e&a*g z0J-hc{<}@PgCmc+j}~%iUTbD?ai?;6CgyArP(IO5O2>GztlDgdx~yF11$85f@T*8q zsj7Td*69Rg))$6_cL-UW6b8jb;=(H9%^pV^W9{zStKi+$Fu9%(QUhlkFnb)D=U4FC zxib{cUhdWpJK{@4FUyw#@%0~`#WkcJdfU?m-1n+p)!u)>@9Wj8SFi5w^wo!tV)?%40WZtqn}W$c$?H&W{`X5rkagNF z&(zHT)Qe-LExKtgaa%QW{rebT)7=m(WP(-RKZmKZ19m`$VVMc(R2E;AcP>s^jV?>bPIz zX|aglgOrp3LOw~P1~XO!lv+P47s3!I0jiFW7?={|j%Gr=;yF(-H5u9SQ4wt=$10pl z&cAeAXPw^!TvmOa8@D@AglUOfuvl9WtX2Q78s6;SVK2R*5ObKzaJoMamZ*xq3R01Y{t|h&f1qu@q)dd8Wms&l^Iv zPO}=IJ3G}LY<47~_l<~^X3ZN!0@g(h%?C8+v-YmS)ywEatThnXE?8ri4pH808i=&26h`OS%pUEDsG0Ndmq=>dPSJEJKkJ9UeqmKadKzs1<@x31;!JB- zQBozMxixrliMl|WjhAy@J+n1Dyd;G9*KjX5%gxxZ;VB7sIs-SB<4`=^nu?*X0yfS{ z1RwZT{5bywhXar&6&mb@n4YkD)XO{dv5FRRBi$m+q+JUQn+_;G0Nc$@haB{JC(K{e zdno$k;=I6;%z0#cYY0?tkg)Nm06{*D4EpUpEU1jXr*Ve zFmH|y-Iu*IqdV!nj}__R`By~PI3y;(d~K^mpx1}KEk{V2R2}gbfUvpE?kih?%#U+<^MewEB6nZd_a3|kD$t@A z(QOa)T8^Z5U2dB!{scUcG}l5Z-T)-=*9#OpB_zd(bhbzi32&T474e-imsVCCcX>zC ziv2g=n5g<}Ec{b5g|FBRMCLKNg}(nSNEAt8 zWBf)jg_l~5C0Ir^sj;k;^`bPym`ctU{;Y{j1g{6;41T9~eB@x_7IafpEBq9y@^7e~4xvKrb4b9Y^#o&2z$gb-w4G=dc zhdJ?4_9TmiswHeHO-fE^<;N>*v-4%uM$cM@A6I&W8?H`3okw3)Rq`GMU@U>MCZEDCZx>VP603~E9uYJiY2Y9 zPv8?}e>i=AAd^@_G|GS&$0|TX&u{aRe<{$s z(S)jPzf~JN2p}NBe}mtWCZ={SmS&cwPXB~&6>WPQQB1yl>yA}&B3sbTv_b`|VYwz$ zDNALkjMy0|IYB8ER1ZjFuS_}3>Gajwq^{dJg4w@4!qjNu#K=A(XE8$F^=^0^Oll2l zo2}l*-pB0|9k0*T-N3Ya{()GD&Z&I?!pZ^>)|%eQgRT%*i4-@jpT7+SIB*MY3j;G= z#*FMt9oLCgl+fKVl>i)I{WgbG*A4RwjT4h;eArp9|1+C)_O%C4eFR48=hFLxH zXr%-BZuQg;y~y3H4>VP=0lS- z8?1o zw#6reu0}V4ve7$y*PR^+#_9R{Of&qFXuDi%0c;rCyVU)!f9=h!ea(Uf4Ttu}<|W%0 zi&inoOFg&9{dbQ_<~{O2V|Oc)6&gDpS6lj7tKV%8T zcRk1E^&QqkK3lRc*AGE(LJW|Mk6F0jV^~Z(@lynez7@WzOSr^sXfu2UjzdV;;}O<3 z##~&8V6<+TRl$T_8sE9Ty2`K!Rw?-aJG<;_g>zXUK_E!X2-6zyq3^}PK&U$)r5H(m z{fv*{jwdP_ZlxmUe>5*sd=6$Pk>JqS@gjyaWT3 z@eU#|!7p9~ckd|wNJxadrsh5n{3q4=hsb&?47OSEU6a~EeTVD63so~A8+&8x|3kC1 zziAfgmmD%P5thFb8VEMSj84zO(i*jtKM*nw{a9tdl3X7YE-cIGM3CwGM(9^?SL@rH zx~_D;(6ZCxXy{kqS6b7%3^^2QFst<>7mL^R{iXf3+}F$br5Dh$1EL5f3Un8AUtqWz ztO2vcxC-RF#HgtleLeJ%)-1qFaDs$x`wHTgjTss}z@lFymNeqdmdekxRUnoffou-2 zP&sBQ+olC$pxYY~V2}CX9z=fu6|!qVZtv7poi^Q)Hi1PhUj*x;z0x<+*yqwa!iN)6 z$?~E!#BOde4VlG|{8Yc8vsecf?_w62siv_kL)5LCJH3U5F8mwRja%Q}#A0*|BV>H? zljTRl<>e`$Q-A!>W7aH;l{se-A;|LNU8fmu?kn@WfK7eS1k;B1sl&o)oS3fFC?K0P zFy$NqR@nT_0CI{y#pa}>a3?N6HY6I)u9$Um2JFyuit!n%Ex&dm+wBh-OnO&>POWV2 z^^Bo?Q=&QN_Mde6!}|@=!00@~)$w%8TNQunU!@}sY;9Q9I}Kyc5nz)?^bNkO*MD@GP1ZY&#PaZT~jI{-yyXK%TYwo*HvDoH77@Y~ef@m%#fQ6etW z^fd%5!&U0+9c{FJOr;x@L3hG^S|{ozLCQEYG*u*F9YMW8csEtZ3o1fG;KcH+zf&Oq z`P(#TybznM1GKmt1;xa?Ye(r|DCyv+ctFNWz?1LVMs}&$9PKE(5LGOj5OL^27e5=G}jy+48ecLT-Zo$Rm3@c@{$f+qSaYhjvG9>$? zc1v^Y>K6Brukp_`vVaqWK0C9jPI{4X)DSFaF#;%=mPWZ*I7bfK9adS;?$OiS-;>!J ztXLNTTuAAay4?&RuKX&r2%X~0NHHAoO2;=V67-rVfCzh3BQa#!9-QJ-nV!i5g;-TC z3M9FSqqbg9QlHgq{iS@=2%R*Gj}2bV%qM=x$LlH90Ak7Ri7lMo8wc>Oy-B=O`J|`8` z9m3%FqZY)}K^xiia1sk-TglQAE2RsdmaBD0S#u1s3bWCbu;#dT>oWLJxCl`qXs3yzfTC^B{X4=Am znr1?WRpKZH3?e)P201r-nZZZhQ;n(y5DTuU?}fMhe|ob;P#EJzfxx&v79#-6r;NH!ln?kSPRlpD20W;kzL{ zp_J7neepvD*>X6-m+3fi_}A>`S@gz_FfZe4o9nx;Ca%L|AT%mVbU8zKq8B%R1O0cH zTP@QRPWy(qLe&2O=Io4ZTuuI|6&I?%|3+Oz`zu$sng)vkrM0Q7~!t#0D`fn953@<*x0<>6{OU zj|VR^w|gD*wJ*l!t=8v_`;TnrYoGH^mTFK9!0+>tVSc=K$DhNOFD)TF1>NpyUus>)w@`y2xTuF(SsgpFL+D0V7wG2;ws*X!}l-o9|}t_ zoYdC(ON@VZQzg6Y7wi(RNv>JPc_tHPB*N$8go;P7uheaT`N2` zqD7Y}Q_Vz$YisZ>_bNatmtFRfIVNZ+DJ|EmpVAtUSk_eA`F0(mabR?mz@*wiNaE02 zCuLk{ZmJve-S)J=M(=L>SVS7Jz?Kh`E`RHmuax$v6Tm1pp31r{SV=y)XvmeXBGnGW zYm7u*u;OWd%_l&2(-ha(go|;Ku?w-K$Rz`8X!j)p2W;bFvs^QLX7@+W4jNTC}mo&c=(uCxm9v?@otW-N+QRek5R z2kWSpC*Hf4DaATpjARwREbSAh{9<<>%W~xB%_G*Qguvrg(d2j@q)M|^Y#=E2h*>?r zN$WM^+#G_6Dj&jA+*Tpdi4`Sk3-0MWkt8LpvgW)e7`gc>-sUd<@;_M|ZfrI}$X zm>V}VsI+SL2dlaqlj#PWn0gBPg}kc}2z+ax8ICn~wuhW`#y{cn_;lWcf_C^|${Bo$ z#Av6#ZlC9+%74;=@dn9zp-1~A+y8ps7EOS0CSo1-15tn&nw|&+a%JOIy(XK>G8kEn z(*m5Q&}My^&T9xK{Q%#V=|8IV62&b5dEA zvwizjox%q{E@$FW0o>CnvhVivZ+*xe1F+Nt`xH5DIDn;CzN!q& zk~0q__i7z!S$O?rDQ>0D|N8$%p0ma%J`U_V*XK0|NDDO4P4m|tbe2j3S%i7!1`*&p zV)mgC_^&QhgxZ4>t&9!;h}D0QV(*s==xz zxvZT!gau*q1WxR%`6a&VD)j1bWGWFrdPN}(_!*7MIA+wwlPAZ zN-5(NP#-wuQzN3eStU>xD--i4wir zhGKn^Cg3?y7E9dza%CL(2tUDj_!@_f_$q$;;<7Q%5NvT3J_II*X|O6mhJq*s8DSWO z)1*K@wI3kOWOnDTFI0=Oha%?+hQolKBi)LnlN|^a0l=%KVBU8t;a{4U4%{49M>40S z=w&G)!^$Q0a?;1*Q~bNR=@9>^ELR226}$oD;XsWGRvpl_aTZzL`8QN)wMRfunq`5H zyk76?M9!);jov!T;c+XDCt7pI2`a3R+nJJ%B%Fh$Ios1Tmk0;Ec%tE043X?4aYn{H zO_$Y9+OEhLqclQHyOE{PeO45oL@4Xgsu^Yc#ijhXe?Eq{)y*-H;+e8}JO0YE-^oj_ zawTO1FUkkF+pNLCm*x-dQTI^V?idlJD%HUv+7D=ewepDmVKwdJF`mEL9?nn2KZM;2 z*X?A%0fH|yusPID76}(`Z6td9s-i9d(1b%9oERZBSJTaC@U4p1^ z2HzV^`bHfeQ zUO`epAaP16!|zJ+%A(-m4l;G=-q%ElZB8sR&p;En{T!C#w{g$KZm-3))rfMd7#@Cc zXR+&}JMjzegp3OuEcT?}x+0sVY!#b{!M~G@y|?v%a?I@G&+G-(k-y@|i#-Ro>v1d5 zS>&=h45Kex$nxV^6XgQ%#2Xy8l0d0<@x=SRw%n6GTABPbQ&Qq_y-(n2>02=Rjl$*{ znA|)ClddG_UJkqVaCCOB!4>IgE8Nmy;tLH!t*kLpbpVZ(KpAW>N*t|BX^l0s*OXpH zM2i(?(J0}Zt;h+sj|+PmlrMu(8Seo;wfpOo)2q;LpZCboLsbC!UfpxVL0x|T>}RiL z;xmZ?7NrO1;pr-XNTtoi5}!rwwT$yYJx5H{S=CjRYF0s4ozZX8^(zuAXd%E#@i$e5 zpFpsdyleQU%@F@i@!PoA5POA$eX5i)8l}W8C`cTtK8F2#++4Rjqz9rSW6mWW>|PdS zpRPu@mjfO=v&=Jd>@ySOGYTfc9~^}ECq&S{h^6>PWBDFGV)m(c{r7E@J(3af`wx5~ zm9qES4x|u=A92zLKuP1Qg+OD1{EpVAmfF|B=~SP0XOtEDfOci$p_sr>6b(W?#e?^r)^9b zdI|?$vEPWX24ai|hF==Y3}_)e%rqQ@jSmY&U*lOAc^h@hwN2j{G3|pkECe zU%6>2z&aisUly64~x0gOi|lq zPI=78n!se+Tev8l7Oy_2lHiKz`K(|=U8N%6Aw^FI+owkK2W z4cB7lge+meKnmn=iVOFY2FUzOs1yp+CUYrPF+l}++V#6Pup(;FVv)k`b)uMRg?@WnW@s1gD=4@U`7gaP(}z&DA?e) zgjQX`w3B_Nj?;x~Ol2@$-K{)hGCMBEjJblkhP3K#okQ47*=ZJt`0+09Jm`_&CrBO}l%_}dqRtT09_IrNv5)ZL2ItoDFtopghj$n2VN zr7u{0*|3C$^{|BRQYMxb3o2B{Aeq+jNO7IHqh>vzCBXBJNoTMxOasgXoF~Gg80qN7 zA;`cAyv=ZjU-OLC+DGv2N2$Q8r|uJ9_`3rj4v#6hfilGUVUAI}0sS?xCLm80BSkKj zALc`1TOQj2PI$Nty2U@EO#--CVQCg@qe%BorS->^#h$LrskWSgF*`jXTRznb*nh7! z@~Md-x4&N|A2<*Y`~Szw{O7w=)s#n3ME$bE2#GeOQCh_iy%fUwxvw@*=pR(zCkV3Z zh{?donPq8LJV5Y=-!hVE2s8h7Qe9RhlJxFM;8q@UIx88v(2q6CE7_~7e$(09_w)4@ zrH7H38aoz}D6#-RRB*st@l%;G&p@R&6+lQ&*-|1jNCu{ks-x-;?{*-4!mo z_U{3U^jzWf{X>@5nH|q%7n^_vRU_Hy%O&@ehh)2I%X`svHs=oTiS@0@XCBd%T+iRY zz`7M^2XPm4NrII-cqj{hM^I>Cmw4v=-B5^U~J3mt;`%j1hg|C-51TJUUu1BkCH>dRS2lI~Eg3Xoj!5oIewGeF+P_jMBwSW8{Q5p5~O zUprtEbSxZ?3j1Z-Jt!DX9#mrZ3^e}I5pYzD!6B>)guWsxu=!c0WCLx^C{ZYNMLQMu z==pu@2)vW+sF7YSPH^>wvVEKr>=o?B_xHb;J$V&Z?OWa(;R zfw#;^v(kS*u+|^v%<6iBaCytp1z`$GWbWT}=(>K-+IHuAe;4TffHpwfmVh)`2o1zc zsDUx>z{Eg8x-ANWLQ;g%laWG1O4#W|)t>@*lmpvk?!V0wn{{w9#C=u-HQz>uwS>8o zH5jT0(a_&)iZamOcBhC=NS^d~>Ezv*X0MaJ&{G9Sp7aKUC5F-Hl_3ABrQ9nEYw&x* zN**mji^yVo_`xE(nYxe=`NK(MK9wn6O(r1?gm+j~wowkc1mS5C+94`7*{`UitX6}b zWjYeelwX$Ot0Y@tt{#wk_jegVcL^3UJZs3oA!4?qsQ|kz*)W}LL7l#FNmf|i5V4_|6lq3v-p>V0$tr@LT3SkCQ8=!2 z_VCBJR#{bCMYg3h2)8ve^3D|J!t-@lhRGQhNv~K+eTbircJ68B+}?(MF}Y`ut&^pw zbZ`-!@S+l_CGD>Kx`j)uDr_E0{ccOcE~KfD)54HScGgf7Ev%CXRwyGONgxU{D{j68 zWqQ>i%de?SW$ELW^LDQlWQY8 z!f=?khGnI+=xEPs#$4cz(a||S5geq4Y`rDemTC4$Hjrnu%6P=@ah2nv^9jaZez?C} zDP!gAI%DbYNCS&E*_Ldb`Ai~p<>{3xZG*rsI2Fhs;2v57``g-M)D$bRXDZKsk45t( z8x^zwy0yC71CaRj*8)scuM+zZ1qjNR;n{f#k|VXR~FBn=>CKsZVk72tKQk)CzO7Rc$3D%SY3^n|SYNdhsR_|6=4a zlWT`B;8!2!*XD!Q_<;jP&BR?GtoM;KCBUZ)Ea24OV#P!vKhGmuRaQ#V9brRu=Jl^LV3kYzirF-Pp+=^d&H_)!Q zHm^jvNqJPiXg=c)el;61++IbT12E=_eV{&{H?6z5(S)z}5}pRYnXT+1HvUHdPnFNjcEGLA|*LwTgiA4}*AfB1GZ2eVaq_Yr209cJqQouV!SpjRMI zj+W-Yx`s@I@u&6WC-iv~_=qqbSD`f;BK8}<{Y1cc|N0r-;e8EYKUIs{!cI2m1tFx& z_>Eii;jZNxK;EN{lR8Q4lB;awQhaEiXb2`F%JAkLUn9g_X`cS`YMvb|V#OpPejqJK$0%$h%kXlIj)1R_%an{mII>;*L=c zI__oEY#*shu@Sqd$Pw$#axasnPU4sN3-X_Y;~&mKb>6i!m2Z=@*Ei{4__yfkW@uw+ zqGW1j>hup+p{R$ksl$IU%*RQ~gD{~6%L8Nm_#rr$1dc(@3!Bg~h)LidWU?m&`Od6U z!|fu0MgB#nPEP*;{6%TZL&(&tj&XT8+PcjryS=5a2h3WN(>Qe>t*C2O`=4qYsJ^b3KztX0qYn~)ZbgJh$%-i#fQ*(>B!a8?vL!W z@xkI_Cc&Z}ZV?~eA!Z=q{@LnON+`?CKjH8(h%;ky zcI$VsRj2Xl5Y+O;R&QkROG@cFxl7lAuV`AOa^!3}j88N=ace%#w^UbsWkJ<)cm5ao zUP0_&auKGMo#grV?>^8!T%RuXPXD{vMk;LoUAlO<{4>?5zpJCF;{MffGj&T5gu9^w z1hmmYrl+OFC<)~wN+b5s;<oxeu)ndGA!L)r86e#cmk%cTVVdz7C3EJJvhKM1k5HuOKd(3!S1ki)` z2iByzOECJRLXU&4N0^BW+yn)o6PWc$^~+tv-xMI!E0Tq58hJ?d%_C>W-OvUulxU!J z44N5aoJg`nIy4$FA0#hlWO7g)x!IwwcTiPOu`^Tw=$5dEs_2X{^UsL3ggQ)NPmu;y zlDMPPDP=c|QZ>3{!zl+Ro668qFw=(uo2*U-4wh6R4hq+z%95J>437*H1^W*MP1!ln z)*02U#TT-F^kbc)V5XlGH!k=3T9D^&C%V8r#s>rk`?cW7*(?rLV{;%_p8j2sa`8C1`JKsLB8+WL9{E2Wxs2Sb+0%Oo8#hQQqil2b-kmD zbsfIHJq(dp(Axsd6_RE=$VqyUP)k5CW-$m11!3wPB+Se|q$kxwCpS0F87UmJ8HZY; zVu>V8zMD*v*r#1GV>1i&h8#V{8M4nTx5FuXVC?KC@e~t9ob&$9C5IpzV0;N7ukC}_k@BOLNSY>_9zK|0 zFZ8IZY$WKjmt0ov#X7Y4CM%WpIOr=0(@esQGRICqn;Qo{)b;Zs1Lcp;@CAKaOl3SQGf-oOQQ@DTu)l*5f95FhPmF!42#G-Q8o{uuiYENP}W07 zkeX`4xTv$*9~@eRnearQ^B@|96{u&h+5mD1DcSZXJn99T=&TAj^JE+KEZ|>jOsOX`%_(mJ0(m@ASbSa2WFrUI&T_`N(nu{ zdfofW6X6RU4Q&K%R>8Ow*8N?cm*fhXKbMz7<`t2QwR`i4hoF)6G1b6z8bU2jSBGoJ z6)4p@F?069M&LO^GyM+i0@srwE3(;X8BY3aD@WiUCHGQ&vo{2JZBq&LV1y8up_!Sz zVqIN(D!GehJuvxki7*HTQO~?uIpqZT1bew9<#>bNXG5eid(|>U5sy!#erMa=n$+XD57%^s_z2QT1XV*nwb3e)1r zg+bBIjZYyTgh~)H$4gz9*$zHoSmr|bVS(7;ht{yZtQX7F3ZtwQ_Zv&uTGYFZDJpCp z&qxiGd@EwaPWVi8!ovL0F=r|ybcg|}NIx#h$7GhngJ&R(8IUNr9_z)V=W3djtFl`A9E=}ld1$MXgpPST{iWEgHt{= zZaJ7Myh(y4z;%e=(BohqwLAS}VlEfM;shR}xmx+w$y zU4Ljy@F5BVGPK%5DcQ>#%&9n{Gyf9fP*o9B?5K5m*uTnP!)cH1W)I_@y~hj4v)E zlM#+|!&q+^?u|Zl@r#j{5`DEU#@gH~_eE&)N<6SOfw|6V94^P~!o)Mstw?3PUctwA znv=V=w9}6LX{)JPrViqhtcs_)3vl=h2k{$Pv++G$TRw8rSdHEIxPrXsq>i4mi>D&u_f__` zK{87&$N4afIuUak2LMJ>$Kl#0Y^|HCFEj|qaDDYUw<(5Apn9by7AvZS4YA?%!kwpG z0ao86u3Q%*>M*VL7e;I5#v#@5frQL_j6AsO43`F*S%mYThD; z$@2^^F0Y6-+qmC7k`umte)-95_J_9%C zdK3j51!D9a;msp*%ilxI>{M)EzC`F(#~Qv+uASZQhiUHg6 zU*eJqblo*VV!gH<>ZO&CSz#|c1Kag+)R*3w@ej+ zL#0eX24l4q2BrLidZPpkT6m}gBPvofD#;T&F(9b~?E!lI{0;{;i-GSQR~QuBvNPN0 z{fN-=^1XyKdECb=p4E2#iRjqddCI+Oed~Dq^}KuA9`vM7p2%hAC&`*4V~{W=KX$y692k+1MwkmE3Fe}KlrY7i z!*@G_%j7T{EvS+RV<3X4p%;p{I+u_GfIU=DIFCKVmO1O7#$CMWEZ9--lOfE8-WXLR zCk_o-?V$*ds4m1=iu1PMGVEpQHk0JebH1q!ja6%5>^PECwZD@hiisqfsUq$rH^5kn zWRvaa2`5+)3~pU!oc2OthMCoL%kuEab6O5+#^^`3Xub*q)8iy*RT9sINhTW?NI^9ZnvuDjD(t8&X z;;51|wLMM-pd%gYLW2&X1DVExy`F2GDs16rBWZ4#WpbUT2H#OMPV+*^I?(CEtu zVI!9=xa;939uU`O9td8TvppqYVbm0xozGaF0~6u^5n5UFqLUra(hdH`4Jhl0k<`+_ zfTQ4~OdtjDFGECv(-+K~8YS(0N4%Up7QCE&7(D$w8m!M{?ylbEf`bbiLj8^&XB{){ zIOu>l=q@BMYjfkrf);ve4UJIM3#4oeam-Rly}2Ku!LRTFv199MUgt=bXV44=10(aD z3{z%^wDwdQ{Nt`FHCAVKY*Uf33#Pq!cTW|mbQEnQ8NBFh@}fGuyq?yZJj?R&WwRnY z)po{RoS6(Xw9(|qu9lrPN6CkZYxB6Q%%W{ujN&LI$GN>Dhe3lv19`5$b|#)nS6%Hm z!MDB3?U9J3|T4}HN$$a+YUKcjeNNsfK8u&>Y zB?hxf43?|vEPdE zrlTRBT7lYAbRl65Muv)%nFYl@Z@FDCr6MJ$$=!F#6vV6c;9%i%ZhM1SJbc^MFdf>C zmLRf}SqHRI4Jc^_WA_PtA#3Lk=%#y@na%BrrjnG}q6<;_ckKl~TFA>G-u3sYJf@=L znn)q*D6=Rrir_;Z^;-9GEhvw}fv2S&x(2vLa4l8vmb0m#sZW+Om#TaSeJBLnuAw{L z=!_RonvGWikue~=VdQ9W$SK5hheSf${2{1|0KpO^385Y#Y|k#$Zolvd&S2@0J@o^N zV_Z7!mdVX-#e&88mI%jJo+GXBA?8jQr`K4Dlm&(U|xTU zR=4Ulw-jsn+)(SFdLeizd1H#v*%DU9A$l`Ml)x3)zL#5AH0+kSp$k;fn&OG0dHQSr z7Ftb@N4Sd9OIqRIEi4_$jXWEtssN!EL3bmz-=%dPY2!1?sePXOPYgHjt`$Q#9ZL3X zQ1nj|DS@ztbWeFHQ)n0E;I%Q_@$=<0Eqp4%J&oBH_Xe2`8$0-(%dUA|!{c(O52~{E zF1oV0oUO-WR(AvjsHUooa7~C4TJ;&3P=8*a*(sj zKgW#!BL`Kgzq_LzV)>G{XUMXH_9g-O6H=wrv?2kQ+qP(Y@4MxYW+h_%BTJD149>w~ z=*I4JKgSM8DXVOv99lw;vk(O2K{0&~^EWg;&pW?m96$U$;VPWwVXDPv!wFA9^c;lpSS&)J1}moiO_? z80SK6C+$8DL}Qp9lFd5uMqZ~FfH50>5C*7nV)c%DkVPsRc2Mty0vJ_-mWji5Ly=VW z#fd-KPCjchZ&7BwxFb0ZDp;VQAsSS~%d9y#XVxEuu{LGS5~FQ+G8f+Q)+F&&=N72sBHP7Tz0n0x)ZXyvnZ2z~ z_o>RcIH5;n$VI{Ki*gWUaKukF3J2?lzW-+U1R1RJ%y2`3^`;4PuT0w^iDp;!7Vb9v z8`CU8c7%6`ftimcPo`0$NbBjV&GHz=fT#unO4Ml8YsDIoluwiK1Q~Y?s7iVHXKP8Q zE4;t*3mb&|=e7x8yRz7Ei$7QBib~gIspzuMeag+1nwi_>`}%7hZ0@ksgvX~U>|4tU z$U^UG&@d5C8viD3#$D;@UfWA)lCupN&&Om@5tNzBCI9gV50%S`q##pw;Jkr(N0sIB&z)3r3;dza;(tub86KO zLBEY)0cfA!O1I`Z3bz=zD!1x7Mpjb_$ENEkHoDJ^0wFk4R~o*TeQUh~Cnv{TD6lB!UX44XV!q)L2vQ*@NGhc0l1Xukhs z?Q3>)gFc1AMZ3*e3}DeeqVxy(@@r+wSFo}Y_$hb^33BaJ1QgXF_DT)E(SOd4nvdmN zgNMUe-?JVZweq8dgiCkVg5~NcJ<|sa81-(8H`+jb@|_Y>&;m8Ma*Hvugg`hhKv`o_ zur{DPj1_!5a6x|#lN!O%1&Btv3wfg5HF2$vL}43eBltYFreJv zH3;H00@C4v6wqWu4f%itGDs(grT7l^lz3xJsp!{4R3cfa>l`7;_hV7X(Z5oXqmxuz zBKfvTd$IAMP@j~t0%B6pC|@K62Z~B}E5|b7#0(U^db;1+fUj-$H5Sn52nP3F;G94* zQq(esuswCo9A_{q=n$d}Mj@%)7%Cy3y5zL-qz^3_|G?`1^|F0n_axjiRd(d>Jx`dJ zL!mqtcRj->OxgBqspA30TT$gAF=dR1aWWl2dIcNa zcA(@UP`WXC^2v?T6|2N1^QIS_e#)06Nzi9B)G|ZP=1nQR{$2PDdc>LT0##~`+`HEu zfsvE7_y=|!hjLQPc8uoVJe7x$pHUQ>i+VZ`3tCH#uQ657^xQoDjyCpD|D?Q1h19Js zjhrh_(Zm?SOy6Hc>;$8^iOuj+Nn!IuQTkEPlFu(dywqzl4&`9eO7Sf09GJ=w7g=im z^A+Jg^~8TLnE80g$*pf4QR};YTyL!1BBBnyt2loMh?44x)*0{cx2gMz^i z)bd9fgEqXXs?D#4;LJh!qLZu;Gdl_lp+^`?o5^W^NHYC2ZG!8w?eE4F5UfMeE^j~B zZd+_D&!pSf*3AU;Zf*+0OJLGrnZo{#tSapL>qbQ4#r9x1;o+PUBHL>#Z#ze=u+Xt% zzA08@xf&Kd6vyv={gyagum{Ay5H8ln4@gZ5BP=9! zZGlWhs8=CL&rLoaCZm0Pvz^AWTy1^rtt{pZ%=W7R`zP;CAtXZT=zu zkKcl$*hg0T|Dx<2qbpsrF3^hY?AW%=ifyZ6+fJ%t+cqjj#kOtRNyWy^Io)6P>AvTV z9(RoW{@B0g!d!UfVsA}9JJ4t1JZwGmn%sQIyvb~P-*h|#vg)YSF|$Kj}kk z35Zr2fmC1GOW-EYRTo^u%w@*4NWo{v^pb<%@a+$-Ki03kNq?W?RUB=PYpFuZ?ti1g zgVclKBTwe9+JT|!DA|z$D*rkX46*-eJp2m4?>OmQ+6Y8l?hjv&6xFL}5_ChZtK%Jool?K>^R|dog z8tD*dNLek6{?>8|r*5dufCF=$CiYOZ9bFR5qqQg~)Ych6US9VYlXM}I(ZXp2lz>?{ zr|JjS4I6(l7S!mG>h)jWw4!nMJwglNM`wa{99i#kVr^E+^~{aujjkTx)9-VtBQcg; zF^cpXsWGgwe)zJ{jItN+vf)N2y@9qfW0HS|$q%CRU=j)r{3XYq5fdZ2ev5Uzs&hN? z9n~!$Rb`5!j2+qwq{n4V717Ej6$vOikx{2X-hHi*s<87%GN>S>6bqqMdaq@@jw1mjRoB^c;=A?fRtDQ?@#fo{-NwS3Srk(x~MUV$F%$l9Jsc z4*bz|Y%|9^#Xq$`Y9UF(;18hIam-GC(e~oR6v4ea*M(8WN*jr^^`2FOH@UT+eR-)*PLQml6QhGG7QCt6^n z+-uS%)%$Q&AM~Kt8iY?!sh_Ux2|j7D^dl3ivbU90I~tqiOhCEc5i2X1n!gVQOLkWb z%O_%$HKV&EEaMeJsoLuxZQc%T7i&V_Pb2doH3dr(GmX?ss>sw+ttfj%y;CPCv0iYe zDFjK|k${CnAtHdKEhL#GV-W0sOE1(AvlsbF-r_neI>4<#P?XDv>|CCU)IhY8a3`JR z6_j2IQCH#WXHfQzDRd>BRAx|kQ^5`^9RJ`c)yC8%*~ZKz%&TIr@oO0SYI)>$(=v>S ztX?s7{Whec@Pq~^v>0N2lGT=ngf8T)It-~4-tpR3wJ}BMC+fxHwt5bCWE}QPk)$)^ z;h35fF;5F@ZRS}xotbwuK%kVz@15a%j$h<-nGVQOtp-9O+-*eCu?-?#=$n9qstGJ} zcZ2j1&z{?kgIh3OG(%c;>y0s&R{f&)We2Uom!)3FFsue~xN&9+3Mh-ltT@|PN*L&c z#0~4G>!l6Fj=tx@<*3^PC+a0uF_?@+=W_{TjHzeIWUFRN&?-^6!T?Oy?`2bjRQMa` zB0~+5Lz;)*t*8$8xKoQYzK#Pp8z!cSsrV37$Cat$51oE^C26|I&72LBggoRPxD#+` zHD=F}{#IZdyIES`@w^CYw_pmd_<-OBVqNPf)Z4`=Dr#&_a%a9V?|qPnb~L=?&^ON<&42zaEQAVZ`odF>39LA(ymoJehK-n8gfh6+2o9>vJK_-%yzrK#mf+MqA(Z0zLyi#LvH#(0qjtT z8;G{S5eBxM@8K0LX^RBo4N(AuTp+b>zTh6S6)7f#Std}N!L z=?k;7goh~%VlHV7Dbv(p3N8zeo#Rf*F3K~lMx10yJH)+{x~76YQRB#>UOI155b3~E z^dyU<@-4{vqPC$x^o>;U{Md5ycv*E;p4d7|sl z9#>2Vu=)@eLVwg6f-8Xkri*n2@s=#V=!V>#L%(y^5S>Fuk9&JqJ=W?7nu)~U__lGM z!>`EecS=^>W(!RHJWyTR!5FOK4pJsDAIu@%T6VH%H?*C$z^LuHy@6%CH}alHp2L>a zHZ$!8eAj&v&Z6Kg0Og@InRm=W+=)4;M|`xCBtkrh!^|PdGr@FkZ{Prb%Fs>a7K_m# z9162E`W=4Dm~0<_(^D3*iyY?`*+QqZiamEjcG0EP6doPj+U$a`agc7Ek>(>6x_Om( z?dkCLqt&;^_R^G`opMg`x5b(tLJe?TeLH%4K}(4{zKyYUWv~B|Tq_mY7N-}6_ib!5 zrO^#8dpeLN{}F0LHlJ5OLU5<;ZvNa(;h3>kL|R#9x#w_ahHtQ4tCkt}y5P;I7lT@O zk=lu_q~x$J!$q*{VuIgHZ-yagQQNI$5%sH9{|x$(YhZrV$JTKo-W4c4wW>##{qAp; z4+JqOib;*nRkroGxi7I5M7)r_k$18aalWIV3$@h?B87oC3(@(hu~ryj;eIIUYm!vu z)pU@9K_J9x?<<%54%KK_e|Xr2~2+I~(uet%9ou>Xdq{mDfBxy7Vvu7+ZY>O%%4orJ^? z7MA2ExQa-WzOW*w0GTsKBA=^Sj}~n7eR`NgmJG?N!cxofSDDV4i6#0=F8)tiyYk{J zpOfJCp!cMPhfG+)(J#e^T{OQve>-M>ew$;uAFua_UtxTla^V$RLTkeJ26j_!^`K{Y zj9mD;^8?Q_jL`cdIg}BQ#ary5v9zQ(bGc&=V(oY8u`L;U>FUlL213;`+!FP(oOf6o zoT7Bd*7saDLSbaJ_w0v5N9o$4*tOkI)U@4T)Rx~rpF(0qpYm*MU(rGErN}#*e_l9( z{rR&148WKer-*~|6C;_!O^CcNV(DkdiSlVkK9kr4sa zdX3a|sngmSEVTIg?T9cBrxq~@0YgSnK>4%j|d;P5q5{lY$vXYvXEV&Y(DD%jm${VC*wHxExV7in)+NudT3tiEsDS&VjcO*pS3VlQj zN}bto^HBXlQ~DHRR4C)3IC3$JC4@!xV@ih4*0r6EW|>H}Rd7=M#S#@;P)}8m zr{i%NDzVaeib!}9EOg_IPuT$J@NwcS zDg_i-=8Pg*R;&%u(iX&WUyy{p?i;XBkxJ;^b;Q-b%tw@y&S^KF$E9t{x8~`vMdy@| zDW_^O#7ylJ;H17oNTe`o#EZ*dQev<1#by;)Npjp5k&}}~nzN8*6ShM8oy99E$jF)$ znmyFetVMWI%`Yu13=qnX@RtdlBCnVX4YD$ooy^A3i6wWfV5Zn=RL7ZX+@9+BjF&wE z9PC^~0FHtbgjCg@B(V#5GvCMdPS|*~QnJ6BfP&WN$#l8YLoNmG@@$|mggumQ^-lrw zbp-=wi8Ow90d-qLyhP$VxC;F)XCFUk3d}c%4$M{UuP%K+)j`&kk4FqO` zdP~ZypRTc_21wI3Paf&4P`E{Nc+c|8_$VRH5~)3_-lS_*=$COUg^yHR6g%D~WK$#^ z-X`=Tyfse;`X$Ik^^hFYQYbm+Tm@4eOTRl>OLJ-+^lY<0ucGB}KBMb_Dry$0Xu9}7 zTh`Gui+$2DiLSN~3c2`tpda%hbW4IxzEi%WU}9KwbjDyBaOt#}SZFduSt-bj)wCJC zXi@G`ZI2VOiKy&wORPz@a9yLjMmL^;sSp!oDWhS7WOVF)u}e68Q%|LmoRJzua3QQe zlt?UW?o{*P1p-2JRAex?m?$TU25a2Y(6d#CmM26h?J33u=7GEtRV?N@&knCf>&BG) z<(I2p9G5b)vRFA>&y#1n05W@?Itn<;8_-?!v2Fze!k1np@MaXx^OiSVf+gK(b)t93ka zHu~Dx^X5or*IdJ40g6-$Zh{EUd&HXAI-C|rVOrXpY}Oh%k3MWV_H`-d*T^)D*i_DN zF2Wnxf=#?Q7*fq-Z#=CuV}9~AhRWV0xC6!0@ltqZv{nJgS+CEmdvt14aEA5x1L4x8 z5|S_tJ-!@#k6}_~Z;r8kvjN#`l5|$SEIOcJnLnDfKTu_eyhB=Fr~ny_qgFg%Ro~*0 z45_pUs<`nQexyw$7ebx;;EqmDhhvH-`YsqmHhI@9MMO48&aZIBFPO3QF<%xqn>-redO zl`QD#QCa~ZS0I+zSy?)`La}C%c?lEA(d^tYCh`Xj;^{>(3u5 zRzO-Mq|wz}3$TxpbinGFFl+1jFq|V$<+*Y{s;F5ww2muky0cO zHFM9;p*(M6!7>*zEGn%$+)f-DC6KEYYA#wu5v^b$S~8PF(fQo4bcVE~{h+tn8ubPC zMP8Ed`Avw=o!FDx1&NFhisV~NYsYExVTbGWpG!%4)UrGO`Z!+*FM>EmA+!Vsv zNg8#pw~c|S@>fvOh^r|%Z7elaf8kG^39r=t65f=aSh#jyXYvFEMx{1logId$UkoL? zYm1-59an`L@o+sVx>zHzb9Um)AEtEHltIN=7eA}Dz6)WQnYI7gHEU_i@|>xJj9F+GE!D}!N%HUBlMF2fuho_ee`;u2PoOI@rEd9@=@tLtZD|wE z?H{dGc}87og1rN12dWv(5~r&HNUCMJU9?NLSl1}*`k_lDRjcG{ZAH6JIf}O6mOoc- zyxcxd2fHl>KcJ57csu+eL7=CAP%YTcjnSNSNbb1|@|a znFzBIYXasgm_DKbUVd@_uOJ_=&q+U+Zk|@R8b|l@)Ykju1`VENr-ZP~{863tDB2Rk zm;u_boF*7C@!QFAhKL-EQ)O8dzzZY^*LERLw7c<9R?pjTg9@YP8`$P91Q62Qwip=y zc7b2^6%0BT>T6j0t=oNVsUAE8wm3~~STdQ%0+Xz09UMDV%t%kaY|8_ceWiznT3Z3o zLv13QTRmpv-O^Ht_LebvzNyu@3&s>7mD<%p~^@)fU}IuD6D#AdhuPGY)z>LQ-W?{S{<&uBd=6+i%rLz zC#74RfJ{}c3)$8>x$_LHK*zIF5w2n zcpbm1Wzxk|LT)O`M1g17%acQMw79#acYSB)cHN0eeM`t&Nw0?GfjBx zUoONo(J#!nTPW8_bj!o;6ebG1O6ox6OwUl$xOa=UbXf3%g3l3G+ab4Pv6j_#$&{T@ zezrh0n-ArD1G5u0o~&r&&0kU|g$;HW?}-4)%h1MNLC-G!)2tcmiFg#K$~$4GTQgF;?-|=oYkUQ z780&)SnrSo>x3QWAEa2a%}Y4L`~l;h6y%0h*Y-K}ux~Arr6r?B`=b?l z!#HFUHOS7ES-7s5H%NWD+&)NI0>i6rzTCl6t&Gi#T!+cIqNaFRaHZR1%$oowXjpOm zpsjQnp;>22CLNuvkN6vPTF@w*Yb;^uyhRz@21)p~MFY84GJ8eP!8L)20+WK+UxSQOI%YB#y=mpvGY%s8)kdo;hosw0RFX^b)uje7t5kG`lKl{$lWTYvOgjGJ zZD>Blnqb)8BVY8K9qjyR#0l? z7xtW$?X}PwZo;viXVt}vm~PzU#zGm}9=p<6#$_7LC{tInFSkq#+Cwffc4Z!2&d3OG zWCtPiuapvC(-g)>9+m7V`meD1jJLSZVoi$8N&RpmZoI41#oq!0nIxNvI)xCEOi;+a z71@gM@5$wcqXJ_QS0o`70vIy*fkyd7_BNpM_=)ZV?up!fTnM28(GZH(P@>w$(#-Sw zGiqNm48}rTsvao|i|+Y;wYo?3MoQpTmzZo6#jk6{n<&A@-YH4xDhQTYA;}h=1L-?{ zeT3RE4)uf%Y zKUDFU*wT!7mhzCy(7shA8+*ZRb1uqsal9X3jMEia+U@)}Q|1ceYf&pPd?+oFqmTg8 z@H&YdLOB9`GOkbv>kLXBA`jgcG~j$b1TnC`9^c{8xb*?^e&@<*xI_hEVfuAT(_i{6 z%zqGr%9G_Ig;(_FY?)NTm#LVqiB_2>RSIcT-^6$exP^AEj>(2?W_2Ks$S$FwNf@79 zW`4?CMVW&5_ZdI3_stTE9XpX%RF#3u>d;^y} zV=UczLFBjq^H~7nK>NbMujMKjMWsqNk0*=Tg7dr)=8ay(yG6b`_NPW6boA z>pQj%qRuvdIl@z+s-^Zv@Q{U+W{RMdp@gP&wwO%|_*x&f0va{`co& z(=Ud0DzMuQsQyiPMB$;|+9J!Y-DtyH8A=VHXQ53{_mqY0IsG)6JE@-*iBsZ(-2q5# zXrFv~K<)%xCpQb&?Nxq5Oq6X2Cq?^BlIXw$5Hl(uEel~31 zj5)*)kwIy?tx(zr?Yc`{25J@#tsCc?p^zuJO80gcHzo0~r|SEzUt`G1a`)V_dWE%R*j&=h`D<9e-`;YAia~fjCl(P*6I7%13Ux2#F({>6x^Pv4fdrHb2*2>D3xv;NOU)w4gbDpysWliOtIkQ~Mk>t{XJw&+OWUyal z{i$*xIc?BNv3budVgpIfOuCp<;Q%mt;`MVIHV9B|(M0VUN8`8CW~Xf9a?`^wm9<;CvV!GWy6Ojgf+e|ywIFYTu_y)q z;I#eNA`;Xz7X3aqsXqGollzf2vQQmW+h=RO)Wy&Xz-+)=5xF zZ9hOlUDrK)X6T|N%CeBhK&JxtnzVc;1h)1aHc5sRg_&^Mh_~8ebo~C%FWC4ReqSgEQ;5F3 zxma^IbJ;tHQ(DL{hHq|e3zCow0@u6U&;fb|kEkQcvA$Edn14Ew;as=SrAzU65VCN_ z*(tI>%vYErV(`c(AZza7s8Z+&tCT#XoJYXP7{a2w5x&Cy21lXBuzt>-r`^9p7jIiw z>5wo=B2&G5nE#1ec6P;O6@SeKJ%?M)5}K+4AV_vZ?=Lj1Y>)Jy@Lh~~4Pub2p(c?2 z>dVzvz7Qbvm@mLo5FwB9nV=E>pH+9dtkvIF12dUjyFI~ZtFR{$w6`ZOJ zy%3VvLtaeu?r7VjTP52Bo-Lh_Vmtp!FCssCGF|vnFT&?jFXHc7&woaz|7$&4tD%UY z`hXj-(X8ePBs>Ev_>%#l{IW$Wp$(OvMw}A1(xhIu0#{!sAd6)5?@%}w)V>tjr5bHd6Y;42*V$Cz#^U&n|`LJ;lNcbu~!hB4;iE2A7f~~-~ zo|t%-q|#OIOC6KVmJZaitkV`R)bAHNC9)?7WE+W;_{-dg_9i;vpX&QwQ+*leAj#8# z?ocp0F(R1lQ~jw@d~0aXL5~z6-M8Jyj?=->eO6Kw5_TjBm@Ozt8V+Z*2kQ62%X2vE zOqdB0vwJQ*@=~PV3@(j}4v>dyoYM4l9VB#A4TCJ``qti%g4(aHYUbAFZu_tH*v5Q0 z)0`SW~Gwb4Oua00+4JwS6 zkfq1U@j8d4imbK}J5a4jY8h+oqO=TEpP4XG#UNi$sCR?bJkf+FBy)ApqC3S-s(o#+ zUWQh+SL?>~q6w;l=Ibs-=2NmmI4s@LnocibQnpSu`YfU8dSg{dzt$&dg9E&N(7SRi z6d+>sM1nDx)0G8fbq*XhkIO_Z>LaieQGUxJPw=Y}cGBI&4)WpDPmJ{Hs?Yd7E|pX> z2I5sHK8lRXh=W*d3-D6Q-F+duUxx)vzr_aQ-xAAp*6lVI#)#roiL|*vTUSVe9$?HR zhzRjZkv}d|%6&(4ei5o)z(<8;!=sUxDx1hN7Nu`h0&tLgUzd>#qpC0$pJT_`zpAz2 zh!;NlS_WMr^;J#i1hc?>RJPewwrGJ_gryATwuT?o#s$nXZJou!|C`t^iA)PiSN_jV z-Yvr01D(#ZNqf~SKvg8yqO1mbB8~CO%8=K>XEx- zgZ`KLo=KMe5vFz7dsqZZSFxj%wxedZchs-(m1eRa&5!&s)sW4o5KZ+G=P@I@gAYw} zZ#_3OAP?b;f`@TD563A$fl5`AF3U^boxN$xklrn@-wUAZ<$5aGgVZ}ae}0sO*;v+RcS0C%9-@x{XWvRUD9z=cx}r7; zn!^$e<`ud~(shqOw<*`RTdE7JJVU!TVXvXD1^NJQd3!NOtcJU_+UnXOgXdcow7tL8 z6M38=gXbj(&pgW2<6h^CKrh=69nvMB#O~4q-HTu+rFLiD-*r@4g3{tfsb??U@p$JIjQ_505zmW zjN_HOai~M<$5hNk-94%(ySpmsHYd`<|xk5rBUpXYQ zz}sxLZ}8kD%uqjwMr&tsM%X+rG@9=*Kf)C)3=(R6d}6HqVa@S(R{GQ1;fvgtbT@MY zcxrofb=I1o7jV3k5IxeMwhb6A?TFlh$U6)+SSze*%sgYlz|QgNw5n{6j7FT_5uOcY zJT~~(s;$S5Z7X}UbZ-?sNJ2(pnRY=&I^rF!8(aq)xsGcjaxInG#qN7K(NJi#2=TL;vi-J7w#x!#i`Eughd1OA@mdc%t}Lc+~sNnFS#LbQgX6TUWL9HfGl6 z)SAX$r9ljYzMkIxcnJ4leoPvWUE~5KRp+@c(*&v&Ft;pytzhdptMNh5=l ztzSgV)w8H%-Pp{duRbaFlZVnv7e9{wpsWLevjy03N-m%SG%km6rZfn#{kuln7wV)A z!rQ=d#7eLdhKeeRUDllv0+|H^{782iP^%(5fISeqUA#eB9p9ETpp)nprjE4z0TIu% zvM1+Rq77GH7A{q(DR8x~P56+a|AIgWZQOP0iSEg1{R}~PLsyRs_q_W^Eo_<+x401E z=BC<=<$EVgn8w?j0AmZS&dIDFCOMWg2=6o6? z*53@FWk0q4{y_wsV@73rzG8eX32IWP3kU%HZmrEl*pdvzLIx%yxuC|iv`mfr=EZ@| z_Z`9bl^a(CvE^v7^JaWF*j!;pen`U!`NByk zIlQxw@PJ%v_-x_{QmlQ%)@)b%?$p};ZA!Q)Q1AH7q{F`Pq! z)b1sUs|R|9X1wfT$I>IQKbiFyw6kFQcx1@*v1Ce>{i6<6Z5sefJ-^5#_MnoHBi#Be z(>_?26M$`-PD69a#b?di0J3}-{FZMF;-*B&=69|U$@ge78cNY0qJ3pZSBe2y*}o@X z#OX}$JeL_u7hB5oOK2q{vc33ZTre=8hq63kZJ) z5Ll`u_t#ddBI5^bL!+Di-Wt2;W4J28gu`}Rux9Y|X|AJ+v1mS;MG{3;>TbOx2DY&?f;G8Mx@6uS5q z=0XZHm$#~?{|b+-0ZAnKWnQQPiXp5$of>9~q%By+V#by=-clvLou^=BSXVMD-8^Q{ zo(5qcmOe+8b;wy66UOd4u&Eg>)bQxt3J-!whI=#` zp?wIzyKH9sq#mGfue<3mfRH?(y~-~2Bw{|WH~_Zwflp2b`<2KQv!$-k*mS<;RMO2w zB4BP`wa0NUkC(M`Oox|9t4N7NAfcS`_M)=L&AQ(awb8TzSI0drN^G)_gwwbf4bCmP zF%Os!{g{uiciDW$SnwracJ|^t1Qp&*{Q*_TV<&G^E#cDG%phYYOcz1>8=_{#{W>#( z88Qs6+i;IRhm}E(AP{{z$DrMbZ)l-Jlsd%@0H!Lh&+fXTsF5MGHjvW#TdzCJY>Am4 zW}00UGMNdj@)cKasDBf+ACAxO{RcJ+y|^+`UqXu?go}u!jNE=RqvI!V)=!PkutkvM z7StBBz+;R!mIZjUsuUahNUFa_iO7SptZJ&ZN7i(bP5hEw*$(U)e&=MGuYy6V;n0eY z+!Z?HUE?mly_B^^al^oT*lW!{?fmfEbd+Dz#Liu4;7%(H;i}>s(b?HnJ)A##ANWl@ zd-=c^ynEYf0pTs>WZ+S8Jcynz1S6T6zXzaLNOihkQ>XhNHrNzP2_9-7ki8e$d4!aC z#J~)TvdX<;X!$-gTYf9BgTy20+BZBgjY8R?HTeNf-5JW!%Sz(V==0-B^a7&KhL{l( z|9Hfjz#W8Y@fXkyykf8Dz>+XZubm*bxkFs)-fxbyNfNec9O9^&_lO#xQ!?2>h;jJ% z5(LJzuY8;OHhH8$+-Bn>OcFY~CAWXZ!D3+$d<`xLZm%J*H;; zhev(r9HG?J_5dOEK?(rv7T3hC)YvvP&9-G*wCyEON563xKjACD3!Rc#hPgAeSmI_- z582-z#VsQNqX*0h#nNx7XiDf?T)mbM{dRrFDYs@NaX6o1Ey`~~v1W|x1XhY!x%bkN zQy`ph<>KE#7S2R>f9VVT;q9G*SG}B{v6lI>`ue*omVd%Dun39Ei%zD~~80I}L!RvMXkMCub&Ra1goA%bD%Z&+;7lVT1zGOT>%Q_A#IM9Q( zQsDWtq-t7G`|cSDcN0qe?wgAAO-$Bm_RO_tGg_&3I;QGwGrR9Wi~Das44=G$6X1JI z?m$JQq5>R@v!#67*-G!Cb;kJ_Ai28tLvm5W`(n}5Ay|!S~Jh&E0tmlY4 zG1PeuHm0sHg;~)kN_=4NHvuPR@`9ch^2=UYptGsjR!%p~thKO4jFwwyXBe8CA)Y+&MQF7H1F0}<_5DNE7DF}btotUl$(me6hS+~_jquq z4?IlyoOGF$qz512abSdENyPB2^bqmO?P2&2=K1fLQZ#T}-LNu)alDR`YJ&F@1fmHT ziRuy9ajHeSg5cfpImzO{&r!!lGZSWV3;f^P3wvQFrqiGUu{q?*7}>tUKOyP?fz?81 zKuifXNxtElENl?h%szsjvpPh|$H@5zpGdV|0kA0V*pWQ4UcaM})<<&k2qK*`D7r_W ziTvCGrc=Cyl~nH|z3z}!j3ki){d!g~OD_>xuht8>$bg?TRI*2PP=71;pDBlsoEDDz z(+HWhO_!AQgpYLT_6mAz<#f*?h>|Z2}%JvPK(Cf)WxU6*2VPxWpYv%XwHrs z2C%4HZW7ybhhw8hJF}p&rd-n<(|ia?-ZUArKn(#q61BJs3nL?Tsk-#rVY#M-P9rHT z%eomN$tmw`sRWcBH=EEDD*fdL`P(_T{{o`lDDL95x2$ablc2*!;~q7g%xe6a6;i*; zQPU6N*I%V`Tvy1!xGkz(56$>3K>qo1hY)T2A#En6<-+RGN3N$IQ)gkh#JtmoL?vp- z0-|4F9d{70dIvDgk9V3dn9516XL(1jexTt;$gLez3CVK#r+SI_k_(%GNFmb+xjaOU zL;To<(iI83x28{E^F0ziAC~K#iz?48)JJoqf(<(HRSLG$-n=*U9j zT4n(qp9#&hw^$`RG^HS|VMw^!L&`nY2pUna_%X{g5;LGZL5~x*vle znlvmdZj(sHrR&je?xw=9Kr1~vhha@6Y=j;4r^r6BN!ZBJ{l#MR$qQ63ll>RDk{EA6 zt6d^4ifu|Ko^Xxd5i#WD;1j!o+Mz#yMT#jL0mz@~@z!-)s8CeZNK`u&|mdx+C_4U+HU9GE`^wFE0;d7s`p^{h_?qlS!*O zXLL@+{BX0z?C9e2?c3{@>d0{_V4jj~LOjZHigIMCs`}{**4#BKTtq(`hrWQPA8c*u za0ts6!ND~~N#GKw0}#3Md>yjj7sAB>7EXD)#G@v~awQLu`m2$>EXJk3!0~Bs80t-} zRuv4I+o@r>Q=>B3jt^{&#MA=`M|P&JxMk~>keqJF)~+ts)K*^>qww!kRo9+^3r$5= z$V`R?oHYZ520$R|4i;H@ZYa$~*w~1BEC@R(=3a2FnrA~L01G4=QcT!a*yk$RZKXr^ z<{Z$cO@U#8`BBB{YD+O7GNnYh8cUo|&q4Ap#4FEL;_*_5Su%wP`WGoWi`f&0dz@`n zXde;0?+G=bWY?9b>)>z+`vNajBvLFO0-=j&QharHaJQ`VlSAKz<9{Zr#iR> zYGkC>!CQ-$)F}73!X@oV?%cw6a5G$E`aw;j$5{25M572U!tljSG+sTQB3=ZcOOrrf zFj!MDL%fm4wExn8`~&(aO+n3>Pv{pvq5q!|$mTOA>e}dA8~+P?rFEOn`}FT?F5_lW zg9B{uY!uZs_2Q!-sP;AH;)#OvM=YV#dnUmK;u*vCRCq9zWM6lH+$idIoseSw$6T7#%AJl*66(Hbl%wsV7%f(L=;(Iu&06m!lR$2DE|Ywy6n@+XlpH4;z8dX*X=%x#D~3UQ*#>JrX; z6AYKX2OIxb_z1$FP&MmPme|!V{-ML;_~eP_1>~#HQYDp%#XGL{nmpf}G=6Lj=7LTX zrxh{8RW~^cRsM25g@n|n8146iRWdqd0Pf@GqIaX#O_U#6(j$bOTqrs-Oo!D1aFXA? z;vvqCB~sMH=i6kohBRnMAv@WUsfYt=mQw=o~oFSB40r^S9uRw&6@TBTvo*ub0 zq^?_gu{;}k&6DSmb)@~#GijL0i3v*|TWi)m9LvajdOAII{gS>!k@tNcS=DZ_zn#dT zq}gq2hcNe2-8_+paIfu|uX{NvibTIMzy7SqU&#EvPk$&@k{nvNi9VwCU1Cb&TWJbI zRr7Hm8VDwW2tngYfPx=9gcR}q*A(`dM**XP&Hbbb<-pLHtCP()+6|yO zFmnpzX6juQX~+?7n7Eq63@}Cn9E%W-mA;$TY0aG_)oo7;R{|CEy!gwkR`ldVtvecIvDk= z6c!v{FD8dNw-#%W(0JU1gX&yQh@Fe*X1UL*HSS}{(-ZW@MFiQ>v=?Vn!7+`-j0)Y?|Td$3PLP||BX8G8r+ zPitClPOzW-{}pST+&{Z-|71In{}*da{){yPzrn%SlF-cEzZ221!Idg5fmM*%2e#QA z@hBEMWI%5~|1;L~*>nBukzW+PfBKlXI@~*~vgQABma8HH_TaTvrH`Vel5p82HakfC zW5lsA(VI{nUULw5L*O|IRF$akm;yg5=6EzdfY(w1YjjT?YyS+U*i=r1Onz4TcEJa0 z+D9#CV?J$6fT%8lV<~C_J1>_7e<;A-f`Vt~>`j|g_1Ma@sJ_>`SuBHmX2x>lx(~WU zuVG`xZZA*&L(pEm%8fKr${PMoJyjV&VpZ0XZV2@2R@%EiS#_(P7FpD-x}K$t?~jx1 z!4y%|Lav*ufb(x@=_%i+26sKfiz6--MN0;0fo7YKwC`Jf zyEtwrO!Xmue7T^!GBD{*9@iXFtk$;37V@I(QQ4plyg_B%IE@EQq6X`ND|bkuj*>q> zH}euZ9-aAgT(Z$8qw1akv=V?>tQ{2@w%4qj3w3WZl z8Ly@1x~B0J`#;UY6{#z{=+iusK2y=(iOc@02>YY|VyFK}L7e_&8~^4Yg|tME6*(e| z4JlLj^1C1fBr+C;3732{Y8Y!1Y;|>!{4iM&e2*ZH3VokXSD*(HWlSy(Ib9FVGIU>` z;q+jzSwY0Fga`bVOfOW@wf;CK^5rg^GYzib<+pa;*Hcso* zZoq{;XBBn%RtEuI2)_71?qjq=)F2b8A}!QC=Sj~e^FUJm?^ib~N}&k*pK$Md!cFBso`k1Lg2PFpi)Q~u(F;@JezBcFo zVhR3%E)w^2exXEcyva;oX#SKNTY~@)3B!43$oQwJXKEDdymu9kWJdZIKoNl zZlHDyHM0)Y#pBUna7Ky0gsDqI(dmVj6g=TlJ7%1=wy#ePL9IFeoM2b}DQjzs)A?~{ z_`5g2C9$t7W}12?GyaHG^%9)5O{VZ7;)qPqnI=DOWHGdLr~{`aIb{^ZG1WG(wWX&; zXii17s!&tqon$ID@6apR{l{NN5*Z+epV#| zol2?=2~@tXRUs4vV2R({N~a-1C1m{3F>J=2ID5KW8YXOHyg+mZsZr>?zTl5Mj-%C2 z8=cy?_?UJ)O^g{$K3(0cx_()8o9jYVHCPL`=O6f~_g*N)LeJD$g&#DcK6S=X?8DCL zUg;jenx^ei@;l?$l8+(u!pWcFs#)Z-Nn?&uQ91BpO+#%O42Hk-HWHphHwb*0TPzruqk+^UT_=3Ft`uHRYwUU6Kg zjMl1QFaxq{osu1@U~lEv?eNg9c8=})vm?{!+iGWYHJ$GW_qnN1_7OF99NGYSquiL- zY@hQQB8|#6*zLPHJ@kccE!B&ToS>uSm>i3+)PGvQsb9A#hG9w&CzSQirGva`YjQYbN)=Hpy?{ zC!K$Ji}#0S!b`brk=7^DPM=+ozmEzwg0{9+#`-q@FY)(jNniogpvjWv^t7ZzXN78{ zALdO{6-fGKpyBLc54#>SrR$iOYFEEnpj(cBJW7tnsE{e=T*D7xW~Bq%PCT?DfVO6P`BDSLz1$P3aa{wNvI)6pfv z$MiT85fDmFq9u$FS}~?}@6j-`t*>?>7*Qa2xvM&8)c6?!aUG)(pbR_3<_%`9Vjg~~ zt%^qT?BZ<$@aYHAA8XnZqujDtZqXNdh%*HSCQ({c5hi6`^m>fuq|A^Hk{p1{~{Szt!Q zpyKam&=g^Q5~Fa99Yvs1dyddg@8N+xbBON_~XUYJ@Yl=UXvNtd311NN6@Pou=g4+zzH#jP^o z!pPV*@argoHx(bOL?h&K#2cH!%*Dk7w~jWpd+N<&%m58q&;nTEX9&f;$74e2 zfy&KVO;-y1iH_dC(bsy&7bn?$+R>8dNT^G;pzww zAV3)tyVGKV?OnJ3LZbdaCz)-&U*i)UuTOOToJ}H;DySD@E{3visFZRhX34A?8QBdrA$nw4%XzJ}EA7r8U>XALSPiraJMn&Z zmdzEpO|gZwK9Q$>vV|IVYi&aMeL8^U9BtjEG&^UO4qbg8fJ|T0Q^bq%@LOCZSmtM# zBktXw{`1+yoN7R?hsYy6t{+JpWvwQQY>(ET&~6COhzZ91hyScE={)||kqZqyJPqAX zguFiyqWF9NQF3xHw=w-Mcmn?oPf?L^p;|W@Skbm%qo{B$63qt1M)avfv5Tp3hK^T7 zr5~NgcRVVtx-d}DiT<%v-}jqw{;|b}LGmy4IZ6J#JVskXeugkVVQbk1p}j}DDqAO^ z8MjUViMxT&nNbme(8k{t8|i~#nGm)yFcWkLYtX@nl|lHfB}$ue2j2+)^dM2W{*3M? z@CNje4pl)}E*Jz;&4Ai*f=H(Shq1Seiu+Hphl9JjySo!;+}+(Bg1Zy6ad&rjcXxNU z;7%YANPxi8zuBFg+1WY&XWsNV{rX#K9!~tD7)}_lktkSrKYYO zN<_=XyZ!D4jnglWACfuG#TTN{_%ujYayW(-{a^^6J-U;pbF!N_=? z!2Itdw>YUu5e@o41fb~<#lQVXZW3OgqkOKeHje*267v7=M#nO zTK~x~WC=>yAPg*AUq&G!Z&$93WqauUA<5k+j6w@#(l3ZNl`;P9vNZ5n%d@@A&a)l< zv$?n5uU9;Q-ZehwQp~Y}#{x5^bE6O_$S!m8HjMn=y&|k%aqq7F}dTaB|{5WzC<3Tl_o9H4~w_y89Rgz>a4#8n-ox{Zq#Tz zg>Ihug4H6Xx@E%f?@04IGV?9M;Gy4qUQ-~-trZ4tmq|uUBG4;KEm>=z(d$n2nn}aE zkFf4>#SL!rGDm+Ae=Ll)LJXlC;nUKUp>M8G2s7c$X7E3j>OpmK*WQSVQ4bH5pKhR} zF!2)ZY~n6{4ls(i^eMp7(4NYJao4Ereu_Ix)$T)}zksv#C2O7EUgA>2mcT>sm+baN zct{*{C4saW@b>x)YB(V;EDiR)rQxzU<+Nm}B;f&D}EuH8wW7#S$yw}gGuT#F|&CqINu+v1L`I_7YAC+nFm_i&rmBr|PPELo%U zT7)F~#5{5Wz8E%tTgS9-EG~EQP+H(v(F?c5SWP6ak9%y7V;tp;-WP6dTA;FKXHIJM zt%QzV*Ez}N_Nxl(54ivxt&#Z>HkDK4$RqeepXeQ~&JDW>4?}@FcstG)hvPl~`dM1e zx963O{q>(Foqs{XY7ax~ClGOl18vOw+gNtDH??s2Usjr7DYj~$5(~J0!(#f~h4I+ye2SMeKYO@@R02<1-dbDn+-RjoVU?zQFo z>-DX-($iV}ccD)+N2L*Dj3cap5@2%V!P?l)Bq)#oOte8!%=nr!vubbj(Wsv@k=hc9 z16k5d7GO$H05jNj(A8+X!%?+PDk}{g{<&LDTMLI{T=MFuvJ53WNwwVN3xA-pp%D4K zvC3k{gO3t(HMe5@#ATly?b?Pv9=lQs^zf|d>bD+h0+Noz+H+{nNQu#7V9iq3aQOJn zj`j7uu0g88I}lq1k6Vpsh^e*|w@dRVD^sq0KC6z?H&W!BbX^xQSwIF6q9tIG6Z6Jv zUuORBW9>bgSV}5E@D+7#6IW98!hsH()>^90`D>sQUQu9A%|(_d9MidEELj=nj{c&z z>V+rb;Q`v&&z>q3a$`N}VTfyrbz&Ag|C5aV@1iTpLT2$7@*`ywnGPp$f-%V{hAAcAC|iL$9+Kc`J64 zvM!QCu68;KK|zbw1Zv=h%2bav62SYfBrzssTBDyy+dU?!U-YScR!~FKsXQ$nlm_KJ zUr)O-Q4_D+>xkH9+}Zln4vuNg5cZk!f5^6rJ`EL@-S!k_Jzg~kdrqO^)-4D*;K{73 zr@WYBwVH9#lL`w7&*X$ySoV|Mg-L?xmwE&;vnJ${9ivgi*DYGlM2@+~KzPg-v0o~X z9z!IDHkvqjLSjFQv7PoI(CrKr!t~iCrgml~)cPUw=AoKdLw?EoV6YbgdIaeK}U^b5w%{Sisw8{f+{_^ARI;5F@>4 z3ANzK(A3QqBU;{gN3Qi-Sy}99T7LZ(H}nlt;WvB`80>?(;9UO>4E|22{-GE6+mrg+ z-@hvcQq@#IV=~nDG(+DzFt!wSq1&s`s~1MvKwaE5qjY^}A+H zHfz5-7*G@3)pH|owaw6_y_sX*ueo`DCq93_52E6z5`v)G``Bq;1kM(j*m$?_1{fR8 zP0V(jCqp&s3Y71388N0BBtm!d{r(dCn`sNBF#NUa^9m=Ve!1L6xapIot=fFLX12A{< z=3}jwEB%1EKTucmF6D?S>Xge=I`O&EEBCmNi{@Zgt+eqbM-pzzsMcu?-Ja(7i>%BG zLPNwncMds1fTut=6YJT#~@ddTg;0^X}qw+yC@8&w9~^15$eWA z4df}l7ez4#uoZb^e5(=piR6>8-PXR6Q;a!iU14>fRW z;#Z6Jx5fUNT#)+`LLI^wuPJHU_5yW{fv46Xvaf$=H&j}m4bB>(2RBFv9~zY$Z$jlZ zdTAwZZ$P?Sw}$?}P_qTqL;~Z7Tq~SCbxV^|%IP?uGXii>%LQ0E!ytqjQr1i46@__0 zPQKi9N-ds*dWS8r@z}&G?6j2q^99Mj26BkX;6;B8%l<`6e>;wfP3SdvOgV0 zX0ItNR4tg8x9^(_E90XD`QGWh^0|SadMM-bI7J<_zMN}*@X57w*$CTPQe?&Wx924B zbNkU{b=19E5^FNkI;Bu#DKjR~B1~O$l@z(uNy=SX)ox0eb6PC`#&_|o>KGHDbCQR7 zfI8qaVzg=32ZtrOAlLoD?TWWpYqf(d5cdnuq}lQ+78Fp{&J=geiu{MiSSNAh`Vyk~ zPuUPX$$@b~0PsbqF=ETo+K{G!VloqXf0Tn{zR?C2+_go&1ut0VYzlRcP*-}>mc=Ba z-_588Ko0yoEclHc$HS3)E0mP|s@Y|hh2z&&tVRJ`dfF-gxtEiLb%&gVa(Y5@3!}mD zsaeTtHTXN5Qn?XiK^&D_L(KN_F94N=`G7vJ(MI^rd&Zi z!OT)*cW2MG%v|m_`29Z^V+deHk&*T9v`3rFqK#M^mY#Dt)6cn|&)fq3ygxwvc zI&s8l#+>7hX2dzmTT9zytR#-5#Nn2?&lqclN9y6NSMbV&jolPBHWx3^rL~0oX=Jb3+Y$`JX8#OLK?9ktGY*oCOhvX5O?KK& zdg^CEDY+!yb+o`yskISVAbd?ZJjLrW#Oc(1;_1|LVH{njg9s-}u7c1;!_xB^IuV^! zTGL&1uJDEqDWK3-$AzAgFtzp&n@XHEiE1KPF90gGa44y zI_qs>ywl*P)hxPwYX%DqV(9qtP4JWxzcGXIP*l}Y6@lls4P2pG7&12N^iUu~s(iJK`Uqc{HjA@99wa{ws z#@-23l}PlDAF^9T6AQUjNbs$gE6G*s&>vHMuIG_aidjgJS^^ikC9?0MT7F8It=y(E zoNdbO9&us!TY#a*GXiRW-vOmbgaakS;IcT&EZ?~g*hZMxokR%i`Y;R*!xL$T!)bp6VnyM&(dLk>t!0fhahL)k9tmJV z+nW+3Z^(9ha~fFKfD;Ef>|z9cXn#o(d7eN**QEYhI1Z{vRKHt|iMlYF0i$S2k_J1j z*tH!{BdnF~d9jbTF8bp`@4O#X#N%)zhse~?WQH!wRH@h_2+lT%=;e`FGyrI?1+R&$$pAi*UES=2=%U4cmBxQSIa_A|o#*H<=^mz;gxeX=3-K_N`ObO$dV0CH|#Zef_*&jrcU@FhX2_YSsi)J<4F z6nnHZl|=G)?=kB&aQwmp*9$%w<0DD2MxXNj#scKo6|_DwM`c z9c>I06tQD zcLP-*J+O+7t=-jD-MUL7tnMG$2h|G(M_ID>R9H3Vz$hFjZs%>~>2dlhQ2hJ#`z7=M z{UsHz*VVV&kY_4+v$9Y|OQIFR88*x{bJ8Ov#7&>#@q}$y6v$z1E$BnJ!|w>av(H%G zQ@aiG8u7L^bCn!8B-0UtpVi6Y*ZC10XkbJ4lmStY2AtjDy0H0I^`gFilo8@HMCHh9 zX;eqqBe0iuup^T|16|^11vDyp%Z*x3rC*-6bi{<-A^SGFQe#6OmWRDJZV#F7hOPKw zBg%s!huK}kbgakz7{d*$m=!Hp)LkrFOD*ON))!f z!XPkXH=4svBMY)}0v+f>p8c+c$B6mCh9^QEeht4X4`S~h(W7}dY;nT&P{wrS^8sB*eY_!)Dpa&(IATDLqo?ALMP`H!q#N5g{4fT znaHa#a~AdSFTyxalaN_x5d6S_;O9RM3DD)+|52;_9emXO2Yea`Dv$us_X(2HiQp*q zSad!1x%SJdccFzpWP$Adv&t>GU}82b_;A3~KE%;(Mqc!LG9gv-%AXYZ)nM_Z zdrGmTkLuKjV~tTo9m{47J|?t>0;9>|3nJBD2@%lleicU;2t|d-Wss+Zu1uE5T4ZpR zH`>d}S_-KFuwKb0)u-cIYl;246jF#}u&%YY-|JgOQf!t`vl| zDH25bsS9mcZt0Q!G1MQ3BSXn{pGqRp!(qP=_}Av)pAFynOkWok=CAMI4Ury1WW-@! zgoiRjO7}H!?0MnVVcOUgeJYYCj!;uKibkXx#Qs!4oq6n!h0@Oxw^IVMnUap230*9; zF87pp$FKAl6|~8YRNyM6h@19IAo0@G(=oxtab}xiCr5V#KE3r}OD~qw>g{KzDcg37%KiAzGd6nVeEOK{_UE^;i zs#+8c>{!bFR_YsIy=sbaqXZB3e8I3>Gq8+rRC4l)Vol(+AI{gb9@LlN+K~-W>BvVK z5nMs7bP`w*j`f7ezgXG8o7WG2U%kMt;P$Y%iv*ZuP+8MBIHx&Mi6Ln0i9e_OGE*3M zX~b#9vSX;9Csq9Oo!?K>-z6eq-daCUXT~=Wij#WQ2z36)F8iuqg-_Dr=$PMmRyX6Sq@bX?3b_q zH0J(`+|KmR6OMzj3lnJ9>_4mW?HvEXY-`oG6){vW4Z_<9`H-PRL{Jmt5>??tqSnb} z^^~Q9U=l`XI8rF$=H##R@ni7&A^O2FAS84J`;!u3x&s7>J4KRdYWm|Ewo$A-Re(6O`Q>E1vEle0%qE#MSb(7+_@p9svU3fQ_<86M*VwLT>jG#I! z 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

    !ODOJHu7 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

    Q+U29WJg(2Zw3jM1Ha0oexq*7 z4<&61(Q?(XwTjOS#gXwSwtU)U_ZHW#U(b_=NmXFqIava@4r#@Wwu8+pxKJ6l;xHSt zf6U(xfrHJwpVMK5jXkGpD>QdA?LMj9=s8{afjeW;rX{SWkGu{8OM61bdagj&I>b;< z?OdT)BzNLuv3{bH__oB6T0(Fqg$(WI|lK3n;%fH zz)q2i)$Nj$Um8I@H-07)T^H;dJp~y~MtqFwf~xAzoe%k2F(??z0^C1TBsTz={vS2SJ56TYP(#wzv})WBORL&k>nYa0J=H2n3qp^-Fz( zA)IBQyrdTZE!P-{-T{sN9P%O3ptrO|D>#-Nd4y=6B0tRs0a;0?Ibx;H5HEs@A-*5U zG-@B>7+Wm6amF}=Bf@30uw!&y+??H!ii}b}62KPGq;!G#ufWF-#>d(H }cgTwz5 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

    #(Q^{6=WMN@9UkXFe2I{ybT(f41N3F>j_ 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 L+>uvxO`ApzhjgSaE)P5D#Y2QZ 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

    J8TUf_Xb^yE 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 Dxi@or diff --git a/tools/eclipse/config_wizard/lib/jdom-2.0.2.jar b/tools/eclipse/config_wizard/lib/jdom-2.0.2.jar deleted file mode 100644 index d540bad667d1492848de47c07bc3958e98ce0dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295355 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 z 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 z
    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 EKLN5E{r~^~ diff --git a/tools/eclipse/config_wizard/lib/resolver.jar b/tools/eclipse/config_wizard/lib/resolver.jar deleted file mode 100644 index 073d789675a33c80a4674f0dc74df9789007384f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60047 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/app_templates/c/template.xml b/tools/eclipse/config_wizard/resources/app_templates/c/template.xml deleted file mode 100644 index 9b2b51fddb..0000000000 --- a/tools/eclipse/config_wizard/resources/app_templates/c/template.xml +++ /dev/null @@ -1,82 +0,0 @@ - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/lib/code_snippets.xml b/tools/eclipse/config_wizard/resources/gencfg/lib/code_snippets.xml deleted file mode 100644 index 2d0e5959a4..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/lib/code_snippets.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - thread_body - Empty - - - - - thread_body - Checks for Termination - - - - - thread_body - Message Server - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/lib/libcode.ftl b/tools/eclipse/config_wizard/resources/gencfg/lib/libcode.ftl deleted file mode 100644 index 45b94a320e..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/lib/libcode.ftl +++ /dev/null @@ -1,316 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -<#-- - -- Coding style global settings. - --> -[#assign indentation = " " /] -[#assign fields_align = 24 /] -[#assign define_value_align = 36 /] -[#assign comments_align = 48 /] -[#assign boundary = 80 /] - -[#-- - -- This macro generates a brief description in DoxyGen format. - --] -[#macro EmitDoxygenBrief object=[]] - [#if object.brief[0]??] -[@utils.FormatStringAsText " * @brief " - " * " - utils.WithDot(object.brief[0]?cap_first) - boundary /] - [/#if] -[/#macro] - -[#-- - -- This macro generates a detailed description in DoxyGen format. - --] -[#macro EmitDoxygenDetails object=[]] - [#if object.details[0]??] -[@utils.FormatStringAsText " * @details " - " * " - utils.WithDot(object.details[0]?cap_first) - boundary /] - [/#if] -[/#macro] - -[#-- - -- This macro generates a notes list in DoxyGen format. - --] -[#macro EmitDoxygenNotes object=[]] - [#list object.* as note] - [#if note?node_name == "note"] - [@utils.FormatStringAsText " * @note " - " * " - utils.WithDot(note[0]?cap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a pre-requisites list in DoxyGen format. - --] -[#macro EmitDoxygenPrerequisites object=[]] - [#list object.* as pre] - [#if pre?node_name == "pre"] - [@utils.FormatStringAsText " * @pre " - " * " - utils.WithDot(pre[0]?cap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a post-requisites list in DoxyGen format. - --] -[#macro EmitDoxygenPostrequisites object=[]] - [#list object.* as post] - [#if post?node_name == "post"] - [@utils.FormatStringAsText " * @post " - " * " - utils.WithDot(post[0]?cap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a complete Doxygen documentation comment. - --] -[#macro EmitDoxygenDocumentationComment object=[]] -/** - [@code.EmitDoxygenBrief object /] - [@code.EmitDoxygenDetails object /] - [@code.EmitDoxygenPrerequisites object /] - [@code.EmitDoxygenPostrequisites object /] - [@code.EmitDoxygenNotes object /] - */ -[/#macro] - -[#-- - -- This macro generates the parameters description in DoxyGen format. - --] -[#macro EmitDoxygenParams params=[]] - [#list params as param] - [#local name = (param.@name[0]!"no-name")?trim /] - [#local brief = (param.@brief[0]!"")?trim /] - [#local dir = (param.@dir[0]!"boh")?trim?lower_case /] - [#if dir == "in"] -[@utils.FormatStringAsText " * @param[in] " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [#elseif dir == "out"] -[@utils.FormatStringAsText " * @param[out] " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [#elseif dir == "both"] -[@utils.FormatStringAsText " * @param[in,out] " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [#elseif dir == "boh"] -[@utils.FormatStringAsText " * @param " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a return description followed by a retval list - -- in DoxyGen format. - --] -[#macro EmitDoxygenReturn return=[]] - [#if return[0]?? && ((return[0].@type[0]!"void")?trim != "void")] - [#local brief = (return[0].@brief[0]!"")?trim /] - [#if brief != ""] -[@utils.FormatStringAsText " * @return " - " * " - utils.WithDot(brief?cap_first) - boundary /] - [/#if] - [#list return[0].value as value] - [#local label = (value.@name[0]!"no-val")?trim /] - [#local brief = (value.@brief[0]!"")?trim /] -[@utils.FormatStringAsText " * @retval " - " * " - utils.WithDot(label + " " + brief?uncap_first) - boundary /] - [/#list] - [/#if] -[/#macro] - -[#-- - -- This macro generates the inner function code (if present). - --] -[#macro EmitCode code=[]] - [#if function.code[0]?? && (function.code[0]?trim != "")] -${indentation}${function.code[0]?trim} - [/#if] -[/#macro] - -[#-- - -- Returns true if the module exports some functions. - --] -[#function HasPublicFunctions module=[]] - [#local flag = false /] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "public"] - [#local flag = true /] - [/#if] - [/#list] - [#return flag /] -[/#function] - -[#-- - -- Returns true if the module has static functions. - --] -[#function HasPrivateFunctions module=[]] - [#local flag = false /] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "private"] - [#local flag = true /] - [/#if] - [/#list] - [#return flag /] -[/#function] - -[#-- - -- This macro generates a function prototype from an XML "function" - -- node passed as parameter. - -- @note Does not generate the final EOL. - --] -[#macro GeneratePrototype function={}] - [#if function.return?? && function.return[0]??] - [#local rettype = (function.return[0].@type[0]!"void")?trim /] - [#else] - [#local rettype = "void" /] - [/#if] - [#local name = (function.@name[0]!"no-name")?trim /] - [#local visibility = (function.@visibility[0]!"private")?trim /] - [#if function.param?? && function.param[0]??] - [#-- If the function has parameters then generates the parameters list --] - [#local l1 = rettype + " " + name + "(" /] - [#if visibility == "private"] - [#local l1 = "static " + l1 /] - [/#if] - [#local ln = ""?right_pad(l1?length) /] - [#list function.param as param] - [#local type = (param.@type[0]!"no-type")?trim /] - [#if type?contains("$")] - [#local pstring = type?replace("$", (param.@name[0]!"no-name")?trim) /] - [#else] - [#local pstring = type + " " + (param.@name[0]!"no-name")?trim /] - [/#if] - [#local dir = (param.@dir[0]!"boh")?trim?lower_case /] - [#if dir == "in"] - [#local pstring = "const " + pstring /] - [/#if] - [#if param_index == 0] - [#local line = l1 + pstring /] - [#else] - [#if (line + ", " + pstring + " ")?length > boundary] -${line + ","} - [#local line = ln + pstring /] - [#else] - [#local line = line + ", " + pstring /] - [/#if] - [/#if] - [/#list] -${line + ")"}[#rt] - [#else] -${rettype + " " + name}(void)[#rt] - [/#if] -[/#macro] - -[#-- - -- This macro generates a function (and its Doxygen documentation) - -- from an XML "function" node passed as parameter. - --] -[#macro GenerateFunction function={}] -/** -[@EmitDoxygenBrief function.@brief /] -[@EmitDoxygenDetails function.details /] -[@EmitDoxygenParams function.param /] -[@EmitDoxygenReturn function.return /] - * - * @note --Implementer notes here (or remove the tag)-- - * @bug --Known problems please here (or remove the tag)-- - * @todo --Implement this function (then remove the tag)-- - */ -[@GeneratePrototype function /] { - [#if function.code[0]??] - [#-- Makes sure to undef the do_code macro --] - [#assign inline = "[#ftl][#macro do_code function][/#macro]"?interpret /] -[@inline /] - [#-- Interprets the code within the code element --] - [#assign inline = function.code[0]?interpret /] -[@inline /] -[@do_code function /] - [#else] - -${indentation}/* ${function.@name[0]!"no-name"}() Implementation here! */ - [/#if] -} -[/#macro] - -[#-- - -- Generates the implementations for the private functions in the specified - -- module. - --] -[#macro GeneratePrivateFunctionsImplementations module] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "private"] -[@code.GenerateFunction function /] - - [/#if] - [/#list] -[/#macro] - -[#-- - -- Generates the prototypes of the public functions in the specified - -- module. - --] -[#macro GeneratePublicFunctionsPrototypes indentation module] - [#list module.function as function] - [#if (function.@visibility[0]!"private")?trim == "public"] -${indentation}[@code.GeneratePrototype function /]; - [/#if] - [/#list] -[/#macro] - -[#-- - -- Generates the implementations for the public functions in the specified - -- module. - --] -[#macro GeneratePublicFunctionsImplementations module] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "public"] -[@code.GenerateFunction function /] - - [/#if] - [/#list] -[/#macro] diff --git a/tools/eclipse/config_wizard/resources/gencfg/lib/liblicense.ftl b/tools/eclipse/config_wizard/resources/gencfg/lib/liblicense.ftl deleted file mode 100644 index 18581ee298..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/lib/liblicense.ftl +++ /dev/null @@ -1,58 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Emits the ChibiOS/RT standard license exception text. - -- The license exception text is indented by 4 spaces. - --] -[#macro EmitLicenseExceptionAsText] - - --- - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes ChibiOS/RT, without being obliged to provide - the source code for any proprietary components. See the file exception.txt - for full details of how and when the exception can be applied. -[/#macro] - -[#-- - -- Emits the ChibiOS/RT standard license text. - -- The license text is indented by 4 spaces. - --] -[#macro EmitLicenseAsText] - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -[/#macro] diff --git a/tools/eclipse/config_wizard/resources/gencfg/lib/libsnippets.ftl b/tools/eclipse/config_wizard/resources/gencfg/lib/libsnippets.ftl deleted file mode 100644 index a0680af045..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/lib/libsnippets.ftl +++ /dev/null @@ -1,33 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Find and return a code template from the templates archive. - --] -[#function GetThreadCode name] - [#list doc_snippets.code.snippets.snippet as snippet] - [#if (snippet.type[0] == "thread_body") && - ((snippet.name[0]!"")?trim?lower_case == name?trim?lower_case)] - [#return snippet.text[0]!"" /] - [/#if] - [/#list] - [#return "/* Thread style not found: " + name + " */" /] -[/#function] diff --git a/tools/eclipse/config_wizard/resources/gencfg/lib/libstm32f4xx.ftl b/tools/eclipse/config_wizard/resources/gencfg/lib/libstm32f4xx.ftl deleted file mode 100644 index 81b8f987cf..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/lib/libstm32f4xx.ftl +++ /dev/null @@ -1,144 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Emits the STM32F4xx ADC driver constant configuration structures. - --] -[#macro EmitADCConfig config] - [#local cfg_name = config.name[0]?string /] - [@code.EmitDoxygenDocumentationComment config /] -const ADCConfig ${cfg_name} = {0}; - - [#list config.groups.group as group] - [#local grpcfg_name = group.name[0]?string /] - [@code.EmitDoxygenDocumentationComment group /] -const ADCGroupConfig ${grpcfg_name} = { - /* Circular conversion flag.*/ - ${group.circular[0]?string?upper_case}, - /* Number of channels sampled in the conversion group.*/ - ${group.channels_sequence.channel?size}, - /* End of conversion callback or NULL.*/ - [#if group.conv_callback[0]?string?trim == ""] - NULL, - [#else] - ${group.conv_callback[0]?string?trim}, - [/#if] - /* Error callback or NULL.*/ - [#if group.error_callback[0]?string?trim == ""] - NULL, - [#else] - ${group.error_callback[0]?string?trim}, - [/#if] - /* CR1 register initialization value.*/ - [#local resolution = group.resolution[0]?word_list[0]?number /] - [#local cr1 = "ADC_CR1_RESOLUTION_N(" + resolution?string + ")" /] - [#local disc = group.discontinuous[0]?word_list[0]?number /] - [#if disc > 0] - [#local cr1 = cr1 + " | ADC_CR1_DISCEN" /] - [#local cr1 = cr1 + " | ADC_CR1_DISCNUM_N(" + (disc - 1)?string + ")" /] - [/#if] - ${cr1}, - /* CR2 register initialization value.*/ - [#local exten = group.trigger_mode[0]?word_list[0]?number /] - [#local cr2 = "ADC_CR1_EXTEN_N(" + exten?string + ")" /] - [#local extsel = group.trigger_source[0]?word_list[0]?number /] - [#local cr2 = cr2 + " | ADC_CR1_EXSEL_N(" + extsel?string + ")" /] - [#if group.alignment[0]?word_list[0]?number != 0] - [#local cr2 = cr2 + " | ADC_CR2_ALIGN" /] - [/#if] - ${cr2}, - /* Channels sample time settings.*/ - [#local smpr1 = "" /] - [#local smpr2 = "" /] - [#list group.sample_time.* as input] - [#local sinput = input?node_name] - [#if input_index < 9] - [#local smpr2 = smpr2 + "ADC_SMPR2_SMP_" + input?node_name + - "(" + input?string + ") | " /] - [#elseif input_index == 9] - [#local smpr2 = smpr2 + "ADC_SMPR2_SMP_" + input?node_name + - "(" + input?string + ")," /] - [#elseif input_index < 18] - [#local smpr1 = smpr1 + "ADC_SMPR1_SMP_" + input?node_name + - "(" + input?string + ") | " /] - [#else] - [#local smpr1 = smpr1 + "ADC_SMPR1_SMP_" + input?node_name + - "(" + input?string + ")," /] - [/#if] - [/#list] - [@utils.FormatStringAsText " " " " smpr1 80 /] - [@utils.FormatStringAsText " " " " smpr2 80 /] - /* Channels sequence.*/ - [#local sqr1 = "ADC_SQR1_NUM_CH(" + group.channels_sequence?size + ")" /] - [#local sqr2 = "" /] - [#local sqr3 = "" /] - [#list group.channels_sequence.channel as channel] - [#if channel_index <= 5] - [#local sqr3 = sqr3 + "ADC_SQR3_SQ" + (channel_index + 1) + - "_N(" + channel + ")" /] - [#if channel_has_next && channel_index < 5] - [#local sqr3 = sqr3 + " | " /] - [/#if] - [#elseif channel_index <= 11] - [#local sqr2 = sqr2 + "ADC_SQR2_SQ" + (channel_index + 1) + - "_N(" + channel + ")" /] - [#if channel_has_next && channel_index < 11] - [#local sqr2 = sqr2 + " | " /] - [/#if] - [#else] - [#local sqr1 = sqr1 + " | ADC_SQR2_SQ" + (channel_index + 1) + - "_N(" + channel + ")" /] - [/#if] - [/#list] - [#-- SQR2 could be empty.--] - [#if sqr2 == ""] - [#local sqr2 = "0" /] - [/#if] - [#local sqr1 = sqr1 + "," /] - [#local sqr2 = sqr2 + "," /] - [@utils.FormatStringAsText " " " " sqr1 80 /] - [@utils.FormatStringAsText " " " " sqr2 80 /] - [@utils.FormatStringAsText " " " " sqr3 80 /] -}; - [/#list] -[/#macro] - -[#-- - -- Emits the STM32F4xx ADC driver configuration external declarations. - --] -[#macro EmitADCConfigExtern config] - [#local cfg_name = config.name[0]?string /] - [#list config.groups.group as group] - [#local grpcfg_name = group.name[0]?string /] - [#-- Only emits the comment if there is at least a callback defined.--] - /* ADC configuration "${cfg_name}".*/ - extern const ADCConfig ${cfg_name}; - /* ADC conversion group "${grpcfg_name}".*/ - extern const ADCGroupConfig ${grpcfg_name}; - [#if group.conv_callback[0]?string?trim != ""] - void ${group.conv_callback[0]?string?trim}(ADCDriver *, adcsample_t *, size_t); - [/#if] - [#if group.error_callback[0]?string?trim != ""] - void ${group.error_callback[0]?string?trim}(ADCDriver *, adcerror_t); - [/#if] - - [/#list] -[/#macro] diff --git a/tools/eclipse/config_wizard/resources/gencfg/lib/libutils.ftl b/tools/eclipse/config_wizard/resources/gencfg/lib/libutils.ftl deleted file mode 100644 index 03b0622a3b..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/lib/libutils.ftl +++ /dev/null @@ -1,109 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Returns the trimmed text "s" making sure it is terminated by a dot. - -- The empty string is always returned as an empty string, the dot is not - -- added. - --] -[#function WithDot s] - [#local s = s?trim /] - [#if s == ""] - [#return s /] - [/#if] - [#if s?ends_with(".")] - [#return s /] - [/#if] - [#return s + "." /] -[/#function] - -[#-- - -- Returns the trimmed text "s" making sure it is not terminated by a dot. - --] -[#function WithoutDot s] - [#local s = s?trim /] - [#if s?ends_with(".")] - [#return s?substring(0, s?length - 2) /] - [/#if] - [#return s /] -[/#function] - -[#-- - -- Returns the trimmed text "s" making sure it is terminated by a dot if the - -- text is composed of multiple phrases, if the text is composed of a single - -- phrase then makes sure it is *not* terminated by a dot. - -- A phrase is recognized by the pattern ". " into the text. - -- The empty string is always returned as an empty string, the dot is never - -- added. - --] -[#function IntelligentDot s] - [#local s = s?trim /] - [#if s?contains(". ")] - [#return WithDot(s) /] - [/#if] - [#return WithoutDot(s) /] -[/#function] - -[#-- - -- Formats a text string in a sequence of strings no longer than "len" (first - -- line) or "lenn" (subsequent lines). - -- White spaces are normalized between words, sequences of white spaces become - -- a single space. - --] -[#function StringToText len1 lenn s] - [#local words=s?word_list /] - [#local line="" /] - [#local lines=[] /] - [#list words as word] - [#if lines?size == 0] - [#local len = len1 /] - [#else] - [#local len = lenn /] - [/#if] - [#if (line?length + word?length + 1 > len)] - [#local lines = lines + [line?trim] /] - [#local line = word + " " /] - [#else] - [#local line = line + word + " " /] - [/#if] - [/#list] - [#if line != ""] - [#local lines = lines + [line?trim] /] - [/#if] - [#return lines /] -[/#function] - -[#-- - -- Emits a string "s" as a formatted text, the first line is prefixed by the - -- "p1" parameter, subsequent lines are prefixed by the "pn" paramenter. - -- Emitted lines are no longer than the "len" parameter. - -- White spaces are normalized between words. - --] -[#macro FormatStringAsText p1 pn s len] - [#local lines = StringToText(len - p1?length, len - pn?length, s) /] - [#list lines as line] - [#if line_index == 0] -${p1}${line} - [#else] -${pn}${line} - [/#if] - [/#list] -[/#macro] diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.c.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.c.ftl deleted file mode 100644 index 22510cb2b4..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.c.ftl +++ /dev/null @@ -1,101 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.c" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -[#if doc1.board.board_functions.__early_init[0]??] - ${doc1.board.board_functions.__early_init[0]} -[/#if] -} - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.mmc_lld_is_card_inserted[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_write_protected[0]??] -${doc1.board.board_functions.mmc_lld_is_write_protected[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.h.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.h.ftl deleted file mode 100644 index 30fda47dfb..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.h.ftl +++ /dev/null @@ -1,320 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.h" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for ${doc1.board.board_name[0]} board. - */ - -/* - * Board identifier. - */ -#define BOARD_${doc1.board.board_id[0]} -#define BOARD_NAME "${doc1.board.board_name[0]}" - -[#if doc1.board.ethernet_phy[0]??] -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID ${doc1.board.ethernet_phy.identifier[0]} -[#if doc1.board.ethernet_phy.bus_type[0]?string == "RMII"] -#define BOARD_PHY_RMII -[/#if] -[/#if] - -/* - * Board oscillators-related settings. -[#if doc1.board.clocks.@LSEFrequency[0]?number == 0] - * NOTE: LSE not fitted. -[/#if] -[#if doc1.board.clocks.@HSEFrequency[0]?number == 0] - * NOTE: HSE not fitted. -[/#if] - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK ${doc1.board.clocks.@LSEFrequency[0]} -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK ${doc1.board.clocks.@HSEFrequency[0]} -#endif - -[#if doc1.board.clocks.@HSEBypass[0]?string == "true"] -#define STM32_HSE_BYPASS -[/#if] - -/* - * MCU type as defined in the ST header file stm32f0xx.h. - */ -#define STM32F0XX - -/* - * IO pins assignments. - */ -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] -#define ${(port_name + "_" + name)?right_pad(27, " ")} ${pin_index?string} - [/#list] - -[/#list] -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_10M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_40M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] -/* - * ${port_name} setup: - * - [#-- Generating pin descriptions inside the comment.--] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#assign type = pin.@Type[0] /] - [#assign resistor = pin.@Resistor[0] /] - [#assign speed = pin.@Speed[0] /] - [#assign alternate = pin.@Alternate[0] /] - [#if mode == "Input"] - [#assign desc = mode + " " + resistor /] - [#elseif mode == "Output"] - [#assign desc = mode + " " + type + " " + speed /] - [#elseif mode == "Alternate"] - [#assign desc = mode + " " + alternate /] - [#else] - [#assign desc = "Analog" /] - [/#if] - * P${(port?node_name[4..] + pin_index?string)?right_pad(3, " ")} - ${name?right_pad(26, " ")}(${desc?lower_case}). - [/#list] - */ - [#-- - -- Generating MODER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#if mode == "Input"] - [#assign out = "PIN_MODE_INPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Output"] - [#assign out = "PIN_MODE_OUTPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Alternate"] - [#assign out = "PIN_MODE_ALTERNATE(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_MODE_ANALOG(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_MODER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating OTYPER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign type = pin.@Type[0] /] - [#if type == "PushPull"] - [#assign out = "PIN_OTYPE_PUSHPULL(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OTYPE_OPENDRAIN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OTYPER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating SPEEDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign speed = pin.@Speed[0] /] - [#if speed == "Minimum"] - [#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /] - [#elseif speed == "Low"] - [#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /] - [#elseif speed == "High"] - [#assign out = "PIN_OSPEED_10M(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OSPEED_40M(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OSPEEDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating PUPDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign resistor = pin.@Resistor[0] /] - [#if resistor == "Floating"] - [#assign out = "PIN_PUPDR_FLOATING(" + port_name + "_" + name + ")" /] - [#elseif resistor == "PullUp"] - [#assign out = "PIN_PUPDR_PULLUP(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_PUPDR_PULLDOWN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_PUPDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating ODR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign level = pin.@Level[0] /] - [#if level == "Low"] - [#assign out = "PIN_ODR_LOW(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_ODR_HIGH(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_ODR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating AFRx registers values. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign alternate = pin.@Alternate[0]?trim /] - [#assign out = "PIN_AFIO_AF(" + port_name + "_" + name + ", " + alternate + ")" /] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_AFRL (" + out /] - [#elseif pin_index == 8] - [#assign line = "#define VAL_" + port_name + "_AFRH (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if (pin_index == 7) || (pin_index == 15)] -${line + ")"} - [#else] -${(line + " |")?right_pad(76, " ") + "\\"} - [/#if] - [/#list] - -[/#list] - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.mk.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.mk.ftl deleted file mode 100644 index c88471ac30..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f0xx/templates/board.mk.ftl +++ /dev/null @@ -1,28 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[@pp.changeOutputFile name="board.mk" /] -# List of all the board related files. -BOARDSRC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]}/board.c - -# Required include directories -BOARDINC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]} diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl deleted file mode 100644 index f38fd106a4..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl +++ /dev/null @@ -1,139 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.c" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -[#if doc1.board.board_functions.__early_init[0]??] - ${doc1.board.board_functions.__early_init[0]} -[/#if] -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { -[#if doc1.board.board_functions.sdc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.sdc_lld_is_card_inserted[0]} -[#else] - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief SDC card write protection detection. - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { -[#if doc1.board.board_functions.sdc_lld_is_write_protected[0]??] -${doc1.board.board_functions.sdc_lld_is_write_protected[0]} -[#else] - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.mmc_lld_is_card_inserted[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_write_protected[0]??] -${doc1.board.board_functions.mmc_lld_is_write_protected[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl deleted file mode 100644 index c24c0a355c..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl +++ /dev/null @@ -1,327 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.h" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for ${doc1.board.board_name[0]} board. - */ - -/* - * Board identifier. - */ -#define BOARD_${doc1.board.board_id[0]} -#define BOARD_NAME "${doc1.board.board_name[0]}" - -[#if doc1.board.ethernet_phy[0]??] -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID ${doc1.board.ethernet_phy.identifier[0]} -[#if doc1.board.ethernet_phy.bus_type[0]?string == "RMII"] -#define BOARD_PHY_RMII -[/#if] -[/#if] - -/* - * Board oscillators-related settings. -[#if doc1.board.clocks.@LSEFrequency[0]?number == 0] - * NOTE: LSE not fitted. -[/#if] -[#if doc1.board.clocks.@HSEFrequency[0]?number == 0] - * NOTE: HSE not fitted. -[/#if] - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK ${doc1.board.clocks.@LSEFrequency[0]} -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK ${doc1.board.clocks.@HSEFrequency[0]} -#endif - -[#if doc1.board.clocks.@HSEBypass[0]?string == "true"] -#define STM32_HSE_BYPASS -[/#if] - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD ${doc1.board.clocks.@VDD[0]} - -/* - * MCU type as defined in the ST header file stm32f4xx.h. - */ -#define STM32F4XX - -/* - * IO pins assignments. - */ -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] -#define ${(port_name + "_" + name)?right_pad(27, " ")} ${pin_index?string} - [/#list] - -[/#list] -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] -/* - * ${port_name} setup: - * - [#-- Generating pin descriptions inside the comment.--] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#assign type = pin.@Type[0] /] - [#assign resistor = pin.@Resistor[0] /] - [#assign speed = pin.@Speed[0] /] - [#assign alternate = pin.@Alternate[0] /] - [#if mode == "Input"] - [#assign desc = mode + " " + resistor /] - [#elseif mode == "Output"] - [#assign desc = mode + " " + type + " " + speed /] - [#elseif mode == "Alternate"] - [#assign desc = mode + " " + alternate /] - [#else] - [#assign desc = "Analog" /] - [/#if] - * P${(port?node_name[4..] + pin_index?string)?right_pad(3, " ")} - ${name?right_pad(26, " ")}(${desc?lower_case}). - [/#list] - */ - [#-- - -- Generating MODER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#if mode == "Input"] - [#assign out = "PIN_MODE_INPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Output"] - [#assign out = "PIN_MODE_OUTPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Alternate"] - [#assign out = "PIN_MODE_ALTERNATE(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_MODE_ANALOG(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_MODER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating OTYPER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign type = pin.@Type[0] /] - [#if type == "PushPull"] - [#assign out = "PIN_OTYPE_PUSHPULL(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OTYPE_OPENDRAIN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OTYPER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating SPEEDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign speed = pin.@Speed[0] /] - [#if speed == "Minimum"] - [#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /] - [#elseif speed == "Low"] - [#assign out = "PIN_OSPEED_25M(" + port_name + "_" + name + ")" /] - [#elseif speed == "High"] - [#assign out = "PIN_OSPEED_50M(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OSPEED_100M(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OSPEEDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating PUPDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign resistor = pin.@Resistor[0] /] - [#if resistor == "Floating"] - [#assign out = "PIN_PUPDR_FLOATING(" + port_name + "_" + name + ")" /] - [#elseif resistor == "PullUp"] - [#assign out = "PIN_PUPDR_PULLUP(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_PUPDR_PULLDOWN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_PUPDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating ODR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign level = pin.@Level[0] /] - [#if level == "Low"] - [#assign out = "PIN_ODR_LOW(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_ODR_HIGH(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_ODR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating AFRx registers values. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign alternate = pin.@Alternate[0]?trim /] - [#assign out = "PIN_AFIO_AF(" + port_name + "_" + name + ", " + alternate + ")" /] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_AFRL (" + out /] - [#elseif pin_index == 8] - [#assign line = "#define VAL_" + port_name + "_AFRH (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if (pin_index == 7) || (pin_index == 15)] -${line + ")"} - [#else] -${(line + " |")?right_pad(76, " ") + "\\"} - [/#if] - [/#list] - -[/#list] - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl deleted file mode 100644 index c88471ac30..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl +++ /dev/null @@ -1,28 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[@pp.changeOutputFile name="board.mk" /] -# List of all the board related files. -BOARDSRC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]}/board.c - -# Required include directories -BOARDINC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]} diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.c.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.c.ftl deleted file mode 100644 index b46be86a29..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.c.ftl +++ /dev/null @@ -1,133 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.c" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -[#if doc1.board.board_functions.__early_init[0]??] - ${doc1.board.board_functions.__early_init[0]} -[/#if] -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { -[#if doc1.board.board_functions.sdc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.sdc_lld_is_card_inserted[0]} -[#else] - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief SDC card write protection detection. - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { -[#if doc1.board.board_functions.sdc_lld_is_write_protected[0]??] -${doc1.board.board_functions.sdc_lld_is_write_protected[0]} -[#else] - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.mmc_lld_is_card_inserted[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_write_protected[0]??] -${doc1.board.board_functions.mmc_lld_is_write_protected[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.h.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.h.ftl deleted file mode 100644 index 76db7eb27c..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.h.ftl +++ /dev/null @@ -1,321 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.h" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for ${doc1.board.board_name[0]} board. - */ - -/* - * Board identifier. - */ -#define BOARD_${doc1.board.board_id[0]} -#define BOARD_NAME "${doc1.board.board_name[0]}" - -[#if doc1.board.ethernet_phy[0]??] -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID ${doc1.board.ethernet_phy.identifier[0]} -[#if doc1.board.ethernet_phy.bus_type[0]?string == "RMII"] -#define BOARD_PHY_RMII -[/#if] -[/#if] - -/* - * Board oscillators-related settings. -[#if doc1.board.clocks.@LSEFrequency[0]?number == 0] - * NOTE: LSE not fitted. -[/#if] -[#if doc1.board.clocks.@HSEFrequency[0]?number == 0] - * NOTE: HSE not fitted. -[/#if] - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK ${doc1.board.clocks.@LSEFrequency[0]} -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK ${doc1.board.clocks.@HSEFrequency[0]} -#endif - -[#if doc1.board.clocks.@HSEBypass[0]?string == "true"] -#define STM32_HSE_BYPASS -[/#if] - -/* - * MCU type as defined in the ST header file stm32l1xx.h. - */ -#define STM32L1XX_MD - -/* - * IO pins assignments. - */ -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] -#define ${(port_name + "_" + name)?right_pad(27, " ")} ${pin_index?string} - [/#list] - -[/#list] -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_400K(n) (0U << ((n) * 2)) -#define PIN_OSPEED_2M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_10M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_40M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] -/* - * ${port_name} setup: - * - [#-- Generating pin descriptions inside the comment.--] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#assign type = pin.@Type[0] /] - [#assign resistor = pin.@Resistor[0] /] - [#assign speed = pin.@Speed[0] /] - [#assign alternate = pin.@Alternate[0] /] - [#if mode == "Input"] - [#assign desc = mode + " " + resistor /] - [#elseif mode == "Output"] - [#assign desc = mode + " " + type + " " + speed /] - [#elseif mode == "Alternate"] - [#assign desc = mode + " " + alternate /] - [#else] - [#assign desc = "Analog" /] - [/#if] - * P${(port?node_name[4..] + pin_index?string)?right_pad(3, " ")} - ${name?right_pad(26, " ")}(${desc?lower_case}). - [/#list] - */ - [#-- - -- Generating MODER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#if mode == "Input"] - [#assign out = "PIN_MODE_INPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Output"] - [#assign out = "PIN_MODE_OUTPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Alternate"] - [#assign out = "PIN_MODE_ALTERNATE(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_MODE_ANALOG(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_MODER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating OTYPER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign type = pin.@Type[0] /] - [#if type == "PushPull"] - [#assign out = "PIN_OTYPE_PUSHPULL(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OTYPE_OPENDRAIN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OTYPER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating SPEEDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign speed = pin.@Speed[0] /] - [#if speed == "Minimum"] - [#assign out = "PIN_OSPEED_400K(" + port_name + "_" + name + ")" /] - [#elseif speed == "Low"] - [#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /] - [#elseif speed == "High"] - [#assign out = "PIN_OSPEED_10M(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OSPEED_40M(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OSPEEDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating PUPDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign resistor = pin.@Resistor[0] /] - [#if resistor == "Floating"] - [#assign out = "PIN_PUPDR_FLOATING(" + port_name + "_" + name + ")" /] - [#elseif resistor == "PullUp"] - [#assign out = "PIN_PUPDR_PULLUP(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_PUPDR_PULLDOWN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_PUPDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating ODR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign level = pin.@Level[0] /] - [#if level == "Low"] - [#assign out = "PIN_ODR_LOW(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_ODR_HIGH(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_ODR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating AFRx registers values. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign alternate = pin.@Alternate[0]?trim /] - [#assign out = "PIN_AFIO_AF(" + port_name + "_" + name + ", " + alternate + ")" /] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_AFRL (" + out /] - [#elseif pin_index == 8] - [#assign line = "#define VAL_" + port_name + "_AFRH (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if (pin_index == 7) || (pin_index == 15)] -${line + ")"} - [#else] -${(line + " |")?right_pad(76, " ") + "\\"} - [/#if] - [/#list] - -[/#list] - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.mk.ftl b/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.mk.ftl deleted file mode 100644 index c88471ac30..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/boards/stm32l1xx/templates/board.mk.ftl +++ /dev/null @@ -1,28 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[@pp.changeOutputFile name="board.mk" /] -# List of all the board related files. -BOARDSRC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]}/board.c - -# Required include directories -BOARDINC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]} diff --git a/tools/eclipse/config_wizard/resources/gencfg/processors/processors.xml b/tools/eclipse/config_wizard/resources/gencfg/processors/processors.xml deleted file mode 100644 index 30a70c069e..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/processors/processors.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx Board Configuration - resources/gencfg/processors/boards/stm32f0xx/templates - resources/gencfg/xml/stm32f0board.xml - board - - - STM32F4xx Board Configuration - resources/gencfg/processors/boards/stm32f4xx/templates - resources/gencfg/xml/stm32f4board.xml - board - - - STM32L1xx Board Configuration - resources/gencfg/processors/boards/stm32l1xx/templates - resources/gencfg/xml/stm32l1board.xml - board - - - STM32F0xx Build Environment Configuration - resources/gencfg/processors/builds/stm32f0xx/templates - resources/gencfg/xml/stm32f0build.xml - build - - - STM32F4xx Build Environment Configuration - resources/gencfg/processors/builds/stm32f4xx/templates - resources/gencfg/xml/stm32f4build.xml - build - - - STM32L1xx Build Environment Configuration - resources/gencfg/processors/builds/stm32l1xx/templates - resources/gencfg/xml/stm32l1build.xml - build - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/abstract_board.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/boards/abstract_board.xsd deleted file mode 100644 index a1c696339d..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/abstract_board.xsd +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f0xx_board.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f0xx_board.xsd deleted file mode 100644 index 6fe5206990..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f0xx_board.xsd +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f4xx_board.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f4xx_board.xsd deleted file mode 100644 index 0728807115..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32f4xx_board.xsd +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32l1xx_board.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32l1xx_board.xsd deleted file mode 100644 index 448a51a9c8..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/boards/stm32l1xx_board.xsd +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/common/code_snippets.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/common/code_snippets.xsd deleted file mode 100644 index ad0bad11a6..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/common/code_snippets.xsd +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/common/config_settings.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/common/config_settings.xsd deleted file mode 100644 index 45d2281427..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/common/config_settings.xsd +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - Templates resources associated to the configuration. - - - - - - - - - - - - Output directory relative to the configuration file. - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/common/doc.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/common/doc.xsd deleted file mode 100644 index e5be361d5e..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/common/doc.xsd +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - >Generic item with optional name and brief - description - - - - - - Name of the object. - - - - - - - - - - - - - - - - >Something that can have a detailed description - attached - - - - - - - - - Brief description of the object. - - - - - - - - - - - - - - Object documentation as text, does not preserve - formatting. - - - - - - - - - - - - Object pre-requisites as text, does not preserve - formatting. - - - - - - - - - - - - Object post-requisites as text, does not preserve - formatting. - - - - - - - - - - - - Object note as text, does not preserve formatting. - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd b/tools/eclipse/config_wizard/resources/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd deleted file mode 100644 index c3ac594874..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Object representing an STM32 pin for the GPIOv2 - peripheral. - - - - - Pin identifier, used to generate a #define with the - pin name. - - - - - - - - - - - - - - - - Pin mode, as defined for MODER register. - - - - - - - - - - - - - - Logic level for the ODR register. - - - - - - - - - - - - Pin speed as defined in SPEEDR register. - - - - - - - - - - - - - - - Pin type as defined in TYPER register. - - - - - - - - - - - - - Pin pull-up/down resistor as defined in PUDR register. - - - - - - - - - - - - - - Pin alternate function number, only valid if - "Alternate" is selected - in the Mode attribute. - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/xml/stm32f0board.xml b/tools/eclipse/config_wizard/resources/gencfg/xml/stm32f0board.xml deleted file mode 100644 index 843dfe9258..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/xml/stm32f0board.xml +++ /dev/null @@ -1,669 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32f0xx/templates - . - - -----human readable board name----- - BOARD_IDENTIFIER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/xml/stm32f4board.xml b/tools/eclipse/config_wizard/resources/gencfg/xml/stm32f4board.xml deleted file mode 100644 index 66a09d0d60..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/xml/stm32f4board.xml +++ /dev/null @@ -1,1194 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32f4xx/templates - . - - -----human readable board name----- - BOARD_IDENTIFIER - - - MII_KS8721_ID - RMII - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/resources/gencfg/xml/stm32l1board.xml b/tools/eclipse/config_wizard/resources/gencfg/xml/stm32l1board.xml deleted file mode 100644 index 00e5b53197..0000000000 --- a/tools/eclipse/config_wizard/resources/gencfg/xml/stm32l1board.xml +++ /dev/null @@ -1,799 +0,0 @@ - - - - - resources/gencfg/processors/boards/stm32l1xx/templates - . - - -----human readable board name----- - BOARD_IDENTIFIER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/config_wizard/src/config_wizard/Activator.java b/tools/eclipse/config_wizard/src/config_wizard/Activator.java deleted file mode 100644 index 1f62c4f625..0000000000 --- a/tools/eclipse/config_wizard/src/config_wizard/Activator.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package config_wizard; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class Activator extends AbstractUIPlugin { - - // The plug-in ID - public static final String PLUGIN_ID = "org.chibios.tools.eclipse.config"; //$NON-NLS-1$ - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext - * ) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext - * ) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - - /** - * Returns an image descriptor for the image file at the given plug-in - * relative path - * - * @param path - * the path - * @return the image descriptor - */ - public static ImageDescriptor getImageDescriptor(String path) { - return imageDescriptorFromPlugin(PLUGIN_ID, path); - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java deleted file mode 100644 index 0d7e7e2920..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -package org.chibios.tools.eclipse.config.handlers; - -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.handlers.HandlerUtil; -import org.eclipse.jface.dialogs.MessageDialog; - -/** - * Our sample handler extends AbstractHandler, an IHandler base class. - * @see org.eclipse.core.commands.IHandler - * @see org.eclipse.core.commands.AbstractHandler - */ -public class CheckDescription extends AbstractHandler { - - /** - * The constructor. - */ - public CheckDescription() { - } - - /** - * the command has been executed, so extract extract the needed information - * from the application context. - */ - public Object execute(ExecutionEvent event) throws ExecutionException { - IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); - MessageDialog.openInformation( - window.getShell(), - "ChibiOS-RT_Configuration_Support", - "Hello, Eclipse world"); - return null; - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java deleted file mode 100644 index aad5adfceb..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.handlers; - -import java.io.File; -import java.io.IOException; - -import org.chibios.tools.eclipse.config.utils.TemplateEngine; -import org.chibios.tools.eclipse.config.utils.TemplateException; -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.handlers.HandlerUtil; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; -import org.osgi.framework.Bundle; - -import config_wizard.Activator; - -/** - * Our sample handler extends AbstractHandler, an IHandler base class. - * - * @see org.eclipse.core.commands.IHandler - * @see org.eclipse.core.commands.AbstractHandler - */ -public class GenerateFiles extends AbstractHandler { - - /** - * The constructor. - */ - public GenerateFiles() { - } - - /** - * the command has been executed, so extract extract the needed information - * from the application context. - */ - public Object execute(ExecutionEvent event) throws ExecutionException { - - IWorkbenchWindow window = HandlerUtil - .getActiveWorkbenchWindowChecked(event); - ISelection selection = window.getSelectionService().getSelection(); - if (selection instanceof IStructuredSelection) { - - /* Retrieves the full path of the configuration file. */ - IPath cfgfilepath = ((IFile)((IStructuredSelection)selection) - .getFirstElement()).getLocation(); - - /* DOM tree creation. */ - SAXBuilder builder = new SAXBuilder(); - Document document; - try { - document = builder.build(cfgfilepath.toFile()); - } catch (JDOMException e) { - return null; - } catch (IOException e) { - return null; - } - - /* Retrieving configuration settings info.*/ - Element settings = document.getRootElement().getChild("configuration_settings"); - String templates_path = settings.getChildText("templates_path"); - String output_path = settings.getChildText("output_path"); - - /* Calculating derived paths. */ - IPath tpath = new Path(templates_path); - try { - Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); - tpath = new Path(FileLocator.toFileURL( - FileLocator.find(bundle, tpath, null)).getFile()); - } catch (IOException e) { - MessageDialog.openInformation(window.getShell(), "Path Error", - e.getMessage()); - return null; - } - - /* Templates execution. */ - try { - TemplateEngine.process(cfgfilepath.toFile(), - tpath.toFile(), - new File(output_path)); - } catch (TemplateException e) { - MessageDialog.openInformation(window.getShell(), "Processing Error", - e.getMessage()); - return null; - } - - /* Destination directory refresh.*/ - IContainer container = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(cfgfilepath).getParent(); - try { - container.refreshLocal(IResource.DEPTH_INFINITE, null); - } catch (CoreException e) { - e.printStackTrace(); - } - } - return null; - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/process/ApplicationGeneratorProcessRunner.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/process/ApplicationGeneratorProcessRunner.java deleted file mode 100644 index e85442d81e..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/process/ApplicationGeneratorProcessRunner.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.process; - -import org.eclipse.cdt.core.templateengine.TemplateCore; -import org.eclipse.cdt.core.templateengine.process.ProcessArgument; -import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; -import org.eclipse.cdt.core.templateengine.process.ProcessRunner; -import org.eclipse.core.runtime.IProgressMonitor; - -public class ApplicationGeneratorProcessRunner extends ProcessRunner { - - @Override - public void process(TemplateCore template, ProcessArgument[] args, - String processId, IProgressMonitor monitor) - throws ProcessFailureException { - - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java deleted file mode 100644 index ce1e5325a8..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.utils; - -import java.io.IOException; -import java.util.HashMap; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.console.ConsolePlugin; -import org.eclipse.ui.console.IConsole; -import org.eclipse.ui.console.IConsoleConstants; -import org.eclipse.ui.console.IConsoleManager; -import org.eclipse.ui.console.IConsoleView; -import org.eclipse.ui.console.MessageConsole; -import org.eclipse.ui.console.MessageConsoleStream; -import org.osgi.framework.Bundle; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import config_wizard.Activator; - -import fmpp.Engine; -import fmpp.ProcessingException; -import fmpp.ProgressListener; -import fmpp.setting.SettingException; -import fmpp.setting.Settings; -import freemarker.ext.dom.NodeModel; -import freemarker.template.TemplateNodeModel; - -/** - * FMPP wrapper class. - */ -public class TemplateEngine { - - private final static String CONSOLE_NAME = "ChibiOS/RT Configuration Tool"; - - private final static Color DEFAULT_MESSAGE = new Color(Display.getDefault(), new RGB(0, 0, 255)); - private final static Color DEFAULT_OUTPUT = new Color(Display.getDefault(), new RGB(0, 0, 0)); - private final static Color DEFAULT_WARNING = new Color(Display.getDefault(), new RGB(255, 255, 0)); - private final static Color DEFAULT_ERROR = new Color(Display.getDefault(), new RGB(255, 0, 0)); - - private static Settings settings; - private static MessageConsoleStream msg; - private static MessageConsoleStream out; - private static MessageConsoleStream err; - private static MessageConsoleStream warn; - - /** - * Runs the templates engine. - * - * @param xmldata - * absolute path to XML data file - * @param sourcedir - * absolute path to templates directory - * @param outputdir - * output directory relative to xmldata - * - * @throws SettingException - * @throws ProcessingException - */ - public static void process(java.io.File xmldata, - java.io.File sourcedir, - java.io.File outputdir) throws TemplateException { - - /* Finds or creates a named console. */ - MessageConsole console = findConsole(CONSOLE_NAME); - activateConsole(console); - console.clearConsole(); - msg = console.newMessageStream(); - msg.setColor(DEFAULT_MESSAGE); - out = console.newMessageStream(); - out.setColor(DEFAULT_OUTPUT); - err = console.newMessageStream(); - err.setColor(DEFAULT_ERROR); - warn = console.newMessageStream(); - warn.setColor(DEFAULT_WARNING); - - /* - * Calculates the path for FTL libraries. - */ - IPath libpath = new Path("resources/gencfg/lib"); - Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); - try { - libpath = new Path(FileLocator.toFileURL(FileLocator.find(bundle, libpath, null)).getFile()); - } - catch (IOException e1) { - err.println(": FTL libraries path not found."); - return; - } - - /* - * Instantiates the FMPP Settings engine and associates a listener for - * events to be logged. - */ - try { - settings = new Settings(xmldata.getParentFile()); - } catch (SettingException e) { - e.printStackTrace(); - return; - } - settings.addProgressListener(new ProgressListener() { - public void notifyProgressEvent(Engine engine, int event, - java.io.File src, int pMode, - java.lang.Throwable error, - java.lang.Object param) { - - if (error != null) { - err.println(": " + error.getMessage()); - return; - } - - if (pMode == Engine.PMODE_IGNORE) - return; - - switch (event) { - case EVENT_BEGIN_PROCESSING_SESSION: - msg.println("Starting session"); - msg.println(); - break; - case EVENT_END_PROCESSING_SESSION: - msg.println(); - msg.println("Finished"); - break; - case EVENT_BEGIN_FILE_PROCESSING: - out.println("> Processing " + src.getName()); - break; - case EVENT_END_FILE_PROCESSING: - break; - case EVENT_IGNORING_DIR: - out.println("> Ignoring directory " + src.getName()); - break; - case EVENT_SOURCE_NOT_MODIFIED: - out.println("> Skipping " + src.getName()); - break; - case EVENT_WARNING: - warn.println(": " + (String)param); - break; - } - } - }); - - /* Loading data model. */ - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setNamespaceAware(true); - dbf.setValidating(false); - DocumentBuilder db; - try { - db = dbf.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw new TemplateException(e.getMessage()); - } - Document dom1, dom_snippets; - try { - dom1 = db.parse(xmldata); - java.io.File xmlsnippets = libpath.addTrailingSeparator().append("code_snippets.xml").toFile(); - dom_snippets = db.parse(xmlsnippets); - } catch (SAXException e) { - throw new TemplateException(e.getMessage()); - } catch (IOException e) { - throw new TemplateException(e.getMessage()); - } - - NodeModel.removeComments(dom1); - NodeModel.mergeAdjacentText(dom1); - NodeModel.removeComments(dom_snippets); - TemplateNodeModel doc1 = NodeModel.wrap(dom1); - NodeModel.mergeAdjacentText(dom_snippets); - TemplateNodeModel doc_snippets = NodeModel.wrap(dom_snippets); - - HashMap xmls = new HashMap(); - xmls.put("doc1", doc1); - xmls.put("doc_snippets", doc_snippets); - - /* Setting libraries path. */ - HashMap libs = new HashMap(); - libs.put("lib", libpath.toString()); - - /* Other settings. */ - try { - settings.add("freemarkerLinks", libs); - settings.add("data", xmls); - settings.add("sourceRoot", sourcedir.toString()); - settings.add("outputRoot", outputdir.toString()); - settings.add("ignoreCvsFiles", true); - settings.add("ignoreSvnFiles", true); - } catch (SettingException e) { - throw new TemplateException(e.getMessage()); - } - - /* Processor execution. */ - try { - settings.execute(); - } catch (SettingException e) { - throw new TemplateException(e.getMessage()); - } catch (ProcessingException e) { - throw new TemplateException(e.getMessage()); - } - } - - private static MessageConsole findConsole(String name) { - ConsolePlugin plugin = ConsolePlugin.getDefault(); - IConsoleManager conMan = plugin.getConsoleManager(); - IConsole[] existing = conMan.getConsoles(); - for (int i = 0; i < existing.length; i++) - if (name.equals(existing[i].getName())) - return (MessageConsole) existing[i]; - - /* No console found, so create a new one. */ - MessageConsole myConsole = new MessageConsole(name, null); - conMan.addConsoles(new IConsole[] { myConsole }); - return myConsole; - } - - private static void activateConsole(MessageConsole console) { - IWorkbench wb = PlatformUI.getWorkbench(); - IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); - IWorkbenchPage page = win.getActivePage(); - IConsoleView view; - try { - view = (IConsoleView) page.showView(IConsoleConstants.ID_CONSOLE_VIEW); - } catch (PartInitException e) { - e.printStackTrace(); - return; - } - view.display(console); - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java deleted file mode 100644 index 73746de1d9..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.utils; - -public class TemplateException extends Exception { - - private static final long serialVersionUID = -3317410595937500925L; - - public TemplateException(String msg) { - super(msg); - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java deleted file mode 100644 index 28ee7e6e76..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.wizards; - -import java.lang.reflect.InvocationTargetException; -import java.io.*; - -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.ui.INewWizard; -import org.eclipse.ui.IWorkbench; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.operation.*; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.ui.*; -import org.eclipse.ui.ide.IDE; -import org.osgi.framework.Bundle; - -import config_wizard.Activator; - -/** - * This is a sample new wizard. Its role is to create a new file resource in the - * provided container. If the container resource (a folder or a project) is - * selected in the workspace when the wizard is opened, it will accept it as the - * target container. The wizard creates one file with the extension "chcfg". If - * a sample multi-page editor (also available as a template) is registered for - * the same extension, it will be able to open it. - */ - -public class ConfigurationNewWizard extends Wizard implements INewWizard { - private ConfigurationNewWizardPage page; - private ISelection selection; - - private String containerName; - private String projectFileName; - private String defaultDataFile; - - /** - * Constructor for ConfigurationNewWizard. - */ - public ConfigurationNewWizard() { - super(); - setNeedsProgressMonitor(true); - } - - /** - * Adding the page to the wizard. - */ - public void addPages() { - page = new ConfigurationNewWizardPage(selection); - addPage(page); - } - - /** - * Checks if the wizard page allows to finish. - */ - public boolean canFinish() { - - return page.canFinish(); - } - - /** - * This method is called when 'Finish' button is pressed in the wizard. We - * will create an operation and run it using wizard as execution context. - */ - public boolean performFinish() { - - containerName = page.getContainerName(); - projectFileName = page.getProjectFileName(); - defaultDataFile = page.getDefaultDataFile(); - - IRunnableWithProgress op = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) - throws InvocationTargetException { - try { - doFinish(monitor); - } catch (CoreException e) { - throw new InvocationTargetException(e); - } finally { - monitor.done(); - } - } - }; - try { - getContainer().run(true, false, op); - } catch (InterruptedException e) { - return false; - } catch (InvocationTargetException e) { - Throwable realException = e.getTargetException(); - MessageDialog.openError(getShell(), "Error", realException.getMessage()); - return false; - } - return true; - } - - /** - * The worker method. It will find the container, create the file if missing - * or just replace its contents, and open the editor on the newly created - * file. - */ - private void doFinish(IProgressMonitor monitor) throws CoreException { - - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - IResource resource = root.findMember(new Path(containerName)); - if (!resource.exists() || !(resource instanceof IContainer)) { - throwCoreException("Container \"" + containerName + "\" does not exist."); - } - IContainer container = (IContainer)resource; - monitor.beginTask("Creating " + projectFileName, 3); - - /* Step #1, creates the project file.*/ - final IFile projectFile = container.getFile(new Path(projectFileName)); - Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); - IPath path = new Path(defaultDataFile); - String s; - try { - s = FileLocator.toFileURL(FileLocator.find(bundle, path, null)).getFile(); - InputStream stream = new FileInputStream(s); - if (projectFile.exists()) { - projectFile.setContents(stream, true, true, monitor); - } else { - projectFile.create(stream, true, monitor); - } - stream.close(); - } catch (IOException e) { - } - monitor.worked(1); - - /* Step #2, opens the XML data file.*/ - monitor.setTaskName("Opening XML data file for editing..."); - getShell().getDisplay().asyncExec(new Runnable() { - public void run() { - IWorkbenchPage page = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getActivePage(); - try { - IDE.openEditor(page, projectFile, true); - } catch (PartInitException e) { - } - } - }); - monitor.worked(1); - - /* Step #3, refreshing local resources.*/ - container.refreshLocal(IResource.DEPTH_INFINITE, monitor); - monitor.worked(1); - } - - private void throwCoreException(String message) throws CoreException { - IStatus status = new Status(IStatus.ERROR, - "org.chibios.tools.eclipse.config", IStatus.OK, - message, null); - throw new CoreException(status); - } - - /** - * We will accept the selection in the workbench to see if we can initialize - * from it. - * - * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection) - */ - public void init(IWorkbench workbench, IStructuredSelection selection) { - this.selection = selection; - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java deleted file mode 100644 index d503d97483..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.wizards; - -import java.io.IOException; - -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.Combo; - -import org.osgi.framework.Bundle; - -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; - -import config_wizard.Activator; - -/** - * The "New" wizard page allows setting the container for the new file as well - * as the file name. The page will only accept file name without the extension - * OR with the extension that matches the expected one (chcfg). - */ - -public class ConfigurationNewWizardPage extends WizardPage { - - private ISelection selection; - private IContainer resourceContainer; - - private Document processorsDocument; - private String currentDefaultDataFile; - - private Composite container; - private Combo configurationTemplatesCombo; - private Text confProjectFilenameText; - - /** - * Constructor for SampleNewWizardPage. - */ - public ConfigurationNewWizardPage(ISelection selection) { - - super("wizardPage"); - setTitle("ChibiOS/RT Configuration Project File"); - setDescription("This wizard creates a ChibiOS/RT configuration resource. Configuration resources allow to generate project resources starting from high level descriptions written in XML."); - this.selection = selection; - } - - /** - * @see IDialogPage#createControl(Composite) - */ - @Override - public void createControl(Composite parent) { - container = new Composite(parent, SWT.NULL); - GridLayout layout = new GridLayout(); - container.setLayout(layout); - layout.numColumns = 2; - layout.verticalSpacing = 9; - - Label lbl1 = new Label(container, SWT.NULL); - lbl1.setText("Configuration template:"); - - configurationTemplatesCombo = new Combo(container, SWT.READ_ONLY); - configurationTemplatesCombo.setLayoutData(new GridData(SWT.FILL, - SWT.CENTER, true, - false, 1, 1)); - - Label lbl2 = new Label(container, SWT.NULL); - lbl2.setText("Configuration project filename:"); - - confProjectFilenameText = new Text(container, SWT.BORDER | SWT.SINGLE); - confProjectFilenameText.setText("config.chcfg"); - confProjectFilenameText - .setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - confProjectFilenameText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - confProjectFilenameUpdated(); - } - }); - - /* Note, it must stay after the creation of the text fields. */ - configurationTemplatesCombo.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - Element processor = getSelectedTemplate(); - String basefilename = processor.getChildText("basefilename"); - confProjectFilenameText.setText(basefilename.concat(".chcfg")); - currentDefaultDataFile = processor.getChildText("default"); - } - }); - - initialize(); - setControl(container); - } - - public String getContainerName() { - - return resourceContainer.getFullPath().toString(); - } - - public String getProjectFileName() { - - return confProjectFilenameText.getText(); - } - - public String getDefaultDataFile() { - - return currentDefaultDataFile; - } - - public boolean canFinish() { - - return container.getEnabled(); - } - - /** - * Tests if the current workbench selection is a suitable container to use. - */ - private void initialize() { - - if (selection != null && selection.isEmpty() == false - && selection instanceof IStructuredSelection) { - IStructuredSelection ssel = (IStructuredSelection) selection; - if (ssel.size() > 1) - return; - Object obj = ssel.getFirstElement(); - if (obj instanceof IResource) { - if (obj instanceof IContainer) - resourceContainer = (IContainer) obj; - else - resourceContainer = ((IResource) obj).getParent(); - } - } - else { - MessageDialog.openError(getShell(), - "Error", "Container for the resource not selected."); - container.setEnabled(false); - updateStatus("Container for the resource not selected."); - } - - /* Retrieving the resource path of the processors.xml file. */ - String fpath; - try { - Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); - IPath path = new Path("resources/gencfg/processors/processors.xml"); - fpath = FileLocator.toFileURL(FileLocator.find(bundle, path, null)) - .getFile(); - } catch (IOException e) { - e.printStackTrace(); - return; - } - - /* DOM tree creation. */ - SAXBuilder builder = new SAXBuilder(); - try { - processorsDocument = builder.build(fpath); - } catch (JDOMException e) { - e.printStackTrace(); - return; - } catch (IOException e) { - e.printStackTrace(); - return; - } - - /* Parsing the content of the processors.xml file in order to populate the - panel objects.*/ - Element root = processorsDocument.getRootElement(); - for (Element processor : root.getChildren("processor")) { - String name = processor.getChildText("name"); - configurationTemplatesCombo.add(name); - } - configurationTemplatesCombo.select(0); - } - - /** - * Checks the content of the confProjectFilenameText field. - */ - private void confProjectFilenameUpdated() { - String fileName = getProjectFileName(); - - if (fileName.length() == 0) { - updateStatus("File name must be specified"); - return; - } - if (fileName.replace('\\', '/').indexOf('/', 1) > 0) { - updateStatus("File name must be valid"); - return; - } - int dotLoc = fileName.lastIndexOf('.'); - if (dotLoc != -1) { - String ext = fileName.substring(dotLoc + 1); - if (ext.equalsIgnoreCase("chcfg") == false) { - updateStatus("Configuration project filename extension must be \"chcfg\""); - return; - } - } - updateStatus(null); - } - - /** - * Returns the XML Element associated to the current selection in the combo - * box. - * - * @return An Element Object. - */ - private Element getSelectedTemplate() { - - for (Element processor : processorsDocument.getRootElement() - .getChildren("processor")) { - String name = processor.getChildText("name"); - String item = configurationTemplatesCombo - .getItem(configurationTemplatesCombo.getSelectionIndex()); - if (name.compareTo(item) == 0) { - return processor; - } - } - return null; - } - - /** - * Updates the status text in the Wizard page. - * - * @param message - * the message to be shown - */ - private void updateStatus(String message) { - - setErrorMessage(message); - setPageComplete(message == null); - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizard.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizard.java deleted file mode 100644 index b94df01cc6..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizard.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.wizards; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.settings.model.ICProjectDescription; -import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; -import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; -import org.eclipse.cdt.managedbuilder.core.IBuilder; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.internal.core.Configuration; -import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.ui.INewWizard; -import org.eclipse.ui.IWorkbench; - -@SuppressWarnings("restriction") -public class NewApplicationProjectWizard extends Wizard implements INewWizard { - - private NewApplicationProjectWizardPage page; - private ISelection selection; - - private String projectName; - private String finalProjectPath; - private String platform; - - /** - * Constructor for ConfigurationNewWizard. - */ - public NewApplicationProjectWizard() { - super(); - setNeedsProgressMonitor(true); - } - - /** - * Adding the page to the wizard. - */ - public void addPages() { - page = new NewApplicationProjectWizardPage(selection); - addPage(page); - } - - @Override - public void init(IWorkbench workbench, IStructuredSelection selection) { - this.selection = selection; - } - - @Override - public boolean performFinish() { - - projectName = page.getProjectName(); - finalProjectPath = page.getFinalProjectPath(); - platform = page.getPlatform(); - - IRunnableWithProgress op = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) - throws InvocationTargetException { - try { - doFinish(monitor); - } - catch (CoreException e) { - throw new InvocationTargetException(e); - } - finally { - monitor.done(); - } - } - }; - try { - getContainer().run(true, false, op); - } - catch (InterruptedException e) { - return false; - } - catch (InvocationTargetException e) { - Throwable realException = e.getTargetException(); - MessageDialog.openError(getShell(), "Error", realException.getMessage()); - return false; - } - return true; - } - - /** - * The worker method. It will find the container, create the file if missing - * or just replace its contents, and open the editor on the newly created - * file. - */ - private void doFinish(IProgressMonitor monitor) throws CoreException { - - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - IWorkspaceRoot root = workspace.getRoot(); - - monitor.beginTask("Creating " + projectName, 3); - - /* Step #1, creates the project file.*/ - IProject project = root.getProject(projectName); - if (project.exists()) { - monitor.done(); - MessageDialog.openError(getShell(), "Error", "Project " + projectName + - " already exists in workspace"); - return; - } - - IProjectDescription desc = project.getWorkspace().newProjectDescription(projectName); - if (finalProjectPath != null) - desc.setLocation(new Path(finalProjectPath)); - project.create(desc, null); - - /* Step #2, makes it a CDT project.*/ - desc = workspace.newProjectDescription(projectName); - project = CCorePlugin.getDefault().createCDTProject(desc, project, null); - - ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); - ICProjectDescription cdesc = mngr.createProjectDescription(project, false); - ManagedProject mproject = new ManagedProject(cdesc); - Configuration cfg = new Configuration(mproject, null, "Default", "Default"); - IBuilder bld = cfg.getEditableBuilder(); - bld.setManagedBuildOn(false); - CConfigurationData data = cfg.getConfigurationData(); - cdesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data); - - mngr.setProjectDescription(project, cdesc); - monitor.worked(1); - } -} diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizardPage.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizardPage.java deleted file mode 100644 index b2daabeac7..0000000000 --- a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/NewApplicationProjectWizardPage.java +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.config.wizards; - -import java.io.File; -import java.io.IOException; - -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.widgets.Combo; - -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; -import org.osgi.framework.Bundle; - -import config_wizard.Activator; - -public class NewApplicationProjectWizardPage extends WizardPage { - - private Composite container; - private Text projectParentPathText; - private Button btnBrowse; - private Label lbl1; - private Text projectNameText; - private Button useCustomPathButton; - private Label lbl3; - private Text projectFinalPathText; - private Label lbl4; - private Combo platformCombo; - - /** - * Constructor for SampleNewWizardPage. - */ - public NewApplicationProjectWizardPage(ISelection selection) { - - super("wizardPage"); - setTitle("ChibiOS/RT New Application Project Wizard"); - setDescription("This wizard creates a new ChibiOS/RT application project."); - } - - /** - * @see IDialogPage#createControl(Composite) - */ - @Override - public void createControl(Composite parent) { - container = new Composite(parent, SWT.NULL); - GridLayout layout = new GridLayout(); - container.setLayout(layout); - layout.numColumns = 3; - layout.verticalSpacing = 9; - - /* Layout row 1.*/ - lbl1 = new Label(container, SWT.NONE); - lbl1.setText("Project name:"); - projectNameText = new Text(container, SWT.BORDER); - projectNameText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - projectPageUpdated(); - } - }); - projectNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - new Label(container, SWT.NONE); - - /* Layout row 2.*/ - useCustomPathButton = new Button(container, SWT.CHECK); - useCustomPathButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - if (useCustomPathButton.getSelection()) { - projectParentPathText.setText(ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()); - projectParentPathText.setEnabled(false); - btnBrowse.setEnabled(false); - updateFinalProjectPathText(); - } - else { - projectParentPathText.setText(ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()); - projectParentPathText.setEnabled(true); - btnBrowse.setEnabled(true); - updateFinalProjectPathText(); - } - } - }); - useCustomPathButton.setText("Use default location"); - new Label(container, SWT.NONE); - new Label(container, SWT.NONE); - - /* Layout row 3.*/ - Label lbl2 = new Label(container, SWT.NULL); - lbl2.setText("Project parent path:"); - projectParentPathText = new Text(container, SWT.BORDER | SWT.SINGLE); - projectParentPathText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - projectPageUpdated(); - } - }); - projectParentPathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - btnBrowse = new Button(container, SWT.NONE); - btnBrowse.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - /* Prompts the user for a parent directory for the new project.*/ - DirectoryDialog dlg = new DirectoryDialog(getShell()); - dlg.setFilterPath(projectParentPathText.getText()); - dlg.setText("New ChibiOS/RT Project"); - dlg.setMessage("Select the parent directory for the new ChibiOS/RT application project."); - String parent = dlg.open(); - if (parent != null) { - projectParentPathText.setText(parent); - projectPageUpdated(); - } - } - }); - btnBrowse.setText("Browse..."); - - /* Layout row 4.*/ - lbl3 = new Label(container, SWT.NONE); - lbl3.setText("Final project path:"); - projectFinalPathText = new Text(container, SWT.BORDER); - projectFinalPathText.setEditable(false); - projectFinalPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - new Label(container, SWT.NONE); - - /* Layout row 5.*/ - lbl4 = new Label(container, SWT.NONE); - lbl4.setText("Target platform:"); - platformCombo = new Combo(container, SWT.READ_ONLY); - platformCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - new Label(container, SWT.NONE); - - initialize(); - setControl(container); - } - - /** - * Tests if the current workbench selection is a suitable container to use. - */ - private void initialize() { - - /* Initial state of the check box and project path text.*/ - useCustomPathButton.setSelection(true); - projectParentPathText.setText(ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()); - projectParentPathText.setEnabled(false); - btnBrowse.setEnabled(false); - - /* Retrieving the resource path of the processors.xml file. */ - String fpath; - try { - Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); - IPath path = new Path("resources/gencfg/processors/processors.xml"); - fpath = FileLocator.toFileURL(FileLocator.find(bundle, path, null)).getFile(); - } catch (IOException e) { - e.printStackTrace(); - return; - } - - /* DOM tree creation. */ - SAXBuilder builder = new SAXBuilder(); - Document document; - try { - document = builder.build(fpath); - } catch (JDOMException e) { - e.printStackTrace(); - return; - } catch (IOException e) { - e.printStackTrace(); - return; - } - - /* Parsing the content of the processors.xml file in order to populate the - panel objects.*/ - Element root = document.getRootElement(); - for (Element processor : root.getChildren("processor")) { - String class_attr = processor.getAttributeValue("class", ""); - if (class_attr.compareToIgnoreCase("build") == 0) { - String name = processor.getAttributeValue("target", "internal error"); - platformCombo.add(name); - } - } - platformCombo.select(0); - - /* Update checks on the fields.*/ - projectPageUpdated(); - - /* Focus on the first editable field.*/ - projectNameText.setFocus(); - } - - public String getProjectName() { - - return projectNameText.getText(); - } - - public String getProjectParentPath() { - - return projectParentPathText.getText(); - } - - public String getFinalProjectPath() { - - if (useCustomPathButton.getSelection()) - return null; - return projectFinalPathText.getText(); - } - - public String getPlatform() { - - return platformCombo.getText(); - } - - private void projectPageUpdated() { - - updateFinalProjectPathText(); - - /* Checks the project location.*/ - File path = new File(projectParentPathText.getText()); - if (!path.exists()) { - updateStatus("Project path is not valid."); - return; - } - if (!path.isDirectory()) { - updateStatus("Project path is a directory."); - return; - } - - /* Checks the project name.*/ - String name = projectNameText.getText(); - if (!isValidFilename(name)) { - updateStatus("Invalid project name."); - return; - } - - /* Checks if the project already exists in the workspace.*/ - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name); - if (project.exists()) { - updateStatus("Project exists."); - return; - } - - updateStatus(null); - } - - /** - * Updates the status text in the Wizard page. - * - * @param message - * the message to be shown - */ - private void updateStatus(String message) { - - setErrorMessage(message); - setPageComplete(message == null); - } - - private void updateFinalProjectPathText() { - - IPath parent = new Path(projectParentPathText.getText()); - IPath project = parent.addTrailingSeparator().append(projectNameText.getText()); - projectFinalPathText.setText(project.toString()); - } - - private boolean isValidFilename(String name) { - - if (name.length() == 0) - return false; - if ((name.indexOf("`") >= 0) || (name.indexOf("?") >= 0) || - (name.indexOf("*") >= 0) || (name.indexOf("<") >= 0) || - (name.indexOf(">") >= 0) || (name.indexOf("|") >= 0) || - (name.indexOf("\"") >= 0) || (name.indexOf(":") >= 0) || - (name.indexOf("#") >= 0) || (name.indexOf("\\") >= 0) || - (name.indexOf("/") >= 0) || (name.indexOf("|") >= 0)) - return false; - return true; - } -} diff --git a/tools/eclipse/debug_support/.classpath b/tools/eclipse/debug_support/.classpath deleted file mode 100644 index 8a8f1668cd..0000000000 --- a/tools/eclipse/debug_support/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tools/eclipse/debug_support/.project b/tools/eclipse/debug_support/.project deleted file mode 100644 index eb8a22dc0f..0000000000 --- a/tools/eclipse/debug_support/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - Tool Debug Support - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/tools/eclipse/debug_support/.settings/org.eclipse.jdt.core.prefs b/tools/eclipse/debug_support/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index c63fde790a..0000000000 --- a/tools/eclipse/debug_support/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -#Fri Jul 01 10:57:07 CEST 2011 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/tools/eclipse/debug_support/META-INF/MANIFEST.MF b/tools/eclipse/debug_support/META-INF/MANIFEST.MF deleted file mode 100644 index 2908664cf9..0000000000 --- a/tools/eclipse/debug_support/META-INF/MANIFEST.MF +++ /dev/null @@ -1,14 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: ChibiOS-RT_Debug_Support -Bundle-SymbolicName: org.chibios.tools.eclipse.debug; singleton:=true -Bundle-Version: 1.1.0 -Bundle-Activator: org.chibios.tools.eclipse.debug.activator.Activator -Bundle-Vendor: chibios.org -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.cdt.debug.mi.core, - org.eclipse.debug.ui, - org.eclipse.cdt.debug.core -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ClassPath: . diff --git a/tools/eclipse/debug_support/build.properties b/tools/eclipse/debug_support/build.properties deleted file mode 100644 index 255e23b619..0000000000 --- a/tools/eclipse/debug_support/build.properties +++ /dev/null @@ -1,7 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = plugin.xml,\ - META-INF/,\ - .,\ - icons/,\ - contexts.xml diff --git a/tools/eclipse/debug_support/contexts.xml b/tools/eclipse/debug_support/contexts.xml deleted file mode 100644 index 02e26e45c4..0000000000 --- a/tools/eclipse/debug_support/contexts.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - This is the context help for the sample view with a table viewer. It was generated by a PDE template. - - - - - - - - - diff --git a/tools/eclipse/debug_support/icons/sample.gif b/tools/eclipse/debug_support/icons/sample.gif deleted file mode 100644 index 34fb3c9d8cb7d489681b7f7aee4bdcd7eaf53610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 983 zcmZ?wbhEHb6krfw_|CxKYUg-n!?izO{@9*?jxd%4aX0yzy`dymabz zw#(eg=y~&N&n)dZv2xzduG}5lraiApo3(c4*{Ylg5#|$JO_EEZ<^|a2`Z*=9ns7DV zy=TR&gYw*7f%auV?ip3tvjRPmcdoho{K?x$_vR?C#t5&<;~V}S*>OMCr>h}%%bLZ9 zmo3`hYEwTICo-TTCZwgTsC&VjZRgJ1eE#fBa^%9R zmmfWS@;bnyJ27HWY}kxYzv(Hl>yu;FCPlAEh+34Muq-8Rb6C)<8qA3{r2e5 z`$vyngh#H=FWlqqvnapfc5%(!sQ4v?r7J61-&eJNEN^;KTK}T7{#i-gJh%G*9vcYdwv_*~xdw!Gz4Va?T!sXyyF@8?w<>X`X=#j%uHV4GRvj@+tE@ zQ%F!a)GKcn^~8abN>4la1UNXVL;{ZWi)lEwyeatDu%Lr6;aASiLrXXW zQm# - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/activator/Activator.java b/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/activator/Activator.java deleted file mode 100644 index b2cfc60988..0000000000 --- a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/activator/Activator.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.debug.activator; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class Activator extends AbstractUIPlugin { - - // The plug-in ID - public static final String PLUGIN_ID = "org.chibios.tools.eclipse.debug"; //$NON-NLS-1$ - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext - * ) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext - * ) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - - /** - * Returns an image descriptor for the image file at the given plug-in - * relative path - * - * @param path - * the path - * @return the image descriptor - */ - public static ImageDescriptor getImageDescriptor(String path) { - return imageDescriptorFromPlugin(PLUGIN_ID, path); - } -} diff --git a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxy.java b/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxy.java deleted file mode 100644 index 6104b840b6..0000000000 --- a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxy.java +++ /dev/null @@ -1,582 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.debug.utils; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; -import org.eclipse.cdt.debug.internal.core.model.CDebugTarget; -import org.eclipse.cdt.debug.mi.core.MIException; -import org.eclipse.cdt.debug.mi.core.MIFormat; -import org.eclipse.cdt.debug.mi.core.MISession; -import org.eclipse.cdt.debug.mi.core.cdi.model.Target; -import org.eclipse.cdt.debug.mi.core.command.CommandFactory; -import org.eclipse.cdt.debug.mi.core.command.MIDataEvaluateExpression; -import org.eclipse.cdt.debug.mi.core.command.MIDataReadMemory; -import org.eclipse.cdt.debug.mi.core.output.MIDataEvaluateExpressionInfo; -import org.eclipse.cdt.debug.mi.core.output.MIDataReadMemoryInfo; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.model.IDebugTarget; - -@SuppressWarnings("restriction") -public class DebugProxy { - - private CommandFactory cmd_factory; - private MISession mi_session; - - protected final static String[] threadStates = { - "READY", - "CURRENT", - "SUSPENDED", - "WTSEM", - "WTMTX", - "WTCOND", - "SLEEPING", - "WTEXIT", - "WTOREVT", - "WTANDEVT", - "SNDMSGQ", - "SNDMSG", - "WTMSG", - "WTQUEUE", - "FINAL" - }; - - private void getSession(CDebugTarget target) - throws DebugProxyException { - ICDITarget[] targets = target.getCDISession().getTargets(); - ICDITarget cdi_target = null; - for (int i = 0; i < targets.length; i++) { - if (targets[i] instanceof Target) { - cdi_target = targets[i]; - break; - } - } - if (cdi_target == null) - throw new DebugProxyException("no CDI session found"); - mi_session = ((Target)cdi_target).getMISession(); - cmd_factory = mi_session.getCommandFactory(); - } - - public DebugProxy() - throws DebugProxyException { - IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets(); - for (IDebugTarget target:targets) { - if(target instanceof CDebugTarget) { - getSession((CDebugTarget)target); - return; - } - } - } - - public DebugProxy(CDebugTarget target) - throws DebugProxyException { - getSession(target); - } - - public String evaluateExpression(String expression) - throws DebugProxyException { - if (mi_session.getMIInferior().isRunning()) - return null; - MIDataEvaluateExpression expr = cmd_factory.createMIDataEvaluateExpression(expression); - try { - mi_session.postCommand(expr); - MIDataEvaluateExpressionInfo info = expr.getMIDataEvaluateExpressionInfo(); - if (info != null) - return info.getExpression(); - } catch (MIException e) {} - throw new DebugProxyException("error evaluating the expression: '" + - expression + "'"); - } - - public long scanStack(long base, long end, long pattern) - throws DebugProxyException { - if (mi_session.getMIInferior().isRunning()) - return -1; - if (end > base) { - MIDataReadMemory mem = cmd_factory.createMIDataReadMemory(0, - Long.toString(base), - MIFormat.HEXADECIMAL, - 4, - 1, - (int)(end - base), - '.'); - try { - mi_session.postCommand(mem); - MIDataReadMemoryInfo info = mem.getMIDataReadMemoryInfo(); - if (info != null) { - long[] data = info.getMemories()[0].getData(); - int i = 0; - while ((i < data.length) && (data[i] == pattern)) - i++; - return i * 4; - } - } catch (MIException e) {} - throw new DebugProxyException("error reading memory at " + - base); - } - return 0; - } - - public String readCString(long address, int max) - throws DebugProxyException { - if (mi_session.getMIInferior().isRunning()) - return null; - MIDataReadMemory mem = cmd_factory.createMIDataReadMemory(0, - Long.toString(address), - MIFormat.HEXADECIMAL, - 1, - 1, - max, - '.'); - try { - mi_session.postCommand(mem); - MIDataReadMemoryInfo info = mem.getMIDataReadMemoryInfo(); - if (info != null) { - String s = info.getMemories()[0].getAscii(); - int i = s.indexOf('.'); - if (i >= 0) - return s.substring(0, s.indexOf('.')); - else - return s; - } - } catch (MIException e) {} - throw new DebugProxyException("error reading memory at " + - address); - } - - /** - * @brief Return the list of threads. - * @details The threads list is fetched from memory by scanning the - * registry. - * - * @return A @p LinkedHashMap object whose keys are the threads addresses - * as decimal strings, the value is an @p HashMap of the thread - * fields: - * - stack - * - stklimit - * - name - * - state - * - state_s - * - flags - * - prio - * - refs - * - time - * - wtobjp - * . - * Missing fields are set to "-". - * @retval null If the debugger encountered an error or - * the target is running. - * - * @throws DebugProxyException If the debugger is active but the registry - * is not found, not initialized or corrupted. - */ - public LinkedHashMap> readThreads() - throws DebugProxyException { - // rlist structure address. - String rlist; - try { - rlist = evaluateExpression("(uint32_t)&rlist"); - if (rlist == null) - return null; - } catch (DebugProxyException e) { - throw new DebugProxyException("ChibiOS/RT not found on target"); - } catch (Exception e) { - return null; - } - - // Scanning registry. - LinkedHashMap> lhm = - new LinkedHashMap>(10); - String current = rlist; - String previous = rlist; - while (true) { - - // Fetching next thread in the registry (newer link). This fetch fails - // if the register is not enabled in the kernel and the p_newer field - // does not exist. - try { - current = evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_newer"); - } catch (DebugProxyException e1) { - throw new DebugProxyException("ChibiOS/RT registry not enabled in kernel"); - } - - // This can happen if the kernel is not initialized yet or if the - // registry is corrupted. - if (current.compareTo("0") == 0) - throw new DebugProxyException("ChibiOS/RT registry integrity check failed, NULL pointer"); - - // TODO: integrity check on the pointer value (alignment, range). - - // The previous thread in the list is fetched as a integrity check. - String older = evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_older"); - if (older.compareTo("0") == 0) - throw new DebugProxyException("ChibiOS/RT registry integrity check failed, NULL pointer"); - if (previous.compareTo(older) != 0) - throw new DebugProxyException("ChibiOS/RT registry integrity check failed, double linked list violation"); - - // End of the linked list condition. - if (current.compareTo(rlist) == 0) - break; - - // Hash of threads fields. - HashMap map = new HashMap(16); - - // Fetch of the various fields in the Thread structure. Some fields - // are optional so are placed within try-catch. - long stklimit; - try { - stklimit = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_stklimit")); - map.put("stklimit", Long.toString(stklimit)); - } catch (DebugProxyException e) { - map.put("stklimit", "-"); - stklimit = -1; - } - - long stack; - try { - stack = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_ctx.r13")); - map.put("stack", Long.toString(stack)); - } catch (DebugProxyException e) { - try { - stack = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_ctx.sp")); - map.put("stack", Long.toString(stack)); - } catch (DebugProxyException ex) { - map.put("stack", "-"); - stack = -1; - } - } - - if ((stklimit < 0) || (stack < 0)) - map.put("stkunused", "-"); - else { - if ((stack < 0) || (stack < stklimit)) - map.put("stkunused", "overflow"); - else { - long stkunused = scanStack(stklimit, stack, 0x55555555); - map.put("stkunused", Long.toString(stkunused)); - } - } - - long n; - try { - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_name")); - if (n == 0) - map.put("name", ""); - else - map.put("name", readCString(n, 16)); - } catch (DebugProxyException e) { - map.put("name", "-"); - } - - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_state")); - map.put("state", Long.toString(n)); - if ((n >= 0) && (n < threadStates.length)) { - map.put("state_s", threadStates[(int)n]); - } - else - map.put("state_s", "unknown"); - - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_flags")); - map.put("flags", Long.toString(n)); - - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_prio")); - map.put("prio", Long.toString(n)); - - try { - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_refs")); - map.put("refs", Long.toString(n)); - } catch (DebugProxyException e) { - map.put("refs", "-"); - } - - try { - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_time")); - map.put("time", Long.toString(n)); - } catch (DebugProxyException e) { - map.put("time", "-"); - } - - try { - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + current + ")->p_u.wtobjp")); - map.put("wtobjp", Long.toString(n)); - } catch (DebugProxyException e) { - map.put("wtobjp", "-"); - } - - // Inserting the new thread map into the threads list. - lhm.put(current, map); - - previous = current; - } - return lhm; - } - - /** - * @brief Return the list of timers. - * @details The timers list is fetched from memory by scanning the - * @p vtlist structure. - * - * @return A @p LinkedHashMap object whose keys are the timers addresses - * as decimal strings, the value is an @p HashMap of the timers - * fields: - * - delta - * - func - * - par - * . - * @retval null If the debugger encountered an error or - * the target is running. - * - * @throws DebugProxyException If the debugger is active but the structure - * @p vtlist is not found, not initialized or - * corrupted. - */ - public LinkedHashMap> readTimers() - throws DebugProxyException { - // Delta list structure address. - String vtlist; - try { - vtlist = evaluateExpression("(uint32_t)&vtlist"); - if (vtlist == null) - return null; - } catch (DebugProxyException e) { - throw new DebugProxyException("ChibiOS/RT not found on target"); - } catch (Exception e) { - return null; - } - - // Scanning delta list. - LinkedHashMap> lhm = - new LinkedHashMap>(10); - String current = vtlist; - String previous = vtlist; - while (true) { - - // Fetching next timer in the delta list (vt_next link). - current = evaluateExpression("(uint32_t)((VirtualTimer *)" + current + ")->vt_next"); - - // This can happen if the kernel is not initialized yet or if the - // delta list is corrupted. - if (current.compareTo("0") == 0) - throw new DebugProxyException("ChibiOS/RT delta list integrity check failed, NULL pointer"); - - // TODO: integrity check on the pointer value (alignment, range). - - // The previous timer in the delta list is fetched as a integrity check. - String prev = evaluateExpression("(uint32_t)((VirtualTimer *)" + current + ")->vt_prev"); - if (prev.compareTo("0") == 0) - throw new DebugProxyException("ChibiOS/RT delta list integrity check failed, NULL pointer"); - if (previous.compareTo(prev) != 0) - throw new DebugProxyException("ChibiOS/RT delta list integrity check failed, double linked list violation"); - - // End of the linked list condition. - if (current.compareTo(vtlist) == 0) - break; - - // Hash of timers fields. - HashMap map = new HashMap(16); - - // Fetch of the various fields in the Thread structure. Some fields - // are optional so are placed within try-catch. - long n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((VirtualTimer *)" + current + ")->vt_time")); - map.put("delta", Long.toString(n)); - - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((VirtualTimer *)" + current + ")->vt_func")); - map.put("func", Long.toString(n)); - - n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((VirtualTimer *)" + current + ")->vt_par")); - map.put("par", Long.toString(n)); - - // Inserting the new thread map into the threads list. - lhm.put(current, map); - - previous = current; - } - return lhm; - } - - /** - * @brief Return the list of trace buffer entries. - * @details The trace buffer is fetched from memory by scanning the - * @p dbg_trace_buffer array. - * - * @return A @p LinkedHashMap object whose keys are the timers addresses - * as decimal strings, the value is an @p HashMap of the timers - * fields: - * - time - * - tp - * - wtobjp - * - state - * - state_s - * . - * @retval null If the debugger encountered an error or - * the target is running. - * - * @throws DebugProxyException If the debugger is active but the structure - * @p dbg_trace_buffer is not found, not - * initialized or corrupted. - */ - public LinkedHashMap> readTraceBuffer() - throws DebugProxyException { - - // Trace buffer size. - String s; - try { - s = evaluateExpression("(uint32_t)dbg_trace_buffer.tb_size"); - if (s == null) - return null; - } catch (DebugProxyException e) { - throw new DebugProxyException("trace buffer not found on target"); - } catch (Exception e) { - return null; - } - - int tbsize = (int)HexUtils.parseNumber(s); - int tbrecsize = (int)HexUtils.parseNumber(evaluateExpression("(uint32_t)sizeof (ch_swc_event_t)")); - long tbstart = HexUtils.parseNumber(evaluateExpression("(uint32_t)dbg_trace_buffer.tb_buffer")); - long tbend = HexUtils.parseNumber(evaluateExpression("(uint32_t)&dbg_trace_buffer.tb_buffer[" + tbsize + "]")); - long tbptr = HexUtils.parseNumber(evaluateExpression("(uint32_t)dbg_trace_buffer.tb_ptr")); - - // Scanning the trace buffer from the oldest event to the newest. - LinkedHashMap> lhm = - new LinkedHashMap>(64); - int n = tbsize; - int i = -tbsize + 1; - while (n > 0) { - // Hash of timers fields. - HashMap map = new HashMap(16); - - String time = evaluateExpression("(uint32_t)(((ch_swc_event_t *)" + tbptr + ")->se_time)"); - map.put("time", time); - - String tp = evaluateExpression("(uint32_t)(((ch_swc_event_t *)" + tbptr + ")->se_tp)"); - map.put("tp", tp); - - String wtobjp = evaluateExpression("(uint32_t)(((ch_swc_event_t *)" + tbptr + ")->se_wtobjp)"); - map.put("wtobjp", wtobjp); - - long state = HexUtils.parseNumber(evaluateExpression("(uint32_t)(((ch_swc_event_t *)" + tbptr + ")->se_state)")); - map.put("state", Long.toString(state)); - if ((state >= 0) && (state < threadStates.length)) - map.put("state_s", threadStates[(int)state]); - else - map.put("state_s", "unknown"); - - // Inserting the new event map into the events list. - if (tp.compareTo("0") != 0) - lhm.put(Integer.toString(i), map); - - tbptr += tbrecsize; - if (tbptr >= tbend) - tbptr = tbstart; - n--; - i++; - } - return lhm; - } - - /** - * @brief Return the list of the system global variables. - * - * @return A @p LinkedHashMap object whose keys are the variable names and - * the values are the variable values. - * - * @retval null If the debugger encountered an error or - * the target is running. - * - * @throws DebugProxyException If the debugger is active but the structure - * @p dbg_trace_buffer is not found, not - * initialized or corrupted. - */ - public LinkedHashMap readGlobalVariables() - throws DebugProxyException { - - LinkedHashMap map = new LinkedHashMap(16); - - try { - String vt_systime = evaluateExpression("(uint32_t)vtlist.vt_systime"); - if (vt_systime == null) - return null; - map.put("vt_systime", vt_systime); - } catch (DebugProxyException e) { - throw new DebugProxyException("ChibiOS/RT not found on target"); - } catch (Exception e) { - return null; - } - - try { - long r_current = HexUtils.parseNumber(evaluateExpression("(uint32_t)rlist.r_current")); - if (r_current != 0) { - String name; - try { - long n = HexUtils.parseNumber(evaluateExpression("(uint32_t)((Thread *)" + r_current + ")->p_name")); - if (n == 0) - name = ""; - else - name = readCString(n, 16); - } catch (DebugProxyException e) { - name = "-"; - } - map.put("r_current", HexUtils.dword2HexString((int)r_current) + " \"" + name + "\""); - } - else - map.put("r_current", "0"); - } catch (DebugProxyException e) {} - - try { - String r_preempt = evaluateExpression("(uint32_t)rlist.r_preempt"); - map.put("r_preempt", r_preempt); - } catch (DebugProxyException e) {} - - try { - Long addr = HexUtils.parseNumber(evaluateExpression("(uint32_t)dbg_panic_msg")); - if (addr == 0) - map.put("dbg_panic_msg", ""); - else - map.put("dbg_panic_msg", readCString(addr, 32)); - } catch (DebugProxyException e) { - map.put("dbg_panic_msg", ""); - } - - try { - Long isr_cnt = HexUtils.parseNumber(evaluateExpression("(uint32_t)dbg_isr_cnt")); - if (isr_cnt == 0) - map.put("dbg_isr_cnt", "not within ISR"); - else - map.put("dbg_isr_cnt", "within ISR"); - } catch (DebugProxyException e) { - map.put("dbg_isr_cnt", ""); - } - - try { - Long lock_cnt = HexUtils.parseNumber(evaluateExpression("(uint32_t)dbg_lock_cnt")); - if (lock_cnt == 0) - map.put("dbg_lock_cnt", "not within lock"); - else - map.put("dbg_lock_cnt", "within lock"); - } catch (DebugProxyException e) { - map.put("dbg_lock_cnt", ""); - } - - return map; - } -} diff --git a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxyException.java b/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxyException.java deleted file mode 100644 index 62b7917322..0000000000 --- a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/DebugProxyException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.debug.utils; - -public class DebugProxyException extends Exception { - - private static final long serialVersionUID = 6860700758297226746L; - - public DebugProxyException() { - super("Debug Proxy Exception"); - } - - public DebugProxyException(String s) { - super(s); - } -} diff --git a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/HexUtils.java b/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/HexUtils.java deleted file mode 100644 index 983561cb09..0000000000 --- a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/utils/HexUtils.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.debug.utils; - -public class HexUtils { - - protected final static String[] hexChars = { - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" - }; - - static public boolean isHexChar(char c) { - - if (Character.isDigit(c) || (c >= 'a') && (c <= 'f') || - (c >= 'A') && (c <= 'F')) - return true; - return false; - } - - static public boolean isHexString(String hstring) { - int l = hstring.length(); - - if ((l & 1) == 1) - return false; - - for (int i = 0; i < l; i++) - if (!isHexChar(hstring.charAt(i))) - return false; - return true; - } - - static public byte[] hexStringToByteArray(String hstring) { - - if (!isHexString(hstring)) - throw new NumberFormatException("not a hex string"); - - byte[] result = new byte[hstring.length() / 2]; - - for (int i = 0; i < hstring.length(); i += 2) { - String toParse = hstring.substring(i, i + 2); - - result[i / 2] = (byte)Integer.parseInt(toParse, 16); - } - return result; - } - - static public byte hexStringToByte(String hstring) { - - if (hstring.length() != 2) - throw new NumberFormatException("not a byte hex string"); - - return (byte)Integer.parseInt(hstring, 16); - } - - static public String byteArrayToHexString(byte[] data) { - StringBuffer out = new StringBuffer(data.length * 2); - - for (int i = 0; i < data.length; i++) { - out.append(hexChars[(data[i] >> 4) & 15]); - out.append(hexChars[data[i] & 15]); - } - return out.toString(); - } - - static public String byte2HexString(int b) { - - return hexChars[(b >> 4) & 15] + hexChars[b & 15]; - } - - static public String word2HexString(int w) { - - return hexChars[(w >> 12) & 15] - + hexChars[(w >> 8) & 15] - + hexChars[(w >> 4) & 15] - + hexChars[w & 15]; - } - - static public String dword2HexString(int w) { - - return hexChars[(w >> 28) & 15] - + hexChars[(w >> 24) & 15] - + hexChars[(w >> 20) & 15] - + hexChars[(w >> 16) & 15] - + hexChars[(w >> 12) & 15] - + hexChars[(w >> 8) & 15] - + hexChars[(w >> 4) & 15] - + hexChars[w & 15]; - } - - static public long parseNumber(String s) { - - if (s.toLowerCase().startsWith("0x")) - return Long.parseLong(s.substring(2), 16); - return Long.parseLong(s); - } -} - diff --git a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/views/ChibiView.java b/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/views/ChibiView.java deleted file mode 100644 index 597a837c27..0000000000 --- a/tools/eclipse/debug_support/src/org/chibios/tools/eclipse/debug/views/ChibiView.java +++ /dev/null @@ -1,585 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -package org.chibios.tools.eclipse.debug.views; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map.Entry; -import java.util.Set; - -import org.chibios.tools.eclipse.debug.utils.DebugProxy; -import org.chibios.tools.eclipse.debug.utils.DebugProxyException; -import org.chibios.tools.eclipse.debug.utils.HexUtils; - -import org.eclipse.ui.internal.IWorkbenchThemeConstants; -import org.eclipse.ui.part.*; -import org.eclipse.ui.themes.ITheme; -import org.eclipse.jface.action.*; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.ui.*; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; - -import org.eclipse.debug.core.DebugEvent; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IDebugEventSetListener; -import org.eclipse.cdt.debug.internal.core.model.CDebugTarget; -import org.eclipse.wb.swt.SWTResourceManager; -import org.eclipse.wb.swt.ResourceManager; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; - -/** - * This sample class demonstrates how to plug-in a new workbench view. The view - * shows data obtained from the model. The sample creates a dummy model on the - * fly, but a real implementation would connect to the model available either in - * this or another plug-in (e.g. the workspace). The view is connected to the - * model using a content provider. - *

    - * The view uses a label provider to define how model objects should be - * presented in the view. Each view can present the same model objects using - * different labels and icons, if needed. Alternatively, a single label provider - * can be shared between views in order to ensure that objects of the same type - * are presented in the same way everywhere. - *

    - */ - -@SuppressWarnings("restriction") -public class ChibiView extends ViewPart implements IDebugEventSetListener { - - /** - * The ID of the view as specified by the extension. - */ - public static final String ID = "org.chibios.tools.eclipse.debug.views.ChibiView"; - - private CTabFolder tabFolder; - private CTabItem tbtmGlobal; - private CTabItem tbtmThreads; - private CTabItem tbtmTimers; - private CTabItem tbtmTraceBuffer; - - private Action refreshAction; - private Table threadsTable; - private Table timersTable; - - private DebugProxy debugger; - private Table tbTable; - private Table globalTable; - - private ITheme theme; - - private FocusAdapter focus = new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - setInactive(); - } - @Override - public void focusGained(FocusEvent e) { - setActive(); - } - }; - - /** - * The constructor. - */ - public ChibiView() { - - theme = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(); - } - - private void setActive() { - tabFolder.setSelectionBackground( - new org.eclipse.swt.graphics.Color[] { - theme.getColorRegistry().get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START), - theme.getColorRegistry().get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END) - }, - new int[] {100}, - true); - tabFolder.setSelectionForeground(theme.getColorRegistry().get(IWorkbenchThemeConstants.ACTIVE_TAB_TEXT_COLOR)); - } - - private void setInactive() { - tabFolder.setSelectionBackground( - new org.eclipse.swt.graphics.Color[] { - theme.getColorRegistry().get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_START), - theme.getColorRegistry().get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_END) - }, - new int[] {theme.getInt(IWorkbenchThemeConstants.ACTIVE_TAB_PERCENT)}, - true); - tabFolder.setSelectionForeground(theme.getColorRegistry().get(IWorkbenchThemeConstants.INACTIVE_TAB_TEXT_COLOR)); - } - - /** - * This is a callback that will allow us to create the viewer and initialize - * it. - */ - public void createPartControl(Composite parent) { - - tabFolder = new CTabFolder(parent, SWT.BORDER | SWT.BOTTOM); - tabFolder.setFont(theme.getFontRegistry().get(IWorkbenchThemeConstants.TAB_TEXT_FONT)); - tabFolder.setBackground(theme.getColorRegistry().get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_END)); - tabFolder.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - setActive(); - tabFolder.getSelection().getControl().setFocus(); - } - }); - tabFolder.addFocusListener(new FocusAdapter() { - @Override - public void focusGained(FocusEvent e) { - tabFolder.getSelection().getControl().setFocus(); - } - }); - setInactive(); - tabFolder.setSimple(false); - - tbtmGlobal = new CTabItem(tabFolder, SWT.NONE); - tbtmGlobal.setText("Global"); - - globalTable = new Table(tabFolder, SWT.FULL_SELECTION); - globalTable.addFocusListener(focus); - globalTable.setFont(SWTResourceManager.getFont("Courier New", 8, SWT.NORMAL)); - tbtmGlobal.setControl(globalTable); - globalTable.setHeaderVisible(true); - - TableColumn tblclmnGlobalHidden = new TableColumn(globalTable, SWT.RIGHT); - tblclmnGlobalHidden.setWidth(0); - tblclmnGlobalHidden.setText(""); - - TableColumn tblclmnGlobalVariableName = new TableColumn(globalTable, SWT.LEFT); - tblclmnGlobalVariableName.setWidth(150); - tblclmnGlobalVariableName.setText("Variable"); - - TableColumn tblclmnGlobalVariableValue = new TableColumn(globalTable, SWT.LEFT); - tblclmnGlobalVariableValue.setWidth(300); - tblclmnGlobalVariableValue.setText("Value"); - - tbtmThreads = new CTabItem(tabFolder, SWT.NONE); - tbtmThreads.setText("Threads"); - - threadsTable = new Table(tabFolder, SWT.FULL_SELECTION); - threadsTable.addFocusListener(focus); - tbtmThreads.setControl(threadsTable); - threadsTable.setFont(SWTResourceManager.getFont("Courier New", 8, SWT.NORMAL)); - threadsTable.setHeaderVisible(true); - - TableColumn tblclmnThreadAddress = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadAddress.setWidth(72); - tblclmnThreadAddress.setText("Address"); - - TableColumn tblclmnThreadLimit = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadLimit.setWidth(72); - tblclmnThreadLimit.setText("StkLimit"); - - TableColumn tblclmnThreadStack = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadStack.setWidth(72); - tblclmnThreadStack.setText("Stack"); - - TableColumn tblclmnThreadUsed = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadUsed.setWidth(72); - tblclmnThreadUsed.setText("StkUnused"); - - TableColumn tblclmnThreadName = new TableColumn(threadsTable, SWT.LEFT); - tblclmnThreadName.setWidth(144); - tblclmnThreadName.setText("Name"); - - TableColumn tblclmnThreadState = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadState.setWidth(72); - tblclmnThreadState.setText("State"); - - TableColumn tblclmnThreadFlags = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadFlags.setWidth(40); - tblclmnThreadFlags.setText("Flgs"); - - TableColumn tblclmnThreadPriority = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadPriority.setWidth(40); - tblclmnThreadPriority.setText("Prio"); - - TableColumn tblclmnThreadRefs = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadRefs.setWidth(40); - tblclmnThreadRefs.setText("Refs"); - - TableColumn tblclmnThreadTime = new TableColumn(threadsTable, SWT.RIGHT); - tblclmnThreadTime.setWidth(64); - tblclmnThreadTime.setText("Time"); - - TableColumn tblclmnThreadShared = new TableColumn(threadsTable, SWT.LEFT); - tblclmnThreadShared.setWidth(72); - tblclmnThreadShared.setText("Obj/Msg"); - - tbtmTimers = new CTabItem(tabFolder, SWT.NONE); - tbtmTimers.setText("Timers"); - - timersTable = new Table(tabFolder, SWT.FULL_SELECTION); - timersTable.addFocusListener(focus); - tbtmTimers.setControl(timersTable); - timersTable.setFont(SWTResourceManager.getFont("Courier New", 8, SWT.NORMAL)); - timersTable.setHeaderVisible(true); - - TableColumn tblclmnTimerAddress = new TableColumn(timersTable, SWT.RIGHT); - tblclmnTimerAddress.setWidth(72); - tblclmnTimerAddress.setText("Address"); - - TableColumn tblclmnTimerTime = new TableColumn(timersTable, SWT.RIGHT); - tblclmnTimerTime.setWidth(72); - tblclmnTimerTime.setText("Time"); - - TableColumn tblclmnTimerDelta = new TableColumn(timersTable, SWT.RIGHT); - tblclmnTimerDelta.setWidth(72); - tblclmnTimerDelta.setText("Delta"); - - TableColumn tblclmnTimerCallback = new TableColumn(timersTable, SWT.RIGHT); - tblclmnTimerCallback.setWidth(72); - tblclmnTimerCallback.setText("Callback"); - - TableColumn tblclmnTimerParameter = new TableColumn(timersTable, SWT.LEFT); - tblclmnTimerParameter.setWidth(72); - tblclmnTimerParameter.setText("Param"); - - tbtmTraceBuffer = new CTabItem(tabFolder, SWT.NONE); - tbtmTraceBuffer.setText("TraceBuffer"); - - tbTable = new Table(tabFolder, SWT.FULL_SELECTION); - tbTable.addFocusListener(focus); - tbTable.setFont(SWTResourceManager.getFont("Courier New", 8, SWT.NORMAL)); - tbtmTraceBuffer.setControl(tbTable); - tbTable.setHeaderVisible(true); - - TableColumn tblclmnTraceBufferHidden = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferHidden.setWidth(0); - tblclmnTraceBufferHidden.setText(""); - - TableColumn tblclmnTraceBufferIndex = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferIndex.setWidth(48); - tblclmnTraceBufferIndex.setText("Event"); - - TableColumn tblclmnTraceBufferTime = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferTime.setWidth(64); - tblclmnTraceBufferTime.setText("Time"); - - TableColumn tblclmnTraceBufferPrevAddress = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferPrevAddress.setWidth(72); - tblclmnTraceBufferPrevAddress.setText("Previous"); - - TableColumn tblclmnTraceBufferPrevName = new TableColumn(tbTable, SWT.LEFT); - tblclmnTraceBufferPrevName.setWidth(144); - tblclmnTraceBufferPrevName.setText("Previous Name"); - - TableColumn tblclmnTraceBufferState = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferState.setWidth(72); - tblclmnTraceBufferState.setText("State"); - - TableColumn tblclmnTraceBufferShared = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferShared.setWidth(72); - tblclmnTraceBufferShared.setText("Obj/Msg"); - - TableColumn tblclmnTraceBufferCurrentAddress = new TableColumn(tbTable, SWT.RIGHT); - tblclmnTraceBufferCurrentAddress.setWidth(72); - tblclmnTraceBufferCurrentAddress.setText("Current"); - - TableColumn tblclmnTraceBufferCurrentName = new TableColumn(tbTable, SWT.LEFT); - tblclmnTraceBufferCurrentName.setWidth(144); - tblclmnTraceBufferCurrentName.setText("Current Name"); - - makeActions(); - hookContextMenu(); - contributeToActionBars(); - - tabFolder.setSelection(tbtmGlobal); - - DebugPlugin.getDefault().addDebugEventListener(this); - - try { - debugger = new DebugProxy(); - } catch (DebugProxyException e) {} - } - - /** - * @brief Handling events from the debugger. - */ - @Override - public void handleDebugEvents(DebugEvent[] events) { - for (DebugEvent event : events) { - switch (event.getKind()) { - case DebugEvent.CREATE: - Object source = event.getSource(); - if (source instanceof CDebugTarget) { - try { - debugger = new DebugProxy((CDebugTarget)source); - } catch (DebugProxyException e) {} - } - break; - } - } - } - - private void hookContextMenu() { - MenuManager menuMgr = new MenuManager("#PopupMenu"); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - public void menuAboutToShow(IMenuManager manager) { - ChibiView.this.fillContextMenu(manager); - } - }); - } - - private void contributeToActionBars() { - IActionBars bars = getViewSite().getActionBars(); - fillLocalPullDown(bars.getMenuManager()); - fillLocalToolBar(bars.getToolBarManager()); - } - - private void fillLocalPullDown(IMenuManager manager) { - manager.add(refreshAction); -/* manager.add(new Separator()); - manager.add(refreshAction);*/ - } - - private void fillContextMenu(IMenuManager manager) { - manager.add(refreshAction); - // Other plug-ins can contribute there actions here - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } - - private void fillLocalToolBar(IToolBarManager manager) { - manager.add(refreshAction); - } - - private void fillGlobalTable() { - LinkedHashMap lhm; - - // If the debugger is not yet present then do nothing. - if (debugger == null) - return; - - // Reading the list of global variables, null can be returned if the debugger - // does not respond. - try { - lhm = debugger.readGlobalVariables(); - if (lhm == null) - return; - } catch (DebugProxyException e) { - showMessage("Error: " + e.getMessage() + "."); - return; - } - - globalTable.removeAll(); - - Set> set = lhm.entrySet(); - for (Entry entry : set) { - TableItem tableItem = new TableItem(globalTable, SWT.NONE); - tableItem.setText(new String[] { - "", - entry.getKey(), - entry.getValue() - }); - } - } - - private String makeHex(String s) { - try { - s = HexUtils.dword2HexString((int)HexUtils.parseNumber(s)); - } catch (Exception e) {} - return s; - } - - private void fillThreadsTable() { - LinkedHashMap> lhm; - - // If the debugger is not yet present then do nothing. - if (debugger == null) - return; - - // Reading the list of threads, null can be returned if the debugger - // does not respond. - try { - lhm = debugger.readThreads(); - if (lhm == null) - return; - } catch (DebugProxyException e) { - showMessage("Error: " + e.getMessage() + "."); - return; - } - - threadsTable.removeAll(); - - Set>> set = lhm.entrySet(); - for (Entry> entry : set) { - HashMap map = entry.getValue(); - TableItem tableItem = new TableItem(threadsTable, SWT.NONE); - tableItem.setText(new String[] { - makeHex(entry.getKey()), - makeHex(map.get("stklimit")), - makeHex(map.get("stack")), - map.get("stkunused"), - map.get("name"), - map.get("state_s"), - HexUtils.byte2HexString((int)HexUtils.parseNumber(map.get("flags"))), - map.get("prio"), - map.get("refs"), - map.get("time"), - makeHex(map.get("wtobjp")) - }); - } - } - - private void fillTimersTable() { - LinkedHashMap> lhm; - - // If the debugger is not yet present then do nothing. - if (debugger == null) - return; - - // Reading the list of threads, null can be returned if the debugger - // does not respond. - try { - lhm = debugger.readTimers(); - if (lhm == null) - return; - } catch (DebugProxyException e) { - showMessage("Error: " + e.getMessage() + "."); - return; - } - - timersTable.removeAll(); - - Set>> set = lhm.entrySet(); - long time = 0; - for (Entry> entry : set) { - HashMap map = entry.getValue(); - time = time + HexUtils.parseNumber(map.get("delta")); - TableItem tableItem = new TableItem(timersTable, SWT.NONE); - tableItem.setText(new String[] { - makeHex(entry.getKey()), - Long.toString(time), - "+" + HexUtils.parseNumber(map.get("delta")), - makeHex(map.get("func")), - makeHex(map.get("par")) - }); - } - } - - private void fillTraceBufferTable() { - LinkedHashMap> lhm, lhmthreads; - - // If the debugger is not yet present then do nothing. - if (debugger == null) - return; - - // Read active threads for retrieving names. - try { - lhmthreads = debugger.readThreads(); - if (lhmthreads == null) - return; - } catch (DebugProxyException e) { - lhmthreads = new LinkedHashMap>(0); - } - - // Reading the list of threads, null can be returned if the debugger - // does not respond. - try { - lhm = debugger.readTraceBuffer(); - if (lhm == null) - return; - } catch (DebugProxyException e) { - showMessage("Error: " + e.getMessage() + "."); - return; - } - - tbTable.removeAll(); - - Set>> set = lhm.entrySet(); - String prev = ""; - String prevname = ""; - for (Entry> entry : set) { - HashMap map = entry.getValue(); - TableItem tableItem = new TableItem(tbTable, SWT.NONE); - - // Searches the current thread into the threads map. - String currentaddr = map.get("tp"); - HashMap thread = lhmthreads.get(currentaddr); - String currentname; - if (thread != null) - currentname = thread.get("name"); - else - currentname = ""; - - String current = makeHex(currentaddr); - tableItem.setText(new String[] { - "", - entry.getKey(), - map.get("time"), - prev, - prevname, - map.get("state_s"), - makeHex(map.get("wtobjp")), - current, - currentname - }); - prev = current; - prevname = currentname; - } - } - - private void makeActions() { - - // Refresh action. - refreshAction = new Action() { - public void run() { - CTabItem tabitem = tabFolder.getSelection(); - if (tabitem == null) - return; - if (tabitem == tbtmGlobal) - fillGlobalTable(); - else if (tabitem == tbtmThreads) - fillThreadsTable(); - else if (tabitem == tbtmTimers) - fillTimersTable(); - else if (tabitem == tbtmTraceBuffer) - fillTraceBufferTable(); - } - }; - refreshAction.setDisabledImageDescriptor(ResourceManager.getPluginImageDescriptor("org.eclipse.cdt.ui", "/icons/dlcl16/refresh_nav.gif")); - refreshAction.setImageDescriptor(ResourceManager.getPluginImageDescriptor("org.eclipse.cdt.ui", "/icons/elcl16/refresh_nav.gif")); - refreshAction.setText("Refresh"); - refreshAction.setToolTipText("Refresh timers list"); - } - - private void showMessage(String message) { - MessageDialog.openInformation(tabFolder.getShell(), - "ChibiOS/RT Views", message); - } - - /** - * Passing the focus request to the viewer's control. - */ - public void setFocus() { - tabFolder.setFocus(); - } -} diff --git a/tools/eclipse/debug_support/src/org/eclipse/wb/swt/ResourceManager.java b/tools/eclipse/debug_support/src/org/eclipse/wb/swt/ResourceManager.java deleted file mode 100644 index 4bfbc6b6ef..0000000000 --- a/tools/eclipse/debug_support/src/org/eclipse/wb/swt/ResourceManager.java +++ /dev/null @@ -1,415 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Google, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Google, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.wb.swt; - -import java.io.File; -import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.resource.CompositeImageDescriptor; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.osgi.framework.Bundle; - -/** - * Utility class for managing OS resources associated with SWT/JFace controls such as colors, fonts, images, - * etc. - * - * !!! IMPORTANT !!! Application code must explicitly invoke the dispose() method to release the - * operating system resources managed by cached objects when those objects and OS resources are no longer - * needed (e.g. on application shutdown) - * - * This class may be freely distributed as part of any application or plugin. - *

    - * - * @author scheglov_ke - * @author Dan Rubel - */ -public class ResourceManager extends SWTResourceManager { - //////////////////////////////////////////////////////////////////////////// - // - // Image - // - //////////////////////////////////////////////////////////////////////////// - private static Map m_descriptorImageMap = new HashMap(); - /** - * Returns an {@link ImageDescriptor} stored in the file at the specified path relative to the specified - * class. - * - * @param clazz - * the {@link Class} relative to which to find the image descriptor. - * @param path - * the path to the image file. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - */ - public static ImageDescriptor getImageDescriptor(Class clazz, String path) { - return ImageDescriptor.createFromFile(clazz, path); - } - /** - * Returns an {@link ImageDescriptor} stored in the file at the specified path. - * - * @param path - * the path to the image file. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - */ - public static ImageDescriptor getImageDescriptor(String path) { - try { - return ImageDescriptor.createFromURL(new File(path).toURI().toURL()); - } catch (MalformedURLException e) { - return null; - } - } - /** - * Returns an {@link Image} based on the specified {@link ImageDescriptor}. - * - * @param descriptor - * the {@link ImageDescriptor} for the {@link Image}. - * @return the {@link Image} based on the specified {@link ImageDescriptor}. - */ - public static Image getImage(ImageDescriptor descriptor) { - if (descriptor == null) { - return null; - } - Image image = m_descriptorImageMap.get(descriptor); - if (image == null) { - image = descriptor.createImage(); - m_descriptorImageMap.put(descriptor, image); - } - return image; - } - /** - * Maps images to decorated images. - */ - @SuppressWarnings("unchecked") - private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; - /** - * Returns an {@link Image} composed of a base image decorated by another image. - * - * @param baseImage - * the base {@link Image} that should be decorated. - * @param decorator - * the {@link Image} to decorate the base image. - * @return {@link Image} The resulting decorated image. - */ - public static Image decorateImage(Image baseImage, Image decorator) { - return decorateImage(baseImage, decorator, BOTTOM_RIGHT); - } - /** - * Returns an {@link Image} composed of a base image decorated by another image. - * - * @param baseImage - * the base {@link Image} that should be decorated. - * @param decorator - * the {@link Image} to decorate the base image. - * @param corner - * the corner to place decorator image. - * @return the resulting decorated {@link Image}. - */ - public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { - if (corner <= 0 || corner >= LAST_CORNER_KEY) { - throw new IllegalArgumentException("Wrong decorate corner"); - } - Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; - if (cornerDecoratedImageMap == null) { - cornerDecoratedImageMap = new HashMap>(); - m_decoratedImageMap[corner] = cornerDecoratedImageMap; - } - Map decoratedMap = cornerDecoratedImageMap.get(baseImage); - if (decoratedMap == null) { - decoratedMap = new HashMap(); - cornerDecoratedImageMap.put(baseImage, decoratedMap); - } - // - Image result = decoratedMap.get(decorator); - if (result == null) { - final Rectangle bib = baseImage.getBounds(); - final Rectangle dib = decorator.getBounds(); - final Point baseImageSize = new Point(bib.width, bib.height); - CompositeImageDescriptor compositImageDesc = new CompositeImageDescriptor() { - @Override - protected void drawCompositeImage(int width, int height) { - drawImage(baseImage.getImageData(), 0, 0); - if (corner == TOP_LEFT) { - drawImage(decorator.getImageData(), 0, 0); - } else if (corner == TOP_RIGHT) { - drawImage(decorator.getImageData(), bib.width - dib.width, 0); - } else if (corner == BOTTOM_LEFT) { - drawImage(decorator.getImageData(), 0, bib.height - dib.height); - } else if (corner == BOTTOM_RIGHT) { - drawImage(decorator.getImageData(), bib.width - dib.width, bib.height - dib.height); - } - } - @Override - protected Point getSize() { - return baseImageSize; - } - }; - // - result = compositImageDesc.createImage(); - decoratedMap.put(decorator, result); - } - return result; - } - /** - * Dispose all of the cached images. - */ - public static void disposeImages() { - SWTResourceManager.disposeImages(); - // dispose ImageDescriptor images - { - for (Iterator I = m_descriptorImageMap.values().iterator(); I.hasNext();) { - I.next().dispose(); - } - m_descriptorImageMap.clear(); - } - // dispose decorated images - for (int i = 0; i < m_decoratedImageMap.length; i++) { - Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; - if (cornerDecoratedImageMap != null) { - for (Map decoratedMap : cornerDecoratedImageMap.values()) { - for (Image image : decoratedMap.values()) { - image.dispose(); - } - decoratedMap.clear(); - } - cornerDecoratedImageMap.clear(); - } - } - // dispose plugin images - { - for (Iterator I = m_URLImageMap.values().iterator(); I.hasNext();) { - I.next().dispose(); - } - m_URLImageMap.clear(); - } - } - //////////////////////////////////////////////////////////////////////////// - // - // Plugin images support - // - //////////////////////////////////////////////////////////////////////////// - /** - * Maps URL to images. - */ - private static Map m_URLImageMap = new HashMap(); - /** - * Provider for plugin resources, used by WindowBuilder at design time. - */ - public interface PluginResourceProvider { - URL getEntry(String symbolicName, String path); - } - /** - * Instance of {@link PluginResourceProvider}, used by WindowBuilder at design time. - */ - private static PluginResourceProvider m_designTimePluginResourceProvider = null; - /** - * Returns an {@link Image} based on a plugin and file path. - * - * @param plugin - * the plugin {@link Object} containing the image - * @param name - * the path to the image within the plugin - * @return the {@link Image} stored in the file at the specified path - * - * @deprecated Use {@link #getPluginImage(String, String)} instead. - */ - @Deprecated - public static Image getPluginImage(Object plugin, String name) { - try { - URL url = getPluginImageURL(plugin, name); - if (url != null) { - return getPluginImageFromUrl(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - /** - * Returns an {@link Image} based on a {@link Bundle} and resource entry path. - * - * @param symbolicName - * the symbolic name of the {@link Bundle}. - * @param path - * the path of the resource entry. - * @return the {@link Image} stored in the file at the specified path. - */ - public static Image getPluginImage(String symbolicName, String path) { - try { - URL url = getPluginImageURL(symbolicName, path); - if (url != null) { - return getPluginImageFromUrl(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - /** - * Returns an {@link Image} based on given {@link URL}. - */ - private static Image getPluginImageFromUrl(URL url) { - try { - try { - String key = url.toExternalForm(); - Image image = m_URLImageMap.get(key); - if (image == null) { - InputStream stream = url.openStream(); - try { - image = getImage(stream); - m_URLImageMap.put(key, image); - } finally { - stream.close(); - } - } - return image; - } catch (Throwable e) { - // Ignore any exceptions - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - /** - * Returns an {@link ImageDescriptor} based on a plugin and file path. - * - * @param plugin - * the plugin {@link Object} containing the image. - * @param name - * the path to th eimage within the plugin. - * @return the {@link ImageDescriptor} stored in the file at the specified path. - * - * @deprecated Use {@link #getPluginImageDescriptor(String, String)} instead. - */ - @Deprecated - public static ImageDescriptor getPluginImageDescriptor(Object plugin, String name) { - try { - try { - URL url = getPluginImageURL(plugin, name); - return ImageDescriptor.createFromURL(url); - } catch (Throwable e) { - // Ignore any exceptions - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - /** - * Returns an {@link ImageDescriptor} based on a {@link Bundle} and resource entry path. - * - * @param symbolicName - * the symbolic name of the {@link Bundle}. - * @param path - * the path of the resource entry. - * @return the {@link ImageDescriptor} based on a {@link Bundle} and resource entry path. - */ - public static ImageDescriptor getPluginImageDescriptor(String symbolicName, String path) { - try { - URL url = getPluginImageURL(symbolicName, path); - if (url != null) { - return ImageDescriptor.createFromURL(url); - } - } catch (Throwable e) { - // Ignore any exceptions - } - return null; - } - /** - * Returns an {@link URL} based on a {@link Bundle} and resource entry path. - */ - private static URL getPluginImageURL(String symbolicName, String path) { - // try runtime plugins - { - Bundle bundle = Platform.getBundle(symbolicName); - if (bundle != null) { - return bundle.getEntry(path); - } - } - // try design time provider - if (m_designTimePluginResourceProvider != null) { - return m_designTimePluginResourceProvider.getEntry(symbolicName, path); - } - // no such resource - return null; - } - /** - * Returns an {@link URL} based on a plugin and file path. - * - * @param plugin - * the plugin {@link Object} containing the file path. - * @param name - * the file path. - * @return the {@link URL} representing the file at the specified path. - * @throws Exception - */ - private static URL getPluginImageURL(Object plugin, String name) throws Exception { - // try to work with 'plugin' as with OSGI BundleContext - try { - Class BundleClass = Class.forName("org.osgi.framework.Bundle"); //$NON-NLS-1$ - Class BundleContextClass = Class.forName("org.osgi.framework.BundleContext"); //$NON-NLS-1$ - if (BundleContextClass.isAssignableFrom(plugin.getClass())) { - Method getBundleMethod = BundleContextClass.getMethod("getBundle", new Class[0]); //$NON-NLS-1$ - Object bundle = getBundleMethod.invoke(plugin, new Object[0]); - // - Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ - Constructor pathConstructor = PathClass.getConstructor(new Class[]{String.class}); - Object path = pathConstructor.newInstance(new Object[]{name}); - // - Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ - Class PlatformClass = Class.forName("org.eclipse.core.runtime.Platform"); //$NON-NLS-1$ - Method findMethod = PlatformClass.getMethod("find", new Class[]{BundleClass, IPathClass}); //$NON-NLS-1$ - return (URL) findMethod.invoke(null, new Object[]{bundle, path}); - } - } catch (Throwable e) { - // Ignore any exceptions - } - // else work with 'plugin' as with usual Eclipse plugin - { - Class PluginClass = Class.forName("org.eclipse.core.runtime.Plugin"); //$NON-NLS-1$ - if (PluginClass.isAssignableFrom(plugin.getClass())) { - // - Class PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$ - Constructor pathConstructor = PathClass.getConstructor(new Class[]{String.class}); - Object path = pathConstructor.newInstance(new Object[]{name}); - // - Class IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$ - Method findMethod = PluginClass.getMethod("find", new Class[]{IPathClass}); //$NON-NLS-1$ - return (URL) findMethod.invoke(plugin, new Object[]{path}); - } - } - return null; - } - //////////////////////////////////////////////////////////////////////////// - // - // General - // - //////////////////////////////////////////////////////////////////////////// - /** - * Dispose of cached objects and their underlying OS resources. This should only be called when the cached - * objects are no longer needed (e.g. on application shutdown). - */ - public static void dispose() { - disposeColors(); - disposeFonts(); - disposeImages(); - } -} \ No newline at end of file diff --git a/tools/eclipse/debug_support/src/org/eclipse/wb/swt/SWTResourceManager.java b/tools/eclipse/debug_support/src/org/eclipse/wb/swt/SWTResourceManager.java deleted file mode 100644 index 8b6d4cc3ff..0000000000 --- a/tools/eclipse/debug_support/src/org/eclipse/wb/swt/SWTResourceManager.java +++ /dev/null @@ -1,447 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Google, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Google, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.wb.swt; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Display; - -/** - * Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc. - *

    - * !!! IMPORTANT !!! Application code must explicitly invoke the dispose() method to release the - * operating system resources managed by cached objects when those objects and OS resources are no longer - * needed (e.g. on application shutdown) - *

    - * This class may be freely distributed as part of any application or plugin. - *

    - * @author scheglov_ke - * @author Dan Rubel - */ -public class SWTResourceManager { - //////////////////////////////////////////////////////////////////////////// - // - // Color - // - //////////////////////////////////////////////////////////////////////////// - private static Map m_colorMap = new HashMap(); - /** - * Returns the system {@link Color} matching the specific ID. - * - * @param systemColorID - * the ID value for the color - * @return the system {@link Color} matching the specific ID - */ - public static Color getColor(int systemColorID) { - Display display = Display.getCurrent(); - return display.getSystemColor(systemColorID); - } - /** - * Returns a {@link Color} given its red, green and blue component values. - * - * @param r - * the red component of the color - * @param g - * the green component of the color - * @param b - * the blue component of the color - * @return the {@link Color} matching the given red, green and blue component values - */ - public static Color getColor(int r, int g, int b) { - return getColor(new RGB(r, g, b)); - } - /** - * Returns a {@link Color} given its RGB value. - * - * @param rgb - * the {@link RGB} value of the color - * @return the {@link Color} matching the RGB value - */ - public static Color getColor(RGB rgb) { - Color color = m_colorMap.get(rgb); - if (color == null) { - Display display = Display.getCurrent(); - color = new Color(display, rgb); - m_colorMap.put(rgb, color); - } - return color; - } - /** - * Dispose of all the cached {@link Color}'s. - */ - public static void disposeColors() { - for (Color color : m_colorMap.values()) { - color.dispose(); - } - m_colorMap.clear(); - } - //////////////////////////////////////////////////////////////////////////// - // - // Image - // - //////////////////////////////////////////////////////////////////////////// - /** - * Maps image paths to images. - */ - private static Map m_imageMap = new HashMap(); - /** - * Returns an {@link Image} encoded by the specified {@link InputStream}. - * - * @param stream - * the {@link InputStream} encoding the image data - * @return the {@link Image} encoded by the specified input stream - */ - protected static Image getImage(InputStream stream) throws IOException { - try { - Display display = Display.getCurrent(); - ImageData data = new ImageData(stream); - if (data.transparentPixel > 0) { - return new Image(display, data, data.getTransparencyMask()); - } - return new Image(display, data); - } finally { - stream.close(); - } - } - /** - * Returns an {@link Image} stored in the file at the specified path. - * - * @param path - * the path to the image file - * @return the {@link Image} stored in the file at the specified path - */ - public static Image getImage(String path) { - Image image = m_imageMap.get(path); - if (image == null) { - try { - image = getImage(new FileInputStream(path)); - m_imageMap.put(path, image); - } catch (Exception e) { - image = getMissingImage(); - m_imageMap.put(path, image); - } - } - return image; - } - /** - * Returns an {@link Image} stored in the file at the specified path relative to the specified class. - * - * @param clazz - * the {@link Class} relative to which to find the image - * @param path - * the path to the image file, if starts with '/' - * @return the {@link Image} stored in the file at the specified path - */ - public static Image getImage(Class clazz, String path) { - String key = clazz.getName() + '|' + path; - Image image = m_imageMap.get(key); - if (image == null) { - try { - image = getImage(clazz.getResourceAsStream(path)); - m_imageMap.put(key, image); - } catch (Exception e) { - image = getMissingImage(); - m_imageMap.put(key, image); - } - } - return image; - } - private static final int MISSING_IMAGE_SIZE = 10; - /** - * @return the small {@link Image} that can be used as placeholder for missing image. - */ - private static Image getMissingImage() { - Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); - // - GC gc = new GC(image); - gc.setBackground(getColor(SWT.COLOR_RED)); - gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE); - gc.dispose(); - // - return image; - } - /** - * Style constant for placing decorator image in top left corner of base image. - */ - public static final int TOP_LEFT = 1; - /** - * Style constant for placing decorator image in top right corner of base image. - */ - public static final int TOP_RIGHT = 2; - /** - * Style constant for placing decorator image in bottom left corner of base image. - */ - public static final int BOTTOM_LEFT = 3; - /** - * Style constant for placing decorator image in bottom right corner of base image. - */ - public static final int BOTTOM_RIGHT = 4; - /** - * Internal value. - */ - protected static final int LAST_CORNER_KEY = 5; - /** - * Maps images to decorated images. - */ - @SuppressWarnings("unchecked") - private static Map>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY]; - /** - * Returns an {@link Image} composed of a base image decorated by another image. - * - * @param baseImage - * the base {@link Image} that should be decorated - * @param decorator - * the {@link Image} to decorate the base image - * @return {@link Image} The resulting decorated image - */ - public static Image decorateImage(Image baseImage, Image decorator) { - return decorateImage(baseImage, decorator, BOTTOM_RIGHT); - } - /** - * Returns an {@link Image} composed of a base image decorated by another image. - * - * @param baseImage - * the base {@link Image} that should be decorated - * @param decorator - * the {@link Image} to decorate the base image - * @param corner - * the corner to place decorator image - * @return the resulting decorated {@link Image} - */ - public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) { - if (corner <= 0 || corner >= LAST_CORNER_KEY) { - throw new IllegalArgumentException("Wrong decorate corner"); - } - Map> cornerDecoratedImageMap = m_decoratedImageMap[corner]; - if (cornerDecoratedImageMap == null) { - cornerDecoratedImageMap = new HashMap>(); - m_decoratedImageMap[corner] = cornerDecoratedImageMap; - } - Map decoratedMap = cornerDecoratedImageMap.get(baseImage); - if (decoratedMap == null) { - decoratedMap = new HashMap(); - cornerDecoratedImageMap.put(baseImage, decoratedMap); - } - // - Image result = decoratedMap.get(decorator); - if (result == null) { - Rectangle bib = baseImage.getBounds(); - Rectangle dib = decorator.getBounds(); - // - result = new Image(Display.getCurrent(), bib.width, bib.height); - // - GC gc = new GC(result); - gc.drawImage(baseImage, 0, 0); - if (corner == TOP_LEFT) { - gc.drawImage(decorator, 0, 0); - } else if (corner == TOP_RIGHT) { - gc.drawImage(decorator, bib.width - dib.width, 0); - } else if (corner == BOTTOM_LEFT) { - gc.drawImage(decorator, 0, bib.height - dib.height); - } else if (corner == BOTTOM_RIGHT) { - gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height); - } - gc.dispose(); - // - decoratedMap.put(decorator, result); - } - return result; - } - /** - * Dispose all of the cached {@link Image}'s. - */ - public static void disposeImages() { - // dispose loaded images - { - for (Image image : m_imageMap.values()) { - image.dispose(); - } - m_imageMap.clear(); - } - // dispose decorated images - for (int i = 0; i < m_decoratedImageMap.length; i++) { - Map> cornerDecoratedImageMap = m_decoratedImageMap[i]; - if (cornerDecoratedImageMap != null) { - for (Map decoratedMap : cornerDecoratedImageMap.values()) { - for (Image image : decoratedMap.values()) { - image.dispose(); - } - decoratedMap.clear(); - } - cornerDecoratedImageMap.clear(); - } - } - } - //////////////////////////////////////////////////////////////////////////// - // - // Font - // - //////////////////////////////////////////////////////////////////////////// - /** - * Maps font names to fonts. - */ - private static Map m_fontMap = new HashMap(); - /** - * Maps fonts to their bold versions. - */ - private static Map m_fontToBoldFontMap = new HashMap(); - /** - * Returns a {@link Font} based on its name, height and style. - * - * @param name - * the name of the font - * @param height - * the height of the font - * @param style - * the style of the font - * @return {@link Font} The font matching the name, height and style - */ - public static Font getFont(String name, int height, int style) { - return getFont(name, height, style, false, false); - } - /** - * Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline - * flags are also supported. - * - * @param name - * the name of the font - * @param size - * the size of the font - * @param style - * the style of the font - * @param strikeout - * the strikeout flag (warning: Windows only) - * @param underline - * the underline flag (warning: Windows only) - * @return {@link Font} The font matching the name, height, style, strikeout and underline - */ - public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) { - String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline; - Font font = m_fontMap.get(fontName); - if (font == null) { - FontData fontData = new FontData(name, size, style); - if (strikeout || underline) { - try { - Class logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$ - Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$ - if (logFont != null && logFontClass != null) { - if (strikeout) { - logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ - } - if (underline) { - logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$ - } - } - } catch (Throwable e) { - System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - font = new Font(Display.getCurrent(), fontData); - m_fontMap.put(fontName, font); - } - return font; - } - /** - * Returns a bold version of the given {@link Font}. - * - * @param baseFont - * the {@link Font} for which a bold version is desired - * @return the bold version of the given {@link Font} - */ - public static Font getBoldFont(Font baseFont) { - Font font = m_fontToBoldFontMap.get(baseFont); - if (font == null) { - FontData fontDatas[] = baseFont.getFontData(); - FontData data = fontDatas[0]; - font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD); - m_fontToBoldFontMap.put(baseFont, font); - } - return font; - } - /** - * Dispose all of the cached {@link Font}'s. - */ - public static void disposeFonts() { - // clear fonts - for (Font font : m_fontMap.values()) { - font.dispose(); - } - m_fontMap.clear(); - // clear bold fonts - for (Font font : m_fontToBoldFontMap.values()) { - font.dispose(); - } - m_fontToBoldFontMap.clear(); - } - //////////////////////////////////////////////////////////////////////////// - // - // Cursor - // - //////////////////////////////////////////////////////////////////////////// - /** - * Maps IDs to cursors. - */ - private static Map m_idToCursorMap = new HashMap(); - /** - * Returns the system cursor matching the specific ID. - * - * @param id - * int The ID value for the cursor - * @return Cursor The system cursor matching the specific ID - */ - public static Cursor getCursor(int id) { - Integer key = Integer.valueOf(id); - Cursor cursor = m_idToCursorMap.get(key); - if (cursor == null) { - cursor = new Cursor(Display.getDefault(), id); - m_idToCursorMap.put(key, cursor); - } - return cursor; - } - /** - * Dispose all of the cached cursors. - */ - public static void disposeCursors() { - for (Cursor cursor : m_idToCursorMap.values()) { - cursor.dispose(); - } - m_idToCursorMap.clear(); - } - //////////////////////////////////////////////////////////////////////////// - // - // General - // - //////////////////////////////////////////////////////////////////////////// - /** - * Dispose of cached objects and their underlying OS resources. This should only be called when the cached - * objects are no longer needed (e.g. on application shutdown). - */ - public static void dispose() { - disposeColors(); - disposeImages(); - disposeFonts(); - disposeCursors(); - } -} \ No newline at end of file diff --git a/tools/eclipse/plugins/org.chibios.tools.eclipse.config_1.1.0.jar b/tools/eclipse/plugins/org.chibios.tools.eclipse.config_1.1.0.jar deleted file mode 100644 index 31587f2145e9a65748f8f05126251c45b79beb4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1851193 zcmb?_#{K&(yHMC`{MUO zCZ7d={~UrD&QSpL;e8hJod3dAW||25K855a(2nkAlt@N8WA8JKLbrE?Uv09L;v!8- z-lISukf+Gdlkb3UU5;xqk8Y7AuF#OM#*!QUR@n|%OLMwx-@2?1NgS>!=Kqm^MLTI9 zORjdKN@he8oA_3X52~8D6Tqmirt2o+B_w!sxXWyGdsQR11lP|56-4+SVF&uRu>Vtn zfDrx+jP32rEY0=ZEIkdKOc?(Y`>)xA_=C0l19tu!4A>uxjiu2)A^uAAKhO9V!rsaJ zZxC?*jxe^cG_th+=h^<%7s|gN0rvJbe}~8UZ}FzaHkJ;~rhmhT_;2n05x>7Nr}>|l zTNv7z*qA!~9ev9Gi60k$<=@7D`hVi&A6oclF8?ZqKN}v%$<*22#mU(8?{LWf1!rz* zXKeP*x&K$U=>Hx3zY6MKP4NCZ69*^zKfIjn|4Tgo)spo8VQFOlXG8qm;^_Zp4x9nD ztSn|s?(YAjk$>gF`Ty$*U~21NV+i=$;QxQ|WBcFZ_m`{xZGJY)|7-mI&DH;eAJ%`D z6lY@#Q(MEoNhRUmSp7dG^>@a`_O`b6c7HQ7`QOa^@5cY8#lLa!-)=y6TbuuD@{gmt zC2o)V`=4Vw^v~}c|Ie)d^$Za<23Wcp0_>d_jBN~^or@E76i|iHM!rCcWzImf!9-OV zV4B4`Ze9bKHwPElg2V4qWYbPqTDNS?%mbdwJNXQ}uR)&+qRmUt>u3a?8@#47zTT&8 zyM4ZH(R)QU-DXFa_C}OcAUY&&@in}*BWn+cSL&VO4K>5ncA*86FGStT@7E1+Mn`ol z$+R8yuT)!X{E1uCHaxVpHmhq`(X1ff?8*Eib&ywBxtPDpv}YTDU%@)S(HaTi#E@ppoe+rA(Ti(IMM1 z56%Nl762{YDzVD;C(!>WSN}7*7LIS1^e}7`}yTJaaBwE^~v{fbr$KTukrEGe!4Tm>gU(< z`SrBblGfPWmHlzHu;=F|(AhJ0v*$W9qQg&U_vq_Y|29z#t#5a4tGWF4c@f1)S<$_@ z^ZaOX@k;J+|_|^|P9hVCRGZ?wAH{yUj{m!O+1?_<9YSx(i&m^vPbJ-hLuV!mZo; z_4;8UOvQ^MjXXG&LOhu)xYm|-YgWCvy9uD{CFb!>)Y3>*>f7(o=E#_f6zh%3Wrp-d zv%c(@YV@pi8qOv)dz)$+g>agvIJ$^9Pwy{1kMFzP|h*ctD2o z=%V4^=HPgU5UAv_R#(_WIoY|vU)bH)cqOo(>sz(kz+E}GnKIfMU(=c17r)TH}g_ z%M1ckYe?MEa#7uacYv{Zgl*U*A-N#Ip`L~+$FR{cV=%}Lr0}0idj%GRLGIfH@R~0P-=lN4b1QNkfmz7y2mZYp%120al zD)1iHF3)0Ep?@?*PM>5K;sa(rTEAL4yE%Fs=!mXA=q0(x`C#Pn?^{U&DP@T!72!1S z^rKbd`_QJzy2-ZDtUzX{E}8jS488#rh-81|^(PHy5y$tj2QkICVOZiALVV$UdU$Jr zXnAvQdJNJjr|#hy?eHlRR9}%e0Xsq)V%OUzSOAxYH_N(17l$i;qb{gLq9d*;s3A$i zt|8L6*0@=TuNeI(Bef%1gkDyBofFz1QWmiz!Wo6w7$N+!2p@%?WRrYeOpw^~+jH_N_l+}3+WU(j zN)H6&=6!npOb;cTkH-ot{o8o<`16I=%Whc0o8#S_ouP-RMB@Xu`ESeWyWPF9iAIIx z{ehJWz;UL_rqf2T-Sk=OWrtz6()rSa3rdt1gR}FZ@8=JXm17SRXRoQ6Zk~$GHfS60TR-LXlW`x8cm10fwWQRbG+9r!SF1MB=_N=!bEBjE*n47Hjiz=Ao&+yu z2q_s6d?({ze}97f*T2Qn_EEpz9|?H=dH-r9{vm-sHL9u8pTg=d4FG!rhkQy%iF0uq zA^{-*Edc>Nzr36Kl)FVY-9EfMJiWcVzCXXbIfm8yB)0jdbOfb$MdtRq1!sk2_nJ6I zn>a@$6pz??CAtP@x&>$Y#}o#{6zrZn-#xyW0HTeZqf7u%HeQKtA(^2`r8_6j+s98& zFYm^GJ^`Y3PoH;BpKc%DF7IC-p5Hdkp1OAKGc)5eGvYEc;&ZZM@^hkcvSPC`;@WFG z3UZ=GnjD83orZoo_cs9g8(g|;-8!m0c1PnD8!XqmyuZG_{w(m%L;M2vXSMu5bbk&0 zS`!dNT5qm{Bpr#dSUAK8{B*Q5Ote)s7zCuG7%bw=t&8;HLnE|wG&IA) zK)nB%uD{CV_>H@K_dmOJ1@tfG|B)_d!#{QKza{HG|L)Jzy}MRN?q&l`g8H93*-uCB zHM~2yUps5wZ;RvRjJcgR4p5zdQ`hE+&GBQ8JL?&`3+{TS?dh6L{EZU+TIsAN*Tc1n zY-r>|R9(45nZiTx)uUH#^4d%X_U$h7p{k(UO}&6eQ{hW&wY5eN{zSK$w)gk34auiN zs@h?w+VOqdPl7c^!R69QVz-IRp|CXi^<68~eOr}FLp8MX`FJcY=KdC|v-Tw9+%0AS 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±iWK{+4^ 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

    {}ZOsobg^ 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 R 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

    P&!Z(IWB&B0tE1A)o~&o)x3W6J zPM=>JqW8lq1H)cV#oG`wAniHhZJ*=3qPv^$`-mt=OE;k4&yRPRgD7Y7~oI|3bk+xvqy()HhKqUF;f z=%$LC9`o4Ud4H9OZweb#^evmuWp>ur3N{wk*16AHIGUSb8dp(;AC!$&bHeAG0TglN zDb@%R4s3GfIi4K48Lp=y`s>M5nu1}h5h+ZPN^^M9y?T&F4l(Ow|Awlh+BuaX6yu!OMMzeLOxcT6aBA}8K(QC ztpzTnTz8D69`xv^T~$eVHKXLpO1uoJF1kWGW)$6W1C&<5D{EnO-0)#SV3)5*+&W)Z zh0MNSB5k7QSyC(OTR zpieTv9gNWDJ!BODV?gJLWECHHN``!JN~_jNtEEg@`lfiEh3KG?h6 zAh!-cU7En#wm>%$eVx#^+fbgZK->0#FBE+~u)E#px7!GwHw9nEei86D%+j8QaswYG zDBCBjeY|XM)ty<9fiTlcXBqK^^#hpU;2veC(grqPd@SYM`_C{G7; z9|;n0xl5T?AKFpB!SDkr#D1(a$^S4QNq@3w_|;J_l*H)P0Cvv`=vEBb5xRWlJVL?G zxl9E@fu5zMXPSmx9X!uLpDOtqe>Jj_Zve;}h=)op;*SAFrOv0EE<)yaJF zL#G<$KiFnG&3wH1tCfayhz&5&-DR}#Nr#9&&J%Rlr2m}zoM!6-uDSu04h9)kwX4%{ zQOD#RUVcUG3Y?te+0||j;bISTTV2fae43m&sM8MsSJxu19tQ_$Hbx;TPrN=POepknZ}rht9=ml*Ve1DtCt0|rxXx{FEBWganaPXK&s`K_|kqgVN|F5 zI8+DxOB?W}4__Q{P0>frK7`iAI{>c4rYNegDT)|3wn!cbZ;nhr5$dUZwsdfUYIOhL z8OGCq?!}`#nE03Azlk$jLM`RY|MdRzV*Y<;Y~9UWT>o?K+{wk!$=n5CZSG1dOHVU1 zHQUHO*SN&Wc6=m5Gd(4JHzhmS%Fe>Xw93x5z|N-1#L~dR)&#<`=_d;G@2}8&EFGb*Gd2lr9l&yJ5GQu+>BmFK8#NqyS zT7bnXBk%_52m`nk<}bZbLSQ#Y5ACjxK%gJUGprS+Q%)c#hy$jRQr`>sCUJpiUoOFS z5MKb*E(34`*e3mMeIOz9gAZ7zW}hEH&yFNzj1J`ksEF4bm7$W3v0A#uAxTM!}2ZGA?KJtmd`>XgZ^vO zDasU9vuMLUAkEeX!9qkdCMh8yp|U`t^s4>_KxC;%I*v`HaXOAeC7oEa= zB`Milvr0YLxP~Pw*<8Cy=5(H66;pb*s?vKp_8Apq*(2SmzTy#9^Hh2rJ>>?o<D($VCjQ!w@g@z7Y%ckiWQDI(GXfS8cqt8oIHPm2+rLtHrdjeO=CpYWvDdEO->ly^QMN8qq|mR zLey#1b94~%6cVqiaTZq9uy3nzhEO*ab(zdmkuRsYYN*p|>-9J>SafiV*sh;vZ9e_+ z)c5;em7NDXRsa9Tuf3^|on)mllAXO}WmiVljVtcez1JQYQHheBy@g6*a^i^Su*&$v(6JdR$}E+p=_nqbP3k(%#L zYtVFs1(tk%1Y#73mqaBQKR(bjoL*0tM_7Bnr{HqDH zi=v&u9-b7%rXRKZj|>R+C-amS7Iv+cis|=<27M|1sJ&Qb{V+uw$`>h_U(Q49!@w0J zaQg}L*6o1Su@aF1=Ga0dk-^zU{+xQxO_ZykxbJ;Mbf2Pld;I3A z_UAWOE$40+cZ5w`Dt)dPS}^6gI<&!GD5WKk`zY~wo_Cp;MTscKTd%nVXlU7!JEhj< zRQSbes*}v`Rh(c$4oQ7*4C!nw4L@YnGdloDK4^`b_#{&g@~1@Z{W9b%DYV?TFAg6Rd^OiaDRrBG*ThBO1Z+^nF^LG))eDzO` z2$&r2x^ii#>;*&Q+eCfwqqhY^#jI15mbwI@xtA03_@tu56~ZbcwM7??Yki5~zr~z= zoFef3nZvIK2bis8B8BB2-4bt@JIWlYr(62@am)k0cgYdrge7li^DU+c;U19_0&{x7 zl*HMWW}PIXdEYg1{K#FqG;%y&Y{1j7NBmhf6s}J5c%kf6cx?X^`74FH!7IsXWF-#c zRE0cFSLi=KcJjRB5Fs=I=KgHKba++9zj878;~moBR3++@X8Z>T*C%rLY9JKr@XqE~ zdyCNuo-1cB*IThve!yr_)QqQ@mF z@FmsCSicsn%*O|;kG8NSs+-`oysnV&B>DVEluE~DBERdw(V5_eljR%T$|Q0xHL4f8 z^H<_id{yPt+Iy%IW?6E3@Ln$ zUkC;rat`r3K(o4hyjCY`{b`tpPq+|4Ts^n1tVxZF_v4g;gF^RtH)a?*VhdueI5UhX zwb_e&MfJ3ombI+TH*?D*Xg(kre@)vuo}+!%X4CztkAe1DKA+i~Ue5O(CWkz=q#2X$ z>3hDL1fa_;^}eEPFARemf-fi42l*Pkj>R`{zb1BhR`1M@JmoZ-vomr?N?+*ss&CZ| zL6vLF)x?AP#aoZunY*V)vL;F2RM;zNTpji#dpqHfJr~sKRNgs6rLO@`I?QL15)f2g zG~bW^>6;OgVep-uX%j?`w497~`_a+1weI4T(3JKDWA`V1_4tQxt<*xgUbl~Lh{(NE z7u@h*xlB!cX3HDz$3e+O(bA!UH#6cgPv*TSYf^9VS~Tj(UFJ$9J+b77XBTo9jDO;} znV8UM`||UljJ8_UcldGzpGu3e6z%;^(odx)hK!kg_cXY5EqLfIJgYEDPd-NlYHC8CkIUnaXQs|q41F3fbBexk;O1JU*%#FW4{c4eGmJ6b zdJE1A9+5rQHCT!Gdo$XZvk&r~(tdDSZRpS!Bb7Efkqa^wx=o2QX487~zMc;(79R%r zmZ}?V_LMsm`kf#fGM0PEaeMQs#yd9e(v*S;*tZRGkf(|MBEH4#P<_pZDicl3gtEbkbrbE9Y*5+{!BF9yo)v zatnk#BEv6QzLMk~!6SIN&RHTy?xS{Un2+ZBPs*m0Tp1Usqes5mX06~iCp$PZ3+vbp z3yG-TxzqMo=el$_i-|^pPi0f<@j_phSGf^K%r718d4p$?Tt(9E=QHreD;u0mSD0OP zAxW0U)Hy>b`dh^d!4R!!sy( zJG^qE3+a)C7j8txtnzmHz`-ECJ72QvUaxR&99CVo^oG6pCL6k-%OvNw7|1uS6Z%5G zK~2c_ICx8_LCv6{QOK7I?9Dn3e0$GoYdmUkoNyhYfcn;n{xeh`ktW9Q(F%}!(J zY@bS+qG(&rX`{`F_D$!S<-NrELpe4hrP{fn8u_XEi}dwL>Fe{-qaE!t9Yjfo#!MNt z36dsHT4dglu$EPywUAkVrdSvG@PXFX>nw4j$r{xeqn{MDyu7kpV2_-HoV6nn4x7H-tioQ? z&E9o%^Hy+2qx%k7*z1tU({eP+yq%*D!?$(7E0Q7`0c|f*H9Wd*5bp;OE2t|w-=!&LqB6WMend@v4|^rnYoY*;ghck!}{7H;;K;_l&AQrl~uzPwbs(F##QB z8Xo7C@pK>OiAJG*dgrga1EJ#jAZnRV@6G%zTR*o$gehxrozL$Nk&1tm^SXPnM>W+^ zqm(JGEOUTf0-;fQ_JDa&s+>=Sb^)m^P-)eMx;cN!LFVx={JL%x-uX1Gu?=bgn3l$P zllwg}u|#3nvEGMn-Zk;ZHl%t&Z)mm0_}S%q+@HT|_DF;#s6}g_%tf3^R4LoHyxCl? zhn}pw!rt(8xT4>Ulv(ofFA zk@7?ME$!0$Y^Fhs(>h#j9j4T~UXe1L8nE+Fo8%&!=NNg5{myJpl;u`Hh*g|Eb6c_f zvG(jU?$k-GV8d6-596o0$t~m=t`R++3@S-x=meW-^evT>zOF}}NxA8G`JCILa7Ao> zZlp=q>8kLNPd!abqARBxr&G-CuvoL%Im_5BT{_~g`Hs=duQ9DUrRK4>6tDAx0YB4a zRWs(Yuij>Yv8fL(2Wt+VGaF>?_)?&@e4Xq%ZASh#mP*>M%p>)EOOKyhE!2foBvrS{ zf#%h`Y26l~zBkstj#tK}G!B}$%T+g!d~=a)f_+WeI?Vp@*~Ssy*oB^E#L3wabJCsm z@FN0-#mnar)R8QFaW~`L;-tM#g45SndDt&2*-W$7R8}UpWnX{gdZdal=TS@Xw}Y%U zYa!7k^rDB%xUv#USlbFZc4kTvn`k;?Yv>$*_~{rC7@OY-@np>Ppd?B)MQUgpZBTzO ztW2n(_nukx(>0Oi9E)^cn{juY5ivgnxm1{mFGxXYBD}N2J=$=1icoi0mr1f#I>(a< zPm}S2j8coju}@wTw-be*#m`TSeEAs8#M-BG(pKRdvC65Wo}yFMv6o^SDi7FA#UwS8 z&feEYuJ@}T*@=*3Y%ZYa!ayydu9=}upKHRxR|^rZYQKEsq`T1?{8f*+wQ*YHg6A>0 zbKT!gM>RL*0!jXaZ+zRh9fVs>?X+()^9E6(wqTd4@9nbXx5rZo(!HyKZ~b7JpGx7h zzOEp+_<04fU3xdb`aP1HT;MAE>y>gIS-+%6@TzFeqr0k!ECbiOA11YKgN5lOu)fWZ}E?*j`UaqeO z>j%Hhq9j;m)Ff|JkGbthVV7Kz5Hmp{Z7}xyDJ$%#%7hvIZ1;2%b^I|}v-zlnN;R3% z(R8gKv$Fx?eHNUWick_ZCjWDy6-BH?pD%da{d}~Qnnd?%&d2!%6UoL?rbLPE8HkcH zHHe~13{&EJl}K{)i%)do&892vWs|yka#66zWds@r1scFI>OYJ^$Imf`TMx zA?HC6;@RAg)8N~1iMQfN^~u5eMuKVd&2GF(?IlX>(sa$&Am-H-vP{};9TM&z`IWl| z>BdGm(zoR=ZmGSQl+(J5qcn^6poL7253x3uU$MVuw~~&UJddNo|kPxNZU!i@NFa=40v-yliQi zPSnpX&)+N$U)lt`1gD>17L7}IcL1uV2k;bA1}M z)7iAeUoSpa?+bP=G}nElf08TUm4W$(mm(6j!LSTGNv~!W_~d&IO8qd_8;9{vs@aTq zBiE0OFKq91~$&HTi8;(EJ zpX`Pk$&1d4gyfUGd&JYV>Oel6-j*6Tt5spDox`5XwDMHyPO_oON@9^|VSO1@r06&# z=Srwz{o>Wp2@W{1{iv2AE7iNz>;pc_N9R9FJpSOf=5og2Vs;{r&lbJbrlt-atb%^<_=)S`_dDp|HbKHQFPIAXZ`d0oD{#;nVd4K_Un2`H~)8sVypo6vZp$~SB((jqV)cVBsS+59PUcNU6&QE8mxg3N zykj39($()kW%Q7F!hrwrd6yEMo^GBV`Pe+w3VqQ|(Yyyw3>Y{IF6EkYPgD1(y5&(J zs|S=D-(8vL%~}Z^2-vE)VR3#(36}SGC1yZ%A@A)BfeVpOW?6TR1FuiolMKNg(RYuZ zfQ|c#O?~e0yAb4k5opsBU*enPk<}h<>3+v=M!Kn0s-`yJ$}Hc`0S{huw*3-aa<>?H zWF%n3jW92d#Y^y&&nnx*2L@Z`3)S z-CnKBrCP5loiK6hEN^-}ISak?nEI+$3UuN4MRq~A*>R1g#ZIZ>b`=xvqPDq7!x|f; zk5*|rpUhg?XpJnqbC8iSu2=SIy{veOJ^M2!c9Q~+p}QWA-$Q>qBWChVSI~)kQCvYo zT+UAH0V1Bcp-^EN&MDMXC)A{OLcj6++7X5Rvrnk*U(HVzQNG%BU~2h-)2(;fDe;u# z483VtnJ)Tk-+jN5+BP*j(usF5y6=4}&ioNaY2L$2XV<*A3U2k{Cz zgje%MR-{c=C$g_5Y2V8vZ|lw(XN-S4Ub4On;ZZAD=gnY$+xI{;i3i~?%jOj}9+|R{ z2#eHid)8cdKWBQP>6%1`#L2VpEf5t|+ihFjFPTNd*17YcZ`OR@c!(-O4QKl%j9`|! zF#QWZh`l@syk>uxJ;1xT(@{>j{hV!fp?vAZ6HYG@+qW+rZJUgodbM2UGtT?Ezxc>E zuJp+@GG}gKyZG91mF#ViylrLKRqBdxH;&~W6WWAk5hOv(11c9Hye!8a0d7)ES*(3mU5B_-W*&4T%% z+@@>S(4hT%O(7nzZUJ;5UAyu=Q%z0Jm8uDIq zZhYjZuf=gRLL<~X+H-ekWdQ~SpE z9CIL_J!P7sjXnALeT^@6IYzC6mrI94^7uB4MlTMLE{BltPTX`cpl7V&lXJAN9rxEB zT&feWvuv($qA6QtIKz__ucgim4~V=_qOWqbAG$7#0h<2U5m&Ygznbg?5Mw&NzhadvM*UVXX8Wk$1V zBf;J}A~_*?LZ9&p4^vE*i?iy^yr3?N7ouBWZT+%Yg6pERfZO55)24IrY%`hlc6f&L z;Drpl4?gx++-|suuu%(0CfZ6GQX6H^v*?7k+Xt5Rc01eHgm@K2a=RUG@8kQFp(WdR ztv#Sbie|cCd96gsB(rBjy3=Fk`n!$6jt%1JN(!k_(j?e6a}ooOi^YU80xTS#pJ-3L z$`#R*pw9bxE}0H5&9)^t;xx;-?6>8YPp0a^R~S0BFOyqte2x||eztjLOMyAxt2`w3 z{hbfW1}S;5Y+2yr4O4=*Skq?Hn-*n6ZY^X?ZhYV@Ne}F0te1ozcrvCa;xkB9CRZ;( zWLDMGLSq5)BOlQ?d9N#|XUXRZy@33aQwGc7SKCzBL{4px*_A3?qyK2J^1~}_MItXv zDx|Bv1TRPJU4Mf$bAVIos5}p~P{r5`r$j7!w%PdcFwwi665|roH`HcW$4_5!*ore| zx@Qo!c&dj1_ZyJvWO&EC{il1IyX}qUt8In~=sd~pCyq)Az zfb5+al_$ae@EJv)l3OMM2x{0Ju_bt1WM^C15_!o4dFyMU%C5yXL^={AbuX?>zL8VB zD%El3!^Q4}b?tF(5e>n}QTJ%!u#~KCa!m}1;$81g@M}ChqQP+O-F;*W#I$VPldC$? zT1FPnA|W8KsQGqIe+%c=tu`q?mr$ySh%78INKX{Qzae6`I^|wSF;cbnB;}n_o)%F#O+^r&2 z=g9ISG6%RdN;Om0&PqM%UA;jsK(z+T@S;-HwigLx&@_ZRGO|8rLw5W4GHL09+SNnn z#VQm&Hmi!Cljxu3xy{2ee5%$q!;~v#OKtkl8TZ^95vlImy7!rem}B@PK&q)*H)uL6 z8K$O?UEuK0L+?6&=oK)nz|wgl2My_jsF^K+s!i1sgQsvL@H#i3x%&~aHBXXr1 zbL%fYtRGD78ogBJ(lyzoVYYa{CouQ2pcQpJKZKD=xLAJ{8Do%RP~aRkG;!+!-?8Q| z{zqR4(l9!{h`GOWz&!W(j(hc;0LeqvIsstSTHy?XrPI6~4HFV}T9?yW?{eV1vtYQq@^H|4 zxS*Wc&K2g7;U9-7U#6PGRDFA3&OfuZ9Bg8NO&i2-ZX`#Gg6{Ka=&6IPMW%EdMm9^Qy|4_rnJ`e;y$ zHnO<%*>%!*MBY8gKHQw(p;`UB;)bBhv9z`gu4LNUd4#dX6T!hp{oW7Oc@js`fM~44vfXtY?vD4Ii9nY40#S=+@X2B?y}lDF=|3D>6Spb@z^29FaLXz z;wNh50dcDr`TFT+IXxsR8Qox$Tlb@fy>28D<{oeAJ$P#LYr(9WjBtU!(i0V;3IU(b z&9RbKSZfjv7Ui`+i*)k#SgL@fWJnUJ-~UYBF=&3-Z|N(4qVebme>K4bYZ{B^x{X~M z)%$jVxhd6K)nrV_GeNDU`gzJaMYEr#<(#_3#fQbG2eQ04-r;ZDu}}-M&XK6#?C0I~ zkM}q`!KRh#`(;9GxRR}MqPsSF#$$4As)x+Ne8<0!dON%B>XSN(q_IF`(ALZTvh6k> zO3Le$HqyzjL^zv80t?bjShG!XY$~+lEILzWiY+%;<79V4wcH%?Pi$Og${bwv+kWAD zaLZzIz?{9e@`+~q+tHN1{IS)6>til5?)|5I?srd0@rHYA56Ad`dFQ37mDtrxY~_^2 zPh9FPFcP`$e{Nfo*?K!fM|f2IeheIcrkiJVqWGI>b4jI%+Of`7yd6%Fv;oo)Ln9|* z*pob0qG|)9dFl~;qj|ECOGZvaZYD+~L$xw~$zvAsC%>7?!@hd?RgKBkgpO_JeTV4L z1!a9XtX3Ja_{7>lYb_@b`BIK=TTyui7ex3j7*6s)E~ZK%oC_{q^Z{ zf;n4?i@;ST9tcGD7besHIP~tjxzfaoyeG3%hmV;=w zT>Ep2trgPB5oTozh9hv^&VY7%>Yv*kVK!EdD2BBQ#BomuB^spX55x&(3wHcpk+?k1O2&eSP?UACCGvB%Of!&W|*R7y_0|`u!TpKff~lcmC)p1D@4J zc}EfDUcg8gpCXDGs@dgFwMtr*{Wjw=Rm+0@PuIzm9hO z2QVN)2PoOYV2D4TrHzR>O0;>Zl^6utqWbkI>i=PSNzgG`RvutD*cK;^bVVw?ixdR1 zIs^joqR~E3qtkxAFXH^~pw#*ul)FRIx$?=I0PBkqfI#eM&~FUrP+e;WuniJt2`5EK zJ^KLIRf1n{iT)4vg9#mW9_3D)teUq4nnM5!46xYHSO-|qS%xlfC{9#Xqfo6+0yu6ln#)YC9J@5rUg~AkbvN-+2wiJ;i~>-Tn4X z5@A>zaMca^^}dh)ZvP1XeY+~~mny^&{Obeve|>B_wwS#~b|X;@sNr!c%vzQsaN!KB zT*0;mNGl|kVj9&cvy9S!Ko;DX5u)yngS$JdRv9WA2zZqV@G1)$%=Xq_u)RUwXV+~; zfwm}0ff*i0L;eC8f}NZlfvRc!>|1t6QO7P+NdRR!^-ltl3jd8#Lp30X4bY@)fEKlP z0&+p}y^}(p{SEr#P4xZ%8!#{H1~;mGb$~Fl?|d8vPzCA=fy1CqU?>t>^QwcU zcrXD0hY$Qn0*zMp00&LU-U@2>yJ4W3h#}kxins!UJMFHb4{)ytnnq#n|EjUO zg1)s;XENXbEfP%QJbZ*hK?~xF(>QJmSy80FqXius_H-}o&kvi%;z~>Lei&d279h9s zqhW`NaAAQQ`?F<&k@hg#-O(~KiEjcWK8c2od5#keSOJU+tnlMWS`7f+Ai`{( z#4m7wb-)PZE+LLBQf?gV8`t~Y>!3#?Yt{d*vb#o!Lr@p$mF&9zq=4EwTpBPpT%mGF z{cFcCKs`Z>8RN$ra8Q4hS{VWdhJG-(2QClj(|oLF1Qg&vxzC^}m^AOHpaQjlp$7K2 z1gb%^rOrSj>H(@CiY8F=c25D6;Z@v$4hVruLS010hY2YEQDB&T7EL0seP0qy^6Knu;f!p9T#kVL5@_E3S-9(tS=AXfV z*9TiU?l0z_;A#5g0p(`~`X)&mWq_|{$HoN_`50fXG)6~263FeghlGtwxp|6n)J-cgGeSKhGLVL9lc;~GZKR|#E zXz4O&0_W*)2pGbCxkMiZL+XQpe+7n*sO*KaIm&CxxdBoP|45x=#3}WwHvfxMq9czR z2OtFo%qD;)^@9b6lo8zVXN=*rSl7bHb{J}@0;q;C8ry*#Hyc&zz4=2r;i~dLY~3Qo z%qMD`IQS-3aOmD`Lj_+z{s1!w6t9Rm%YVm<9lkp&e1N{OU#DpuN^qXCoJc#D&IkKKCE% zzxBMoS6Z;FIo1lA>iwQ4qfdOk>*4*oQK4XsK*FtTkcMD)Bx>S=YmtdxVWQsxFrFbH zW?^HEc0)t=B;Jcvn)?d4#DM^FKqG!(cj9?C47G&27r3)~x?Kpc>q{!k2IYJSEBN;# z)qAnOSZK$%0oL^g`nXeQ>^Uo(Y>&Ojp{I_$?EuVyPk=dXdThTt+0Y7cbuTJK);+#) zpbKlD#dKSp!!A@MgzH{JM_|IA00coMDdy028o3Km#r4;E9xkL7M-fRrQ0=?Kn8*f? zU681*VlU*Qp_{KVfU9W`rk_fDc0sBmog7gwuKLUW*rw3WuRiu61q#~@{74FooaVbv zvXYgJJ=hlGA$v@no2R)-F9K1lO9KLlqv_xU>{Ca>X|EKUryR8K2ymncE#{hg!R`Ht zU|Dk?UueJs!VY#2Gwd=VcHshZ|GkJwj+fTxfcz8pPqz4!unTejEqYe%ylypM0s$IK zuu}3aU;{^p4cK;H8S_~fjTul{31UneXy)t!Hng?fi0auje_7LY4=(2x~HyC6}$=ALcO$C54_ zNQR(9e9S@lkQYzl z1@v}gOdyaD8n|Z|58LSlMTGtSc5(upPmiMB(Opl7Y3k%ztaMcV1O`O=Q;1U3;<*XL z%yWFq^83$YRnWF_-X9$lQxJX`F#Ezk%aXc8{{XmZ0AX&~D(_&B5w3r79JZvs)^hGNI?e#R*QOVg%QfvdYRiET04_k$zthb( z#4%VuH=`8ba4QeozEL2$0?P)jHb9ukXh9Mk`DbSPbDQ`lSqbLo2+V$fUJF~K-?s^f zkV2(7zyJzp^l_>Gf&TOQ=f7wm!N7DATPGHIzkvKBkXbbdG3Qy{GW(a?ojt(vWIYqO zS_5G&Eab`IV54^E_qNly`Z^kSz)q2Xo#fEq3G(}gqb~PhB?6_h6eug<6JpNEot5@2 zwmbUqGvb&<0Nwb{m^evg4>ayDmAxgmKn9eTlMFLu_Nn0j|C}1^PAn%oO%M(glb#f_ zT^`dyC;pw0uvFWyz1anD9|hpPV`!`|y1TP**H$xB3r-H0F$xcpm!ZEq?@u3wWhSqG zH-Pc9nFMm}$VkL|$aua$y*95bo9!puw!j5gj;V2(J<%&^jxU{D0i5xhTzlK9pT zD{2tPn+0oq4h-L)z;a)Bc^422lO&i^Tj({c0;m&Szy-txu|E;!IHN;+ zfXIP=_6ee0u!@)WHQSi>g5#!p6{l_WHkn3Wnn4T+r#xm z-+?Mx5@S}eEDReR%cLy2JN zqRPLwo(E79M3}?v@CVpXqS(9`85R-=1|lpCAG2I+NmyZ67TdR@@lmHpGDtB|FO#vM z#IRWFs~z4=po)e6SW7Jf8%i9@O4LqJS_n`ovwwU@mV*r?u{+8J9F{5pprZe&U|T*m zlq8lTk-~(ED6=E*F}rMqr`S+Gr~W{8+nvakG+SN;M8q~Z=Dy){AvU5a1dc$Sw+C_> zYTei6*P+n8_GZ3`v|Kq22o;cHj`en)VH5h(qyPSap@%b;gjXotO@SKgo&9G^#OEb; z_|I>Y!B-$q2=>&6A8cccI?Bq1kC~w5YxY26FYid7cyFdD2(;3Hc^uWX77KKD&=TUS zd~nqUyV6nT!uK?6QA0dFTn zT%bQ^B1%?{Se$89>l%~~fRqR@EhQ%M7f1sNOqZPDU>r{Zh#rjJdI@BL2}{h)S{AY0 zNxO51gyy83P=kqsAkbkn&Veg`aSUy3Q8O1TI~ljm=N$pOMoWl!?57a=hw<|c0qy-T&#f+E7ApfP#k}JPS+5?7yfh9?Z~xV@k&-M2w-RmLDl`|y5SyC zm%Wn3%|j0YnF4bKMl^vs#BKurQc%xEeS61>9}8T)24N1T*l(jzlweLyR#00lEYBvP zSRB4>TFOA2nBZf!)+OvLRUi{1?7_Hdi(-G0&gn1#YASmbGX?|hU}Nu2Qa)ZYRR?rR zQq-7_VA0l~k?g^a&H_kxBqksdp8Y)rxT*$W7KNnYH{j=EXbNyU#IMChYzC{PCyR9g z43>+JInD3GMpCr0MP2P-ttY{~OZS1id5Rtr9M*&dtosv(t7k-klZSsqpdRk4A;g?} z*>&s_tPYqJaFVkXmZcSxOe~_z_B(1aLx_3cjIDd0GMZqIy;SnDzH6hNl;k1AJPHKu z*{6yY3~Glule(7_{^bs1loTHzC5tB2)VEJ51A7=8xgRY@Tc2kcfaA?hVJ2D5f!(!s z=ftzv%a8$`V?8-$YS>=*o1+MW+oB#3)Cce0k)v2eOZ*(D71!c_x)7x`G?ojlX(@{I zaG_}W7?Ao~XfaEb_3dxce`A8(y8zS!o?<)4t84&|oFl{RAqnsZ|6=`rk(88nFO=3$ ztZF`xPZpUlb8!mM-yqaO_L<0<9*)c2G#PT;%8-lRGUPnWU)x-J3?U3$4n&*+`iFBynALrAc6aRV)x~_P#eW5ug7p;^=QW9lQUC2V@H@3IG5I2mouD z20_LMG6YBb3;_Q`|jK|zgAV&s;nKE85yy6o`^iDBnu7! z2Lb{E0s@8z5CZv^7c2+_h`hL(Fuk;b1mn+f5D=w*LSaBae?txB%)r)v!?Hm^K+u1G z{|{7NSV3AsTvd%hULrJZN@j=&S>idUQ#7Sr%Ca)t-Gd%Z^MYo+I{I{xcSTMHHQ>in zGsB>bu*ZN0B7O;E38?B4!LV46je3SiB*8B&ceGaU3NziEV(MZ`QjuW;!+o>Gy-yPRB4P^=*FkSS#z}ieWMsAa zQ#-&p)P-T$18`2WW4AMRVZdNKY#sT2Bb>EdJ7 zTl3q3>bKO9f&2w&MgOr>b#-tCSeP-G*aBQ!>|%HkgO!lQuc?Cfdg_|gZH+)vC^aZC z$)9FYQN)q&!RV&@AzP{Th0Kzuk9@8+mfvn6c1$jePK?AXC9}{lw-_{v;ZWV8f+?)C*4;VCpGz&27sgYxhI%ns@`>iQ0N;^_Q%yapCsug+^tUrX4F z<+Hz)Q$xVL1~1xK65B11%S*p**bYAdAJ=S`%Jx8Sdq3R-LZGVX!sg#86Oy7U?Gw}V zk)aBHAp*a5;HmSE%iVo}IdnNKt$e%l$T zjDQmDI!l;X=;W0-%M^iSIvM3`EHl7uT72EvsjtLLFeHoX?Zh03gY(o7si`(e6V6TH zqVB0ZqGzZ%%iCezZDEeTFl7O@oEGf3`tS*EucHLhcgFobD=K=u=2DRch9WE#JA=L& z4sx@xnU+B_lD1!$O%tC4E0u0Rn}uI@&COzkab=R5E%QEvDr1Yce?qH79r@d0RDqVe zoZ%!CM7kU=<9JTpiH^D>@v4|Q3%0d8=Y2|0eCJK=R3pepB0ZQjgXRm)@F;Gpd3Xpr&k_+5k76qTim9wfnee{OSV<9O(rNco<&@mdN7 z_lEI)DMd{z8Mc~}^oW@riHgJsPL>)7sU(1Y~UBNY;c}>Jf&RDlDVIno)jIYdJXq(}ZF)`T*k6S!g+RZBJ=PhNe|FEG|I*ggK;*{=$iZ4dgv zoG%yzR0KZ}qwfSIs1%)uuad$m40EhN`~_-?c-vB6V9K(m_7uSr)lM ze{yP=w=L1pAZ=mM9$7O5701OKG}Br=!yL`{wLi6^HJYt8nphf&?|PCS-*N6hyT;{} zWCtobY_Gf)Et&oOq5n%waj-XWb9Oef zcl`@7jb%m*7D5*P1=0|S`82F!w<7v=MQ3)kIuk{BLtf&>5tFc26em>%jozGP?2Yk0 zxAqNOD7L&`3sCSC#r*Nx&GZxL1&>JQ)&;EgsZV`pwJs%{Kqu4FpxN<|S{CP#IZS0C zlVNn0b`wF}PomG0(84Xl>fRofD?o<{!&g~p*bpi?d>vI0DJEQoB7mfl!=HS+vzV#@ z2LUnst(UZa@0&cpQ37D{+c&R&3Z|N!Dw-y`zddT>m^m{t3GpK&yA&$B@SAz4&N|f) zs)?=vUGqmB9aaO!s+m29y1z_7kl~M@es~tQ;U`tz1)}e#+?j5PAnL4%F3&ls$65DT zjc+qOJw0Gb{c$`3ee?*dxaMwRH|4QZ_UG6G7Shpsh?#=RH=)2tU&Or8rGWI_ z&e*rsa@AxiW9DEm6@F}i5f|9H>Zl{E! zc-ib|@qE(nL7%UxvTZAC-F?X?N(yb(muTu1aSAN)l`v3TadrA=(#eZ-rlv8?Tp1jJGjn+%(d)R-qyXK-!|u@GOiAlQfIq^ zuc4L2c|$miz}N2q2JTmc8Z{Cvy<J(sz`G?G~r9ytu}tqc(6}L>+;~fqr2H*d!fMK|M@j z4XtsBJwj3Zl5{`L^JQip)G~%J^omuFH(_UKgfqwFet>-8{bc;vl1724>rkI~ieirn z3(VRymox|4kq5#TJ;{TE^#J^e^qzA*T@@PJU{mynd#~uVhg^JKk7CD$U%Ej!0iu@Q ztLKPQ#G=F#q+Zo8;^ZvZZ_r>zENl}SAo;`dgxFjf>+{C*$E^yVKyR2{RSyWPFM4dx z&brk+H1?`V`sSBm8)9FjO~qWwI^lWWi$wo>!9UX8wq#uYAG9xr`Zu(fu(CD#<0y%o z`M+tu`Fos%{LAk0$HfG@G(jmnJ!oplVtvdelne=Ve)U39;612<>ipd|0f#;LY~J%L zd|U{~Taq9M5k8fOunHu=v_T)MaG=T(;u^ZqOC@n5TZyFq$PN?X1kNO&M|bi1$K99d>%#foH2l8 z5^(Hj=?PSY{9%2~uZN2Udq_F?S)vL9#!^MVU{mW2o$;BZ)X>wpk+MC96d!erfODTQ zmvD0RIx@b!*!=5Z`5+y4p{H=6(1yF3RARO?K+pM5cW}_W# za)ik}J7CbIsr>p@$YveQB?x>N&wak4AOYT`uJ^*l6b9KOS`NY^rsb?pfhbBi%3Od%H&+nL2)1dKiY1NKgb9dKXE z9WqCZZn?y7r5wtFeo~rg2$J45uiBC|3EK%Pq&o#T2e>lj%#knR?cEiW>C5N+6-=h8 zyl-qxg^i#tg#=fb`oD;t%PgQ%rh}}J`<`IJM#J8fFb8=Nj%d!*adogn|Am!}`e_xe~` zVifNMqErg^Cw~w+i;`~c(5C}&t*YFwBBmXwKN0dNpSJsMCBy0Xf}87tERCXv9x2;1 zm^d7FoQ%$%KD>E8ymkGdiLQTr(a62n&2?fzQ$Z}2OG~~oA)n1Sp*0g32q2jg`=$0o zg2?Xlf*5N{Y7To!63cdrzAJCmzp8Sy>~2MNLitMV>MKFv7Ypze?)XVTf2i5SWH>O$ zsWsekb3&ej{Q_phOW~DhZ$xd}e{4t^unVU?rb~E-@tUCKt&!KC z2VE}1zsbL8q44~0A^7X#_H!UC4BiZYCser8de8>bKyeqL(<;%EHk8ZURtGA%FBlg$oGNmBE ztP)}N+B#gaaEMiZjo*GmdrAfHM*5M&U7}PXa51OWBtJnMd!s1pFtjKY=MrJ zdtGo8qQIaeqDH;>t_k#ctJR%=QypNV<)-}0%uU-D#v6)(S2B7G15s(emZ@mKj^{uv z2M1@U^G!174i#&bdos+IwOAN^f>!txpHiAG8mkX`3gmpjicKY#;!R!^O?~JbX*c0b zoYRV3c)yW#xm1j{e(>Q?37H!3u0_d zmiZK(T@1eM*S@7mXf;dWb57C(_|3KZfO9tSFAu_|o`n3PX;{KPqL_N3y~ynr>F&R-%aFPvQO9-Y?~YTwh==tLw)hEj;^w@Ac1J6{ zHZdpa!h4f)xX6!l&$S~>0`B+NGkh$;5dz>apR(_-XzO38n++nO1$0IX}h9I`a z1EK^TXK6zX)E@d(t*yrZsAqn)`m=&VNF>t`px{n^A&TS_gnt^$a1|f=R)X*c0jZh9X+-{IP{nv4?Y(L}(RL z%#Hk&{%m(>+6VhH^z1M=u>GthO+a_A-jSka{@ftnBWQJw()H{{_;g=EjH+5eSgB*| zWuJ|jjVtmC5VE3MpR+FfoGIWG%3i^=`6NE0YlpSsZ4Nf8HjP{K68~!Clg#!nWjIP1 zjE#mzjugu$ONS+$p+A+agWmxb%U~cN0g(TBPO$yA*l#PM2_yeZNipD7gewj#v!oE0 zp+?6D04)e4{thPr0~-=3!q)#j3cW4?g z&oU#8zN|>X$x4{r_+UuLI1D}j43RVIQKWC*LCs2&Y%BxJB>s(P4oh3Itlb46%x1R9 z$r@k7hTkqO&lk$Bkm7aif${8b+pYxtqXIiucta~}1D579D5Nvloc+?LdfQm#>I3My z-{e_2X5b`wCh<~s8JJA>j_)ifR%J|lGy8gMEvU#t|K0N@3IMQ%3;DUStZH5S#tvuu@)eKYD6!wSdlT&%o2BVxVR3CkqTZLZwfB zdI}ks4QPffkYFCSD8x;Ehjp%`(DQ>n$@|ElLgsypMRTx-6e`MGUQ3EEJvSt1Y% zu78|`eBaKy6tZF|5|KF#t!5b;{pTdJ4>3+i1~F8q-jbIA8>hraH-vr%Pidp&2=L@- z=|)GLpUx?gU9Ig>T_`Ch2FA@@&=+PxqTrQcl#!0NLby<&(uUvxX&?7=*{WHnJ$G2D z04ybqOG1*=3*ON94*O?Zj$4vxU{z3VtFX%b5lXZX`kle%Ah!0H*7fXZbv1=R-!nn> zHM4tg?=);uHeB#-4U1Zv%5W$Po62~rmhkg3TF7XLg=CGNs0Cyf+r1|8Po?diOcn@# z;UNcafnRJlT9voq3)i1bv-nVRwjqq!DncH;y!MIy$Pdc&Fk|lD+#rMp0ipiS`0-!t z$kwn^#Z&)B<71_cAqgmAGpO+4x~9+-?lnaWv>d;NZui1j6D3|=exF`cMK@^ zDB<))e*ZaF935wmM@W7fp4Ewxp&4d2y!OkLl6+m0cEN$KFz|GnInzge%T1+YW%b)l z^1t{**^;~aknvpMvH+6PO|Mc;_6Z&PKZ=Gz8%2dUU6;{kc1dVO?)W%dZlYgaH&)w~|vZW)! zn(!-ce-hBId?1a2K)&XzsssBTnC57)(uHxD);sG6qmOGa?7ucXZcI{EASnU4pl)R2 z$W*(_B!Dcc0ncwNrTlG4_+`flN-2b;^)q>$J*Z zU7$}B`#CO9VnWu<`2r&v^PEk9Bsvx1`AsbpugN8rzj{~HSMBq(bkO}Rk67Cln{Tip z4&owcJ++PSD)Ytqp4R1}KA_$|yg_`sNi5|a&|W)Xkr?$;#Dc2lApSJ%e9~pv@W-`_ zKEu?L4$zftdQtO=y?teC%8Z$KW;V~{t;R%KBv-?c!#Z^L`(iVHwccl8@$Xl1xMQ_c zWt-(PmE-=NPuk?_$NQ_%JOS-7+Ab6p)m(n1irXnq5#}!IZ+dL> z;bgl55mY)>WozAmsVAXX=u=_cu?YktwT9L$0^ zhnW;%a{9c|K(msA{3OXXOE;TJoo|J4HZ>VPjhdqy)C@HL5og+7*kuzgAR$}AE8)RQ z_=P`^WBvnzclqm!Tl$VMI-RUFn8+JSsZ+f9^@8Tq@xwc0b$~pkp~_0_4P1A;n4-!F z|4Qio356a1fm`rVL9kr9uc4H|MmA~DC?!s*6J?Te9{28QeI!SMQa^*rjpK`@lnSY( zC4-A?{L=Q^B;2N8vhN^fO9&k)OZ+(SwI^3IMiUi6V&6IfX$|Z~Y2%LK@0O=!l z=apz2?>m)tmAb8pS%}L?sTTl1s-elqL@yXC{ z4QBi+{groi``3Ot`S0K2_OAckeoju*S42}r25wumtk({usL(V~(Gxf6TDGy{qKdMi z-jelwEyFUWhSt()Ht(SLQOlN};kk=+BN#D#QS&W@a$Nj4D?9r+-D5h(zvul2f)IEn zHF;fz2)>OpqB<-)Y)ObWKAsaB%o?v|HX5qp=19$SP^9^fvy5rW@_Z_uwd^O?O zy4l^NC(m{xPtC2(I_nm@?$2Kv)AiStXMR{fkNa5>xF!j;(^ob+v^DdENl)?CudeGn zT8CBQ^qr54`;g|`eP1Kjg!S(s!j^piuCK!S<`=j9fXvO@yljj@kT5uoP9Rvf66Cr| zlC@N;B}ral#_*-+x`qK>=4jhJYH5dsEE=?2H!qUu#!?9atwzbAO5$1T=t!cXgYZxj znBe95!V9I#K3a%G+}~Yc4g<#O$CerUG}T1Kcj2!3&&*Gm7aH$*n~Y#D&t za~pmKV-X}X&Uo++JONqzY?$>)2i>6FNl6Z89p9o1AE~;w)T>e)7C9H(;zQi3`4BeeD z~f#H6RAHbpwA6e(}3 z?Xl#X1up(KM~mPHg=(UWIx2<66FPpJjMWFlaiaT zQZmte1Wn&=4}GML_V{yc9J%_aQi6S|BP9^&*cHL;DmiES4RVWZLqmT}>?u4^`IGrE zXxjWbYub!N-Jhd1WJ_i=+dzhfo=9_18Z?1!45o|L_AIFLCo6}$$C9-Z-+bAyx?H>S zBG*#Wg`N+bI@_+O={_4*A5+?uroVx|zl<`H!10f29h!tF)Hi(vm7%Q^%wLL)NBQ~@ zw4rRxJ9ZwTMTI5)2)}T~U6NJ_-^moSE)+SQwwo4wwPT+V+QB!ucgJAyntVO#hX=_3 zQ{FruINfW6&Gg0RlxL9lC{3ltoLOL4L-HE45lPWRMz!&i zNN5N0iA&DDegZ(=xz(9g5)ZhB59~s%P(`XGyp0P_h9LK$XyapSGS3mD?gF%PkWW$O z1ZXBk2DkSc-qY}Tspm(`UP9;usprRtb71ypt}IJ6~AJtE>P7#nAvzKxrwBd-ydP1mt>ZCpOiQuEslc@4i)!3AcEcR+AX|E}sJ1<2Kw#e-Go2{|_6h;!(fPC|@EMLj%e{e` zkd9;@^@)s+#^AbZEM1xBxiU=@RRt{Xz|Q9~%i{8M978r*?0rqAd3@CC5WlCsPxI6l zQ8(d%EK6s0P9XZ_n$GD#?{tsajcrnGcl3#s&vReJ$a3}so4h)~N>?H_M}>Q#?zCKY zvAQ{ZLPxbCZGE8$CtWh6qa(F1q<9nhuBrjJb>2Qo29CC{qvo|JEt_pd=roiZ{ESwhsf>$2(Zwh{b%(y9(DWiH7tUyI?5*%Njzie0Z0AISLi zJ%Y!6gn;L2P=mm4WxTsg=d%kptI0w0db)GY!=@9PnL=s={AjnaK?zFLxcy5Z5=`eGmqw@ttXVpH2^22@-FxJDRdKWlkyIl8_q53Iq(PvP9v3gQ# zX`D&}h{czEz)ysm`b@tm+fA=qdtI(|W~slG#*+O6D~ILmi?@dPqSXucIPYU*9bwbL zXN`dVw00!dtVCIf#@CbOAX&X&j|=r{Ce=JbQEG;2={6JR3y|wT}50PZr47D4WS{6GW|i8C%j1Sd+m z==tlQ7m~y0Gj76NdCBx`6RptwR@l$8v66M5aSbwYjWnMzy36)w23kVnH)PqSwBnE& zoCR_$`xUNU+cF0kuufCG6cnEHzqoQaL7o>e)O$kO4alUnhO_%ei=$yw@lRBcm+9!s z-*}@!c?M$%NRKF@+$_j#u#(R=LOg(#-|q3%`4O%NU{y(h&5bPZ!!-wP#t36oS^A35 zKyqjZ`+WB(q?wiNd^Ib%#5lA_Ho1I-ZS(iNYiRQ*X-!B(;e5&5WYIVGjIJ@MIxEob z6Oh-;Eq#Yv+KakxMY-J&)8mY>babg5Ydq!Qo75#=T*ptT%~bRhX$^nGEl~a?fT|bn z5BdY2Lr>yz)#Imr=zOG3ti_A!589AB^`>2$qC1u#7NmK0P76R)0qu@TlMqL(Fuc26CHd0 znz~GqEH5uj56g;=L!pRsq}1egPgK=h;57eTSrvzsnLGC=d{izq~NJ*}7W&sc-s!*Qq+VIseZ{O>JEPO&ML^LI)d; zj2QB;z`5R&}}g#5?BEa6%o0IF2g>SHP| zlM@bJzEOOE{pf?G$!cP6I;k8BE(!K3dQ&v#*yak%P0pkJxEtPWyhu-?Wk!9SlHH*)o07pntHoF)O zsxYn&bDr=34#JeB^6zWYr+r*+rhEYEvpS!V)JN?oE(2M?E^Yy?aX4#}M(POi7M6>5 z4IQfJHLRa&v!H;Z6Wz6Gu6fU#_55tMxI!T$zf^J#abBK$xNIXwK4T1xUp3b! zYwQeuvN(_!`rB)x+d;~tmmNy5Tr*28Amms#*&88=E%GRI(}F@S77)=D%$d?MEen=3 z)Lj4M$x6bCemY~{5G7A>RYa+8ghjTCk6zkz>Yk45c_)|-JdIRAobtSoyjcmWx0EK0 z5%nnRSSNl*T(98XAOqU!qOhI_T;Snl4&odGe{_~=uDN`Wh&_R?*RM9fAK}}RcT)a)luEK|08Qklw>-H{Vj^oT5pV=T5tDBZJ{Y$M z{++=gO<%YeLrvAD>DzOz0{%#(AeD%3&Je$A9oT;}756WQ^v~N58v3eu>e&7qM7C0x zGO9n~RdmXdpkU-aBdirc?geR4sq2WSeWetFm^#|OyGbs28M`(TxJ*^-N}x*n+zTr-kdt*S7+u9R?io4Q+%=aUF4I`Wr6h0mwL=n*@2Kl? zL(xEO-@ILP9rnpxQH0NP1$)iFI7i98^wdSs0d7~CR?n}LXH4t zeW$H_a54L(u{Gn8O_p-`O+?Vyn8(1EBq>g4_T1;1+7+gwGgh0SIU$x36WH&HXnG`TyntRvnnpuhtf zK{0>ok&%o9`7!*s|FN?J_!^A#0ne)N<~H)EswcwXgtHvN%jDG*S3OCEaSvWhm()V7K;9OJO= z7MhVm>!q8;f?h4W=_Y3=v+F6`1>L?LeDh>qI1#o{*S5f6ud5I6F7?@GkhzY)`Yx+; zvii9=8@(9aE`yEppjnaip!lRi^tYx_sufs$V!(luUrsG)ZCE_`eh?@bsVj!)1zhVn zH=_D%qkL`B)Z;faRwi6%SoFA%dNg(vtXrBYoDx5E84%coHp_%U35u0g)WIbq1gdI! zs>?)>fF#I6bY0I9Zy53P-nuj)|(xp+B98X z4jMe7!j`U663O=x!Cj@nz>Oe)#-%oHsrMfq!p1CACxrNk9${{aL#H#W^7Y&Mr#}W( zGkuOG;&)()eg~H4uL7&;VE%_W+~ogQp#iXUGy78~E?eclVvVL-$gZ>P0NEG1BndGT zvsXeDE!U!wK#Zk_cVN>4u&mqm%r-tx?+4-5pw=^cprXcpRso zM;Bk;i-WMOdPpTUqoc7O9r^6m!+uJTXBtk)m|p=ly2Hvcw+3sfdGdGHdWC$EoN%LM+=m{7yYju<94!B}#R!Wz0Z z(QD}9R?&2r%a$7JXH57;fYnv_MzMsW`J#yLX+>@6X;I8pxj%}DI@NlAH2s)5KHXj{ zy?o0gNL@7(*Uhmw&f-4i?|JqR91#5V(Gmc1GKd7l(Lc|eH^8A3Dh&Qz2@1$$OAL(n z7MO?90H}?mfr1w{B*c%j<~0O6W0HiWy0t>37>k5i7~$MCa8bu;9ym!LDvk|TI=`?J z^f2G>Y|Y-5#J0d!4LP`V>W6upeVx7K?d#MHdlq}wp1XbKnI4<)BDg+p%_GTh1$LTf zP}atlksMZ3RkNi*H)Qgsi~pgWm`Vu_=my#UyZsnmIL!3T9m>hsAaX-+bm*o1XE@*Eon4kWbyAl9@^xD;Na@ z@-_;Wgn+bj1|!WZBXpef*L}u=c+v|GF9<;~W?1}oC?rFaZ zkBm?X^p)N<%nZ7}ij$F|zNkBd8zs5`<***$cKnyWr-jKC}E?PblE zTF-Zg<-e90*^@?~7Tr||6&Kq&O*?NGDJkA^&DQh_iM=-o-L*9QI?E;{+l64%fdRoR zo}(Uo2EyHa+}WZ}0gXC~$q91X#?ng+Gt(1=?)5P)8jN>}Z!*ijSjunI>8;9X8a^XE z&*bCqkitxR@<)lxkZ3jseXnG|gBHi@iom&@CNo!eREj_zjK1J~2S=s3)0j$|{Sbri zPJR1%KUU#N!~Jc$D+LBA_vgg9x{A)yhRKVz5?XEc0=msI~$1V<;j}x3tDLexrN}e$qL_B($T~W6Rq03#}h=FWTS)C z^O6KaahWXaxo~c~->l1{$=PClW1X#aF$m@N9oHmqgy)IfFU?Aa#LpR+;hKj4IzYw0 zxRFW`Df^AKw#R*M0f`r?=w^5voYE@BBo3_U_;_DgOeapaIEA+%p@cc3U} zu{P%EY$c{hV}HzQEVyekV90Okh@VB8); ziy^_&RGT^;O&G|>av`~9$K=KZN0evyD&(w*d_h6_$dNNkjDG0+SqUkwW;Cpzhy1H9 z1(p%?r$N|Rb)9R?1upVtOfL#FKj~Z-xc8z*?W=q5 zv+Mli$+&@1c0ln+`MhNg+cki8&2qVIVmY%*k!4}T_=0I~p&%fd`Q{Yzbp2={J&lR- z$QL`mMmbzE5{Fiezy}z;MD^T*Qx)r6#M2l2MBg5?WG|<_Ep+b3CdN6nSH39UWFStj zc@i{!zTo*|jpTBTT~rTpL|zpjOlv2Jkt-YIh2z6 zK7ZUb<~G;NShhyB4s@@6Myybc)-r`+_wb`7O)^xUhi1SsTV^3rP-#ADDKl(HKxr!B z(YXIIX?gn$>W7)>Q1IHm&2cnHP?D$W&yqcixt)yrOFTLseCikEAFqBQ&RuSafA^r8 zs_XAc+uY6euZnKFSZ1_7A@q=Eig+^IE|CbzXGS%1bmkw&ox}{r(?fBpFQEQOPIEYs zEsc$D-RXYaS4be-Ksdk9AQ6etEWIJDoG#?ORbRA%0;}x!p*f)Cd-?cMO>y^%Q7Xdq z;339#8WVlC)YKKZ0v-qS+^=oeLd4mW8K15-4P!pQ9e98!br5oB)PS`N46JvyC@x#D z_n+ptPBf7RY=D7)EJ1>R2>rEp&Q|sof9lNrapk|Z=!(^>6w#E?`D;HB009`tdY^*b zL3JF%NQDbvix^--#Cp0Eh%R?rBNxj1dH`~ZQfv$n!+FYN36^_zV}nG+Tbu;rKZ2wZ zyAQW~runb8o{ye$8Mi^;jjAwle;mx#7NCHWkfW2ULok&YQN1j`QFBq7D1$?UNoH4>i%ZHnaKmRfFp*ORz8V9FqpZc$ zMpm*+F0YeP_gP9yT1kzD-{O<<&J#W0vun+* zmC@CL+&i()aB|Y2CgIpr>8>-WHfxe7LV=}BZ&|#2F;R{ZXPDGS8M9dC4Kt#|{YTB= zL8!^e`TLiIUq7~9Jghr(oD4Wjv3NX4@xD?a&|5CmAywn93AJ9i)kyziwqxvio3pUi zbg{TT9hbyhLHF1jCLsZWuGvCTFS@AcVNSJn`83|OE*HiXk(`aChzm?1{J^h(Eo25u zuHZu4cBklkD;v&D#A*9BNCW+%E)UIeP83Zrkq^Ulo8Z~^aFXFa5jg%quk8P|R`9bY%xzKOK;9B8XqMGR>wVV&!OM!8k@ zJ_l*}o;dbky0HlmAB8F1gtG{i_{tVt!jgJMlJFJI^t%+@fbDxmC`868vz7OP;zMmD ztIcdAFJ8N7-a+^`s95oTupY#B$G#|9Ceb{>y4@1ZTKeT^*bxNE2q4z1(Zx z+^*KBQkz%G1dEw=%Q`gcpdZc`WkI>r2d= zE`%N8*p3~v8uU;ZjB1rS8c3fW8#p3$^;jqT0_|cLgiij)B}dIZe#k_4yZaiGHQG;|o%W{; zxwVV@s;(Qw*x_Xhi!TdlIw8Yfl*;^`_XX^@I(HOf0cE?H0NQkT1^-O~d8Y zW%O3kIRbQOvDzB*u;}NT4rqb)^k=cuPu(m>H5p=;Q;fV>scy%R9?n4fs=JM!lXnEm_#5)6K&eO zBM}l?mN@6YNxVeiXWInvEPKcWT*AG0;7Hos4TM+5TehgD!Im-``i)xaB#R!OiW2b1 zXbhVNsg-b#?N^1&fMhX~b?kthM<3mNu$A_n%B)`jCi_)~Ls9XkUdQ_z^UEeKTb_c& z`(7pj^O`eYU*-3l{CpB%M0cV7;;j8>#CjjXr;UwYyZu+rJ}VU3Vp#mKQ+YfKwc_wN z{Kar%Y++3~MVsUW-bxtPIv)Tdq($*u;~{2$KVG03;(%Mvczyk*PUeS<#9n)yj9hys{BT=*#DOQ{gf;gi4i=e6Mv?}fbSFO9wFL44_|v$w&M=w4 zP6X+~x!XMa!gbAXY0n>5T9V%kHBT{xyArbTvGvju$!+=KcU(Z;ZIG$eLy3NIF^#kD z^^OD>v)@6Dkw;}f=U@2B-SSbZi`f09d8+wIQ4?jY1$3UxqwuWYDj)S_QWe~c$DpCC zl#`f3@?Ho9YN>hi5hWH|OaCPZOXG*yPV65Z1AzSxy5oP)Xm4l!f9_Iam38e=l#uvf zlS7Y*={D4B)U8UuwS+Duu&tkfwe|Z)^M7SoIBC|oXs?mA!AAZ7Amvyw2tI+oDG#?y zo0L=2!x-Ift}>j>XQpli1pI+14-0@nt03%%@3SL@q@|dS8@a=8qqKk4FKfMU*Vt7aBIzjyZHB9$NF;(p{BZZJHQL>UD2N zKpSm^zO@WhHN!WrC;ToY({JRNaEbpm{4K7`c&S*WD1D}qRcWtS%>cfAs)%k!(=`{I z`D`Xeo4bOdXZrVUa^BYM3<_@J_K&!vSrvFO$QOiI>dW(-acC&F$pK*(O+NP zjmwO!K3k9zwhkC9pI1B(aGWJS{Ru9nTRS8tl3FgN0(TeFwVlu@__dK@V@O9!N)d|*%Rh^ebD>@M1V67b%nym{$e>3ssQ~uI$|vwcRj{m0mD0yFEDNSj zPO0aG21}BzP|!`&e!>-L;kY3Y^Rfy|jN`;k1+C7-Ko zfyLqTVD48kRj2wVq+?fE6Vmv&F(3>4_#_C+=3@gZ$}u7&OsdzNb?ns`20Ji_2LIvY zKWWnbE$dPCKQ_1m^gpPO{(}?#mo@%J2(WLA9LyjiQt0kqOzkctL_*zmyE{1W zfs|;kz+d89!qQ zILBNXok!K`8e$PqSdjb0&GafO`C3;%1FS-=*Z9nw#cdP&;x&!$p%zCC|U0v*AUzc)@|L&V7{q+ ziRVRqUnH<@Wz!(Ai5n4Fyia$WXL7u6KffQZAp=aSj}wHs{@A!{y3`*TtOsUEK+qsi zBjEFR3^L+IOFH!t75)wzxH++gcu6&^$A)M)2()tOBUw1}i!oGTxIJZJCLW9FjkR4g<~`tK2}@DX?HhYksD;neeTco|3_me2yBR zPsN6-uv#M>kIjS|RzI~+5asci#nd8xqEwJyPt3tBRh1cq6H&Wq5p|}Jie+UF78F%e zjskz%-tZ$GM*f2!cI3sq!WYdpz8>u{;k)!WB>1$b9#vw^!ZbLYN28#IY9Cs;W7#$& z8EIA*bBU14OwD`}rBR`};#yOEh#rR+Q~R{^`nzw_>6nKF4=)c=361ZwVhAJnc3ZR z?mMxKjKxyM>~d)~cYJzt|D>j7ESZHx2yyXFcF6Z^4-po5!1eo^Q7{RmH z5fhYBaTD@9RP$G%>o1OJZyc!?rH4!VsVjCdrD!O}EZQ`;Ozh&xvie@^C}=H~_qp6* zymtl{P|34izv1-3V6ZJl6H-xw4@_l!tK9_8J`b4FvH{LyGj2oN!ryDK;~Qj0SB-}F z9BJc**obnUl7+z14yis`#<9HWiG*Fe1NU}Bn#!VB3KQl^_~ydP&?8<1nZEb3Yt!9S z$GaR7ylrZZneK!D{aR25bN1I%^(nM~O7o%mtna3S^&*&p&=(ovNp}!WT~e_ zbA}$DVNLA9dY5~&W}Ryv?3{BN5FF0xP~qp=!b?|XkOsSq)tu{*N@Tk0@HL-W!gRG>-Kk8C9(q0B#>AC7slYhw1TVGG$nX0x1E&0R+`7O~ zLqaVkV z#L$BYdWgncW5^uL6x)^7))G=;PiBS3G_`ze4OW>$W+kbFvSUzfFsI%!$K$MaX4YI$ z=ApD53+CzK!wrWKn12KI z0uKnNnI8y<^#2O9{|&AdZD^n5VGtn2 z5xe({Adfyrd6WD`_pnaQ*~;bFmBirmFv7e+lqYkPFH`br3h6&0m-N;M(wp6Pu}8Dz zL#ChNzV?1v2&8|#XT7CL1g3V^BHt^&aS1-OYVrmFx%<1H<9-_9yVIb1WT1`vjh*Nd zXE1Pcn^mS3Z;!|1O`hU5*)8qrt(34`hTk3blTW@^BYyYv=mY!&nBq3|K3Lvwe0ukQ zp2B|_phxk_*`YzXmiCICl(P5X zM-yksdY7Gq$obc^-~$}8k5UFQ=aY{kG^A_S{gKEIFd*Qt82ZT||6P!z z@0OG`G}x_iBwW{7k*M!{cS*l7V?Vwpf$-gsq9i{2dnQzl(x@Hs#!-1>NuSjvmb^e#8iGsrLFFC?4Ka`TbGR z@&JRoIiCUx-*vM7^k;}X=v?T=%2Z{ITq)ZX5BX@+1X;;L1=$G4M#SVr z6H<)th9C()#eW?c2M@v8ZIHmw&?H` zqO2?IS(cJ&ys5IG#ue!Maq@(BOY}9F`r19M1zzi)?{Bd(4YL`egTrd<<2?N?%F7S$ z?-!k;EwEM>tMpmB?H1RK?-!wLr@#Yy=%pz66VN;^b08{uBG;c`Vos9aDt;2(HFSyn zmMt}rk|rvg4NQsU{U%~HdO&ZXRF}Oi_YTnkagz|X7&oe{2tWhm63pldA)5}H4HClE zaqQ_p0eBd4TA+-T9V`hE!^(R@)bSfA=TN}_9|ZaZWP1d6QHH4IrO`ti9**Fb6OU@P zjZs#jj|kQlbTzLQ7G!y`LnhqA+KMVm9c?y$PZ74oaatiV;u^e!6V;JK$x6N*5J~+e zDE~r1S+t1A*z3r@D|hb*I%SmBMJvetUD&N-%GU|1%~+y2Sg~R%&KWi(D(Z~uRR?ry zY|ZT0(Mzs&S_D$8nI7FOPC4lNqN<}S#eB>7p%ZU^W(=meak(nFkOv%uirKc-6RdDa z3!qC>NWocyoG+R2CvY=m=&l$x`@uQe6CufJ0As^y;({@u8 zdQws{&ye8I@rsbH;MxNV{~kJVAg01WNgxfGae26xcQ6-)so8J?A%3UWZm#!?N37wD z3sb;7a}m>20qwb5c*Zek`b`;#T$&mnRx>Xtqsyzd9Cs`U`{}{FlVK63s=tPH)BpT9 zO|*DMOZ%MDpz5MRs{Ke89WhE{m1;ISgjsVNf~M11vskE75i2`zxJ^c*2lR&yV;AP2 zu_EkXj98nel_AD`R12GyIS0C(q#bW9024+Nv`!iQMpj&wA=Fwh>CgVqs43mb2o87F z=5)ywP3#(5njSK8*R#o3!IS!bt8OR#Hi3A~sK|`z6q^}9!<;nOa zFWoz< z1iyyRZ^KiB>d;G`B0M_S_w9iLe_quiNu2QgT38+)?u8|K*s_g`R76$Qavw2Q8yPg_ z&5-8va_LmQq(|1(6H#3GQZXEN($-MRDJDeWelbpA2DzOe%3oJ3&BxN^L%7h3CIJJDZ;2m`lxOcXmKlr{OPhSy=#K~}Q6d>;i z*`jd{7IQLBpru@D_cL)A{MKS`BbnGI5pAlNrUxLMEqs#v3bSPnaO>_{JV?S4!@@N*N&3? zeTN76Tm846KqLfXF2f~HcY_V!_|q=o-|4=V74_!&g>om*IPZ%=We=IdvCYc&E7L76 zFr|fXD~A;+?ma|e^Er?_ox2!B-j*awsr*>JUO2`$>{s9G`4S%}R1OTja-;&ZfsVtl z!Cgc6;Fy*y-r=N98koVuv5m`r}H7f^HCR_du@cuhLM&I#`W`UX9 zDMq?lO#_-wWyGNJ_ApH+soenJB|ZBys&!b(B$c^p@S`xqa+J6>?j2*wI9Qf9tW#EyVnoaG9rx}!ngo6P5R+q=b-C?@N6 zP<#l@+aZ&MNVDmTm55roWjoU9(6uqEZcdc^oMIW^3C@+PMruMVc7lb09-@}?xVyothEGXa_L4>w=r)i@L*&d zB_(2+2@yDkWzNW)Dw~k8G*Y0A!(aDu7C3a}2*xHStVGdm3oGx?BU&gs=rg(Z4NcX) zni-SK*PlXeFuy7!IHR~s>vGQv+5zso^Jf2iB*vxnCG&FX79g`Untk_jD-k+XedZ-% zHRE#UB_omLC<#sC-Z#nFo%lgR$ry+c4mF9}Use_EY5Bcv8C`AZRwVAN&72$5%*YYR zcTn?P`XqQ(83i-PQj(3r=;#P)_T>=E7UjoQp#|!dk8sPy>HtVDzg{iSFWpN;Oepsi zY%4r|-aoU6eAdG>IU`3rR*7Lf=#5O-Zf@8Xe#FQ-^pPnADO`p0 z{JDN{Y1XM&R!KqnZjG>JURU+OxTl5eF+mxEAqKQ&pOYGgO<{-bbX}m?) z)UqGHu-rGXb6YO+zp@>j;2v<0l5;~S1oDW+4 z)?!K}Zw$IvJLDBL(07*L^%NCT$-eBQnQGMe(6phQPBG^JGMLau8Y2$&XUy=cUOg+~ zeFaR~UI$P#W*_B%@{3nP_GSZBLELkM|AM@CSGA0D;%(wS|LwOGq8o=C(zCxc!+Ejy z*ApIoOrs>mHHMn+^jBHe(DXE8UF2eEfgaZ-ET7{sFI}wtyFiTnp0O+TZbc9SAEz7y zx<1?+weB(A?6bwQi)Eg1Z)9%DP_jBfLBp622cBayn}rr@EBH?Cc?|A?j&D$}QUB0| zV4dma7IYm87v#fM7!^ldTkazDpC0RcZGfMPwySF22BIrSU;oj|xfozN!OXUAIYXaG z=iI%MHjQNuAfdMcff7I%Kc^7uSyEM1x|F|7odLm%ILgM>Xw2!+P)&jx%O>7x`sK0c zc2%B`%N3}f9`|~p6=40W&#d76drgoy$TMgEtW5!6U~n|%@q1Aq+=?%jT?Quh@L3@^ zcR=;Pd&4U^U5iA3PRz*mVaAwdS;Vs?Coj=_K9fp~IBMou3RY9dB^8|DHY(C%daQXckU>L2apOlX zUDOW(KSW#W>DH1CkfKCHLa}DzAQuX;>g5opH!mYvx9Xw5?kM*eg*Ke)qN(^!I$ zzaN@^5ez?3zJPq|x_8cAOufX~>K3fAPh7o3+5{R$1xh*Q-U+5b*Ul!8+ zl*#uYL^%R?pzIdJ@jEl3&M)JK>0Fq%#YA-T~R^qM&S`>{t^B&HCv-^0Wp>N>a+E$L|Jz zLvqav4BrvoXK}L>u)E*pv$OnV`aqLyzRC6;=5w`E%^LO7vkl)kvE=0bj82x@5XhB- zd*Hh}ORD%pbOT#X2B}0}_pmZ0pH5y<6r(s%JY8{CBY}Ao)E5=#_?2q_Ro4d4XG1{b zA%sm0_MGgSxe_Wu2C;@yn4R}n_YK2NldM~-1Zr|xf$Hg=bg>A-{~`2 zL;66)_m%Wzrp?@jVZl)}e&Mdniktk zb;8k7+I?&JRPhH^_S?3_+@Xk!1=R@D`a4VCaQRrby{Y;6T(l6Uk@glv@bgZ=E4Ret z^G?aI&mVaeQVNLm_lc+}AJK2hGNOFMwn12|Dd6G9->dbwi(rQh=|i}@OStd`T?nSF z8s#5nMuqql5OdZ=oTpg4EpLGHs=`n9*=tc=^{64!yw0l?3+nF3GP9Dl-msiN`O9WU zdR*9pPk^61J6+qP=VgnAfZv)rxeaZ5PMq#xpWw6|$1PSenDh!yzx?2HI1>MV)0?EKSx{>miO)Cs|Hrm+*` zpuHHQS^CU`P=gG@JE$P%8a`OB@}129p~yfzt+3v~9@TBJT?|s1rWcM0`crU;Qvln5l2PS}%k>qBG-A z)n}4Qz&X`0wN1XcphODybGi`%peJGQTdY?=KC*bB72qqo!b;mW`DwOY`&c{2u?r6) zpAB{bEe*}B#G5r>Gn_8#A8G!FVoMU1yh9rJEfA zogMLBo|L|S_@0<=^Ev*aDDIaadj9&#jXp=EFPQyH+S>3(VV?>2sKE#O&*}QFoROsV zOo~UX+`((yz1Z$xjz_Zm-k`c8OCLyu(`_GWfiOIUdpN&n^9OIvc_(yb5aImHj}a1~4|g-Uc8Fyt-`Z zPJ?@eHw<|Q8vSF#%tjg#9>^`lzR~KXX+tohyG2EMYCg(q&Ml){l=#iMuU~GJn*piL z$nusVuSPUf)x{ajOgy3cRTkv>@R#l6N&HiT?~rqX7LA`;rX`4dWAJ2=Iv;4RxP=wI zXjTt)ARlQ4xWo7N;vdz2v8;)C8Ya;6U<6uSSd_Z=kQQz1zhj;S!f+*dD}rQ1$d>!yLux>0%sfSA?l%2%f3s>JVW+%O)^nPzXa2DF5@PhRsJ zU!Kti0n{l*)MR3S@I=r@f#O}=p^KgJtI^7lDk<4byzhlj-dBH8KX+znKRohxR;hN< zLPDa)J;~ADZNT7Ig1G>&o*U|xu=)%yiO6*fTnh{BKP_9BRzmkd+9ZPUYn)8JuD>p- z?OVs^>4?anx@3S241xl*k%w6#MBU#&LiUQv2HK9elAEohr^Z zXsuf`Z^~%Wi@m%8Ym~@cFD#NtMBg;5 zcLL5g1?!!f?p;S`1|37q9yr(|2tE+M(+;x*tY`IgZuJJ4!b`6{+^#+R1j3fjrKs$H zKU1j`^E9p_{PSF9ZS<(-vLNdSfxJMba~wV7PY+g3BCG0(Q~eJ)cW0FrlJnsQl*9?oy67f7oJ5f*i-khR| zc+gm}M31DSkEG4mEd+>Xn&XknP$I2Kh~lyR5*XLaBBHQE?*OQsi!N+QAxU8pzP9iQT(xl;U#KYGPcC-C44+p6 zmQXo_s|=N^dJ;&y!)4COsa#Hw^Rg%}w(Z+oRWbE3t=Cy4ueR}VW;cGEtB7xNte1RY zaRYn&@zC@7ItR*Q>C&LPEhFONIWkV~Mx%8;xv7B2thV9n+57qRgjCvzKmhai!RDZ^ z7kvT|s@gXPoI(Yu{56YjsU@kKKU_}w0OyL17+XT?FH#qV!+6DV{(@O^m}N$`*5Dv`X(85FDn8*7e|UGxXw`a+f(GX=!)M z?V~SFK`&7$e&KXBjBZk1bw=t6AFHvtKy|@Qt+BdzegTnLV^?hD%0j2!)}L)x1iN(2 zSi!T0aa&AhMWI{eHeYi=?kZ0DuRCn=z`TPRQ&e(wAXwYgN3U59@P zvOF!aq{6GkH;uZKD?7oQRr=sl16wD8IU`;NWcim$s|YT^R*OclWM)ZgUoc1sd|O$P z`>H#js=&02@lkkc9T`&KnBkt-VjV+ugbn+##f2lU=(2{-VWZGqK8F3l=*nSU$Z92S zi%)RU%2VouZKGBn*F1`IG{)}UV`IeQx`=Ev)-yo-HsPd5%~?4AIy87~ONr z^)Ct21ua1}i*HL_Sf#l|h!=+5C01r_?&K1o9`>Xwp;Y(dR1DLUXh)AE&XBBLWgT6Q z=|+1Padh(Kni5y`9~kaPJuxNTn-96L~jBS8h6rF%{58fur(a@f7-h+fR$sgcL;9-c8noUmjh%UDrNE0 z|G@0=+ATQf>6JKU^}TU=x{~A2E?$Ogd;)x*mKMRP{NF7v;?a_t{1h~U<YS#Satj$VDh)ac^#NHzAV~ArpS)o|BIY9n{BQw{cD*g^tbsCr&?i%L3qU zAeGL@^pmy(zvLSF{se|FcC}h$)%0jfkVC5HN$AV$Rm%KH!D=%`m22(g`7HMa zm@w>fB=H~u@jw?_VjEq~FK-YN#4}bu1c&zZ1aDGT*sEt4jrD;Zd^%sIheL)?CR0#t>=+*Rvy|fE07o=3e4RQS= z5PRQ`VtSLYG8}!JM+uHS?36c@VczGw?PeZwZfT|bf8M@9`?d+N93{rPP;LNc=<_|lFvonMQBm+EJ;sr6T5u-`j3df3 z%;Dx8IcBlmT_*RNmKRW7F=ENGSf#ev;6F08+cC>FSOAYCr zug|-C$7M`6?>cULP8t<(pPQhDOak3i2Kvd^RQu6c=4?zCLLP8BnTaE(uc>Wn2TjMYwlkB z+>RuJD8-$Z-0sh8y|ax;GTFIMBbOR$-ZSrs4)gK2PJWe*kj>S0Ss4<2&hm67G8t4sxU|^+}?opLbx$wMs zFAEEa3XH*mb9H}0mej+AiF%`A#o0t!BTBQa&9broDbU~U)-=M7>alD%+eWn(gt;jh(mo+iQ#N7@4 z3P-oIK5gcAes(`Ucgh^_hhqTgkPt3019EoJtXasBfm?Z4ZN|QS{F?cdmINtBci7n~ zM7AtSI{9zD0AB2{WulR5#yBJwxGxhP@trX#9J1+13)OB!p@T(E6>~mmd=Mu7C)5P& z&c0@3e{>V6aQ;|Y$MSKoXEP>M2E)`wDEdg(VJD(Y(XB)MO{6p}4+`vvNbbURcolHE z?sNClZ@)oW_p^#ndxfTXL-U;l)hj$M4oCFN^*1j9&U@tb7MlZC;VPlrnU(rW)Ht&w zY4|PyBL}>m4z{NRZX(r4?Dw*!>4QWtnCg7Us^o7zrSCarXL!tV%K7(bq2ZFgf7Qbj zqTtrqfB^yNK>gp*`k#YpLREL2QPt4C?H-L6uUm@+!9M%XLBK9!nlB2@cRpTaGH zfm`erZ9B=PTQ}h^$`u}h4&j#X!F`_sF}cTM;90my?goSXli#GJIrUf zb~|?8+{yC}mAQ6Dvn+Ti3~74)N}K#};wszkjx*DV4@WdgpJR%2 zgvUJQDk_3kamrX>3fAoKDJO~Mf`3f#56+|Yks2}$R0PmLHJhqWXPI?cc%I9wPn8RD zo}xvAL~{Rd`l`<~+bZ<_@_1o?&u8-@;N z63HA0jWKJ^7d8ryXR@Nfy||g>XJ~cUb+vOr&DXRWIKbaoCTmS=GH&1}6&-U1W_a*0i|9~0M zoSa1Mnpqe)1R>1sA72^i1_#A~DjqUJg@J8M#B=Kb+@K7F3WUAxHs}F@RwfIYZBZ?yUR85JF0Fz3iV6;B4)Z{&Q9_LwSiHrtPp=cSE=adB5;)zjD33HWv7>@%9{q} z02(2?FoYopTw+>sP61XFbX#oSh=)+K5|*YN9FDh={6UhXZga`9Daac_e+wo&rT9hC zFTqx&{PgGx@vxp27Z1%3OmRVz$&kVI3h+*LrUl3b)QG1cB_o$qL~l^;+*wO<2?uLp z&c5cpsP%BVAo~=s%_0-FLsQC)$l^t#QbL!s1MV`pK^uxIE0(FnQ+}c>(eR zHrq#20p6ArvGB~pbA`(0HN{u?M8%0ETFbiToT+|5$iuH|SkAh??ZE_)fi_ zn?HTHR}i|(nCz+n-)@r68@KoGyCnrN$vWqafnWqX=W1k@O5CvX`pEm|s`pAOVCd># z=97$>%b=|?TQ+3)2G>~!va$c(HBDiQYZ=$ViE-03%u&LrK0mPD8m3$M2G=*l*`=&( zD&{JJc;q(iLHn(=B1uUT!T_otb4j|BKbNKIZck0LQz$BL@EiV0$kpI80PH|uT9-eX z!gqz+Jw89B99~bO@dJadS`EjKw_FXC`{(_FKKAV0ZMPU zN2!}MpI^BX;{8aVmnTGJ53b5V=d`8on8uy==+=I8_lTaK!4e*fXY}j0qekA)$2;0D zwdc`q(0}zb6Vf55rj=yc3 zxm{hJ&G38S**&kkey5JJd>sBiAD8w(>iawl@1)HJeIe?&NRD&Se$e=E9*&ZOhTT&D z8e+W^!hIl$I>$nX7Xx&xQO-z>U?L)7s)2A|`7ll;F*s)cGBUP?jAwxiBO~#?YdY}) zO6uT2CRXo6#4mJ5RbkXoQr3fC=J=;aA(-|KSsY^7X!ofRZQ!a_;>-Y9;OB%8z;9`$ zKa4E0Qx3xzHb{y|W+&yN)ovnfYw2Wrfbn|f%9v1HKTd8rd5m1-5p0ybrsu)TLW&`! zN!4dk05wNtrQxsEUW4$*12U zR$BcN2eL-eHW8tS^+Kj5CIm9E7EvR_VJK}Z+K=f-W@EF#4`ix*xkFLdSS;eb8er0t zmBu z?E&C{>lMu|D9LO^aJ|Y@8pwJKhisVjtzZixG!n~>S029U_(dL1#Q~m7(~?aY6pGB^ z-1N7j=_jo^o&hYRV}(Qf;bF=(4N;);Tp^~_qulad;H>C#?$+2c)Enw78B$E!6KM+l zgXiueeU?f3We?5~iy$U`3{Jer<|f%ATv)ezyqYt#gRQc}1F~4R2Ygt!#yX>roD7GS zyd;am(9!LLhax(pO9%3a_sH~szrWJJX#GTC0qrp~E-3`tV$8x8sP)C$;}(v6cEA0S zlpJi5=ZS68<{1u9vGNWIBdVDBhuA8Ysy`&s7ym?K9(BgdItIrPV*c3qk{T;L$Vwe= zl=O185p%Wm0RWiHy~7&Jy(bc?8V=nPZnTFuJ~a7n{_tRpdFz58sng6kmaGf}ehNw? zw3KX!FAC244&V{wB!WAGu%Or1bR}WrZ2r8yg2(Rdq<28mY7^njU?KP{kx^aIBHH5g z@o#~NGbPO>>8Y1~fFg*}0ISo=uE!Hck%l|Ua?4Zh1^5!3;q<~sgz^27ZJM1YhwedE zZ6z0@j(fD3-<9Imx7g3~arNP^W^mE2IFLn3mDYgMKc#0%BgKz4bo-qVP4?rgaSs~f z{6`&u=R%IT)pA+o$rk29Os{YbBP$?v<@*E=7|V*jQO#$AU|Q0du;uk-r7W?|0B{+M z<|hK+cba+OAG>j=Cy7dO%m`W9T-`uJjuMA?ot_J+3In1CZ$~;0k?pMkpzL;Z8jB zJIi>ru;%;MFmEBWm9<5FFv>rql_Hws*<|KSW5_FLA+3Z*Fxn!oiksNo;hn-$)=c4N zj9)c8!uOWRP4bR7cSFS!#Z=0$c)!FD7Q#Oz^@_AW~ME=)m zfK8R%gWPUlk!`ONfZB zc+VY0H{9)GGm;;77}d^`n=$Q7>L9OBoh#NXy8vxgdE#{ZfVXu)rWFr!+zGeqEajqD zq7qR9dY>7>0o?d00=En@B&{k926q(1W|*AXog~$m1-&BsDuB*S8(vYW4XHFdjY@yT z(T0Q%yLenNrn@?)xCxJEyfF9(Kk>SFm;TBvi&~ny`}rc+f6yI%c|c%q(rDfGoql@I zpU3~5?FD)#KdvWI%gY%?S3A#LU*Sftv5P&3{*?Co)-BW)%LP}ljqOFDpdybabNFG7 zG&ggPcg(POBP?57=6hr_`K(fE`weDh)(^1|4Ii>+ySn!$GLBfrSS42}SPKIfz1f$3{$!d4a z9(PlEqxuZen@C%NLMM&G{i_tw7AHj`h~&6-f3=z6`DnJf+w1=hVu00_#OP>@0==b5 zo;HX@OW9;$1Q6X373z05cB8CU-F+#!+W4-0qA9p~(d9`_nO@Uu37*laBilv~gxkm}dFY{yf`UV+87GlsdWkn!{AUBr7noFyI`l z#ZJJ)kx$=a<}r3BcQ^SDE?e50K)JR$-S2wEM#jkE&}8OQ$ALjM6WL_&o6p&J&Tmx5 z%UHbiqkfFBPRGClfs#Ka62fo7PR6W}w0S+y0~B?J@_=K1rZTk0Dre2~gL6%<*P$=~ zxl#|X9v3)~A+0x>sR!UvC`*yEuL!kcP>E_*&XH8C22%&*$A6X{Bh4XWULyiqwASff z*my_nMs%tQ&scbm%}fok!5$lu@o5Ozo;d0o*HLR|D*dszH|$c$Cv_`=mBJy~S^693 zUrmv|@p%p$90&*v4hV?%|Irl1JpSWi92sY{e>Q(NQ}Oa<*rs<0j-LipY$> zq+z1ONrVWZL5NpVI*DQO3TGJx{jY}#?M<{*YwhvWQZcHUSCpD((&}2KDYs6CMH36~ ze{*sJhe^rdqkCVsoM+!=9&5O6%GVL&C| zc=5#0nFo2T_R=Nc#`m#0`0WfBqp-6h28NrMc*9SPJ%A}pJ?8_^hp^#B;>F|zn<)t} zJ^i`J#tcDQ0~cWuSl)ev3b=eH7QL1pW-J&|roFkBQ`~WL=r%mt7NiKd9Z4Yh6mrPkc{Jb{+l+f|BT2X~4#kiJ@MqpnY1s_XG}WtV=F%W9s^c4zJZMklqqiK$g{TX_#cq(uk!s z-J+iy74m2;LJo%JBt?wXjhdA{MZA!prgc0gywZVmF9de&v*aA(Hl>CuKT3G>Kz^(CASU!kcM2Vg=9r?O-ZnCW^%cAY z4CBOQpXYiNwZzjS$kO3UL61$27ZDcYr!jKk z{lRTE_ZGaL+?sTSnQ~7u94tqIO-@kf5$tG(cn4@+5ybsNLT;Ofz(YUiV74NzxdxFu6}*OAO>H9Ceq&!ei8a1+2L=Fqo0U6M@3u?`by`c zC=Ri(gLEW1BRcJM6;IQJ4n$Z-rtPoeNk>l+=Bsm_;G=tJ)QcL5Y`+&7LoM_hQ#2Z? z7zGBL@_Oq;DH4;)dt)39V5}fAe$dm9GpK|}s5|_|!2JJMeFkuUj!%3Ilm5g=+{1R> zU*;^RE@tVj$?aauO>DXe#N~SWNtj-weSHUfFyCC)ES9UKk4lGr+b;etxuegNs#b50 zV!KWd)iuF>jUL`Ws;f+NO^{mB?RGUDUG?g#^E2-C8?*Wp%KJ9a{uHbGF6H?7>vxmi z0`dK`747>J=63(<rDH?v?4%D`T3U+ z%H>}V2?vOI|Np}DkAD-h$o^q^`G1(6|Np_gs+c;u{->;i|IYT8#Y}SW&_sfkAau>i zYZcgW5r3p9sg;X?!qro}st#>b+T!qRAk{u$_~o|(U@;L0TZE7M5%(mBcDOB*MZoF8 zGjgzIyE8btzMntF6o4jwPY91~kutYeEY(nD4|OZUa$~q|%_|{GdOPu8l(V;qP<6Sr zQw(X*cJa-|ncDhVR0A-5&v_m!=Tdh-10(0Iuj;8E=bpDc#0;98!robmGjX!(o_(#zgv3nVYI?W{#Ojf?` zm9hzwTgI+m@||4!FefOTK>hbgDd~yuI_jV@D%0TuuP%B?yqOkB@W_ks0AIA~*eCky z_zbG;XoD8`WfQgFUvmixIwR)qA(5%>*J-W5ps9gUCh)RUu2>pyIzusWmHjL>)1T99*b@#N2-#VE#?ljR!Z0MEQVoZwHQZ#C)61WTAY+lbCFtR=J)sAr{$ zPiW8M)Hue1eU``urHU>2t-2z0E5SX`|BtbEjMA;^k_FQzZQHhO+qP|=G@i6=+qP}n zI+=OWc4og_x9aw-uf87LfA$_@{oG?k#EiA)nlTq=;yR6lheDRTK^vu|TUHVilYbx{ z#1bU~h5Tc;{io3UU-eyv#Wp|=0tm_wDf6%t{8ik50i% zzg{LO@bVlrvG8+#TW}0FM{MoC#=CsGyxr{m997l@eMNBIB8;4P`}9nUIK4fsa7QMQH~}`wG%mnH!cr7JpDNA}s4BcwY2Y*koSc0?7>91riiuJQ^?cRgXA>u=UsPa1MF zm0}LvYi7HDetE0L#*G6e*E;0lxGEAAa3YJZBSvh?{%mymxC%496a!L3ndN)o<10Cb zc99`$R4NN>pu||ZGGP>EaBV(#v3OyRDifGHGRlsrI{4^qP_A0PT+d{vl=PyQ+D)0g z^%`0L*7D@2DlyNND94-)?aD7R80@ClmFz}2wnpWL9SyDzs61KYN!eY}mx(ELyfh@i znUS#A%WOIZbFQjVneLCqn5Hti91euBugJ6BSg+2=`87dnc0LDyQ<#N6itBrMLL_#QshT(Hxi*1WNZ2q zR3}LV9HkPClX6`(5Z^4Wq>$ftK_Tq6sq?d87z+dS6I7Dyfa-n7cFF^?ZrXh`sJg?% zkhR;+01ixS87WNVi19lZPnAI(&n%o<_=6Ftqa28M8A%DOk`>j;Ku5hB>GtRsPu-=v z_M#jSRHKYbAA`YPukjClqA87>^cAmDgWtqP^yNrUEbW8!NA_Q>A9QV>CIGvi(5weP z;scdODa?Mt6$LD1Qr!`vS*fo=cOvGO(y=i#kwHWNnGayD0)VZ9L*^4`1laFO8zfeu z3+G=Ub+hxY==D}e_@v^>P377{QYnE+88$mgGNL|Sr-7dAZ|KE1KPK~b=>h%KgSp)R zzLSA%Ufv#;e0HEV>@x-o;y>OYhcaYc_V9M1qD)aD61%{%ghc(^>{({Ysh(5?bfBfzgpTWHw2sQc2d7DICviHZx6D+PHuIG%-;;C}2Hk7CL4xhFT1* z(&kZa!8Y$fyI*)?|6q||&hS-U6lesagw%OZ>SZN^US0CUtxI=s;plJIVBfON z%lbUO9wp5yySM$(5aW(*$8I|Y-(T2{ZLXx75LN!MAjDGPR72DP(hown*T0e(Xb}L( zK>;x&Fu)TGYPZ_V@JZ6WnuBxe=Dm5DvZd{%;~-3mety@N+ z{zR)f{pvA(eG?1Up{bNedu7JZB8$zA0^BWUm!1C|WY?h~@&MWgc+a*!&A`**6fqpE z8`uC{sPLjgt7TXvYvk`n!09jO9WPx82pX3_fl$I2P}D~u=|LgrS0m_)qID^TSt8sL z0WqXAP9a?irwH{lCh<8n)HOsBDrkE{Tn?r{1I7r0fo-es~P^eF+oHxUI zZCNcSKA4DOhY`@TV$+*p2v?*NGQBCwCqkcMvgm)Rs4|TPXoP>(CX6lz^b74xNIE0# z6U?zbXvY-?Z-7F|^@9)&vR4p8-Z_~w0wltnkAU=U=e7Dy?hN6xep&tr(3XMHc7bu@ z^}yO@2{z+3K_~O99XR@?j#JMYah!FQY|MCoikRX51G= zx3R#G>{bkTGt@VZS8m+mMo>29{Dbv_J8p&5yehbayDHYG>5#RTJOJ?{j%`cu${Z{Q z^Q1?6n@?3X7fQ0q8H6rVl=Z#Lo}W?fovAbMgTSH49pwLi9Muc|qe=53pd5Su6h+(r z_)e04r%Cpv|Efm5D*uu8$Je&g>Z%7u9kfbZBWNd6^7;jQuSQ5-8v-UgjM3EGX6E+0 zZNnbQKh$793L#Tciu7(}n7}N%YfF`KKCFj@$742ogQdy;`}-5z5Wc)v6SMo#k4{y@JDN=X*bBT0<2GTSWC3;;uEL6{-qdrUa+%{FR zZ5YNX`~|!NtE`Tq`Z!b7M>2XYN9Z{{=8yKebjvi{gAoImK8Fwmz2k0zpJg%(O}M$pCP2PQ$OP> zOPr7%5A9v2%n1(CGz+YHhYo89ovgLXj=MGNP)7Cl1ScbODp6%9-5QfvO1x52K^DCS zY*agQqSBYNw++nSHu_!;{JcL$JU-3VSDOwKlU=B4 z9nUyLes))oB7Ry|l?V%SsPb;m3Pd~fpSkzN>31rRH{Kv8I_=jJBsnOsu5F!O=3sa7 zBb?VHM>}H)PvZUY5AjPs|5CH1$x|Nl{9_pMpn!ll{vAG?tz0eb%v`NZ#Oy7s?9E7p ztt>>%OswpTZ2#B7f6nex(^J7QL-j*%q=lLalM(@|p_3*GNfxAOUPPyxw`Lrn4nKTp z)EfM2-nJvh{Y>Fmq;JVkiJ{K(&r5qOP=4VX$Uph$;kp(^E=i~?W5R3hBljWql#8J2 zV{H!sA0#~>K@hu1I9n!4SJ6>RcuZ@F-NprZv&qB;*%(HCBYs|o+0LXxe}{2f&2H#Ws`2MV=bGu~@drR%2-8UV@mN>-A|`O)0d?s#iyD zDPV3sn_Ix+p7BX%k|h5XsG?S7hxTkaujD>6iH^6~!rY_q!|`Yyo}=$u^v9ap#7+G| zeWu%3j{;%sw!J`^y)L8hT6%?Qt%h4ACG||(B?uB({Mn>#S$C4vj`rjVZEC zEgC8TI7Bze$x3V0lk;y?Y)Bw_4zdg1!sIG7Bf&)> zCim4tO1>ChtxDTecEnVy+26GhTkMv3_H;UQ9r3?5(|~F^c0;+QzW{{cgc!55VH?sN zTirGM^BppfTl5GgAFx`5rDhT8Bsyd}DMS&Uwh|&gCrRUR%Dg|d{c4BQr|yJ1MT-F7 zN%)^z7+B@XK+xO)7hN*kfrZ;fF^3Er=TH94)Cbh2h9l4hyXL(J;-~zadzp9NPdy5h>rMbnb3HZ;Z_thg*atr4pB6pn#U z=p()d{(eanhkan@MAf_a@sSyzJfTYAn^2X0k;WMUGA&&J2KiQ-n~s}fUQl5jpRg=pRSvV&?2_m#4tMSy0RGL2eM zi6IJWomyTie9hc@^(J)RKM8w#U5>hbd(H=T z89xa2-N6Erj5m|DH)^*O7~dKLP#o%q_!!@`eK#F<7@um^H&MS7s9yy;dl+c^lt_Qd z_8p-4Nhx!7F1F_E4P^4=g=ZrjDX|{_#yCBJ?dB#Sg7qFX*ZewvMIBvTYxH~dv9-V~ zw*JD^=v^%~B5l{?SY!o94BJa?ZfdyJYVVRE|B~?mc3|x!-mVgZ>d@2a-s*9?OBYaV zo8+0F2Bp6X`)oiDs%f+)QJ@7FpCVZ8-0hRoHSTs%^(TJT*3aRrpT)eE*g;=4%=qE6 z8MNk$wf;8wzS90(p7(*gJgX=fRUJQJ_J^hOoj4QyQM}bUf!lzyaD^`J)g&ued-{f@ zQ#G0(bd6&J10LR!pKFF@3e-4oyK0}4^oO$Tqlcjz?{fUxb8JvP~MtE z>9~uc3)BVF59Hx{2D6WI?*y~ct|LQZ)DX=n>iqR+4-uXe>NhPbJ!Ex+0~rdvOg5pT zf@Hac_03i|@i&7Cl|Bp76)X&e79Att%D=Ryv7`4V_6>z{H8oNTp}|%|ylm-=3rJl6 zheG=8(OB>hLj}bNc0vLqh8DrzM`6AxCn)@HAqxEZ(zMyPbOqc?%H)FsEyEa$aXG*B zIPveS@ce`ZlKjZ6&4AFp)~gTIZB=d)BKwX^(DL?GQr3j1%@X8B+8Pwdc(_!Z6N%X{ z@(zZ*H%Ss0>ztg07t!FK9@>*v(3?^d#gQOotMMzUDz{4&XuR#UA}jFEP+ z%9U<0PRwG|YU9F<;mqeqj}`lf6jhoP9iz*EKl=l zAjiG^fFL`uVp8F#X>4*CWV(+5Yv*0=a=#=*`Afbz9`ZKtC-kwok`32l=fwYE^=A51 zN|(v7s_QmDMYu`1br&{GHka3rR<|g_LvFF5;(9!R!+iXr;-2v3&8!Elsh>iHDpUVB263V8QVsdeutJQZ zDM$&GWfweR(-Ihtegf4kE}Fr|w4ic>7y7=_D$I&jSP_3arNlO&K6mc?#3ajQ<}+Gi zUM(U&2^U&`89ugH>q;)d>}cK{j+fS}$%l07MyF@LLp5rrpezIkeAMk zzzwCieunTG3QalUVZYGODT;OWi?cg^NeHrf<()mn(1`1DS9{Y~bTrxq9Bm!D;SP^W_NjjZ!lg$)5o zSSF0UL5P-8~#k9}2w z|G`hG^}&>3;~~^=6}H1a4DqbaUeCcb8HLNSTdH#`{j^GoBJnGW6Me%X$GmTY_294E z1o>==?IG`y65EPXl-1x0A5_wiVyD;1r13|$@du+W@dUb5E0q&MjIr_@~zLih- z=`E7}G0kJuXFdAQ_TbH%cQWB%(Yog{v1o_+sgp%L?P%izQ;HeWv#oC0h*qmi+Q`N= zx?XFJna5e7f4j#V5c}km6=h#8Rg99)_ zd)cFP+?VwYB>7DkcjPvHoC%l;d~xF7Rxv8oiG~>qS1AUS7<^AEg(r0O(D>5FpGQEk8>+;kb}zZ0S4lcUPc zMR5e^I#dW-lmtBGKp(F&j^Wa`q%*@Ts({l9Tm}_z{UR++>83mMl{45^W)hV+7Fvkq z3|P%b>Q9XCoXPY~A%h?A1}sDGS=>ytaA28Q~90Rr#2<)c)V4`+DI^wbEnVp2E`~ zi%d6jAzpW!(`9lYUU(+@bLkw6e_${lLf2)Zkc!Pkt)L*RsCp%6ZW-P7wf>rRYaEhs zV@Q-|-RZ|1HADCp!bzobXr-^|q_3r?|5~s$#y7LaOh;hmfSt~3WAvXG{45WByCa=e z&`!^5W)#Q(exRY97GPs6lafmJPXxS?c^`vZpWH*H<&_!tb}T4$Vo)F9#{=cr9CQ(= z&|ZE8X;ANelb7&*jP{HhEeCt=&$Z;A*d_q^dPC3aEC%joLY1wfy#MI-h4vee7p|l+lWlBc4 z=`|eRO0kf4*D4e7BXL>bjbe&9h18Ut{*|4MKmXR$p9m&5Vy&h$Hr{695eFwY~ z7I*Gfx`Nno4osc@%L>9b&-#og$6RFGBy*<0Qr&*>l6aN{qQi%Chjfi5eU{0ZLc|YN z#gT0dl{dgW$vn(4RjNq|{}fwyijRMuiaO*&vy2iY)>d|*4lsJ90-? zB}5t>3PY1rH$E`LpvhPTzD{zym4b@>N}l9^m_A3Bp3xyc4eBH$d~gUj*n^9>9%iGp z#3DwLJEJgTTy=zeh3}0vmnX<8E*7*C+g_jE<{T*&K|q*;4_60(>lgV24$-kmhM-D`r-dzQ;o50QPhmDPngyUi&xL(i6Jl4F=xC zXpV^WGAxOV4dDnDhktHTT!|fPQe1B%U6CI7Bm>}_P^+7)NRMvTRG?c;gE3X@!(XP! zE;DRiVbmnrrbWyiYnp}Lz%^BGwP2?`JepzKBx{?B!#?GjWoBGNy44&x13gr#)@Fr< zqcKQ+aG)(~?EeLA|IP+|rZ!!+Rv%fXtaHZE9_tqs{K$P8xOX7JJ^AY~Jv1aMlGAxo zrzRl657d4+p&g0?=lC>JZ>;KpaI-RO;hT}W@fOoL%;{NC<4Gk^J0md%oviA&ctfI< zm%ZN_qqa8l&XlRn7l5&RQ_vTpE71d|zMehM3HY3Un)@}NTfqIlPsU!RjTk82xNi6{Y7 zx{h+^T=VhPknE{qAzhl(Y0mgFC$7i90rvfR*y8N=Z(RHD!QM}r$TJ5`NrHlu@7Pw_ z!Ax2|1&a+wr&O6eMHmK0xYJ#Sb1wBCeBktY1zlXJdc^0nx+!&*|&` z&R73em(`XFiW=rm4(m+m)MDw23?fYPJOpV?xU$ZIzA`Kzpjcg6Y1_W_d{BSTe96in zd*LSt%Yu6-s*VxT?K1kTYL5SHjMMMbG|85pMa^KAYtLi$<-@+u#r@~?Bh3IZ}eEjr4LHvl0>zB7uz0@<_+yF6H5&Hn+Z_;yzIC20>=G)!AiRS(2!498QN7il)ax zyHcHdrYF6pDMeT2Kxd9$+Q_lEfjX2j-CA{#`j>xor}$61xAOv9H=fK3Y>hF;0xav? ze4h_bmduWxfv!wlnYE@y+?X|7_IzQg(JAXnF``yx)ZbhN_b&O3SseF+Sd)L0a42B( zA+AR8$4s)fj9Pq3CMb~+FF9?+!|FH zZGf>0P?wV+%P%nhid5M>#EJ%Ir(M}PSgGc+YCBKMBx*EV2YBQZm{@z~5OrT3L)B4; zuuY}b(Cz4{gogD-i;QS%=mk&pGGAU{iUu`}xracn)NrXQx%sL#b~2(-T8Q!NRc4f` zPgL;9F?d6`sez1a7yNmEUHi`Qt%~$Epmy-8t@O%O3SAK9zNb=(Sy4^_-q z_4lq-mX*1=x(^tE#!swI(e%r$N9Jl#h9@99poc};ghqzeop?qNTX)WSx}%Y({33Z3 zOz)(*#TnK@RZ6*-Ge*1mObV|L#py+yaWIDIAR(+fgk;#oQE-bT5a&4%=gz^&u#$Yu z#H|aj^im#(g=mb)oFU2KRCS1GCK|%t;BVkpA&#LpMMUnCiawm_acNaX~3AsD<;;0_@93=s#C)5 z?luhHg!6@Fzrr;TEck}3iyyLiBP_gh|DhOE0CZX=8VaGYpEeCC%Z=z+A((V~Atv ziPtE1h1UfBCHNt>NH81%2xtTDe}<3$3$^~spT-o8a~Bmg)Sn%5uZbhz62;=?<$Ben z=8{I6C>bblP^&0XDzFXxrL||Fdwm}-s`kSmnCq_AYwlQegETe3wLO2UAMK4SveeuC^FgZX73vl!u zFa6RVFcoj0Q%`;ZL3LqyaXwfq@_T0dz>zU%W?N0>;p;2vJ)4xji_(um$PzqqT zq&8mC;xJQTP7!GeO$c+hx3mwrNsbw(r&?Dq$oi;?$Q8a3#|yod%(t#Xpt? z&S#dw`PT>K0UT8^8z6LdOfpN(m2Ub?oh+p#ZZ8JYI@$&KS>km8bBkjXXPWcVHmTMq zD*b&L9IhYyfjtM>gDua-S3}1_%eX6G>Z5KVIJAGnS!pU_O(T{NIasXSHCtTu(=zmb z3o}4&H;CHhm29DK&8)J(@EZ7<>o$ErOVOpxRkpGVwl;!%RJPm7{!O(yW*xe=%j>gA z6YIh_BV5VVHOlVcEt9X@(OSX0kzY@>kA6rsmxZ=1w+d;T=wSHW{FW*^DUUZv3>`HF zZ9fZ1NdZYY`wh3-h_saJh>^^?mu`=C8A{)kRlI31&s@qRU9U(rlVyFfhFPZE!10B_ zqMf@SIC()er?kQdmlNsU-|P%xGkCReQgFexjBE9T7D^0z0y`kq7#EKnlF8US|Lw z|5{vhK;{gky-EFK`!kiM)!oVPBhth~m%_i#EJIy#0Ij=vAB_~PJCZa-v-bed^pV+L z8LtnCRf@+P$u)Cm3)4&|Kag()J8P#=In2~ee*g#Wa7YK`K;!xAhT0S1M&?zJP?at= zL|&8&8j65AeUSCyO>$sN)^~8IEM5O>D3MjwhfozY<^kX}0IB9JRX!GR#R3i$`w7jj zQ4h+4<`WnUt(;G7*O78jyDx)laq11Wx`&JE3S9XF)|WYF;{(iH1>{H-zq9z%*{`r( zY39=9ECRb;`r9(0u^_=kd$hL1_Jc0a-><6hxS5`dQECrrEG@Z4#Zt)Gsg~?`sBPZr z+d#x%o~x=k^$#}kazO`XR3;1>Z}+3VhLzBir01-guw%RXDS2S3_6N+3pjwuy?qAZ@ z67%t=t|6Hry~&Eqq*3ZZ-6_G^^p+=|XC;v1a{h{kGNs9kq7mDKOj{RDbx_`!1Iw75 zlZ>}GND#4-(?fc1pOEuF#D4B(65+Tgct5`Uq*c9#RUNAxJ_lcnnzk7ohcWNoc2N$; zGS@$RCmHW#Gk)(2U!)QGg^i>~C0=r-5X6g4aBc~+Hn*bey1_5MC64s5*9IkyjJUBR z5J5Eqg{nspugUC(Q^tJT^9;m98}tqoZ98TQ*4YID@C6B+#+`TA7pazlsgT~F-0;X= zA;NDNnbzNUKD&DKc;B&mR1~p&RpPt%`Y$%F93B;hazm4Ih4P6sgK(*gu;j=n`IL)1 zuF1CMTKp{#HI-p6-fMb{xoHtzx!o+ z@Ax`=S%68u~G&2Y^gt@0ahop$PtAAWf<&A z^gU{ZOT-Y&DLvU!+!pHhm_se{%4%iSenm?$T;m?zsH`wFN>Crs)RZJ?aiz|6y!vWQ zrs5|t22Q~|vZ4{l>iaX<3cob{yV~p_uYIPa#SFSiw?*fVZ0? z{iA1u|4z^TQ7{X8J2QLN|Gd(wq2uv?-@}(rB40WevkBg{MX3~Fc+#SYe6|NLKPIdG&H{IKBXg?r?PhHP&+QZGSUc<*T9exZ{fZYcpR0d zF1DBO?rU+-5Ol8cZF7(XDsR<37x8kYJ3vG)@Xe=BS?X(OhYo~sdgFBBkEg3jiFa~E+>YR8u)0Myf#&Byxi8D zs_6GA!7gcZmS`>LtxqJ?z>M2)MO;n#eS^ z?jVgKPdURUvbWLf3JkiySeTh&I`tH;#w9|Zp+qm$6}zl0DY&{LdpL)Exj-~)NB(PB ztnlCN-Pm>4?W#U9LtFQf9J>p*^t(}q<$#xkIoC@U+^vWtvXtc!IS&0+@n|LViE-~h zGV9H#Q@5$c9?#kE3x0>u@NS_YCfv1KVE*OX1YG`6C^(9{30zsZhaB?}o)e!DKC`9C zplZI|-Day3&4F3D85)eYd4Uzikgkklr=>(jtsld~bG4+MWbx8V(JJ*}^T9q&#MHl` zSt?R{8jRG~RTnAZa_PcXjhYsE?0T=Z%(9dC9^zV1kKYQv+KU&v8)GA+_29fak0!`9 zgm4yQ$cC_y&a#VQX6ZYu^=1?a#_?G1_4(XJnrISbuGTOfd%;UD(&91{Hb#&eK72D& zo2F`NB&G>jggihZTYA5*M20>f!rV)nwj_VyJV(1TI4=DJbV1%B7sCE!7ud6&>?`Uy zO6=MP*?5|SuUf5YK%`E=>S%E}$ixGBi&9?16IiD)*YgpQo^rKP&||f<^@8Hp>bDRL zz69J$XtIm`{Fb{lb2#>3sy))!_cm|`UBj_i<#6^@nRz#7z2Az_q1+hO3T$NTgF&$% zM4ni(lyuD%r);=n9W47q$>M5#D}yNS$Wh40OOMOZ3=py{U{&IZ({aMtpCi>jm?J%e z@F#DW91}tC4$f+Gl(-f*qG$MF~AZf2sjP<}-z+<>Coi8+Wl5IZ;uujPq~y_skI#9KaKv6Pn;&KmAs z_kq8kCe49n`sFyumz+3<_$vSgJ1?{Rqxfz9jX<^GZ@sJJ7-Xt`4W4a%ySc6-{*#ktsA(B_TxI+crz&@vSgfTqX2{u?Wf>vhHD9jMMDDm~C)IY1p7LADp8Bnwcm>oXW zT|MSJ@nmI5%&SZ}4J^7nnf3i+qTvn^UeR_mc_>kLP%t+vt;us(OA*)_k%2TsojjKq z{-7*Mo1JlRBB`u-pv5LYhXVgy@0{j?Hlo3SfW%?`=QM}^u6I)QF0RgQCa(Y6z{RLv zsGw+|{@5X}BdQPQm-C{EvO+C98tGJ7R`F`H2B3qDoF?iX8n4TFaD-d7@L#xcANB2X z=G;}~R4}e)$bXa&ybHL#=QV%rkSPdVGIqRdyUg;Pdgyz+J>(hqf!7nniJT2ia9;{5 zk2pg5MUM|z^2r}G7xyMEr|XWYWkV5#L?Dtov4^_|$$~rSkAxy(J1IrdOZ|05)Cigv zNgpjCR8CBR7Y1WO5f#sshj3zp6!Ff5TNq*UVyiNi53R@_mD1uW5X4f>&v?&vboQ2p zr9DP%CbO_5`s4bMS&u?Bg$~tdcfbiS!&g__vPlR0Ruv*-M$Oq@wJ5Q&G+AUEk@U0I zUO#$wP0e;(ls?~p+F?KL=!b3BfRh;5RpXCc@EgrWDdjQcuFX;Cpt)v0J9pJ8HMB6z zsR|<_?7QZ)5mPDTZ#54K>fEiB zUCpFl?DPnAec04WV!Zy3$m!k@J%H4XV3?76d3#xZ8sQH=Cr*plFYAeJZD#yMns+TH z)<+Y;AyD4sTgW}Cvu}f@fmmM&qe{9Ca3ig%b&ru`9Cc&M=Af=4xet8@RmxYA#u*&h zgLYy)$H@g7*;E?JD2m@TnIvJXIqLOf$_u$gOHITh6B)+RcqU4o&u_eM8)eFFl%3jI zLKoaiBNq0%j<6cfcRXF10Oim!MyW)Ds#E7d(*0L$Xa|A@H9jprrFB4UOJQw(E)n|O zcv*?{A9b`?z{Q)-#Hm{eytk?ESKFxm_+i)a0#x@HgCs_u8UMGFG+!j>xZX+J5EM9* zG76+32ODXPl4Ml@JLj z2j~hgrs~(T7eyfLON-^lZs8h)B(o_Z1@;i{?DG2Z6k2Of0s>F;H%e4mdgZY>KKu(W zs1^TWIc>kt{2&X<1lKK^<+ocLVLq91|9zF*pAU}>6Bg@sco)0@^JwH7$hR`S8@%Q! zWUrCFJFDgEpjILly=}FOUU8DOyWoX z+`3H$T0JOiOI%A56imJJSWn0VyqB_MI)T7Gi_h$_ z>(VHb^{eCy+EVCgC_WyH14CI=3AJ90erM{!Xs$JMn~M?egtM^U@Tznu9(ZW3^Z0L0 z?tO^`gfya4ta~>=cYizv7cGZYkB;ro7Mcm8dXRr5kU@e$p7IBHHz7*Hs@Y{Wt%w(N zo#MAKRM=4ind@-7>!`u-WPtWMcRye4%fc{&HU)m-Pq;imT4_NOV<5jnY1CDk;a4wZ zvq8W|+9#ZsyTa$M|4!;+>hC;1AV5G{{}4Ozzaw>5S2H_DS7BQR6Py1UC#IvaB#8Rm zN+kzn73hrAA&E4QIl)}%dL4W7=`DSWiZhI>@wUSkU3~zMbh4xC^Ha17V4)H zqqVT+Fu9*Ql2&D>Si{dE%`h-KO;9#KYYI#5GduD&U2TW9%M7VBc1_NB05w3$zbv$= zZ?2rOa0kI!re!+q+NmgaO4VB3dX2*?d9tdqkO`^18Ow-+=+So0jL)14reYHm=r&v3 zli8$WBfV(HHB}oznxoCoupXHo^{0cJXJfrVnJI2HRHKb$M_jrU8zPyoA?9#rRscq~ zjr5GL1`GaxJ930E7WVF0_|IzYA?X@>R;!Y9OM~@evalQPbXHuvjZv*|6U4EPHh^%; zjvgRaQ$>Q^`Il~4gy$He;{+vRvubqW!6(X9i#8&(AAhf z;?>K72%US0{mVsJ+piwOcJW0D$w#22JCu6QL(E>!draj|)bAXWW?T})pGd(&98-c_ zNG2_mzV>k6=G_3<3*H0z`95PLBkYt5NfX$qN1KUwSWz3U`8eSI6flZE(m^S4#X_(P z8jh3kZSx_>$@3C*s$%sCicT?AiVc5)URJX&_K6BvW%rd5K}~T6Y?bj+~JAVsCHgg1k*8Z)5DO{b#hZLE9%6$EoYcu-NJWesUEQ3`6x>`L-CX}GySYY9O94d*^_yNsCQJx@1C=CPtP|2s3ze!c zz*al50PM*Lv(C(rTg1E+GkTP4VOTWpi6H*fyikz!ZsC`IOkcm}b+hukxTR}ihs*Vv zOYcKYSGM2B-8oEv{&uor7(Ict(`=M|L@zMZ38b{8prkP7Y3K?`wLTP*=m;x$0m7Ft zCgM;&21a-L_`Z`m>lVR-ad?5bu$D(7dfpuOg;tnQE*q@9+*zcZOBPXLyMYId$8)qIeN33|U_4&?lA4 z2N69uoUd^3k0RXNzAaIy!SHLMG+^r@Qu=iNxo?fp%GNS9<6*}n7Q-1nJUduoUdxuG zGd4MfKBTK*N37M3fVr=GQth-~93I+f;-?d`xbuoZfJJp{`)vgc6A)=d@BW7VFpArP zvqM)H8xH@73Gfaob#v(mCY=kNd4p<%u%t(%Y6eAz_7~mw zy>?0(gMSZvT@)j}(L$CzXqDEK^XdY-SFr#CXv!}O_Hkc)W!i@hTCSNI_j z;0_YTGl(_U2yN~TlVRLDg2VG_bvwI?#-J%$gELsZvIy2fPhJ3f$9vK$bcj=4lFnHn z?vL%k_H_JZmo&p3YrL&4$OdrL> z!BT!lwp5mtlD!iR5whJ=S{_X0~ zx#RnM;{NjZBGC5@VF;4N1bZmLwVg5~iz|{Ib40Qob;QrF9bsG zG{nh2Qt0zV8%xQrp%`ugBnB=6-K%(;PDER+2fztUq!CT&;u&0l+d_K}YO(2TRYOY^ z7(%4e+9mm|qKauOrjM381UHaRubt|6O0)eCGUoWfn{28Qd+Ys0wk-UvfTPb+tE6u=?I%U;IZT=nv)cNfE?o}0o?bQ;|GGDGG5_J5j0Sh^oHn|c>l;$h zcAaNaMr|TVJ`UIeuZaoVoHggQ`nC=p_drnis}uR{}qx2 zjmu1%@L#3V=>_c7P*~b%Yqyz^YfgG2S?vYJU{lcQs?~=w;5O8``xQZMfCU(@<;k@K zk(p(qc640ZP#rVh5f8bl?79?b=9p{kF~iIuJ#7_X%dFO0)~RQv;+J7@)N0c4#KdvOUJrOq0{!n;8Aw;+WV#`SGG&xP>AVN+Okj~- z6$=@SE=7?JKX|Yf&1=rVP1AAK&8doHu4_s>Ez%pvMviu9ObC^-w;(y=Gn=hKc}ZgC zqzYB#oN?r(whJ3T1xxk$=0O>~-k#0;StK6FP!%KzQB=zHen|D2VQC`SrcQhxzPEU| zKuA`zcP!*r;K?Hq@%f!^$Wn$cqdKmCU~V5HUD-6SchrVJ!Dq+xms2;c1ScnBv zg0e?FEQISLM8ci|m;(KbGegJiL0sKJ*};!U?9$1B0SG_;!WrS^0q%f*N>>Zm|2g;j z-*CqNK8JVxj4dR5K>Q?+YRRW-J&)d=No%p=JijL*LUvD}|O3qYr2Ut;cGGzu@9Qu8|6h!~Wl&x1vMo$-hoB30 zcXxujyOV{xy9QghyE_Ee;KAM9-3d-`{j%@f`<(N>-#)wUk6Ei~{hQUJM~@!e^Lcy& z+%g*v_ir(X(x+G&smyFA8`=bh&b3DCJ)`D1-SPWaEt{vLwRu+8< z%BXy^>jaDPe?<2nT}rm8#rcVC5?&6^d)RsgBioN?ht$@@dL+x(F!n5u)yA_MBo8ky z`#H}*+M$z+%S-bXHAT&H*IUjhF4LUxMslL`3y2HcGW8d#khcr@<=7e{1-S8(iO2bG zkzZ#=*J%6(Q0tl&g%n`FfylVa^RYi84NVu4M09`>J>qvBp(WjF=zszAkXJDvPt=bc ziIq5Zscq>t;cOi+$o&nl&ABTU^Z31LvA{k=>qj{uz#Z(AP-Wy!oLq6O0TTb2 z&W=cN!W8=16|@+~va)LRX;4i?juj8{SwcKOgI=&xLe^4FoxjB~#by}}nSF&gV#5J3 zcg+lez7>g<=vYjUTS9&XYpLeMIq^oDKNabQGmqUQ z^DW12m4dp0e}t@SRXz0EE$VTRdms$S44M>tIEdK%7czUrZDaw;JdTtXB9vgpgJjBf zv>5hI_-aSwl^8Ok$Ww?0rkDFPp_d-m()NJ$ZKc##Jc*eImPQ~xiw=)^lbB!! zm{d3}YBm}9P9!PCPKcyTFH=o_b_vJM#Fk6oG`*N#$R*Fc_&^8ZhZ=cXFc_UMLm*S3 zDJ_OxZ;G_wL2Iz1yB=nPrWBu<(cnnkGrQwsY}Y*lho3JIT*gB1hiv zw&Kms9Q$myCg9a%-^f=Tg96jYCGB_de`bT2#Ua;Au902V#Zz*mJ=Y5dOJsRTF-Cbv ze<4n)bW6fHA|Fw}A*e@SIedZ;n;9d2u{=m{Ue^hICGsAAM|va9%1Ltd|ou(nqI@ ztfofMn5fpC*NtD0uLv8eS&2`3`Pe$DT`E_{ggTgd+^dQ4wB&NKr8Md*+ri(* z+?n_qJQlCsa!kqyvS2E_d$~nF>2+uw?azCKzOQ}+7~J`7T>G`2dwT|JfYeS1dy*q~ z;y;Y!uV1x-UM-PS%81qV1}c*Aqt)XCg_X|hQkTB@hRI%Wcs9z2Ct7?JDHG^Q4_7X4 z@}I1Mci^=JJii!nHai7?{c*@yGD*h}_=9^MBaN z|M;BI#nj`!2z^Zz?;q=zCL@%~##As}oM}2qSiF z?ZEGBn^r#sEPSVNa(#Eyvqh>Vxdnf)y(|B6Phmd{giI6Q@t(YFf9<^V*~;m9e?Lb7 zD|KWGLp6gq?r9}9kWd*v1or?hBR1&q;hWqG1TcWEVI=b+cycH~ zbNOaTN&qNB>`=;ewU(fwlBdlQl{@aIDYy0d3|6)3l8H;QT!J=lKC|(>mEW0~LmX9S7Ok&)u%Bs`40W#vJjk^zdv? zrw6(epu~y8W*MyJa{(2?(qU%3NJo!4H6?NGCpr6Gjx9#OdSM zvjpQUXz=r5g)crPu_8ddKZZdzn61n{dg?!-T7?Z+k`#S~wWsqygJ9iMzGB=|osQgt z&lxC+vWBk~O^(;h1B!ndLIUl5zaf?)tHZ#%R3db7Vqhp?Xq1}7 z*`X(@$%T$PWn-t_oMNE!`b78I@mDM;4mEsqb50)1Wo-1f8Y zGC%jfWba7vW>}6#Qgf`zuex3X)2!VJtJMk0{a#7!3PRX!#jI@GBOw7cz!26whUAfl z8DFcG^vLee2Rcbz_K1+;^_w4ZyqRRvozi{8zWpM3wjL*>k_V#3&EHj5@m!Yr z-%)b{Vfw%#3y}PDTJhRZup%$J(ec(o++kGC2#dTebfZ4tw?x-(bK-jw(!P8fzap!S z^wjbK>w@toW!_j^k_hav+f`?;t2_7idra56`5HWE=`#EH$+zN*7`C7Yksu{$?l#W41X?a>G+#@^)c4gd zrS%_yafUmxs~^yYdl=FN!E)Yx9=L_Ur#C^)R|mX?ijzvZ z-)Pt11ZYh9(be043BKbtmjqM+7sY~y|9NQKKlsUE^r<@KPjl)H^S=nqzw*<+?n%-A z(~e>YSO=L#{Q~@sZzLIzmLjtW+$fR%B4QB~usaWDna`Xq%}O?gU}II4mOLIO_>g*A zTyrjmkZ493>wBy?94qausR31ovwm&i>gsygdX)21=i}{gN)zm`mLu5tkvj-qki~&6 zh+J@Do6W~=JCfbbJg)bZ`QodvuA$W_o$bcLm=Ufzge-IlPELs8DiHHa zyGpuw)GmuN*-vDNOuONCN={%_5-yvzG9^*zGxFIa>Rqtu@v_ALwZ_n_Ip<=}TrgzP z(+?mfLb5soFd+;Ri{>R4QgSfJhayV#Ky@Fh7AsDr9fZ^*?$qgUZB}CSGn-~D)9Cff zo12Fb;0=(i{l1dnwHV0@XpiqM#VWv-6*|%8w$kru+HD74sb2ZVF*vtKiG zvem^P+4|ZWp<~6Liec%kDI4_6gpi-FsS(MPirF~0*OWRJWrkvuz>@hA3~Up1=pHY_{(u!)_-M-oKJNM;NLDh?@AIj zsm|rDZ4#!+@0zH44{_(rkWYMPROZ8JSo9bq5U_2~sChuFb=h|1|2`d%R@e{^t)WPy zP182WBAoNvq$=)<@PphnY`D=0O6}G$O#nip*~u&91@N1hJ*;botRi~0MMr3)kcFk1 z#3DJPc$#UO_0-pE_gX{a7PVtN1mL)W5aMsa5^5PLdlepi&Ihy+$${C=&=;v@C@jnJ zr!2{SA`=2g*YMd{04B+tF*VWLGfjtN)>2VuIK4iY{VrrW(ib+G^`B+F}K7oP3{Yh@Bf1B9$ zHl{$kzpo^RsEjG}3SkJ46=PNwnTBKz_#rGmpM=?_iInf}7U8 zMo_P#_Aa7MQmhSDK=@q5^F6c?kC?*0+&_LdZ4mKb&qZUH%3=yS+j;A+A??GV2Fm~k z13QEQ10(<6Ln>$KV(J96`R9sxqOKykFvifwoSV0EapN`;{fL$aOYG|n!Aq~R3 zgk@~jkWZS;4JPhukLr(*9glfpq6OhZ-6*E~4f+`>c`_N}rbk&@PaozA{vS`*2;J<5 zvr_qSBH#lUghnbzs?u^)$}(Rm<+q3^uF^!LVgL z#~iSZ>8H+qZ*vjJr4~4!HJ>f7iXE%CbxP6y>80sFevWb zC!kV1#D*p6F4`JF_i#2IYo&tQE(o|xokrvlnQFu6E_>Q(J)$2W_pIPO!Q3dV9cd7o zU+i!3%ldxVbo8cImkb7U6Ti8RWn{nNM*hSZJvXbM`PO&@Kh=QmS#NPkB9ONqz3n)4 zRpB|&cEq-R7AsZ5C+{w+M!$e6N=4+S19Uz1C?JcLh2vkiMr`2CG1hQZyh>U{ZWhQG zdf|%i)iVR|7|J;S=lcdfI5DNaSN~*S!(f^X)iIsXV=@N4%hNnB&79NNH_FUru+MS} zwZoI%Ld*`3)$SgA# zoMDU_9i|=^OyD^O(_!4KFe{dor-W2d)yHV?f`$h4d4$n~mekvhKQ%Wjnli6_G8GN# zhP)whVpYQmzcZMXNKKOpbwp_H8^`oAyz6~dB;TYFmXx~x^&Kk8hp)PC+7ZS*$eG~5 zA(s_E2$?=;_*WgmJ{#I8`iHLW|2*{n4%<$qKR=a?jBHr} zaYT+3JG8)bkYso`n%p!f2o)_>R{w{JPJ?Z9jW~at#V*97(%?$6$5p|KiQBu+@5~V& zpUzGQ3*$9VKt_05G`WQ20Y82 z6K&DykV=crQfz{nnICTdOpXFR8wQ^+MiCX_(_&9r{&ciGr04(wDa)`KI*FtYno7y9 z0YQ`@J!o13N`w<%p}oo&B1W2f=E)+aNeK1okDOJ%ZN>F~==yNzzW0wN7bUT9pd?2- zN$kaX1-(pA`mw;vuJQ>W!#{tz=mp0`69n3gPc4+JP#VlX4)c@fa%=(1JiUR}cJFZhhL=m*xW1DCWF*KR=k5!kCYrJ7b?*G@drCZSoT-h=am#|-rSnYMFSEH-)uWnf$!ssXWl z)HQG!xy3D=qObQ-g~*~Hyz`|n$~^_ivU^$H?IJtdd1~GJVq?p{^8?Z$P!mUsy2KGd zQSPj`Ha8%kARNLr*DP)zKiu3)RVF`6gd*e!F+2n9HKE5!nnrD7FEKognOsr-1lk<& zTIDIL=lctGAh6+FW+px6S>(=RtB|R+>C)jci%#>hFjnGfgd*nWy$~GB?k^SUwd>^C zzIGiawC`o;EuEFK;_Ht6++V3v7PpajoRgU(MWEHQ#r1}9`U*dG0Zky%@6IQ(sjSw| zR{gd5w9Q|B<1`B}hPrVnRpX;M1;t(V_bXp$nfJw=JgXjrl~hzLYfs#ZscJ3v+9F7D zn@QzfJa7zBX5Uo2{y6zcj3G)JjPXTlo^-7j0RylsiNN$jwL_W&w4pAg7&SKmd zjMcgbp!J<96e-JLg*fc_MR^UM?OdGh=&tz9-k5rw$Rjrdgw%*x#88<-if3D}JmK&!_` zf%p)7l#R9alQursU$bW9zNo|bPsZdygMqR9hnF(8w{rnn+Bu6zlZ!~po4Q!ooBXp@ zt8ZxHiDP_BOeV;uFenB4X)Z-1ph!tosb{XrP&d|nD*7}(BoFxNuySyw;HC0`VfcJp zac{wM%v06r5p%A3C+vImn0tGBkx+sG_e<35BD!sbDGd9QX15Ai8H{*E76CJ{X zPkc7Spd%;}dQ*N^09}Ba=;RWwB}uFdn?{fG`crk0116EgSW!TI01d#;Ys0~g z4{GUp5uO86%D$>Uu7zHpteP3I^use-+ibe@6|-mBFgYj9+HO(2_IO_ZbI5PJnD#SB z*4eetHl5V`037Is9q-Y21FdRiEzBwOo}|;@d}8tuCsU2@uKppwjy7D_x)aFU$h_$* z2xV%n;tJZ$VT6zPqr+fLY=)Vy0LwyK+7qmDR<+`B!pGltNHa?DKhP_cI|JSZ5!Y+% zJLIH?!b2x`gATpK@PJ&Ux=3}!MVHFJC7f<%M=(wOQ|du>tEzAd8rCeq{sa>B_PsLK zd~!_7#aFXwR5n(lMJwHd!f`ARGd=?sJ>o7V1SSH}4yCA@q74OSvz}yluaRzAu|iw6 zRak$;6pzBu@24mR9o>E*iiXkeh}c9nHn&tkLG^IhhDcczxc46-B{hCQadK4mD)G*sYoxBhhD!?~Em>Qmx%p57x^_8j|Ha~1hKcOk}pm19Nin9-lG*W}{7m_>Em)BEog%x0&z%=Se4*sR-ht#Fn7*%ES=(KGhyGuaKEg>q5GdZ= z5g&RP(Iutsi^02OnGM)y z`)dYQa}ZG({i%C6Q2+m%DF1y1|5JddS^q<13-sBoxM@Qngb`bWkTT3;k$0*X8^KY^ zM;H>5`>~4R0A2Xj#u<^`(e}Eg`@?Er`}OddF;Vi9l_8!82#9VAs-IFvnUZm`>QzK)TGk&z zrcjxZm&9sMZP{+WB*{R>0;1&H5_|Nno1pr>iql@Z)HG4tLT@>ZBvg8+U)VV@^!bii zK({As&n9E*gyAmL1T(4$Fu)fJoIslowIy ztrQo6;UiWOH}jHpxI=`eK}txVvK%SII-NwPL%p>7Uw-QI5GOQSA~E-;n>p1HRIF#~ zmab|3BY5jQ#31~2kxh}F9@0U;p_g)HVv=4nq!zbs$L-c{r`q5(k_`f0o-flX=iDuk z-iUMNh0IZ|a7Jn8>UO%Yq)06#swQb?^Il!mA(yIvaITpR*@oLL9za;ssj?y>S-K5H zQq#864^<1DNURICZ$Os0lT+S6*#U=Y$s#KUO*{LJ>Rg*6`9u7|>591=^d)W6OG`U! z3Gf*Aa~PUnP2tDe8QDU~1igYTQypod{zH`RP00&#-*e{iN9ei7aNsK61aZ_?cJS6H zmI&BS_b03@y<=wY5YJeGy;@@geLj&hHDLl{1U;`&eg)j$?ijH{$oF#NxNX=dXov<$ z&;~z)qKxJ6zK{;8q5qgj8^VlI#e^F-0@tMRPN<~RE;;_t33eyIw#d#KuhoWeEMFcJ z_ew21-1GlirE#;$Il%c-Wo8h;z?l96PECL=rhlr8*qW;3C`msS? zJK{#8wRs5zzdus~rQDd8EE#X)*@O`hNIzoR5NFeS0j(n>PPmJ{Mct{?^*Dgyfov;0 z`T4cr=yB+g$|GxKqsbBvUZB+dGCTWeV*GMaF2Vo(w1XqCvTSW8nb3tG;rk;v}b`K_$CKPG) znLE@kUIkq9sFDug9fxaMljWT)8m#PTRQGI*f$nG^FgL+XwZvkqg!44Y61ys}QExUQ zKKZ8v&*cU6DpXM3;geF-TH}U8F%#85MpXRBh)r`mlWc%?r_Kt;?;KnjId|t0)vd~H z-17$VwN=KvAG#@x%?C(B@iE^7X)>xz*)E%O?>ayA^z*{db5ZHDi85!(kGU9PaHINX z?U+E9$nnp}@7vOu(Ilr6lu$e*Ay5@696l(j5^JS$?R z^Hzup|m^N;z1)jZXGN4nLwE`QHF7m+BJD2oZ(8t*qi;o43`px6w3^tQ zLPs77ppr^gWJD1*7ivFESy~7cO4x1`?Fe+#Y(pRs?UEr)Xq5s5au#b*UZ7Ic_p0WK zqW7nlk9iCID!0**a*aZTZtB!xCFI`NugjZKyuDl9FoyV=tR4|_tslXo!Rhu+TzK=> zZd_Ixiwnp6$o39lZe5>;p^7+s!twB@HE|6Fmt2U@32J>x12eO>xxf(!2Pjzt?ycyJ zKVsN@BJnUxGHtQXvGn`geS8egN2NDV^roa=d=i1&^Hb(xiy7KetwPEQ0DT`=E~V*d4?hiZh%6 zuPANnJtteDu5}x&NU^I?v+>@=AIWxeX@lc7D17#F+wzg`2T`-0r zo(dgMjp7ej=@GlO_Xv&%xxVi&H1ng~G_alL7x7l`F*0m+Cj7B?1a;SDoKrZMZI>i7 zI||RPmTkW90{XI~Af3Uk+hkOgp2FT$`r5&c&){ z{&^<58rc5Iv)jCyVRg`RU&4o)M_7bj=j7zyI!pv_ofC$6lT}%uMS_!=llA&4srK3B zSp-cI07o9*%RYboT68Jy$}jSh3Q55W5B9El+y#|+d~UX?9gLn|nu8CL zDuMni!-+_mWrHt9zLM4!X(^f}2z$VVatWn#6fYTO*WXVvAJLb_;8m-K-xC=nV$soL z6nP~3K#JhW7sC)$)flTp|Kqj`X)TD_Z3Yh)pcU5M|-S0A8`Ex+}0v=^NIr;u&$eKU}m7G`0$cvj=RX-6fW{ioel_ z{Cp9i(FkhF1EgVT574UoPRu13X zK3~NKD7bjO>H`ig!I4$g)Nim0>Vb^Nz``XE$@9P!a!xV#;_L-Q@cZ9Z=#ANj7=Qoi zXXs)77rXHx(Onn}V4tW@T_fyK;hf)Fu=7p7PM>Ec>iYfsNR$<}pqN(o~2Mmjp@d!LuJ2j|Jxw<-HB2tbbp zr2S4c=ywZMu{(#{SCs*8Wk{CdUEfx}JmG=H2pr4?+=3Qt35n_zSh}NvM^vJbr6*>= zlv7_MT&LNYzzA_9M}DQcqFr6 zF{-L)Vu@*+DkKFPqJgox=44~P(a(C?tiU=Qvmz?<)To>KowS>upJ*>iMm{|| zoyMSI_B|?*&Oz{Vm&pPz z#3om+1bEBjD+fS%y2NHH7b_x#x*W{GhGm5TTuEqe*0l z`-0M{i!e}pHoAK&!l`&HxX)|8xSxN_AK{Q;z+~hTjqmjQ)m1i${7vc>dX>^^`G>FA z;=-u$;4<7nW0zbDPIgw|ls@OE>&1Tb9Ah3j=@WF2T*Mg%YB&w0)nI?A3$$zw#L{7fA)eQEEH5G zWMnosyJqb*SpRDwW4$Hrwi8Mt7lfZKFiR(lXzT%w8Dc3VR}iLGY4rx@s<0%`=y2q% zY(IV65uMH>DjQc~sQ@AoFQ0p20f*F|_z$Hlqv{8c7U?SIPzM2nZ+3Mt9q&-4NK=_` zAaW@idB!lN5@>YTKRuM7kkqX$bt-Gi zhOJvEwC}y*V>t@B1iBJ>Amy(_ly`)WFfVsoSTr)h@$qc7hrKMmhqYLgT(BfZwrFes3-mBvX!#+TH;<{t|xNaeNZQ`alr57;!^o>8P%MI*; zIMvrU5Ej;LLeQs?7oeP;R-3#kvzlhARp;`{F#I5@Z*V8y?rh8P?y)j7lMB_Rw@HJj zg0$p?NX)U*xD~pU8V+bhC#{CG%;Fi_OH7ay+#A%V|B8(RgX- z!#O$;#qW|8t=d#CG)j-=POQ4`5|YtEAGuXnwJt65HtAH?+x!@S5u%qmOmvGH@EzU9x634zj6T9s zPA7B;?NS1XMh{01vzy8zG>5QHxHM1DeNHH3PDI*ISQJmlY&QajkAAX*{Yepe_xyvN z`d{JY@0^D?WjNq5nZA z=l>Hr|8cy$3((HxFFu{hn%$fbMix4sqmi6WZ}Iw?NN@u2LKv4?zbF~4xYJHR`6ZtD zn%&B>#ZQShfY2_A5ID(oH_VlCSVJ{tvdp?kmAf0e`Q+KbOKi;+n9a5VEYTA0m4iTc zG#D4eI%(q^KV9W8{f=F|eNh&|Zk!B^r28ESTPsb9+R?76jrITuMAQBetB?L{tJIiZ1%Lu@s_ z$`k#)@V{o)zAu$P+Hc!g9&pK2UPoRFTihJCR$W5 zSx#PejV)Ylc0X(u?EMt&Ur$Eom~0@T-Pa56ifmEy7TjGa%P3T|@X=cSkp_BrPm*^A z&h?uf>aEBWcSV@yct^FhL{lK2v9x`=qWWw2GwnWVzyBd8A*lalCjR&E|I6Od{l|qs z?+VT5O=Gn1q&j8IPAAC`9!ULSwf&R~fbZn|9J1bV3+Ie00=AD(oyS1{qFZdhmQXZ# zhJ_F7wIt3Fy?hXHs=V9O84uf*&+mz|_xIm-eBYGU7xIj`BN(GBq(~{M8Y7}WsP(i? zv=Zw39AYe$MsfqLAdBo8fV`|6CeCevt+V?oD}SsvB2_8D8ajw!RIifP71Wu&`zlh* z%g3dg?W;$tJ{B_C*9wD}J{vLS+2@e!$i?JgJi!V%rMWt&;IdNYTv037gPOx`tGaHi zlu#xP+GfvYc1e}XoZ`eATdx9)VV&P5Wn};vaI0yy)-r|btk8b+Uqo>X9XyqlScVq} zEYpOt-f84IIBuPy#$y0V5?%rk+{Ro8+IwtS;(0p&;lk7TgUDLDTAL9kHv+6ro{?^2 zwd2qHhC7VS)*ZD5d)B=!HaLCfSfZ~=)rdM&{i-aJsOgp3ww^zrN>3Iaqi9^`)}EsT zIdniVgtxz10y1gsPFkYVVpO>&9L}ZGVLr0q!d*g1T+ey|68F!7ti$4!PC%7*gi~wA z2mUQKNA^q>Xl6a0+4%eqFd|TXA8$*fhZcZw0==*MJ;y~$Rn`b5cUI}co-{OZD6L?g zlyUB;Qd9#!@r_hAKhsN^&wLoSG#OHu`X^G8xCEH*?Yu?E4ZiRJ!{lsx=U%X1R#3+z zx?VTTGO-X`x~#th@oy*@o)?6fSlCX|9IT^wxk9+Y&ro;IET8(zQn(pq5{6x+4jjUN6>laG6y4F1 zO1aR=KW@fV7Ratm3zD=PAdt<4Qji=#v?4y^BJLC^%3L4t2@8?bw~>4V-9)@X{dLA- z=__=r|A*&-puxac{{z@f?M$2v-7Q@#{>?mMO%+`e@R2=1l4+w+6vow<0bkWBgw~P2 z8=co!hR_7x5> zXs7d&UDxGoq^ZR89M~g zZ*#~#jj`)~6XSf!K$`YLc+AO~wTngq?qBO2`%aT^u36?%aQ2k17b#>%qnOYQyPl)~ z=W}KZNDAd@Iar>fDQ1kyO9&FIvuzM;gzFd70jEAk(}7b%^t_Ls0wjk<((^danI3qv zj*%(oqw!}M;EW50;`+4Kd}+nO`lr!2M!-Ue*_sJ|DfzL5mRdFJ$k}Uw@?&rafDB&T zJl2O&e{PeSicuJFiZTUpwai3`y09tdOwhSZROay@CxKzc zBfOY{oxBYV7M8wl#IBk%n=pfm?gI1vR8z|Y27HK(4n2d)1WA>fep~aLsAWM_9WlQ) z^EC$}EB-pYUovzLasfT!id)aQ3xH)Y!nU_JI7S*h^(s2XUS3aPp&z3h5#qy~_Iuaq zizGLvDfx}{O~D?#=$0h8$?`^12)hiV2*-CG)L0^PW{KI~}Qr%ul z0`_BB#&gA}ohzPnsTq7g5W$XVzb?o+aPJF({d^Rpx`+j+^kJ$5hB>Xd73tJtJs7(X z@0q9^>mj@FOr>jd8teOMYIa4=Zve!xJ;w%xUoa^mlQ54dY7C-)C}{K920k+Qghgy| zk1&5tR;yL!FXn$L69LqJmd*boS^ujxS^tsE?-DqNS~`CB&GE zMTqZ;i?>x*D2-X$(vce0w1^-vdvb~25uoY}y2mQM$ndv^=cA$5*Yfcl-DLmvbxt$v z>hghz8(=_(8y^7fCWL#^1GLy{lfZ^d(Us|k;#f!0Ictr+CX%Ad(d#wRfx5H;^CI)MZ(7HCD+{EW+(|KpYLQeK!)#IKnj!v6YnXQ+;}@e$86LzC zHO=P~E1C21HYGnn-`Ue2W(U9HE~BT~ua30?i<=rQ_@qy*fO(o7IX(t*l-}6I`lmR1L8*8$Aw_Vaw!Gqax z7=0eJ`tbb|JWb_?I*T0vnTTJtWL;mp6n4A>0q2fo8BJt#?TUC*CmqsA%!qGk_t~u% zj4xBpr7UO;O|7xtB!F)y8-6OTI^Pr!YtVP7)B+P)N~!?n2$w@2AlzrC}qs zCXpb>JztHMo>Fn~~Q!>^6+u=2AxSg~GLOr1h z*ZKS?R_U6CiGrh`uvCc(7!6`FqX~+#GtXSHog>;IxZB&#ypt-P^R=VN;>0XDU;@n{K1d?Ps7spp1nBozu1bo}jsZ5Mlh{lZ?-e zxFQC_MP)70T0dUgmB!!stNDAnKf4sKo?V1|4gvvM1SiMR3>TAi6Is*ZBd4Zbibu7< zE~a4%>$ZcoG2rr7a*vHFKg4f#*Bwmt)>`T9So;?j(%Yd2*k!=F&f83<+|1) z_LT|&O4_prSrk8SX}E9!26;>8ImPw}1bmb2ElM+9#w#P13I_S+iHS1(BokI%lO#IOK>sESuz;PO zhQo|AR7KoJD~p{z6eMZP5EODjdFB(lN8Qv%`t`!R*`2p*_pB>w3ENk+b;c%x(|8$X z1p`?0`zrPl-r^R9bFNwF4$q5oY3slq6&LzhFF(qw>5W|KfR-j!xmp#!)B|Zrm(Upl z!iQcQ+Ix6G7qG90^7BjG%2qT;RNg_Cf03kmh92S&=~k7!3`>p^l+*QB=*CVfb0qwM zt~k`cKkVsW(6sUNF81W{Zx0=YyqLbUFK9lO=~BU{uFvOI)Zt-RONInUNZ_R{&$ zm&-3;X}xmbL(FKB;DvBeKs^F<$D%k5$w8sTZj-=XY$Q3HVV3?2?q0YHRxy&qNCZK1G%E%b6(;M~#WziVmQ?XxN$G%6Zq_$<4XAM(5l`2}Gc`cM zSENS9b_L~=S({3+({u*NvilD)jo?z?y(^~1hP59rn50kfSlyc$hp8%_wb}NHm4=VC z7;Tq_TOYGI5^y1|vpXWpQQ8@2kZic|H8utGb1)lR%l})@p^hB8T{_rOy7CbD8}VC1}OfxmYJ7Ok?gt2 zIdalvpD%QNh={}zJ(N26iEkys#K7OkjCj|qkqhf6By_0 zePc}R1}zPUR+E;2KBwDVX& zoQrFR!u$TWZ-y6J&dB;cfq^+e{Aa)3!o}9+Uzqk)(N~-o!Vs8yqfQ}hgAIePZrf$V zeTGQ60_$lhdE90s7esaqo;jJ9E6seYxrKv(`_fHh+HuYanIe;U?>F9hwCT*||DK}{ zwk)ERJPM2OGtSa(=3F}{X?7o0+L9MU06i&LU6Vw{2IE|liKlC% ziRlqIk^OFwTRab!3*YM>v@-ABMrp({)4XQKOtKF(j6!AM+6sm%=nwl!l{kv*Vy-e> zDj|kz8liiwT$EmqSZMc{9P63aB8UuHl=5Bg>S-t)nkDDOTD|wyRICc?IXB#PTTx_>$-1Mb5Y9ebgG!kc4hofI9fecg>kB2?w+aW|X z)a6n)S?l)Vrq^NQ!4{o9u1{R7z^B<8V3w8{u~bnqTB$bsPF;pfZRD^OecvZQpe#M` z?yVlFTM0gksq-FN3E#6ckQWWTG56|tT=*k!2ifzJwnS5%Bm8{@_xiSFsHloUg z)!S_HY0~}OOz_R?1-TnbhGl%u3WKtGpcZsTT}@_6YHQRdHrP)ox?d6}vSkEo>g>N~$kt zLDktbELxu*U7Podi+B0JC2Uvf;&%q!*z-b0S! z>04KyDKp+f=0kaO`z=7u3-{f8y1*=`n&n)E9A~8U6|WXMV5PvnUlTXiG39;{^_z1G zDk?px0`=At%?Rp<+&gAeuXXURf!MH4u}7ZXfxWhxw{OF2X+^w@ohTlRq{4cA)Y1_U zdk6)Cn&eUTTCAPM6ORFn*KA=~l4&YGz=sEOGoDT8ENti{7UWo_O$gkt6vp{7VHnq=3xHwzN4j`iK&O7z1hF<7j&K1)KK4JTy1FTv+!JJ zIg`pM;+7T8K(abgCj*uu1Wq*E!603wvqUlBc-90tdGqIS<1Nn%IYS_H23&Uj)o2$G z+M}>G!ITTmjhFw?;vvg^>cX$x`*m$D*AF^QQhfkUPbGd(SD*Z6c0UH=n1^H!CZ?mF ziUY@T8|7YGpb;8viRro$bD|i01MTL3JPrk>vxlNM(V;2*uvSuCe>Xqq{mFKZuJ9|) zy;=TQd&y6pfw&f%)e`>@5`pKfy>WPmT(|PTeDlr50V7*;{g$!8Hj2R0tO#Hgpc?0R zhVr3VPI2%BvD{Kq+;?JyIt9>}V2kh%8&6S*T&Av(_?4k_lv%KA2fog@#Sp$($x%<4 zdQonSX{B%KEHu+0A~mw@J2Rr>%%aa6?RaL+mt-E)_u1#B?~k9n`YIP`yx{}zE+|_s z1gwULc}~|tS1ea#4Q#VX%vO@7R{6IEf_Y{XiTN>AMlAXRPxdQ+qzZW?3lzEEPW6$tkiBl9IzA7!nW zU?|$}3!@+zhab{+7J|7`#|53TE8cB8rzy<*hVC}`=-xjFfG}7Y7_Z z!E11WVMLW71LuEzDX^DFx^*Nt;sArW6N$D2pN z?(#xVj9^bGtKi&~r_hhhN#F`Oi4&Evd>=M!r1(VA3(=dxxmP0%4(re&XJaHSeNfxc z>+d&~tY6EK>=1>*du~L8co|ev9dx~_^{Jd8MEoShO{!@{bEgKzLI8y*vsD2xB&DGG z!o0zYc@o|Xse#5f%)at)(NcMHr?i7v=suxLAOlpLb3_Ij{+ZAx7q5sp_H&5aNGM|o z`yXOx(S+xS@tm?cQJq$9D0Ma$l2TiVSbdR=Zs=IEMBB5u#|iJfIIDOTdDmzL&>}P~ z$vHHLdzie1d@GOwk8r&0xoa?``C+AdTcme@>xK7z!hNa}k5}O$x`3R-`x(r>-sKvl z%x)70=6i&BUkk*@6K?-+*ZB6IROP?AL&}{OhVFd!qIwb~FOq%-_*SeC5l5Fkk=g2OvK}18CpKFF_=JLHH{(Q9IE+dIm61d5wC|401|TaZUl;W^$=}9{O2jDrq7*kN z1&(Q6AWUvIohtK9jI$Z$zLFVEMC4f@O4y!QCkNewfnJLEXAIZy?u5e^(1^p&Fy~tV zc@1;N$VyDB_y%sp5c)V|>c1a(k_o%PVE+HGeEHvW@-GMERN)^E2xz1JydFMHS3>LuS%X5!P$%LWV>&pHcBa5_LvkA)?Y2SOU+x9GIvf*2%%a*>=<36cpSJ!_hX zhNtt|215#oLHe7N+^ z?9gzx$*n<8>{F6+HLV!|DOFege~g{wTbz5cwL@@d+!}X+ySuvw3*NZ9yLPbP8e9V* zXmA3-J-EBOyYrGg^UloP=bV}O2l&8sch#y@zgmyu9?p1giyt4y3kr;gwJs;H=z)wy z+=^kK@jd9X^)G~qhmNGIK>8!DMM(8E6!Fo#o=LpQTGD?+D73<>zoZ_6!&MD=xei~zh} z(&jpd@Foh4^GIlEVV8SJ56&HJK)ddWl`b3%tnutk_P$H5HC*L{1SYF4wPukw=)!ID zlA3h7iMw7{K6&tssD1&4`ej~cHXPGFC^>&&Mt8_F7fKazz=9fi)57jW(a&?QlbduY zLg5T|&Fa$o+X0!^+?{8N8eg`8CJn4Y-Q@3~A$wynZkh+3qOgqxgKZ$DGvWt+CNMrh z^Gtk#dSZYHUq|hUv;m^Ww2B-Wf22{o8*L>m^6d?~hWtK166;tLIu9CJdrMUu0o-N@ zk4zMh(8#2pxb&y#YK~&7QB*Y>{T52CZnI9`LI=7S`%A1t#xEl!xK~&?p#Jx7zWf7L zX9J_ZUFH2#XQ|kui=aLyLzaJ>(XgarsKXA`$eEqk!Alq)4GB3ntg6^-Q`d|UsIHHF z#_|uWmG8nYYf}nH}F`6AM8QtXslhyV29H`N1?(n@D>Z zuIGkgMy#o_R+$@RlRn8y=Vr43w+5ia&b$1(aW!;A&#x^;H@QajO zTFLL%lNnY@j2_*!_Ue7GkDpJBFU1%^daL;5p=>7NBCvGXdF#@*JM&)JqlrfD0we{n zUgFXvh9wjPdX;aRyI{oR>bGLA#2V-N@T{s5t8Xh^u}|K?2In9#_5%2-qyg{(hSZEu zsg}CecglzcFjPcwe#bFt+1U}X*xuT!Ykcm9^L?wypIB+BzH%a0+U0|L0b33HSMW?K zyy=KpZI3QB+ia8$6c!h3YC~piBSC|Jk@_KmjME`yT)U6_qe8?YnRPt9XZ(qT)MP6sEuZU(B_0?Tq-XJKLhC0;80;H${(q_WNJIU)3^C?b&Dzp5 zT6rm=IeCFvMtk+DFI{0(a7lJd*fu`L>~MCfzHrR&iNv6Qv-0nVx;I$ZBg{#( zo#+#pV0HJ8-a~nYNB-o0b(ffn0r4?ViE`4CA0{< zF##)HVC z{XP?Z3U|Z23I$!+Tt$N;U?I{}B%F3u#sN*I(lo3Q{q{VY&H> zYwI7mWrz04m?qS}-+sR`_ODO+KK=cyuk-Cfw{2;Sc6XhqrE4yn2C=ogY#}`SR=bfw ze{wW$(@^|e;AO=vqR&)M@mYJ9rhnquF}6%?wJR5&^UkvO@Kb8Dke}ZZOiqLpu9j96 zbMO@4m?WFD#L(!MDB2%zm4|x+_IgDTo^&fq{7UzUoTUaoK$ezuZc|;7r?>ntv(r z0Aq-=Q}l-N6|9dputa;;G_Wzb$GUI0Hl?Wzt{W#83NJJSz|+sGBv!$LXq~e37-FI~ zF9WW$pd!cd4M+wb+*F5MpH&p~n3M2I((8t%eQWp4*K!r{34MTy(^jq0VngsN0N>Fu z>p9vq&ujyt&W67WTWoDyl9gWJtdU}~fD8}zh_(q4ycJ2vhf7TawJE9Br%*rs?eT!q zyfa+6>1gnJG~apVF2=2w5>1GJeNd6Wf9Xcxc)-!AfB5?j64=Q`c87E_XmVNcASaOj zNgKQ4oe1#~w*^4@>)3Csgo1s;hQ8Mni4|5w@Wdan!48q*qtP42{Sd7T5MffL_ZK(1 zz=(R1rSKK0J|`@xuT+fl`*=w+bc3^eNV(1bN>vxs|8cncFH~7N{VrT?|ALmm``5zt zqBp@w0TWA>1E;+eV_8zBJ_bu*PMw@KT;m%%VErycEPt=iSq9NSqBWpmfP4RTHLAjo zx>w;FA!_(91-qN;5&Ijr8^6cLdn94B7+2j61ti{TUc0qA#l`ptQ!F}K4UWY?Tss~t zPb_P|-n(drpf7-kv;|XXJI{vgUttTMj2Muk-9}aIo>r-5_y;kf^1O7 z*}_BgrrYYJXJL=wWXP)1V69Jf!tys_>0!QPpH9>MYYHZHuW0#4>2^ER{Hi02L>J33LK}JP6?GB++6LaOz zw4ZGDT6LGtkmrX=p5&-lC;zko8*^G%UZ8B)h2Qs=T z{y{KJMP-L+dK~rHn!BfyCP8EZ<5!m4P92Zv&3b%THis958G&E-g|1z=h*SUc1&+Fv zijC}--!<*%*S#XvhY%&6NA$~yH-Y+ij+A*(7PK$8hhha;1p3g{2(EJ9gnUwg2BhL-fgK=vR#@ zI_IPB=}sYab43HVNgTKGQH{C86IJQzez5U9Z2$5wyWXj=UxBb$kAr~Za@}n(HN>TZ zv8?C#W~DVz70uUQots;bJEZJ!h`{C5k&`&^0I(wW7{)c5FJH}^6u$1rQxvygk0B5YTNDn#qn~#V*5dVH8MOtsx{_xn4^b!Z+$?(w>+HQ)y-BE!KhF&h>e`Pnz%JLg!y!H2cpq@1`28yNu; zEq3+H1pTxj=L}H_Alu{k^TJr#Ta3VhhwbMi3`uLlBQBK^02>!}tXXN&)(r|Q+0jay;q6pqs>LzTvGP!)<&x|noTPA>oCNOcJKamuuR8~_M7xJ-f%Dx(hDX>XM~N;J z*k4Yh$UnCqvR0i`b*nEPB{Fj{b;jpV^GK#Zz*>3@nJtf$f(cb9+iya zRK~=4W=*>kvs-DA%<;Ikk+Gt+p(pp#0o*{Nh?{cRv9tF8tv)YI5MjM?W%Qrt%imlXn0ovxTI0$0v)P4g+peFYy_H1Hkf>6e$y~wuL_<{Co$<|yz7w$D?W2Z znQ^3wgN85B=nz6^J+4Z(fVxvYf!-6>+XgrJ!>UAG!lvjG=W#o(W$NLFXs;3V+5;N> zGNjPb7*oG#+iXzbMe+gU&tDIaGh;tw(i#A@9h5Ik1n^t^f+=1C~wH>qzP;#Njy%*9C0@eCC_8(rcez2OTOm+r%oX z4N_VFpNeDFdxH+GtE%v?pQL8Lp8>rAcb-lCm2RQ9of>M3mLFN}_$Zh+ zzO4BgCgs!P^N;ogk?m&GOXnumyXY%4Lt_`k6nR`B(@m(M1{eG(d`|JYKc3FjU*Sp{ z|Atsg;^;EUT|zGBpBB0rJ|<-hd-PUCy$N?Ie4MLtB-bl$*o1^#-!RK?EpzZ0mgpfSCOu0wuvrVt|YM8257^rCTK!K;j-8keL4#I*#Z zf&12|>{PT6alfr`dM=Y%W>Dbfoq)9t8qhR4ItI#(*Zv~euI1X$f5T<kSC+07YPj`sI&`he#m6nF^D5@S|x)H@vyhQkY#&q0uu7|rG9kD(%1*Zlq z7NP4jVvnPQ4&bDs*dH8DUb?Q|vJ~RwCysQkOA5u?MnW84%1(jf9R~yD93?mx_Ozb0=JJE&9&gw_a5t`QIpa-Nz*Ez>*Q0)Ww0apJbpV-3r9gC?k+hjS} z=OLwBUM|F(8Zh{!13>y-IRngX19!n}#|R(|T8ui#}Uod6;9`ogjF)mm}%o@*r_?8bi zm;tidNOfnWNaC;SM1VUg9cx_^a@Vt@%qF7`ue7zZUp~3=%%W`7>(1fLb-5!VUJB5L z?=s|GF^aFv=+0~>XHeptWc(;+OC)>Wv@6OWO+d)L;JUeM&xXp+a&K{&<4f{YmMfo6 z1v$v2RF=2y`Hj zDOc6yU%nqH7iB2*8!uU?|6t@g8`y%3o$UXK){4@EGUoGfQ&|mmEJPlLNpX5;vXjon%)`Dy}n%6--oL{Oeqbe=0o(+LxxT0G~(}E zKrY>>`>gfadu48s_t<{0N326P`saotCr<9Gvk><0v601EJZPFor9?f)w^(Nx^lD%> zM(2rNrvOJDBdze?Qvjpbvvz>lM$HIp;AufczVwcmeewOHa7d!o#`)KZqd434E+jE2h*`^{s-iAstyZ=#Ew5 z3uL!%_G0nj;gkkmjDM{?Zw3UG3;!H0ugfu3MZ3K&`q_l=hE7yxg?Cn`EsrAOobUCI zcI9Y=JtH`kSl(G{LeALypZ&tW+ah-Gy`t(TH%afWkFR>)B&&#nkhWG~DAp#E&k#Ee z&X5Rk6AK2>;_~g?xfBJbpoq05*&bqi(us6Ss3Z82uV5tSXSVQ22@?9N99Vpg-P+t3$g-R}DUrwmH1yFZUbmzoZg=TNnoaX}kT3 z)*p+;e|>v4@mjWqo61};M+5UPTzDO_?ebE97?P6JCWoR_^>VmUJo8zMU(6BxyA4*$ z(ErgDO+T2$n%Q~{KivJuetO#JReIyfKhoAw6bijKvI=pIn@9B7!z4GL>~xm%Y*svu z^hs1Y*MJpRc+Mi`v?8BHN&tz#i2})7?kTVk8yaX zkZ7FUS(BRnJ5hxAxb*YX`9^tG`CtxwC1rE!o}Tb|bP2Yx$}>zp&MeT!^Yr|**OH|* z#=hR6SejQm8lC6KY@>TLf2Vv#Lc+E$e(c3?H1tB%gn1k~u4mvT#d!8KPQVZ&N9HGD z@kP$@R$;}xk^EghrFVsXJ&?AF=2w$4qAIL+W z4+JGCyYe4J^TSN@j^rS}k>EpoGy3#R)cm*os(cqDenl76sV(j+RegOyC`y6%& zJ*4!0cWbnpx|5Z*4{wTE{2AR0FE2o+LE*QF5zV*hnesY6ZicnufNWRI{@^Mw^e?Z% z&@sYrQ2#p_Z)a~}`ag_UK1agEOALhE(8QY90@5M}dQq#dY7vRs!eSM1>5P@D-}0}h z_6^o>96}Kw)&shdh(m$RDr(e@Ra;AQX`c3iZjTo;^(SwvJmNz?ap1ExBy{UxR#TMe zG??dyeX^LVaaieq1P{F@4fX3WOdOB`Z0kF8;BIS+o?ln`52^R^UCVr*Mexe<-=smy z?3I206Pq-cp`)Bax21oTy>QcNl$v9{Zq_y9= z?!|R@`rLNIE=1BYqRgcCmTObGSopeel5ZM>B%pMzOxvFixbst#94tpMpVj`NuBqD|Xf zPvI7jiHy@hPXm&y-{j94$^K@I(fk(igM@s9)I{Ll)|k@Yt+D)Y(MXH^_Rp) zin3&$+!o1lGLKgzr;YD=`_nRanD78eU5SjM#n5|COVc1o==)k5ais{sCdW}=?B@8e zg_34#fN#{V?=@y*g=-{I)y~HOJoG(Ka#~asaP)?wh?sQQvGezUjT}5V1CWM4$rJK5 zF6&7gPw*8;G&7P!61h$!q{oLK&q0w5UZu-*F{hIAT&rC{beXJ7<}-hPy>YoZeOFRt zL$&A7Bg~(n%3;)AMEUQEm7S}tk*U-F&{zyEM@+ZM$2Eug zg3f#*hA*3!!q=LQ(98QqlOCY;GNFOnI@F*vYl{iz<&mAI!xJGPzqiHfC6M^(oY)RC z?E;&GdB-{)hWPz7xBbpRbPvoE%GQ1rW0nQI-j zuHBRT9jYRJAF$V1yti0%2!ctrT#Lcysr_*4BVs@hX9EF?4HX$nflGESGfvI~_sQR& z!VDLJ2Y>C25ue0#S2eiGk&XztS%hOM#r`u!dF}@rdR#Y-i6_c_s=biWqCY;^wP*AAYpYlN-~gUP3nU-o;p9 z7#=$>poqr_acfEqF+h2n?d=qwG3R+!-L9-CZ#f;R9V^Idk;xwW#b8MCvS2sABv>P` z7;h=+*yRp?c1Np4+?)y>4<trtd1gcC-q8}Ea}@LQM`;oL{)lBEjfXgZcFLbENL zabiOQk_)snM6K+i(ZRULIIyirEXOx)aX$bXl1dxWVnHRRlU6Uo`40uv1PY$KlP)d% z1|rRl^?`EGU&VXe4UQS`l`3l`3abM^{rj(@*(4YaUE#d?V8dv8=ZxQTW*Gyg#7)V-zv9XVA6ln(P|6EaB1GtIFmLu!--teT=r&nO@KuWdje4W3+teBSUm_lmg z!Km-8T=ed|YF$|i&ONa36R-U}9})=bMTeem2FSH&{;-)!7~KcJh~Vo+<4%*u0gb%c zVt-;Ae)XH)5&L649Bn-Mq?Sz_5dica2W@4tx!DvrbV{O8V(@VeXjPp-VS$a*vaUl? znX_M~!!NV7XMkpa&J0;1=nCQIhmgj}iD3)=n*3cw;PiGHA3p8z!=|K-Nk!fG;p2(M zM7zr$)8XcLqh5%habuNsSc(Z24WZ>++M z)Whg<>{oD4U;*t>)V25?-)zcgMiB=t^(SNccpC$5L-;gQLtMH|EGR_atHv7F>~d>u z=cfHQj?y*wGwv4dfS_MVI;-=MKU5ze8ih>10fn27U(~19Cjb5q`Cb-Eui=y? zC4(|lX$l8bVJ2dIg*k;cnxY%MB2-K^nJ&26UuKrLHi|jFg(*aC=Y4sjUYxiwJ?Q6^}i*yqv13 zwJO46UCE!&lWqAW(?D#rijmq!#mt|>BR;*Gtvkb9NL<1EWun#C6H$bQ<)({O7V3ui zD;RWTH8Xr4@!PO}$2wzeY5vSL)@aC-Xy;YU;}Cwb`NhIh4SftzlrJ-;qrxj|kdQ}~ zaaqvkgE6&a5&PcjXn1(Ssm)=shw~kkALeg5OFj2hXHok>JOID$?8?K4Zs2T(*D)bg z2Drfev4hNjHoAPii0w9TA})7Uhhw?$}js6!;3 z;I8r)ZRVkRLKCAnK(vQ}bQ)6*|SS+XjmDnUL#d;K!9y zUrmSC`Ebnl?yC%Wgu>nr#9ETZ`Uyb`GNqsCp{HrNF=i;*aCufPY)uJU_J-NyR|J_Q z$`<@$V2g*LHy3@9ZxFR8N=N4cMVOSS{o9AOHGvOFVfWGETR8E=hM8nnXeIAcv#CbY zM!SnUS?l6BvZP4Q&6yKWp%=Rt5Ufc*QZ7=B@KGqlQb=7c!CB*S<;iNP&AARe|78yZ zr0z^C_;(T6f9K2E)bk%NpKI0r#+9Pxt_H7&@Lg<7|3@3+{IC^K=>S6t+~&Yo4~YS{ z5LtKL1v}iA4n!thMJ`E+p_&A+gn3+$y+~M-d3coD6k#IW46Yl44sf24xdZrx z`~K9Xq_QW|)c6-!0f+Gpz`EN({^bcSu?1#bRObHCx~Ab4T=z7bh~%|138Q+T*@kP{MV<|B9ks)n0+nL9 zmsH7p37(qvwG41Pu-&=N^en@Cew~}4OCl|oOZknM*qZX*YG^_6MG^tiJ$-pl`emz0 zN(O%VA!>X)#@r8`PBbc&7MTtUB>gQK0_DkjXpm(_ma z-^NA$5Sshtc|&Q&88_XSk|meKT;!nw}3_e{vO0kgoQ7$jt z4FafbQ8dwKVIzGU=v&NaP-LEuBFi)?>wLug#i!O7=+6@===eNl;zEQvGJ^vZaStSc6Th-- zN=3yf5bA4Tod{#@C`@AwOqEBcj1ydN0`ByXc-~8!6!C$xe?WO*WueyF$-b^XxVcQIH+;TN12(s@o1}hNlR~XqAbr+mNiuZ@PI{FiBq)ePR zIxo+sXB)+Ov{@2)a9mZ4fY#f37XY^JW)1qBjzzJ*)&r?M$Gu0WXTo6zf)5l!Pd^U# zvOpcJi@Z}hy3Ns{V}+8B6wxbB>B=>q#a3_XegiIH+|<*Ws2Q=&5u{A91Rn_S;dT`ooh9w7 zo?m+G>VgxJ&1Wlr*e-nwN47?!CzJa%D9aTd8^_3&nR4em;PVg!n=q7*GYa{M=o-z7 zUUCm7_Ps2Ve=Nmk-FeSXHCW?sFDs~&P^F9f#7=R>-!_OGklY0+1zoV;d%{#qEK7Id z+ZzH-DLrXhoIGGp;y(?WOkCc<#U07)V`hNBy|+q04{&Sd+9-S?4$JaQP07c?EQG8) zp@6G!q1-wG@^R)f*va?exSU2ALftkI^@On6(ZLG6f$w#VxO+zBSJ-ryWu7BeO}?D~ zJKuS1?OYGDluNhh86k_Qtuut&0bp)zqt2Tf+P?#LF8WTP2Yk^GeQ--31&PjKJ%%o3 zw@R6BVWMxT{8nRpw6}{_$pOX$j9-8f|NafdU#iNVBXGsO*foC(f)+=u z5v8*&VUYGI?CC<6|BU%lSo%>s*)3q~$cC+%{VE0c5=tfMLm}Au+CtsyYtgK^Y*_i& zZkBm=mf5&2E@pNr-pG1b7!mAI$S<;2g_uI(Le4olEV82Y%D&}E$nb=OhAahOL?7Kf zsB%cSuLyjb27ddjDrz6Ugh3>hr@esvT(w}*a4Jo^CuA13b^iMd-4;Q#SdKC)vj#b2 zxfX?>x?ta~)9u=ZA=r1N@5xxk;qE>cJJ0kWMKlG!9D8d&+~x7}z+-}RD9GwX`c~r81k^gyrrtR_ zV^2H2Tm2#DzI&(rl^pTL;f3B36SMO$Od4#Xwhk#1HdoKF^scj`a(}4~J4*^gvGHiZ zR6G5`YsAlf91_YRzjJ;iyjg8rn(s8C&2kz5QJ`lx%T-N2Lno51BsWz>IJf9K_1v5> z)9B1Dp;j2z!j)m_Vt|594zVLS9n2oILweg|p^Onvkz!dZ!nPOev4(l5x2rg|0_gC- z%fMll@Giv(u^b8^(PWlGgAh(3O4T}jgSBjIa|LO%&`rE*&wK%Ww$pvGn(YustqA(T z046QzlA`#Dl&b1N|nol3!XGAo!d-?VQ&j)NvUxBXX zz)1FyiT)fdMEHT(E=oLn&{_D(p92$Ed%puJUt3@f{J%dwvN1JtF>nBx{Lk*EA@d$z z3iDZ8-nvWLjBOSsN`PvX{w;jvMq)c+B&o)mbfA3H_t-d#g7$ng+*+dyV$_sUr+$vc zCfb<>S{78z?tYG!cj_|8GWs#t$#BI4>=#WB-Y33Kbz}DaFPCfqKm?e1X0sf^jamwY z5SH)--XhUd&Nde8j%KTa=xA}clTeUhPaFNV%OcX6KF~FF=BzdFL5q1bjD;`~hRBd6 z1Vz-NSf0MLQ;Jt`@+>Yo23IR9*V1k2eldbCIX#+5dcU=Vl_IMy>7 zrE)F}%JrLe>s}J&r1>F1w+Cm+m{OfVIrx35siveqDs!f)!;srZq1;BR6ayYC-QgO_ zwWoFWgM=zKyelI%ZIQOK?eOzE@#%9SM5e3(PclK3O2RaUX1A;60f+U{aD_OdUD_%J z>4or-c~74C=8w-Un@!R(qHKASwL2th++?;q8~RPLSmhb>^5IC9JGw#p)^!`Bh5eyh zh2bWhA}9ck#?AX@ZVi5Df|SKE^*ao2b+g@PtPRW|~%bZ#-Io@Q2+6W1WaYu(1r9 z0X@94+8f0!PQaMX*5qZEQI-CC8#`sdc@d?8l$NI@a+(HBTNU}(96{hmx>X(QMqhb`ufqJvI(I{Wz=A~Go~MYMvrF_2Vc`LSO?Jv6Q3frq`PP@1WI=kdP2 zeT+zx83z+0Cp;xFZ#7y&ABzi-K?N@-*{yul&&E`=2ZGOy92aj!61Uvs*l5CbNecTE z2Ia$9w#+>SE}XLND8#mmzHa9QeJNFDA!JWbOJX-{W>FW(B9qfYex1<{c=dQWjK3XM7+x+eFCD9CbQlp?mxQ!NH(Sw<0-#t>`C&ZnIS}syfYG z$nLY}LdU{;VWw${UnU!9M}9_`mD`9J{y-t}0Lu&8ks&O=3Jni78$X!%`ZZkpUS~gSg9~JzL8eu{Th@CR|VM`)IHb2XX#21Pus$EP=T_ai#HMeg{PdR^}tLQwm0#>A3Nk;?){ zfBw1rb%y(a%>IjGsehKge~B{teJrK;=cM}OzbDl*p`vH^jUrbzW!jph!1#xs8CV!~ z$*pfq{WQw!>C)Vovt>yATUb5giu*9vyNj)xW|TKh4aP=q`niAKN`1nGq=Ebnx!Pbw z7SRYCr{ZCQ*+!ygPK{nXtKZMlrf1QjEG*D>4B3&1A=RKSlkp!ZW4&CdO*&dJ4l7_w z2l#ZC$%5Of%Qico=IbW$jTT7d@(wjZzSGnY9_mOQpUgp}(4JV(Sc?k9@ftYR4&mI` z_A-@Bsvtpw*UI$vR&F>=%8ua-%F%w`O1Ya3sV59DnM8X(X;?iIzxHYADZ|wL z@GjIc4jOaCP|I>6HIt=!y)E3nalfUd8LYcDWZrsh!fm2Ra3ymXDdJ2lTWo!07z?;j zAM=2saFhW8TM?V->gESM{hF7sd$8j0MQxcI!(tZ$crQT(*wX~XGIUK_&j1y7FFHZP zD(`0Ht2{G)K^@hVzI$Bw;eLex5Yls1`3@ZCQbZt~?jAD#i>nM8vL3gsGWGbXDD*na23J?8%sS1$vlDRTO^xcZFzKjP}ecTn2(!N*X(zeu9|p?7{V z%X^pNhM+}(Np@Hy(IDC&^r+%itJC~LTSI5UzL^RI3-#`LixZm)1^$!}QX%N@h(i)X zui^^xw_&5CCVs?Uf8+z-qR3xllNwit&zlXcz3nN9;5K6kj7$`e(NIjLx&Mi|uGfRB z{f?T=Vp=qcmeVnLd8_hn_Ae*t64XS^GZ1gyc>G^q6Z!|McIN*KHVRd>wZ;%Z^`mOs z9=|x$shOI$vU#td`fF_`!caCz_)<=`O{w~mbyL$EqIddeb|DD^^)2M1%K9QD_QQVr z^3d?m#UcOqhl87&>^FE8P}D|Ky)7SZwGb<#A0UWw2uMDD6y)@=K}Q%#QaOeuH7Ik1 zU$%P`LEl~&=&R3f53G4u7j`x&A-oAWMkpPBV&82POG1s%{@luEQwIkc1X{Y+N~8Cu zeY%#S+Y+7~8JBFC9Vq5eov)SOVlw%t?6s0|Y+B6(E5?xF(@AI{`rQkn*}P|<$Bg9D zLdjFQ>w60qaB#`Rcoh7>3@chtOMVssFIIY&ROn5nhl%%jk}L;!A{sxtODiN*LYUgX z%}uI`jZiy`f&cuBTO5mn_zHEwBR(iQ3)+Aey<-52GNkN4Eqh?q+O^|c4c;23mKdo_ z9-Yy6uT;|<-g#)$Q6tSya~Ex7eeUI$B2%RxbWaL{AiL5*u;-UTqM3d4l-HC-StP5_ zIN3N;Z)7i^1L>NquFI{+@9q8PLa}F@agrp*geM2p03LcXC^>3Jbp$^orhK|5;bXlg z{PTt0(`XjwppF!0wWKI3PgOrz^$v!`?MK!Jq6MtsmHt@wsy5Ce)+2AC?!TPTLGwn( z3;s@v{SUhaJCLoZvjgZ~R#|`d?1r_e8K&Cbr~o6X_X1>|eslms4XaHyz|c&;atY2X zyqhxI5UC_T`FC^~qXPkDVv4<&o=|6Z;hi`n7UMd^S$7!&p1z zkah!q2p#g7GqNnTPJ`7NUgxSniHTEod-0GxYij9OonhZhA^O3QgWN9F3WBt1v6LVR zXJayrKM8w+Ijb2^gCEl|^1-OEXLULe-HT(@kzV>kxzLnoi0)6+`3rJ}A4zq9_|LRg z9t>#0M< zmn8|cH54y+YYl3IM14owgBtd2H%aennhY3ydp{_ppFry#dEkd9TkQyyjw?jTW*kEf zG0Sq8LF&Bly+L#b9x@J|uHKHD5q)&#M$p?QqbDX>=m)13p3F(!Z|)YVLmm+?@#jVD zwsqiCDy7{6GJ{J-Jwm^`xZfbfN|8bWJGnm;4x`Bf#Rn0y<8&5-$BLgr?jY{0sHk6? z!|F!&K1!;0rJ!3o;wH=nhs_3(WK=yh-buCa_XoozVN>~40_b{`E{frV8|e7Y6lr-6 zE?~_r3vlY-K7Q^6)l-dK;L~3|MwKw2GyLndHeJHJdBgl~AapWyu=xYQzf2OJ)Z|_# z3DjrF&r`CZ0VK(U0GVm{9_bGB)ewqRDFCNPctBT&TD$EBB%?kniKA#;vX76!i#~%i z>gDG&>Ta}kHXE8-sl-XLC$iM5aC{%r_Kx>vW|r9epPmjW0|=%!q>ZSeA$*9)_aljX z!aoo?tLR3Hbw-UCj5%^d=n}B#My}Hl&TORiiW0P>jya0;DiB5jhKzyq$DiGYe%SIR z`N%YmmkhCpGs;PQEd`XEz36|L!MznNqX*tcj-%0C?I%0T3^C~39$O__R-~6--qppH z67KD38HF_(jc_us7#K=p5=b>5*6n!)p@$FSB!|wIB;is;ER>_FPdteo5Y^?r3X{591Vm*&dgQH&~j-NRc!GRXfR34 zs$xKj6am32c`|Ww57F~zvZ_eyh1yHCU3r&-Sr*n?kA3h34)ZImGOGd^ z<7c*SCFt2qqHi_wWUti8eoj**m;7>rMe4k>K0=P#acZntgHySVvdrJcO96bfZlNXE z+CtZAr%k$5=z{n8c!FCr?G~~YA-lw>C&qrQyXLvMRH>aW938SYnJ6+ne*KQR*U)9K znj##P5|4Xg%8@P*eL5P_tM`;(u!@5efU~R}+r~&88NC45S;mb5?RFirg!DdX+z@6< z;HfG-QwQl(qiBYlXB*`n@E?rRME2}+;>N+0#JCQw+%Qb}HKWyslMlK@1G?=d?u01P z)A#IFdebo8bmpK~2k3W_l*I~xFY`mg^TsIpao4fK5yx;x*wF?|h)Ew~8&H?Ow8Xfy z69-&;3_Dw45wD(Lu+8X}5*EJG-;+`O=IkORI0xk-zISYQO~c)pgm$DUE=6`T>ix#n zn0Y+pnHJwK!UC=WO{f1{%qcm>;wE;;>SNHuD9pz9`Pk&dn6V2)7e8Wtehkv~Yn4F7 zw_K<-q7;v)u)9lrkAbJ%q*)OKm+yA1^Ik+?^^gTZj?o%Dq9B&LnEk;legT%x1agni zoVRj^=bFlo9DeKmFuV4(4z8ms-MzOVl?S)D`P@oby{n_V5=rSj*o>&%RpKcA8PrJl zsbYAz;+1mV$;r|1=bil@CCw4;G>{yF6~79SrP*K{u4IWzV?5TA;O7^P^-~4)=imr( zNSui^VD^dKvd;>2!n$NpmV$gfp>@Pl?2GNMNvsF%3jMh>C?SmgGJfq(SpOj~_#dU= ze}*z1Sy|8H>F6jdbWvH#Ye#aC1<^1-sT!ao2=;RlE=>KhNnHZp%5|BGNT6bNc|kB$ zJX4c+L5Rn(Vs(`eFlmjN3j<-WAnxrg&EuXX$ z6iWJ4e1h{JPtA;ZKoy}DlwMA!3zjbV!SDmpJO*?bP04V=C`O$*2U^7+&N2j6XsIp= z*&HIMv$@+=chM>?)ws)>-aVAZdBbA2GpG~Mkm412k*Vb#Q>#!DYS(Ed_v^z;fcrl_ zbTscwiwE0e%~Fx2=O!M@EhjR_@l=x*XbutFcr8tK2mzr8(W|?eg)qZO7k8BzGZEge z*vv>wd?(nm>Kkj_C-~YlTm9Jc$u9V=*KClTIT{{PGj2wixiW&g^PD+?md5gH`I|Y6 zTDfNd21x6M?eBVDoSg+s`+Xs~91=il;;7);03dj>(#V??^@}+zuNb(|uW&(uQa7bT zx@oRmAFtp=p-Bd?6c_!EBK2z>{dN_M}531fX=!Z>8-{hwfhN^)Dt{>Uh_F z`L%JxFPCkE3U=jnS-vkN5FBjjkZwy0d?JB(!8^@H^RhgZj(5JSSESnucDRN+^j(b} z)4b`tMRa(^PN?DH6-n)IdE-Rn7;y?Q?-CdC7)kX2K~6`EHb49X zC67Dknh__Yi!2-UY1ueJMetTm{EklkbVh5_{%wyqY;A99FZ7TymP!G0f|V$1sjeAu#k74HX*@=)8&`-OjvdN_yBc2~?D%2rSpeuWNEh zG3@+ihMwS}MuiJ}HnVg^-sITwt%8rZZ^@I5`&Gc()Sg@oQ>BQCM~W5&2fe*P|0&C=yMX)wJE2_*%1wy zbjOdl^$~OrWPdnd?aa|kd@tE*^hV6!69qA@|IZZv6}N1!OST%qV3T4ces>c|=}4#i zcTUh;lxFnm@ec4<>dBqlC}IL(R=qq({miO4te0wg$z;u@>8f4Wa$Wqj0eazJQdW%; z1xIjHr-`9i@C*s@A|gKG}5!hrc@v_71lgb zd~h&9XXwlE2P7SkPuU`|&QKU6%%?@LFKpfH+8<%Vavx@qFE?d;`jAYrvRd#s z&D9|0eamY=KrSt&-y5t|&DX8lyg;`K=T<$0{%NQRwx87EIK!iBO>XJwG{4NG<^(WA zXw%uenE2;@-E^CF$}8&sE`^Bz<4d|=;p!(Uls*69626Q);u@IgBfAK26!ba};5)s# zdY3 z1^=$_`c*oGKthX?`MXkdd^H>UC8B-b)R;%;mMFxM$iD2+8&oroV2qi^qi0R6qbtoy zB-6uw^g0mACxF-^gJRj`V?>jgKjMnS1hU}0DfMW_N=_raqoj<-g?jC^?h4TC)2tIG|vcx9_Fr~XwD>2ddqv?tS*dUJ+XE-Mc4CqmIHizZL@JFnA zUm6GSkDq>y%~o+Wi|ba;du))D7RpUL^jxIYcw4`#z#*RV#U0k>XElUqkim@)b3|A~ z%Ny{I2wE#3Ifdf{-wkNeJ32RExs1XUUdaJhB#$XKl6Q^wO!(B`&y}wRExN<#zX(qL zm&*5-g_Zl9TQdSSstD>PDMMoN$B3eTSy+MH=>HZQbo$qYRr@68l8L+9@y4R}@ZwO# zia{$x-&*b`ifxQa$AzA^*bMX^v=lqq2=S>j)}+zK8*R+cQ z>)POlx-mFK%65hn0}Il9-Jj^Z24^*WI3or4iId}nR0sg$UJf+=GZcxIwR7Ra_cSTF zsmHP_?-fe^A7k$rB?+4?3zy9<+qP}n=(5#i+m&6mZQJOwZQFKr8Mohg&%Ni)obS$j zE7!^&`8VU)vG-oFBly%Xs3}e8y@Fi-UV}j|nxtMv3>YkFlVL#iH9k$zn~zw;As2zgH_kPd_LD4*y#4k&J1gmsqKb*KqKw?Va8?b->t2khLT6 zrDmqZR3ku&_MxtpI%eEt(?^ji&v5f}${z_KGR{>af;A~~3pZPfilWaqo;@6erXWk! zl7le|Wc!$17Ry|V(}QwemZz_k=bf^cc&;x~jKn;N>s&v7l|{uAg(Yt2w-<&&R;KsV zYQDqiFGIF;9Hn%c)`5xgqO@;I7|n!W1*8pi8yamVwW@Vl^C35Nq81wPOv)D{$Ujh* zh6|8lW=C%oysaIkL&k4!6K{<0nQ=ORs1sc2gF!_!vm;u{0b`kSV?I=6(VTlc_MBVW zEKC}z*4-LS&5P88`Z-Nsp~Tj-OM&dz-V*o2`!OjneQ19zyP9t=a388T5uUdv61IS= z>j|cStTkW)&s&wyyTzmQ#ovRUu3p?0rj)+8hi{vAET-+hIE5SS8+PCwU@LTXcU_g* z06(m?FW73MP4OGUK2C=p(Nro7ZWHacr6 z+^mE!j9(g2{FF6wX@z_k%fms)0YmvA-IcATHoM2`o&0P)2b~7kQ?tr%w_piA-rInh z1I)iU6-8kZw!;yu{?*ZR5ejQcKGobBY)b(7@lN; z0ZtjwvwGtky~oLb86&f|?izu)K*wR{z?G((UEPw*^>SejHvUFD=R*ub{ znLorqOX?%|>!Z{`UYS;`8G{YSV8U@8xD`()OrLTmu1M9)r}}ZvvqX$ScIcE|p)~q46&ECBtc+#2gcZ0(N?d)$huR4n z#Ky(ByTEn@&V44@rQdLWF)69!s$sLg@| zS%o-AmFBEEtm8FoV(utNoY3DzvTYMaGY~HKXOSrPr;ev4L^b~e7Mqr43L}9;SWCM) zU4C+zK6&fz{)7-jK1T=G5A`wX$Sd?MCwz-T{jcQz8`Xry~ z^VyJ#lFHf|{8^&)NiGxGQ42QgEK$MUYrZVrFSw!Pf0DDmGV*85bvHhXe7c6q`Z{HWStL(#|7N?PZ($z>&5{MZ1LV-oE8K_jN)&_@IZ zOzwGk7JGRfQIiTHZ!~lpTH_E-zR;B+>MgSoi2SX)4M9jKQA}l%lBLu3eU2m%y}9$q z(c7RNo&fZ~p3SOoMD4yBXq4*}cMLUn+o=4nZ6%Mwo+)0&OmAYGIQ@aJFdDewPZG5L zmAok9P;-|QNc=1w>=8v@(tMS>nB|Z;jp_|2SGiNW@W(TBt~l^Cb5FGzW0|J)qAM6F z)^4Q`IF`<#JEqB|jknJ1;8|hqYOY_#-H(6v^;e ztHURxaf~j(cb0e~cR&}Y3G62c=NB~9C(Do|$6DQx5-wjWmKfn5a6@yv-Ee1QF(=PpI zEtpC2|3_<$MZk0miFIxJBdCndx}JyU$ziI~{OW3X`XlVfV2%Z*G z6Zfx35(io`gNy@N98LDxK7(f$4TuopAT?F#6Zqv@pIsJGm_a(^3okUl=eqLf4uZ&p z{5A6pd<`)sgp6|78)Oq-o?9kg3T;`uhUbi1I-IH3vCc1I9$2o zVaC<6J40RA?Gna#oBWOx@e@B3MkK730syA?g)aN*KF)jBK{DVjjXN|{|F6ygZ(d!{`{`NZg0>55Qit|XMre@c< zs|peK#w83GNZi7+%`k_${qOZLi#r$L`k=%~V(&2vLXmc2eF^JsARFFcd}wNr*T=je z{Gw-{LIp;=LHr_o^Em@=iBUodzuCpUubBPmt)DqaU)Pg; zJB&ITIy(P9v#zu?P&80Krw(GJ0Kim(u(_$|lx?Z7Ysp%uWRx~*z*<4A4})yb5}3GV zClgXaUs7*#!(9(Ty40{8>P-WO@AWoU7D-3@@Hf>%nBUPoA>G}$&Z1!%66&Ymo@ zBh1aSv)NuR3?@5!$JDn^0tI@3DdDlCMshB=N?WCxVDgJ65PkRA8+9SV8=EYBjmo7z z!V{}loue)tA&0Qng1;w!z0HfRk@bep=j@nnLCw&vrW12$YtqbRZojm~yyJMR%b-Vv zNlRQ=&94+mzifBTDI`}B)iG9auQ%Ak@g8S%&{l}x!5x<|SvHaw)&<<6gqUDnXi8g^HI{o__W}y! z;j&7IB%6#|}`QVb6Zo7qC zHo=UhTyGQ&O>0rG5ozk)H>f8?PPrODQF%_jp3wUU<`k!=W_Ms#mDZgez+E0$mdsk4 zxaFBT)gXDv^T3;1UXbbDsM*uU9>my3Pff8lF@+)%YEjiZ-0TvI%@gNz$KjQ%j$H<* zn04nKyE$)O$6O2hWkg&O3W7EIJrWrK4#Ka{ zqgr43Yxc9AMTXEsBe36m?=GJP;k#8+o1)BzDn~({; z2-7A+ZT0!sle3zY%1Guz`qAt=6*eN*D+bOb0vIj_7v?$xPz)&IK!^Y$4mIgv$xOPG7c@y)e~3BRNh! zLH21nuXo68nI@jV1{jx!u2_Y&=jgaXQ-DtCvB=la1j=8Sp(rCsGfysxieL3P9wde) zOKJZhT7t=R3)!0Hs04@oOSF_}`{Z&lm?XTiLn6H#Qt{ZlwIH8-&%P-l;#|@AW4p<_2lo%gc#nG?NF&E!Im{^1m>B(pil+d<=6#5f)?KOVUKn4Y#C#>*^mBymRU zfXrb`v0xyHhuVR@pXRqDQ?x$9)+BGR?|9s(%#~C5)o8l z$Gtg(qd7*Q0{w7)_)PK~irSG}Iz61GaRa>M_HptG@kt4$;Y%sRzs50hJp$zcgWQse zL+n#?no;2j@BcEZv+`vx;{D+it3RB=@o&NU_X#Yi@ZUDi;&zTUhR)8Wj{ij~s@f{^ zf~cSD@WIWy>TRVP)PafU+VtTVieO-L=(d>QIcS@{=hG-6+~Eoa8=A8Oc+B<62pyt zANT?`cO+pXL^j^|>S635;h94ZoqiN}1+0b2eNDLAi66ZlTS#`Tk{-O>Hdy!ybSaTk z;ky97>q@5|kwiV0c!216DlUneg~(20nBgg>^@7qfhk16sz|;uc&gUYwH;vG1)aQuFSX!o zWUj;qm57nHLO#I?wB=s=ph~sy*zDJ5B28WgAToY?{~iiQs@BtzGLvQzHEtwTZlx0E zyr}nCBkVN?*c&?Nes38NDwBDWd3wX8cNU}wKfoR689sKQ3&?LMHMlotD9K^ua;z@F zb%y@VU!R-WcNJ1Gq|b6l3ry_f z!!^(uWx*r=w80;XV)ll;cp+jTV&7w$u&h$`%-ZWZ0R1_85q>?8QAnXKBnuoQ-Zwwp z`7JFl4O7)Ndw@Uzh`JK$X1*_`rlx*h(;E7qBe_Tt7(?kZVJVA@)qpTgyZ9`d98!bdwr}4fd zlZAR}7}p|FbKY)i8Nk&{4eGk`8~kD6N@mNwSY5kG3N_daetD9$8(jyX&#*2@5`byg z<$$x_V$a06&8c6K9=V3fE(upZ)kVjlL|G5{Grv=LPEl`*o^G|P;4!XN9zCmPV10ml z<|biaWvs3GrbOBmDb&9dZ;&Bm+Wt}%E&;8C)aj}xAR@pReSng`GYbP}?pEh+`4{=Y zB%#UpOq%4Zg_%88fFI##&&nbKvP6fV8Df^bS8x>xSA_Z-SFLPCYRwlDT0f#*J2| zR}Gf$q-o~ouq>^1>rXd2UWBRGSA}mssf?cu$6SAsPJ3My-;kw<^{PcVp58JZ_IryR zTuKwRlC+`NFDH0!{%+RkQggl&>oR;}-qG6~ab_t8wS6-=aIBxa={PVD#zVY^K1~FF zdbh9Ppb6g%-ADN00F{YFbMgbfCZ0@K>2Ai~j;nq|t;q5sQhM48J-a7?e5>UK_=@F5 z>qXPvf(X6T+D4!3S_CC=9c?Blno0`sbc1u;GU%LZ~#@>(axNf^CTt;$jucUoT#rroMc z;30Ef5R?0470-ch$CWHjCVO$Z-HK1C@3gW=p|c8!4nqESbGi><*2tn2usPVg=liTO zC{$)lNO87G-jP+;n~eDZLgpu~ZfG7(iapkE3k`*IU**d)wevLm=Im3sdF#^j;-=3RQYXIiadMb@yn<;i&p^H?e$D{ep>*)G2&!LD9!2d&s!H7&kMKI3q&0gzdhzRSdj}mybQG0 zD5DDT5;yd`>4eVkx?|)@Q%BvBe97xPGLQ|4b7ajRM+?j~4>t=}$zPDuip{G`sphvj zU`{!b)E}P@B09Ok&#Zf^#U91Rhz_$oEf(7%!^k=`SiOwM9N4p#tQx(K1bvVD9y$WR zZyqiI4Jf2*<;*6cTX4S$hjAp&nVDk;zHKt*&0AsK`T_rQF>9-NQNMZP;W4J|^bXKC&L*tr66-Qy(`DMcIZrm=L>GeYqBkm)6e;d(Hm$iC<9S^7hu4|I4%}Z120B`zhNm5XUJ+LnaBJk`aK#E z#b^+k)q7$FCHR(t8cuxhzE$8s#Vn@6ZP9T7p;m;w ziVA_;NY;q2e?Kg)ByixHyXwtVs9N_{QlE=y7^ zEMM|vN-Kc#hk_Vz)w5ace>H*dc~<0ltqlv@cA(*AB4iGe;4Z} z=BdU#H9o@v^OKgZRwB;`C}@OGNPpqu0Z?)X6wK4acNu=+y@oh@jq1VlOEz94oBFc< z2tD=tioX#$M{fGy9{INn&c=X)mb`nKMzcbeb@4zx@$k#s9G{r|3utl4lqdtna9$*7 zW_WaIX5Kfa}ZfJJ>o!o88fnGeh; zagtMz0=mT66fFqWgsigt7eHo1^ICGhATtt?E?SW2QQ9s{1w{PvVowA$kC&8?P_LSB-@Weq)))qqR&R3%j~!Mv1+TE*mIJNf zicGXNySIL8a5i{9hTMJEqV!9#eMT%viro4`4HEb7Fg9W9tyNU(7V9zP1x;aPpv z-{i&b2nWW2cjtc^71D2QA+2|vu4D(Mc<4D(Uja0ki>$OtrzYqMtSmUgRIrol@(tAb zX)upf^M%1mzKyvxXWbaTA?Wm0VC(gtGh4?o`ch7^CfY|a&aX*EiJmc9@ayqZtuGl8@-Ufx66|8)cVUY znJ?J3O@ipR&=!#L$|cbKR7{WZ-J4I{SJAM>Yg?EDM5fL&x5CA}b}K3~(im8|vuZf_ zVaNucY@O-9wlQMTr9w<6B;7J4)VE{M)`}h2(k-0Kape=ZYBU+-gq7{oc?8oAW4FS` zCZ*<&_82*ea^(hJzO(j9sNMom$L(SdI7;4bA3+_I1a*5)2Ht?hOx-6uW94iBf9UAT z-_}r1o~R6P$GgWLYZ(M9WmfZG^>b?1f=V-En;%RaFr1{mqGi#Xb|Y2nuF&tDp9&yX z>_0h}SV4~Q>B%fG4!Ik-yaKmFVHkHPE|-W@T;*Y|Th3LN0Nk|@Jb#>Qi{&^kjYoWZ z!zm?di@*!Xk~ zPA8dW#5N}F-*0fC|IRx!tt5UZguCC8&5w`w)B6x>Xg~H^q#sw}1LL2|0PIoYa4Rqn zki>roYyDFNZ2nsh^0(dOxi=?fi=2qCWuA@y47uVWM{r{KPf;-#7~J$y<(T!_V7f=_ zs>}E4N8v)^ThM2v(C-xGbF5KxUS{UoztT85{Ju8df$c-vgLt!7SDb4@juB{o)z%po zjKvDXOAighrFrg060IY2!vLD9Rrh4R=|F8BWAKYfZ`${Kuv8a)R|r~t?uZN}Sz@+u z!Q6;e7H;vu7Yp25yyBn}?fH$E*C|vQvMgOl;HGL5KT{|y$}Q=QAEAOw<~uP{cy`iQX?VAX1%q~r9@IDf(C`gfz!}Y2jz>+UL)YbpMakOQ#WGKIxO2Bg3V;jK-atT z&?kyGAYp0Jp@Q`jFclI7VyU|zst`}&Ss3>Nr$*Aq_eI8(vUY5_ zbP{h!4_%bRLzroKsku&&L`B90&;U&rb~h=AUp(fdn72!vZ}JQEDtg?rLd!nI$fqVnqtd$XM^EzxHY~3MC8BV0ke*D zNco1~EnKU&I+3a#8)&^Knv)+4A#$zo*N@0Ld zXQv3=Tjtwp^8OgOooq#v3zdpaP+}^LVFqXah-kY;IA$H^BES9nUN}Z`x|~34zSf;} zw={Q=oHlFGzE`33iYV3UYMz*mHB5#ft+bj9w{6`;aAE|#xy+B2;3~|))A|vM?S?UO zelwu{y|2k<*n6fjhW-`aDu5JQrXgp01b4rn>3G7qFgL0~{ay=*_5{yaymFknkb{gN z>hQvi6im&YJ&c4sYsj+w%77INN37Y1vqxP1tTP=|_;_5c^GIsP#eMm-Ms-qK zD0B9{XwWi91<}=WuZ`AsWxRI&B(NNc8!`APoGQh;S}N<3<|3Q-Wb0-V$k4Zdtt*J* z$9A+};Uo7GCz@YXXz2m^6mIay!8)(Mj;tLe(4UoKNziN^%Eimz__Pn6lehPp4;?^e zhg6+8+-B^=PtFvn?V?LuT<2o<^A#CxA}HLZnj9>&C+YXoZbQbDeXY(moP8bNmF2~h z+}ML5)_O5A1`e|4druqfjd0?VJM9V;`BWQ>I>kR4RI+C9T9X*`zXNpDUrDR9oUHmZud@ z(n8#crZxK{nCH2GTI}gka$M)-vN~~9tl(K`)ckaMC27OrdXJg{*&(^ z&^d6P;|T~3cYtVsvC$G_8ANkBaEC+hysm6md;Vf-C5P(Q=e6+7dvPTMOm4&kXgyfsMZZ$rzH z*xLpJ&&d|PKLc-lewyWpBy6}c^G405l2%f%3Y~J|%<2&Hv{R*~(Q=t8(AVk@T5Qbh zq%})J&JDCtLXvMSq!bsnFp3$>YxVbd@ags7uoC2bBxv?xenXv;8uJ4&w}2=8SI4(B z0403)A0iF^54y^K6w?1Hq4C=aC_+fX-AXZx4_s? zU34xXgO}N>9p~Fc3Z&`Jkk1lW<~2#GQW@@}mlqRL-ezWQzMrp;pgsKA%SwX@K;tg% z?$`!wJ=}R(nm(yW`2(1iF^wb4X~=zZ-oy>U$H8TwrmCOmimR5{$nOOYL8KGSNpaWV zTSbj{4rQy%+wvX4InWiE{H(7pO-6g-Zv{#96c-eh`?gl5-kOwI6vax#R!lL*9UU~*hFtY)59Xq%|tF3RQpsjo_jT? zlvc@tgi>ATZpX5YQ9ZJ*xHVMwAu^mqy< zYY8~JqC5HFfqQ#Kj;#mT^@KlPDFI3`VbB~rvAc^DTievf{El$FH;BKPe|Lz$a@hCl z{#zZFeTPVJ>acJa{4G=rS6{yoR$H+DA-cweaR?S$^UJR#&P8nYckBlBm4Zi{fByeD zAd13@L4bg+!2kU` zgB#vd1i&eW$8*cIm0yFM&Q1w#S)>?~dzrnJuhXUQI%53WE6sRiDx0ir>1aVDYyyLy*f zgqhMTO@PuVu4dWm;70um)l?nzY>K}D2aZYacPr(Muy;Z%+XmPr!)Hx{*$IE&A)z-UMcA_Dj0~{XM zEP^_(?sS+za6jrtEWL{2$7J7F|J)}x|7(p-Lsz)VI1phREfOI&`EYpSRYo+HV9t4`%QN*Z%(j=XhcGXU;W@rPkEnu3Z@Skp}qGV#$- z0i#eNCbG4u@@n2yG8(9rSff&LE1I2XI@LJiRY-| z*O~6rCSv~a)j)^Siv(h^D9!YW)&beEkZeX;{nfx;9I~{q0h%<}CmFm9t}H|hI)MBl z5{XnaW}LXK4)5J9<|c0Ul~Iu4Z-MpwJ?Q@X?=#LfAk;2vok$35{Ts5sl-ShGisB!g zq+A4%Mb0m;+yypfkr!1n1-q@z(JTC&qmn;~A`K6%*iLeV+}QkZUoDJ#?W2DA(~_*a zdm=nGNqRll9YsvhS0`L60Gk}c24=LXp6HV#@(QzPO%TN&iDn9%p?)SUKifvdHydR&B<(-;QSxQ z1VxG3>p*#=Mdbp7rHE8wFpeICd4a=K-^cnqqn6I0KEwH&sQ)@9$cx5aihb>=lH(OZiuO}Axo z8^>tuTSz$%lMq@VVrzn*GTQz@s{$B$(uDsT1&^qIP;eS`lkgV`D*k~2IOehoMK>7l zoHZoVL@L`s?KrbB=E#m+4F27Ky;n}m? z*}}2wST*cJ(o|vj3^g;>{|^cx9%ayY{z3sP++{hDcswo>anweu`^7#qH`ixbgxndI z8y9^xll8Q4u`z~V+5A+IeJK{Y`QBuC9y3i+qkwd|8|o~cyC2fkc_=k?^LB;Sx-?pB z_4JvaC{yM1av(dlv&8*yUQ99!;Ku>D3D)Y+64i>7!^LcO8bucH-w;TF`3D5L#iR6u z-vjS=U$Cr7O20C9-M`y6mbCie@@r|*yZdYm!KiVzs;E})L9C*Cz*ic^LD(39#+<=o z{Ii-SRW;F$2OS8AlMM(6@Ba;f|I*KVhxASqL-(_LT+d=iC?ZoP9?UIG6qH{`07ZaB zCk_P%>;1-&!7$oq#$g)(#Ev@daOQvxcCc`dN?RHl3q)XqF+k6bI#_Maqx4WY+?lrd za%W?h@b0_%^!eq%vYo-5WaN!Xz;f$=k`sHD z!2Cjml5_MN>EG2VwxjNyyw4sz4Sfyfno0|XE| z9=y$XD;LcJraD&W#(9Oxs8fFJ;H}>ir~DDSF99Mh`5PrV2L_XDahmH>y9cw(cl4G9 zcv$*3PV^VD{V&z-!&dDcspqV)?Tpr+`-mVzkm9X4rli4w zi?qg8eL?b-FQ>jE0yC98?p4YPDwn@GEolojsJ_`RY4q@xJ?>us0b|HCWj1_*9Lf9^ zoI?0kD_9Q7$)nk$rpy=IAOcRCcqTXn0o|%z9>j%1Y!IhP!-+$^15t*sU#Z+QDZc>(2{k*Je`{)$oDrtfo`)V3_hEaW4 zW)|6w!%Ns{W)|HJRay4+z}nUR-_zxDj&pE`Zvgw5s0f4+thdAo}bEcj_fi$6v{S7*3tgcMcgqBu;AWQ zixFHMqCFhSS<|bgAg(H3MgT=Xy1%fpt|6n<2N%@90%MKc_RWet)5;$-=F3pea^=eo zj~u{WMeU&t-LNLgodFFv;GRY8sSO$6>B_o&tI7d`%AFw%haf!Th?`dR>zp0B24S+T zK@EP;7xarfTpcn73}w{^k>r6}%AF|ih)HMt z5ETBWNE$mFOaLKAVdZ~<1-=hLnWNFl~B8Mu+ zP|`Du)OqFW@IrQo2#}=7C!i)^Q~{uIuVYf>I?~KP;`8hS(=qc{ld@%l`;zu4=SslR zM|wE8QK89(6p26~<%AfAlzU2F$b*TOMA2$S>!nOjXAKB>$&g^BGRdPvMM9v9m9&UpdB~e8Bq(h<> zgOS>mzp!vZMM;RPI#Db+CFGB4&Tuo4^5hC^()Jft5ghNEW_BK# z*EDc&dd*L78S%WkL+hQH+cmgRI=@+{2IIeIhZg6f7}Z%+@?uj_bXPhGtdDLTUhoO5 z4{oLGfWqjAaZNgp4nY<9j%=0iq8;W*w%JBHTAA*e6YMf$TT_T9#Az8lR#3L2XB-@0 zmX-8X-C1moINs&>T$tz7Dsa6`O!J$69bLc*ynRbiK~5Z{q)>RjpeaZ7dHG?r3uE+V zs&UpRNNdZ5oDkyMzv}nyj@Yw-h?_@aQ#z=rZiLI~T z<3jrvTAudQfp8r3j1ECboX}hJCKPA`Ult|B@xwc7Po0`dJ?zV>+l5!T&tzus;A*z_ z;Yg9Bt9=QhWrdkyl>yT3&f`6JQI*68Iyk7@qD!78Z|^E1R8RxUxo^Ic)sI78h;PBd zVS=gXh`~gcDGAMLG+N{bLNuZuwfqW99%u3Oa*IWB96|7T_BIpw>imrcK^7gVXgax0 zwM1*Gbi*QY6EHK0s;hcg%onD}x=vIocH&3~8^fGxdX#w$(v%3h-%rXfWnp&|* z_Y}~}UG8YP$c}yBaoafpqffls$Ve6=;)5VchYDo3Tvigr9*#vpft|eq%y9_ z8RpSwo?ro1u-k%-9IU+TbVA7UQOTpd+Ltbg+?O`|Vvb?Uzl>Do#I6p4Q|Rw=nUlcl ze%n!PmB%`!QOOB~`Hi!jS2n`MiguQE6@;dclMS;hl2a3&d9Sv6*Dz&pimYuwYLqd)B@AraG85?0Ej$T zNZ}Jbunf)|DQ%)E8cBVR7q5pZlH3kg4kzxE*3jime-u@Mx1|2<;slsSbWDz`OmYNN za6oZTrq3>=t*viQj9d2)6=0 zTr#TCahVO{oUYXjTt{1R?nNtCoz*9A*V417V~U5*7LZ$RPKTLfb-UY?%pr^TaMtSL zaS1w(l&OZlIi+(SrLtN($&%z`-#B$Bn@y~f`!vX1W-3>p%s!wSxWCEeq>-t$;Et); zTMg^STP6_u$OUMA@)?N#R#6}O&7M@kU;s-SRZXK+pKUt0_cDdVB|>kL-gW45`l{6` z*get8&2BVnK^)^Cepnb~C0XTeeCL}lg5zYGR-V1YTL&g5>hpA}f2OyfFz(^9{+;3J zA{7s%rPFHLS~zKi9mTa$^eJ+ME8~PbtP*+&$1Ze;+x0*xnVLP?Y+&)!FK52J>-&+z zn4&IA2}u^2O*wa{49DKs^yBf9`x-}%`meJv;9Y+o&$1lCa9u=raCW=z)5!dt;#W?5 z_EnQ-;B#Mw^Ttva0AO`o8~2e3@EqU`lA`bQb$- zdTRgIPxo{j*hTUWt^8`jpQEsYhD;S(R`{-3ghY14mXWLw-+CdwD`^lAkdI@!0verv z$*qt294|g&z$o%fs>$6(UV3+VQ?Z;5?DPRnzjtvLYgrl?8ne026&HD2H6uT6KP7pH zqq{g|a5Eld9=f0+j^if3vTJS50KPdH>>4Xa2QyF@mMmC{*O*%d7bsC4| z3~B+cw>u1>JQ$+Cw>a=?0s|GP=cojAd}iv4JJxqy`4jtGU+FoXRQlfEtoA?BnE8^eJ;r&2p!_NPEV8 zEF>w)TBWIudoz3Z1*4zvscB#Nq{qKej(6hNoKy&CACXm0NEAOv!Ps_7jGsh6mP%Iz z%g+sdnz#|p1}*mrnGVIeFy>BZ$_03$@cYN)@!}1IDN1*5D?_=7a6BUn^*t%VdKuuq z18MZc)I#|NlHI^=fOq!=-QZXUcixaQKLh#PFk#?S}mU|>qU6X6obcx@-HQVEz6VMUf z?4Oy0^(hNW*{gR}z)@IYHve+=ho}h&(%LatW&AmV*b7|tIC>_uGP)S_TH-~xL)Xfy zYcJLg$vjT?LkKZQ=%dM`7G4A@-bIP*fUut*J1WqmB^rTA~;t8 zw~5AqLnSMWaW`eyIcEK*!P7JD@$d=IIc2w~IK|)iWsI?P=Am<{Zn@YqWuAGXDr`7& z>;?C+aRP&Xur*tklIYYp1i=&av9M-ailo{X3?bv>2WPN$^#Cw;TZf==;)BgCdDj7E zeNL>|Kl*w5Fs!`e;4x6TME7NEQWc(=qZnEYfp=+GyXF8DQ2JH3`qr9~&o$Wk#{Esf zHS^DQ?6k!1Zc#NYyAXXGR^AEl5zyO}x8HD*zv&g<(y`N0ydy^aFT&0-I^ zv29mu+qRQ0wr$(ClZtItP_b>NVy9Af?Q{0I_paSmySL3h^T+%%+IagI@9e#gXE?O( za}2fHd@ADoBK~BGyJ^|42U2+8>ibF1)y`eXjMhJzHF?lI+n3OJG`~yUd@kI35jR7XuZ=3VqIISJdFjBzP2H6d3&WJC`G7F;NQ!x;;rlm2Zv&smTch6`FU1go99KL?{BA91EkwPMBtNkYfQi z5`e_AG-fQO#xp`>%NHBDkL1)5CyC-zD*8D;RuYN5j}o9_18T=jU{M;^!hT>C@!A~M z!f`N<*4@%QI|5N9KzB73J#pOu z`NV-!k|`wc(Xkm_G@p*g+L8rGUo(mm}X%=6tEwwe*`pRR&8 z`F-|~N??AmzYoG4I(BSgL%-mj4$zjs5;9{BSewGuviu5SS%bTbZ7&>s#n*`| zFzQ_mMcgrHnCC^Yy@6RfB7jctoDKfD1Le82iICv+J$$@Zb`SQ3|F+bFjPKYFDgU_- zeAcr+lwrrvxaK={{?k*CU0=~{t^)$!4KKjp7IIJA5Z~aQAuz*_bC9kNa7&ALdfiud zo9zJI^Xmg_=k_<8!@a^S<_$EjCq>WCgdmUC^M;hwfo?v~n>#uqEJK8whqPOg01$zL zoPEHPfMvaOUO{VPRVj0ufo zbZLS3?o8W^3aLr=H4&Au-{zB4haDmJ6CGFN24nl^TQijgOEzt6+6he324eSkGX1GX z_D%h{M+qZ_^7ovyr#jK#WWM~;Ol7-bO_{IeCT0Rh@;7&`-vO>E7{|9Wwe zGIp{0cN$t{%6^F%gI}TCEE(#(lurg&^nDuRn=B>+ePuZqFi^aPvFibX%`JzEY@97P zzyuTxIVz*eXjGEKo;9n;x{RjD)^KFoGrhe^J9FzFLKmcaSsn$$NC z9h_7&#cl?K;o(BBX&=7WPU{FC3EAbH>bx)((({q6NXLHmeDq_k?}DffF2z`rI6Y%I zQm(Ob>L*5FgGt(C=h!msAsZy4FAMeYBlXkjKl2YevcTUR8!v{1mj|;G+@`r;u!H|B zk2Aj|tWK>oMoL{?P-}aslf-R!R(%%riJO&X%uXC~0ximaxR( zL?34+$jG&Sp{|TsuH8f=`jJ*x7H*NG#%SwRyyC9|HXP=9qI4xi(y8+mqlhO8Do?V|1DF4N*0kSQ*d5o`B4-uh@)I4nririMC7}EUu|@ru58API zNDQ|!V8p}0gwf#Nhdw4FN-5tYOXh{R@?jRa2{Ou24P)8)P5Y?jhqQ=s@!}Jox`fzq zqgdI+B@W3-?!<_%5)cqwLh4H9jYv@*J|ti$KR={dP%JAECG9DA!?P(pF2AoLZg(XW z)%iSKdXGuX6l9TimKWMv?fZI*upM5A$sF36C0j@TSmb83^R5-;VQFXJGPl;z`Ica1 z5x{C{{X4{q-~3!cJ2&zH$|6N)Wg$u+Jbk3a;?3EKAy2+49kZBM6(MB1<_aPfXL}kO z__G1Zd#gf2x-}pRv8#du_!EvxJXN`r-fqQYt!vU&NtWIcM(#C zi0-gK+}GnpZ7R{iJKOLZYq)~%_0LS83>rVy62nim^Q6{oe(0#Ukk^RSFwS1)r6US7}k5>#fFwOWwR|R^(IbYEu8yl*x0=2a@x_dlcwc(oPOj~g{I3^YX?Uik*Lg_ zy}4xrE#yeIe&CyT_)=hz>D4BuAY9XlGG`WKFGvMER62#qVH2R|7Sp+vn3jtzxDlY8 z+}4MZS5QU2KzwQq0qLbY3y=i|wP9mkt3nH$UO{JAT@4FWc&4tS@c72(lo?J_53`0%2t}c<74Do-vAf+^VKpT4(FmStmNxIW)sE zPOUmm+nBh4i~7bsx`1(w=N%{&r1bYtF`G%I)<@y9jsa-n>9V>`+@`#WnO{QOYxVr$ zZhA2XshSnAtqh%l<)^N6rs3C^t|V|BYFS|RjXkpjhPo*jZMAMQIh7XBxji*9#QZkY zBK_D0A8+FVM-P%@2zWIq^6hpt?s%g{G6gd^)v9HDY-70`m%eW}9CI2YzuJRjx{qz= znc{@1_TQ&|x0yzbR;EuY4X;pw_drHea=38J*KH3T`rO_RJhP7Q53uMsU zmtGcMfNRbx?t#AR(;uR3Mdl1RvK8Ta!hGm;#NQUeucAM9HwbzD2ooOy#WIle{0`5F zvU56QF!Z6XMap+I6c^fmG;|5OdoUy)8p60G$8|Ks5IW4*6XZA&_VyvE*OBIa_Mv#` z{a(U^cs&YyQZy+KKRNZr8c6k8g78UWt5i2r1RcldtPku4boK@2lEOol0<`IkbdvDk zlmP3x1J}_#^?}Ob>2Q(M&ZeNl(LH@2{iK`##}HCZEXO)h2Wq1V(kV#l=q(kY4AOSY z1~*i@!x$?f!vTr6WG_9L7ek%|`J>4bmzxdygoTa?_csmaM~-5z+)5r8cpChOAQm2= z2cZyJJLvO8;O|=}9Um+Ek~d;|4?;Z``0Hgb`fVTFR%d-w((Nwu8Hp#Pu4&=m5Jrzg zEit^Jx}v@W;)WEI_mla3{5lticJ9h57$EBAcp9YM{*`A;BGx>&0;~SR>lT>6%@rs8 z=1u(-dRlU?l`Fyv*JeJ&-HsPE;O{$V<4w#=%5I?K9_*c7R|%A>pTV|~5hz&DqeHT|d)Eb8Q=qgD)gXV=+I z8RmkD0K}kf>O@M&g&~QfMo7u|Fzv?!LcKVjM(7viI)0%yzu5anlC7YKqJ31jmy!;m zghLj-AgntKg#%#j5F1yBMV17pITNnEGk3C}qF zpjB<69V4Gx%7=XhcMyk7X;(zIP=2*E4`Shbe~G6@fJ`y&0!^LgWU6Yc1}&u?OUr}0jP8~yZH(oX2 zeY(7?>fVV$e`USS8%)WB{`e0jw#o?PJ;`4-l?n<31ot1@hp4g3zb!}Dzab6j>68pX zCc`RnslNM>Tjhu3I?OFvJyuAE{c^z zyqk7i=AA^rT}0f*vCNdp$I?2~JsDLIc6)UV!s^_Qtw*e7hG;&4vWz@&4e6)HTJ3DD zt;aeePiOnq+EA?1^?E}DmB+AcVO3L=r*5aPgo|L$>ucI%WX+4Pjipj(p(cMwp+e#$ z!!}lLpB0Wr(*f1dIE5m}8DE;agAR}e(;X@er5Amm^k}L!#^q^cH`NgjUpW%8*WFfU zgIr#lrsqz#w^eaA>dm#Z`tBs3{@`V=EQFqxeb8oc&ImEckYz4=$ksJSMemA@HUYQ6 zQdWqliQ!68R0znRkfX~Sq=)tN_N(StY2M$Cae|y>87Gc=vQlFwF*XoJ19vt2(MpUk ziYy-q67J2ZP)tF^aOTesNCn1a$e+XP_u@(6sF#VPsT#QVS@Dgh{7NIdf zC5qlp$K!v*`n#QJYb>_6X5G`4FJi-Nq|2rD>cw_x~hQ z+-a6%(0(xq&q7sXLq$~_iX60p3W~%PNH7(~;T)fG9G2pWn|le%@icbiJd3||@rkPJ zJ?IUh<1ja=Es@9$!X`&hUwpT*DLFs8#tp?ViZ9A_e=sE4CJQaMJ0-g}Ra`CA5 zn}R~Pj0z)x1eyrgm9nBtNc9&TV~&S^Hj0y^5ywvlvmXkZg<+sroX{Qo#(pkOYxD_W26os|;S^q5 zs!yCdO^aS9LiK{w^-P%kZj5}q$uj9IQMG4lJ*&)AcmeEoih_s{1o^uLNps%@|J4V3 z2mQ}1sejbq{~W5{R#_Cn=HJu+BPj+e4(_L(!z}s=jxN>`j{&5TQtx1IsE3e@vU6R; z&F-Un9zxE*Ag~^Kma+9kF%{*@2LwhdF(&_PU*|vd-TiC9fBTry1li7hYCe=we{QZ1O196n5VvW;NaX_N&1194dabQ3SxEP`l;%97!XY|GU~S;EPb+SI#zVCSgiZ8G+!S2_WnqyB^Z z!lak4zT3Jp{ddDXHBa4W(!=)+7FQ zt+4o3_VZdg)0#POg>veGg)UCb76Ik5iVfPdK05q$*XI7JH5%u0PQ!}h+J(eLW_lD~ zO8%f{$6_#Sdo0ZF5H8c&4q4XB_{K(+ljSmYhveU&=pAa1zDgL<@>~|3=Ty{fcN%oI zt2?3M4{C!fTClkyMWKcwVII}gexV=#Qa2)iQYfApz=8C^mQ>>+b+nbegHqUU5gLX{ zUv!)u@QcNjGM*j)Z=kdTNFSj-+}SRAVd7(Mfg;YzZ1c+{aY8ip-gc z%pC}#d!|XAsJw#dNdhEQ6A+76-WH4G;1_#Xl{;_0K)eAL$hlGVg}>&}+!+eX)mF?- zS>54#BujKgj1mS&FQ^1Q-&!}OEwW)7s7R;poR_(CU(BEEiEG9s zFGoT9?}Gd9pspgm{$mU2X0I{J`)dnP|JNn<{}{e@cEF$`w9M6nfDtx^#^ky)}FM~F|U1(mRWx`5aew11%BWRnLvVrpvD zlI!g1D(7~uV8CxK(8R$Mu5f1V$ea!U^l)m_xzbMjA(Dm2b$yf%r3&Q&rG@+!=N)l) zCpIe-RKASjg&TNpmFv8a;mUUya8a-GsOxZDH0y*6e34|Y{^>kYP1YWd0RjD#pr8p~ zb=ZC9Cu!=MD>`Fyztv*{is>c^d&Z3Xps1yYPZ9^`sr`IAKudCdFDBr4vYfr-G!tZFOwZMT)qDs05k?QzZJ}**?30S!p zv6`wHjKOY+0rPuAnf6@NRD-_ctxzJ>cV_vjhn)4e>mdn=fR);-Zc-!3WH_8mq&fi3 z+^{Sn0c-txbmx+S25Pn}RUs{1r(ovekE{D1NjzxWoELz48q<_B8wo$tkB^U7*G8G^ z??8RS*4kgStbI)k;H!Vw_^rJ>D0$07l~*hahnxz-WH%2ve=zS57CzSLXXlsW!2Mc4 zkem%d9J$#4S@iQPfjwF=ub)`80$ZiCOY}Q=x`FxzBA_);YFz|tv&5c>QJyyKi<79_ zF-jogb`_jVkBBG5wOI<6{KK+;@D(jf@*F>Mz!JNJZQgx=i&6^dfVJK=Sh3h_U{Le1 zWlq+z>3f)e@-EAqNG*KMwXX9m0`5&A)=Xg(lJ_0c#&N66EQkS0KRu8sY6^-nX&Ax4 z80kB(pR+NX)67p+hw!E$>}73C@+#MR3bg(JS9&9u`XTN=Zl;Fj3F7hlOWU~+|J<1U zFKwIKyZ%pC{Hz#zX^gj<4z2R1h2_c27We5E+so?BjUZ@hW10{eozwK520}YJjH!4? z(MeBuaCQuAZE;m$4%!{{qI0a>r2lVBGjC z=F+%N?PUd3i@X3CpO`wXK-#jqM92Yq!$5W#uS3n6qOdMlw`i~mta22 z(U{`1XT>Ime&6o7yZBH0j2O}Io5YMm=?nQX`E-d*y_PN0 z1e=JZmv`u1VlvaKtK5Cgl}ekGrO_q&Ngf^fdBGU=>*@LGAQV5LVn;X)YJbr)cySUl ztK9M#C=S#?%mdGGuV_|(4n|YZTMf9h`3tyusLV@3FsHAOXm6S)R2Ys>BQ3FXiEx`A zaX(ZzF$0J{pD~h_mO$o*G()XqMy;@gKKR1FhD29?`+)MazM?#k0g5v(1r&O;@rje< z0z^27X~I*^K^dvxwkxc@%KD|8lnLY#TqSf&F57a0ZY#f-oGOkhz_8Ij}u00dFK@Aa6)mZxP07$P@ zsZ0D88VoQD>J}mRZ?Ktk&?v;PVkEF0z(OERS<4)zH&IJjS=a)e)$Vk?nYJ_Fg|47) zJIm|gOBs~VK{qD$B1BFz*gCwJm$6AdE5#hm61h;vAG{z0V02wP%dLdGT8NSA?6^k1Y-Qb~T zu&l4jpekIx2I_z&fUjiFMsFGwFnhp_W2otWds~_~?IM;r#`Zvf_jC1ISsBA@?E%x|QXA@@A?3k<_=#6JO zCUhLok78@2q#-6quG&$VsOGnA-{HR_bB+v4v<#NdT9UDiQH?NDMz)_gltQfr_B3>y4# z%Z8(cw9E;HZ;ZWb4Y9ww4eMyRFb*zY$&%O2KX2kX2}|>v;PxV@WR~V7Qq|I+Hm^Ki zYS1rOi%q14ZQ*D*2o7J_8pz%dMMg06k{r1zR8)kZL_R>mHVzQ9b0D5=$-C=XT(Vh> z9w6rCap6?ymf~IFSYWcpbR1wt@ii7Ao&SzO%UuPKP}5lHa!Ndc65@w?XsfmB421(n zeo#zJLo~|Q*W=JBM4L`LXNnsGsJxc(HCnqhSD|$d%7xonG*6jmG1$I^k*%ADesHTy z3=;n0Zk@uH6MHmgA*2PEhK=C&bwd&KFU`e0d<%8zi!}tkeq&rl0rj{&7=^esLF7Lx zRR+YBQo}Oo4DZIO47fR~3E{PRiq)gWwS>NI`366XLkb2oi{}dd>JYh&ksnS$CFhC2i+#scctnF?Y&A7%=eM!6IRj?ko{+_Ly+LqWgibyk8`T1*~6X`}#fO z%r<()_4|IGAK25{V@!pW4|wIrYn2~9K!J14kI!C~creJ$0?P^f0A6(gmdk`Fueb(F z))aP)5xr2Tl1Xm$+m#RT-%}RlpKYTkTCo>rpL#&L5KG960(94vh&Y3Q5#?G*#mg1m zi2arsz4=4ks-)`Z>F96eP06Mmr7_OTw%wtF8BkWtRSBL2(U}FsBs2%3{rLsr(i@_t z=nIRoUnv9h62cF) zm9rjQW}nVhp!7LESD+RhA}eK9VuJqqLdr=1lQF*p4(oN*c_dVS39Z<;e>#3~4TD47 z0)U$nE;}(x+qnWIP>^T5P?$oMb*M0G>1EI}Q*L7mH5)S35Vl`>mrH}26Gi7K^TeWd z%;*S$w~zTP5vj9j3;%>FMc6!RGg&@488L`H4LSTP9h>p!xr<-*N|w5}2wjq> zA^8o#<*4|vDF)lihih*E-I-=N;#%q_EVtNL`%TFT20ZI9Ox?JwwM?}N8uOomskoQ8 zDl>WMF3W{K>ShF~#yb*I=MGw;KPA-Ga$1ZeioB8?Yx!|x^587-ggB$tm)|UoRjoH{ z?cN$u(K3i9$%?Crmg#i5L*xnS^h<8UuN%n)O=KliUvcVm`2;tb=Jj@(6%rhum2pm$ z;LWyrob(Nx4`ke@jifM;vKIvdxn}xl(&NjOuz3k#voPeBJK?#0@Xalz9b*UOyJ7e- z2jzE4I^VQs-f;=eoFS$5+3LJY)R4$iaX1L15qro@N42$#-^)_q)J0jJVK@degao}N znsOa$g*hSMO*)6fM00S)XbK|vKa&cVenWSWatDDN{pR8ACL45?i!$-`NX}_dznv*d zR6}hhRdUvA~YSqJP(-S>*Y8EG`aJZ~}=mPwVs=dR-4PdqLCG7dskoRNi z*NREEpD!-!{`SYWEMi7M2enM`kXr8%+@OjdL_@coNX72AKL(_VBcu)Z$3BuL|E4nj z?If>~%H;;KIn^&@&zQF#3=+ej-@6F<0^7}aDWQ6@_wol$%~=AR26SmpsG{FkSp}1iX zCEusf;0J(wQ9Z*ctt{|HI^Ve)b4O1A%8tUF!7OM&Jz-auT&8{xVsV2gPDZccpJABhj#hPs4&A>*PU?x<2_-&OyEVS%_m z9cYz(Q7}Ruad{-+F+d22N{S$_A@_P#sBEQCt58~`*8BnZ1*Ztt`k>Fd-c4R(4}%OP z)*NHD42$Cymk;+MytJ67SAV-kFiQ22YD~``D+Kk<4e=qs{(2OWNk;Nvo^an7`THGltdq}cl(ysJAn4}gy zl2U{(+6Ei3#|_!kz0EzYg>8O&$rH;0C~U##_^eGnt-p8G5=ks;+=w`bwt@J4!Cp4P z2to{<;KrVapm%d2#EKN+O+#Vz&;?nz98phPK(T9e$|H8Yhm>p&TN4mi*8%yW5-RalVE*Yq?`<*9mXRO!NMCYl>%H=-*Uoiu z{oENY(X}bj)gI^SKyYp^?-3R-i_vYN@*v+BB@N^jQoj(HE*+^6Nmj!aLtG&Xl+R3v zX-G|O#3?90+Lm+s#g?jsb%^%v*a4;MNWeJGp%=vKMB%>gvKCY02%~vOlkJDh$qdWc z1ltki<;3PEU~B$uZA@Xb&KB0*R36)6%8B=KjNpoOYqWlR+ZKCs-Tul5*@Vgmp?mG2 zBceC#W379QVWPvZdIVer@GP~wM)z}A0EkMMym8yG6rbu!L74Wu=XB1TpBldhJQwF9 z>kTJcxb#%;#*-93=Zc;%69s`Mp z1Dl|b%`e8`P?#^0{wg&ofsw+GKNzPp5qvIo8J2UEDb!-%DfNIJ*#>LB5CAvNF({g? z*!U(D5Rs5k<|O7^ZBnINGPa(Zkzd+5&xI}Ha8Qo zbuhL0-=OjT0$PNp+ta|OstAiiK(sPs9Q;=45dyY0Vx(|j`>{;1E+x6QuWxg_tA0ZE zycSB3%#TPCeJYQ!ZI&%92-!BfxXl5tYW5jpSpEL6m;3j3YY}4*yhp|>w#NQj5Q&l z&0}`kXp90+bXR)o%ylOcZzgw|YW-F#40)DeuHwAUR?5ZI*kj-TODBavQ9#12)?jqB zda1hHAsRTg1n<=M6%Y3gaf%E}SL77u)kI^ZjFjuX+EAFwx*=8Frlx4Rj!9;(NfP&{ zGcNYMfd*mUx6ON6Z7FpNyhi&GI_)3^lez#hj&FogcA8{m^bQrR9 zVeD?*nSTn@cv|n!ABW~PQQC+<-XCigTW^h(CKeEUB3fD%JZh4yCncL?>TSMh_JP)E z96|wY1l;xX#+TRl91n3O{r(chhg(SfmqDX8RE9W}@2Ai6igN_DnSEyvQsF7*v zjjPL=Jbfh3^9cF6IfG$Yo_9WLM(Hq@aqg4;o#nK>aeP5|Cae~K`Tr)3l{Kj0^zdxVaRK;QJIC`b}Y z1}dE^)P0Ia!_}80k+FLw9xn9~Mvp2hLdsJV;Eub?Ldtm{5z@&O#Q zk-~^NKz;c_ohC6`B_6IE(xS=I-0H4Qn#Td!xro+g0hY3TYy~pe`t?QEHOj0+H!;&HT&Iq*&dQnZAL6EGMw6Fw5K|$2Xq7r8})cA5AEiwnLuiGl2eg%DEf@ zy5D9un_<=0SC|^$irn36{ORS+R$^= z+xOGVm7N%vdi0xN1*}Y9YAEXqcSpKCXGhc#&a~L>04r{`nXkAxV15;*2kY2r>W0~C zL!4lCswLH|a;jL`(wxcz@?bo6CMe+ehJ`2_ep40=QQmN9nM45=ACz%Ujau^@%O7e;d}wXXK@#TWP#BQ-+jgJy={uy zp)-`ruDtb~W5%27emmsVAEL5?aW?Hy`Ux^Fwo8d}dK9q7_#l5FhO7-tZ-&m;$2Wd(!Mlo1G&4 zS;>*t<_K|Ey{60b z;PJ#PQ?i@H2MYEu`^N1)1HEV$$Wo(@korU+(YlwI-Gc88cGGXyR{fQe?z_!em4ZOPF)d(Vw7Je zWE?8VhgLh3fU)E1Vh=Aj#wFS}4Q3Z+dw>PPE(jvB?R@E`@j-N`KfPQu2@!woT`gzdg!>2}ZcM#8Tm<`)rnIM1V(8tbT1Ov*tjW&QulZL`jIye z#x_*_IBj{XcvWW4H?^DbGaW>v$s^v+LVeR&HnU%RfmU-uRJr*V%v1noZHQ^0L%1=D zRp?zr$sE@fY)XT?;ok?h#iXy}2MPi*3--_G$iEFv*4#_uU(72dW8lAw?QzQMGQ&a` z{3!~!s)q|YFLlVlc4;Tz7>01cT53vg0t%N}rlw$vke_sr;Pz>EcR(IsaVs8^Ev4!hw-X_K+sX&7$cSO7+M$PV*>8@|G(!080sd3nf34 z2?7F*qwm8&5f*=dMUAtP-f8`iX>i$P70|9<`7CZtf$ncUpLLmx18qfeJ1N|L}VafK|oqj|CtZ}x0zHmcXb8YTdMvS5n9RE+2w!u z@O2s=F6gU(FO9Brv&J}a3hm^DBf~*Gm5%8NNu!kI$J7v zaOp)6aM&Z^NFZrM3l|AF1p`d^bZJ7C9Pjn5&7a)z)B2Tr9rs+okl}y2z!PjZoF^v@ou`E=h=f zl1}_ZRaMD0Az^Udy&<`hX+Y}(o~On_>uzHRB4Nr)^%(%)zzgs@{g;wOL8pNEL-tx7F+qcYdmv{JR%Z78QMX>!+@ z&o%|h1Ai%0gfA!6j=6oKFAUB#OxiDD>@~!}QCA5^yHRz6YoT0Ia}>0xoH${WPoe4v zL}Ff6l7RGl90G09ed6b(GtrhWVMwdJ%}scn_B7(pEvk_#{Y}PNIwhpWC4MqB{uti=36V~MUKzwlNWlVj7r>?? ztHL93mfc;TN;$TmlZ#eUpuraM+l*vQj3qT^L0I)j<1sT=*@_&$A^{Ag*xr{I1gwo- zC}i}ZWxX`Yv?q)+2U1F~B`^29Kne$TR0-C|A%Lf5G?kyWVwUw|MScqv_1ZI2vM0hUt$9h{I9(9!j>Q>l zC6$&%TKgzG@N7PmG*7(+7O1uCDk_sqhE`F)o?WJ_mK44?VdgCtB|8sW)mLJ$ut=UU zwq%wp3yXH%B2uxK&CPgKjv(dD(UoMgIr2LTO-VnyM1OtX*nd>VBf&BiTOYnkK!quZ z(0){t>!}&#gkkBF7zU6FQ zPo-x6T+=m!9MduTqQ0pYPhlosp0q*&YxQPmL!1`2enb?TPnrj>T*5my zj6b_wZI3@KRj9!SwQ5{y7UD{E#_YIshc~(Sw#!`qEx#h6$F?O%xScD7TqBEKGY-~f zmnA!Cu>#3*5ejJisjTpzNt{yFV)xt0amKK?sS2;j;w*%AR-bzrdOP|%kCYIjne$tI ziC>sB(K5Nb!ZWp+zkY6<{t-O<^Sy`3+ttJ`oO~5|wWmRdyahJr*#3J6j(ydt3qLU> zao)OGtEg@Xr>i*=UZ>PXWi+(TnV+g^P+W`=7PCtVL$mZQ2e4>KQ7Uk z52GSSLi3mX_YJ;|xDD%6&|0`y^^)A>!r(fwZ#Ci(G;HcdygZ;TBl3%;;g$_4W@b`W zWe=sGstJ39-XMwv4T7nXUZ>Ut?2xPMj0@A7gSD;kG_`FUzmNrol8baOy+BwJ%0d>k z0B^jsL`5b)49{H!0&ixMbjB#ys?U7MBbb2`#{9c4FjG<~yZw9#fSQNOd(B1SgzTa7 zxjFvm3-M_0_ioo$dzJ(K#~K(7Xk=YPCfyhrjf6B?f|UlSTGKcy6TF5j$oZclp6Oxp zvpSBs{8898!|Kl%_6>EfnRaZb)+KAJdjMBd#@G@g+=O*P@^<#&6L!KEVBw8d;BEFy$TW#zFTgJNIV(Q zF1ECDTHjR0tYX;Al>Ge%bSRGl=4DV(nTQ+)89h`IX2>66jYY~9r0&Yg)?8F9A6=@U z;DEv%?KCqMo<4kvKHf%dkdrdoP~< z{LizrhYZ{)H@)%cM8Ycd=J&-guaYxa#MZFsM8Fgs^dD8)y?qq;FjX$*!$AboVa!e2 zo!hVTKnGEzV^G8281-Dd;McY*t?R@a*W((B#gu!zEaKBwxf0@q(esYD{+1Q|)ee>f zS~iLzp=e6t-qn~LAX_r}gK~%4Xj>c##r%6VGeu#xrzmi*3MX?Yw|0}p@&oNG5ow^i z8~C4~hSbn3dp?xo4*QdD^S<}nmgR9(okweC`ZL!q1pa z$965vbZcYvDqaE5&}-dl8@t2sSAHYw-zu-bOV{13uAmT}QD>U*8Iyi*UQzyPRJ_x4 zhfi2<8CbI${Mm<+-pDIL@S$R5WC*K&Wq&7aHJ;;1C_2(;*AaL)0yf5G*JzZ7(w2#e zfqPzNPuJOe?K#-R#=rECd9WzAyg6mDIYP7lmz; zE5F+#2o#*;^3h9;GoZQt&CH{eVdt61=pt3>&R=arP7)zr$u#__v#yhx zEpY$1-ed-+i88M5~l%pc->xi`D% zo6MO?t06+xFb~Cq4ae- z14W=mQw2$$en?aqe8XXIzb&QIXZQVMMHrJ>ZV(jkR&zlzfclvbCZL@#TnThqlv=#q z(SS>N7Ow@4dH8#UWcMjRu(_bID#wTyo^U!9qad-qUIK~!RwRjjt#RG}$AP`QL{lKe z0(Z7oM~L`^TN?YGAN1cPrm4=+=1B|!f-4IGLi+!a*uQPMH?%MQ=+hsc=45*}oz@g{ zUCcJK&IxPAOf(#DTFZ}yXywL6*vJ&uWaNThBij>U7~WQtumtEl(qfUIo5T}if%0tM zio(!jtb#&?h{+*fAYOYpyW876bS7s0JiJKeuY2)6oP137c(M5?`up5~gD90@@Z1^u zjszv}IQFAM2%JDb5_t^u-$uD=1uOF0(fDQ;_@9pK9NZrzEO;RfPJ(gn7vZ_)~Xq zO6y;AkU{%39%RV9FO_$=I(^>1^@IoQKXv5b`RSpcMLIyD1Q>$-RvSejqAU)#T2(D| zxKRYR47(}TMVqT<=~#4^BNy?*S%ghMIPAv>X+#duZMPnyUiFVd?_k>d&iu+~X+1>^ zanMy&HRT^qB-NSK(ZEkFF-P%6+H!Og<)Jtnx%>&mW;K?aOKv$D^-;b0DQpF9LG@eJ zGF7!GudUqKQ7}eKXD4c`7^$EGW`CaC4}w8O$?5|izNT!v7DJt-{g!hhA=Jbjtr?>@9=iYPxJqi>buS7Be$5Gg)k@#LP^# zsKm_7%*@PSu~cGaMqBK8`}Wr}-F?X&id%zSpowdx4nA;n--q;hSS z=KL=m|Mx~3sB5eqgKAg!K1>JPGX7zoS}2tHvdDaiknDQH$EtnKF!(C+L3SA}w){xs z%GJ}5t`X|6)yojyku#J#sN)xju;&DccO7iY@_j|E?2+cCoO<|wgz`jBIL`xaTiMM&HTH}m!GzB2Q*OZXK^0~7=rrwZ#S5*VgCA)F;B9(*1p z{V}k;VwFCbvh6gCTdK_9m!<6u1=XAKU4)CK1r7`+K^QD;^rw{B=*JQ%A~`Q%=7kNx zCNaaNEt&yxnGcWG2~79Ewl{y@2z-WnfidMdvNV-Q$Y$y9Q9VzEv4!K*(M)cCV~?z| z`5f7bI%|dELpF2GK1Dg*jZHJrbRDqj;`({TMY*kmf$rjQMGP=&<=DYstzU7AW~oEF z)jKnbKNZZm%!7utM%Gt4ve??4P+ETB#KZJ3%-fl18|Mmcaj$l$(CuJfS<~9s+}y3T zmX}=J+-_~`iIE0#fqgSm&z2^xn2?FDS2{CO6f5<=FD{&O!?x>f=m`#Yrt)!dgS!az z&>L;mH!=lMxtrUVdE$9Gv^|$veF@eDm59~5V{trfU56_1(lrxX8ekzVup(cv;jKTm z>sjzh3Xp|>d3Cdd-*1p+|8ZLXhjBci&+WkaHjZ721Kzixf&e4lb4%^?@+`-%=cv>A z)(aKd%3x7Sg7d0~L?r>Z!UcOq|1@8U3xb}HB{n9s^LtpoQkrova-y_j%dV(V8A~@O z*7XAhujSIt2?ycUcKO=)zI4`6&7>h16g2D|6zZBKW-eB^2hrp!9mj*lrr%+BdGT4> zscO{6bADsy=Z&LMgB%Je>=>V}82kGA3dPxWwma1`aQ%fPoW6?MbnCb!WN1DLuh2<$#QMFpqQdpWo`GcmBwwwFv#?CC}Y<*7q+Iobvc_?h*2b7v;J;RdH zRBVVc<=i0EUmXPyK0MrJ0<)tC`o+qfO&RV>QG|LN6>NBe5xTR5wa zsnz-Ys1Qg(yuEBSlaZywxdc@UFefKxod@{h`z5vIti7$ZqdkSZojZnoY%_S8cQK<^ zX+9&ztZ;lyhxp9ik!LZ{>~R^}!6^K>3w{%lhVp3c3%fnCA_%DPjo z(tJ`vzce!=iR5f=xF`+eCVJ-Cn)Iki}wbf2=e+zJD5kw>Df!M`kfxuiJ)ak-C+& z$uW;}?2s(M7z0Ckk+GJs`p*|VJ$YMqc$NF!lwZFTn+eQR5I%k|B`upFNb4?rw~3L- z00m8ZII3rDgY^r^`r2AuWB#nLb@UWjhYHT7L)eR*{l%HrnF{SWaL&#<9fHH8e1JD` z0Z68E`AozhCIe{dzz&a!StVwemTTylm=afZzA2QWdb#O6p904zQxQT=2VW~ztx^88=+|krPVV{kwre?W$Yg{wt?4&vp@i`*z`*SoMkc(E>%-V_pI zGMI?1#)|_Rl%b>S#Yi-bcYD}RuPAbe_fge(pF9aKOHvqJIZ3knh#sr)(W@d6<*zV- zXFsx8HAwg3sE-SC%ULdCK&$iAga;o5-nn0EY=RCReoyS7@NHsp_K;VgdMoxxY%0+q z+}uX!dM>cDEkw;@<&K%Bg|++Gdoed1@Y(26#p>B*9UF&FpOgqEa}vi7L4doZ(&dVr zc@okjy;yR63v>RKJr@zxs0aJ-Tnv;lW5J`DZe70sjf|{<9h22jn&%WV76*H2`RLcW z1%?NHErLlAWhl4?98~HVSm%B<;l{=GuCxqe(D!}~ZK{CNamD{2y0j%H%IC$3i%>(< z!$k4rA#7lzlBeT*sT#=FinHl;$kC`3TN$|E6u8jo(4X=1>11xZa!$dSnj0yF@xzh# zna7G`Mn;D2s+m%^%T#Ho=Hf)VzGr%JEljsXzSWu@B)gs;M%z~L5k`~YM;+_p3^gnB zF^b!!BSHz~VvDXJU>-c^;8h&5n|2OISGpXuKz?v8l(;+|MMOrrL&Go>nX}qVC%v zTdI+f><3_P-TM^Ru!#x`0h78=S_tAq`NU+}~w4aAJ=P?D)9s<|x%v~Aw{5$P( zlq))@NhJ7#&Ce4vhz&*)3X7&(+|n_kDu{d2BL!B@I&!EHdxHr^77_x9$F)eSGHJ1^63XLay?`K1?#Vt3vdSUVZ~tpS3N;1O@BkMR?I@bKb00*{oTNE-!I_**e<0Ct z`nI4=F{&@^mn;eyzUOj?0KsJ&k&oCi)1m-I+4Em*d>_9 zo{f}qIJL_9+BU#PHxG$GpM*H-Zalv|QWh28ZF!#nK>9_PoW{3xUx`vz533bhMoT4NKFf{K;7r7NwOrTlHw!dRqy z!#iAe4PFU@lMpKD1g#A-5(e3zF;@~gR1D(i(jt{yX3lQ33$D#^&>U=#nZw!$xCRLQ z@=39uqVOAY+y2p1rI-RQvNq}ZH)^Q~7hHx4*Jez!z^BH06hwfu!hZg&Y34Ie7Bdas zcdLEZQcEh5vGJRjgS6|S>~B<|pWi%grS_40fJ8(5g?Fy2&1S~;5@A%exGhQKo#H)W zf6uT!Ac^o}nvB?p7b~sdJ~7%<>GiZW`R8V>F`f!>6HFXewG9s8P<_d&W&sK%)R)C3GHW+BN#`&BVd)L`OxK@Gsl8tt-;_iWbbFdVjNONc8;&X@W;2iGAb(aGPA9_%{ zks0JgH(2OQ>=RvQQcNhNy1zd^TMshpP8r2!8ZRl&Dx{;6uauBm#0o3qPj*vsR=3h( zzok{0=goB-UF4#|tXsUbk+)7}q|(=Lp}nQ=$lTvAVISz!47zwK-Yz(tpAn_2W*3{F zactnDvVKy6aS?w|3XKdl$mvi4Y`xe`AUxNSjPgIcIm3_s{=#vhEB|~Slet>!d;nfSOm=Ik2V~;T_R{`JA4TWIFVx`o3C3bV#l9`pSi~&!Si$iw z%&bKR`ig0ZF3`HIU%=O{Yl-Lrljx=JpfU?e$DnQ{=Z-bh zwkYM9gp}Q--o7<%!P?FH{4dye51WMjPX8?^!`}3^SXYXK=U>H-Ux=BEY*wRf{oIsE z4!RHre$5}lcOH!B|z5IhzLy^tQ9V zB>CBP|EknG{{u4)rbpei1sb6mvHnWhdMR~_)`pj7+1a#gSz&Z<)A@Ey`I6GyQdH4l z&-d5t>*wf-d~>)ud2-9Rig&JB6jgwhRMSM2W9o=bECNqXY8G2>lDxpvbD-+dJ;E$M z1C!>tx(V@&=k7$?>8ADC^Br}-j%&YuquWEJLElpBShJr1-E(ZfS6RNgKA8Zp{p0Vc zsrKQGoB6iAm-|k(X(K&M<`Ml%XnfR%XCoRM*$kY|I>i!e+J|J)Q%shJr#iF@1ZeiQ zo%RgnPYc_Q29KChbxr+~7|sdbq2&DU=-tAVkYp^rEW{E?9!U*##aBe^!ODhebs~5P z-*w%75}Ni}0p7abSqEm;LwE=hJ#&emRGJ5jC5pnGSzp^4Hi{P-uJs-iu5RRT-)A?3 zj}ZT&?g2`NFrIP0Oou`~Blea`{^?u7V2xVe(OFMf`dnFHF8S@5${iz9-#k?wlj_0O z5?W#?Wk0fzt8#^<@TO{0rnmmxrc8G|s{E?HxvQc^Z#}@KOn)7$wqb2es(b}dc!N(5 zBCr@;PnY`J#3mzrQmC-v%`3L@!mGBDWF-hris|exFT-;uBO$-2koL_~!v!`}mzhRX zTkb0A&JM0M=9)e-jC3?IbF3dpcMakhMQCZN40z-4T^IiLQ}CrJ_j`vJmI(Z-wYW$w z7(F=zaZ9{gguL5eP7(hNB(Y1o0dtO4tZ_sX6wRK-4V__LTTM2eY97nzI%QBxHqPLx zgctPQn8WG}Pp!t~4Ubr!$qpT=Nz4wdQIW|FEv1Q#I`G&iq}pf!Z2=gVZuB)SwZ%y} z8)EgvJFZR*QKxVEwPHZ;I{ghlrNg2sdomhW&WeztX^~k&Pfvq9B$&jSHyH%fVFe&5 ztruwGP|xFZpm5}&mNkw~9>UX?>BC+IQpjcBAd5YrSjSP6zq4UYu*1y!bmPTz*=076;3&JlK^9ei zJiwg}@Qh#b6i0YDBwAHwaDZFtSB`Khj2#pmSLt4{YTMQK+Mm+#MXq**zfgNKmXqKM zrsEi>N76(cnt$7s9n|REf<7z^{34M*$XXE)BEH5vRqPrqr$swRB}hl2RD)F+7igfa z7gJE_4IQ=wU%?qeF(asi@n`G_PystcRL%9|$Eh@ubjBZhF-cc3D@reD8<=cyPWEdK z>i$>RKvnPx?Vn7wZ|&F%)?&!wnGJ`DhC;$>IJb2IMj!*PP{6Islo`kLghhT9B%(?y zRvLcNGQK)4EBNCOEAfRbc-M>zFx0St!4-%SMUAK!ryola3@i)mEq-Sk--P0_HE5ww zZA*Jftc447p@1A7P=HFbv_x+coDMxZZG=}fK~yEDU_){us%1SESV1!;hYSC}@Bl^h z3Qxr97>kL_OYZ!PF)j2Qo3lK1F5iR~pE!*|_;3?95jB#J;&jG znnC?|G%<&}A@0agup=+K8oWjAhAP1_OJ+{mc8KPjBxYEER7}JUKql&)M3v(+$0Ohi zpK!{h+_j5T6-5$)iK8O3B_qAC>Z=aRXveCwLia;WlMwQuY&RkPN!LucQ8M?!N~*nQ zqmFQI$*2JqM;v-n-8Nkiki9Ow^3Bg6Kb9{=8M*`Xh2}n-dE@CF=p|fW6ZVVMrp5fi zxzZf{GG}HRJweMU8+E8E>7?#uM_4Q>40$!7=g^|VGKNJ72cC3idA`VudAfJIIKp3{ z_&wpLy`iIWYspXO@WS8bm$X5fOtbzvD0k3)SD8*|d0`z~L+F_h+BFg5e>f^++J0v? z6r<7_np-0=%f030&i&?d7z6E(DYhdB`v?j3O4mB)>UPRU z{m3;jH`^F`O$_(Cj`wIFMAj4A_NWzFkydWuq*IP zXmNKChI(bheEnlOhxBMyFPJ+*h2%tm;Dm|b!~qkk&j>lq4wFuW>50=HCd3Vibqa}< z4w;?I*l*to`MBT72E)roEn1M<8B5VGMENCDoQN7idKB%a3K8Q^Qk53;d{x~1IjnpN z-JfsvFgkI8|BR=i?$@OI=}81ZLIaWe6(W}sB9}noi!gn|7k|8FbmL0qeoc*^GiDIE zP1s+}e143h8KX#C)9*Mw`?Wp3h?%}!lEChqHzt#vMntiOQh)JFX&eNT5%2tzd!{!3 z;y7gIH%5(cRK_=IbIPMVgeZ}G#;Gv-jZOlbzd29jBQK5dgt9=L%DC){Q&F0wo@2qX z%&$TJBS`ZzU9*f@;R!+RiB9fGCGngibJsQTJc_NDo}(CXL*BiTdAZZ9Vr4__DWyge zJv#QxE-<}G2|R0WDv&iE!kB>UO%7*)2*#TkJ+VtQ{|WhEWtmkgu;I42_L>Nd7TP+~ zIzN5e=LoNwoxO*9b}~0;h}JB3GvYUnjg&9T*u2Zk?Tl+0ny~H2zW7EB#go?;Da*#3s!o z6f2n@N%DKLsCaF&zMGL|vz(QU=PNGOvXrA!%5o%aA-aZ62H3`63`e@%b|8LgXJ^~wJ#y<=&Rfe`2gDU zB+gI5?b03{)>wd?fI!7UQ;${ta6)seX!Kg*VG?{%lMo|-N!LZEWR-zPI9KfurZo@1 zq{JZOL*F^`VifTu5giwGNGUk|qLWX#GgR)j=3<5SEG_X77SbZhHOae3SUmsQUX zQ>BqIw0OTr?>S@--_}o+@?zb!#{>C$;A%M*(&c97I@o@hUSz8Q^}1S_Mb*$#ZnVSK z_$@Q&5q(uHhaFx?a)<70Cg|~eNld2^?)tkaDcDj(P)SnyT5Q?nd{oh@G z`ww?-roW5P(?_3#J<2gmf%f*$z07V1_;c|EkA~dJp{B(1sQAG0`&}<;K zh#*#_@)+FPci@%Ygqj*gtHv5~3c`b^TZMsWAcP(6aVlMf!i{{}b#WFkpdtA>aueJ& z99*w22tbXH*|lyU{f-qkkhL%8W%Q2Hi#9vYcHr$6iOZ_;4pA0~>)h&va1y0`3x7wz zjO)06x6dS~)*Z98PYj6kbS`@4$fepIiW+|N3VlZU&hi=A7TLEav`;~V{$mVoxa>Ll z8DNC|ceHKzyeQUu#*UwdCfJiJa4^sJ|d^%q-epHPju7dtHSW>^i&D2<*r6Ps*> zHu6+cT~bsIn=qO4PGW>?Mpe_fHIX@>mUrYy9)zdK*&s22<(tfS7m~>IUDai{DpDaM zznDQId1BIl9#tDL#e9;pL@q=5HK(fjn*}WmEk_DdWB{WGF=scn%N?9s>bK#idh{RR zB9LKtA;Rx$_ObM5-AJ?j91|EP11ZUIb+F=4p1W(38pHTb0=dB_;*q?Buy=xmCG<4? zs|paW;;va8A&{Jo=rP#@Lhy0lk(Pap`_9zk z5-u)7#z=$hz?faT6I`A{2QH*O2G`kRUAYT}w$QoTQ-I$CMWI8tUBw@o70_ksFkF+6 zR;tx+>O~zaT>Da^y>4s{Y}c=;cz?|A<->_S|H$c=yHtm2bxzP5rV+6uFb(JJ&jLV5 zF)_;Kpsw8vvw#)M*2)Kt_TpRAR6q=|xs!8>5d5smWFu-WRnBG5N#aY3-g5`QkM8|| zAy}iP;H_Hd_C3?(dk!xo3#F^BX#)FHGCNXT{BNZ_Qg(uOpXj#)bz9YEC^#7IFc*()dTmQsA0;vpIpIR+d033(g;Gx@U2@@Hi>LdK--uKG+X zEyZj$Cu-dop%o%F`>k~5_dL#+(p3dG$^NW6oFTj{D>M4##b;?Br9}w?=i2~R_oJa? z>~Ce7!Upl;1v)>W?u`pM@37L-Lrx)`XmQ1BUC`-{O^^z$sSB;WAVRT{Rcy~9Hlcq+ z^s%dM%Js+%I5lIBuy$+ZsK?)@D^hj5{BB_l%bz)Y*vhJ;QoJB7H!SPvTTW4{wPrqsGLM|@aezRmN7 zx5?ZzUo4;zAufw3mDcB6RZCLcf?D+w{ zdu--YSX`rI?;(kyWL5-zqxR$4)aMgvaM$xjOSP_#d=quUV+bzW^*!cuQm%{ch%qQR zA4bnQ^_vcpZI#CjHNtgZ#3b7EH`+_}^Lm|*G?#FpQcewo7j8XBM7cibn|=ZFdL7&2 z1J8`Go~K8Uy((>qb@acYv%VoQYr?EsI|@_6p4=?2?HLE)>8uqxsQjQWyLj(vGGb7*6yXRztuJyt}>>rxR%gEQTS3;*&1pr zPusUF9|RPB0U^A(aJBWSO>4RiPU6k1uh?}oe;aqSx2Oztkt2G+d-r_S2F&l0^J0{UCSDsKT;SC*alpbIuzN+c0m(o?;BziZlE_qdeYn_WKSM&_>Pu*Ku zY6z4XJfk5VrYzEc1?`qj+uvdYHf6!?!DUT7wH0j~rPiFbLP;9^s$092a>5)DR4n43 zusrywm=3f_Z30X#^4d8gm1PVRV@R`qDBf%P^OT|?!<&QO3TFUd!5I~x`MMRUY;N!qK=RmQ<%1Z85`g+hr4sgnpbql5JLbW8k3g>MQp!7zma%DIGV|%Zu+DG)IB-Y)&vsA$fqilq@nt>7bTR@O^|ian~zU`Pj~?(GcTT z^0x<^mM=I7PVfe$8M-+SKvEtvT}~v4Ru$rCYsM!b?eI?CD6}W1d$#w9GCV@qjtj_$ zcF{zX@e}1wXGnOp-UN#18_5!hY(C`}6J=4(mpV3(V|ngQXJYi9q-c#y@(OE%f<9IO z`I(4?vP>UDZ&jHI{`Xj`fSaJ`M=}c8Ma=d1I=*;c=(9i60p6VA$u=nOlEbK09~^Rr zxD1IVrtRY!3Cat%^J(izm=AC?G4FZdSQ>xB(=i3+CnOY!k#K&%hfuAO=9QoZLNOMT zVB}caqCKD&QkFH1`TO8T;N3DLbjwujgzw)ZpZX)d|IB?sci3;JV)YJl`1yHOw}-4C z>ZqsV`0?Lb4%^?rG+aV{`QiZcX5#AR0yK4#(@^=3{=+ev z8_Jksc%P+AZWY+Y_XdrHT1QViB8vrE6N2Yg~(@*zun@+9gc@+ z)6HpWz#h)C`pN-Cs6A~Yn3072k$Wk~N&z(Z&d@+d-#d4aLWN1+qr7dfgxHFc^-Goj zwsmqBe)a-1xIx{bd@3W)@DKtl_QLDc%k!Ct&p=+G{pjyra4Fbu7Yu#-%{KLlt^t8a3N!5c?6-fat@7{e5h7h`e=j(Iw;tatV3kC2z`~%J68fV zP>?k@Thh**MUhf^z+8FWrLSHW)WTkDOuS9(W@P1eJljap>6=>Ab4_;~rx) zI_BOgtFtq#?on^&l%3GWKk1GtG$`1{Ic#u}L0yoW zIfB`sJtFIX>Ll*#90qY|AJlCmInSI-dO$N>*C?Lu7IfT0 zJN$5B&D3v(vfs94boUs{Nh99^6!bEmH#=-aToTeK^nj^Q!cbtagdqrL`L;l!GPYs1gJNvO~%V{Km(4gJ@SJ zbj0Qftg8oMW;3G1n*+7c7l{8FIZ{Lyi$4DtZw}o5+%x09M9zPD_}AeRNMTn5U!GF&IiP9vg_+U^DlyEITD2c3c5jCgn&yNR)c010iPy>VLr z)WniMto=ZpGibh$!i(;nUXXSJJ1zdM(5PkW&11LxiMf2jQhA)U(Mmy>l&{teI#?Gi z2o9;17?d4ywr|njVF}lF|5f`5D)+)T%#t6+8x-7U=j<)S=vsH3Xq=JljDMUY#GfiT zgy6U5O!iQrT(P;8`6dciK@!gu2P|drY)G1w3I=x8nS;dYj`q)lUW^%g%I`bf{Ls(a z<*ZASzfp|n903pIK`mx?9b5IT32vLbYA=Jh;afTnMfsDCyytT$ZpR{3)fv3e6x0p{ z`3J2L0=yGW9xC1oYMc$xi4oYFTnVF$5|tY}K~}4^8u~|Bg1d#28*;|!(ZTNa4JrCb zffTLBMM@?a?O|G=k5o*(gz`J3%2B;<1-8_aI@%~24SHLt^1Z6H?s)BHp|kJfHM-ai zYu{o*@D=z;Vgk@uEcL78DVbzuLQ-?E=oH4FFi{%{4iX~9bij8ZWF26B3*Jqo7%G^% zjAoB#ART0)PW8L1euCSRfbNZks-ljYXfT=GfJdHu$K$B;*T z_@M$bmN-0I;llbKKQ&8Dx0sWt5ZSNem+pn@v4YL4nvraX6()Yu(rA1jsx_UerH8x{ z=KttiHRhE!;>*PU6?|r2ul?A7I%Y)_IUw+yDcvO1kEJ|}$e2x;y8cco#6$2a=F#>t z%ihG8?*V1qF@5G8xh6R`YL5pm`wdD0AUXGA_B~ibK-TWk*vpg(etwM9^ ziCA`k#kqdR=>%&@HwyIP4Z~l^pwy(GEU~Wip4TQMv!-qpkog7?T#vwLqNmXP-;Vv> zWqt7u_&1a|%KyUutX&cNApK5%R`HMRR=0Lcl zzDQKpNV(3vzVY38ixvJ|*4O)iB8m}4Zr7>>q-vcy##!5>&ziAu+vCP=t7@kRVr>m| zF1z&9+;iE)29b$$4#`dlV+JCUartOIR-RS`MdScCiGg`FqmYkP^_r{8k^ILyg@Rz<(mGCK}TrxB-(c&ku=yL z>>wJfY5Of}06`4j>@@fHsSGZ}L6;I!tDjZ!@?stJu-J^&SI!})JlS2Li|MVz^X>Bl zoWvXFxT!KF@^!Orrd67PBMoQk0xKF?3c9II+-AsN?Ao9x3uD=+3s;L34kjKPEA*;L z|MC0R5X;htmX&738ylF7gQkVtYvoGHo7XGAFsy)twymC$g5AWECsNta>5L2Yx=mTk zrN*Epk51gZqUKo;?>2x!lvHD$b3dZ4bcEj^0hSMZX_!wT27&{sMmR_GiIjeGqC8L?D5WAW2 z_Q^|_FIiVuQnB&E_odv?=DZxKLS*KpV1v0cVP^`c&4E_YDNUO!UUQ%3uL*0T#f?Q^IEzv62Qa3_Yzw&4?zpNwiy4G-oLPu~tl%_bKO z51M$$b#-fdxo~Mc;u#vye?gp)n?jv^?o)8`K3js8 z2P!i0y#&ywld|9xXIg7?i@-W~Ok3vSqXNG+Wv81G~MtQ*mK z@6DtL+rhrPz>vwO{1#onIL`{YA5LTo!DuO9(MlnG_0ScoO;h46A znh@4$5cTQ@+SE^6=^kVfl{!Qc{luI7n7CbHeox_`E5RgpeN)U&q}l3ff5%&zF@^Ue z5!2#ik3Am-CKH23)gBqS19y3kC2gO%VmoA5Z{DzvFvC;#c#j<&cmrW5tZaB=Vc;5W zDQya)V)rj+By@NqbsL{ zj^0t(7;UVu$o>|Q-vsC1p)X-&)EZ6nnh-@4={Q3pzu`X#t&XLQCr;RLbA;eyzF0;A&q~> z)oOghNs#XfSVFC@fq|jFgfdpV3`0Ozkc=PxoMYT5h-Pdu^Gsa_&x^dO{9TpAB<&Al z-!`l#<1A=TQo0_?aJ}x~czBzQGx|c$niPHj#L%uUp-7VicoWCDW8v)&dhT2;;i+@c zb+ldR^v?Q6_U#Ak(z53w(k*d-TEstkxEdA562~kwyv0ehQEf-KgIh01oI!4evfJ>m z#Mdp=u@dM-*XyZ^t%B&UN%^HdLD2V4wPP>+_ph5A_TYo#+>&SIuS8VEd4y?NR3EWc zI>F(WL4pzsHyt!^TeY(lnjYiv^>zZcjBm*X=k!Xi9=m7{eF2$C+>lh+vW%fHL(O~$t6n9O$R-9Eg{HKT5I;+#l z6+!rcDUN`EZTQ)Z5(bMu?OQupfa<+Ua3jkW=A<1CGapqa=xR`0`&=Y0FP!7SszGd) zKK53>Fb@UlF@4-dtOx)#K+3;{Qhp=j5`VP~zJUlRekgPL9CBfnGRj-rfN@7zj~J{Y zegW$seG2Wc$1P-lY}+o8pt{F&1`>!-FMTIg5JC5q&^zL=GO}zI#=M_OPIay|-(|j* z(u2KD8dNtkkEg1EGqX+BFFTbUZkKcadCPYGg1(#=UR{M1m1MMp@#DW$LsUv6`9l9x zLu>!!QjGr_?Ya5#qVrB%bAxMPm5BKfPfE_d{R$x zD@j2BR0O<|Kff}=QFP|(knFx4G!$=H=>xht9L1cI*q9XY5a7u?ZuW2yP%Szc9zWPO zIY%-j%%1kE*naZGY{oM*TLqgv^w}Sl>1x^qbX*9x!8Kit5>CocVtIx_HC`S|4+Mi>jYVwE^rOk zBc3f~4a!WM83~*~#r&b^SGIgoLWRwkv4eGuM#Bx9vycN?tr2H^p;HKOkEm`jVCHbs zQj$4R6l{G?WFa~`YghD{q3goQ!-`z-7vMYBo&Yp|HP1)*1uN|oTF`~Do&7cNBpi8> zYpx=@=ybt(xu44b%w}T@u!cHl2kug{)1NaDx8W;)8m8f4Xc5aq<*L}JjZw`cB?i9u~TNvrPfk;;zs`6^lD14L83EQwyt~)w zWq+!5qO6+%|21aAq>Q^KcF*!4S`bu|z!f18hv1g0Jz}VMsXFps2+8gRF2|ZVpXE-g z7S}P>*IB1IB~%*QZdT=?P&=Mi<2N5}R?bhDgAp<4Uv_ zhq8+OP)>T<`)??jj~QMQ_J1sZ4*Gw-#rU7Y@LyX28ixNCd_s%NTaApV-$XTqZRl2U z?8TOFqa%J&a)ZJONqf)`DwwLsnAL7e1_}!0jl@Z$&Cp?Uo*niFg}?{%WNE>6oxd44cq`-G z&q-zgHN%!Lf>eGWd~KQ&)SN%cy=5V3JD7%_ z{I`4(ouxh4vv&e1r{T!-JI}jSP_-cn^ttdxN{ zg-R(-do0+kcF$dwV67^) zfJLxqDLB0O*M@&$a$s{qY#4Xxt!$PxXbp%AOy^~2+u%Q}HPInTO%NeYIbzVAUt&!L zVa)!*lmODcY!;U=KSmDN!8KmHRg8TLt4b3D6>@{TA_DY5+LcE&)YY{`r~P5wGu(S+#Ls!j zzPF-i&(zWyLC>VMjyl)tO}@92n}0Hm<6FTX;=v0+o$H3atRpLQ zS`MNm9z9}KpTo+OL2cF%f%m@D7`rWDDb}QeK=3x)ym7i9Y|r4-FB@eSSIaoiZ=!Ww za|@yhy|KhoDv8>#nBuf4HRO`d#qvmz52JHjYbMs8`+^u-jj19s&_G7w$GKA+qcSK>jq@%ZpJWxO;e2wnE#z$(=vrZRJVrR$Vp?sW7pb zWW!)n1PtA6kL(@hv2)Y<^A}+by|h;4lZ7wN|K_|cvO%X1ljOl_?Ke^}mTX8j?YVR< zP{1wht~Kf@^_i!O2%NO5FA%y>1wTGi(7J>du1MMtO{WC6w zgR+e1&_uIWoF5lE6-OAtzpALhMDN2$zo(;${!Uk6Erpi86{Dh#q$5yHos_rW*g;#B z`Rf@XOjZgoSrDf9jk#B2C+PC?^oH3!d-7+Ri66FtWop9)Hab*0Pw%i zV94&*4KXJ!M3nvlG*~@E3$6v>n%_dXZ2~``oqv86l?-2~`9o(LJp=Fm-Z&|qSw z8Cp3`QAYGm4PouEX|qhL`XV$)$uTWsjbay435X)iJD`II@haiU(xt00S2*qSFHH8K zS=k6mp@{yB2cBvn`z<~~sW3H*5WPx&DxW^ryg~lgsjAHUD)jg#j!FMX;6(qIQ}>N@e9$^ED0$u-T+*U#m(D^HaEvuQ{p83&#_s-BHH2 zqat+7qd$Jfo^vS5=5)ise@du2(vxXV&n=g!tM;~ym;^fLots{!7Y+G34{@hi&?sGC zKfEp5X=g*o@s%9jZZ_wN)Gh~D%sg0=??1@ufJIO99-W2ad12w3maXYxlFl<3dTmx< z#Ys$p=xRjZt63^>JzZKieY^V1u^NvaB%3YFGY|RJ6YgH}+(|s_K626K=0(p8&lxiy z*D5rI{!O;=T|Q0lKv@BrpM>=%a2`*7arvpdW70bU2$cOvX4vC2WQx9yBT;(Z;-?_k zRMe{Sn=CQ`QrC>N@BoMt$NKB`@$bej*5CRI;1*1bz*=G1N_ruc>oImVELfjOq6JUm zC0s$?*bk3c{9}-MEYJd8Br#bZXRWD39YN!1E~Q8Z5GgR9NPyoZfY#rI^2+PNHBN$dvc9Z@@9EeW`w@-$)J z5l%5PGaNF@c7O!`#Xop4GTH3^#XHKhnaY-Gju81;Kr=d3i(|d?j zN~N1z{2NB^=GTr}gI-t<50?JbP>_$1%y;xR$#d+d%%>Z7{YFVRWn&T~HwRe=q`UTT z2F{al`FMb7vI)rI>l5aG)%4y}!gKIHnNT^x|4%{ue{1?*!K($-Ae6!j;6^ZT5rUA2 zQY}y~u*VRWkgA6KCIQby07*s1-C{482vgg$IWiTRI)4}Tymc2vYGn(Qws3ndbmKDyM7aXyKHLv@%Q1v@k?zm99n;4B#<(+g*>pB$h zWb{p=T8B(0EV0A1t27m$`N+#X=j#D~aE8Ro^}X6UZmEM=#7gjA7eON&E%!K{F0ZL_ zxyI|v=f|bjcqW@pubYO!Hb&M{ozrbknPmP0CgU=_lP~(Sd9>98i68#-`EcVdC!Xe$xAf|HjzEh+4ozC!x~Psznt7 zCFvmEW;c}|tk;mkKJ=p6zKE#Bf|WS;;cP!r4P+{Xzg><+0ieEcLO{tU6m8 zFSrA@vzf0N$Z<{@U%SLb!WK7~mRk`*KroCpw7a&j9=gG?QlJTCA`4`8J-lLuuNo@` zL(wC|GCL}STH2Z$7|3^gKVZX?a{lU)OGNDL|3!*$IM-d+;l&4+hNnWodvwkPruxoR zY140#>&&Cz78+)|2g#WRfNOna-wKk^R%9sx53jjO?(49v|AxA4;=!0^=f?j(jJ*SU zE?kqg8E40~ZQHhOTX*baXUDc}+u5;g+qR8)x~F^Q>-XrH?%z=7s;X7%T6GzDdHS?b zib^imDMCKs6N#-UjOypdx(LP&t2Nvoz9{bya0O5>KS6IxKBD=|90k}cLQs+2{#g%I z-A8(tBqF+xT1h2}`b9{m6e1;qdLPFYO!-tW8M_$C>uk$*57VgfQH+TIF$PAvr7VyQ~pBgB$54ln`Z@xY0N8b_hF zlg>k;-c*=5W$hXVxz|Ox$2Cri|7+nG$bQ)8oggG`vg?~s>x^2gZ##ML^;b%!_EFUo zyqbSw@&g#au70hORmP>WvlMIscJK5vCsKC#>jYlj<1i$c$ULL?-4r?%zD69!XTAU1 zw(*dbe^3H>nD&_LLss_$BC6C0mh^&gI41un_BN!w4ZKwSi+&?)5A7nt0s4jupGET-hm-bk*CGPAUmXIWVp+Gz@0+Q)Dq#_zUB|cG+~4 z&N&#MKtP@l|NZ_`QF~ikBPVquC#(N=KTY(1><%xX+j7(Ti%L0;2ToV4d|N|EU5wVG zi~I}Bmr;hN_uQ>D9S|S%>i#$cDOW_A@e2Cyo5Pi%7tcj3rn8*8AF?-||J{U2)=*9C zS3TjnqY6F>^?sTvQ?L#-;2bX{WB#7-Pw4%fBw4Qu5DPG`I%DN7RNy$m zeEJS>VCwIN~lduLg|(0Bsk2aa?0ZiV${6vMYiS7|~3E1mQ% z1H2X*E0+bMw@E}FbB-<7P-9g@QCx6%r;D?}^59T#50cc9Rvt0n;E~w+yJW=<{4;;| zr{OVRbK*tdtZ1z;`zS#_@{F(wvDFV@V5dZqeKE1QOffBaVM6*I;4gSnIb1_2xy>Vn?m;K*+lu3zPmu1< z7^Qan!oJ0LUFMDBP!l?YT62FJxh$wMBsPiR>$mF^ju_6}k$4o;lX&#B&(hFON>~I; zdxFJ_!YH2-O(|l9=syD2kXohDND(7QePQP5%+toTE;dD{?neF&Oua5a{w(FK_~+8+ zH5N@k|DkcvY81zb6|#lQ+ZJK-Sm0WX+91h2#{W;6SY`srH-w^Q@|3nDrz)CL>Mv$c z6Yja_K2NYRvkZ>f^J24&K~8NEC9`b`N|83y8kQio{tDVdnQv*B@=j^ufAWHJEzmxJ z6Qy2cYA>ET`0#;$Ylk>1Cm#6*eJg=aAUf|J{#W@VgK8*+^*;wI6A}mr>%To%F8}E- zs-?1^i24oCX~!y7JrCfCXew5A5E)7a2|(2~OzVTp7PKcyAkQXcyp_TI1nqv!W6@SM z*VX@0ia9CDR+K5-7jcrG?%Ltn(Yl_h-7)9^J{_?|h0={C46*rapUxE_+T{Ghz6pDv zo)k4ev>8JjP}%7b+T3BZY2uknhaik;lzz}vNEB6%i?Ek3IIC1`cJ?c45`&IPrlOg; z`ZB?4>~d9nEup14eYozApBeyq@S%3mm94UJ*vW0Vp4B8hC7_i}#Q7Q;mR#p;6-I6f z2F%G^2)gNnO=P+%8NHaTl>R(HBweP0zg8RDZzT%YLaY%S*?T`K1D=WNGeOzYaAr(d zO9PKfuEy0rp1di_b&5GUfi-JS^{YZ9(ER7V?@h);Z&y`D0R%}8JzIPA;o}|$Z$mS| zEEL)_l#vLr5Z0-}2pii>0H96gKW$o}wMLSWy@G31jyjPm%SU0r0Hd7Z+-{{2AQ&F=CE*FGm)&)s3uMX>@h;VMU&Yp@pX`^+eBLhdy%3K{=U>{pMal07`~%^kjLpc?rg^FvU%LT~ZeYEl^Xbc@c{IlzY@_ z#u;axFj`xZaV8p0MSo-gNd|L~f&h^lK4>9~+ex@e)joYqZUwfHRH=LIw)6TgJ<#9X z@C47dsi*GhLo@R;kt))cge|-3#419N4{PF`@skhj*rdD`P^RV2{YwyK1e?J^vAYY{ zefn0LXjLA7UHsZK*2v(_W%)eJGzY7Xg7c^-$p`oE5((J-0=~ON)OW0hA^ewAv zf7CV8eOWxmuN=?)e!XgCu`r+Jay}OLr$m1A`{DZ`_sTL&hmy6;MRNP7uyc&UWb>o$ia_isjiFFY7=hws>p%aLwWy=P}m8gOT zXbO<24kH-}m!exf7X=3aZOYjmbLNbOxti9_33WTJ$xAL3!`QI95~49*aY)VU?PP5U zQRj+xD4T*GI!1lgk0uk9`8dt9jzzI^Era1uY=xvq3_O&HxkgM_`F1m*E)*_9H5 z$7dk~ZazD1L`NaVMH;E}9U1uCdAuO&>{uvp<7E+>>!J;f2|Z3c(^sqdedqwOyG~Q^ zAMU6|%YGskvDxrpq?(Zg$y14yPwTqOuE*{uk2@>q2m?G@?V zaAzpsgPwlqU=e2HlTebV#Cq`HvznxpaCIIg9%H8aE%4x^r)tZFtLF$q&cUrp81elA z{WptK)zYy=O1c}%IE$C1P#)swXCDdjg3WFyi;~TiL8nU&NBERJVzOr z$Z&bxih~z&{y{eKZy@8}lZx~a6p}}jcz&#RNbu*ciQxhVCMZHpa3uN)KGkh);XS*x zUuWJ!6@}rVW%w0r!v429ZL`m+sSudP z7%~QqRa2>>oYOEkW1naEBwNv>jzoF@#sWI&^*k$OIevY`{U&`(@-nl=#VCVV#Z)R! zJd;=_>I?_xLKkayA>;+x&Jl8aO&)6+3Ha;?p91zbZ~4@t)Zu~uXuibW z^kx#TTT&?fY4qCcc_(sn(gwCpb=cDACv~%_syH!g{fnNWJIikr3gLEM|az{jn%bK+~92)vwm(g@X!XHX560?M@%Dul@Flb#N<(a$PfU9@=!*6h`SY zBz(44U{J@+5?_(r=lO+N+1eU9cdD~qv(pZ@TYLqHfu{1?=H^Jky%wL#$_lZ zu2L&U3-23RzYPoMH9?UO`toBfaCMqqsHl7eF8fm>J}$dfW{_#PlhE`rwr5p(IAnMIk3LAVu1Enuky8nmSBHLbPCObXo>f$LXdD+u~)+2@iI* z;a59Y_T3%oON~cI{;hGeL$-LUju))Y(sr$>%BqL_d%@&93^+`&;WC-v^<0O41s~_l z+@qRFJAK)Vtm3uXhmUeMVqqnkb4hmD3v;rgxKDAmDsWT6xbI*xviWO4K~6W5o^?WX zHXPqE-i#H&Wf37PK7e_+5aY-h?6HU#uXQ<7`eU;?&L6W$yZo7V#jOx0^)WJg?i1ud z+OHd_Xf*O%GL@(XHEwVL={>!eRMH3WI72;W!D2oYUSjy^;?pQ`fl8#iVFrv23MK9m z1%HF;qQQ`g{?u!mdUhUV4UyT$m@`_#rwk3Fv#DThpM{zjF=0ZfPk=K|TZuS1E z-Z9m6Ka&~OZ~YisdNk5h-tnJ(rz5|u+xVT z8>I^xakCsc=MP15?(>H4Zu^Hv83qsD87+mM1%OE^jzde7m}eU^{hpPZwJ?(VDBi6b zwbnwIQd*r0zNWX?@2RvD)4vRGk%SZSS>wL#OsyyURIgLKT`;*a0RrBH^tlRo>CW27 zc`g7+63*J#Jc{hR684>-3jcXDD)%gT>ySm2a)+WnS=j<%BJUS6?IuFwcvQX?kINd# z%S4kL?T>Xm89w6k6`24pVaD=m8Wi9$6hudFaQ**$m0v7Ip+FAS84tYj==b6)vM&{jXlU4L$0et>~%em3So4s zBrSVXcc?k&-gi-)VHQKBs}mbPot20mx)i%&E4rPB=Ytb9%^pLpp!%*?0~a+bw-5>s zB^RKbN9Z1z6rLm5(e7&2Tz~GG98njFr`$iDQC$h8=GsZknAi-+3GnLKrS?SU`dGc8 zT(o;IQxBl;@nofED@d2p3!cfS))UGp8R#-=kn4zA!kyJXmaU9xq%y z^~Nk_ipxCCCtP9&QkR_5uBL}HRILe4rU$islFw=>n4sU%Gt1=9%Z142`$aoPIZuV7 zVTZJ_xP1Ch2E^`ut!IocVoBffffr(FB#h5~TFcwkAqrQ^euzreI69fpT7z_xAGu}RuY1o z+Et_4y&@AK5SIgs56wFrE1Ki=+en45<&Z;)P%jm~`nm;8{jG5!ty(4os;dPlP?-fpP=A$FcU8&33CZV_`N|=&RULsctFXgJR33^`p94}zU;zl1=x0>J0 zT@CDr(Z^2?4J4HJV74Rq@U`;MsUz53D8YMY-wFnZ9xmh3*`0s)oJ{oA;wPy&bgevo z7zYeg16HWQe=)y@JX#C=Fu%{g>j&kslCKJkEb~1Vaw~uSQliBpRHh{$Y$pI=p*?^F z>o!U###*<^8WB64>I#~Onm5~Sh^g17?Up!1tUu9Cg=cChhWlMWfVg6=HL^|AweC)B z@H{}Q5q|>Wi7M>t^U8J&^*ZhQWjLrXjC)5g#2}7)H~a-JH5K%U;a$|^3a&+-Dj0mH zRl|zbg0yG7Kx@%|-q_a5J;X^e+5az68y5AIPQib`6#QR+$^0J^Srt9|f74ll!sr-o z5VvU4Emf5HG;NhI@aM_F&IN&OkjHgn5}>Eemrqn-LCk++6Zlq#51s}J^b(kLHpaCN z1-T?_2qS|#^RkUJ!sZlO7Md2?7WO+>9KHp+&319# zC#{@hRDvRdhS(lV;&@&w!tB_E`PVQPWnd`hI?-{%VxeHbKG`ghob-PThwpdZl*j7+ z&3F-b%Q*(vRCL0$Z&Lgz;ztYYrymes>_VZu?v5wP2U$CrH=WK+gU!4bX>H0qgBo3QzCNwfjOn-O?UVtjs_XKupk-CZm`tT^@#^go*$@H~X} zR+VfSd18|c!5D(F*-7MUEl-Z?vOW{PY9x&wcKBq-AtEwO&1I?M9yqt1Ka*UED3% z?@`Afjh4SRFcG%0GD+)1{uxIa+*^jdh~uWY^XsU<16{JsQy-gke-~KK{Vlkrx-LmI z2)Xq#A^SNovDoHqPz+8*VT;Clc43`;0WXqQ%YH~=)HAYkaI`CTY@5VA*U!8vmpTo* zucBCD>Cz*}5!}R@i-xC^Mmi&CRi|yycyJxu*M`CJHr52~KCqcwgJqsXm=4m-Wyo6lEaT;McWTIoS@y#&70Kx=s(3FXu zkoyE)a7XPED}==vO>&)7_B&DsB&U6bz5B3yLHjp3D83)iH#3m(sCZU_Ln+hDZDl#; z7wB=Fp!=IV>M}HbVsetww255fZgmf)V>v;x?b@)4ojAoF6FokhW67L{C@0AaYIQ1& zB;u7i@l)4`3e+`1968QhjBkO_8-!4Q0bwA93tW_Q0Hh%u?r>&kW=(V=s~>PY)lz-Lft zS<3JhsNQ)kd58vVzXE4G7an8V?1MVjoF?ONIvnrEVd3??Z~it8$E}^U?*Sv&MH1oR zuL?Q(8#Vm29ldRq{l(jO*(7%t;ZD+T)#KSTT%{&+gC8sC9Eqz?9*?Wsp!Zti*Q^RvuR(XfI+cIMxK!fl zbfT^2;81$VFZs%Y(5Ie?Q)KZlUT!~{FBxy z&$-}R!AeyYQS;~fR1N(Oksj=fyAPUuBkk9P<9&AcPKNAlC=JC#@K;!M`_#ZIvB@1I z22e}Ts;o3eV3@}hQ7Z6kJpL4fU?Jffr_d&pvD|U>{A>&p>4gaOsCG9hiE5B)Ou~xA z8WH=$L78czBLwX4gLrzgtTl`Ua=p-&ob8my1EWb6u~Nx;!tYc4nwxPuD|57748Xh~t46NY@>e@E674^MF)Tz{eeG$%lr?>E$nAa^NRTmJ zT}m^~F)Y53{0W#Jpv38&enOi12|bl%Ha17BcYq>(s)T}|T?m4Bla>XqjehJ9d5W6Q$9z>*jZz|WJ)s>AybWo!x{cUyUOGjeR1 z{DWkP!vM2LmDhd<9MU>Ec=cKhUJXl818AX>H|!joy#eDOO$&|N`c%fPyXO?qgyv9V zTjPkY&N-in>ij?X^lsBNxM%N{5YaRpKZ&wS7>tc))wZP{B}9__C1KkYiMh(0CiFAy z-?dI`k9Mv4)7c}?VvR?)ifJ8uMwzeNK^R=f6bVNJd#XJQ0WBh@&Obp#_T3GlG);UQ zvvrbQOEw=Vs|{vD;m)o}ru3kWv{;M|Y6GC46CPzoOTC=ru)O^ypbCo1b>_QN{X$0kPA{S9eX@>}NwSipYG}aZG8G7F@6S6yNAuR$V(dIWM5&OMd16`vLp6s{H3w-eiAw2R9?HAkdH*eT z!AQKv2w*K?l%u3-5FcX}xwnOMhv%@uBcTepPA=X#fL>MjuMAVf{kc*E1_F`;`JWkP z|Bt(pqJly{Bd#wVj)J6y)3+91?3Hj#4IbrZ&|*Kn4_4&nO_ zTh`t4J_6A})(*#A2|fd;E(S>!yoexRST+Uen$1xKWcf))4%Mt!pQrw0l)(rd4kubw zS_$0}3XD|PM&!zCwuE^yz!8DV!0#wxnSS1_$Ga{A8VM2LaF(X)xANU#e4tA z*=QvmK~V?UG(uD%&hONRJPBW-x%C9y{H^2Tp$)=bnj4+MWS=Ds7S9ZlR&6~_pLY5k zel;SD&py-m)#K1EYH3Je;9f7?EZrGjTJ;I^Ujwp5-rqF)Pe4xp7Xjh;kANu4*`qKa z`fl604X~4v6)W-!r^bqCi?(vWi|G~+SEKgjt0A5PbK%(Atgen;G<~ssA!Jc2-H{Oy zJxLG^Zy;0q_a^Yo6sB|75A%QB?VsUmns;$$j222LFZ!@Oby6( zHY(E)*PaYDZIWc7wUb6z$|%T@=SWdleGBI|bNJ+PAQkl0?K%*>4Ix?jHR$C zUjeFM>tne2B6Rrel%MmG@1hJ(YDUD#<{XZ@Mu-Z*4rY)#$8Ua^Ra6* zyw0*M8KzhTs!Vqkx^@^&%~-lPzH>d^Q$-OtDj(2Yfg_3q6wmBF!Tu`{dCZ^^k^i=C z1?<1K`u#tF__x0r;`UBxtn`Io}Wza#tYc-#ORZup^P5C1M_+H&G1aHFF}6R&GH3Cq)Q2(AA8$Uion+l) z@d*6>{RVA_%8@8Zv;ZAbh1`P7MHV6#MZRZ98}3M^EX|pwcpSt`A**X6ACn=o`0wrf*T&FTnKOz4x_C_yyV;7XBd zI?zHE?XX>!5ypu-Y1}cZI#0$7OGv5Fr1o@;*y0*!1LUwc#RTG}@$5I?d}?XC98M)` zGDP{SB9Mz+EixcH>pF=d_f*}&g><%xlHVmT*1{Glmc`8Y@P%hgt?tG=d$3WDsw)5R zWN^n;*uwCoHO+>&!QgRP5km2?G$PYG9K#0aKg8dsd`;*J-4JHCO(UI)&02k3JB1kO5 zc#c?Z?liu{12$qI0h^WKEGFW}d8f}NZOj+6$HFgwU3SMiY9T+d{AQraD2_Ie)`WnL z%_T9JkfuI%8C&)M6xLT^hbKruh2~a+@y$l_6YltRG`-9@1aH%Ao!MuVA#<(P$f!+V| z_0(a|?`G(qMCS(j-wWmcPp<#%o!;5O=s$(x(TPe5i-L$FKN~zPn_4vv=S0K~l*0#v zSvT0i0odUf`q%v*%IJWn^#nVjI}{>d6u7)_gwBN9{IJGMr)|*krnBoymt&5fY(TC3 zw=RfgUnDbUP6}hd8FP-&ux2CuvF;+4xC++wix@SQ`9_EKxZ){;aw}k~8eraOv}>h6 z22+b=9zqhRIkEh4s(8i;ZI+~LSpL8!?aizPOxC3qFRg)f9=%yLL>IE})hQzU*%EPh zEYwEls$u&wreZhZe`*g^J<08i9*s-gLM5Dj8Tm(dTO3uYYa2s~_-v`NGXf@%SGhBT zfxd@D{5_B_-3_w3iUa*;Wzva)f7bsqZ&H0YG@{xEJ+wbC)DwX$NssqMai9niqY#$i zrkUhD%{}>slKD^~{t*)zj>MZAGSrisGAkxdgaeJD(i+v@4aOPm^o~*d0$S_F7I%o% zFOV&jewQ`%cfN!FzQV+;Qy6|2~au|#DB6}<3BVo{ZBNw+8LWU{Y#!pR-OPX2%_?tWICG2 zDue9J-BbF`c4nB$A!SBLqXDB=Q}+Q9B_3K*4d%x=Fe7Gu}NoHy}4zgK6TeowhLDm&dY2GzIVwYuP!@yD&slRMNrcaojGI*>_7rju6`?6NnEU(-&9j} z3+9fi*oIH85`crqfex&JEf|7oLZ^>?@24;{(tVv+?zWYvEM9>fz6J(`nc0!nwn#e< z)2HAH)1tLwC$=KiUYrS48s@5$ksltws{)F*0V&9t5IyM#xYOIrC`gLJ6zAN{09mWEIhP z@=aZih5!mqHH$8GfndB;ye9;IkezRkSxy=S3O7XE8&2CNCfhflXkdsJkO(ir5{1gf z7^t;x@!q0>7i+B7>(XyS5u`%!eea-ma&xc-n9r1Fbzo?DQOeuO&j<$B9htQMmz^y! zp^VOaKtLAJKtM$Q|9Ji1I8FJw`{0N@zh*XQYw3@~;87@5h-4fjKm_Hn&L8Y@c5xDc z4W-zTwV0A}1#f%vSR;F}T@eWPP;JQoj>~fCdtsuns>}2Xyt2gMrZVB}G z@Lx_&Pj`Ag951C)JnSnd@WKHVHsfRM?i;rTB z!%YNJd*$MEnC*W z(ARr>=*67NZHF601sx)+fSV2yR}#bvJ>4&pO(P7MH^H1@(#0S-H7lZrc4d;r5NoG= z?qyXfh*U<9)tEplS>DRZOs&Dr&j-{&k!Pm_%8e&oa_ znq86ID_q$IFok=`m84R&r%A8M6++36{*f7S@tVwANmtDb1|x588?^Px7K#0f?=xB0 z!i?~dnN}O=blxL~frej(1anp&rj5Q}0>zgyZ-ND^1DF4kvwfo~QJ(^+p7#AE~j>ig)}+r_$cSZDJT zA%a9TF{1GuE5ZsMsUv(v2%Qqwz~G_M>Fm6?l(r>28nct!+yr0F>5+ z3B2~U#P`i)s%!L@ys$9uGe?3aK*`A0qsO0h{Gt(&M~^h|&jkF~*#o86RVw_#b$YMM z=iUutgr^OeS~|eoxxfA3!Q#AlEX8SkEa`z1$Tw>I4YVGw9K(mJV=w4UL?EC$ZkP7} zeMb3>rqv^6Tm;~lmd9TkiQ#fr0LhQU;JIsZX9MB{_vDez-y}!(D6A#_j8G?-3&mDd)3C+@zM;Tvhyn$G5EEX>UzgFbxV2& zIzDGGwBvI3BAY_8He9GS%e;_-{7(adZcgO zVFsVfx5ccH>e+sIl=8MJg9%u}ArpJfmoU%`e>`u<4V6pya^>nBC>ix{$2~M!F!gK2 zy-WcIaEYc$oH>>0z(3Tj72)bSaRS5AJpxiaug%Is+Q zhLI|DC7bV9@8%Y7FgNWzZA-EUTV_KK%Ipdx@ELp`xx=lkhpEz?Dze0zQCzsPW&2(L zT%cSA(=HQQ04^Sp>G-nW{3#EoN+lC-`06t~D@Wn@=miZ~LgK+aM2L2e8sM0iX8DSQ z%#GUw(GUf&4d!nq{#<*KfdX#EhBSef5hWo{{$Yh=B|>`bRB-F-b{0wvo7 z6?l!ZY^kA@pHGRHZRZ2c&Hle!%frDy;J!zP1x;buW2iI;>SR&`&|z3vhsUdPx-P72 zZ<_?0o#h9qHnNJT(5naG*><4jy(-?iMf!2*VOPsC8pO2S!P| za3^xCnvD^V0K&S?ld*lbY02@1vP@d~07O8$ziKL^0XogS253+-u%VWOpj$O?Zp4~s zF<`@GIRjPjzw%4>*)F!$2dW_a7!MH(;;-`ZJitiy5FN)DJ4l2l>Texkr)#PaYF}1( zw0WP5{9Nb4Jb3M_ z4%RA!s%8i?a@hLl74Wu3z2gqqj_ukz^_79dGA8kcW$KQtg&WFA-PC?+dU;-N3HNJr z)P5vx8CoZ?qM)Q{a`Ep;!|4?)@@?4Q<;HvM!4s*~ncb%J{a7s}I;vAun)>?PfTM&4 zv&K|Hiz)p&ORb}JEEo&5b-TA_&gk&Mz~DFq7zx*5lV3X1sygv{_^{xzNc!dtAvR8o zs8Moebrp3gq!g|yKgG~%WoV+d$O&lQl5xjPBy-H% zUII)Dig0EdEBJR~({M_`fRK=bgBrFmp-3S2J9y4_P#NJe60Oi{b`Z;yv0a~2Dg;ev zG2x9Y>`<8auRV-9%!W#{?X)4qF!3*xd2LTQlL1=j5F+hhGlZLL@Y&P6G-2q}=$ohx zfGRr}+}iQHIVatGK~{0%*}tpne=LG3rTj0-a!Mtv3r*t^j!hNsof$=Q?r9kRULf5P z`+{H>3mTzn%7f%x{OUE$Tw?4Ya7yVi^^dARCJ)=lBIA_sPh8LRTTiD;b7%Duc{5>+cnqTu4`H&Jxaq z6@9ZMx8j2gYb0Z(;S(F)*a?_=sgYQy%?46f2~oI&Vyi{2w@;@uRxGn55|~z!f&^Kw zuqo~URpgc*i&f8Nkon1hd3bH?!3e&fI(RXQIQiqEysblG+Ku%v z+xWt)wBUF%sQ5S{GcrD+P?-5lON02~dd4gQ+T$>9_`g>WNzRZ5pST1+Z$3D$-r1 z$o&RM!z!l<#4=-pD9&G;9%G$hTqR^DuX%+{Zqece#|?)XfN3S?42xRIiLS8AV0`#Dxn6^aL&W2QvmWINUD(mRG3nL&;BYB_M2PnCb;jyEVsT2p>k)wnHBuSmvL6)6qkX(>+P#V918vLSvTzl<-OdhzknGhJH<>zAYF&ICeg`GdCxsszC6OI9w<0*kP2Gm) zh?<~45UTB2e+Jp&%3EOu`7m{q3_niI%Spw&%ko&?;I+<_J9bQD!47pX>S^v(H1nSf z19O^q7m8;qrS-vc%S@|fL?_O-fgcWPlQ?Z42;#+1k`efORC&sh7ZlM?xKJ%ZQm>4XfNY!kugm&)l_x! zD^}WuHbhUK3JvzRO@70tFjHuuZ)5(-PbSr0ri~lQMkYBM)%d&H7GOSOPsWPDq zQdV**Se>+2#dN_lUu%2TpR^zn!7~4_I>U#q+L=pR@deGZ2NMX7fLyct`P{Owhv!NU zab-+_M3^f+Xbgwi&XzVxh8MxeNl%C4F0t<6tJdx?h{X^`4@CthR>8qk4ui3%O2D!e z`uDtu=`NmC+InM?jGWm74hPSH z-wDvAe6jDKz4t9Vsxx+Gf$Ov#=}g6guR4;O?|j_lu!9M6oWA3=Obq!4>D-E^hET)a zEe(b1P(?O@6O97fS&)zF$w{izzyq>;DX4JGRL}GVjf&Vvt%JC$QCC(f=ijSC|4rxh z*tI(rPK5cT-;P<6C|^LOW&;kt-;kR~ax5na!nNu>Ot9^;Q~cTk?O$eH z^P5({9Is)?0OUfChGiAq;q29QIz?L5x-WmOxNOFg3Mjed8|H+QkrvC8sTw<=S}O~0 zi1ct@X!IM@RkAr%HA3;jSE39>OgNEg5Na&y@^sQ%4Q5${p`_%CLo?KrY(Hn%Gk>)= zRCdJt0NatEu3pXx@l9@ULxLYHq~k8I)PcLw%I{$&#!}~TBi1KPG}MKI2AXs@R>sly zGEV9#BY7-36&*AZv0-RM@fMg!aAV;EGeYj2s`}!T-4#j*g&L+`EE|Dp{|#}yXb%Ax zl!ZknN&X2e4DTc1Iia(u;&wzRw7%7dzs6yAyVQg*;Z}o7oEMGpfq|dUY-dBQ6oIYC zx*cXoTjuI?^S9=HJwRq0L5gv1@2~GLr-66F}`Q;?1_y&jp zF0@LA=t$nOt!rH4g6PQEGOQzS8HwbqKxU9_ zgu8M#gw@_bwPKFh=z=a!FCnL+b`zTy5i^rb$X$aOf0}&FJZ`A7hOU=mJsQS~br7uj z#9CNhB5uY>MG75|4|1_xX~>s-jgHAoZ4zQ@Y=Gs2!pA;A7qThcyl{9H!Yh(vHQM+J zyZBxRN*-n@M2Sn&>lyGAWDXocIcLb0!Up~wFeXwR*;IZE7WA=3>TOYwRYGiW>xlc} z%pWoqxp$-!688LjB;mnbtV`ew@PS4VPK8LC>$`Qe9Y%6wDih76b zknEC%+jszIG%j^~VQ$>T3o2MXN5D8HHFZwW-L*{`uM^XU^~1k_50>(&!XXd~*>p&t zwh#qHL|@+98+^>z&0j!O&#;37yliPQ#le5zgsS=%M%hIW$fnQ7c1s@i6@XGv?+*j` zVR$9c(x`$4viuMkG_rP$Wba{Gz$>1LzvnJKRd4X(K^TeyIJiHdE8di$E{DZN6zF17 z*wf*2VlgmMZq525?7qr;&Nb7anvW>l;qxo_Nb1nOK#MSH+&S2BXY4#|y}UmYQC#g4Y1TRRiFn)NRKV-_^_ z!5Q@2T+_5U^41638xYiHAf~*_3ptEq0s_`&>SsK?sIX&$h<%KnItFEL9JC(0bE#5w zTB^Wnx?3wz*aX7T{BcOe`3005|3DnVgu(eelJLtMeN;N0Wy0r|VI9wEHpIrH;?)%? z+Pc7YZSQzj{#era1KR05lgRbHJ+@QpWr%@m$;){IxLt`Y+iSf~Kws<$ zf1utlJ=1FOV;d%c4|J~e?O7WHeZ!UryYI%UcmqZh``ilR(QYwZ7dgw`cEe zWVv6Qz2WV+te>T6RUS32a5WAI6=fdib^s=zYrcUD`~p<%yM%IFoVKQGY0IeZxSjAG z0>I@2l(2^1KE`b$*a8(d)>~f)lS1;x>hW)pA@&;gI?z*%{_?_`l@+6ELB>?LgaSK4 zc`5fg^i+w`GmuIG6_m^rU&gZg>~3;X_tK-LNNnP(cHq{~b&O7%8$~GuPjvn{?KjrR z+2GEp3m=W2SZnxsZy_|B;lLa0HxtPvj>IOPxSm*SE-~BL=EDJ$zykZ5hbJrDgMib8)%U?$Y-;&z{%ID%W}#DQG5lW_=v z(A-FFe1cEo-!=4p1BMPf)b!D028S=zg5A)zLL>#x(~oeJW@B*#_m%Cpt(SFf?AT#D z<2z^fFQ!uh^G73=qg>)DxuXhjZ|R?);>E?!0(!pzqYRR{epEkYGN@Mq@s9B-C9+~B zA8fv_A+Vpj^zzEEZ*=8g`gOx`J4(^jawvoJ2uNs^@z0q2PgWAguSR*K@j{3uux}Pl zOy9&k9IJMy&2HFEcyhQc?UC{$ilsenb7z{SyAf@TWu!T@oE16~R3e+Rc(}7`b2ix7 z>gel-wFv4AP=-Y!{}*5H*qsUVtbL|q+qP}nwspt0ZQHh;ba2PEZM&n6laA&;GtZf| z&NF9btz93Wu3EMCRWEk^6njeVE|(d0Lz^)!anh12{@JK%un3KcLa0pNQ!%7UcaXLj z+k{igb`YhjRq<+iwBvdj^iF|ZbUycKjssG(@O5| zM4?#sCZYX<`zxnN5uYmG>jzjV>YwC^*tk~m>%d|d1>8^602)a;>%gxNykz3zizu8v z+?3$hvX5d})SD z;)I&-^0+CGi+G&BVzN6{{#vR_(|6l#HIttI-4%~uZs!4&U6{;7bpHD-BF;7wFFhx6 z?;BiKYkl*i)$Gl-DH=pA!pJ|1vG8xLyUW`8WKlE`A`0x>@2nA|S0}pAMV;Vhg|^>f zD{VR0<;^Ik{mcCM9_JRRGbf_qW}W5FSX|+&iEukCAEM&571b*U)|TsFlUcqO-#o^r z5paR-?oc5>-Et}RFs|yI-j-HfiEVjug+RE~@}jc^16`LRGfZ!(1U!r>qBuHqPyXT5 zmN?#tMs=KAh2jS%?9jB32E@w+mO=M==2TJI>k%ug9E(8z6}tk$cr?C%-`B$P;W@pW znwcQRd)B8jy1)jL!xnFI4A*srEJ4@Fp)#@wuNw4vsZN}<{qwR0o00St_bk*eA(}k5 zeti{~Xpe+Oy;EK$3fm*-&y{XIt4%_wEfX6>SBDSHoebWxV0*wJ&Mp;=h_HCU}gv#X+E$5O^ItNgo0H}HMpHmSWd>FCCJUSg5HE! zHja`;IDzqo^p5PgGPbm9H#=j0HV$@WR5p3L%S+sHFSnEDq@RS$PI;@Hw8!RBb?S?2 zR^(@E&ZU0bqxppWa*;x)QYbWiR{{RVo2!*>2Jgl#dP=}{yOPgxh0>+Vm*NtH&zi5p zpZ9mQY1Hm#F|Aa9v?{09KlY33t(Cmv2JnH5e!z`t(z3_Zn~wm8PH$zroCytu0X+r9 zB5U%1MjOYku(U1G$7`lVFS|%DcdrG@3fvMZvFyL(=`uXaZ8ZOh8`lap+kBYUN!h(* z1tA^-NJn2@x3q?R3DHn81R=QDVbBwRJ0W&?E4F@Dx@oTcVNOw2zV^Zt=|d|Qj` z>Da&;b$PN|!>+U;*i^zuo8$fb#a`Q>w1UyiiZQu6XPcgCLVa6npUh0YaCFP|0+VK6 zQU|j?)`QITwzrf??Y}mfzSU(En_jZQ)l2v?IggwC@7PNshL(U_2^<%20tMgF-4(HN z0*P8uk*mKnR2*(mmT;0*&jlA5ag^bM}6i)K5-Y?I+SEh zEqc7~KNQbQWQ5YK)76|mK4G@0&uVXmmmY#T=rS+sP@lyYSvXJnIK@^>CN-{f81%)G zssVy20rVsb=v(;3wi(A=&#B37-`LGT?K@AEz)W(pL4(T zO69JGa>c9@hSU&`m+)~Z^9KgGoth;(xK7dvwvxH%+l^>S&*- zHe}Jxo1a%d_-VLIwW^*<)Cg7L>1i0+q-W}!o?gRh7+OE~$9##VueV&Odkb`nq;s{{ z*X%e9?hiU>o-$~9*J|vIIcS{{Tq|nqjoxaW3TS@xUJGh){{GN-2k})-M{17Lc$cg7 z8=)mK=Ueq5GVN}YB?7rUtsB&=>Bk3)y&yEtn8Z*-0D={7e(mhnwbDWG zwl-GK^p9vnGy3$Qa1=L zPT*D4LFLjAS%Shh7z?9Ac+V8pKc@?t|E-6BeFK_D8R_egbmtG>ffW$VV%UJ0=r$tU z35h<`cT;fHh-9?DOsV>m-csrJ7wp%mO?PL_;uy64#4nEp-8rvovECgChJ`DTle<w0-{L?MK&bHeIiWuG61*-k zo^CM~Kcb=4u%i-p1)iP4_(r1>Z$rfgf}#|hfz7QZ4`$R`P>CkCc38T|6ZQ@$1Oqd; zt(5(^{U%rmM1*Rh#b5fO7BeA4F&8AOh&tF>-L4-N@H{xvLvHXue0goj%Mu(jtf4q|;{eNFT2U{E@&1I5XUK#Af{cM&8}Hs# z2l}>*N--Ya1cD)RLQVB^W>m`KnnFt^?byD3-6!ayJisWh=@1x)GP__Yq9Q|wp2JiC zOFQdsCB0Pu9XTb!-9mN5C5;l;M4Qk5f_MF_SLYvN`ws8>O}PGu^74c3eam+JMFSrx zMBM|IgedY6yb3*JMM@{D>-B61z&OY3kLZaL- zQ_D8=9=D3nkbH1)HtA}4wN|mwkU(ar7*tb?p+p%@M1!~E0grsMLpr2iSP(xLFyTib zKOkN)sD2g#n*mp=BbYbjBgT*cpyy&~B%PE=3dW<}sJ-SOKc=qhP2e4ukZX(ny-A)> z(>u7QUba26CrUu4eq;ZFI9G^t#XyY)$bl&*5bLo`No^cRZgp==L-x#UA7labTcSe> z^~J)MYYS!mMRS=BWh}}jUB>PH)S2W_<=BI}h&Snhzt|mkPm&gp7EI#tA#Nx1P)XVt z%Uha9un%9GT=vGZUF-eKnKe?3qc6Q_f&ItTclTraKT@^IHg;nuZWMx3&SxHay;=|l z$rp;ZCdCsCb0`G0RsHo_068Cm06NezjjpPBW5}zVx>KvGI}8V`6uNy%s)wuJiq5vk zseIvhA&%#E`!T?a{fiHw*97<1WJa3_J`jrcT)x7CMlM9#m+uI2v7iql-?U1(}#K9P&DV`yOz>Z}n z)QM1>JCQWcKsylhYQBl%FMe&Gc%e*!)!#~WPQC*smqNa@3u(|Ud zBNxvIK=fM)ovY8p#gs4LV+D18JLnsg!N&fmB*veaAbuOZ%^sLKqCX-qmBt|!h^lGF zy5Hj0RYOvX`~mJcID?thMi60aPBbIQ?do#gKEMyI93cTW^J>H3L^_u$lm39I-PBSQ zR%8nIwGN8W(glIpU>I)y#4&)3DJszX3u9mMqyiE<^zOJh zZ)S*@;H%~RTK%Mil6d}_{b`KRQZHGrU6^gjo9iFoBTZ#-u}rQ_s*L4j!?!ik-{NMG z@CB;Qd1qZ}wE^}d>to~m8g6G*(24E?b=-#L<3;Kv-JE;Pm??yHs%$akrp!Z1^NdlV z7ibpxBtOiA?g=~b7uIHbmcVe7$#xIS7*j&jL;2HKU%Mxn1Uuk zv|+Nb5M&G%wS-U{j2 z++QR$tD>|gn|&nx2Ok)nGMOB!YW{kMiPU4tgH(#aFzH>z8h>&CVUg`bn$VsXRXQ2% zq@yU_M%$ag#v;mt)>-pZ!X|PG{mD60u?@Z=8}!{7(FcsY5t$TG$`lAu86&(z_J!XtW|fOuy4k-OxWp|dly!xn*ObouhM7(4 zgx&K|RDoJAXD?AbY3|n~`Q&vnp43(m|fybiH>Qb{7*=I0d)&ITX?7oi`{UYyw9IxaG<*^TfYiTZrK0NX05E< zs_nFVm&jQxcEVBnt%fPz|#_%85A zEG$v{M*Behp81CUF)?Z`xVFtmOyMKy>TozK_lfSS|f7C|qs8ZP9 z(CWmZki;nek=V|1KJjMc+DE-Z$1M{|()A_fkKl~0JESB7)teo8#<6p&bBxiQ@J9n? zDW;l}-O(>LgBiTg38py)M_6vr%PU+5b52iETshw zom=$5uOQkRzLGG%45m*UY60Z%^k^kSZIaKCUGK_d3-p3`Uyu7$}r zo?m{>bR!eI08qL1c~HbzExv8`&AEl$ol#W2+#C$e3d zV(N?|cB8+!@cz4)-E@pNi)f_M=n+s+GH(LuhX0D9xdwZ>2oSzXptyr0)8K*Ge1v*2 zqV+a1ESi$>gH2Bw)w*|o>r42kW|s(gXKsNIgm)9f-|-`V!G-YdftDx*m-VKJJ2gGP z7Q{?AKQ@LWLQ4O%g8plIpdLVPcZzo47l5xnOEskM=>-h`I0z8LdHGwtFjYDD@d^GG zHy_maM*o&EAJPB7^Ovk}n!9kEzbEeb@NpBrFNom?!;Zmd0@RPi_CQWMj>+8e!TcJ( zFVA3%ZZqAFqC2P2gsDm+1J6gL5)dP9CFd%qN z^1^}i`_7x}14}6VYv3x05kdbi^85jyU>46?Pza;CHTd-yFIf}84?KWw(DC?wTl|v~ zX4}F<52u}Bq+Nr5O6iED%s6fRo>CRZ4jVqK7Qj7!0?FIUH7LCD+p{#mpNQ2PX~kWD z7{v0}PCzBL09K_S)*jL>Jf0s(Ae&wrdfSUhU4#%b6n+n{-=fqrD;o9^tgb$sCaO62 zA1}zb3zO*W;FK}NU1ZLxF}}m`*Ej=+mb@ zu=e;3x$Y9!G5SfJHyh8VKM_fK0{>KYs}fKQb+hXs7`Geuw_x}p%}+LTMPGmak(g*s zDyeULOFB*lSc6d#k5*IYO(|kuy3j2j%}hz~K}bI?yC&#W#rk@v`F0xMrbY-*R`J2E56&Wfq@W#>!r6h4NqhD zVJVbctb;-T`)AY5m{e7=r$q18L;CVg{0=dJiggsi6e9S^iao*D2r{YjfO z*%-()$l+EUi=LbG*tcQ0bObCO%dxJ48eH_FUsE0O{MS}3F~G8h z!^G2Rt4iY;O4ho31l992Y#D3#N(w5zI?CfHqoIDuH*MnpCt7&8vUVQSz?~f&UY6;>@$uy&tOn9~g7I z5cKjpnRKZXf!=jdBr3{TlqAmA+l=nJeyls|WP^|lq^T#Z&@E{E-I(<&_kiWr0o%KC z6<)I6lPM>h6`BL0mI?=`Kkf5QcU2T1?1TNgBajJSdHjGTa=!9#OXfoz)SSL zb5VSbV{pFB;<$thC2H9{HN%%c%2^{~3(&3wxblp+_)pxhK=MhV=HiDe{sPQsfUa(^ zmi|-_1nQLsep8}#;9Tz@yw_&ZU%AUj-rywADOsp!@Lwa?=r7I~umyM~Rcc1XVZ;d- zCK?%80Mwu`8a}_M+W?{*y@&Qxrj9OM*l`(Z(l3U;wo7LfF@f3Yel(=tvY^fs#6uE4 zObmI$2)$wB&gEz5NvD3{q?$rcmW1N;`qVwO8x$FTD4rjY8S7cUmJG|w38W2lk@R&r z6?2y_m$1Kh*$Ecbp)bDGi@c#*u|Q|I zg1J=Rl;GuEJD@+!+#I&q?sBU`Bg@S9)PO?y=)Kvb5+>Y?7UEE<;vMrN3RgFBbEfnn zo+yB=LEP}B82pWmrVFeYN^lP}6NT}TyJJ-!BF*)oH3Sv{$Y;sQV+I%cJ;R{ja?KW3 ztR6L;d-!U!!X2nPO-!}V_X4G1kFLV#R{?lDmwhJA#Q2^E=Qm>!wzTu_vBd|H_BWTn zE30>ccJ#CFJ-gz8OESBQ-$;TD^m|Z+>Pva`f34~K+JzM&05?S7b@cx2IQ)WIm%k0y z1Khj?D=#sQ)?QQcrDIUx0}Dqa1fw?utkJ9mo+L=)Ar0b!^;rmEM;4jo@!`lu?v+U? z2fbKuDq?7q87qcJS-@yV>9v{81|(UKOiTpxXr>NHReov3N;suzLn1|EEYNBW{x(7A zAy*9X9MzThG+m%fh=faTO9OuCc?Ydmm9D(r%=#Cu(=svyal%tEw(jg9WGuZcxwtc4 z{uKQ&KspoZs=$l;LHO0hT$a0?4}1ZOB&n>b5<#e7S#6KG$I{CbHLszGvF=qnWD zw-0=i_4mrz@<=g^;ZqJ2?Wh)#T)p5;E@`o@;+Iv4Z>9yj-L8m3iXw=jvTEy&ftM$YLU7I>Rm3&-+CNA@)hri0A9II~N>z_~`%F-(2R_Nbk_mt!4`}a6bVun)b&kIFK`Rh0^Om;M2p3ool|+ z)9u)xiW@u>#vJlnVrBN#%OG*M-@gTiGW+>Q*|JEKi)asmx^;60=Cl;<46 zD@W}A76ZWqv5*Elk3`-KKT!ja69@kDfUoIYn}CftXp(PjU^gc!pnhzs-=p)1@Xywa zh_s9F4|B#EHN%YpJlebp?6H`r`}h$;TlcK^@zf`LLE+8s?vWukJO{e5Yq(7K7hs{7 zF9MM@t|cv~vpoi@XUhH53Fd+WOWdSZNX{5u{u7j*wYZZ!k?(dei8Zk=75n zGI_72J(H^USUP7WeuSwN4lDXd=Pa`|w%VRL?$PeMHL;QJ!-M;sRn zhEjvxXcR9DD_(a4R`-l?75IlV>GdNv#XlB?qbg1b0@ui=;UypeG02{+B?0N`P$t6Uwf z_er~!FFxrHj{OPJ`wa5?Bzr;;8YFfGk8z4|P8kHJA#m6d&rLyl&(3o?VGb@VX9QkG zo!GJeA*GS!k1Vu3{0i$bhM=x=9Tjte$M~b_HWic$0PjU8x>Cu|Q_!?r87e05+D=t!Mt7YpOTLOMf_umUovK9fZ04kDerfQC`u*K6BE4TdQ4I>XCKVM zKBzvYGBYDYN*hYCC%eQ2^@*fqV!47KPD@DmBsKsr??%|FEPg>6t{6UUcZ!*Grz(Lv5Y!r!9ld zcMfM|I0EtJ0o3Ne4Rf#!)W!fOXOsvY-i#C4wsvr~Y*-tKTO`2HzP-7WyUtGV0S2Wz z9N{M5Zl`e7cb4QrCNj}hccY1u6MtJlhA@|WQi_M76WAIbPfWd{Cvz_~3UiwqstV;o z2Ry}*9%ch%@#D#!@-XWeLff85Ag5;zmOr=v)eI3{r)`TQ4B?a}uMQ}@1$yWlgXWvQ z(|0T?z2QSiK5YUJmfT?00*YbUZTLDa)AcW$|L5;?<8;?=s z{dOj!f0aXRF7ge8jq;- z?hauu<|G~LQ!Kz`dQ&~z87%1SA%va^FpKWNnV$Mr(d7bidWg=Zpq#XbLed`qf2WN^ zwFN=BCZrA-pArd^5(i6NkgijFixH>-WZSnYYfV-7b|wrZW%q+bJ{A6`E+b)R;w>#? zBvih0_7Pa`;@zI}z0IBwEEoY=$sfqaCnspx@_xGnUW(diu#_{D%buVCOZ+Dkl#0a# zcLy&g>?a_sIxm#?w<7l|kdow_>^&;fE7fmYkbR~s@iBSV+ZR0l@-2(6)T)x&yzA#g z<=l6_?XDdJosuGq+w(PqE9@ZRi~^I#OKpt%#M0bH{qB#wGhBK|jl%KYadXnv0ab1m zgNPkkLOV-Rar?t}3Zahk>V87*+j1deiAyPsY z$r|Ww%u~^}*ldY%MZFvC{>&Yz<9;EqvLkxu1O?};i+=eM(CGc<#r?t7ove*j zJvPFZn$h$pomIYn_&ImwO=wtL&BW>S<)ISp@rl`(xDr){%F5XuH{`p7Gb>We&Z0)P z)D7D?iQI0)CswA46E%Mgw@N5iF+?_=aL+Q#&Zx^mv(%X_$d^K^6-zQ4XL$YajJ?>7a^Ib zj9BPg75?G@e)A%4L0**Gk34e?NY|spv?8Zj0kW#{VcA-tXI4v?i9YC;a*R9MVb*MN z0ln=IHXM&G&M*yS;P8E!9mEj-1{SZOyLAk{?VD&?MHa)Wb!$tIR|&PEnLuqY>d6zT zH9d6Xigj}(+O%ftq$)^Oovz>(C`@~2`L7oc-x8+A2>wEpJ_aYMjI1p|km63W%4P_} z8GHH|Oo=Pfw`+&(Ehfx$C?X{(sl!30`e0ZAT&tdHTqY^*`A8xwBDZuo@t zhM>!>bf*{(40ao>Vagj_ZnbVihoy!{iyKHUIZ6p;fG4O6ua+&xka%&HGXB#OpTM^R8MtM_5qf9IN1)Y_x*7-d zCSp7GSdSAchgdtjHOOF>yu^Q!u?(XNr`IDqs`Mnv%^;K1&vi+6vrgQWIk>O@YTGyn za)SWnGRpa12k|5dI~9YapjkOq3OYP&4Rk7nU*{_#n()sn7X_^lt|B9Z8nC8Ii|`rbuE&-Q(OovV9bGw7L5Ke zE&^BA*Z@OAvlHK1Zgbx<#~vpb8}W#dXlG^N@~mby3nLIjR$WnGcbeb&ZX)$_eGTcn zfZY>c=f&{5WeI867%vcFe2SbA;e+C zN`KJi8UyV0l<7=Rm*Ab~hiY>6kz7SyUCI_Z>`5av`&R3Rj|p}HO4QpD&v6~tth z}@TQ&1pvQd_t8ZVq-~J;)?ZWacQAJo7jeFZD$gW>qFygC% z#cq&zJC&cm*|F~nLl=qO&aH*ZB0Td$-i8oe3DrUno&E@FYHUu`c!tiH29N8^I&7ql z+h~|qls9<}^LgCpb=l6Ey1Q+6#X`(ZukFrkjKVJtab}H5-lNCuAy9m13k*4I%xd16 zlGKHJ4mY=sp53KNiBSq_9cgNb64pihazc#@YQu(q12C=#L#zzByn!mZw28*U^JbKaTYga%yO+#__4rT@wljoJ-c{*uwGdT?|>Nmpi2 zH2V?n^&#+^b!{^G4U9n&)#HGj2{fGvF^_T_@jNh3t$U@>0Z!(kc8;dD|3zEbRz(v*7Dx@Vlg5ntRRRhNZ3Uef6@xVZ z2LppOEKyu_G#E*N<3zEkaKlI=C|66aZk?Ve_@A)#u~MA>ix# z1#E!bW9VYkj?d?>I{o~}gFZdeP}Z;?Hk?=Wfd)3oOvGQ^4K5P;7%yGBB@(j{3!1RH zAktj5raI$r67^MjgKZ|~2<`7w%~e&3S#EiIz6=NaIX3V&nNbt$2_o&hOpdE4z3LF_ zd-aT?op$%-qB`gfINflp->f{qBD}807=XYcyf?;zhUIa$y8IZuYO#U$?g8HTslUTb zUZw+P>r%rjwITC?-->+%-)vROhT9}PzRC?Cmk(#z33$jHN14;&>D8&agkQjL&w4r` zN($LQV3>vsKfJzITwoOr+K4=?%qF&0^(Vu6W$|mLs=cn8B=OH&0krs^_faBKuqFOpLU>*c^vd1iRSQmSEXv4~>=L$iFi;RS}; z_1Tp_7Gf)f$gEuJPQ^^t%B%MIcKiM5B~T15hLdUXp*eX!^O-j}IM6ofuv{_lsSHlJ zl>-{#x8eB9@y1bo%Dqp&9?2-vD48fnD6i0bQW2IKiNJ~gRE^^IAe#jzINB~p=zS+A zG@p~zYT$hndY;ztrSWU{=8UBTbQdGEUCj|9F_gO>BmD5vN`F}|VJr%tz&i?ie6jDd zGB3sRB*1O;QobZMXj0dsJLS!O zLJ=pRp{dz!tkHcN4c{SxA7Fl!OoJJ1vL7e9Un&Lyo))O7$Wnw>gf4eGJg?XOFP-N* z@8|nM-{483XgFd(jA5*-B$nuE>I#Y(X&?hxh~ClNH1%ziv*xEi1z8*qj`z$ocOnE# ztjVYD&@T1uBzH6qjGPKRT*s?;|a}u4=)alehfS@-yt=BE|g^BS~JaBqYhIi5 zknSL}I*btYLK9S{cK1KkFQdzeVNZ&6PbZ-$K~f>=G! zLI==XEl;;f zBZ^y1mUB@n)72PW-U3(nLYyQ%6%UBhl+>3s zoiI-8k!H6@7Gn}DTSe}LLz|@o{#n*9Moo+?|D4TMVrCVq`X55GstU8(u4 zg|BULE%0KAU*QCQinj((>h`-W;3Ac|mxf{vpEum){`_xbC<;)?XQuy{idIMv5X%4Q zGV`)_b#wiHqh0@(v)E2)f<3GthK-SR!0s_BAsqx?fJoQF=u?(sJ+NWT-P%?DjA;A@ zVG<-RFP5!o^=p|*Y`NYnGl6IM_kWp-<;oBF6e1y^z+X-fy3hc5$i?8=rS6J@t`Izt zoe_r49Ze^xvAYQBgVSz`2!Q?cQBRegBQSj?8&k=` zLk_dUei)r5V!&SvdrmAOS-N}V0yorgY{oT$aTeLHS%2qbEv8SWNIKEt>}e>+0RVPD ziND9i2<~5=R>Z7RF+>f3?}domhpWAl&A#!kNp%sQU+^Dv>?H>5Xo6u@iDWn`410ce z8?DqpW8~KLrYQMO?4_QKML5ZTXh-MRSp50xGq1_&rF)m=VW)O`cgRFFGwcs0)MDPQ zdgB}ttBssPC%H<--sB6psf`I&!yKBdkPRD@o3_4ED!8rLCfbJe^KKNbofjCBaKvIg%a>?31(nU=!(P@j#srxz-iCag^$C#et5+rL3feQ_m zP(Z{*pi&{Ahv&6Zk!FtWR@$bYj>fBwG_)>8#|%gE=XpkbhJ-ZxnGK%(HJ#BB1q}m6 zzA9@RP1Vyzc2w;@w&Kel2%ot%xxau>Ex%t>pgGUKgh*=G*$lER&GUWo{oQ37&e zT6IT^6P*t{c2sEaG1!AJujHA$r&TZnX&IU{ez_H|%EA;`Ea*x`U2+cxemQ%@Pi{?$ za|+Xh=rCIAz+gk{wPeRH^oQUR%?NEDgFl)VQ~__ zOZu+}f3YYWV>-6Er^u+zREBt|yQ)f@@-eC_{<(ATHMWF5dZ+XYD&u;NQd0Vgz~1X~ z1(?H0xSmLT!J6|pO7*Uvq-h$*u+)XNXRf?DGQYT0KaABX1a3X$dhn1q%UMArO69xv zL?x90Sm5<-a50%%1CeO@8%AE$fteB(1BM%ymX2c)pL*@kg^{cUMd1I|a(>}zV&Tvr zAc*K7AjJP;%l-FeYt#DhMc2X!pxQK}>_$U%3C_qxL+;wN(;mP)C6yLMCJ)nHQrD$Z zbE-+w>b=KA^Cx&q-mDg<1IF=Z4pdl+le7gimymK=q7b;{8fs^3>L3&wX3 z1EC64?se{69Km^S(b7IN{1lZ1nG6Y)?~TEq-$EiH+4<>5h*a)JnHz!|4^{5{yE|(?1toM$4ECq9L1Gm9V6~p`^ruDL+al=!1o6|HRQ#c6q@oi?gb!LWvGtdEynIx z)WkAE-1EO0%*z#C5vLX2GXk}f8qiQ;sM_|-3W^+KuQTvQ|-pmO1!E-WYoM%&m@z73YD5@oW zsTTdbQcnL{f^DF)_Hab`yV|ho*tw!9Jtv)EyM>2b-WBv+BRDI;kCa-22&b4y&?nenmcW5d>NoU`;8w3;HRKe++sk_Y2=&y+v{N zBXpqEsP2L1A1fb-D~^-TRc9^Tpue z5E>MLSX5=TPe^T&j&XSdA_}j((6lxf zHey;dm#8uUxCLg3ct?Fu79)EXr8=P@IN3y|Nz~)3U+ATNi&N4Qo%xMFv zkG0;~V)ifI7#c3#@|%Dj4g~Hz*#onr10Kh(yms2W-$6ouq(kd19_h6nzj0Jhd`tG_ zy)}OWX5Yy3)Qcixchncmo_I1W&G7e|A~r3>_4`a`s)*-Xnr>o+tF|+UD#%Um&Ih|7 z@aIES{^s?zMNQ-0qxJH?pxU!Vl|z`!Qq&H0xlWX9_6!t?GkoD_seek08##-J$kAAP zoTW{qu-X50eCv+saQhU)X4Dz|P;g}4&(iGizse#g<<}ZALPHAfWvNjXk{cB55Dj@Y|(pllJFXh zhU}B17vH24d3LxNvl*5CaMY2Uu{U!GF`vwO7Eb88gdI*GBZ|WG=o01Axfu^~*TA|C zlptep%zM6-8an#k(4;O+dQjz?|C+2;$y`?W9(z<%gq(if1n-JarEf6(**^?jHYm@Y zb=grxHZn%eB9dNs#!;-FslLQSNJChJ04pr#2F_4m%$uJf3+u6Z&K%L>rATMz@RSv~ zb)Qg|yw9<}=r!1^Wv3Qxm8A->5S$3E%P?^_%sXhp$;-H6zxh93ch?n7ym~DYuFX9s zf|S?I1PM(DpD^F?^$gZ8*1pL&5zqITCNmAwTUa?&}J`kSoJ8g%aL&KOAF`T%RG!<^tU zVtAPE{sjnzn~7axsOw8=^N$sc>RvpLry!9Xu&0g&*ID!X? zTdA8eoEOb%`1&SqNsHK<73eC+Hw5dR5?hl3<(lQHOmdE!W2Ypij#*7K(<3s93qji`P4BieDqB z$3z|&1rV;|=a00x)46C*W@+B5bmYhtN!IF-nS(zY{EAdrA3?YR*dty6rw?}x&YQoj zZ2eI27|~Oj;W+d^qB_DQ;f*mMqx0h#fMDB6CMm4+0+CsklZOu@WbRqrD2NxH)8vLq zdAU({<4*FLgA{)Hd!Ws1+1e7f;wID7Xp&4RCv=hxiCv-Hr0h}X>&(~q4Ocei;EQ^? zmJ52M3OjOECLjEsA_V67H|&G%Ne z)8wdZPIcvl17dZHkvO|#+6hwLEJUVo-k@9uKpek7)JL zDuP6h{n99Hfhib3>ol%YQqI#R@4QAm$;F9v1~sq55YZ+Ph(;6){_v}JUtl;^Cdr=i zOtU*W-9)oH?41U4`0H%OKITr4z1qfHU5uPtOmEEk8M+-SFt6^bMghv z>_qXqdnxCY=)YSSSv0rY?EhGoQIP-H!bmD816*9qUH%Iu%dl5u7NtrFlq8=N~t3lE)|&s-RXuhUu|{(R@hNfnetpKq$8KIZ!pw%9GM zHFoptqt{{&eH@6874d`FXA>z>gxE!t5OUl^^(6YI|9|6H_Z!Pj(fk4dnf&!X4@3V? zTC%cY06RO^|Jwepp!A>Q{PlEe+Mti1E+(;&j)HyGy{tt+2NT7I{Hw(bsJG4F#`+JH z?#+${i4GE36>SA@jw#t3&u)6MH^1Kee4!RbgCk)*3|jSDA!u2we=TA;RZN-51+O{T zL}4z?OoFS}P-B<7E}iSsDbO3+`W&%(GDDlEn1Kcu*|Gvif5&kP{42jR*p*F9=3%7R zsqrap)irdPPo2y1jkpwmS&5WgezsvDVM|F3%RXa{H)G9^JoT2@nuZz;?df(iC;d~M zSNjEjId@X}q%vF)>mNM)lYwG&5<{HKi|9bf7W3wO)344QI=TufPIAz5yx|!*C*QJWL&Hwooy#*8f*H~4Kge00O;t2=Plm&pHAS0#CpEC5%vaRYIfUER1h=eCM)xT+eTgPceki zIIw8a3^u6ws<<}*+C0h0@`^aB&yt0Mw^hZ)+OOv1jFqXu3+sN!s^urOL6QCq<&#(v zd^nR?#Rqg8XJmtsz1GN4S+bpv)Tmu(58Rk(g#Wm7qhQuei+hEw58as>fC=GyKh^ep zRjfgP#y)+w6;6x#NKCOCCQPyRS8NKh4mor zHJj9AACg3eUbgyliz-I0VPzf25{Vy^Vfa`|o#I!%G;j239BCr{VV|5q99@LCBfgf_ z`B@mJpl_p&DxXFbF+)HUXyI-0vmnJ6Tj!`Mci!r<2~3a;@dkAJ^NNxj9C#oV$-NBf`Q? zHrMIS^8%0Qy7}wgI}s3U06mIs@dD*P;YG^#*3i~TLE|m-Vuk161_iP###U0IGAlOd z7&T-IRQ$Yb~I6veC%Ed3y zVulA1BKziIhGN_BVg`la;Wl%(-#ZJ4rMVbxzg4Yj;TcYrHEq))G$j&;BHAUbZ2gmJ z>(O-Eit8&o@Zjqut=b|mQFQZ*SK)4)#B7;csa2Mw7sQ*AjnM`z#I{An9iM4Dt)!6c z(6*8Vsh1K;{v}{;u?S{W6WCg9hkNMLrdf@{-GCS8XTg?l$q3$<-Jpx{tuB0vq~}X= z)xI)iSa3>!4g}_yfgo9%(-XQ*&GYNR=^Z&SbF$s}_X2jSs7pz)h zq$+7BqS8YBOg*42Hn<6W{yzXYK*qn?VuEW3t`*vKK8Rp$ylEEN^;GHxq21_%sCE;T zxtZV=q220(P13hgN$oM%0G+6M*NGXz(VY(4AK zp3|Q9!AR`|p}pvXOHoP@t`OQwKDdH}C|7%#;1#-+Y2ajrB6Ue&0A^4W$G2PS z_9NZ@4WL{5JMko=);6Q+{d~i?Fd+D z(8s#dO?SG<_OYIN4gwX*HS`feAL(QLsGffGew2?5&_^TC`#kDTJ~90ylJ}KDALC=g z^|1(2Wc6`|ULf@GJ~l$1Ku}095rIliGW3IlKH0~{>QfNt(NyC4G($be(5DN%$j2t> zGZ3iZVjr8L&qRTR!=WMWzr8Z^x1}9YUpK#UT)}f@SQ%_&<{2Ac|xD> zV{`Nc1PfCT7GcV&WwFqg_}D^ZKU+wn)2dex*-HtQ5iQFN{V+pcVd&VmRX(;-4-u^P z>6O-CRuP0#@Yx!CLEP8%we)PA(5ro{8buTV$zShdHTnhwx~cK8I=vQwZX!O`Kys9# z*AdjGu&w&xhTedW^(ei=JdHkln2w;`fJRksLJO;Jq|_!#Z6-sD+}k4btv+@f_2xJ# zb%c+dsBc5CXg!kPD1xI2jv+XfU^~Ha1jiGcKyV_#NdzYooI-Fa0hwt1Gy*cwI+JMC)Xtbu!WV1q2t;NRf%wcaS((C;_&2YmX2`a|?^x1m2w z=5l4K{)j%8swESwKZYWpKThxj_2Nl_rwE=Vc!sh(OYoe~pQq~!1TPZ2MDQ}fD+FX} zbuzU&nOdDptxl#^CsV7xP4F**cL?4kc#q(Hf)5BjBp~~$e@yTR!M_RqL+~lVX9WKx z_?+Mif-ecaBKVr%8-i~Mz9aaa;0J;q34S6Vo2vgz@CyMMRQ)%C-wFO8_>DRs012;P9O*jf)oNDK`MbskVepnAf3QZK!#Oh5Og8vN{~s=ji5V04}t(e zPl8?qy$Sjd^d;y=kVVj+U;x2Df35F01B^X99oFGV$O^`#7OE7|9B*7?x(F9~3 zMLxk8g0TeS2nqmem`*@(q@Xxb6cfxOIGA7-K?%Vj z1hWZB3Caj4k`xq43X)-QD8W2}`2-6H77{EXAmtNF2*?}?GKXRr!E%Db2v!iRBv?fd zB3MmONkC>%gbCIVkVO>h2&xIz6Ko);A*dyY5Rd^B^#q3#G!RhCDJbR?6mtrSIR(X> zVl%-Of~}lk9M0hw0=65W2c|~Rv!nODHx(699KpHFf_XUXrc_^oEQH%W_z)<|HV%97 zc0A?VEiJp90L;k zz>lR=4+7@9$fT-{A~@Qoe5@@N;uwmZ7t@nth1gEl;|Pu?IKju>5hqgWBq2`rDfd|! zPa!y!08KL!6g>+x&4;52RqiG`$^;r|U7Sg&vk19B-~I`6N*N|Q3m3WLyAH*HJI|3*41qYtqX^$<~LPV zhNJk%XbjiZ*Mu6w4EmO?X$XgFLk%0k4I^WZM=r1v6S3ad!}3rq=FccyAKDliSrdw^ z9XY?Tp*pe_^Q6|))zz1Wqm6jWfR!*vi*BlJtX$_j6V;KjP-R0MzFo?|R~?zz6sc^i zu8S~8k770Ti`P{*hNJbNN^B!VK3Ndn+=vCk(aKOg^{AWGa#Le<&B)T~$cAuLX?3&_ zTklj^7ikPf8lA?>#<~sR$jWG4Qv+2u#NEZpx`yz`nPqcB4bgDJ0?JnwiiFmN8?d7E z_3KwwN9vmzS0Vx7P%VQ2ZHmsXMs9?Q)`c48%RE?2lg%;c-X^oGpK@Tu5$udEuN#m7 zn81ET>g%G`4GvqQywT(h_5oSC0edrz1`bDz3WRG*r&*P(rS^20buL%CU&dDp=k^k zZ>~o|qbOw-4GcyMYb(CP+oc&>SBvVZP=wM^;KJoiwX0EPLaS?}9@JHaY8HhWs_EW- z$gpi5twhu(RY$5DCo{+&*0F+F^iU*3DJ_$7+M>vV(j0qLe|lxI#O9zTOVqyUM-a;vX;g> z(`z&^ciP%;V{t=69jaKU0o5jZSUZ|E+{+j-Ea8vTHChi!(X2FtY8Z@eTS;6#CVCUX zYolmRIEo*G-W?T3l_D9fYz(7h`ieJKhU>|=MJ-A!!Eq?*jE|<*)zySU5$9Pad^Rf- zU6=5H?3=5UyOueT8q|h<9rlTO&^hYnf>kPGbwcCT!_JnSt%{dtP}p(x9W%s-gJ}11 zzl5SoV5mNsu2FD!h*j}M@;o^mie4G&X^p#((unqZ;Qq@@lmiy;bl+k7=~(Bv4b}K^ zi@Q)NY9(5zb>S$fEox@8sRqSRi&_HA!(_427exJv zpddsY-bmXxt)U^b#ddx@WTkU!nxbXZk)~)u?bX&Z9Pw#YRn?8v8^Z}rG_1o{YJCmm z;5Bs9qYTNeuCJ-C3?=7IsjEj}u{?H0@!?IOn(D@czI2@zu95FUHSWjh^GMm+4)xzB z$8v$?>U||uINa51s>%L(Nlg4biDGq?m;Fe{6NulC>C4aaO zFK)$iQUFY4%fgN8>Z+zStd0JC6KR#DP>O7kOv>4S}t!T1w3#lY4@=~+5l<+mRSfx_3#+&q*8!N5}*P`v9 z&>Uw%Way=tU0qXGxxuTUw&g_in(0>VwyITPy&`q3w5x2Zu0^qSLp8D7Vp=0PT=0(zHNVBi7eQs+04`}a~ndXt#Bt+KVvqtiMC z%@aDUuB+OD&KO4-1t;q1dND^5=VoHOw$6(s@4-im{eg48fhPpj~qyz{VuPBnT-ZG9bu z^xk3T>IMwPOY1^a#F>bv?@P?2*{fm!kLu(r(nPcg#2>7#i_5)`6D>1CdA%`t75iK zsa)+P7i}|UE{ssrTP0gsfOCWB8g#cfU?eAYl+~%eE^50M>p@yoHF^x1qu7EIkve62 z50xS(tf7{wv@*0E2fJB2$Vw@Xx0X3trbJ?N(^{G{)n$&cppS#l>~6;LCaK_%&M~Q5`U4>9D;9 z>lK-`DX-6$i^JYZWW95mstiTLB@wy&+lCYPibCCJyoA?4CsvqZ<(5R7RhCA~tZSnA zxk?q{Xn2j7)l^D#Oo?dnA{R`&J7K+xwP|d0CL}&K^mA6PM@8|Bfs)I2F0HGJhG)bytC)D=WtU>B+G2jV(OPi#G6{1VXvLs$i=D~S zIkwHyWu}wGA%xa)aJ2NfMKeN;=xtKaf^4)W;^_+`(u`LX#pG{v+eJlNn>y%;Q(B|o zDC!k}mQ`;mbaWLM`k}IKhtc@B!jF#n$n8U#b)gkQR zAQ#akH8tV2(#AAV8TY(H$F8rb#^BQ@r&w|UOFGhp^Gax)p)qL*-h0U_7N=r`xgF*% z!Z}q~dXU&sS&Bsf8bk)eJ1i^hrnM+1O-5s*Wikv**&fQoWJC4pCM1jMQ#K&um5sEP zFQXzWB=4MHWGzda-sXuqua4F*cvW4cwK0-MyC3SX5?WhSXlsIRrfn7LRbDKSA4`mh zCC0`Q<6?<|SYmuEF~Qo0z$QjHsnJd<&q?JwsWDD!tdkn&qzbGZnf!Sx^Yf&HEG2TI z_12~aJ|0aC#nPk3$I}I_=XrLo@~Kx&!SPPr6Y^Y-3taV0a6KRAWFPO!J}OS(*irEu zZbIS(^WvHF;!h`xj%OY>A)aGQjOe_0y<_6Z{CLtu!)PZtW{isloAddS%dvJ{9Ljf* za5-GTv4DXjko{UA2#P@!nOTt7M*QO!M6Aaxr(TYcSnBcX!Fv z?Xm7I#YJsQoR%?;n7gFFm2_)FT+ZAh-m_tc(?~J&(-6xE-sI8bzzh%?H0)~ zuI`L+mvwQ@O>w@9Mfol=M~!jB#Z_azyVU|GhpT;;rsTN`#-%Ub=P@o*F*e5II0whO z8q1H5jC;UFxhiwo*7h-Ov5nI^A)a*G zgSPn>=SsRnaFpw@OX=cF8yoN3SQp#fitEbZ?rJ=@tJf||G}bMx@wO+p6yBv1 zqejPgB&#$5=vQ@+_V$#BHXyT^ocq;trfX9EikF z-aAckm$)0{x4im*IR{Qm9#p=;k@ud^VUy}4)FOFQ zB&#}-6`O+;W|`uC@c@pmuP%~>gAv9D4}J>D!+4_}r4n}LW2I{Fp}UlBQE&2* ze3Z#25R4}%AQ;Edns>ENsALUmY-kFPTobB^hKHNV9_43KJgKfV#Z%&GkJeqw8K!uK zPcg-_;yDx$k5eV4c%B%R%9H%6YCSUQp3I z1P}a_3WK2?Wu9LdstGmNb-yTDgm}pmFN;^u#=FLOOE@|*QkR2@V-Mw^_&bMO6J6$+sY@`7BOPd<5UQe!$BL>c zUKeke;!SOkmx{Pg&Y0pY@ivN{rvs!0|CKnR_ENC-5gJm;cTBz7JJn!J!t^f1fQ8mb%D)e<)n3%p09y>Ie4)YM|)=}Jm1p+@znlmn02XfZw1 zP#vv{xEb&PnrE!?LzAzfIx48PC6ro*DRn7T*@ivxI%>C^Ej76Bk_fYcTPT$BE*-b_)2_jif_cXLVRb6@5K)$ z&*8Zk5ctqKWmQL|T?u8OVX3als&@J{g1Y`A23cfJQQ|$$sE~q;qEoabH+ReuJP_fuCbl7ZnQ2@957E6*-t6toU4cWr1hR*>T> zvR+#Sw`A4g5Lg+;jzUQd$u-)ns_M1X6fd{Ynxvy8G!D9{7V>L7ymILgEFO>%GVVCwaJ-q(1LQBC`;|0kMM{T zTt^*D0+JHM7Z zCT3$W1#{TXs^j%jr6|rdTP(8am8x4qWh+3_h{BR0i+8E#X zX$7h>-BeeSC+Z*Tl2u<;V_lYW+9zvWxFL+a7<@oyFvvjPZ5n=~vuR|I*Y52rtB%&v zo<33;KTtulswmdltAp2GBa(QKgZj_~=kapW%{01FG&<53b|Oys{2-F=*bdi0)Hk<5 z9N}e5tOFKQd#2~K!Z|ZRS-P1ApYX0 zZLx$MbC3-mAdf-hqB0MNhsoq1V)9=Vu0)S#n{1rllD)5PbPPWE5&9k_UKl%C=o?TJ zuhyz3UOACKG}0+>Y{uS=wv-eLPeQlh-MUjnGz)FWIuym^;z-~GNf}u)OPyDT*H~U7 zoLoM!XcRfs)96K$qhkA;hPXKiW2aG4Vj|inp2Z?F>3y3(Qw|P|VQ2HldLkTBvE1Bl5UqUAaULSzjf z7$}TErn;IM3LzMSiN+xaYQ8$gLwcRV9&LP(bIgLO9qJKAC7z9-T*EwwbRA(Z)k>nP zkJ{H%`;oPu;H#)>ikogJOC-;+F{J|(mKfXqCfbPMh16wZxDmw3w%1_?q69s9j*)8` zBhV2WBWcDx!WXHt4jEW-6RFFRmV{VsKPRu1UJbm?xbGATmao{2G3( z$?xVnO@0r->va1O|JdaJ<)54UEB>{~f8oEH{11Gg0)bF5C^6MEQ%zU>rkbgCGu0e5 z*W{1$Crthnf7;~F^5;zcGF9~|!3$I@OYLu}gViA>zn9-<@(1}tCVzxKYVuq7t)?+r z`O8$Rkp0R}C=ALkIO{O-)J~?6PfKcTVjlO20aG1~#PAFFg(ly@FE-VY*qkv2IjfGP zFs$Ex*C81Gb@45XRD~OAwh+TBL+B3aO;+6e#*A)kQHs>CFv~Q?lB(o)wAe6caYJ2X zZLxC>&WV}3wfDk5f5E(xxhogXDp^oGf9|xRVv|qh(`eCCK3`D0WC0ys$D5)BE9X~~ zFPOH34r)bLT1N=zltqWjAFcxg493NEI%F+FVK@@2DA9W^oL4e5Y8jv`lb>gd6Gnk) zj5j6-qtG-a(&S^bG07Bf83&<6m)AvdZDv`96II2kH_0bsn^>PQ*}!>@&pEh&ofzXq znv=n*g6gu2t4)|NrkchyW4dV+88gr>ER1Z3)NP7n&0J8LwN5Vc#*K6#<}NnXFzNk7 zoSPXlNg)q5W|>@}^_xFYEIAM`63|<*huS!82nH|hF7zjVjA^Pzl5MS}qMZp+==KYO zZwcNcc%I-?f^!KzB6yVG34-GZo}sdSf;56I1pSe2tt-8KilBy|fuNosLhw(5D8VLz zEd-kh&LcRQ;3$G7f@2A`5u8Zy7{O@-rxTn(u#4avf|Ci(A~=p{$)MB*f+GknCfGr6 z5y6E77Z99Ja3;Yi1XmJVL2x<2wFK7?TupF2!3|WspwzPjuM@mNa67?m1h){}OmHc| zodnkrv=H1)a2LTH1UC}gLqH3jnnsXLx8D;yPVg|nZi0sh9wc~x;C_Nuf_n*e65K@a z8o>($FA_XW@Djm?1g{djLGTZ1trMlH3DyuCPOzS!k>Fi|mkI78c!c0Bg5RjDLExj? zlL-Dza5lju1XmG!MerQKc7h+NgifhF1V0ee5&TTBmEZ(|KM0x$HWC~|a2b`QRRwh) zrBnh=pb!AP_>16Ag5L>#CHRHlCxY(?z9IOU;7fwf3I0p)8NsIn{~`E<;A4Uh2;L`n zkKi4Ge-XS*u$LN7B`^`VK?|oT1U`aP0+Wl_CQs65?I!2s+}loMlD6thp2juKZzYJus#95O>nE*>sCA0H^d? zKk{*<1Z8MjjL}+OQ_I$JOl`0>#8mc@(dj|;Wnz6sxiLo=b4}w=?5{CTJWUP`oCtxnfrT{$G)zqUfUG=7<1U%Y4he6&saI5c;>W)r3+S;lo!n@n>%em$@J3V zmBr<=rj-{Jmlc;Uz)5G9P*Wp1)JEjxg7`Px8KIg+=d5Myp&qKQmmjU>cz!Y8?s?@D z`H3ZcEl)?EOFGDzDsvXejX3&6in`c8D6XNG=cnfxl8rsWm`5-7BfyLQm-SdR|1 z`-xPnxod01LhM~iFg8@E`y-!rQl=)7X$P&&tNjVk9XZw6+b7ERa^ zVlds~L&C_$YK*<)Y448DS~?#xW6fpAst|o&YszMvPq0(vZH&o7ys9HxQQf%3=E_36 zvwBt$j+WQ8^SS;~I)EK^4ac1Q{X~HG*@X7K@TafvLseBtt;fa%TUVpiTj>)=q?0n0 zcyfQq|0|-}%0*U(Ux3PAbC}riPY-nPj!IAZKbMv^DD=0xp4i6&;el3ND@CsC|4gd) z?=Qqo*(7~mA%9VV#5um37FjDzj@S2O$+;$axYf2bp+T}X5l~n5V*;&w6O%;LeoD0Z zYMfsWLAA8b9>i|{zGUuicpSZHvrgfBK<$f!H#s*AfAfbi+S8Q-_+gd!XWDut`p#*M zmZvOA*rO+}8meq0<`~t{(r}|ps>6y%+q-*=h2^DvcvHKeZoaezV-BEC9zvB8ZCV|* zEo3)3s^sOAGrioJ{B&VKX~LP28R5$P3y)J=$j?gWtZB#2(uu0dbz$0Oh<(^C&8<32 znwVT~O=-8M!@Rs;n{UlYnZkdPJy>w2|Y>EkRc4IFQ_>d%LcxXaZ?0m*Ia#+Vxw6>qpW&e%r z6bjjA9>~`pz--Xm?tD z9#CLHqt)RQc1Ac{zc8|?fwqM8COc8kv9-47^0bW^Bxp_1#=6>Rv4#EplIoJvv;?JN z&=sq*PDWY>QK~nF={MN?^>xukxmZ<1bM~fsiYh#Q?5FJyxOh0{__CKIp{Mr;3s&fr z>9O=BXWsI6Cbcz|N*Q6Ry{PqBaC^u0Gd*8mcwono#ZE1$q;HNsb++^uy+k}mirpm5 z6nyfueTg;G?6S-&h91@44+Sn;R^m}$_#)^JDayydluuv~03CP-ywC}EdHq`XMqapSL^1ci2DzBL` zzd}pI^4i_L??Lx02U2)|_e8pS;nPi^)6W4zZY!{gR!}N}Ex=VZxC_)4&`MiDugGoz zQI@0a0;3gDDso!Dce|{vH#JT_>kECL8}x;K_}?JN;(hQ*mQ^Y5D~F&Pbm#q$c_`t~ zNwQPH=CgQzn}{p$Uc>9yAl9B5%-#uR@NP)!vlBW6v!4K8_AW?o1}($C6FSoi{Oi0E zGJ=`vPUv!nLrhxAwGZ)q%noDQd*dNHi!?V zpDM=G5ackIZ%H;(N$gOY*g9-Q$7^~pJEu>knyK9hU0WbCPKHlbk`J9=jBIkUmECDF z-Dxu2X)@huGTm;Ho(;nR(`4hr?Z!XDd+KC`)p!eZ%hYbf`$Dk(M|B1857huh6049y z-J4+`CHYS1(F{H8rMV;mr>hlCS1X*ZRybX)aJpJyca>5>OzE=I*>FR_Y$>7G^<S{C3X)}+HKs!Kfj^v{dsm(L7x76Q> z*$>0e9WXA|^f0P_7YwI%gH}2_BL@@ohb@-3LT*Jac6`J`@lIR1w-8yr2u48#4$3k~ zND!ZoLbEX%yG(4J=#Vs#=ka_=@ctuqqIC|X`7TN)JCsg#D4pyo6>Da>5)j;F-Yn5|B2EGo|G1}L+SXxP3dV!>FG$>SxD(Q{}ZK! ze4 zA)(<(?KM34fEvCU8@>h`z7`w44jXPh;D!(KY=#ZGC8^7Te0EWu;JUW z;XAP5I}fm>#pr%zYWi*{LP?l$dv@F`c9P?{6V382^hWo% zn(O5>*UKJbg^n9py<>B2$-9}AWwTvST-FSurAXN#n7a!OCW)IBmp)q{QTC+Nnj-T62=q0FmbwPc z@}nQ4)O_L^G+{S@Ubu~nbf(X}?BToD5>A$jk}*%Y5_}j-&Tqz6@RouUibfB`zs>mf zfc^J`{dbG~_oh!NlBJ-gu~_pl@?gBm_(=rRz4KWSk(fd9T?uC5Unn4-uJzW z`75BiBw#mukCO2NO2tno5qsbz_!ZuO-{5Wd6UqJyK7xJlDH_MmnF8N14&O5ker7uS z#thiYQW#^Y_@Bu-vosb!9KgD{}0n>$QD^yV^7B0)7peZ+iJX(_z?@dpNdRadZEDKE5AG)#u(1#6#VQi2q5D(gv zn9$dj-98womSRdlqcxD1VF<;cD|F-Km{JqyoZ|@IHtXLff#3OLR;aQ6Y?OV*OpmwwXV#PtLidau2c`Xa`9bS8#WRYHVOdm}_?69ejmhu!m^_a*#u^C)e&usz(5}HA z8P=+3$$pTdqa}>Vq0X3$!)G)ZIFF&VU5`|5C{%;~4M=rqKt<`VS?n=LH%T)l^?fol z7@#!dmL0FL=6z4+#pq!Xyb_j{z{otC)<*w zds!&tF3$R+71@1SpwZH8IbIDe87o8&53ClsRtKZl;V_;xz(m%F9BYDNwh?Br%`lH` zfhBA!tU~P!vm>F79R*w2(JndLW^*PC-EG~kb97&Ut$eYRxbZN$}-g*;BSRZ71=0$o6Bi( zjTUhWtzv9xg{}CQx4;qQQUtS60=MO&$q%{2Zz&pNU?+mcPC`R@D)`x%Fo~Uwj64Ts zvU8z?osZ&o0nBF?!XmZgBr|-u zi{Y#3pTuG?v5uo<^O27OL5EP{W=_ z34Rf_u$NH(Uxt&|tEm64!P)F}xPZL@SFtxSYJCgtVE=L$e;N$78IMe}*=-=>Eq43h z23z+z+|Ca}Ymq47D;&lzuo-_R_W0-+*N@o&SGU7;S_@i+e}{p+4n&e3^dDy1fxMu9 znVlRO^e?xQy@}2Kb}Yit$mfh>X@ZesUF6+F>uzEzY)8%q)Vtxh7C7F`{5ani;nV}z zM=0nYqo99+g8pw5^iN?1`wR|dpCj+TK;C}^OWD_O82c91vF}jGzlV+NM>vB01l!pj zIEDQTXR%-4LiQ_M$9{v`*DGOLcY@B^`jQA8N*(m z5aacUJK%?QtjQ4oGV)k~fA#pcQra`1e=-e~o91hP6amiB0p{S}QTR6@=s(Kl`uw0j zWG80@{YTo#gM$85@xfXdAFLG#gVl~%I-$eCip`XBvAB8GD z>l{#HtU9e3I@x#VB~J^e<;mfNG71!BH1aMFQj~niP{u$&84ClHaWGUVgdAlej8Z1S zSY4|?djZSr-Yc-m=28k&c<`ap;lmyF zBzqe6^7I%N&e%bsRxP=Jk7ei2q>i823TMfVpPgh?pLKOpE)^@~C?a#PoAXda7DIPs z3G`Mfpue&dhA7Lhi_4)EaWt2Kqol^TIkV{D$kCb6YI#ivLoy5 zj+~Rwk@I9n&fjlG!q|~D*pX`NNCZ1lhaIWMjvS61X~2#|u_KMxk&XXTN5XuK-I2>| z$;`I{Wt?KwVFyS|FTiv?O}$#70B}H$zkp_27Z$3Pu;t|Lf{OxboOHSQp&S8*awMcH zM?qKRXy~OJ1A~=gk>u^JxGUfBMcI5U#+(e&VGv)3ilt!O*h9{=I1GkPNOX0QS6c5_ z$}D_FmhUW9+HOQT(vGzj+7am@{2LtfFQm>jQ`EJ{N?G>I%gN`UWx~FXtgsg5cVMqC zZh=b*)$AugWH*DFQ>a-C31~Q=Yup@>QL1thD&NV-fm5MC`3DZ%=`c+>1C{J7n4_Ex z3zc(F(awX_%K5NSxd4t;E`-ySi(LCQXW86R;0(S&#_t8FU?U{AR>KIn!^P1^_LM`c z!m*IfYue0GsmD_mNUE$#1RR58$-}0fzk|PlpA1zawAMqZh`5_tx&Ao4s(?|V3BestWfTDtvIc+ zdo=-udMr>h@TlFF$861+9`r9JW?DQgqbcVV6*-ctS7KP+leC8Ra(2Q$Wn%D7xGJDN zg#w7;t&*CP+mmMdkK~(ui)Um3L)in3>V&j^~zgNue=RW*~%|4A0=jmvKM2neHh*{*u)i} zf6Dh1uETlUa2fXt9VT7qFzI~TH;spt(nfIDgt0^^KO)JvZ;LSwWyf-@y@URxq)@GJ z8+o7G;asK z1L&`iPCcgK*`(fNFgxD^cgA!)C#K^$ZFT%EspAI0C0 zEoX7eg*gUeKhVTO0q=)Cyg$sqzQlMv*rn$)oj%TVxIV+~V+Lw`DL*=?kH^IN$P2J8 zvhdR^8|JkvMzcEhA;Nsy4nJo7(X;*i#quVX0UE#i4y=v?s{1;7Xqqt~kTZKspj`sZ7z8A1O7D^(cuH(9AsLH|Z4MA_sHQOtHi6!eC7-vc`@ zhC}U*B8oV7(Y8_xZH{6NO5fw&BqdQLDQ$s!ACh&ac}?fCGw!n{ZTDH5eRw&j6XB+ukb|gQP9mD6dllTI5DqqCT=8M^RyntpJ~K1ZdncY>8z2u&$Vot|V{Ep@_)lgT&oW0TZryJIr0w@pT&6+|zV_Sz1jk%12) z1Fg&CR(MDn>fN!JnvC?rZnHc9V`M-xDfl*Q^+@Q#k3!>iH1y}kKn~JSz}<0mp<@IJ zZK_Q)9>+=3+XVv|%k<`8Tzx!0A<6Wf$WOBAzs{zAygeBxv-V!79~YEadoSfU+>f-v zqmuf^+|)nbmikk{;HP0sdOCFFXFxB0CWee>L6DyfWBEBQ>c>0OkGH8eU=%+Y=La+^ z=wr_cf^t@HN)q*_@_*PK_ilSu@Noz0)T3>WO93YJm;y|k6&z|Q+OVL19;IlN+EThs z?I;~}TrT*lwA%kfq1tB$Iaqw~BrTE*3aIzMQe(9ly4tq7w@O_0Y&~fX)0yv>>;@sr*hjo!<&) z^4s7demne=-vQU~yWlo{H{8c}!Xs#9{>5A11Aecw=WwR&gfz+X*a&{iPgA~^GnJcc zC#1lK{B*gV9)=_3oJED(a3)xaGLbk_In$Xad}Pm5HnlU7Q|xghBOR~}caCLPaaNOG zfuz2O13J>Ou=0^=J+j6%-D_N9Ga&a?qUEJ`qsl#kBtMGt>c?OTe*zi$B+TJY!94y9 z9LAr8O8y*d;4eTEf6)~-ZnD{uZ+m10lQ0@@8#bPWDq(r#*>Zaelqs=|D=n7LgZ`+T zXSB244eV2hZ!zB9{vYK#kiP@TpZq>{pL|WsLw2#e{Vljr_TbjwAB{l-e`kB&?_9g_|EF|k z{4Khh_sx=}x>%+BjaFzpwj!Vf^cHxzPy|HG9lsI~aRI&xhM`!!fg$Fb7+$^w0sc0; z%l``>@z0r`f62P@uUJq14eQUpWrO(lY$X4IjpaYGgZLg+#D8Y9_%Cb@|CKG~f3R(Q zFFP7#_EeRz(^bySQ&qM@)!0+2U@xi$dqwrJx7AekuA0U^Q#-M*)pWK;?acmAGZav} zC_?S3WT-uqK58#zklI@rt@cqSsePrw%(KMaR+xY?M6L=kWf1y}a%o3CVk^*V&4w;&4)j!Wp}#r;hN&Z= zKph3s)zL1uSL_@>nBdG#Cfkc)!yLC)AiHx>lH1$CFSfd)7Gqs$NJNz8DYN27CFJf@ zJF+^^miAhb_MpGkHM_xyq7<~QER(MmcZe+ZL2KDVi!=F1YC19X; z*ui?x^_@arW{N-e3TVhok!`K8wW19FCfRNF%+!@DAd|#C<6U<&8t~l%?~T)&AvaTW zltVN_YD{T}0xS^lWxT%&KG*?1e=R-ejSoJwAC%Dpr$94W)70c(`J;HSjB#?INtpwt zyXCfJKG|=X=DnX{N3Mj4*x@T-L~;fHwoCeCNuRr9rcRwSWjURX(=+uLU15T?}8VOW-?oDg3G~hkfc{ zEJau`3V8fBNMjqGZ* ziQTVmVlSv$*z4+6_Ktc4dtW`0{YO2D?NyIa{OWe4uX>zPpq`+Vs3$3l)svN_>M2T< z`VXaEJxwa~Zs@|w(Z13w!ek>Lk59+QD3xt@o~@S8E}_#FELHgvpV9uW_14Gs#!^Z_ zECrS9Cw{3skiLd}&o9H2fQ{@UemTZ;25e>T@hka1(E={U`A8|ocN!T1+oW_-!m-5w z<#2wrG$|>{dTCrZELXZ)XPT5MjLv1*1mkiIzt%D?N(R=7c9~&hY{=lla!~#wY$S0 zxw1)gmtq(E(7f;L_TBUhyUiT@>l*au*iG2=vW}{?ZDTjvHufWf8PH>X_s4*qv~{Uo zfbQTzNK-F@uIdhS2N$C&xCF+im!cM20afZ%uvWbW8q{l{2`3BN)ay~|Z-A538{u^I zCb&es8Jg8w;12aRcuTzlK2Yz3|EPDt59-~pSKY}pbr&<#dsr8>6{Y@uHduW?O5<|m z=Qf;US+hPIz1UJPdU-lG#aK^tDwbFM07~q9X{;B&PI}dztP^j>8G?p!_UHTtoFnKk zi~+xi-<;%CZ^1c(HT&vr&%RCy`gL1Uz9hE(RH*KEkEXvp8yjHF#`-%8AOqYBAl*F| zJoi-O(md+tm~Eng_=QYU!d8s>7!Jha=$D^>4E0Hvsy+<|tIxn8>T__Y`aGJU7h$FP z5`@*4p;mnrwy3Yc@#^cYt(cRX)%0U57Q(?W)n=gyM@V*Y$iVpjHcra`Tcp>%JxQ_d zz-g8hglw@_Ir|6wBE~L^=YFNbWWU8%R(^M_tjGh^>buyH_pl@HL#Fxx^iw}{EqC^J zi0o+-Y2qA>NK;VLXu0#Qq_vB?ac*Z3v-2j8?ye3F>!Hq<)WMvi@AYzCqe^k z`?|>rE;q#(Mav8MqXfF}DIszGxZ1wJzY(x@<>^TjcmXg+5fX-^o&bJ%;xwCu80rdYDW-Lj*)Wk;U5 z(}sYe4F#bML%9i}++@RKEf1Y{gZqQ$7Nek01hS9E%LTHvp;d~dSOBD9U zAsEeP$D(;=RJ5=ZXM>;ll26KO%aJ#SK__hmOwy`QpTbbCt#K`5&2{`ri9BV@Foq&; z@>tR`*5mvMoAQTk%0oeat}W+(V6Za{dytCP2}$J3t%_`GCe?+RRwv4+pE-$LNyDym zigzX5)fIUNMXSTE)I)cz0lU%!W!ffKsBMOo+7`!6PO=yKNjXDK$ClayworEL$)t`w z#hem+9hz4b}2lrT@G(*SHU~l)v!mqmI>{8)>*rO_1125){@S!=TRy= z?xglODI7q1=nLS#j;{7`bk+JojI+*CL!U`ne0i2XXUqAYb{MyfmA1RjUto&^eOW*) z+Gk=%N>4z-&^;y$Wpa)a6NWxs@hKdQw8uvU8r`MevpY7e_2$=LaLIty=cM}^Jymjm@u zMV?QJBwvWl8QB_peeI?8y`ww`| zy1>#J%9!iUm?JY<-0RzpDqT#wTORhakJ|$EZEHr|GA+-TXis58@-*`JS>*9^$lvFo zRC@sjO7(0QQIveN+l!1^fSVEkJa z^pCa(9#Em8Qy*yUn&&ysxb@72l)o z{D4uyPZ%Za!3g1Jv`xR_nErFfmOjiOS8*}SYNHZ^6W28py$kX-%X0^V4WVdE z{>DJ302-E|yV%fXxpm2g6&mds1Wt4lx0cyfvI)iMa*)R|*yYw|16Hi4x3b|C0VAOI zX<@-aUx3bonY0VCi)9B=0zSFRld-CWYp<^YTt*ND4@2V^mebg%`T8bMiTI{ffC)XMtIzc~xAU-eyT=Oe7q5^3e zS!nWcX_;w(6#3a&kAN9S$xNf~)Y$M{Y}D~-ta;zR@uAqoMhDE8G0h8@x3|Z^xh|SB z{vXgh&|XuE&!tn_H6blveO*FwPB!m2;$hG~h-T(}v@76dcjGy+w)3sF6Ar)lhsZKW z@a6+AGgy|5LT0%^C)VuL-3#jF+^ zLEmNTe&Bj%(Dg2mu6Kh;dJibl15m8@gjsrTn4|ZBLv@@V>shc&?+=IR17M{-5Nh>7 zaFRX*cIZL4M$d*D^&GfU9|8C1BjFW&6f^WZmagZsOnnR+sE=i%^l@ywK7mcsC$n|> zR92@?V-0!{J5ry?j?)ijm+7!s`^y`24|&t-q=hboFbPs!64 zDhKIHl<9hfQmQXiD)eQ_I=n{o!;~g{g>sC(QaMhqRIb;<%I*3ZWtYBI`BY!8e6QCk zzv>ZXuU^M<^uu|+-oRJsO?<7sk)Nk;;g{%J`BVCl{8jxZ{nBUAd==WslVa=g${gq?zn4r?O4)P#4gMy&xbI;oe~Z6O+iGeL+jUMJU8?%}KWI~XTvER%B?G3lVI8T?&L33!FitFMc_)fcmKLpq$T$G?T8HHfaU)%l_J>U_Pk6c#swnmik01dJ|h{4O?O2lxV7 zq23JB=t-gTL^Q`I8IIaaw7pG=^foC8yJ-7XkTJvg2b)x3?JtOc-og%|recd}Y;wSe zyK{LUMn4Oc;%rFM&w&j6To|vP4^#9DV7h)0lpfBvF6LB6qm;hd}7Nk*5zsSN##_r9TQ;`eTr;*_V z*fo-WVQoCXL6QsflPuk_cV8wgh~;ri zrreoL-2tgVbtmhL(F9#J8EfD)#*Q`Ac&wpPtl{;e0yo*tj}-K9D{wg6t=z-^FUlRX zl$)Jle<8v=gHBmPKfC-ID*#y2BEP3ii#4C!QS&40vdb*G;|3%pU|5r|8m!BV)s@px zT`?ZiSal@?a=Ef#pwkoWESeoGah7|wXOB?Y4ww)~c_ML4opL2@OAy(GotpQa9nfPv z$TWArxIoI2?KFOf#My1D3J9tJLp4^qxOwl?{q(!R>UV>?-y_-tQ@(Zu;W%3lhT4JX zFiQ`Hk)4_ze70@KzvH9%CUk%rq+kT~4V}w^3^kpf z%)dov&`Z_%clgYJzAES6V~G@=2j9xr#|Qn<^U=>^rotfp7pI@;Gcg|fozqWbrlI@z zh3~#V`C<+ZCQ|pJvVu`g_^uyuK_A`iILSU2I`Rb_-kNI?crv zyO((6!njxrLM#DOR6rN86#9r|Fib3WE!ku{C%F1a;^_p}Ad4;NS7M(t_CaEQ48y%@UDwRHz%22yrI>n^s0Vk(^0 zjV=`Xu@pyJmf~o)r5I)D9?h34=(mA(v8A*dlR~R(?YbSTZj&pl>}rRV@sp~a#aPVa zlE(?y^aTD7G>^8en+#?GdaiA5+a^LTl7ID7N{mkN%y`kFvXzD-L_ zJD<<&uPPuG67) zU%6 zCRemGPcHCq2LbH~$ZTaRabkeJz@XrNRWoGRPgLtkD7NrIA?)ga>!)J((t&Xi0!6F_ zO;kdvsDe%+44uVV=poiYUr`Mc#Cn)2YM@F)V1uZGh&UX!h(_2hn&2N|6Pzu!z&+v! zct~u6r^J!)lQ@R;5ZhTlaU2^UPGGs>WHv^e!X}H;SdBP~)roW1R&g#nQk>7O5f`$X z#6|2@aWT7BT*h{b%h|uhmF!FLPxg(tn*AoOQ$RE;Y2qd{{{OPC zUCIh^4;ue_l?~!Pr9reR+r<6K8R7xuO7Wo5EFMyB7Q2;~#iN{wr?@Ge<{9D{bOO)u z>EZ=mCae?b$Kw>Y8J5Z!N~*FAE|*8~ePnlHi~YRZp5iWpJyw*?#wfk*<3So4_dn5m zt2pxYul7Ne%q1U(HIvsP|*%9Aj; z6xp^rO5I!&lP=Bsu9u@TAsG7!F8OQ1Y_01XZ~3!h;!iLP2I+4&?7Z@+ZHK-6vlY^T?e@I(+8oQsoNl9j?CI+QHu) z2l#g&`IGb9+RinhOw7v{+Tye1|F$78F=iWLjA`EcnS3!xzHrH+{M8ks8_Hr2c*+Ex7*$sg1jZOkVWP1NCL4!Av9SVX z8LMEv5rPV1HH3^RSZjo#(O3gV8*5#0_I76r?O@xat#v*NF<`5jqWX|ujpSw2)WkTO z{t0i}XkBRYX0*c_e_!cj?4H!fo~SLX*4>pzn`wbji(QGJsrmnU`wsXhiuV6!_V$w9 z+bg?!w2%Z6I+uhV2qknvOXx^PP?~}ik)nWfk&XiD(W_BE@* zh5s|#vKQx)nE&s6{kSu;OYS@0d7fvUDLXqe21*KJ(bbHD8p5MCy0s0uKB!>OEeSCe z-RcJ2iW*&SKDs_$HXKWJ%_9S8Y|i$Uv`y%RG2)N}i*bNBSmjE|szCsy87lUgP!eh+|VXC-s z_W9r^X#Ex*2Z!(kLCjA=0WF1DkRi-N+gkvWghen*SPXN8rLag? z2FrzKASgTwnZk0&7FNPd;d!_%ya0EERq(U08vYR05KdT2oWgn{3mZr&VIwIgY$i#< z7Lp=twU%Trf&i~*jc*WQdDWN;Hn&LkkQ#=u+=ecOvG_?ft?i+6!702Sdr)*PI9VS? zlO)Z6N`%e@(}U^_U$9nRybtd=>Z2gt)*HG`rilB{)mVeFh;*1dN>@^hPY*bA$YVk1 zggvYYI5;2^gV3mCM9|u(-u5bQk}+Q&sm<3%hQ89{>qk%(OwPO)_61^|$8D{9+}3tu zZDEXy5-4k@&U6SeP0;78sg*r$bGzDRhQcmX?{1J#?Xs{JN(=iSUf2%-AsgxlhoOOR z1l`V2XeAtjfx-!RRCom@2(Q63;WTU!&cb%#9PAR#L$2^9oD?p?dEpYgBV4w6Rs*4g z)_IPE29U;==F4bS{GOq{0PIGmQC8c^zBoK8g4*qL`ZSx&=oOHg=%apf25P2# zIk?_x{t1!7U*Hw~#-`>TL}PnUK_t*X z`tubu&k_j_8naXVjSoN^XiS~?ikgo}gG!o@aiW3OMY&YUXQY++Du!H$VWi^&a;mYs zlWxo&WUL*WRnQVeO%9sb-A1R>R1+~38IK}6OlDJ`G{^p4YOdX!v`vykA4G~WD53%h zq90Plk|>l?&`~T6-NZ7`PmF@0Vp$j~Mq7eO$Xf*nji37z9 zNqkkl8vbIa=5nj&GnfFMV01Bd8yj5pE2P^s#prfT)w^9&tZvs-d$+4KqqgPW+e)ki ziDDI~D^`X2Vs#Wi04*aC1&{=zOrJ9D ze>UR3Fs6<40R5hLY!}^C6j_tX#?=!qI-r`Sd2t}Acn!r1bxztCSB8O8oa+$-m*UUG zYjM7d{>@6`$}+B_S~o!dx2;B;jE(zzw6Sk6UV!mUj2B{j9pgn9zm4%?jNia`3C6Es zycFXj7%#*40LIUx(;3rj@+`(%FkX)F8jM$9yaMBu7%#&3IgICE{5-}}F@6E#$1o12 z(`|CH$tsM8V7waR{ur;(x4tK9wXN^7$+~p9;4ho3$G8c`8`5c4G@ES1I1%Gb7+1o0 zvsGu>6kKQS;1~kLwnPxy6OY(|$YMGvDQ1u|VrLR7b|G ze3Xn8A0rdQ31qT3iA)nGlNsU@WUe@cJS{#+7K_u#GI17JDb6M@h;zwW@hP%FTu8Qx zi^xmjQnFKAM)ru$k}PpKIVi3qN5$vJ3GoGTN(_>-;u>;6TuUyA>&aDd19?~6L~e+i z$;aYWa$9_n{2*qM-^G`08}I+2S1UB#JA5trt|Fwm)HX*+WQtMu&l|2hJ^Y6*+FU?m zqa%_A`rJZ5LbTm|GgP$uYm^OS5<9(^$GPKB(@MbOxM>ouc^DAV%>di)_&* z`?dxlBJA9-mH9ls@DOXHy9H}gYfZT#lU*H0ApgCHINpO^zp z#9U}59>O-`FtitsLKpEEbQe!RU-2Xi5MPB6;%hKkJOvZQGca8|3v!Cx2BU`)y8^s$K{j8bdnp68w)*raD=a;bwiFCBf(G)R+q15 zsHBgv9p9BOI-uVg%>+8dt1qXeuW&Us0fp|=L2vSugrU0G}w0L>>XWo`?8M556LFm@-M&@KZ9E0=a3?P0gc74pp|$FRdX9U ziQiyrb_ZLt@35cq1NL)%gh#}?FhTqoo)mw9J>s9RU;G=6iTB{7i-XH9hiw7w6>D>v zD~38!jNN=gXHk-^CS$t3te<=5FxifS+a2kIegcTLhJ&TdFwICqqZw(3>Du~zNL)M2 zeQ~db#k`7wTiCzZWBV0lyW;Vxj;?uUhVHU=W#}$@cZTk=_gF^Po?&!)?WaA7y86;sTsD7c0Fn>{WNJM*t0nn*iX)8(4k;>bBO!E}iGY|Y^?+6#3F zAh<+uxm-}fo3Tfj~Njp~wlHn>zy0}V{o~|;ax2qW$;A&0=xmuEuu2y86t2KGt zl}4ty+LGz6_GFH$1GmRDiQDgboIB=vf;;J&#+`RP$z63#&zoxJ-Z6b6cag8pH^8w( z8}cllq7Bhp+y%!7+T#wXmJO}fL_>|QZ7$fVWjLQ?HcRb5Ur%mc3EFs9H_JrBEGrpi zsheZR;+Uhh9@)$uFTRd{o9FXzp4DZCuYlJJ)i^aIJtY zuIHeq>v`zy3c`b~Rq&8&HH>qug$b^8Fv+z6rn)x59@k5--?a^nxwfMx+y&=dyKV0| zE?5oIDP8!`2A(#B53e$W-^ddFVxt?~1{>RO?>OS~)yepLaa5T5;$HE^yo!Qb*uUB1 z0Bi8haHO$PQQ!2FgnMluMqwjp1(``DeRRw->KtBPnwl>+2rQcN7Zs`02-Myo& zvCe=Vm`3Q9-P);ae(O{=y2XuCo2zl3=8}`lg~}OG&NEOkB(I!2coUHRDw`anU-h4c z(%J+MT`J)@Omh1~IdjONlZSwEMwi9az)$|h$sAxZyo$Xoz|aypk^OD0C< zz0p(&kvO`mxVaF;N!&gz3-9kbnmC$4M`PV$OZtV4 z>n?DvpP-uS7pUp_73#Qthg8>}Fv|5ejCb9Gi4uWn5)WIXNXV2#*eAIlOLD^z$pf!S zUN|fH;DRK>B}s*Mq$qe_^22qh1Su_*C1s^(QbCF(Nm4mdM~Wj2rFhaxszBOF70C#x z3K=I=B{QUIWPubQi=_neyp%{bOEt(&sV2#lYLi!`I^->>9=R?hlbcd~j+at6NovHE zkQ#GUr6yd8l*+Y|nsObbX52`r1vg1*#m$n^xVchmZl2VJ+by-__DSuzEU6urBX!^o zNgcV@q;&2LDTDh)>df7hx^jO?-5frtyCY8O;iw_?bTpLib2O29JDN$o94(|ij@D8? z$4KdZ$7pGgW4tujF;RNZF;g1im?sT&ES2;Zh+m=4xekrB6APVm37U3_VFVcmQG6<0 z>%h%}YJ5|^8MwI=n8Y`y3;4NKFp6*CXp23PNsz*~)RxS|!b-js-x_-^C19On1>XiD zQO7!7BqzZRK8Y5Hv2`Whqo5(EYZKq4QUZF_)gZoJo-wF)y8|e zPTDs5b{Ct3W3r2hx#W@q3h>+oy&muSuih-)o1y)vo7oq#eZZ{k)gz4pK^g-dX)KhG zP)*XKP+1xe>Cyz~E=`2{q{%Q?ngUNtPr^cJ20SOtgrGFX*2`IKzEOiE+Gzv?JGrxr zkCz2ljzjIv`Fc5Btj}jh8)uDH(PkSi2kAMLRh&-(O_neTqo@qdek~dBh_v;*rH8 zo`b{>BJo2=JQs-{Dl+lDMI`=l9&sU$xL^?%ibwny5exV< z+?!k6n_Jxb7m@p?Htsfak@M_Djw~McH<0@U)ahLMAOU2{<6>`6Y+;1cI zuaW!hB6A;HMDAbOxVvrK-Fe*I#pC`Ra{nH=|A^dwK<+;lnfn7pf($6YQScL}+>k-HbU zdyu=g$lQnV!wv5Jjqy$lGW{k9PJRcne;B?1eUa{bJ zmxCC0oGrg{Mt)8laGUu(Y~|M&|Ar1aJ#>u{%_>On*%g{qy^N= z0E(xlx)?x6_A_$-?$sW$VuBq&s`tI-T=j(f?{uoVs8ZT?#7VlZfX;M4NLshE%A?L z6^NCMUZ9p(pjONRjR|WvB|`1y2e#d`!veI&0(8Ivbi@K=6k<1HS;U8jCEgW@cViMC z#{w!97U(_%>cs?llm#>-EKolL>dyokZvo9TL|NOc<39!=))eGjn^1o;jr`~QnQ2S8 z+=EfN4}jbKASmu3P{utJV%@`_iu)m`>3-NI>Drd06D>(U#wu6iu;m(!2**8~gb zexqFFEyiX6e+l0ERV!2`IQ~&T$D<#ch&D0_**|V$UEcCzip6>&i?tM%^)zJtB$M?d z3+Qiy^(@1%2Wn^&jJkQhb~oI(8>HR!G42LycO8wp?%G|dao0n;t7+U#2&w%OLu&sd z277H0hI=-ucMb|>E>@nWu=32q+W#~J-1AYr3n0b45K`TXAkDoPI=YuY5BE~&<6Z_2 zxSxUH?q^}FdpS&SuYeiuwKk#7vP@x`CDh3*p(ckF>P8gmCZrmf)-o`4$GL*U&t7#UiAqJ~BgVh5eCjB5oIeL3=33I=UCjAyNxPr2|YRfUs$}!r? z@ky5MS@62<-$T*A&(!^N7SID>fj&f_kC;F+SU|3@K%XJdO(xJx3+NF;n3YX^{$bPS zpQb+l%AbKY*X_QA68#$6fZNyxe1ko~J5bU6olUBhEvd#?Qk}(g*?)z&?7s_g*>}-p z|AK1#6v{ z##+I$p9M@k|Dz?*%TN{dT#c#cg)Cu2gcU|23L}Xrj79&3Pi^E=hskF#i_gfgeCi{g z224InETDl_7d;QisLmW0ZW!rljL4}Vdzzv?nlZZPvTYc-)XHm=kykauc7){QusIHv zC1?$Sr!@*D4K1N9#CqC86;B6S&ebe0Qr60OnU(W{mdnyIq{lRe*dWi&urr!o7w~zy zLJ3bd%(Mr?Z8>cjKEu*a$*}tAjZ*Bx)X%dld*PgHm;or3flPZ@Zow=u1klu|gQNb@ zBQSib*&KJxbGH2$1bo}O?&bLp@mt~y+KGe)4m{7H`8+7aGFzWoQ;Ms07*mTQa+gb*@mL&!u ztQdBq81^v5u#Tyge>hYf<^ZZCi>a3NOc*~KCKq82F<~|^VM?%Jjv>r(Cd@_)<}s@Y zF?3tfrngcyy_IH8j(J`~y`4h6okqQ#LA{+ty`4j^^#-FUaY98)KbyjiVq!wvW^A}o zjOQ}u{1!G|SI}R+4dp!73K_+0W?6(B)*{|Vi}-+P5nEV5zOXjQ|kZI4CnFF%#L;6+G1q{f%Jc!;% z@OlM^^|}ffkZog4sgGk!sXrQSO5N)P$?Jm>UKz@J73P%s_V8VTm~dSJFV-$^X;8dn z3h5H;V7j7MrtNxTP&BbjSG1D}Q;rQ2k1!ROFuN?6D@IX=8-}9SgT978(cfC68+W?E zn;Liec(|5vr}y3~=yzrZ*K|v)0i1T?h_@<=uNo?+I{3W-w7LX{_a;KXn*=qzH6X=X z6H>jkAkAAFI(q9sPj6l5>#YYvy^U?+9&U;I0ZZJwnQ|)6mQyp7Q*)-A_Ap`M*f2Og z@U~&X>}9#Gdf{A`w>_F_2d3-V_m4TYdZvlS+jFkE>FUj~k89W6`|Fp+v_Q;^T5yg|8j9@RP9c zlbMA-$O2+DYC6zV1e(SK%4JHiDjQ}d7IhX=iig4*Z8e+GR<{{#z-F`wY@?lrM*B1x z?R+%a1!%MjQN)YTXcwc=E@meFtZGp!Y_-V6YH^5JEnZ~-jSCBO41ta_fnKwKeljY?WV2$_wO-lfaP@+aVWyL9 zW6Aoqv19{VMM|+%q=vSN)F{MnHD>!Q?KPek$0=SMr+9Ik;>B@_7sn~yb6B}v$I5jc zYI)y)WbXxN;(ZfZcrQXb?=)R9_!7!_Zxu4GInC<)PcC@2N$=@>i+a2RrM%xUJO5`2 zS@gj*DQwY)_bz7e6ZTMl#vbY~%pU4lW=%+C+ueV#Cj7yy3FlY_+#sw0-vh}9Oap#B z?AnpmA#ab{geWsD+}aVJ6P&&X@cJUb?-L-#Cqlf>1&KaSA!|p@vkKHMT!DNF7D#0l z=nWQ7R9K)=2vnL0bb$r*a9E&d1d3q-y~zS<9Tq4Kf#R7!7g<2{!va-CpejtDOBT>% zL+Od8Pigw^Ri1zd7`EAs+P(xTPy~Fxem=>(ah%a znlrtIF9maLh`BbxTpMGqsf@K~PAF~V_7<}v*doNCwkV(@=xYh0uQghB8;JF_EuIQLmf?E`uz8qFllU<#}VcUCd>y+n6_+~ClO{k6XrV0#2>Pm zcssU<&qlS(K@*?LH1Qiua_!mV<|DZUOmZJGVLGs3mLSYhCd@}nn2v0ihMy`xW=vdCb|;w2>fGE)|x zF=0BfVRjK6PrgWTOjO8m7IL^zB1Y>_;Qbf+$}$RPg0M zRo_9V<2wY6eTQudFh9A9f=ZSGK4+G&GrNSxv4kg>CH#U3(}fN58p51n!hFeu>B@#V zhcK@*VZLI*bYsK3i7*$LFt?a6-Ptf#5aw+r%-8>7F@*13gn5q%bDPPg2OH)F!hFbt z`No1-W!PfczcoP93-n}r0d2a(_bD>CiC*AyDDC?Ko1HJwC~rY6-)%_teFLq1cWj24 zW_gAb%P_xX7WY1Oaeu_j?lOyehY8b*4f89){Kka&j@6p?4%?dli8b;sW^4XElTU9Z zj7&h3IVPVU{;@EwdO#kZe?dzh>kW+jShxYL908InfGmp;BfFrgEZG!O-N;b3^$&hz ziK0w6QOG`omzkot%K~Z^7N`UQm1F|_#FS}YHcS-Cv@BDmKePDM2+OA&@+r^c^9z$t zKQ>H7O}tgsIMi`HcxPfDMy`Fg2JkzlR_H477DZ?`IoXU2w|vz%3_( zBG-qqa!MiNpZ_pP4`P#Uf}~TKr2k;8`|6#)nhXxN?n`cgI&Ot^qczrzHifMF`jbid z0XF6KNVx-(@?T7t2iY*45T-K|=5Gte_SuwSgJ!vhge`Y>#O(=Q`94%tFNUh@pH1Ck zRhu4Rs|^mlWaiMz3CxlYWy1_YhJ#rpcM=w#?qT`hz)NNhyZ~K5qQ9IRlg}_V%)`iM zB$JPW2{W7xGX`PCGGTZo%m_9N4$EZbu*~TUUyUEKRpW=*)%Xdl##68wPsM6H4Q*q3 z!PVFq!O}%^SY6;~OP<5jMWhMD_0VaPb|&qSL6U0H9u*|D&GaKdQrS$84w5J{Jtjyz zW_oOp5Hme42tS+YM}u(7Opg!34Kw{%5H6eP2|+kzrY8m=*Gx|e!cH?iIS3og^y5KT zX{MhD!hAD5B?!~Z^wc1XGt<+8Fw{&xX`7v&ZkwH-VVj+wX`7v&Wt*L!ZJV8+V^i_m z{5tp$8lVp5qly=xiWj1a7eN_$F~rJCppv{4s>{oumi!DP%g;g+c{#L@S3o;?C1l9Y zK@a(P=p(-XgJfhauYytXY8WT4fywe(m?p1-Ir4g#FK>Wl@L&~MGHP1Lmr;X4zKps*WN!QZkly*ga4Q|;&rp%r z0hd1qzlwmLn`s?&ol zLAh9hDjQZ%f1sfLWC}{MfX*3$8XO|1jv<0d4G~n$5J43p8Z`E&@{`lHZ&C<26%M?L z1N;gPF^Uu7l?VtZkx)|+AVm=&RdGR@B0)#R4fiQ3+^_g;@)>N&r@tj1H%mULUS3C!#)*P#-l5o~v}qR({is{OX4N1WaxjVjV5Qy&+KQA&F!pP#?-D z4bUJ`po-EEYAg07Ky@uLH7qhp*q2iSLael32#@|@c{E2JEl?OOkxMHSMr-8K1`?Ha z1;3nfs)ejwv)&AbUAv~FqlPn}gwhGhEB5}S^=8oNw=$V$6t=;?DXjGgfBwlVr3aQ8 zyPnE@Sn6I_>fTuDK3MAhkgN=_mArvf@;X+@OR(&?VOTpJjHP^lVaG0qz&Fu>$Q5my zHXu22_am-84oBxcJYG(`BJhgDOTbH}H!{7GwOf$}E*eNQaMQp;11}AHG>~ba&_Jbu zp9UppP!c^7Mx|)FG!4qoAc_WMX%J0=7(X{3qgX$;0HbpBQF$7~`MHG{#nW^J8dRh~ zB^p$wK@}QQr9m}6w+N%^G##Kp0u2&rkVJzTG^j~~S~RFlgE};*OM`keNTxx38Z@9m z3Jn_4pb-rk)1V0rQvKXwjGEGPGa59fK?@qRq(Lhsj+VGJO}FuLOE5~K>9#azM}zkI z(++ynkv>YNL5BXI6HRxfK^Gcyr9n4G=l$GLda@p|seCHQR;HnXMN7f&7z#f8zf&*` zN+~ieb7?t(p& zKexiBbCyxw%SdDSQ^-B zHcR6)sO;y~6|QpqkN*E_woX-7x}IjLU6!fdwXl`LQacUOG%K}fT_N97t?N-oJxbT3 z3_a?k;pnQ@>Pw#P*XP&$EOJ?yjk=di-E(oe?m6Dn{RU0<8&UVz$3yMQZd5-F1clIg zr&o19x2dyP*>z`&+TTpIul=20f>$I&SR5zM@o`MD)XkhaaG|+v7j;ebJJ@0Px(SB}MeruV_Ih3c+THKbWIBs}~ z&BbUAcxoLqC`NOT&m+*Fxc-0!|E>WjrZ1pDk==hjFQ6$@E=M)0g@vfp(fJ>4e|LUm zK20_$^YKZXv!tQS_7I_+s*;PH-aUcC+}=Jp+`cSm9&luF`vX+NS8jy$J&$wfO!$A5Z@O%z;Jc~PlcM*L8 z2e=bC5SfL&&ciSce{?d7T*DthH$;U2j?@^r`zDa-mclVy=Q$k7y!Smm#Ghpy+XSU( z9CMgEfIobtyY{bN?zMWX+A>LH30h|<@F^p)Z$273#|xmcvJl6si*UU92{cxHkftio zQB|S4vJ?g@%V4bX3`|j;g&E3nn5(RSRmw^@sOTI0(k+PRf#1=cyMqE;gF{0-g#t5r z!kBWFa+anOj?OZsSm70V$S1}FX@OA$+1#tz2Jm>7&As-2Uv_<95CoU93Q8)gAx>F? zBUI)#T^)Nu$V3jA)Do+brc?MeL8EBRV%_Qo7Y9^=tcV@EbUzo{eG?Oi8CR@== zUPLp=L^F8_&E#b?lWqUTOdORBGl>doCa3=gX0j8_WEYyrZZwlUSnj=8?tN$``_W7e z{2MdT%Y$Z8)-aPKqdXh`8)lO5UonRcIGzV3`(Kzt4)j(I!h=dKj8G22Bg$czr5u3` z%27*nV=U3lv59V@CAy7{H12o96b#X6+YVCEb^0%rQ=c$70Z!#4$jU3I{#T)_@*0-! z6l5r;E$%TE_u4k@oh9 z)V8y^GkvqPr+UHYA8}`+H^AUPp93&}AA|+P6qmyf>Wh{k57`1OH5+j>jWr5dhsLpW z=&|0Xp?nm7fICNbpWmb(Eyul1pPX;RXWsjCjst~op60P9kVvzPrUsSGy>Z-{L@wX5M_G?%4r)^zGIWDu~%g##Owcb!1l;%KGCN9xa=S# zI8v#2IwhTkQc3h5w}KZ+LJXg@?ntvBXYuddQR#nh<@h?aXi z|2Of?%1m!5 zWoR~gJu%;51n8vvDuJ>p2h~*v)W>ua)oF>VBviF*t*IrXrjBe)NPbkaeqN!<-E&ql zcn&kfRnHU>*0(p$Ky-d7q1OANkapm6?oIQ?Vy7)NR7LQqE~u)yZL%@H@Zy}6omC90 zUWXE;hZ$dsk%w#qelPW17x_UOpfo0q(RzQeFDin&7~MG&_S1h1f|l_`+6G+GeZa*{ zP!gj{G<__#MrTc8x9IuW+>vbVGW83&+*|adm@YJRg}@2!ZTz2}BYBMe@Yn{Z%Qtn@ zk0=?T-EM-|C}+ut8uSLE^&mK!W`Z~;0&zczrDs&qV=8yVuA(PoV6%jOmd#y_p_BEL zbqosbB0nU$bDp;yNKeU7OF^Vs8Wgn*R92%PQ7wyli-zWE45VY+O)UpK)bcP~jf075 zJj_%pz-+Z5EK@7NdbKiaRI9)iyx*o)hrMb798eSCRW%8&s`{KiJ;gi)${Koq3My%- z2$%?somCx?DCq&v%hA$FPde@aGo977oo=D9^uomy}`sL@Fc`IdT5QzkNEFLSA#Es#(WR0(Kec@nOaj-gL>x;FdDTd$8CaP z`?#esHTc-cPX-|}A(rp4k9*F%cO}Siv4iNN^|nXN^+&sGj|SqC+8wT`J>V03_NCejzEOL__i7*bMeR$7+K+hE{-iv{mDPck z3Hd-VJZ%Sf$eE-WQ!>mko*jlnJw+T)!E`Ys*)SmwsphQVtOCOKcL%10gS|JJm|-L&&F#ZUd!=X zjn`(NM@aze$Lla&ui|wc=pnB;*FoPbLg7IW}{s_in>2V$ykD#YxU_6K(Hi2<( zdUgZGUFbOo7`LNm3Siuv?$3{L3f=3z7d?hIhkSu?HM$2o#&L8%bBxQ-y}>b-=|0;S z3v|!wURcKS8Hs1^kvW89{(VR5c;`v>QS9`AIs%;PLujE7LkV>hlvf{tdg^F+S{;K9 zX)L^;j)M*AqwtbC9`>k@!9jHboKPpC)lGs+>STCVeH=bkpMbB_DQIz1;Wu>}_7R^X zf;yde)LBGTXOmLuLnKC>OX5|18zQ>5bqT^bld-$RK_n@u*%zVOvou@ZY&u|@(X4jT zmDwrDQf38Ao<9TrB%|+(?)ZGCOpxef?8Lm6ME@*i5bd-K$>Pq@Zq7CACMLyXao6*t zpf|Jgv7RmfRb7b9>>{YGE`bbnsnyJec7(GH=h;cyi5p7*ZMCvEKyWs&Ou30^O$WIf z2e}UqavvS!K0e5Ok~cS_<*ZBqhcXc<~~elfkV#j>C~Bu<=aMn$U*a7eL2vJa?0> z9R`6re0WoECSLI67u&XN+qN~aZQHiL*qqq5or!IG;!Lo=-F?{Fmw(@WICZTLS*!bkw(!u_kyw|@)@Ws2L=uc06;?nq+pDNJ6AEj=FtIwgFFC$00013 zxR{&U8@t$=yD*tLx|lObDkvMfxSG2#TDjTV?FiU<=14c~ebHfCdW|XE~A4gOm_z{3|sh%&fHGjeEc=$BdS4Mo-{VOkXx1UAb4s6`p9w>xj zw_3Zt4Vh2a)rc1i;u{DPR$XTMlz!W>$=|#=wVwZz9Ut)r!6EH!QzKWU$H~tek??S~ zE=`5m!!wQAV+i|mdmWI(W#AVtd}hpS5NE;!lmNCYxbrE#%_0QGBbWX=<992822d~F z(0hDuZvoZ{1b3A4X z_s8N*pkW*cJ58~++o1wD74aHegO=>y64O2X$c&}w*Wi2M9Mse6 zHWzp8h7xWaIb9DG@n|KdNrzDPne%dcP(tuFd49Cz%c}LXH{Ww+sqPP;auiay?jNG1 z)A5;hM)lf&dypn6huwSn1;{fAhtz#oU>P6xSDsW)xpI3u!R-J-zA1iyQ|5OqD}pFi z<*?grcVJ3NFFa;*BVPoU-mYk`v!yU~GG477cx2A3!MQ@-eH*8Y-9r=irkw}Yk{lO1 z^Hu}%t=9ln&MX{NmjR?l&&KsQ3AWxez|etnK4ic%Z-aG0D@S2C_R!p@o-2nJo4%3j zp->=M_(llIPO0ot!iAezbPh8g>3SqmJQh`8M^Rm4V8*|27XErPqi_D6_ZpgQ{vz+0n;Oppnl7YJ( zJ!m(pY4Sr&Qhdf#oWP|kUUM%l1`UjJK+X(G%Np`)S>dx04-@+C*dUb(dXbt|=8OL8 zD1;VQ2wGknY%Yg>+_=JFt~-zY#IkfdF-`0xUvHZJk*wn#mm7uUySMW^YV~hG$P;tm zYu4ZK_`b#L7u;JvMXE>}FZ3`N zdokWo&$I2L&`;*aHobrS20dzLl`mWQ*8VGWcU7E0U^e6!>oP1Y!984^7=Ps(fim4d zuR!i}1GHFw`k8=R-~E#m2jv>_VN&_u89=@Sf>L#JffLFoTVaPfMU6#d%W;jY2DI8H z?;(VH+r>gFTrw>!%?62n1-q}ABf0W}p|zrwqV~Nvyd4%7p>~gG6U#=cjsho29pzYG zKNV3Ly4t-(R-d;DWEt2TxgY3qO9np;cTeh2AA4ftQ871WYu2$WEr(s_vDFl9gHp}$ zPAmdit7%J#S|8R}PI2%XellBoiYm)SJ}pqK?N`D%|Ms~VxwHv>BW`yaEKjI`R*q6tn z=2+_I>WFbatB~QeP)x`i9D`KTdZ;h}(ew9|T8*m@am*;>TL8N#D)1T2O(vk z#q{e4`bfHVT7^Pxqixrpi#)Z*6XMQ!vGJ=v9+P zh45=(tYs_G(9n$Ud0b!T!(}Xsm*M-c{LfTP+MeYpRR#chM%XJnNVW(>)95b0X-E4cr;JqD=TF!o47(FIv}A^f zy6(N1MN(!41HWw@9q%0VYGF@r21)ao4x=h7_53-GAD2V2&W$;24hL=#u1OFJX#ed) zO`4R!Z%b`xaXm>U7;+(XhbCBDFsyWN;aMjZySuq09Wz+7_Z1H|sDcDZixeyacLn;j z2G&;@YR#{RT8b$3A9?w=?Xq3*|K`3Ap6dqJu;t3j6E6_aPC4(AkoZE*7o0>1@!{MOCj$Vt;)_v*>;~$@R9y z3}6^cnN1WH%h`}#ZbC4KvJ~nARAMRHT&T(9VR}fh_RnQ`5@Z>zHF;X@TTVsJBy_-4 zTPdTd)n%^d%sCUOyoXsgrGKHDMF)%y8IA-vE`Apl{9 zfBs8C-4fgp{^JTRI&r}64`Q!%Z5emQE{cwn*s9SaZr6WfGGRDKsvyRC`tM%^@tb#{ z7AR7?IHy@Q6I%$)qwH{8sr0|ecJ|xml>eno&AYjfH&Ngli|a)UL?Tm7+iGTuY86B$ zd%O(JE8O`HeCAE#lRl$dV94Ujwj#Ef%#x4U*c@CD)HhIibNjmjEjINff?&8-tZ4j}0b+zH450h{SrWz9Ep32%jnl39)97}9A z&IeKixLUPh7P5v=8#(-lgF?nQ7d51Oc7bt2l)32<8wV}?qilwLy^tl5O6+(24mKDm zq9wG(F#xy1Oo;5zKHqLoT)EOI%v+0 zR;a4xZW!jKvMMVrM_0q@QGx6P^Rc9C1O%#&*l1Qrmyx2>Qo%hOLNq8R7@F!3a{#$X z(g~nUAX2?nWuN;fda};ZQ;F!)OuS#-nrgW@sL^8hb>Z$tK2*@ah6cFZ*eJjC8;+8DR08>@efSqESiMp7aZHjmC!~kJcrMjf8lQF|Xb#@sv zWBb#PUNTM`@uxVMt$vY)t($)x zFobe2r!Wb0Fn_a2%n1jmN5RkzbRjSgLj(P>BFYx?i@hIO;cQz2-d{xh>ipKy>nvGbmMPzo9&yPng*V>O>cZwydf7~gg@-D zr?^LZKkVPenK*OqWz?QZYtWtx8dDulQHit_ul|EV-077YlUM( zCR*88z?(5iAZca0V(*Aiqf7uk2}}`1RE;Ls9+Xsq2eC1`qr@%I$a3K|xfo)~<^?9m z#U?87!Wlu)BvIKkEC7ves#_+E*k}=;lW@)baRwv{i(6wab_C5Crclf-s@7oUeE=bW zcQ9OyF@w|jHlY89%I9A~``K*~kr&bvHE=Y6D>h9BpljO{DGcRP+lI#Hu3*l3$Cx|2 zP~oZTgVh^iz22qFu(-i|z8qR)W2KqT_&cc`Bi8nsSCD>3@~nv|MIIFuiJ6oy>)4@i zVSmx7c>=Fnc!JE%!bp!3Zb4u6TCXVESwK^i{g<(0IbjuTRVZ|z@puJY*n)6HB z3rsLj)Y-!H1m@cZ26B_$OI`OLtS6qXJ6_UDKjS})i4>0l5mo`E8w%DsO%t7iua`Vo#71*ILnhT6}7l=18kecH`KYtqk=9p;0$O?qd#>2Xm^T<3h9;a0q0xcTo6O@xW zP)g*fx%LJtV1+L#yO=MBj2kHk^Cw9qun#gM6v`K8F7&%$!cG>IJFic@liqwT;B`cu z(@6u5G{@Nc7m1^8HQy>DYO>^LqW-@uR6rlQbeynHFRc@ z9vH?#t2q-;M&fi5zx?zdP%(3pj!h4G8TY_|Y z{24{1ux$vjY|CSj7c+v#H3k`#pG{f)NRJG|lHv@!?DVclCCt&YAhBnnlkgX$7Y1ov z=+A?)P^~Im#b~{-a0IuaeBWv@nvXIg1q6X>*$x$n!HX^xV~pt+;u( ztA+DKw%sq{rs6d9&ee_h7GiEvHq12bDcQ{MF|!Cu)3qd=6|K$8XforPV9zJ)HK?qs zFgw0|UGDTBdRiE-QQgmwaS*CYAIy;DqrGYjNR z3T`9<>~#h4OwfL(H&7PFAHQzp(rLkK^_A<9cz^WS23((-8*h{d2^kY@8r2hDg0HC# z+{B?{1d>0z{ivuTR2d>dyceV$T1FlBb8)VV7tn*XmblHQxuwHuX;@AWh?qiSK@WtfY*=~!xA9H?!2oAz$1c`302iCv3nCoSMGO|U{%m)_# zDk!auM)ss*CAq`vq>x*c3ZTALCh}F^!mGYvsI@Sx9Q$D^3XLn#iUnwjpDS(yva+ zPD?Zl&{y1LnsZa6dtN0=extKx_}hM3DzBhMqf2+pQrnO?&pi2vIXx$ zF>uE_ll|_|Ql8z`e*h!QRAE}k&CJ|uW)yH})D%;TPM$+!(e*dHV}vKF-uoQ#nWCG~ z3sfwYs5^wJag8{F>$>$=M$hsu)>#=+=b`VgzUX zh>M zKKdON%Ig;}B1&-Ee^`jfqZb*;#8XK|XyeChQJA2Ic*&u(cFY0A;S4>WIO>;p?he61 z*Gj}N4HX^7)9=r~iUN1vBe`?t@ z;lx};dP>xLTi8&T)*}7St`4SpZV=E`VlXYA@~pXF(!u7NqWmlbwQ z4kC(30EaB>L#hBCu|IuG;msQF%@!QR4GE169bIlDa_z8m)B9SjtGCwI)iv5C(T;Uh zcYBGsW8l8?b?dJ-2mRyc8hEzrIo)}ZJ1|_o?VWhU&5*p&`h-~S$=Vxxu_J$H?8CJ5 z54b!31X7N~>K}D6EKg+oLA^8%6r6j4DOY0kkGWWqFEIX~UpfOi7jp%;qf-N3#nH?AcCc|+5#%nQNtdN%*iiyZkqldggb zkaDOjLK7e0#g_b@@dxA5E0ECGC+*^&ypYic$x$ods?fm3do6)^jRSAGV}xBOsOx&sExKS7ma0S(MP$d(F#-!o5G<^8N* z@fUaUKSm!^OZ~v_*(aj%OrU|q2h$Rr{LfL;Fv_8H7?}os)#(Iy!m?9o2H8w9Z^E)` zX)qZY4{J18D$k#ZWEy+TB&kpGoL(H1v5!|GYfk&Odbt`>Qwx{lUe9^gt!D( zc(_*=c=&hqLkT>`@>Yr6leLghxn0Cp7ESLpTjua6E;hYpQYgPCsuD-lf-T{H$Cdrk z)x?_y_dB#`HXzO8&<30FYE)0mWYLyW9Jyns;M5;~FphFRRv-Tw2vAF`o>L!lHQj;4 zo2Y_m`?rxqS!_Imz^|4chRX&0Syx&#c`Sb&Q?a?@wXrI#D8`SmR8Dj3w5v3B*on9$ zgU0)ScA-9&z)*QJLt&~TWUi|e9*F8dpUTRN@I7g6Jkee zKgG6aJvM#H+Lo&0G563xGe33+%9Qh*x?1MSY(SqbZP`Q2><3ys2*YIkj~~T1^+kWUXM8;mtb+B~14-nf*fb)toEPCC_ z5+=x*Aps$`(OF@HWG6Hg9t%g1zTHu}AYJcEgK49b?Qz#6`g5{lh^UmUW;#VTvpDK@ zv#1|^2WDrwJ)QZr8?w6NuwB=HQOkGKIpE<+OWTCAhu8#*@jzMwX%^D}nV?V}(}KBt z;NHd4{p5b~kYbSZ%p3Q>{wNZ?n#$J6UZ!2wpj#1%RUCyk<2}4++jpd`uqTN-iBA-mMh=T(m@KD zwrk?u*kd}!%`y8)if(Gv&7@ysqJ-HOA)gU^p55I`vq6%F>FOU5MN{4*s%8hi45F(s z9S#emarob(&K^ewUI+KA3bH3n7kZktO>oT$r>F*F<9g}6TQ#eykvGfhf5v8kPEBx@ zgq{@q*;~wIaoqw$tJrd5_<(jN4^Ur#OIz+}f>F7FR>u^6!*J|-bVCVYPXPf9-^xun zW%?|Z6I5HVz}a}Smje82cI{TMt!1W9Mv*-aypi z$Kwm0TEDm0p|cRdTic|d>ytC-5R|LXcG3%LS5;J2`)Cf$e7$)qdLDI5#q)sD7GoPeNnX}#d>Che9I4?Vy*6t`7{j|qCIP!9uSk<*`*B6@!3&p=ZSOWaDVN&6N!^6gm%{j*bLT2ba z$;ic}v64X$0O4RGu}+=fLy=qH#QEe&R{V4Dqk{=wuw_FI9Aj8{_1 z1Sp}A?j)|p-UgHdT|O6Xzmx6uZbh^&Lk}L31-|mYAT8V||M-)Ye36ZsS+|V3CFHza zvNZgt9BZEUbK0a*r{NZt!NaO!F_bEuDkNmMR>tYTyGGG;ROs%N&vt3imXDHW2 zXYV`2hkNZRzinTRy%CKsdf?^w!DVrr4U1D5k5_^EL@)hANvtFm2i&{IQ6eCryJhqC(n!517 z*_EcLHuPW7@6RAjL^R(lZ&WdXu-{pS1)+gOZ!GsmF$DmjsyCYZrId$f8|@^z7Wkf+Z$8N5A1i&VSngP(ObcOAk8<|n^24) zXn)OH|GpOb&-|yFa#r*J%BaS^%_!OcM~v-YO$VZ0eFq4?$^-em*=YPeO-#-}u@|jZ z_Tj}oPK;%UB~3m;e#sm7eRPZxXhDq^qgVdn`@Y2}+yEQ~6KFxP7mHW)VcEWUOlGJS zwE>KS$~LT^#slrW&8Y2wEk-?9LAjT}o7*Vf03L=Ts1$}HWIN3+sGwLQoP!oVm?!ni zKweDuz)p<+eO63+$WaX1e(51PcdZv5cL_JZ660(@Af`Rkllm5-pv;Tv&2F@N;EZ}M zbY5c{YPZ%4$*cY_;9hX_-{2VyA%IBP51GI64cSZjf%(mE6e~yyJuze)JuwuCt`FHS z`7m}clUfk8PyIpV-aLj0%CP87_Ff~V9@0<^XYXQj>P?aNo2+limhOnJw~n=M>FPgl z;Ro`NSNA*aj#9ySCJ=?WH+uIPxp&mLx{Z6Kfkz`YC)f7Qqq1F=RK&4W9ikVll=r+g z8Aimhb{V{vzE$Kd4cFMJc3DK{vdH}ppf)pl0Wu3bk2WULd#+N969wF|FXuU$|+BVG}n8Jb&(cu|fS8#}H2 z!fX@7CZ(ltdla02*k)1PNa4*Nkoah*nZF-O&Q^% zlrTzi2nAW(>=gTj7PG=F@*oRxI0SO2Sy?1@s;we{Ca^AjpCZ0vdaL^DuzU(jG0!Q+ z^9>h7x6I?Bvx&}yo+pv{^qmF44X_;s-y+}ZbKf$eO{RZ^|ICEk`g5TKlpqViTmU}8 zh@wbS#BR!nB1n_SZqgA&!!CkPe%-}z$Drp?al%sO=)9Ds3(h!^gc-vNa3`YY5-uoD zCY{(m(R!c)CIYTi_`!s&C)3BO=O-@g=k_jjNz*g)=`Nk`ow9YzLR!=5r)RjGv>h9r zAC#`a=d}yCdgM?v+>2Y+5P|=GK>mN772b^Bx&QN+z{CUY<=+6Z_mvA9S@mhuo=kO#SyQiu~o2z2y?FsoY{P%&&H3p^P-nzYI) zJlfaLj^A?*|e|h$R{b5Bd2Vo+l}P;=QX(l4TRTx4=0D zE9(=vh@e%U&*|mLe3S*cxbSyMm1GEA^rotChygh@xd;kOjQ0!epE%zr4!Gc%FqO95 zLdX1~Bq>8uG5$uQ{8Tnr6)OX}uqbXSDVIwI5|OH431zh@FCXLWKVWJeJW6+-vWIcv zNNO-HF~`==suYxA3dR;IuOuQ6FxTXjE90Wgp$M#wObsYcK+5h+I4FcFWwGYO(0YAwZ%B!ji&*digx zfqM<7X{55H?E2;FBqUxXYWk8BgP$?mKRiyN#aq$U?%Uub%SDYRr>7WTJ zzhVfL^gTIDM$$eFDm_J3X7aL2$}bUBCAk^4k=%6BC3)aH>ih2rfT4oCJxLD-xwf1O zANeVd%R|pdO)Bs?tTh;%DanXTgtM{otHk{H8%w4^$D~bqMh^9{X~d4=jWflSPv(aB zjSjUrb);MTR3qA3VGy{X5F#L1Vn{I@M_Kpx;0(oP*n4NA071IYKbFhqM9)%*LsG$wnDa^ECO4iJQAdzn49#=gqg1-M&8 z&{#pU&DMi&ZL6~q_P)!mX5m0^+GFmhM-kWJ!r;`@QmDERDygfw^ysMXbNCYn!qLvP zQNgK@wF%x?P08_GZC_dCP@Q)=b)w7BS`{F#faWx4l#0iCy6G1lub@#vwZfTDj}w|) z)>c>Q@XOy_L(SfwK)SN_cU=KLM4hBkH4QcrMXhz1yaGpRg?zP5bya1y9vEk06^?*A z{<5&bido!eUaP8Zfi{fBpJOwz(FrulxH@}Wb+x=O6tO<` z-e!d^I&Ds4QG#XJA4=xB~xeryfpe( zXIGD#l4~m26UP)jq6;q#X#9Q`G_@JiRLEOio^r-q=%B6yyCH3zs+^n@H<<-a`B*9} zOgH@ky_z$)xE6spvaO~vLB~B(aVn{6k~4ua9>EaS0>_)Oy|SS#S0vP5Vg_{SBj89b z>`)?9+f-7lrA>0g*F&_b5TeF@sHcFe8%f`)X+S*-UxwLNL&1SM8UfTtT5q`9+KL({ zbrdd_yEYqJIZR=zDHTEnol97gNWI!8e_5%kK9_!sW&53BM?_Rrg(UO)qoyI#$FRsM zbdj}4a4_3k*=`~xqWT`(tZ=AJ2$Kz$;MQ1QLxB|l*Vrd>LFrpIt?Nx~sfOuE6slQg zUma?!FIPN1Ax8B)0jQ?ff3`xXWRO!v;!+|-|Nb<^2dml|*&<9Llj7KKD+;rbPj8kEvp9JU4EBppPMihfinZbBI;}}^ z5x{O}ffJh&!Pw9K8{Py;4K4&ILtd#sLIcfwk1>q8IS1+%Sn^L6vb~YYI_4Mkl6VOk zlmc*}zbYWcS0j#`ax5(^19kKo-KAgKTplP>r{2UO`hix3F~_G~(U7kYF%+cfP#sfPKFzruR|OKT1`BO3>PQ)$uBWg z2Q%p@1^7;u3_mpba3jCCW{%De8B+(n{wgk%RLKTTbA?W49kqG}+spW=Y@gJoU2M5N zm<$&*`e#aQ+`&zB#^VuCbK=0^8tny)YU7(S^GjV5qO4K;nF%W^Egl zB6LF%HybG0>)Wd_N+#!jub4WEe+=I3og!-3R~ZIutT4Yh(Af@;kbP(a4S}wh{MfJU`y}Mp;vpc&%+U4VY%aVy zz{i<-BMU_nD!5y@+bgNR{BcB$`#$^PdpgWdN|aWtyXO5J@@L$GUWt&<o(V&5@Z^fwRFHS z8`p1~54w!z`1K@v}jY#Tt=r(?(|lGEf>VP&ew%}HpOPPyPhaU$IIDB<#DW#2e2 zG#!)nnPCLU2E9@J6hiK#8$!TSi!!j8K7$}Ii;ftG4?*JKU3*ymY)?B3E=36vX_E1{ zp=vX9q@3f)LJsKhC))kFq*AJ@0u!5ZCc-Ay?;5Z|zi5Vl>nk|-Ndi|&GQvhVpZ?I% z4&(%kO$>BJyFV{ok?Q?>tAWOzMtOEeF(YJUJS59)M((_ij`T@nZogLE@Zyd$`b0+2 z7ZHbQ5@BxNwlNN!j6&!;I2K8ph|yBKz1N*A{7yw^Y$&1+IoS2a1kWShAJC^?#L{FfZ{_fLrg%z0hw_UYQ!T2I90;S(=(G`$eTA)Ss@^)?@WV_zN5MINob&vB==A{Xft(gRJ&o|4n?S z3&6qFW5DPk|LI={p%OJ5b@w8d%=^jdz2?xL67&IWVU{FtaI*w?3oozkqNMKoahIam z01GZ5$0KS=reo%kjyDSi;TrW4ge2MJJKXbQL`NxRnG>M4!-JdY+)5H(Z%|@=sc(%B z9Uq1*c9zxPxWHzC5btBg#a~^fNpceG>+m3+wF=vXHMyEhWhk1#>%0hAh*OSU~EmF~9%UiXFUUV)A4^`J&Qa|(qie(_aa~#=RO~r?Y z@ON?C*o#7(HW|BZ(LwAFb+OF#n8ar_ac@{Kc9wJ0V*jZOE@Bxrk~q~#0xcnD)m|sE zDSh!UEg|6R2^txOgZ9|T2k~3f4qPAS{fA~(bv#y8f@iJqVOT#`L>q>yT`q6qmU?-; zBN>=l2xyTT)01kXvIH6j=5^wWp>%*}lEzId(~FvENex&Y=nIM4Qqq%9xUgAth&XW`)NRh#$xbI+COYy(-r21AW5=4U z{h;E{u$>JnX`Hl_=lFuxU>e8dYDe2LQ4C_zxNDv0OgP5?M?kp0d*ie{@D5#qXPG1h zkzuBjR#p}9cH_k7g1J5DP~+(!n4M|=F0)Cl(>Q<9;S5i_O5^r-N{isMkDnisP#Biz%o1I$Z; zEBU%0PKs&MA|*@mD=|+>_*6iCMfnu@s<8M#KTF0c!x#Ym*v*+7b>Hud=?0I!5%w&2 znYUx_!C{OBMQpqYR+?be0QPQbn4c*1nvs#%ephzuVub6fNwl~ONuRV-VN^oTPI%cj zavWs4R1m|3ok&ai4`jolhtn24`4^3R#i3$}MgJ=l34#~-T2y`$nxWPWTN2gUh*)fz ztgKfdg*+BIr(FznQutfZ!mt=-+^Po`a#%^jY5|aqyFP(of zcNPBKhH$ZSH^glR)x-z}7KGM?@a}-P)RV2kmra7j+Om|EE=>VH7fm-CwRPRm)tz`n zh&(Nvju9Gtqnv=^8R;N*Xn>ruu9K^37VgA*oF9$O4hK1GH*g!|dp3~gszO!S#C`r3 z#!3)A4ubf~A;}Gi0Q5Du^q(;_KVavaq-5PXD)LkFvvP43BQ2bW4Y!CZ<({->y)vz@ zMHSm@JaKq{IQ?(fhPZa*zX{*g@VVQ)Neho+TdCm1Zjw>74y7KJ){${XvF~kcX$z-( zw&>HIq&$5D2h*0J^vV*Uijz9=VC0=H)W7!&o8leqU}?fcR`&0D$6yB~3x5+uR_H_W z8?YrxsFeAAP{&qK2MR(|n$bV5T-Xt7h1C|9l&j{2M>)j8YdtiO&}UcZFb}EX4Nwvz zjwtr&v6I-7=1@AB>-iyQ5NR!F3?zM>FfSI7;o3TCsS8(l2Z7eBEf>Baa@Grhyeg~>e|wiv)4YZAr|TW^B$7Otd( zm$pR{ck9M3SYvmLLmn;LXO2^_uuuJ8ao}9E2fU-+aOgLYGW)_gnh%~de=A~Yj&Wku zdXSM!LB}BfLFEi?urpa9F@{nxj6`hK-mr=PQ6Ai`G}cvVX!UPqsT%@GSn#PC@}0nr z2PV@be|kP>eZ7adn^`Z$<^DwVPeGB+Xwm!#6xIhZ4!ipnItZH!o91%o-$n9*OS_(o z4@Q5)^8Q)~A%`ABRtN&+Q?4Ys6lb#{AJ&(Q=w=lku4bHN{@1kafqpRn0!dYY>DrNIeU&#>>B{L32z*6 zEFxy@OeD|2fJ%a48^_dfhlxg`Uo15|LJ$S-IP@q9p-i9n8E6$o1YaCpf0p(+`XQ9O zAq5iqq?k&Gj9UuAVeTy5kiS4t=R|HF?|(=?(7qyY++cp6BVEVV4Zz=HB}i&HYsEPs z%^b4M3`QhGDr5ujm{B-&Q0*$w*S9Mh6dod4JCNvQYrHUCMz5Rz0WeU9?at8OfXG8O zZv3A(vU~4s5W}%NY(goP6YdP0xFcXPcRo&NH*=~pDH{S6o2wISGoXS6>Cmkl$J2cE z$YDk^cldgICu_I^>JjI5(l6mLYpEmX9pu$y?m+Yul+i+GJ4eGA2QOlJW3D45e%OBl zoIhxG1Z+c(KZ;>2bOXc-nhzDp@@|N1WBh^I1E$VI>u}KyuFhiZfaMy_3;!Q$ow?^h z^fjIrYB!OR1=69r{66H1*0o-=ApD~b;%?m95rQ-+g-iLmyc<*i$f-;8 zti;m2r1Yd6OLiO=NOc3)0`({9J^i(`cCsC0KGr|JmRn5i5gD^OE&0Y}I z!i+DZU052#+iw`hQ1nF5jrs{&kb88^zj}GR<>5(@Pn#XemWc@>b7Bd{1&)BT$dtIn z>dh9?^Sl|zzk4Tjq7$_Z!heUGmAU)CBo29~abJoWy#jI&baJQNM-TFrrN$2Qm5Ils zd;jBz^O-eYMrKaIF59pxLIGh;Ef1>LPEg%hmG&~mW5||^J^fSM*4Ngf9x%b0elbr8VYbJ(l`2?j3vdCCctS>2{ zRw5l!bE3_Bhp-0g#;PA|kpeTf@!5drF=v$*G!(>(*7RP~azkwjHj*Vd)4bLa(O5Vl zrvh#eY;w=muwvuT>@(|DYw&vLul_7zC1Uc#u(llO86KZLT+|8WiucQYs#Mxd?gJmMmqZ0-5!*s>m za`$n?9QNzniF{TxpK?bjH;!nkJb`_{a2Zw?8JxI)jbBdxDm${U7kU#;c~zLsm`-+4 zR5HD_h5 z2gdOngfiA`hKvQfY#;PlCtiad@XJxBo(B6WcU}V^l!NnsH(<~I;qsQ1has1+IY3fz z0+#CX11rVyL$$opr56|wKJ&=`>Sy7Bb#fw6M(jWyGRBNmg?$NOly&0=Y`pttETMhi zUcPr5pK0kRaNi5*6KTh!9@%v_)!;2h5KLz4U_BFUuFo3KnR$8ApGFG3Gu{jH%HQxA-Xz%Cuv5lhaNy2{!Z%03024s7AT>DJjh<9Z<6W*`9J&r#TuR_eqVBb5Ea#)2! zfs?Lq%1iyn-T*6(g|;iBJCNYs457NfdaO8xdaJ@3yy@4FlMF3}h3hM$*kB{ghfV)b zUm?hktm~-UwcTLhXyNx-@197|LGGu%-w2L8$Stw2-<6MkT z2|>Z9U9RwbzOa*Yd$kRrcwycCYb^|;RKK&1pE1i(4ubgBL_4h2n8IHnSaAQn%oqPX z&!E08nE-64fc@srO}_fClweu@$9EC`4-U{BvHDC<`@TN;{`O!+z}I2V3l!4@k>6L( zw~R1^aOgQl9NiDzj7FVrK4=KbsnR&`2TEAT>ok;76r@jB<*5r#c`s)gG3cEgunGc# zv~*<|>~Kh@_u7l}gs^ZocO{HdIsE(xDQXBu4~7c@e#DRbVYQD+d_Njo4-#A>oP+`0 z6e6sMOrIKJlmH#VLkjI@ioA{u&Izf47dkLji1#1Xoc&Ps% z*{0s!Dy6?re32tm|4u|8>^YGoZ`cQ)DL;OhzZb`iZT#G~amzoSP08lmXQ|8Z^({?L zY1N#T9U4CHF)Qer4$(rQi0i_27Gl=^ffP>k(;j8k$XBpzfZLfu`+FAG&M8#8!((qA zo@KIK?!^^)QzJ5mHD8R~a8fJCmI{lxcK23G@Fu~4leXHXAWnnFi?YSamLPFM6Jgus zS(W-1U#9w(Yv$Jn6sLUxXJ!xL!t0V2<%cb?gw=mOjz0eXJ57;-QHT8MOm)c{`YRs}Y@;BSQ(>qtRLvHy$Z zvH*&s39vAW1or?*V3FVs!QENho#5`y;w}La+}$Bau*Ee<(BKf<-QAZx{=2Js^Ucib zu9kUSQ{7FVYl@y&tqmkN2%$rDDXy^v;{`9APt09>DgH*TmN6mRJYltL1D>%fBikpq zbwY=hJ^3I&wJ0iF0JC1#9w_KUiyRdWM#!vnO)EO6MUE2`M5s6ek3!xKmlp_!Vt?6M zj0C^o)53(c z&)vAjIYku)i``8U<_SPl68-h;?xNzMEWlLBvopL>Lqvd_b$^Fqmz;v@ejz7ntKWYnW0>uWDBW1(?6IFk+S75o~J>pBXG(d2lH6^V#2Yjtto`1pk_U^z7& zs$L}`>6P%WBHAd#8j*6u8n+&3yv)T@s@%mB2^CeNmwy#?Fk(#~3##E;M|ePHE-HHt z>JGS-?TE0s(l85hiq-+Ux>N-!!3Bm*rJ;5O5F-YvVkzSED=j9fW@#7&IYr4pWlgF$ zRdSQuP-utpv2_Ur#XvF+`ic_<>Sih8m)p`NuSe^jk|8^Z#*f5T+{e}g3C4WN)H+=V zXZMmJyXXwRuW)5#?CLtoN`etbU$s!%$P#d(DpOY$^iFZiA^eXaW0u5>$;Uf3mjAged=WR_(fCt$uFq!GidR5fl8objHw*O zsRC{w@%b0#HhMjHR0Dk`onth-*-;kMBR;sc#`1N$Rg?=&#tYPMhBZY*->h$e40`@R zNo3rqBW?yg>T4sdm^Q7^&v<(KA}M2mi_Aw7dfb4w7Z1X3Yvo0X#jmsc>PndA=WB(r zlWj>Sp+C*k7!_dqD(D9k@LZ#%x)_v+ib~%VuX%VkX=r;&`7m$4@MSBa(~|6>?a~q1 z>sf_fhYmkZmktnTo6+poD#~;5I%Q;QJLqYLUMCLgTFqQxj5pBi(`RX!JCm~W-7i2~ zL){{WZR!(T0ak^>A01{Qh_ef5%BD+yu=5Vk(Eck`WaB-gpTT@&yVk-p%$q|hR9Wo?TuntKSu!c1cK_Siu=&l*`oa@vD zmGqprI-a2fHub$hTnom!`nTWmtzy`BLHxy|8gVy_2T|4u0kfY)<8CnLD1kiGGUw_A z(*R>kcAc7xsLreJgCd?;Sb7e`F8x1)Fnl}SG{x+6vVY`yy{SI ziE!)~IyYHiMRHlnzhrUn(emgJ-G{&VTZx`k;UEdjG*wCFRi3SDb%m%*>-x zsdpRy+N}@r#SpsB@;O5kQf2N{V2(bp;k;FFmi=IX2E?c$cvl%We1ufBkD;YiNqPV~ z@Bnt292{C7p}rHEVh+)aq4CjB$2ODOP=rl{!UiXZtDF?)_j{I1YlYnpH?iXzqhs%I zgy{&m%|R!xCW7k0v}QwrOLx0gN)vS8O`s>R4! z6rqn1!md)rnE#k`i&Pu?k*VQ@DVZ$ii%v}z6P*aZL#-j3t~u;J^tYa6Jt@LGQfT9( z`Cq_1LFk-$y)iWMW2mM@eFWU7^QC?GFau(0-tRBVdDN#)E$-ZZ%oFb7zUWv!Hxxrz zKUK}&S;;(;aS~1>VEwTVjDQ3xp}Tz@4fZq{yW&7rME$<_ieUp=$4J!;cq>bM>uxXP zietf;*{`{(Cl=w`~ ztd~*H7`Wl9kOK~S{KQU{bxoGL;R3R1F$+RX^X{2~E1Mzs9LqzN!CUJsijN$;d#YFa ztC2F5k%rh;Cb~gjQnv!d{}eEY@bU`)c9b@Ux#@t&;s@xK_9A^|_IZz&ukzSkX*r8% z1;a{$YFkU$>R(|hATnZ}xh6E?snqr6TU9k&4gJjVV&XxY_9;SfbJ%(j(txed&|*w1 zB=!eK{=Xw7XP}DE>O_L&1B)vi)omv+P$fL@=gtor@0#q``0U7d_od+^&{PZR0U&=r z=net!i%k?)v~^r?1TH^H^d7($vVj{Jj@K5*x6dz7TCwAw#1~}+_`|tlQ8=;E?g5cC;5o4l97psq zZ{AJP=Xc{?p&}ja_4~a;P(;%E{{5WHFP3**3`apd*fcmg*fxkz<+VZ7H>eA)EhL^4 zBN>%*GV1t;XdJ)+-Us`DNnC3&O1CH&Ex0213{emD=F=qVenUXwAP)}8(qOa5q=RUj z$}75PWKe+UkTPO4A_H6nd?xx0gd=aAC4VA_g<|I%JNanm`5vhP*=OkS>)Zy=U6>d< zKB%WD=yU!jT0&6-%KR9VaGl`9V20p)3<_+4 zYaBEiK**O!666qm3{2Yrar~emfj)N8$$)~&pf&4IGK43j0=5GYlS|P_qCOh9)qk0^ z7)x~a#FK-f-4wIq%>;JH&>{ou`~*?ApnS}w&ZT!SoP$X2f0KF3$Z#diS4*MecSXTx z_I;t3(*cx|zBix#Xg`mlgi9EqpQ9l{x&1!jd=I@y(?3U#yu*NvJnCoTPAdJs8gjf4 zA)5c`ChnUE&Ji5u5=GJNE7q>)q#-cBlV8-=Bk1l3Zo9Nk1jWOCe{6;w8Rd`XV1}rC zuqT|DkmpOMrV_37Kc$?YtG5G(K)!2_h`I$n^tbx^%fb08InAmk z2IO>LsxgrSU{HQ8Wx@X{&vEV+#v?U-_dTrX`^%;tlU$*TFS+#$T{>~mr`0Q_LiVwr zs%%b@Ifx}7dyNMs|Muc?#mqk3PuT?<2mFZe=8Zr)LYci@dSQ1ziw%CoK`;}r zM8FxtXBYYW9{pO$eys7)EXD={`k8R=SttG3v>DESBlWz4qv^L!li2cd{;I>|8Miff zdD`xJ$#e37ZL%3NCj5+yteU1BB#aco$4;@a^mY=|Q3!HLhudZY z{4o*dz=3GO|F1qnG)?as@2RIf<+I@tyBKko82(RD(C*VvS)dJunaD7f1~Q^U&YRp1 z_#Xq^|FBsUnt#|HX8V)$TZCG|m-heEY;$gIef)kZLn#Wr@Ri*H<%gIN+QUq8nclhV zqS7`8tiAr@(}AC;dvQe5?}n8tZMYu=lE19fKOYV{`E+o#+bGs4IUPpuEDvSA z;sf=E8D_QC?@+3$M^6dhNI;fd_8?<8}ui@DWB_aUD=B20zyA&F?WC0X6#6iBiq#6SvmYc-#fiI65nQl z3V8kjQQ}Oq!A5V24+7s)S(|Du#o3x>y(m8D8-L2!Wf?)22ua@lIq?Ab1N?&tDM|-`w+OS33SfJ;F`+YS^8DtH)(&oC zUSLkR$=AKkk~3?R{KLJ@%QI`X{NU2RYiHKwtGK5tGd$d&JTRya&g1Nmh6@yU5Zi=s z!^Ob&WC4Z<a%$(IDE+7HGkzW~C7vB=J zQi~Z)C8NoS(-lN{8e84~iIHwSKjd5xknRMH65o~zd_p*&S$a~nTb%gksk(bccQR4<<*gIEl_{2>cQabwT-RspqC7!61bPz*L@QHN zqB-Y~QXWviPAm;VTV#{*4mbF{XH~+)bX&CF2v8B(J=ptP0nCXx`DqC)p}D2#V-VrY zmGoX)QAW_8Pu2!*=3xSvNafcVdo6o1e}Jc!VE5OIdFlO`Gi&aAQ2F1S`}QKfAV==0 z{gtV+AeK_8?3h%ONijZC0gd*=)qh5J#|`AZ!HhQO=r3v{yo&EW+@;#Q|FvxAi!&bm-zAbKP#iUGtA7hdW(g9q_JG5zr zZ;RKPGl>=OLC3&3iC`@2Ry(`W&HtjSGx5~&+E&>+H6 zPLrx+rhp#0bxYK{mZBuMf!T@+k(H^po@>c1O#{xAE=+wHGx5mIfiMX#z`d)}K#_H&xH9Df8Q+7M&enh+0jtFLeC|=3pLFLkO0zok3QB zOpyHS+BOLJ3=R@%(=Zr^H3mp7sh&KmCq_GVY%f~1(VIF|^6I&U3y6tL@jN@NDSCvf zDT!$GT|zK~yAbCGHM^0)_}kDoE=$i6NH135vaSOK?jMan_we={n^>e5;z62A-Ak>{ zfxuNOa2Qk)*=&J_^a2Xk4H7a4u-scEttUm+olun**Y@d=hwF;tb}D~<_&22vr<{-Q88U)ki01q;XGVN=KM=@_ zz?+MeKB+`{;TqIweI3#EHs0!50r7wWO_D2ztfX*?ylFiYKGSR_4DV%L-49pq98PfV zZ{uQf0lJme%wbHoL3v1C0A|p)=O=AYB^;?)Z=cY{930WKX++C;p!+Pm^Lu7X83AlB z%%0C&%ny0ow4Xx*O9n7r*LZP1zNEN({_?=$C6KjaH@Te5%?uK&==(YqSzAD&p zUOFu_K5%hf)VhptUIhIIj|v9o_Q)zB@?+g2O8C|LK>j7<3qSsOcq^|SC-|?5 zF&_`QVE?A{;qJe9So!um17eGz3~XZ_F9ai-W~mZv<8AN0a=qb2%vZOE4_nu183@Qz zl|Wd#4_Zg^qCMpWWC?BD!x=jEY-b@5w#H6L^TVH&rXr4UkB_}m;CjPsM!l_|IS`=h zsaFJ$BE3)zO0p)y{B{>40>9Au`f-_Lqw95QYS1$hhNPzeBl}wBK?!`#Q<#K(OX z=ri#fMs3=kiM)oM@XS5fEj&Dd^GLeErA$uS<}9e+m?Q<-*Qv2}*O!0+Myk32c};vx z$KY=xSIc%J%eTuGZ}81XopS1otRfSe$A|2`th{}?r;i&p?nBRtcR_&wFE$50k^8p{ z#{nxTSOndY*bjm|$LTJ30G z^I#B|HUTQ?_wdj1hB%yBk^F8-%}DjC3S>jC-#UD#^{EQ1MX4n^jns;}#ZEoJf)cek zPIli0Sp>zYNO;`u8}Vzw1tc8J14(PqF3k2;&n84XPB5Jjn9~i90lt8h_4jA5FZzSR zaAi{=hc2YG?`pes*vz(_^*b8VE>=pU~CxB=8j!+-4L(=hqZ?S~F)UvX^ zZMNG#!jJnajmYKHOMck8ujF=kIj9g@Y~BwW!n6K%XU|5!NVsfKD+=am1T3V5!LZf5 zzysc~vkN|Dk7vJqKr_Mv0zdj=iwJDm#W$#VlK;kg4dD##!t^M?eyOnfrkt4E+il%Yhdpl7r3m~_2oX;wpY+;X#wdg z85po|2s_T|6nYU+g3~E$h;NRB4MurJ{zF>oFcg9C>7H9W1=bY(8TP3G|46zuRDu~T zpX}Db1}(@(S75$Et9v&c|B6bh!v7q4*LeSjkB~{jvx#o^6>M`%4$a%!AY}M##b-#` z^R+S%8=m(&mI3QJ_x^DwqHWZ!)3#sdF8Du?R2#)SUmF3jn+2H0IiNF{%*cWpxNuIT zb51USuQl5VaIA%jPOTFNq)5(1KbN-^D1X6w!7)b;ygiX(I`daM%ll<*LsOj_(gA-i z17hM_I@Ui=u~Zq}#&eCIspOoC(DGECor`z~0yaWtRpy}3npj%+j$FOMUspl2fR}t! z){7uo1i=g}GLP@bUy*CCq4y7#jkSOOA=zr{DR50aw2A&;?_yCAm_*ZlOZBh?*PLA= z<*E!>@b8&QSHXbBfBAXw_c%@8sR)ikww3{g63-!9E~Nw$a1W&X^WU9(euZ1X3&!5r zSV(5Y5hr&+(&e1Cx8IeNUAlxOTBK4gO3Z(aCy=ufa|whMZ9jTOz7TO~bR7U#;U3U! zqfTC5l?TCqj^(iCrbmA9fY?tAHJn|s@p)g~KvonnlKTo1j-L}X$T~TMks-Ep+mx5V z0#PC0&x1=-8MPE@%lFWhMGCjeeB^$+-LniM2;jH-pAka z4(WmR84q=_y-<6wCl{5jZeYp)!Qn6=C`>Krd6GX_5DNPegg@pg+4R^Zf%au|)68#` zLiW!;AYLgKLz@Wf-=$o;#7kzX#LF0hA<~5~f4tOxE7B0t8U56=@Ok3TQOkg1z>GSm z>(C|gADrO)-q*iT%|1PL0G84|kb5Ak(hRwW-ST(uvY+o~Jsak4^_QnnLm$?2QM3<4 z30KwwkG(=yDg2a1DM)UEcmOY-9I$^wUqWMz5FbABr=XEqwOv{U?N9$9ENy)Bk}5BW zKr8wlryW-CXOK}`gu^W=vdV#+F=bpkO1`{-buR(GAHqJqjR~;9qv)l*9OueC z?aF4CO|~nz{X%Dj%8b0-3WFh-uPTk2_|3R6`yp)z$aJj8JFo8m~pQaE{=vXx|uSv-Ah9A?wXpZ%{1SSz9P+~e*6j>$VOD|GYk$pBjf z5`IDSYf#X>$Dh$N(X5cZyO#6dN*MpdPL%4er(y4(${#(pD=@ zS>nRAl{TZ$#Ehp?R;4NZ(R9-gu4Ddu)5;C9J~DI}yXi<_?{7f8hkEHXtv;j3&zFiT z$Rlw~S9`0QN^I*li#>|)R(x;v>jbg}I3)J_{128C(N$|DjPWjm^4YTg(P3c3AN@nswnLvHCQSAKiCj{wV*j&xn-8e_d3Ldzd7 z@C{mPzXe&(&E|)nGj6YZ$KE|6>>)kkTNb^1ye{<1Tx1Fyv`+{$F-&A-V;xOPufDRd zZ14Rd@ZQNX4R5TY!rk(Y&Svabj=Mpb-gHgli32&=cF(~A-c2UsZ$~AQaV(uO+c_g+ zdeMmV9;F4Nn*v{tUj>P!5}nbPJjQkQvSg7AR?U9DBE5_mTej<*PlJ9nrEFGnhGWXM zAKjEXQ}}9PO;{>s(${AN(&djR$H;pm@e4&2>Un2mOnHtZUL>pg1*7vyTn7G4c27XgN>^`V`HCXrsJW|6)? z3#Uu|@z|TERN$^haP?hVZ|vpXqRZOriPt%sXCatVU|8Ts_5Inn(j|)}aVK(v;u__` z;acO#>DtVK?wZ@;;@W+kTW4DRb;s{Z?;5M~tF_-OHvyrY|DJK4gYHr9#LjCLK^=jX zWVc;oEO#c0gZ>>0)WW9=Wq$k(qyBh{1j2kLa(S*zi)AA1OIC=>TO0`<51e%qk7FkP zo(0DoFT6umceagn8#{+b3{6BPXm*Sn|jgwEf2$d^sch4U!i9Gs&Jy z=Yxgv7Z;ivIq%}(A}X7K-$Qo)fsUgi3{m0xFm-m8}^UCb*D&<$M#M zYQEu6>E+Sfd91p18?w4}JEK~wMvfEZCBD1tJ7izO!4oM1lfW7OMR}hO&yl3VhEw

    FgqKB$97P+ldn@u;T{O4GD%6~aFn4&3<2poU5_WZQnX7TI}Sndq}T&SFnm zEE?;7!w->LoT2_K;;`?>#esi4<|kaIo}9jZf5j%UB53uh9H-WkXrZ#RVwqbCmv69i z&6p?ss%=M~=5RW(tK+nLRb|#nI#2&K*n{xjs1K{Qy?^wvgTZi$Zr=7twSJ4-G0U%- zTV}_gTQ;7_CwiX#CrqAMpWOBVBA4c;=oLDnAC*^_o3?%eE@uAi&W&9kR}j}pSIpPH z{2B+NfV0lMe*JFF%{uZG;Q0#{=9#$%IHsQCuaK-;wX}9kxLo@iZ4o|njjwJ$3pY>R ze*kx%r>!7#iMYl+819hXLbLQwXr1GpZC3EQRnF+UKRC7;X*-4+kv31)@ccXZ7iV`# zJYIcSxtV)ixt)98p0m8s9OV1^T=h(<+tRTiFVuJOT*|R>UFnRV+kZu=`@ZGhi}0rB zv;T1CCOCEZ_#XK_wY&fH{(f`q5_=2l3A}^#Jm>;?nQ6s_y0sR)cD5?NJi86PfLsQl zWzMuOWp1?4eV4MA^Zl+%qp_U3z|80IK<4{SSj>tp%wR?N)yZxDMPzsUId6;QDR2V1 z7a0892SdBJf}4O6Z2W}+ar%pblmxM4wpxQo1<6##lrbTf8NomO{`H*sc^c#9;p+_VBVq0PBF65c!#nN!B8~6HAe`^|BC~9b zBBWjW!~eTT2_}B*3Kn<(1Up?IAYflgz>91}zRTTlLVbzt=DN@h(Aco(V)(W_i0FOE zB^LbhkdM;EJ@iKzO>UPK*<-&9k>Ii!N%KlkOycpU*xbvhSkl8sv6+WOF}Fv7khAT5 zB<8Ji487m$1dxbs0c-p~r%9~WuKdoIP_f8|$PnQ@GEDwq5yBfGnAfD#Ym{-n2tn1Q zd?>;r!EfA`ncv*6iyImNn$F+=MQ7Y@?v}(rVK2IFmX^#wik8^*4}vl4BrkB?)LyvV zTwZ+L%wCw?9A1>&j9$py0uSWfv=0aYP8Ti#Mi<@zffso%!8l~E#xlHtbX3tIB#A?0 zsPsD`7(X}SBEE0Ng)8idU}lWxp=1mOl3q~-GMH1tEQYjRv*K4@4&%WO=iS;O}(1H)3UwZ)OI0>hPdY9hE%>28#QG5u9G z#M97Btz*c;9SLVAc@X6fmP3>ekV6QcayE#bVm8R0Dsgapq)^cC!zRbOQBMVo2tI#C zDv&7t?EW2smP5IWs+y1!elYZbg8PeZt&}JJ*5~W+2buQx4}1zT(H)vHu_TnmlCeZ; zl(gtJ3F=|rhdzp1?ih$`?QDyC?zmF$)JqM;tWfNLx+vaD27G=mm5Ucm8Hg`O2_qaS ztP+>fC^wFi!+VnQz<&a1qJ$Q{Lk}(bgVI-+8Mdj~5QeJ?Mx`uDMJp=OLY-4x4zE+K zLEkPECZv(fc~2v4@cyXq74N9Xqkw{6()zp7`%)<|K`H1S*HRiA&r(YH{hlNbs$0=H z{vL=Gk5Ez|%(u|!J)v|r^$MB4ju-h8@#f}1UKq%kluFY*^h&c-6g#s_B+!_aiNTnoiT{|YiP_kGZ)v(wI5T@%c$%qy zm_wad@7)4R@Av|SiMD-4t$=4xEp3z50`W5WNsIyANu0k1FHXBO?}v6(-uLawyd=-R zoT=^@H~SXI!i(y(!tcpYQ#losm4lbQ^B>6cYD?Ut=KiI?3szdPh!D?O$<0RL)yNVa6`*;-ETy3U!jKNePlPHkIsnHu3EANxFIJ zF~VbfQhZ{()Tke*S^YMs0{w@m=TRK^!njt{*#!GkFErzd$pep3S}tOy5HDrZ#1^(X zl@5_QaX<1pJwINT#0QzJoUOwC=YfGJ#sOOVJp44OE*cj36;>8yK?>m{FTJlB4`nS3 zQMlT)NYQplpCv(RZ7nSH+F$c#jaJg#V_N7Bxn1O^6)sDPLH!Q0%2CTnhB#mv2YfI! z5D!f2Pjx2yB({>}F1C`!6#bmUbt&pv?8U|>CYbz{oK%U0D2_@yii}1XCyr)Lp?EOSB+ZLE!Y%7i)*xx{(vBgR+)bBwGR?fDz zxRge2?WX~C-YnX1Ccn;=Vh$5hu~HJeI$5%~T3)=k`ak(ob)(c?b!<7HdYoL2T6c1x z+JyYn&onCiPl;R8@Wo*eXL@#K13B5z6t$UmG9PW4J5bvPk6ceq?qcUU98J-wbpQyfU4s35{TR{~?2v#M2-h>)@!JD^h> z{gzZ}bra^V@spF$ESZzGNGmgoT{|<+r3OO2{qZmtBND>4ZE^Veou>r(3zjUll^>N* z;$;zpZo3e|tDc%W29cBhVpeRCF+6=W_VqAh49&)3Pt-mAG6}+cjWwLms-u_I zDz2B;Dz%i}D!-Kc7!0AlZn;t015Y=N$xq*n1s3NRNZDxr^PE2Wr8=Gai*I`ESNL?- zuf7tf!JrIs+jugTrvW+es7-@^#UsVN_?YIf@0V|Jk-@!up1aUz;PF$nd&e>Bbd+PZ zdwo`#dxbvj;j!c8G|y_AtW{fz%(_Qqa=;0<2LE!k;Zw=->2#|jwmeZAa{`N}uh>)P zGWVfcGq_}QRXFvR`?KCt*)r0hZL^34O-#Zf6PfN1TG~Jro$jz)@?4epqClni-S8(C z{RWzmE?rDl(Rn65wqtfaD!UAl%-#59D~Ghc2G3Do1J+PZeOG)@{rJ$7E|G;kH{+lM zqpNsRO?EnvvCO<|=;vbR?)Q@}SIawIK1Sc@>>U5N>@4WF?6gkl@rgA$BJ*x~B8zTX zA}g{q`G&yc(fYs?#(LJ#I}*jSG<>G}3E5=iUH25^eT|_$*LS0RZZxBmuBF42ZluYe zeL)KC{i?LVy$+_hQ9e55AwCA>u}86Aqpjrsz-c=XXKgDBLVCILLbADQoie$Lt1J^o z0WpGQ&s5%y_tM@0_ls8{XE8gzZLDcTp6g8O>;7dgqWAZ^k?nyrBGb_9j`C-+tF5n2 zkHagX-m;EF-nxzv9fHkY18Bhc9bdqO9SqH~hB?079o*o$lOcaY!?boO!@TFF4)%Kl zZ}l_qRqD$1mArRI2lE7IEtiPqd@LpnyjwETe(ky=R`wCbwqai6@s$;>Oq-)6`-Fl9&xW% zJVLg+973OV&V5!GVGG;rkM`J+FY<9jyKX{vqeMO=39NSyUtc>1m9I)jiFQYYUK49> zAS19FjFg%?1+Da4U9{x}HC!Jo&Hmim=;>=usnf^WtyQtS2>iqpd zIpc|%l=xht1hw1BLhsk;QlDqp1Q;*@%%-!Nqqhv)?JIY#k*F<#m zkJt=9A1jl;zud}MzG6``!W^gtVBZq6U_TSnU@?h#fwJ^;7i!UH@X1>tUL_E61A0a} zbq2I|bax@Ba@`@)C4s;FNAg3YMm9oHMruP8M=nAfM!tmzjSPjvrA#5wrW}Q=C)Xhb zGH&}kGT{4!)8qS=(0O#$r#u<@r$iX`CI2y0Pqyi_q?_?wEgCzyE&fvZZ)POh&@QF5 z(@=Bo-bY?{@;J;@xn^dh*Dx*R8C`cbxYu}hvp05xGTb0VDqJXKAUrgM79B({k4DQl zigvD&O0-rYsQwUNU+>&lU*Q~D-{xFX-*gebMfW17tNl<^--SX?9Aj>wt{PNdLMP|_ zvplB0noeTTP~+DL)2H$ihRpI47F)Hu_p3E0%z9NPj6Q~oMi41Jm76Bl+5?1Ll_}X> z=PA~aghCh{86mWYg!xWgnBK9Bgi%Q|mS~@jHu{;KHYSp>EZRxEizWA`pZZI=YpK`I zD}zhD-N7w~k;Scl$wtxljQi0d+AQw_E59;z6~3%xsk7W-sj}Rk6@NWkReUT1ceys+ z;bozEzJl(97>G^h7KHa_QVIKHvVKV);m5C~h zNR=!! zVZfhltCw!*oxhr4NX_Cy*ny*q~T`nDGS}q!Ac-F~L_f*T#zsut9K5_C8YpwB7 z_D*lB6_o1i7S#98?`VEF?^XVBJe%} z5l|o1MF$*}5p2)l6Ey$K(;ib*))cG?(7g=vY1{gEyBxhgd(OyRDWXB55?Jw|0&U$g zyG@Ipm~$gAs@P{_sp!^v`DIwuQt@ipT%LCFdPH`|dmAmJ2pu)7Fl@YUCVxgjw!Q{H`-TwY<9P2PT2CZ^gIQX+2=N?qXki@M|rSKf9PP2O_XR=#<} zBlTp2h?y@%pLvzhsBTBI%l1(9F`>k2mp1ifq=pIUmk8~wQ1UCVn~maD(`qE(ga65k zoA_Pal*xV`etn*#6CW%)9?G<|`JcN!g+4AqtKnUGJAtYh;PkrtUS>*!7LopGKa8Qf zBv5In@(K~^CN7q8-u{|BSpci)Jcnz@Ja`pOa`x+04Xs^F;Ov5NhCx>dO1}9{klS;?|m-|dQI1}KkVH5_4$O)>dZV* zR>^W)VGnFc)8>Z#>D-ze%c@>^0@u;#b>%@E%{(@R zENLAs+Q?#6OQ}}2{CHh-T>uX_U>T&plodkb5G1|=AAiDenEE$d2A+lm)f4OTGEz^( zxw;9P%3TWoC|-WLE$BSnk~_7&=FLC_?e9Qu#^!pRR6D9U2~1@xSFnPT__NDzEI zaZmxl4enA8P66;c&QhP7IOqeTdxVR)wwJ*H)=W6*Mbjky9!jT4?j%tvI@Gvil8hS_ z!6b_fMHu&8ABzb9JV3+0-3eiC?DDR)vVCBdP@O~AUB4&a68@X9UUaW!>*QcHyIIhg z9F_nxW-Y0C-87T~lGddqUIavP$nZw2J6^}c#>7f6L2&@}0zoRUK#C&k1?guM)X!p8BRR#Dff5*>4>g&rSa z1ai*in4~UMt(42O!~QmWQ~BGL2OSJiDZY#P62qZDzWzj4 z9sx}vT1}#TYY~uVqk1Dm-NQ}owz!hyKED8<)b{Gx*5uiitJJ3IX>TXc)Qm3>4^|>I z2hQi$c!-9+#*!Qi&Bv0QWb@7r+ox0W-380t333JYjvi=ka&hXW2d&}J6g>8tLln}Z zwa{lK-8BNBWXV(nFQ~;Xb&qyxxLI{P;`O%lt*Lp$p!~yJ~ro;ijZ;lUA z#f_UpU#3?sDxnC(0juOYbqYwLLix*{00^?3x|JP%ty~x(P9ZUDnt1>jZuKM37^MIj z7Jy2B#3wR1KuZ6a}cYn8a8r7DptX_~i&(RVnNTj$Wf#CIs5$DSjj;7eQD zOfVDQ52-U0w>+-aEyIRj5l}|vrZ(t0@iyF|RfqalhkoXJP#F3B`zF6S822Zb@mPY# z^u1?@(E|yU2@zu0geZ|`D8)&zVXvX-{rzv5O}OtwT@k3gJZw_D3MWup9V(J=aJX5m z*hB2XBYuAu4DLBR$ytLJvn(ucv(OpK5oLcf*BRg)W`s-ltGIFIllfo4QUlFsoaZ9ts~$$I|ELgCxK-oqT@}Fr878C&UW+^RGl2|M9KNQxZd+cG^A8>9aXtzU zxoV5-r$rI+tP5Hy)IhO-O+p)$b5ZO~77QFfL=47v0zNOroBqry`&d(J{2S>i4=)7& z&=aEjh?37sG$heKzqx2|vM5QdP-^rqGq?^^mj9ZmE;yCJD$7pu908|PO<_szQKhYn z(W^JPN=v6mz`szstKkiWM#Dcy;=Wf6kyH(4GKH&;`a%`;;VOoK6JKIdY_=fHy4RQ; zARVncJv-QvF8pWUhMlD}u20p!2M8i7+P?WMB2LDlPj=?zFUdnu_LT37e@CT}F8s43 zvP#ym^=CD5#k;bu*4@om$FGOBpOL2|l?tQ2O5)2(;*%{TqY?Gy#Gc1Aji(q}`aYh{1OFfqG@>>CwzCT%A|7fHc8?A+^q z$=sMg`m_6$mW!hnwnyF#<^EN5cRR$h(R_W<&ah?rxKc-xWzG+~Uf(2#g7;=;3i-Uz zKZLV?VJ?eG?$oIo_zWetnR$^vmoV|%m4-;)wPlCj!e zgy2u~4{!wXYMZbmWM?s%jE^XmCoRU+HII@+D|anVF*OJ&HH_(D8oH~o{)h_{NTt8_ z@q1Y~(2Q8lz^dms%}KP0eArPeyw?$s#Tub#yJJ(QxXV_UN?ur*N_K~3l%=w@y}a+N zCHWhdoKb5(S$v>$k~=k*yx^uJcN6LXaPMz}n%?rkMfgIm?ZX5`XAP5t)|`pv@^#O39YB z<-@zoAz4H*O!F&yOWt+>^UzoZ$`al5Zx3|jfG`HxamxM1RR5-XBf1tGVVT6FDt9}w z7QEHKa->c*bRTMgfgNipU;3{4Q;P3 zouw&}$<|LfX`-a996!cCDdyN#Csx$mmN~5|cmf*@rvI>P@rd|9ZC({?4W%BowUC_16xqg-x-#^7dgZ_xX)5O+gK@LOa>@mD^m0Pe}`kv#V9$<%zK?4*wM!*!NWAKzUghx|belsYJM z80f2FMoEXZO^fGXvSAA@xm*$=s0a#9p|3&W*f00z*uhjp|p)@ zN#n%Eezf**!LQL_pyb0+oX0qD@aIo!;^KjvJ||1}*U9K*(oW&VXaCgN^I`w;&PJYzN}eRLBKTC1OASmzSA~7~OB#;o_j-Nr{g1*WDZHuJ1et+`xT{+ii+WoIz;#>k7={p&}T=hL0UbG_K-&G>`q z7^;^!zdZGhgIbArjQ6UDPI{ne-okx$-1+6jgbv8Jbx(A0sX%fp7*r zPqdWiTq8DF78B~Rk3w8?az)g#0gkjn#d@y2>M6O9#E_Mm?t8RJxk}da4i-$2bgN zO`QwfsS=vBD6okx@rNX^RsYx zY1H3IraHb%+9uKS=;}%7I?N@SCMkh_PwTh^fIqXRq)2qmB&(^FyTnPzS@h}$rIT^5 zeo_oVU-r_4tYMZrldBm2j4!4lr4a^nPqrvp^r&lN?Ato=JGLh^=9K5S+GRoXAo~u%~L9w z)bXbLrBbrGj^RHl~ zxJvcQ6dY~0AhD%)*V2+J#OP>T6P2~tJ;0nTzcOOtLYzh(Ft$qsb{^=@`ReULq%HrF z?JKv^*GP2l3LWrYVY`ImF%%q9e2?wo*59}C`I4?#P4JHcjOSr_Z*1LK}wb@u!E8KFK{QT2C|ySyMq?U%`u z26XN0t|$1txDHR$Bq9dnP+bw1z`+uzu6?OfV20BVGl}Cy$-OU_^jllSh-pS6C($yx zUl)r{e)*|kX9W60E<5H8ok5sd{r&arSZ>6St zAMmr|xm@G7zjVbx7n9}{o0>(OQN@;Qe1(sz+?-%|$x-eXHB4oXpQUBN8p|^Z727t9 zbJy-kN51dme+U+p{K@@ST$*d6#xVi^vt-}kXNpzB?0kcS?f#?I(E%U5$JN)=HXld1 z)sBwY8AjR84&0wLJZZBN`U;;8m{~EexDz6LmSy`oI!iX!D5g=)KiDMSbJ;+^i8meh z%r@V_shs2O;yzRDT0V=|s6Yu#jE|>SGb*E_z*JFS#jQ@Ba53}is~>Cu=Pg( z)a^;WeRDuSWxs%Qj5cI;%#Da5Cx6vVGAk&RQIAlTSBtV%*z)V{80#d=z#`{>e zaR~EmaYq3nV3>z91(U?H#^a+Qx{4i&l9qoMLf3?U%-73@K9 zC+hOy10AXae2IxpKGS#9U27ndR=Va0^X9u5TxDl7?vGo^EW3LsHfdLBl}p>!WW zg~?KR<4Jp8UBeiY2NJx=qFEEAm%g}cGQh-0Jy5v3`|IXoPe`znx?UyO4v&=)lk|T2 z@Po)u6B9MA-0o_I?`qzc-`vt^@ZVCD-*_N1_^$@b8G-Ys{{i1@NWpYVGG*+OpP-*U z#Qs9cm1;&P`hfD?QZRV`BRyLLDw3fw9{hGXN${mYaL=ehR8OTscn@N!v@zZcIa`Je zY5E8RTfwXi*^&*4;56{Nq|em(@bbggr%;5nJ$ZbVoDbM(pZ|vquL`Ow3bG}*ySuww z+#$i;-RZ-kMHAvyo z)iP50iUmpVZOE3LPh^L;jU#%CiSnRX{i%do=gHvGmEyjXO_d`3>`H|FA;69J-*yM0 zY)%cT%maxX?(NGgAYR;PyZpyaGY0-~ME zV#!S6L8;vh{+PcaLn~79g-#H-=|(70iZ=_L1Ajerhm*G2S1BsAZ+3ya7Z z{4>wLxQsVNXfPgfiy@u6BcFWbgv$Y(XagQ)zRjI)F_*{Kf2UhtOcc-ka^Vf)L8pAj zOS?B*7L_5vg$L4U^eGY1REtm~vGHc2^M?zH9b*>wqLuiXQ96(rb6k3cv^o#BUUPzs z;ydCo<0WL}%`{enO-qWRlThQNWyei4b^?h>U#=NbvC(oLAV>w+xk&{mVbJ`&Qq`iu zo8ut!V;zJV<6^_LVx`h$q0lA?2F0;<;ijP&yy)@JEIv{p6^)|eKN+IPN$Uzmp?J93 z=wPzeN%Q?2uyqyU$oTVfgTs{~iiKtyZ~c=2mY;!6R2tBUXr{ zSqYfYU**_XGc+mn0LQ%o!E+=(bVO}(dZ{zZn0{A4qmXbjzQYXalBej%*#r=Gkzm2JjSC4 zEu~A(XeyIY_?pi(1zDj7gykxeovvM^32VpkUXs~E6vn+R4o#Z$v%mU6ya*vlr+iJ<+EmY>P{?a|5(3mTqR2_d4 zh38cnYZ$G?JigSBOsNj z@XVD4c7H5JySlH;Rg?Bx^&g9LJAkY!OG$=7I0MrXka6rGQ_mHuq-s6mgo4-9XIz;* zWWQtr&_-}qxt>G7(qdthsL$@U-#j7LM$({kIbxqGm{@JAeVDNx%g^*^5s>c7?s?Ev zDSbH%dk|!=KRJ)Vg~sR-MzC zQ9;MHlb4j-#(L{o-O`yvL|L;dHEP!udHcG~7aRht(D}~i6#k1e&(d67Mejwlxo4IvssL&TCZT-x- z=Qqjt|UDVx$Y$k|faGG{QE%<3_vk6&oP#Zeh5 zXLt_g= z-(Z7jTW=G+`hwfp(8gKX9XCI%Cyab7rCnoC^phW=^QfSkupx)&AJpd~suft)clpGne`^KCa!+v}lR-<6 z{HG(I6I6QN6+=(4GmAiyxEQLl>_0HP;li+nx~XofJ&C{?d|*ROttQ-+U8GZb^lz6k zqaxqW+%WqQK)?AC`_T?cB^Kd}&2 z4F1$r{i&7z#fIexK2EeLhYQ;FM%j!bTK*;diuqs$rJq|^I(rrQ3tzK=@U?x$t&&yd zx%K{U05lF>l4Tpl`}`!Pu(7gm0QLoE#;7yrOEJkb}ly|_(VS|9iRDmnugi>3< zgbT05)t9*dil=iT*INapu$#|%H0@CW+mgUA^{|+EB!iLyjU&=U(dL?cxtbbx&yEdk zGeUNUjK4F8AcL=6Jvd)8*k zPMgJ^)YSV~EGOS6XA{c9ST$2BM|7V$OZr~zZu#}3uU1ZbsMOt@x>yj*D4dZnn=PyH z!oi>Np^(J!gP{o7B8nj-GieOHB#0x$rU==5m0r1Y*}v69-&fbe~-h}d?7N&K6uHQ3$_dg5qBty#cfy#Nc;;5**<2rvv&m29@cV9 zyXdT(@>SZqM5)c2784ejf=ULI52upChUIplQ0Z-6%BV%QXOo_+<5LI1g|slq4(gIJ z!iJ+bFze~35+VNzVQUP1B{+a7D~bvEHRe@T-H9BVqFqqT@nw|>t04MTz+JnfhaAX= zthq@Z>MRhWxk(Lk!;(=p0U8}+&iFME#6M<`Q8N*OGX|*xW(J{*3D)ZBDj*)swp!ZS zRgx?d+QBssWtCUeS)QJQiTc~Le7UX)hE%*C$+*IfK1|K|t}tQ?>IuDoC{HO(=o*{h z3S;eo3-}+HcRIas!%^H-qc=JyuxLJ&?(!7l<}`!>Im2=-bl~NI4@We`^T59UIP`3f z5TgwqDN{Mzv^qb3lE@<+^pUBY#u!5Poc5^fj1^+PKkyxcZ$2E-k4eJ5}Y^`w8{C~#j-o2zM9%~*zap^vz|1P!{ze|mu z<^aO!Rry8n&XrmcD~?k)1xtbSK)R&XHHo1r$C8oBDr0qwzogDJ&!+fo%w3I@{dWqJOB^GVxqs`O zGG9&L<>#6AJJRPy=SL`7M=`ZtalePW?o+M4-1)YN&-7xCV0^|>jR9QuEuPF63Os#a zLcnl-QL-Ba#d8Vaq3Rl zuO0@?&}dtD$1>B_Qo<2%7JNl!o|n;Q=x_(P^A6rKrR`JEGeuH0K3Y=spN$h76O4D3 zR&5AUoaK!>Qt!tOL9Z9Mk%yz=rCzoE)3EVLhIb~cn+O`CnH##S z?cSs>>1#y#NQzsks86$F%Y3bs1pnxr#>+d^+Y{2E6i`%yyT)K-LEF)>Ll;h41cciUT8j`#%H zg?D%N&1Gkx6>y?*{jhs!S8?}ca-r_XN~`I}D$TbjT<&{}t)BC9JvJH+qDNeT?2w8I zx%z43TNB_{x({Wbe+*&KQEO7hmf!U&D0YWE5Dn_>7N_*bwkdr zBEC>RQnF9eDD{!7rzgpoii!GMv62-f3M_RF5~6%R>-hz+auW0Svg_w@#xC|OGflG+ z7ZA9{P!uC9+hxtw-6>noXs0!+!0=dEGT>9FMDgfQnvmVBKC)1jJ?u@?B?RnG9|kK? z7_VI)r1SW-ab~@U9|6IS|3c&cGCl1}6INW5D3aCF3At{+lqLk&6j|e3#abwW1Iyq= z`C>)%bmly1BNyWCb7bpFcNCJu|74D3QZJe3%DNVN&_-%D(K*v1yldymGM4Zqcc$6% z&ZTjV4oEA5mFq@}4#W=NbKONIsD~F1>qRXqodw1E;eVgMy)I#Q485f` z=UVWGQ-a2pv4z82g;u-NTEsob3(`r_`?*0PZhg{w>!_S7j^PGXd}|7N=9iLmZ>RwL{AITaLO5;7t)9Te2m7Q=^=CNg1BZ_0E#z zkYEyaQiZ+}mGK~d(tbf4H1%ajII*nOavXJZVH|aXOh6UD)}bv-LC)pSi(=CnHCiC) zK9*=3C|Jao#1*S-$ayNGwzJbw(&g{1Ml6fDHLkmYo`xmMd;rds z8JJh1u4^E5ri`@hbEUKiQC-Wxk`;_u{p6&>ykl3Qjx5iS$?<$-%aOS)@t};v{RQ{W z6B>#v>PhBL#P(66OQMW-p=8La#*&S6&y|rYIg?NmFr-W3I1xxpkza}|@@rS3PM!Tu zS^k!Q6{()A&dkB_S%o#)V$u=&<6+R63OzSBG2#ee6m*EL)=O$sBBQ-B+?GHsG8;Nj zJr(avQOC4FWgt_yz@mtkWc?7`M;RF(DrsAECdSd{LXkiK)TxHMf{O^ESRlW=oYjJ`>&B6AoB6IYV&@!$) zPPe?;YOy>!QCTcbG>V=t~;K{Sq4vUgiFEF~yxE z?o|D9n{_Fc5r-Lf$5Pxw4?Eb$R7+Q5JB-V+v>uWr4i~GYiS;Wzp3AhfT&qTd&a#6; zAPZWJo%eG@+JM!Ywl-7J(drsDxPljit(!@!q!Xc*p1-Dfhya{^~^@x%N#vZ&F;-kH^o4qKA-_r|!(9X+~7ovH@k!o@*h@w3A`@OMwPS)X=o+u!T@ja`?y zdZLft9DcqEIwZX2@XY&b5*>DxqCB=XVdOzOq|mkStg0Ij?UfhBKFlu}-E%Ds`3hLq zc=_1X_~gyd`V3ho3vo6w@iL@efiYCY8V(q{v;2Z*e#dvxP;pN_7H3o*zj{| zi|6>!6AAI7_uGu90R5{cH1}t($#ft+{w*2W=?7Ve>1XE8olhG4n@=1C^i~tgZ%CFH z^{@>{lEM6-sNQw4eiPCH2SE2UjgHDO2{SV?GA>3KOf(`@@L;HFFJ@n(iL9wqZAvY< zj=&$FMG*@A?JJlfkdvC9mC7M;&4u6u_K`R}vDbOQg@6F%=$}jD!b&x6_TPv$XQgWR z2X(XQodbM#zO^9Kc)sZ!ic*vav2YT2MT&dJUu~E2LlSr}f$Q}(?gnUzHR9uMlUPm;);KyA`k4%UVrUHjoGL)+VdKR7=AqNxt;OaF}N zEe%2wf$G|JhKH5@TC&~ni3ogq4@^f3jQEgdCF^>NR2e!@263>qs16xqn@YCR@7;2# z4js(!-!PE|6Qm0Q_FUmC4K90P#z`_ykwxg{Bu4x*X zpAhv({7@X=mAUwn`-P8U8cgh?umYo?lQTJbaTHRwU~Z~|=+$bX$|fe5rE6B{*EGh9-kIII1j zC-6JJR({m{gk}>nyXKu;HVU@y9Z$gSgnSO^7Vp^pevHxi1u8f&v8GSINcEk_2x;>Z z4zTwy+#mB_*YB3UYa$qrewVp!x|s}dxtj&qQQ-Pf%ua-P$sl`E$dACRh&jq2dXoo^ zz)gx#y2Hy(Gl5KiILWnoHG)*g^~6uqA6H1qrVxJI}Z&b~GPc?sTcgXYr=D$C! zpRYG<`eUlwo0E=bYZchkUZR49=luB#;(N0$WUK^c-7Di&c<2>I4sKFNPiUR#me9*lJJ%ir#V4JO>D~a$tzz2s z#Rb`h`eTFvr#6FsTg)2tWD11~9s{Riyp@#X4wxr5U8Z&awueI0rZYqT5Pt2EcmbEw z&0fi6%6xuPW0bb`ut~b0nf%j4H`{HaT$E278*ozKc5L#xO~1Or6!6D#4SS-|#m}$l zpKpIq~U&*i;7*c4`VXrL-7^0osiY$y@+M}~8QIHF?KD9!$Z08gSP`_uqTFE%! zAmTJk2+sTyq5L6-jo>c=9DAGoS4dmV{?&TSlE-qjXGpaGGkn_~)FvF&J`p$=gt z<(L1L-Yy6-$!}N7;D^9}&@Rk4(e-Wokp2g2u7{6fiI=H=As!;m4Qum~iao%bq>Vyy z{u_j)08cFTdk!I}U4R?D$s0nlip<>{zXMtbG+Z(%8UdEFGk@W;t^8XW4n9hx zMjiOqPD~W59T?6pTF?n%#PW$k4^@;d&KaMiY+OMIJZp5i$EVexXC-UrkT<4#BmDg* z5TM?TC*}WX$N3;X@|^|n;78n}m!OnO>k>`|spGi+K5qL0Vk(aQttE@+Tb0H7SC7i@yy;MUxk7yuyli*(X_)qw&nj=kwgDXN;2%$7!&{2Z zHk&@3d$-pFR(neFXL~=v<><|Y_cGq&vFT0 z1$?OJOCdE`VTzMv7!<@Q6sXXZ_?2<0Q_Y9kV4sdPB7V0L2=f65i~Y_BDiE3AEa;jT zQ3*U8oQANpv<4&-6ZTc23Qzi>`-H9F68VI z;OU5P<)wW)D?>-FWVL@tqc{E+pkR%+1E@Xdq^BBdMF$_c!*i!3UYF# z8{%gTcj4)cI3oP+55U#yBSmHb2Ewygv4v~Z@`_a~zZN|5Q8cC@g>4?ygLs^u#faLH z3Rny#r{N4jrg^F*tp%6(8$-_UUO+^otAoEWUt+R}SNkW?{CinYF7|lBx^|mGQC;&x zyAJ<`cO3*ElkEHn>)NXZ#kpyVZ@KY`)3pi~ka^MGQ%!{{-MSuQ*MuqESsq)7s2?Ne zQ@N*2k-UVm5erPEBN*;igtOi>iKRbF6)^cVOgs5yPha`HPIGrj9}9?b-P3*g9kYFe zPAh&aOtS>29rJu@9XkbR9kX^*yT>b|ZX9W!_0-H^bW2)2RS67VEqZ_0ZS<2Z{eGKj z?=hZ{{P@Ls!}|acD4lK?6KB|2-A--jCh5MBs*KhVb&8?QFWjqXICXAYV&&4b(9rR6 z%5NZkzh15CL%O6P+-+B4)WfaMcC1&3=TS8i-4?hc-~PEM?~DICX1F;00s8(nuhytH zS-s|%p-lT$V~)x9^h{Ie;^9{wsSo#*$?tZnBBTDhB%?V_-I@z;^_soRilsZ|g)`s9 zlUSkr(^z5SV@2Wc2g^KlANi>oAEqf|AAL4(%N^`}+-B|OsQ%ZhQi&ZdynYAwHeGTr?#3woVKvPkX*H1|b4yD3 z7iXnYHz*57uSWBDPqfF;{&NpBU2Q(~PUT(eElS2GYrkr4FJ_mXx@MPNl+Molm+n!z z^j|DR!A>`?4^N&_#{+ zWeyzdOzgfmr?no8uL)E@RPJaCj;BAyu^5ZcH~T#|)E$f)|05q#_RqI0F5~ILY2&m7 z$F~P$LuqVV#QI%+-~T-rL@lx_6rC~t1Ha9jG^A+3Fh@E&e$dEruWSfcfrS|ARpEJl zm=t8LT@}KeD5mRRovuGv@`D671FsrhuN840RXfCN=TwE#fC~07k-0J)hN*Ei=vq!U zenh8$d+{eR%1rpdsKaK=CM}{sOWShWq>agxbZOw=@lPt9j{9#IR>U0{oQ{fLqS((& z98QP5M8D6s&#RuPOFPJrG_gCR?nAPv${Ny>Izlw{#r{-mMYu=f4XxWb1PHHV;)3*h z1$P!*81;zNXLd89aECP-`AP~0B8{s}2gR3lfzjyyyx8aqo7dFekyh2lDg@hI3kaq2@`5+C^yZo`dR z9Jws4Fp0ESetbxUjKt3Bx9zRVVd+6f-qR&IU85yq@&xhHP}zM8xz^b3clyC5!~*M{ zuwNJbk{dlcZFqKq(T?XktF%vhqDW0mQ`e}x4KYPFO$SDk9JW-yZ9qEArmkuEiZBH& z{Kg~E*RV@UOOfUjoLm!p31(1oycqpGqY)`Pwis)I9-9^)BmH=k{ILNGFP-8Ln{;KY zI2zaY2R#q2`r5B&2POgC2tQr3FgX=Xqe74Jtao;LjdnS&WD^(bHw(p7{k`mi)CV44 zI@$Sgm5jt+W=Ky9*8OEfvZhT$vX)I`!4zel-qJ+HTJ;r4$n0&-0M7G|jJ_9r(t!4Z zeORrpUDtB-#6~!e?viG_Y6D}WUxvxUT;!a2yiY zK99&(-`m+_7RI_UDqX~G@5WQF&&i z1h3q`$7WOKCKOo|E}7blZX!#|VT#|)g}6xDtZ%~Y#m%%%q7C^=@8OE#d*%$yOi^WS z>{qI*dSlQNDl`WnpLHx6eeLH?x^HfUWOSQhoNnuNuh+h-bYEo@bU#95GnBFj_4X)`I;1RFH_)X(4yGL{*p*b)uJ(C1yjhIyf*8p z7NmGRCve7DZ}QFZ3v^PUsLYoVHgl{TIexzyrMI1ZUtlgI&{U+6FV(%E-m$r8_<77) zmPY!Ll3*1!?It{D2zT?C7)NQ=RqA^mZt!#Al# z;H*II;vo5?Gtx7?E5YKy^5pg1aFO3Fd5D~dy$88y(pT{#8LR-N=6k7ch-2ZRP_%FS z>}apDk)OEp*Wcj7y1#Jx!E=P8i7#GbjNpjK*j6)}P>}rMm zNIXEFKZJL>w;i8oZ^NCaxZij=`aD%it_@SD{Ll_~AaDTajJANX#@<3#*!W-gtQvF9 z;FmBoZeHm5QS=#daWO1p0!4N}mMOh;K|!HrSeO=(Y2zkfdN?fdFHz>SDix=Ijm0-n zBHbB&Dx#OUk$6Xfm6+VI5eQHOm~MEvKBKB+GyAk~C&6Ku0Ae91~Z zQB3IDI%dAFrj~`HEizSBiO9@*g)T*3M$QM`QD`dp*aQ&g2zW1)3X%aqHwg(y@5nU( zBQv`7W8xSqzq0Zs9ci-RJb(h*kaBe&#FTqWyOp~e@)t$-%3T8A0-B$DS~D~+C4#wt zRh*w85#geAIH6f5RnB46{t6g{PRZx(VuU>nxjemXlh@;xe9Fv99Q(zkMfoW@UV24r z6Lb!-(OjIPUvv8ci@R_g&q_rjTd1?mUO81efGNSXs<<3P2S4*vzrYgVn1-n$SQ0Mm zt_HQ3U-Yb{!ImRM;rs6rLycf{$f!Rt`J1h=Gu<#RixW_j+1(|Of{w*DWkIwU?PAPM z=3?%p3hnrOhBB}C{Kd=#ZJA;U8@_UYgJBZD8kWBal9R{JqvEVF+7L5cp zO9TiO^CinYM>bH^FL~OyD3|74+J@=t51q3fe6do9eOpi(q)Fiyg-Y&C`7ANB-c$xq zbyA+Ix){;u_$-33{ITzNAbK!Tgxttncsu3`^4BTFV{S1#S^p~KW8p$oSEr$``f#7! z3H8t~FChbYih>>NcJ1^pLGNE@UELf);k^GkGb6|ic|1d&GBpW1BDXX_ z)$&|v-~i|Ms?+^j-sPo4LtcxK1H;Y<-jS=7|Gg7OkP8*a3+1+q+)a1q#>o{@G3wWb zJh`pMk)F8Ktp!W)^xp8rprML;u$qY%Hz*;Vbzzj+?b46v2axxRcCXU6bh16GpuCi? z!ut+rS+UzCoPmZ2?o!x;{u>Quct2*e#F#uh`W-EA^$*s1a15@@9q1zO% zt@_JE`;GUz5Yg2fF{Lmsi@Q)-&abtpCuX)Ia&z0mH&;l@T6(UO^dJmRdEU~zN2PWh`7 zM-Fo#zs1^lD-@>Fl=O~8XkZqR0MNLI=r_E;+qI-rao0%Mv1F0%qQL~jciIFq$s>L} znQ4imQ#MPB^1y4@bL7;RiR*e-Al7;|%+*YN&H5JTXYl*_C1|A?QAU{JTf9GKg3HC0 z7N`=Hvz(97YGup~z{|HPil#D@?i zQ$)(#vUUcPX~hNfAe_u#i#ePS0n@mRSP!oAuGaF$HrtDUN%W_Wd(r>`^|`Ts&Y7g} z{(c8D2`(J}`NQQ?D;R5Z4g=KDx(>6)FJdAz1sBWix9k-(WgoM5MzHtXJ0$<+yax;@x?%hb zz9Ia~V^0*dP}uF}G&)koSAWWnEwBE;KB?K4ami>k;jGEE>AC>0Y=Sw0T6Kez^(KGOH}IDACvD7j^XUG*vq+M z+QZv&+3UQ5+tc16*ef*VVSSY+)P7rt*?QxSt@wZ);{I$HLivQ;L;GahQ~o5}D+x?? z84p~2(!a*{gdS~WGTG}w=lNFV$RS3Sj02mQ1DJP5pi*q9ow!GQRmi`NJ;CeZmfQg` zM3SoGB4z0?J2ILvsADl@eXENvk5-?oeM+;5Xqbp-omN19%*-6Hv$VV^$&`Fso1kU4 z^eF$Cscvg|n6#SFR{Yn}s60E9T9NxsK6?UkmZ#z8eVwk(ssnCfb><+XX@eJevMy!9 z0yEBtc^WDg=QylX)&ZpXWpNK}gWNVqm)m)@5|__z5#E5qZp^fy*o{A1Q3fbk4hGGH4&oly%|4 z+W>WG?lJH_`Nu0`1%{2QV`szCvvcY^2rc9HHAX{AUxt6Gkfmtx&lO_^GgJ+^?2r`4 zLv&y;zec7ls(MNG6n(?w&Y0t!?m-g2TAO8@+6N$C{W4>!!h535R{Rd8DU)Bx!6r^y zFoUfeYeIXz>9FFI_Ky1j%B`@yKc~ougU&9BUlJ)>y(xlUaokdAi7?B_wtu3fG4W90 zg5NETXEUd&iu=e`dcu1Z!L93Wa+`{vRTq}V#9;62VUmfYn@w$0CUK<$D;g^27RnzU zZCJdlis0zUga%YT}|` z<#4!wov*%wBwp= z<1@|)r+bn^)AyX`s(?|U!cR-mxlgWcBrDEtv?U&85K)FGh$ve$R6mQZpDnAjpJ^h$ zzhaVe=W)_)hvkrMhw~7o-|E8_dLlZ^%!mj1E=slkZR6O^h#NL@DW>2M#k}Y_yl&!c zeA#M~ODUrzrr~gF23Ks3hjZS)u|4_9(H7WW7XZqCEzG zl5i4L5~mth5|f%plAxM!5}lf865A|SlISd_8sOHwNX0^-$a()jCUGR2dZANhbR~Ag&*oI069R$zeZu#YY(wA-bkG4hioMj1}wOQ z+8tgjrmt-Nk^W|>>0ThFM^u5eJV0zLl`X*CeNm zP?e+1ZQj&m_;*O9RD5J&51pJbeu#Bn0`vYYt7;S)4B?-qEAM`{xaIeJvpfx;(EWWU`gh)&t z9i^yL4Z11>SUZwFVup(n(UdDUq7Q$Pst{i4E|NZKrb7a|-Jl1*$6Oc-fS1gOQ~X?tLRcxQ$g;>8eo9-@dnAk|b^&Dxk{DKWRXnh9WLfx(B;~33 zJsbuK;3YXC4F6qHf@-2xf@=s_S^{grE7A**^9yB`nG|gyfh9I&)?6P|OF{^!C8ZzK zlEjIngstR7#4ozz0Ms*D9c`3pOh56xB%e!PQmt0@qH81A$vtQWc_wyXY-(PLd+~bX z?`#|-f*uow(KoUB$0hFj0ErQs_{W0BAwgXsUHEAjGid#UlrQGX5(5y(WEkw|{YMhW zeYN=!z4&qH?9lzHlwoE+vq-{%Y_DvPHN>Y(TBQb@kpr>VA*sS5tk?_V1u&^%BUJHc zhKXZUSt;}S%K#Wta{`=Fw3_h!I=Y3sF#KN!`H-E|o+-mx%827lzofF6>c||7GaC2T#*HE1FRJrn^y4zpnLhm(TVnTvR^|NWP_BrQ`4dSz^wL$mOFs7Teemmem4phmE*->Up zHy==KgQUtE^JK4YY{vwnr&a)F%l**6fYb{1G4TV!m|L|rT=0uVSG+0|<5D8*kFf`Q zZgA3aw}*z~K$&oAHsDn9z%s^1y$uFzsuA#GW= zYVq|QpX%)WvS-AnCg0>9H8tPto-|dET~G0VHHJt1nc!c>dh84Ayk<9OW)=x!%9ts8L*e|!7&siGsZ?z?#7MUUFi%ZB%V00-{N}Tu@ez~>pBiXJ z8#LApNR~NJoUkao#kJ&6_a@@hEqhzzn8m-;(IV_O99J-JwOX-3eq<4k#n4G3q_W7g zHT%k}AB$l}V5io~VyB4M0<4zZX+GzcavV1?->+llkun;$FyC*m=aCASuqalmo#2+D zw5(TU&`l!*Ls+`1F_?!f!hu-KV-tf3^w<)j2t-o}Euk4hG8iO)BdlmLE#pv#<89>t zi!;U&`&7cP4(8 z*9g~9M@H9iBgWg2#;3wg4wg`Q*=9%De1&nsF}6AFXvC3w#lqnF@F=myBeBYApphyD zfx2o6k9ZOE`27ZWw~?RnK)b|=IJNPrGR5Dj_`pCTrN9A`q5W@2Y6Dqir$RL4FY>vh z2*xp(vNCFYpI^*#wxD0jygCa$Nw$k9n&}Pds{MaTN^%uhUJ-1^8(n`2a8x0cRadq8 zcT#}Co6Q@r%19#Vd$ZVZMyoRE z(-d_}N)qXxI5@yGC2KOSt`T0CbT7uaV&dfP`)Rm0JJm-koY9@yG8JSi*pZyF&dG)Q zERUVpq$e8v6+CmOD2i9OfIekPw`nBBl!0m?`O|2bI;W`bR%TlW3p&lJ505ly#9#a^jOrcRplhLIe<4{iv zt*=Z0f|&(@{Pg3px~yZa>S^KiohdY`Y4P=MDL6kX$$_EtObWUfV^L~aG4;DCsXr^J zfyMMpin;`2V`^G)^|vXSKPxGLsq_^Jx;SIM)U;yjPg53tR?-5SG>WiP^(9RyPp8Y; zQx?FLB0v;+I~iT7F+%l4P<<)A-7m_J2unteNNXjqp30({BnG8kIek#XBBLC2VQdr! z#*CI^W~6m#A+toIwyGATz;uIv+G1q=pOo*asyvkKzvu-qHZ)Q~A}$%nWF^pW4k!yt zqg=6OOSEX3)Ri8d745>{FuT(Al%X@*Dc6D$1xa%w@1o z#&zFdqT?H$qH)RMv#P^|>xUWl7#SrI+oI%>&8iDIihfp{R z_EeOa%{`Q1mXqF7#oV*wl$af-41p-1HT)x-5AC5UN_?AC>YQ#}C$J|KsP$>2i)`sV@fCr=>I%R&oO! z=Vr~H z3he75*(i2BrAgT!`Gi2z;=C1k{`cTG0(jmz{%$3tlv6o&NlyA`b-EEv4 zSm1xIyfx^9Nw7y zX9nOzd*V4ZH&|2V!&*oGt)Wwy4;eiyot2+V9mR&Mb zt&8;9UFD#U!5wN~roGCI$M3n5U)14K8@72Z1=r;V>N?#)mak+|+R7>10;#LtIjHjHvHFIp_{5gqlNjpX zMuy$U^g*cw?r>s6Rm)CO%PG^=SNBtc5)zTq{l_D^#o-D@X8UmbQB`9&Iu|1`4$Quc z*$xi9$Q_w-C?b$#RfI<5^tYA2H?d%O`6uI{>^gdn0L6hF|bqZ`)I~Kf&D+8bf zKU830zw#3J4z9J=4F))ryR+!jrYPnNBym#N*`o0sd%JBVU*9ntNaWKp`hf7?Q$(Ps zS?FBuH8iqQhZy#4>%mMTNKM?jm1Pk0eIO|&;Gc+oT|Y5oy>>=y$1O8~dCb(CB1)}| zg0(`!=Y6zFx#hf%6AY3@Dm(DDb)xvrA}#!Z^#7}Xz`RFn>c3P#`@gBc z{=1v?|ByhanxWGi09)8`wFJeKjAYL)CN(x5ccAYTmT*;%z1$2fd#C}g^H0KZ@}9;U zvljs-+8aaw_Uv&KFmu=ouPMFEkf&XFLbli zf-Z*C#v1%!rN@MV_NpzUu$3TgJsP>dWG2Qma4_h$t=RYeK&GBYK@jC=1qPP1$f}g)ERl9@pN*FWjUn zmARFS;0|jms9iI#p&7L?&d%A9DiwU{kroC>?Pmbzx zFUKw2s1c0BN8u6|in)Q07Z-}0`IcPJ*5+}(jS%a+sqNt1Th#bTgwj98wf}X$l%SIl{;R(G zzFm!rTa4h6wFxPU8Jm~*y|4`nrmg+y^MJ5KLz2hzV>e>;D3a%GBYy`N6|qu z77Ej!={CZGO{nyKC58=bqO95Iu3siyV7LBd@k8n?kEE4y@~7Vuol}!n^+;a167~PI z`MY#gv-O3U($17rn+4gtcYqs-omr>W*^opQivfvt7MG*dbhji@GAxMBXnPbGCc$AG z2`ale4v8RUu=QXgF#XPkBWAwbk}ebdl2d;&>i2Bpei!*vMJGtFGX z)Bpwwo%8MOEY=Pm432rqfOb^&64fK#w#doDYla%S3Vb|{JIyFWp4NZmJh$f`%PFOk zk{cKqJ9p%9YLz%29o7ehi5_o$m^ORnN$+{>L}$Sl#fIx}+>8vFGtWpUlZp0wdH&UA z*|@jS|4F2Rb8Coy`hxhPG(o3M_jg?#FV?N3Dbu`))a95+>MpI_)b>uaYqc_$h3)5t zH_%Xxxm<%vWBFHEM`8=pZ-7Yz-Dlf<-KJrMJbv?p6yzzInlf?>k9*i3jHJARcq0?~ zT$^D3Z(CNFF95mHVw7?G0reP+EL(mvVyrA{_~eNH!?`;~XTmPqqOt8awr!_l+qP|| zW7|&0wr#$#ZCjnBqdwohckMCG+GCw_$GAV9KlS&SHEUMYEOf--4Wu1ioK3p?@9^~x ztkMOspIuQw{nKP>5cj$FaLzRzjpKaR4@e&vv#lFKi)(6a(~6k|%(;I+o1+Frr`X)q zhrhG=pUAP`$L;pL zKh(}Ym}P+n0b%?PxRo+?wUV=TGj}nzBUd$db~kr0HUF>J|BK)>jV)DlO`N}Z+nn0i zC#35?T8V#=z<}DWK((6Srg0i=IiX&a%5o14S)g;_!R`7qZvtbH{qF}OW?R?@4BzKx zQ}SGSGWV6k!buTJpbJ08ocqw7w(@U!Cd+%R7@ac9NaLS8>ZIl_TlR9z9hGnu zOnnwwG24r15WJ;;Z1?a3w_l7^HY_$ZRu)rIF2lGNITlXh)XZ>nWdJ|YoZO?+65jG9 zIam5LrQg;o%Of4kG$T=U$=vmt==Ejt`IAaA7*!EXEjPIkD0*$FT{iTghv}67c(bFn zG^6vnY9nQ?vW1_qhnO}j)Xo8Pz&Hr($wjAW<_^HZid^`TO+!AVz=@KHhl^=x`rC;N zi&UzV98e3P*8Ia{nO)siCv|+5%8^V`6P=&oGAGF?rD)cwokrdAmtx5eH4HQA`B$OW z`0bwJ9%7o*+g`M`lyBbh%N>n!)xrlqgqg4~@Wr@9 zRadf<8i=6JTb5D8hl;=uWrK~hgW^kqVXT1d{XS3BQn1bJ4m8Zdm)dYmTFUn{8kjW) zoT82tKC+d{rhQua;UTRhk+#bR;$)~B1Pj~h_fWi;Zc&uMz6knTaFZzO7o243?K1Ax z4pBws+HCv7(;!5A}@bjsQnxDSw-5ku6QZWt2 zpnPqJ*O*i#X%!}Eys>u9M3~#%){bXfPj24(3v%MEv-XlLDaEe8 zl8daAYHUI}LgZ{o&E?G8AAQIgz;}JxFWNLa*zzd)slZnjHRhI=_bO-SVlJ1N%YlPL z)O2U7%FX)7tBQ4A5RcMu1BE&YRps;2j%P^ozEF(ZBZ#6zP)N>VHJ3YKS~|61sJFOrF^o zmxk9aXN3cT^o^0@QWvEjedCYkQC{9Dd~T6GJ_RoY#`E`yoIZL343Xm4zylnSo~HlhJV{ATW;75iS(g};?&^U;GM4MSJ{fLG=>usICA zkR8j-3vTi^0;6Rqp-{T`ik6X^(u$Zbs^fxcS*yqUwgA-l&wnS%*CrA1AV?4phkuBY zn|YU*GS|1@%=c^e{XogcN!k;v51>dr9OI8v0(79xX^ z1uqE=Ir&R*Fs8uJ1x_8~(4Yd%ftQ^d#;{zCSx(U*G!nj%M%vem>F# zhP<^Ab~_0(VxPFsL`&$!oA61Tuwso-DTlHUj-|oWNhl}4dIvDXDwdwQd%KVY=b*|- zILUsqmFCcRXC-AX8N+nWu^VBzx-=f|^rT`9O-NMcEg8i|Z;2aQj%Y9C9qk!!Va+P7 zy6GR-%wvzRwx2%tbXt`~=cmada>sY(w&~qvhIfgx>8knExl3BjhkJW$H!<9WhUeE+ zX{aL~9X+$87L+B-SOc-hMz>R)#-=Oj6-_Su#-`(Q;wk=SAh|ovn(XUe03;)GFX&;Y z(kA&xDZEP<6uB+ZVcHdD;T#7D&^tv|pGUmICv0%8bu2wL4O()0^3XXK)OLL+mX>V= z&v~h@M{Pi81*{|U4W=T4El=#Z5OhV+9}u!UcH1T{teFA5QcBAZf;iQJNwGgYEdk0q0%cfg}Ur~U5A=kZIO_qp(Ve^2cg*Rr^byh$au4v zcmd91$qbun#sNyWcm^wtEf*oHr&~rBiONkgaVL^1#Y=|W4y{yqj5*aU zy>O$_Y3;*lOWwvd24>4kmRN8@`K$B#Gk!;aSTFCtVxp$u3Bi_|yB$KqzI*2zu;!oE z{$DH9N32blY-5|Aqg?s@>6cu%L#}0fr0M)TMK;y-UX;Og1sT5=j*iYxG)t5A+KEk? z=4eLEma6j@<^+a_;E~(-N=d<%A$ifN=g}w2VaU4*L}bY|QGB9_+q)dT^OYz9xz~0+ zslliUk3<8Wpc-I9tOij$4l(W&$Og9*_9&9ip;E~Utz?poz*2qQV3DX{sLo~c#R|yy zlcefMA60pD@|t+7d)nS~%M!reIQC|O?RTM;uYc3=ry|hyW zNZdo`o?%%T20ehqk)^gKZobPcMB%|MiRdiP3%!`mPr6CX%Z4SBfC-17*SC1Civ*`Q9r>@ja1z=M+5+ zc3$QY=4$H`MVZy{8>w*r2pTu)t5Aq>iDy6rd`{nvVs?O~f=(%bTqG1q-S)wr}b#Q`nU3ARAPs@t*7&mq7&75wShNKf( zUHvvnL*_nF0+`SL(V+QZiqzZx)2|aigMbkK2mY2eGk0*awy-vL`4@ew={n+x;|Ltt z_H0m+*n{_Gl`7ecE3{$ASgXq9B+kny2+OEpc)^(Z<|=5GV7EJL{hA`SV)e4@!R+6aq+f%^V6ARTYY{)%Hstb%zF| zQr&lc{WKQh!Y_F!4as?%GI20>-Xd97!ScjWiROYFwmYG@a}wIO8Q){psmh}WpC+g* z=>$5pIr(+JWe(68=M5}jR*n>VG}As))M|7~e|f6m7tDpk5u57-=!$i`G`fFBjUNc~o-u*uE?MB|s{& zARoeuK33*~34keO6{){n6$4HvC26ZvAPtu`A^~ziLrt=ojhPq_Ea66#J97&wG&Xv~nBuq0q$F=_%p^+x z60lj4*tWMWkuB=;-B+tugKn+hKX?`-S)-{CW6e*1=lGF6!YbS*-8Cg)74L z`Q4U4nqYfSIqzjg1Kxd%X(NKisD3}~i`8ZdUdeyk+7UkzoFsn`rLSy@r~G=U5|f=o zpse@IS%8Ax+K0`_FM6b~Cpj&0JGmX2kJS^f6bc>*2k3 zNuou($VC5J?M%q|MA)PMZ<;joNy5PGUw@tB>M8(T7w4>vh?2z!y{U>iJhH_cxuvv90D@1gS#B-%I~! zO1UL%>oR?X0HLKE35c6p6Rxktuse4x>fj@8Ods9zpGLu)#rW|&BS|42^Y7bIs)7^8VFzbGxcg1%nbdzaRI^$pQtdpMMkyLmx) z4@DpO^MX6gPTvoO9D&{#hU1Iw$Mv@$^;Xn2fMwZW?jL$LS= zY!}m^<{#S;-(h{7?~9uHvcn>4F25%uzC*sV+CJncVcEmjZD)AceD9ua9QPEy->z)OjMuQ?2Ue7hE`9Y`a~)aJ07}I& z1b^N2q50M!x4{Vkyo6e|H#C(?d70^}O zIGykDivm8oFGa6WzVL3|*s(3ul6&u0Hsi_DHhD;Vk?{sF+xkH*$kwNF!il2`V7uQk z^%?^?bJ`4f`)Jb+Q`yl-XXk*~ik}v0PrGhnMdrb_J(bj!9KRo}%X8_Dm&FSBMTnY38hJ5Slh*v(S8_7&pNn%jR!KP%!^R82T?)j^x%2V&l~!R==UH7V5pZm7!=pxJ1FK5ze3n#iE)@F5lP;iGS(Y1hwk|& z<BI>I26kU`Hhp&QM5T=+@Od^y5m z7-LFk`b;#N=q9sY7_3*$)K#)g-%Fe|{cz0JqKvr7Mr9h48_U3=At4DMvgZc<%sRhL zCBiUU1M1LY|C;ZL0%@C%7*|W88ZnCT5*p>+8Dxc;^vpD=8$l_#qkWRj@D4QT51Pw^ zo7cb4*tg_8OH0NT--C~xKz2+!8mhQM?2R4f<)F1{ zEA+X;`Qlf0euDfv&23a^i)Q^paitjl2byy*wR1Q7*Q~fy^W!JR3g%yhrj0BFbl4z} zm_XSdGbtdLGT_uGVDdQ-srOP;k8cHD@%AR=o&E_rZky*%NJT22^ZTo zJgtS9rYoG+ckVS_+wtOS)R`9IqKyp%H-|M~wQFvN>0HzF)YR6Swl7(&sBD|+-2w+r z@p$lhDv&bWU}Q;HoilQ7boceG#U6(`kdu!OLu_KL0LZmtm7AaX)$5f5nndubtrzkh z%Qn(4ZdwY}8>o#V$yyV!*X#tk-%BZQ{dDCGc2VM7VeP1IHSPrIR)I!N)B|Y8ds8NaxJ)nIZCrV4-!YpJd4I^Z1 ztDafz{Y7gLRy)UDxG-sKRAs~A7offxhvgoMly(;Pjk2#41ZsDr9g)3oVSti-J}Bku z>|)7`ihlff))i`&%w&JK>4@*GE@;Mz`5x78c|i9qKj`kr9#e>UK4uHy6Gey=j*$c% zW_|lXvmu|yIt)#N+X{-W=VmYyJ+}KDa>k2!!5;EsT51t)jCY5q{TIXx1PyO8tgPR? zsl_P;MQ-rQ#(6RhC8 z^0%y@0u_JgHkx!GAxj6`v}K|i7ci3ib*DfPqcoO z2V3y|q_|`$a$19Kf^Q>|hsrvkRQYClO#5B!IqUgFBNR;3_>d)jyQAQCQ zgz=45PyysG4S;&Go2Di!ZTALx+?2K@dock3z7rlDqyCV6Zi#pdyT5C!bHoM`c#~6IEjh0SYO$lE$ zzBfttYp-fD6-JM3<>oZ)=+{(vfTZKiIuPxYFvWHJ4v&HKHhJ&*rnSfza%BT49KL{M zv@S)CiX;OKc^sYFti&*LI9is);xWijq!I5BUBMj^j|rfHuyeQu<6WVw9Rw+y_>`ruf6XA8(GThO3gqP#YNYi?`>X4f(KPT z-Et;@LUEotFXx%1&+Z`WP-co<86%6-4tQL!f$ld(1okHVXFzFX&f{dNFwz${E$0T@^DLj#u-XPfg0Lu zFl76D3D#+S!Wf7~z5^LU=3iDYZ+b{Z< zZe}2*tSsdWzmSY?VQ8RHxusQ+4y5_z(FyQJS^D&!8sa2&rq@{K;fOqbj4KG*c^2Y! zH{#oC#d*|>kH2}cISetJ2S)Y6B!!HYdsFe;Qp{0zO3Wt^KFTLP*?Yk{=MD+x4ua|_ z-f|TsUO_nwcvR@E@YtM0GL|mq1@di*^F;F{8=Z8L!D{yLB?tcLcq0F8WA?*BMTO7( zDTS|NXxZc^I){5mdiyMVwu-Q4HNxie>E)9aPpr4SXh)A(031B6s@6o^F&rR;I?QO2 zG+ve37BF_$mR&_c4@k0Vm2%Bj=7v1NN4N+rmcy=1_JW!{@VVgjEe$;4KXvv}7lM1z z^qz3iR6M%;F{qvTN~Q#$_5we-*oY=k>vFRuWYhRl#r>>VAffK6?k-QWpro(K9Ju5D z9Sa${9BiZflO`unC`?DuJ?hJDOmM&a9VjuzStI3`DWi%>Ep-46mV{x5?YNY**sloV zh2qRya6^D_m`6RNuNCF%M1aI9_sW|1$^!F>j)VLQ4>|b-1^h2cCE@8*u@^+b5eND6;fEvwcph`G)nu~~-kt-ibb27=^aNt?W6Q#(! znbux07HfI3D1$H{xWISG^;j*O8T2w^-*SIcnW_sWS%gAL0BG&I%-Y~>hf^GE@r7K$p7@8`pV)ycZm6c?3B}SA0Pn3TnceCcyXgoRs#Qlz!F)!%XYGB0JNiv~ zdH{jN!eeufTW9=OJ4kGgQ{WQLGj7B5eZzsZz}0GDvIa7o+1jr5fh4!?vZJ3faFG?Qnj_O{6Aa zaA`&+JZNWV9I$5m&dKGGbf4|6g5Wu$3L9o6UtLYW%JRXgka)zQ1HdKMb@~5Ke~@rR z>y;Q72uSol?JM_x)O2p14yZscm__D*)jZstlZj;7|Wu8uD9j%Ma|rR3x&2 z*}gCB-4Wb3=yBIrnIaUe5*|cYk{3FjgX-nX=yu>ER;;Aq=UR6yt-nrUD@|n!GHQ(5MyjoBU&=Q~e93xDMC9E=^g$YnP?Pev)h5qEeZ!GE9&5i9 zngHyMi(1po3W&c6$zO6!z>-M#^RRlid<=0_%^O|ZE|c15Qw)m-Jw}V!nE=RMJz0wS zeFx-lN+=Yhi8Mat8rvY0wal!|?PsM3`0j^nkQ3?@{uuy9QJNr;9^oS+^SCavpgSVo zB-`REwyrO-K>C~vZK)^3jO2=;zt(Hk9#)Pi(_ z;*0SrM?JlF3N^BU>N4IJ)V`#*^%s7Gs1*9+t^Xnr_2CqqM8J~XLLF}VyvQusg7qi0 zA-G5#J3}E+5dKqYPZ8G&QFOcut|KU?OA54IX>|c|yG;L4trOzb>QGyK zqnPFm^52nJOiK#0_YX1!pg=%4|9>F!U$|7)Rzz3E_;$b!k2j}N*}xXR5dr)-(ikZX z3M~l~20L)ZVdCb_vvw#SA^Ig~9m_I?Q~WTaDX$hw{&*|&polYxCeWmw8j$209lxrLb(+zij(KR_qy2?e0&hzYa&f>GBhf9Abp>{4DpO>)w z7B0DibsmRqv(bv|LeZ_G6ShC|``&AAcEK&`Ch~JPtDYIp=??YQPvTn~u02rGTf4Qd zeBv2}-akP>^=mMXldc)kglh+^b$hQc!UoIbycy%t`jBLma2TW_7D6o`kBs%k#c;S# zjHNz*4kFZYOqrkacdQdk?5dcva#>@=^TCA_BP8zY!a1Av`Gfc+&MK&&* zmR8s(1w8T3vA>pIpyt&U(34cf?ih|0g@=v?AW%N0@b4PuXUegy(KDJ`5sidSS1 z_c$c{!g$gP$s7wv14kvAU18^9*f-Jz{TD0P#M$pif9+@=Ap0C){KVWiTlK#kNjh>j z#jJecFI`Bpwnw5A3B}@l=8I96y;~5YCAX9f6>MY4_h~kS$ZiEl@>SuOU>=f(`bkG@ zW$qA3c2$z^oN$SHmd_?d1M?l8m5gVOYq9-DT7C3{oRt&si0eY&ZYfIaepIR0!C5j( zmCD@G&nEr$KD>&A>g70XWmHHK-gu+#2699GfxHj+`9H|qUkASx6cPl42_6K5=>L{7 z|89n1Am1?479JXv2o)K{MTuH92-$=SE(tY)v{q$ulSXo8*@)}LBVV;)dfAQWV-b9= zW$SBWL$c1vvN8NPwlxHD=k>iqyS?Y>gRz9BvJM|O_1%5s?Rg4(d2<2&@tZch%+%h^k;}qOP>$;>J{Ca=Wmg}G13G}pAQB{rbf~kRG|4ZQXf`D zwgkQa(kII>WAZqjA=u=1GM7_gAzZ|kGFg%}D!L{3jv-7Alt#XZzO-KHYihx{CV0%wbQj=zxj~f z7~2zx$GST%FQdaif7vkQhIodB#r=isBs*sBC&jTwcSN?0Hm_5~C;5c0njBwD1bl<= ze7jWz6dbq$4EJS0CEM&Pb}#*BQ2UAus#W&Dkd|Fah^`n!Ws1r0ZY&DC#Hhfsuws#uXY`AX7bb?+3;H~5K^wi8%H=hX6;C?r&$ zV(67wOsZ&5tW|pluNQC%JxJSgpJ!+<@Ck^%>QOaH3v|`(rKPJUv;5llAL#}Orc?i7 z7qU|7MlBQ8pAq2)?J%^F!DY9J;`PFiG1s9F*K(--{CZ!Q4a z;i;@>Os1$u>+%&_!&+9GRa)gU#T!$sM1A+doQP{5xi~E(0CC0=G%@ZkJz<&9w&6X_ zU9=Z;RV_W1>x7E9sMKd^o6WM<-lEE}uG1fHJ};|JBYsmP_*!HG1C6lujQw6*5A5y- zIgr%lm#Q|ajvE#)W`+>du%o~qRK`1oWUV;@8S;PEd0d=K`TnTjYl(iBCOP#C(+BS# z^v8Y@_d3*53B_R=!mDQ*&jfh&}s;Ov(O0U2?I#(B6UEiwp~c|se7&^oQ@*LUvzedoLqOnOGxG@nOn>+0&g%P z`%Lqm*~e!%M%Pj-zS{4EPo<>jS${xoP>xWy54QU&FXxsw zK{fPjkXgHXqA9~p;<~0lqCd~GN|rWFQ0gz(zb{-h`8TuFKtVu!{}CNb|B*dCjP0z= zRLm{RUH;2eDDGuy?)1MI=96RWGdwPHUeGjh@nh52+qkQ!-Mt8I0|&L0?3^=&OB}1L1-@9 zpKSgXQf!)0R>@I45=K&pCQQJ2!Y}&`r=31W@#f7g z9|Es;o3#Eog?4;%G@BUt$f(?<_vu>+l+CHtPF&7K3W&$2?k*(-RO)N4FRNQ0Ecs9# zmL!g*m*MC*NMBj$=oM(x20S9xl#aKNX?Yv#4$>bt){>O5YN0owxMK_bZ}Vr7e?DkZ zx$hzEA2k?)1Oh_$pFZfn%uH^MF8|N6ja=06pK9mz-=$9TLlZ+C|F52hxkrXD;ypuj za2GvHc2-t`ibyevEXoi)fd>;a?{p2@aJa=?xxh_nVV2{F?fVU~nL?>+HJMv(L5v_2b>Ie~)kP%l85SxbOYBf+;3QrBNeiHa};O~e`po-y1<*x`O5Tmo5*sLiep@rEq zYGIUfF3lF})M~8dWera=#!OWAz87C5S%8qI<;i51CA#=%XE~R{5qwPh-k`c6ciTP+%Hs=RdCEeW`IFq5y%}Y8oHB&QK4py zDoc5gPL?{PTQP690Q-&>KgAt>#Hz5*EqWT*t(jHUq#CFE^mv~2v+qpb__i;YA z&P{rNon@Vtrages1(&R?-;&^DlOvkC{6RX)LY3rtw12}T%n=P-MK0?4By|?Bk;9wP z{)yH>kQxYU>N{*9xlS4MRP6bFk2t{LooOuZxhGUZ zy#*-ls__etUTHom733IrZQu)Xti_~ROMf`iJ*-#CyaHzWE^K5T7PJg3xlwM1O)y2km1EmtR zMlVjmVdMl7cSLUBu|vpKT5L@|Cq2{okbUh0B8>E5WrgYGAkS_t8b#a z`#>#k*@732AU+8;(J02HZzs2cuz>I&ue1Vx*vCS+OzxmYt~kosxy;Xehx-B(F2P~K z7FF!NAO5$by!SkHXg9uY2a;|_me2c4&xekBLqZ)x{2iyEb`+pg;FulQ)lxAuS}`ls zBrxp7P_KolR^1OMJCM;3^qK8KEiF2-UCgNqA%VN#UWxfrjf_wwf}2cWL^P2)e1-7n zx`oLZl%udIB9;W1%kz6-=S*un$PiX2J%N}lTWbc1ES>PGI!QkPsffBXy@;^zk`68+ButX_(>!LvxYdUG1@d0sG-12{Vn;-b1rVh%%rt2 zo~SlCqAv4+%*uG%fS^!AnzH~=!hmw-PvHXJpS%(i%D+t{N{m9-G)w?OK)t_sW(0k> zGWuXMK>vdOdv%j*l(n3M00BArCq(xDRo(vEN@A~yr;ZWeAT>crue56;3ttLmFSQuH z`3|Qci>reXj0*=@>Xx!SAkvg`>tJ;WJm)T+eOpod9rJT=R?6u*mdJgK=)~)G1}`)5 z-uMpKdB*>dYdP2XG1vd|6Lz0B|D8G5n`QgS6ytT&Mi_zU?STaAOG{*1am$=Z@NqaI zA?yU52@Ou;Q|aLcLN(lK=!Yoe6U75H1^B zBqm;j%V1+Cy6hFZoGk59JQ?A90GhH$(17T&sEc2Ti*-VTx z!#Lm_+q2c5A$cYCMrx?h%~Y3n{izIdNrex=E~L;^gUjuVQjY}Y4t zVGbBec;`*aSkscCioPF@4hFxl_Dy;TW)*Cn$*Zu)3|Fw3kC>wl;vm3CAdAWLZ8j=>>tTdH)EaOiRAq4&;L98y*iCxI8aWDiwqtp zSwjG-{4z|14dPE&Rmb`0C8mLI(xN&rJM z_zHc@7~}N1-`JhG+b1+<$5L`j2~Md2IRs8orzL5!ZdJLJ;?}n%XS85OnMEsHX0P-7 z`21p$%x)l>%zhwP_%1{P1U()gbMOE>3_;cx&~2^Ky=z>bdz28Zac?_fF{<_{DVQT% zV$ERC6uQAd3Qadj6uw3@zwMUnF+^T;yFLmCXDp;|D9wt{+0y$xoRY9to^7V7)xE+{ zgQ0dp1fn5B5zV|k>K=AMQU~4hG1J5J5tK!w6oD9$rUo>hHIXmNV{)(bc}>pWF;VpS z{quAR{1gbOiclwNL-X}$S9X}ygdZ}P@vXzWn!{C-sN*1U-Q-h*?}-$HuFt{aeBxqRvQOfA~hgb!{@&|a@IHm{iz9GdoT%n~pT0^2!YL9fYjhb4i^yrdj zzG@i>XGZTfwe;&~sV9`PkBBHc3YtnSo-=rLicsKamv)tsvrxKG!e{!Pa`4{Lx1_WZ zLw|#a#GrkTW@Rl*UL;#WU~Pz-%+Y6(5%O-vpr=_7b*gC#ECioGD7@zh4%r`&{+c#a zJ+SZp!GtQR_rc=-=zMy_|9rV1XKmtQ?BXrwXl(YcLsbo3Pjq#hofNrj>r4?u4C)Lt zNOpTsaOz(e_bQ;^r6(%z;$mf!(tL^2Bho5xUf_4HABd0(*o1ybrJ-RR`wOjpzmYrM z(D^&kf&LcB?Dk79BxioEvz~ohyJx^ZSN(gA;O9e%ByRgZ$TppsLq&054zv+$xarTx zT)d@_Bt^ZD#)G{CLs5{dxEar|MYeeg2NQ{gag$vXAW1~DBHdufa8`_DM5#`kWRL(n zW+(ZWp|vE~BQYc`gRrFag~VLZxML-yOSoekxeHDjyyZKt!aXHFm?G^MO)*XOm)g28*>#qu&SJ^chkL2wSjh5OYLeaxgH3hFb~sL7 z@WPZK5x3-k^w&!BM711x%F)QFVYeIG3a?9o6+dnoRbx$r>#d{uOgyx>!N;7&;(!Xc zS;E6CC!XHQ46)hXkaXpLE;u3xhIy83@o2*9)k#(7IeiDV9PH*xS!|*`>w#jMu zX55%z(nq(g9fkhv$kb?X+gw#0b<^Qi%T!cVjPYA!(LaJng9lIX0`Qt)=asCR%P{BI z{&iBD9w*_0bVQr@;GAl!ZPs7r3 zL6o4rjZug$-f#*URCJG=2?`F`2nvqi2@DVE0AFjoeS_^K$JchmhCKtWdKSD%aKTA% zeW;MOmZrZ;Iv8oSv?A26QS-4SaVn(^79k?S{vZh@PHk!UUZGlF!Z8_*Of2;>&03() zJJM(g0^QXbY%U!*W@8hV%?FDfUurTLsJh5<_^~(?#q|dHy=`~+))bSg7R31K9ZdVU zbD8Mq<0;YHt$XcG(@&H)m+;wH#k+QyCDAL+3I``nLPteLirjtnr(Y{K+#R?f|B?OE zl-lP+f;7p${WKV?AiGt5#ku>F5pP%dulaZfTD5W_3$!u`APLi-1c`Z3Rf5;=viH6%W{KnP&@6PWj)<)Ka(6bu# zVo$t@PvU@M%e@i9n*0X(gN{}-yG~Kpuc+DlF||9}s{Ag?ikJQ40G4J@yZx=w5GGELXkjf?YC}iHLGBGu33wFDnoEDI7qml&QeZ9DGn`pxkzcg^6DAIvOny5ZZS}>e2Ufgi>TI zIAK<5!OAk3dQKaP*t&kgwLQ7b@9fpIRb(`lU5hh*=q?A+!`zJVZ++Aiv6Q7Z#ERI) zS;R?Dg`N0oHhNa;z>)Z>8L|>T+W8hez9G;)fGbn*t#iM~jz)nMKKVN+rfG9)rCO7Oqf{5*ZM|_3l&e4~&Z84wIcY)I7F2!)M^_ znAz!9E?HUXh;iN?))qgxau+o409APM?~dvxU<}0~@y{KoW&pCVkd(Klj$H!*JIf=HkdObPKwf7pZ_aQjv zoAc**kH`SD0qSQAaj@v97BXKj^`bGi%bXa>NMI}>dqy#RKh#bzsF=bFPBG#^4mCf{2(^z4FF$4BN!+UtW-smF zbtE3!{Dfk`nLqX}!w8bq_>(wTof|L+^rDDWHSVE3jEH7d3tc0PJcvM5JCY>*>^lEy z%zZ##@a2u=I<8@ZgM)5SlTf6ijv-oxY6*`uEx~PDZ}T8`D9J;_ShvayZ`K|x(lUs; zRDc|$tk%?2!sU_^NV>RMxIwC=8qKoWma(Z+nBhF$C_vzaMxfQh-Lt&%DX71O;k22*Tu|0d>brl|BBspl zFMxhI^#?~^P!Zg=|90DKkb}eI_J`A$zU%=TR%RB8$j1Ub&}yp&;!i+xuGzRGlX^hX zJyqFqanEo476t6cU8cs{@#QXm5Nt{lsxL0nD8zP4vio5PqiehqGP3&FUL4U>^KipW z%2A3#K9v=q$l*y|XqApOkNxv32#Ipomsk~JSHDwk5X<;71E$D%YQfejD!$rE!`>47Rb1XC z7QC`gfjp4MOwsnX8ctvEE?@ND-8&=3XA);M-nl~6=HHelkQ zoVWf>+ex}L(7$t((Wc}WGhIr^qamuYR7n5j6~dJ=e-3mjlkBOd6xVhvH#8x=(HK*> zoC#M8^5)s-laNz(#-6QuBfV8)iEV~U|LMV4(ShtZIo7V;a#(JhtLjYXtKJg=4~Mn4 zZH6f{yhF=)sE>Jfpn`K({RU!BE5TfK$T~LkrZmbOFw2`-ep&ejSr_`CjH7A(cN`Au zI6=M3seb)c7L#DT^icDSqx|yi@2}{+iD?e@%Jq<5xGKvVxz&`)dHzzt0@{EWedAAs z(YuF9M2M6S*}6lTaHJ0GO7*m-F;fUZfblc zkEc?(qDSe6d6I26Hrj@}^uXu^0r4#`LE zu$k{h(1c>!e0_CECoG?!cX;2?y3jj@zon25Ey#_Zb&nvn;8ia@Qbzb%2RX2g#Suc* z{)zS`%(2)?C0!f=q;Ce`wmN9!naI>=NJq|`uF#}DzbiW{IKq{B*aeFt`O6f4=-2>lSgfdRX7DFcb?k@!Q4v^{*qiBSx2Z6LtoZXVbQ zi(7~2AmhHy8&$Uy{#Zz!|VSR-?c|Lrwry5y+qUhb zV%ttCHY>Jm+fFJrzS{fleZI5yUANtHTbuL8{5|^YPapjm80;(+#`$Hfc^+;I>S_qP zW`5~Y9i3U$nUdlg+#n!1F{sKy7!+JuGQp-Pwq6gF@v<%pR%Co!VV+-&n+5M!oblvU zHZ1f&kH5%>KU*B(boJ>{?X$IwlIozp>XqiDZ~#I~LCR;C>4w#;jU(n95T}K@W#5&D zFO)7{FD(koBP;lDNVv)o5)8h=>-{nR3Qc9Hee4<^$EzL=`TT26=7g7pHym;n7L*I3 z7E!F0Un*RH9EOyzu^?iB6v`2DDWQWcHNi+jGUg=-jZjANcdnqs+p&nm=$E9#=p-el zaDk2DUR**b^aq6uzo=vk>L+pGfr8@g%CU4f5k0xDuFifJ(r=r6^#uSe{@~s-ydy|v zs%q8{wukna!whC6Eny38B6PG&5fptYV6L!F9K zb11^C;-Qge%rsGVPO+M<5QRHmtwVV18H;V=EDEB$)h1NeHI<Ao_mX7^QJ?5k8_3#b^CHt`fj>AM&i z_;}XUvTdRVCSB5$Nj8a1KG*HU{uYl{I5}*eN~YO6C?oP8lI#oJ>cOT)~C6 z9Vj~Umu-xmd~l(5#VN8%zv{+hobqN%;P)90wak#QdQ(WP|4IA?-Q!JmfvPk{?%e8+ zz{yBk`~$m=LpjK2J4OqxA1lJh&d5v5L_F+?1gs>+*BC3Qd#)e+VvKy$J}9ozpmb`= zqUI`6H86%SGxk@JI>D*0<1&9Jr?PsWDuNZZ6!7sAE%h3YL)%-ol0OMK1*Xx*N0r%q ze?k1Kf|*Z{nB4lKTr`1!fQbH1!PprYSpVgcEI4*jR*(@Xc$&Zw+>Zzr6@w3`B~J>2 zCcL`3?ME&CnZ43QCutF8PBb`Tj}Vp?qvQUNM8;|Q1m{QF*TxkPoPF{xPe1r>TU;FX zr0dw$^#sgrek%QQVDe$P{Qi!N3f$YvMr6{(_Fx6U;hZB9>q{$7JA0jw;ITu23072v zDi$3yyI;RvOA=tWX_=p=4q>P~zCqR5u_&xg%ZpZyEZ(_$l2{FVHAuh_>B^E|%|qcK z`#G2R_1qfS2>R*k=a*qKR1kzBYeo<%O95Xr)q`r5F-L{mo<)g{bJu^|B_hCq@JsyB zcTOmO@3zVq7&+Sg=N+P#y|NnC*X9M8o0}7*1wjvpe-V6~^$#FbO^mRRw6z6NWx-zg zWL;Oe1lY{>@y&K>iwf2Cwb%04SCF^DCH1#jidCe!02_cMeuV4AGq%~g+&`WL2hsQJ zcJ}tniz5Rj&g1rD@9FKQ?7Qra&uyn;VC%jbP#i^H>j6f9#ft&tj(}*jF=*|zg9L8s zLT%wy+(LFjn-oHBTt7J|4&UMM=5yo5hxCsHUd8dwgti*=+`$hjJScr=KJrxlnmt&m zuF^dz;L7h~p^%5~CZq2F{I0Y9<%1_7V4C4&&}WFQvOO)}N)bsIzjkzT`+D^4-hM}S z;kNg<4Ikw}BPu+#n;;NBBCL7THy3J|HZgpZ(|WOY!Sps@~thLrWv_-`%e zNb08AEO>C2Sz=FByYUs#pR|^RMcO)JD65;E6OyiEGFmvzfKqTvmvn>BhEbD0iUlop ztakI4u2wAWp=Wpz!uVXMjuY!+UcBvErM`v9qVdfWLgr&$Z8YYp8)mUVGc~4lj=vup z%{Y6>J{xXq$_H2{GZy&|*n$vBPbQ(z;9qk5S#fcqoA=na>pJ&iKhWHR(p6?SD%fGX zLHk@cRFSN0(~*I5lNoiI>!SW#(xF?>45SpR+Z1_J#cheDtB1N~2Xuh_xo~N=o*QIr7Igu+5$Fl$2|M z)q>>BKpZs8VplyNB2~0qO0#ABU-R0v2jlfHN^~Oy-0-qeB5gncI-En3jyUpC+wV5YW@LOY}tJ=Y~QGL)~w#rh^%)^ zrCRT!j759&ee5ZN0FCUY^fYWutPE0bsbVuPwc^}0^=_S%Bt3dvYs;!x8vaPvm*muQ#llKVr^~&fUW)+xIIsIbl1|7)7kx5O^ z=yAjbBgmFVxGY9gQ3wC^+odA}JRrqj7a=?N0l`w9zxPH9IDV1SWjmrswHpeFaCZ<%$2W<1V{8MGYNoI)JPb3(y!!6Dj_$#E z(T!-?ZMG&{+YO38R~@yA-d6gdBCwmp;U}3bDWENza}w<0DPdujlDBMLZdbMxy9Qp1 zR%7myoT*n>#bC3RT`na|FlSyRQ>|OAz-mP0ih{7*epJj5QsHl1ii|W#j%XhLu%SYR;V}{jI<_aksL> z<8>9$X~`5>^##cd%(~H4q`!|-T-@B6;=z1p(f=e7>tuAz$3>wBF*UsQl9rTQHmqR^ zpBytH5cEtxMTSIG`raKbgLE63J(b?vx^3+_HL-LuVI7KdZqirTzHyC}3BLaLk&kap2 zyEufZBX^%Q<}>m7&adFmJ#9OdAWEzb5IfsGd^(MKLL`Q%YXM+y%W2vNZ3*WhAuYJ& zNQx4>b=fyv-e#MEIX=6_Qtp&z(AuZrJ1kwgg#%y27f#Yvd}f=P8;G#CLVzs_VJ>YC ztI*V83ayBYU*Jy3E&gd%i!{xYag6&QbxQ?vrpA#&y>i*2Aku}W=tUMy2Vu>O<~Mt{;C zhAV*op@)3~`H?EW?2gi#N5A*b6q`p!k9&VyJJIe0mW|Bc{IT_z$FIm6a86d+VFyC} zI#gTV#TcsM0a_uk7|J2uUU9Z;KeC&##Hj7HyM=9XF!q^Dp2wEcF*oZD^3Z!0$)eyR z0PU$Y{qvNCxEpI&pZH`iMTB@5hnYi^XNu|3!O#)moS~P>Jsz`5I2?9m{0G903E3e4 zr>`PxA0@#(x{Xe0{oBGF*;S8LOJri)nLxppe_9ZqjdpZoY$O5;0R_Do<+{u8vQ zTt4rhq|k1={ep$Pq6ri4sEms2O0UuGEWc3ub}e)6O~JcyZw9r>z-Ee!~L+efvKtk$)HLTBxC#q4|$g+xpLcsg@9X^$={u~ib3THCYj|Dc!O(u%y*|u5kFhI%Z$a>7mNCX)G>0-G zig=p?47QdOXFhlQQM|)m<2NhDe!7MW$DwewEcaxC9G5-TCg&I(vdsgxt#DXb?E{C= z@Nv417bE9$!SyKpJ8B6zi`>v>DS&a4_asCXihM;3%UsxSf1(A1rwu5^sZb`w z$ce9&a^z#0NC=A@#+8mpX=wq=we##?X z6bZL!jviQDn4BafSRr@jG@ACz3;i;Qr|^|Zh+)UuhH8nX!`p^=MzG=O!ng*#svVJo zUI{1XT&QCD$uj7H-qxDl05jhz(64AUTEOUbq>7eH z863d84AYjRQ{Y@6DVQ7)8=Ezp0a7+=E*73jQBejuXFY39FIt?xQs3u{Vk#;-+7@q` zE8NiRq0x(HXePu&S;lD8BpDljSmGK<-_lpDBxkHf5n2Qn2rUv1mp{{be1(V@8xtK0 zAtuVnqQRQ*GV*HOrR4=#MthEVg>@vaL=}&<$+O3+(Y`e!e+_i=i{n~mUKTr#>y`5O z8fXYejh01r?QYllnB5MQW@4^c3QP!U&(>6P)9H(rM@2 zzsD!Z;TiYvsdxPvGV7ilvfb|u$NCd{7)RR;{=MY1EgcgGa_2h~T~Hmo(12xH3s0<> zxtSR{ZnmiPOeQOJ>s{jtm!+N2qD?k6uFedwnhpcDy|~x5 z`ZcMz8`*we2=46l7)(wd;gY6T8N+0tGg?L)6Xu(ujULvzRI*^_CmDr=T*27p7ZsTh z3MHDw7NtxiC-V!ZSSVjKl;?1)_bg-%DG@i=8rl6G+Ie>8ku5P&ES{-O#Py*ereQ-v zy<__56)0-Zp)OS+?+AuL9L~F#7QSgPqWHC~vLP0stmXbH*1%e&q_MSJOZ8lQlA~z= zYH`x_V`>i{+YxxA4@u3i!k_9^%QV7!0|pt?>t~w3>Fn{Cvtlu^9rh@q6)1x)zrN%2 zkE0`za_K=EX04@G2}U}M#b@B>*-mKrA!_|LSm$M-$-BYeaa}H5MKQ$}L5k);z5d25 zz&}QkOt$kMgI6cZh*^gJoKpsfe?N~(#>Cm&&REF6`rn;bY8GCoDww>@g{xdBaA>sh z@Ouetl)!FUX!+<>#k7J&=&4K+#g_}C(pl1y4#Pfb8`M|du70KnU*3iJK8U@zUy;ZN zp-O(lwRfGj9(TFj{&Ky>M#763*oi;U&7ncQ%koVn@nC{AZXOatn;I=jmzO=4;_gMxRa{zW1em&#aA07 z_Abtx1*4QMnlflOo8lMsHVb|PX-%9xvTbW66iP+4%Mp5R+pauCs~^dG8%89Ywh25CX&j?g5}3tY$n< zoT&yNsg>z<)h^p%-Jq}^gej9$t&y*{6YV|cDBgiz?Feu7cGv3Vc3%#CLYvt0ar{My z0l*oCgy9O21LOeS zA->?b`>^18Kec+*IC@`ac0RASXz;AMC4^-bPa15-(N`EI4ADpBG{K39Kh9ROMC53k zt1D^%-k>SCc1yvcz0J?E`aVWmRG59b;M@CXYH!8?mAvPUcP&M`J{P zRmH5aPK`aa(r_78v}T#+e(>cIiuPwtQx3=@I+57xH1gFa1ETG9of0g!R!ca+*DIB? z#tW!tl82EO?!467$9d3rHmTK=jVu-=R_SY-5Dr}0 zM)e;iuH&_BTHW19SH5a$qBL8+4K!D_ubHh;bDG`m6K+vVHt@SyrCiM<<)@=g6?#>? zy*ReUihEf3G0!uM0#we-!@?Vr_U zF#^0TX4iRy&ALO&kXF8~E_S5Y#PP-rcwqLp;E0UPwcxP>U5RUAT$yvXQErmxRYp80 zOci>UHh{^QU7%%f@0aZ8u;7P;ULvh`LhZ<6ud3~nDZ8MSw?VgBjO4lQh(0I zQ@Kp#bE*c}5qz@0H=M+Lfq&^QZ$nKm^>VtmV(|E&$dDgx&SbE-cHuij#9#(bany%bdLYoQ7A^ z=L}S3`>h9RX~%X-6uRGM;Kg?%LI^V`;zQhlJetv%A=p7PW5D2~F?Dd9!NLJ%_&N26 z<5;h^&#hLc^moyss-P#TD^tv+dTeH0B;*_@c>AoBFAg!RtpL8*+o=H}@0h!n{kPZ6 zeQK51vY>Sb$XLoB_@n8-qWmK&h-!WBH~E#FA=g zWlPzTJ%HO$pidbNJR$W|uMIe~5y{b#(WmuqhuJa-+eQnqw__G=Xypx2pRIHVQI^2; zZdj~z^ir!}Gbh(!a;d5-SruICHJ$JwzzG>u+&thLTrOpT$hj)u7 zEL*g!fZrmC+_h{X_fBQ63OTwZFjZhuaDVGbJ|1F*(<by{k7Ba{b9m#@jJCRQM77B-I zHbm_%*ZVf$m)kBf$p9~)qsx3r*8gH%?VN{e860AIf#DifR43W z2@(Qj8O+V4Li)lC2W957&0yna%3`Lm9kW{R(nWT#B>vQLL{b}Z*V1D@B{k=+Z(dIn=gHic zvFo!hn`d05;fyhJGY7h7V$dFOm9ekz>~TRsgeN-+qkpHA0H38WIq|G!PcwLjGhn>O zg%N8}Y)u)2A9Lqjr!LVA4rY>UDee|RN-;$x(=E0W<3Etgk3<8(Cay|BE&?!Q@dJV+=7XHX ztu8U$EQ;UIjyF|`|81`{t*0q40;g0D@j)aa?KSdKyhT*Lb;egyRd?8T%?A)-4Zb%Z?pP|%R` z^%&I9;dXM5OXJ=b+~<=kujv{Ml!fWnJ`63|TC_hjqr zvl@jADqS(<hGn^Uq;+j$+R6S8X<7!t-;*ST_;n;0|DzyXtI_JMg~u~TRAs+tPW zxqTrJ8`o1yhKs%mcUmB72z{gaTD^D}s}Bgt3&ygYHzbZLaNi|x4s;-+-_Y}&SxCu)9AnC5%Cy&PXnrNZt#!zMm zGY?~mcAzZmz!{*?+D-kkOq`Y&>H$FRARoL#Mmy+2>iya1D%AT%1!1p5Ck2xN@Xp&o z7aD2Al09ILk|8$w_A@KJ34VH<$=RW9lp#yciL(atiucM?diXFsYo$?JOu6M+qTH+x zCB-j!SJW^znsob@FsE1H)s|GQT6xp%-GpP}2pP1d`x>P~$i9cvb+Bg9$fikwIVyRI zn{s=qi zOwNAU+8VZ7*?IuX8MfpO_L96Q=CTyRlk@I#n@C8@MC|9nwEFm;N6tTEY^gS;e!$LR zrH7#(fYpSz;n8LRWl=NY68YMT)Ft9c+IfVGwyAgg%G%p}Z#Y^1p&(`6LQX3^!GFD+ z{bk)R8oax~uPPk)qaZ)x4Q|xT*6=L#(RZz8OCcJhL|;;Xrqw27A-*2IZ1dKI^x&M= zXJFq9lgdf2FZo7`h~ix4iu19U#)&EZ!aa}H>`l1g&Fjow0AkQ44$kfCSi+^}g2zSQ z#9W>RL$%~CQA&zsajmgbIEDSxLsetMgYBGa0r4XoVSkkS9?qCL3`OYmhkOEV<*K%FqQd!J8?{qJ!Tg zBCZajV)m|;=;Y&ZK&Z(r!l6(ImJoesYl-H5_Nq?^r?ik!9N)si4iq67B(6`Vkt56; z9#L0}Q)9Pq3IA*~!=+x4YmegTFjUc;i*t0Ln4d65)bNRKP|m{BNwv@mb{TnCC69o! z38ZCZGeVWa9gaesQR9LGPiJ749^S67(lKF-M7Db6DE|w$?EISRI{t<)Mjp4E6%17s zK#=T&K2T^@*#Y@U;fEOW2IMeVQ(Z9q4baVZzA#{nI3N%z2_AHLrZf5P(FD>aTZ6tCEqNFWk&>EvZxCE`g?>*PxTnD;XQqO?qCa0?!|HGz1t)2FfD*{Kl@n-RrUXwpbbyiZc?rVrG>WV@pSy(;Ux!wdcU&0dM@1ro(p zA}#ScKdQ5ZPPknC(0gVe3j;KDHrN9ib}vo@t8->BU5al59VXol#sS>?ixDNm!6!G`vd z%{YzyJQnowZ`)Apbq5IC&1#DS0X^ax=wAm>HRc@@Oho#o@%sK;>gCp$%qg~98(Y8! zM@;>*DLIUdoZum-(}((@nLtXkEf>7Ma$T)AwF!P`Gs~HXG<7CNF~SA8_V>%cl-eB9 z^xq6cCml+wn=tF)Yp;)CQ4K3hmXc-0%kjEIq>HS#5j#?CNNSmA?W4Ah)Lxh}QN^KL zQKubx`ZY@}>!CfZ^*cLE%%fM?5au(VERHW>U6E zHU5)A)Ah%zl74SY(S`tc`_sE|EfpeR_C4T6jSQvkS7Jy z2s`WTe+%*DG)Rv2?rF^WF)5W&Hv#HhBtDLU%ZP(iYX|UF%in(^d)$Nr%e?;v&c7p; z@1oahA&eQrs}gN{hrX$h0yD&zPY@LrkS2dxp_KoLkgLVST8`|zgTmLpO4;(G;5snmBhp);&Pk8#;nH`(GPW)YSO*!wzu zG+S42uZ&F=%RpVRUlQ4tR&M;Iq_OviA5U~TucnIbGd1}9iH6`v7NEIlPoQrb?My*@F&Cf8cY zLNvb$CRD?=W5P7mOI;?6?T@}REqwId(SbdMvkIRk@jRVo0EH?wEqW|(0}l>nZ6o^k zAOUZHinrUDSWi-)+=9h%7G?)kW7MtCMss3h0z9c6QV{w*fF>mXNq5ldim+y%hj0Mc zFVPusvUP+$4uX9r)37X`f98hTIAj4^G?Z89Dn-vD3d6S2z<#A6xcUP9(UiT8z8?4s zqV40&0;v}M-g>8JhYW#lRnYG7USH&Sjtqg9ATs+TU!QxEGYX?(OLRn!fEv%C(JArq zHmEIFD2@2%ZIE(!9!_;Y`>ghl)JL=qe}f47I0j-&m+;X=qKRFZzS(X1>^Jl+SDWn~ z%)R>n=@u3yZ4%2eWYu)>*%gw1vLX34nzJx7L)(w;;5zIx&uS^0s#|ynS<5+|cD6(owEgynMY8P=H4_^>4jl z#xDm)3taN0opz$5Q0ECO$z7-bmC#p$R)hy432x@b)Z)zw;c-?NJ|$`pfq6h*m|(i& zFq)ukFT)&e59Racf6TWsK@d@u1_1(c0{i<4Bw0HVCnE!UlmFK58LXsZha!N+3z`&s zi5|D~s(@^%by#ruS|uS-pd1!m=wm)VFnsA6VPp_OqqR3ZCv5REJeKddAj%Cr0t$L_ za%!UUX~XGvPUg$U@tYh_rn`k90=0v>I%{3X8w6fjm_BJp#}+J?c2s_0^aCavoHceW z)=v|{;O@!VjGA1}tY)0wQC>|IJhu3^s_m!G9cu@)bRSiH$U??q+4dpEI^tb!TURt5!%MAye ztw$`!#Ar1WHFrsbOa!M@lM(4b#}n%++|^n{Z@Cc&QgW!55I1c(Ft`ENyeZz)WnqFTzpwVPJ6e+Kl|C05Y@0KOC(L8N|P8UeIvcY=?L!A;)FCHx7aCo1$W7L5#Yu0b(1SKqRdO>--cf%>#uIS-|`9)1GEheb&8F0+}U4{AdpvFzaGGfCDhQ zeWGDT1K*A`pquC(wt=+s2?@`vx-ailq661J7Cv36C3t_9 z^8!(LOHZE+_pH-j3r$uIuG}WR1U#Zr zD(FII_g~F@FOZr^NnjwLygz`%{#!8qd#6iQ> zmm>2jv=p7OXH?263IZ#&)WP~%RTTV?T^J0r-#ZgJiqhT;7KU@B3I()P;ry@qdR9M` zSr~oh2FSmN9ya_H!8R5`y&R`nx4n4bRo6Vu| zR7~cvO{Zg8io%rq!dgmW=JHYX3S8r{GbD+|xc(WgfNBKiK&OV)CTRzrwVbtMgSS$R zZ|@~o9nq7@O1Fp=a-cyNjBUV?V-t2!!GyX031VhW3q3miu*QREn&lD8gqY;Ld{Zt< z;M|eTvXB6UwI*6LE_4V9_>|2~oYn^v9rU&w2N9A7b=KIYpG7SOmjuDJKk>=Qe0wKy z!)j|NGBI1MJC}5Kl?YlmRPA#*_{q!KJ)y%(q*bg$B9K(ccz;!0>~1sYgw|} zOA8%oB9MI)+IxnQdB((wh_TMUVQBj?GGBQwu!qbe={7JrHH%8wrZxQqLERnB(a%ca z*zD_nBYFinU`x!1g?~C`L*M~QwfqbC4neVBbZA8wwclQl+rlv+{opr8#xx1rEDmu@ z-DgxC@Hv_6FytgcVksiy#&^DL1KXdZA>8JZBuo-I`{a!}fi4)^&ZEZcU!Ql1Sr><& zTHL7U;-R>zrG&nmCeAu^#m| zp;#;CZ4xWRyxeD5=>SAPyT3UwPNZ_l?+{BDq6fsk{_Wj@H~pM{xRx3G@3&a~dDdh^Ux8tLi*yJKADWG=%(T;d>r*P#pf~Zjadovf=Bd> zH)`gF3(vjdYJN#KHtB%ub8+iAClC5*FR!)V{CqwTGXozqOcZ8uLk~2z`WnNM*cBRW zY5|AEF&QyjLTCPQeSRZxrAv=kjkHg3%m-Y8x0?oEKPswScH&639c;!|o0Fifh6N}6 z$aq3lbsX1lV216aAPQ(n)wE&`J+hJ>rj!OfwiW4Hm~7M>nCsE!w9@T$%+%fI_CG_G z4?p~kUc5t-5c*9Yz(l2Df*eh9rTjYC${u2MCixklxOxx6^3fs(;x1x^=;VUaZE#n; zcVN{#xt2<87Kpqs)p?G#W^S;ASLr0cYm&f?ikhtKM2*^Xa+P&UdY>^>D_F zRy*h!T+*P;3i|5VRQv%cjj8>Qm@R?r5Y>65`*=bwYrxDjpElSQhVx--(#~8BsHj7f z+ls;zA$y~bc<^XXJWK_gblKIUM_-W%;Dll+#0c&5kcq3E5%^CQ1)tecH1J%#a5BRQ zyiU_QUbkREzZlA$k+@QpG`DV@{3drp)D*_KH8_C+91CCe?WZz@~g)NA}El|A9{0 z7|qEehukxmm{DwX*>TN>66W2pUuHS2`Vl@5Qf%egA5`Z zRY1IvO0h6b5H*5>Yf4c&%SC-1Iks2JJ{T52;Be5>a1Gb90<8d(phe?h=IYyJ=W6!& zHa)EeykO4_3s_dJG>z|jz_Hb*om*1bP_FBZYdwY{Z<&r;qK1SUi&@@>gOw4xR$ck+ zxLVgnr;(D8W77(m;{5Ytr4)=FH1I`hq+{NoZLa0w}39C!KFM^?7rMbL4p`GA^E zW<7Dk8hOz5q{W~3{a4un*9}T2ZkuY)Q!9QOaA1MlF=PjSScj=urLcPJiQD0S#aQzgmmJn#68KRSMt+{RIjkSteVy0?fQxv)8? z6bhY?>r?b3r2js&o=EVc4Sf=u--+<$s9gU-Ol5wN0lE_vT*#T9f~ZF(RTGP{!o2<- zdZ6!8R}MPYDht@;TzIyFemC%*!0#?*-PkFQD z(I5=5gO~)dq!AGb+e9+1JzvDW9(?ar@ruGH3!~H=-N+_HFsq%%`w~cg(YQ2D4YBUw1 zFUbiP04$?c#`745n3!CAhqNMT8Fj;dccK0PLwZsP_u7AG&p+yi_WuS$BXbLDV@DI) zf1@y3QAh5dYwC5lXV72d-@(d$)D4RJeUC=HsLdW+T^-6Tk`u-I z$K<`fY+BU?<4ZE;r@IYiCs$ux-FKkc=t(LNp3+@HJjzOnN))P^#@Q>@{0(bdqySsT zfuI+EwvJ4A#MP_N&^qH32nn(TuzCS|`M z@M-TD8qKWN6%1QDso}WOW3t&!kL--a)Po7f_GWIlWgAwIo$tstZmu`f*58(6@E=rF zH(o-E%tY77Oh<-XG=qhPK%p9rmRb7lC@nLF$Z2x@d*&5iG{8#LiHf`q_&^|X@ zC(WgXhuA*ZC~E5(#m7O>9O^8@lLhHdSi-3fOhXODvql}L@L;RSzV89MQ#9^7D+lLS zhhN-%W$#aq)@*P4fvkwNhfrO4xyuiuH(62a=7*+)4udRWNK(Hk=3O+)fl-B?QbJb- zNhv|qHK0$sJOe1G&B%e+6D>Xq{*b;db;lx%n zBwhF=8Lj>ZHSu5i3c;jMHSbZD*f%Kg*Wqz`@xt>4_ETu9k;=yAom6{IU2IL6JhcFK z#UM)1iW=c+n4X8Oe7l@MMjlX%4e)1`j7=MY|0-YhY1X=n2|!PIhP0Op$6$u-vR(p7 z2{=?d#@Vw%uD;Qw%@SJhu#-knuSNrEt{u~;<`7QT%XAzP~J1!PvLtvH1~w1W@v#`xb!ZhRoy-p;6`$We`B{1qJq1U@7mf6zey z_CH98{tF#W_69~K|NkNNzvv;=wtYp_A4U_&GKsGy-5C(tSjRmo=MY8UR*@x#73*$@kCbk%ggz>8&Kv7#m^syD600$gPlZ< zrLFEedxZJd>K4g7ga;k3e7&nNF(d}n1&tTQfkGCK0|q1UlH@SLE%Z_KpAs_?x@Bn$ zHLa(?=%84LA_UEAL5^Bh7EMCP!wJ;yQ&Pl--_zLVo&}5xw+~aQl!L?PZqBwpXt#hH zz%3|HTB-M0q@l*RVG~ArXG}jj6NACMhls7S_t$2LO^A5oxGWY+0-}JS)b1&<4L%YY zY4R6{`^J=g1$Bp~-PToSmkmkY^>1kSwI;0sc+yWWPFyr9y61&zKb@RIi}G$ zXpIBk&L42{(C%@i15FzSQCmGC_H{#8KO4fBKx&)Bw?8G8+>YZm$LoJ#>7_Pp{GI+R z6tar>B*Rcqy5l*dG)R=vvSyO&t3f8rWv5BvX}YfS&iHABB4z}ZsJEj)e@(XqjoDXxH5kvRl+*q`tymN;g? zY{C4CYX%&+%KPM(g&$wOrf!Z8j%)1rfiCh@M8KcCH);$}wN#R>d&K64iT%f%ijsW@ zf~@`6_S@BIOJQaJ z~ylB zh5|OL|Lq-dOv8UJ%UD(cTfKjhXsd^dtz{4W9M8+P!MCKRWt`DoH@uyHzy+_Z@3yY_ z{o7yR;fCB3S^NhcDWHEpT=p;Uus8T4L7e|agA~ycJy+$4FgB&l;LGoW7Lv$V8YNxx z(Wqf=OtCdIMDxSuMDaa?J}V5gYnj6gCCivz9do)JU1aIKzryRoeq#l5R~%O2QBqe? zCsyA2X7vs!*t)ny4#s^$h?)X1bjyH?Tf06F8E>o#;ZR!Ob199kM+WL=jUwn$iL2GU zNzU@RRKFhXoKUO0h0w)y6z{sd;?lR`U`Fx2UKZX_H#!8UrbZ3sl_tJ?VJ5dYfG%c5 zeB{A4Tb$Y|N<{Wa0=Rr-%r>Cz8*-yu*|x_SOMX|cRkLQF(q>R4G2$ky1Wb`Hcy0^f zd7-Wg?-mW{?JWd%STTX89zU#b&7yAh;3}hKz*p`k_gVF2YFUVz10E*>x=0slL^8jU z&0T}fOJ16}f(D5nb8j2q@5mQz0bdaw25OPE0c2yhQ4N2j#{$S7>47YzVR{F7LPM`+ zQga{?3BLMm9%7+34RvEM!P#UdM|sR}u|1apS=O#+n6rb^CcPJMWx!cOUAfamfER`@ zew6lic4gr-Of{m6ON_eXgkEB|NL&6-j;;^Cig@BIlk<^L_*j&^qcE!h89bb^*8 zv(X}>xRx}X6q4loeXe{m7*zmA6F{jLhNRrtegy(M#idyzB%u95tGyev(-RNc9ij&m zm5l^Wn7(p*)%A2V>2CJ)HchVwe6g>JjG!vj62pqYuDt*b^OU6e*!8_@mIv7$p`V$u zc0on+aqqK?Wq8Y?XF`(wzH?`QnJRo(Vwg`2nNu2bEimSLYr!v;P=5@OgqO=JC1R6p zX8IzFm;CrDyj4U)fO=6um4aHPrSao_Ps43p)Lsuv>5y|p@`r$;4Q?z3^rVolz#D!r zF|RV&f=`)Ed%6S@5t90h-wK%RG=)@qAs);E(*vs6&^IbLp8lloHzymZpcR6+tu3R^ z5}4og_~gTLlP&xn_1uMOqBzmCt^deLT8wp&OlEhgnGs=`fEaX&55VR7a{VZTdk=Ff zY3;N0nphcd=e;NEw^cD_n|sYA+1ePM8t2=C=UHl~7VTdgkt7Xw(0fLjImhbaiRiF6 zeA43`r)O8FSyiBS?BGYo6{rE8!qKj?8@b`c6K=3Uk^sV`-5DQ2YTXWspqm2 zPgqs2Ay_+Pimswg$P`^@3KGVa!`nx?aOzUi#!;Qp?Sk9e`r3pRR8(tU93_Xffrd!9sZoHahTb@estdYPIqo_@Kx zTXzFmcVFm1Q#IU(bl@K<*Z(Y%Vxed1uE7r(Q=hruDDh=y^{DoUV$INYE&ZK!YQ@J8 ze&uXf30v%w0wDAyC`F7?Q=4J~Ybfe|W}&F6aw4=w3X%~Z=4?78RO<7Ngm7|==7B<_ zykImkGoSyt@4mo%ZhfQ8u(-y9B;2lzHsMk=-)YcY@>z9Sq>SFKVK@i6ZYUSa-cUwwBIsjQi3|DEEZ=TLStJMzh?6*!+OY1`>_RWuG3P@^Yc2 z;4yP6oGf_9L1k#I`>T8H%Z(DOBKcDx9_&21`tBB5Gf@s7@Yr2hkO0d@RppmqFjs73 z!!*jZ^nDh_^5X3pihn7-WAp?XD+yLhk5CVD!9LO`5KNb#&uqhV0VlmSh`Y$F73a5M zhIcg9tEF}oG1q;Rddvsqvp88?^wNpJ7o+a&U-%nbqw-a z=}@fu8);Y2e|0L@i#Rygnj72y)AIK@8Bk$#;7n;-MtX9Rn{qA6H|y5fDimWY@CdH( zrvvZ#vMn4O&D*AS*!EKp@6yvrT2$&Ky~)g+V-HXE&ZUD+8o1crlL=J~u#!74Abr-B_rNX`grnp%GX7 z2{?6PnEXOhoFA9U+^RLuoMcOlL7Xzx7IPp)t!)`A#$)REVgn7iV*WjCrWMbT$CWP* z(^>0-&BNUv%`oDb9L+tdmv}*0^~zK>^>73aby*HA5G^xiE~a$sj0t}_5=zxoqLc+n zH`dbeJqB)}*y4lJ@(mOz-L&a=~OR94iG2>XS zl55lrX+tduQ((SRv~?A)0$p=7HW-MsD~eMBMA7sJyy3@hoW}zx8H81cgQ&yqyciFM4X~AG> z`~uKYG@fxYfdZQSmzpLrF++)cLy*mAW0)(e2G87cr15T$(uppRB_EVVj;fE@KQlW( zQpj2=l41*9mS@*U6#OXmGvwwGKm+Bt(rJi@g2MFQ2x=^Nu`~Bf0=kP4Eu}`PF-dq` z2q$N83i|Ocdj|)Fve-7lcWP$^ibuny+GDYLx6L4URz!ev4=c{ed)0wP9A%Be?=#S zb7@HXH#)wc|H?$!E4bO2J6oF?+x{O4(n(GdRS!d9;CvUk6I{+=1i%cpvo!dp<1aFklO7k ze}Y&&=4F)lJ4{%W^s4C6UY9>F1k;_@?2%0BYku0iD2s(-cYvLE{AMY*7cLu-q>fnq zFmagk`0n!xHhi_rHd>A|*RJz!a}%nw(kq)+bBw8Bm}h)ghlo+EwIte+scPz_qz#)! zR8$|#w8W`RJe%N*XQJ?dTDt?7KN^Ii1#2RjQ2|G6Oc zE6gqXvYgxnMl7u(3{Q27*RjpIoZ9JQ2D zT`|Vfdd)%Fu^|Nip`Wc){pY{^$yZ={U&;=J7!>6cF!@A4uWB`q9cQ0&HYtcm_p!Lk@m20 z67@;yupr3Pzy$83%UbhBev$mCAPL2x%)XzH%~<2z8X^k3a7dOqLG@F_QLGk@cMgz{ zD{fE0Bb&EvncT8cJ~o&A*eBVjWAc<2kl%#6i6q7cs+s$2GC*{TLxc&i*dExkR__Om zLdKJo{bgofuTo!8)>YNCf(WQtxHsNiA+dVoa0An3ICulq>mK`P3eR>Xr9jAhlPx0L zJqk;#rZ{LTeq|HjAfKQB5K7;QT$ zg;11Hz{MIFq)>W}2EYrEiu<6TVY*ZE;JMqgtSwrCcJ_&GhM?pd$>X2F-js*=Hj0x$ zrz}pk)7nlp`A(+ae!gCC`FmA*pGq=D2^{iInoJLYAt5@`OzP^^M!+rmSapeG#Z>xT zqU?r6l)!hPaD|YXVABy`lhAJZq82MHOQ3T`S4afqEq)H$PcDj|qa6@y)-|#Z>C;|$ z4KU6nPg<>1e+*hX_5rDaPjXFz;@gzsb7171gTg_*;#rm_$f^(LL;I#0}Hw6|6~-rC+)cKho2Y#jFeYB)b%hrHy?EnKVZqTDDGOagWt7oNr^- zFH59ZD_by!>oy8Xbc?!Ye)(+Bu)Bh8S65Kt=&m@+wx}CogSHe$S`+=y5=}qE9kC`cs^|FTLmIMGJ+cZ&twxni(` z#+nch&R0iS4@ivAgoRZLPk|*G-_0dTZL}pxrOaZ#dM$QhYqA`7Zcr@}MY`gnp3OUmQf1G(Zc}i3kZCfR559f*wW=V%9WgXrQzXLIqaX3{8`WdQz@JAL(+#L4&XtUOB>fnhk6h$1Ow z-_)D)QaSU0-`_(y`O#T!15R7a%ahgdp~dA{kaxO%H29NhjALrspmXE6Kgy!bn3dd{ zY%qSCowhS~wa97g$}57_82kctAKOC8-KDNjX{3so&Qq-y7$kp)GyJx(ZmUtD(f>My zmc3{@CgUv8?_#Sh|LxnH6`m@nffB_-r8w~RD^a9zvE~pDaf|yH<%=Gr_abtj8ij}X zy<(r7$Ln!>8gkr)TQvd8q#H}O>fRyM3EU1t&Yet)$YXy&@pWfj`ol%7kjFSOcJ-{F zJ&yE>TH=ctMw2N!EwPZG&}3$yxkV4jO|S%rUXi;$BXevP$sr0^O!b`AWZ1AqRvtYr*tT|vu+RlH;Za~K}GVhc(KYil(-v#s^hUy=A zfj=enm&8Dls`Bshfc&0p;PU_w3l|aZCC#-fjN*blee!u|Xs>+RD2E zMul(^vK(ehQ%t!4<=UJFjjkX|0*sp}l2&8dsYHnG&~gC58nb)vC@ZYnhP({-3P5-^ z8fU8bZfjb|ma@dz4gn-l;k~P6T?Vm~3nUSrEFrj<8xh%kS(QRqu4)!`?BktGn0rzH z`d0Q#l+{9+FEHy4c`5r`mY}p+saUxUmm{TYn*%X_8hXi63ukOF_Ntg-g=*jRahfmR z(kxd5&%9mmyb5h76bwb8+nAfNW&2*>$+vpCvvFe>d@-TXtU!dy6GN<>%wSwAB{&bR zdSpmnj_iAWI0GIBR*Z73vd7+DSVV_becjaVuM!RTh_4p#q!|U%07-GgpCy1m^D!%Beq;>iSr+$Sfj^DK;fbn%*3iObM&MrGoGg~N4nF^n6Omv{X zmQw?_Lae7b>UnHd_H!U*AbpI6giZ4c#3dSzYOC;$-o9;rQB4LYbD%CvA3khQctVUZ zh3n9{rJS8U@j~@7>OEcMIz&AYlrLhHP{#N*Rb~;pL$CHAz+N>AVBrJ>7i2(QBc7cf z>ha@8g|cNF9mJj=pm9V5TlSp4;G137pl(EL9JaxwqvlKh{@X5!`gk4tiujXxp* z{1c71?b-L#S)4O&{4 z2{l9&h^Uv(n=~{1gE{H;@vYLSzJOW~{nH3pHKd-bOHRPirBv}C%UgU{>B#O=yx6JT z(1IHB_BD|eiAl9$5Tc|hgGfHQ4ytmZY|NVm7XrGKDZ{zDot=TXcr}nrS zb^=I&JOcu|v{>#Ar0YS%tQQT=Q%r2n>rv{tFe%AP0K_hKCgx32Ci00X`UDF>ia zqmr~nJI-7YZ*bR;*G5C<9JS#ciD$dn=B+W}6<12{xR|ABxNA|)S4@9p2jrziTmJ8( zs0`v?w0Hl+4%7dphMMjl{`4J~%&4!?hQ)v-Y+t0eOlKeztHCV)i71?0Agu_|&B>!V zEsOIFcIOw`FdRsJSXj+F^}!mWNFBzig~xQ}#8Vc}iR+hN?~h=;^w}58j%?8yk*C;0 zsnJeyR#Mifi*dt=(b&aqlSUdLVY;~2R;?4ry0yVom^h?mV+=s6WuF0@^<~>WuJLQm zl#JzO(e!DK8Y3RvjJ@;tUQopRNyJvBX@oZ<6%t%V{JBL9(w5zip~i) zt&K1gs?7xEa94#Qmz(Pn8%E7cyFm%29k3^;vmvxq$O1&Th zbIJ77upy_#O|0BS$Kxi9!|U-DO;^gbicQ1vaWKQ>Ud9c+r6gX#7!L5SpLEsJ->CCZ zYvf!t#p&S)JbTM%QK;yv{y87oYhTh9~#f7Rn?S>V!8{~`wE7c~o#by@~W zJ}YY=eB&c_1~pmqG{^4dKl{xf1T8$rxXQ3r~ZK z`{T-YB0-SL{a_e04}?uN$DKj2Mft-z>wS{u#%1QX0Wz={1b{JhSK>E01D3<9WB4GO%6H3Q5odZ+U^rD_d|&GYtCl@-sFmU^H|F8` zSx-#Rjn{*+STvSIKZzQObpLs=3I%H@-pLvPtsEkgIsoOBR6)J}X8QW;F4d+o0Gn@t z%Vw+LTi28*WXnY|fbS#`Ik?qOA!Ek})y}1NI zPv2)!%GA#nTR4ersWmlyaDTXZHtwY8Ie#)Pw9wC~gL_=|jUb|Wy>51x&CY9j_64aN zCv&2pWMr(_zSq&tzK3-NcVM1c&YBfcuZR?{j1VDgYayY@%bMRL&L=zcK%!&IVzoBo zmpA}^?wY!X4+tbAtSTRxee`!ta-ZUo~PdXK+R7+r{fZy7EF#A}_B{njM5VoLF5Yc<>n+#0TFLKMT4T{h& zPV`gBnAWsE&HQfGrEp+e$mO|ZBH`22aEH_~+UC>37m5VO^plUCsaHr7n9R~IB5OBr z@WWe37fHXMVPc)XPo#~VuI>+H)!jyZuj!yeGip8Lj zHP2x6$QwkUL(T=#1q~b4Wz%KOzUK@!o0z`A`O-sb^^3~hj*hSzyWKUT_D}Q$N4vbT z7{6rhaPN@xtMv(@^QPE)dIJ!%va|AnWq-^{B!$ciP`tOY>{8Za+$nTwYA6clY~7;Q zsAKtt_^;%CGQvfWWR5uI{)qv|w#{vN1S?W3t<3Qi{du&GRm#`)M{_8 zXxgF@Qu7PyhUfx;Aurs1%qyR^rx)@Uv-Ps{a6f+KFZlWT{T#BF_MC#-^I|tE@QFgs zv^a>~f?yGUk_CO)jQBtie$BgJBz6ND34B0H6LMd6|2tgQ)Dwo+_*U(VdW?eQ2Ri4XM#Sfr5?oBGh%9LpmC6unDCWW@W>|bj z4mDwfJPHM^#cGv@;wVh0K@+a%pi-akenvYX4fCNN z+CVKcdTApDWjoXQe52W&a&U!2uQ&=*=^$TSb6G~-V`6`Dq5S$+C^$yUIy2}AL;+@Y zpgnEilkcU_Fd-kvz-Zw8^T4}OALh;hEsDGSIy=mdW}KWh%OfSxZ^v^0oR?BMV&W@6 zeWdM|Bh<^5t}oIyeY}c$^XG`5%mGetp25!Poswi(6uQ>$!pB&5L^CyUTh<1|9${}k z8Eh9Jv*O;7=6_k|H3{!CGzP4s){0kFPOhyP_I!N8dl-uNRoayyLLz-n)9!w4kSzXpy5Ce&U2XNj5 z<=x2uS^cJz8nZw|t(kCPfJxo(Lml+osJA47DrRLr$Z{$`Vv4pEqlzBXDB*|e!t+}f zOl!T3srUJZ62xYOE572xq1-$dgz5{12g|0CCI>B!70Q^WvX|7^$;em;ssb=xNypU2 zZ?=Ee9?MO20KkdrsPQ9MPW(ptwIf9Jh(Wz(eHv6?(J>XGy+#%Xd;Hs@@u~szC?K?c z70aQp*z7h@#?FG~f)@5K<4vk^VBb$T%C<(_)UJ z0}}vPNydVo?iXWg)qGV5A8YA~-CLjh;+D(?JW@`alY?&^7ZZ@v$3^O>u>5>6?mI~G zhptfv4XSeA0 z+N~^c!fdW+7 z1b)qqp&^oc>&&k~tgJD_?4WN{Wir$Za}=49NgqPt-tC=(xD=lCJ6UgQKcXQKHEh~nSpQYL=NSCTY z^bp>?9d7_M$0RiU8-=W#f@nQx)rZq1wL9f`h*nr_cnacydML-YCK_>!P=^})glA?J z(1w-$pBFFCi`bn^Zo*$oQz@*d?46PwC`94Zx5b_kpH1a^U+SF`7jIxPeAu8ENh_z>tkpH_fEzg#P^XZ{e58o*Dd+-=_-$xVSs^CChB3nRzM#;L#thOdyy=qgElgNhxbVoM~8o|e1N!;Qr4 z0qX%p1CuC-(-a(UwJg@i)AFp9pE1Akdo-}jX?i_4IdS+zSxZdDN@)zc!ej5eX=0VREH{;A3{4@ig44gYUuc)?9))0B zRffk)V)xTTcxgpl_Wlur`4X^T8=i+XRW%73*lCpBKYm_r2iKqQvm_ZA__+%?S%q3h zBrmpqo?2;m$yJi=%F~g3YWCesmb>9Gomr;+Jd|QTkIf8~gXMU#-U35jG*!X-!J$Hx zryM_AIBy`M(b#HAP;;VupEtew5Sm1G)D_{oeYddY6az(Tqa~_ET3(C2H!u|C2A>xL z#oE4uSSDJ7-7b2g(U75CLwM50fQ9dKINRP_{9J$rjz{cqYO)iSK0MivcnGf2MTgdG z%WE!UYp#8&+f&;%~pgSGST-`&R>56O~4Xi|! z$IwC}zZ$b#Tyf>VGvM4N2%j$!+;^E>^f{_aia%EC;e}7e@g^3&=tb-UX>34#$s3(a zV*9>El_l)FH_Sv>@YmGPt{?8HWEBXop;5)kf?YEH)riQ~1urT};2HIbef%5Pblw7z zBZ&Ut5y5*nv){L*LrM0?E0V@UUZH1xpjG%~F4d2$eeYsLE4_EncTZm=`Pb0vV%pM1 zz!!fuzR*H6l4FbOQ>M4F$R`<}tloyFB(0<}BEF~9qUtBNrxh;=xjkkn^O zB6(YjFP1lI&W6akCQ%=k;esU^$Idd7h&D#Q@`TI@H;8Gm*()U$8~#-icw0B#*r5NB zHRk@eBw_#OEvuocgQ1zR>pumK7Z|tP^lCycn7MJ}Ys-$cNas_@6E|+bmDMeBA%Q^QT;9KzHo&2hdV# z$ZggtiBAQ5%fPH}HQ#Rz;}v}mrOJQpX2RCWAbApkWc3;~THJ`z_qGE{qNksY3IXJO zLP*c=L~{T|3a3tAQzTW^$V%cm<5>o5bJ>vMZ-nX`kZZOOK~d~p0MQWUo8LP_gHCTx zqeAtVB7Q#@i;n-MqT|8f%cg>-#517$(%rP?{Q)%1WdJ$yhth6CvHQNta`*Jec> z#<>A9@Bp)sRyw1FhuT?vy*WNuTuA%`KpAQJ!GUYH7b!cts^Q_Odpi}=Z|bGv+N7Mf zL_J$R3#CDdHa@#E%>rnD zHh+>#lt?$(E&_vgKLXZDwn>-h`7;EB$$a69uoT*x3GnJuL5FSw(tF%+Og;?9e~o%y z0yt~OuDe`LHrbx0GuMa&d;Fl3`cw&UCO@YxFxMR5R$qkXafh?ZjO)%S4aNUh{toT$)f!|LWuf!(S+=MgY>(mswiw{@64j+gzC#eqJ_ z>d(OQJK<4xSdl5|RT{8AE$xo3>Wy_o2O2-BiIugRKXEA=ehF6vNKPc=Q_);%Ln1)qLyp7{t< zfj(h6P&fJJSKH^Nab|V=@g&;`{<0uL0u}KB7IqJ3e<^j{kD(PX#dbdQ5%{f5_$^zY zwVUVR&?$wq(jmPUrM3iT-7Lfgl_faZgSKIMafV>i9xomL%~4^y}=@@ZvWo|#i8kct9BI-0kdvW zvaf_YfQx@sw)q++sH8%ob4gn~dORw-z;uDHY(BajR`TUsn`ow>`O?9zy zaCZIY;Q+qglSp2XQ0^IoRC@WlKQW;W42{Yzh-Tcl=u(vSdT>+JGUvyi!+|E1qV7B8 z(6uOaCEc>R!>p~fG?(Ma>FzI+^z4W?y{^M;o}M$f|*QvM!8SOK)Np@b>QU=e{j7yH5#X zr~E?=ai1)0R;0lSB@~QMWlJHE9f4q>1x464RLx8-}P%AuY_IX%NfRT zW)y$E2sZ|@_T@792W&@Jh*rI?JpBQRIj>e7bWEL58^O5Y03ggdcB_)}9rUmKsK7M8 zN%`$4!w^1wqWX9E@t?fV_;Arv$N1PZOK4f^oadC5T@cxd7vZ$F(}4*sL{G4tw_hV) zFHFisHgw;itg+qJ-RZ8X(ka{dgfiryq(WV~%atpmyCxQ16#4=-km7{@jR?Ds2-^~W z1m^?fhs*YcucFlUWJiw64FAdI@6Xfb>-g849%v(|FGRw0&g!-TSbc7e9EW7keG$3- zWJy`y`#xw58BuTrYWA$ac{iD(VZI2bGs)Z+L6H$O!4AmX>p<~EdIH}1-9ADY zzbQRLYi2@k20jp0wqAVgqZ&uD<}TYaMmT`Ax$Ix9Jwx=GR$9NAj1CIOuC-gZn#BFt znYQ96lLuIeo4pAQIOc`mW5|-kC|4;?YPv)@%Rbhkyx^{OB~*nj$?A7pPTW4|i`|nx zk%Udsrked(ClYM_dYPj{DR|!c`2QM1` z)mUElHe>LQv4LTf0`tim30>aGxYo4#;YiyIkuBRfGsExOdD&v$^DiHDWiQ3P3$1Kd zgEbVMXe+K}^O&^TMT|$Jjc+B}dHG;BX)TZhE0rX0p1IA}PZ?2wL6Q|HCAg|cJjU+n z%rmiwZkHx$T1i>xE#R|l^2xVQ9JN}&smrhA2M|F`OfP(s+8#{>Q;5G+)53y#o5X#T zl4VxbUHAf#bWC)Tv$s>F#F?2qod0#x+sX7BE`tYwd>YS;vn?+giwX@}&Q80_i9#?! zU2##q{?gaUM+x~EnW@uD)U5gf+x`yKH5DV$UkZKlXTl1t5zpM5ndjby*GH6h(c^gX_2sHV~~>$w34fDI~y*IF1cxBpE>0Y zGz?qlIj)|WTwstC8foCBL(D;&yPwP(GATRY@>CcB(e^<>;}xJ;R83vH)ddI|mLHgGi!}_-F|$Wf1pSWs^+QX<)TzuTNrKT*=IiTaKX&G0b1_6^?x)&tyZo2=0^=DN zZa{Edu(RF$`OTthClu+s!4!R-F5t>uW;Ak(h~0Gi;ROfpvt1+ws;uTtB3m+>-Zm7V zrf#UnteIyII(i!_xIkv!V))`0T$G}IsEO~?TSw4)OltN=vQlXl8cWU?P9vE~7ZX|X z6H{Afu&L@jFy9wlev5aS(G`|RE=T;YeK2nrPrLHnfjj#Z zyLNj0e2dR`6gxvXw}jgxJ8fRyD`4M5?fL|lIG$5_N~$*7bOe5e+-P54e`+4cl^5r$ zl45Z~Z_npv2NcDqTYv@$xBp%Kf>uR?PqCGL9%bWM`VL|4*=^$R1 z-Qd<>MyO9H7n-1gEtNYmUzn2#R$WGGN^49i@io=9h#aa;F~T6y01M-CW5f9GvZpU8Njs&CH$uvoTbbRTyAK_PY+5MYf`W7+0({QkJns z{A8k921=6;r$mu#e;y#4PRu2YA2h?Gr6xts{V7Bwk^mDr2)Q1>_Sos=aOvgq)eB;F z5Euo(gc~)M&M=3g!_>ejhK$3#P0c$;_=(_Q>V(%pHC9Tcwqf=NgC-_`1TM-mL|zB4 zH?w(m`3>IOceGaXHEQ2-O(BJ3CHzH9=fR9xFbOul+Km0TP6A{V1{PO^BoYMKAppT`b6>n4cLDzxx8>eQ%C=>GuU91 z)$OkUfjzQLZxllz0{ANHKo>I1rZC*C7IRG{o1t-Ls2t{%mgZ8IQr`{5-1H%_f_;m_ z$(q9ve3s&cMu)`|UP5znoJ#jDvkv_`d?H>n}50@Kn8R$g4h`DohZ zyHhb-7>)R-au?7t=IbyvTs!@1qdCP~#ZZ);6h_#mFRUa(qMw|Ehr|g|9JPm_cm)PA zFo@2cv2#va!xi0phYwx!RA=A6>cpY7Rv*CmmK{L4v;349TH&?d$IR+r6Zf%)af6vW=cY~uuG13;*4m`!vMD_K-R2YaE39#`6} zcN*h<(Kir+Wm=%%askBvx=z9wFnUVtw`tUuR<3Lbzww}TlvFr=vZYZW)HEzLaET53 zc9NQ=x?j&jRcobJv)GI1TjP3FX1QO|ruutdj zNM(3iq(n%k}r+yiA%oX1RMP_43C% zihHP-x1T=ox}*H=9~K`4+)a^|nh6D!54oUwKs;_KeZXGIU;<|?`v{)s%VXVWMK2@=`dt^qOg4~a(;(q z&p!!OP`%HRg!9vG*#+JDDL(#+YVM2kdUoNBtyzxyAoWuXw_SQee2sQ+%8Vev$6GND zRVPOnqVT31zMum#X&*nAYmc`jC5yj1=fu;X;_g8WaPZN0FM*(lq|d)F;HoD8Ew6zK zmXY@h?ysS9DiraZ>))js=XV7l|G!Ru6=QqL|J73S4K6)4~k=FV*#AN+V`=lGJH;5OLe5CH@+%Rymu(Za&eq3HjKHM3vn&sqMc2{c!i6I^Pu-eHq7=Iv$^`-mpC+SQWTNMHJk`y6qgCRFDAj09~CToWx75-Mp?p*}f)m z(3zM&1$HuBuPED!a-!H2qlB|4-E>^zK)mKUWssl@-Q!nP<<~i{v(?kS*eLRLyG!Bz z{@N(KR%=tSG)8jUOYxR(n_nsHWmsb$&V|=A6lc8LTJ%)oYM?Pz7!)oImBh!0Guzi& zW_t6splotgIbv&A#}ua-!cj}ow&X38J4@kO7GrIUY6KX&eB(+L)T=qKlL8O)n;eW| z_=JOxD9(VI+Dd5yHmB2(c6M}-0*0$b?vU03OYUN`-xN|GGU*IG#pG3e5Y=7_ALW_V zdKzETQ7jHcOy9;(=cewl+poTY?@*(_qng?N&3C8E)Yk1{DyTDC7LZj(a|fxM4$RT?F}k@u6Dv z>)+nJMpS540-!&AN=N$NV@ZmRuG02u=5~&@#;)d~f2c*p+{MAx{lCqvX2e%?O^kO7 z4|mIY98h|2ISN-Pi1;Z=8yX`o4O~uh7I1Q!(E{MuwJmFH8caij*X+EGEnL-db2qKH z?2u$*z6$*}bcQ9^rO$qXN*`Dk9+n>Wq=2{EgUPn1-}cF)+vU0~iRL$iQ&l5L;)pZ^NAw5DTy&@qx;;`u7$gW1NObse>~JGYU@&+7zVfY~Txfv^ zfRPiR95%BDv-ds*orRA!Favj01`F^np`*!GcGT+&gT_3_4YwS6;=wRfx)sNmsd$bL z$5QL0E;bC$#WalGrF$+9s0r&^A@ju9K`zNsyA2OlMe#-3QMoM-U!XNmy|u%zRP&V_ z@(7-L3VQDD#;Z4zFu2wc+ zbKgu3WT<}XQN*z2%pG@&XIg9{voUVNyfqm+g%XTMw(|LlGjJ>6^hR&unk3c#2xYDi zO(pvbH~YX@{?VHOG@`{^f8mmCQ?xikimy6tb^CkKC97{va+byR7(%MaN~ZPRT;M)t z3I%>?56U3Ib;6_n5wClWwT~)hSNw?B+K+ai^tLZPz;K_%ZQ*2tpk|3?HSJJo{ql)^ zq}W(|-H_xJHK3TEIPWo8iM-St92Ij1Hx+y;BhdgR?lxg;q_Z=QgNU_jnue0@{5xRv z_AR($ivAnxWnxflocUua_lAd78p}duyxg3h`0yV9knE@}&a(U1> zj>y4%y#MXq-1eC(h$gy8ZGn(h3JwC(;FT2k}S=u>?s zhb<=DJtZb*TQv(kt^PoumGX@$!pRLV;2!r2kc&gFmwLjMR|{0msufywfFjZfec>h< zTYq?FXpxD%Gl~v&d+tWI(P}kDlKl-6<(;9AbiPE05VmGoNdnMLlyLG|g24gc`aw=Dp&9wlratCx4Z|0e=YZ&+$vn z@Jy4~t0K$@b}IDiZ!RtA*E)l592tgH&%2pZN4X6i{4`G7ZH~{h6X5Y)uWQgy{B{-K z%g$xxiPVF_^HCM>#PNpMlajl0O$ht?o3FwHL_^1ddo!JpvYMd*_8K=>2w#VG-qH%0 z8oF&UoYm7gU;V0r{VLnEFW)or z8Z;iAhtb+QIrDf^Z$F10HWOs|wDZPi(Z`fsWscR#@TYL7?=ZVCMQ?LYbdTF?+9P_s zpZN@RJwe@HP_=}c5WAunE4LebX*v3Vs?HH>J>4o?fX=QAaX!C36EJ{ktL|p|S^oNRJ?(OJyP0l`uI&vt z?Ax$HW&7}i#%WlUw!Vg-Iz)HT;$E^TQ9RE@xE}uTbcXta*^~(d{3Za)VQ>JSIid6C z5NFo|XY0hwX8D*q+RVBg3PZcP2U#rP0v)I_J)bF}-APn}Hj&&*z3z~Tm=5ePM_X!f zOmiA{M_^i)kEL8+q#}A;@In``V~mc}oGtc#8RfS0DU>urW2?w{5cPe26FRJiH83>1 zC9KD*V883OC*xP$Ky8~NTpk^c@HHxBZL*1i)PtEx0`Uj(&!!If z`4WiBj$g7fafaSl)Szm8z#H07tK&v$h2RB!{lHyJ1%S+ga9+E3LD;>R;~JAidVS2- z1AxjwkxCH)jRKe_mqs9XWziPz<&byxH@q9}G0*64f{M5XaV9#P7tCpg zp^{SvipN}p4Jm>%A--m?Zc3{}UpuHLsM34!BhA?oXTww*DiisF=g`m}xXDR@WiY!K zR&}^PNw0as)=qBchPl&p$Pe)41EMG*5K@#oPFOJ$HaZGksFT_6zBVd^`UE|vBFhGA zQ4TtXD=&^P!5z;p1#gzSJjT*ftbfhiR206w#K;860eNq<$oN8}ZL4R-z_!Az&NrAAGsDe(~tisPqwwCi>BQ~q>D*MT|-l$ zv?9M^;+%?d@l~?UqDhZoVW<1E_H?F*dct$G$rbcr@3~SFK5sAi6yE_;5Mm-${}Rb{ znl3?l0(TU&;H#mi{BJ`5hjr3#qF}_B;;yI0=`k`BwQ{6kz?_>xPe>jSqE*Csu|Puf zt8~Ozqe3?N{&1aa0K(N6nIBt(2P#T^22^KpxBh!h%%sqB`7w9>8a482MVds zkJ^QB?B)PETk4fvBF++Jl9ig0sRLfRik`dXe4h*}IG(}N_$ZgM^#HqBT${vL?U9-R zV5tSq1r+ljG&3F5ge;LFbAIkw?$qZX%^YFbJVH9ZWqD3$Z9F9 zFMc6FI5c08?S0~k>U_?J7{%CZydoY}gR3&%=YCd9Av1)WU4bp8H)K9Yma6GQAPwA` zPM7`RoCb$sy{S^?FP^VRKv=BS8T*X_T|Lq`Q=@#NRgKf#_1OQ^^BlM@Y(ms1(<8Zv(&td!?nGYy$kv!DlPat5yi zaf+bCO$HRftr2Y2y(=SexcI{ydbJAq(SRcYOz%B8!aYD5oj7J#R%5<0At}!6nh#VJ zfjVba(q5@uGL$+e54@+5d%z&eJjQZ$q{%ZLdkCSuN4i^tQyhsw=H6wQTGwPm5oKLK zSZkgG**cesut-$pr3PWJ+x@2N;s0^=mQi(e+14(>WkYZ_?(P;Gf_re+jk~)A-8jMB z-Q6v?26wmM?h*nwZ=E{#)LX4iyZ8J4t@ZyIea$h~7`;EK5^wDm$XhS^iK}lGm5mh{ z0I#hpB!PG1FMW;-p3)Pr)F`R;2NG+P#9i{O2)F#eZ0nS(v)~m&eB6Yb9Fc^e|&(TT>0(=Gm#$p;^ry|fK8s3O(+ zl{9Cw$><rrX2Ink@)y#c5W5PvkC5MP(+iI3e1P;cLxv*^?`20)?a-Iohd(8!~W; z)z_kgy;EQ^ZhjyilaL9Jo=|$yy7;xvwAw~CdyT(J_JTW^F>xb;lEFP1M7A)&(lw4s zyBwOC_uT~HEl-JW+i94;bXL0FBxT~HnwGJs1%>>gZl9&FCfARH66b=|ozbcN$Dos& zNstdUp930oa-(>(ZpvH^uunIWCCa_Yc$!OLyz>IR6Qduo|8qzOjLNdeAk%975KE#= zieLt{S+!M!jNMvNa%t@0wqTkaH(#fEO*+$8g)$A?n|D&T>qXnP111n^qZtq7`2H+K zkAnpSjZrKp|m(lLJUbeT-+-f>aKEB zSuLuN=651|79c@YEKKn8RAzwbfgjmjRwJr}#kpweqMFx%^>l5_T4D6lVrx)`KQ*nY z1bS281z6xCvC8=CXN&6at0f4wle7co&z2t&!K_hpzkTD$8x^J%qOH+oj8P>$Ma9`F&ZM{DybUQ*Menzys6bt~kN@Cef-v0R4 z<(a?G*LXA^p8fNRjP;*yb^f65{O`^`SsDl)_zP%nIh0z~TH#sp1bfRU8HKDdOou;N zNI$PbLw{l6mP}AQ($-&#DAH@t-p}R83=xs#L6WBlfG(vCK<|-kg~Wu9#T-+T`51%k z<&&8BaN4`%S2Ufrk;E{JxL?tI*~N7^(V6DS{+`jY`aVkT{bAtB8^PcsNz6E0(?(XD{bNih+FNd1zI;Mm2)t{P6wpFr^3E@$u^&9Tb z_E z&JAtQomKm1SL>8AOUs3`g&)PiAS?M#dmh*v$}5fC{23S19`?E78MT{DA z6cjiK*A@~oxh^1O1?@;^GcKYbgL6_!4;@Pyg zf>a-6I1!ol2$LQ&qFhHDC&ub5g|Wr1Mdg5I2t=SJRD`^#`sG4&bbGw$SJaAHZ9{&8 zYE6k#75Rm>st-c?D7#plcmpZ5ykT=Qcmr$ds9CP60U^N{w&!aj5(|SC?3FvoBUFT?!byDhG%9ch10dUGsECdrd@rNY~!IlJe&Kl|pEHo0gB?r&RWhc12 zsxJ=ud=3JcUK=z+H99i5XR7t&juQYAs&r#-E2I%tWl_a0g;8SmKfbjDdBCZoejlmUxJ{SQ&e7(F?E&B;}A;)vX5g_P0r&^7@{e4i!AS)7>ijy zXL4%F{^m{BL;C3GFC~TDPlGU;E$ks$ufVhc^-fY4>yB!gcSQo3H$pNdIwK5CT-%f_ z|J&sT&ZG!)4Gj~qd{muKD@~#qZ$u{b%qNXPBnCM%$oWIY3*s}AjSQu|tW9|kM;+H4 zN9*QwW|5U>KagvYD?KHen;lp1q(i#b4SFPv?#>V~z8OkbGWrw(E_aU8u?^oJtk`<= zydqI*hq@&sA~=mUpa|v5A;F ztn)o_@@)@3AmXFV*-gH-kYOMtSl+R2D%R@_vmj3C%dg`Q}Zc%Ruz4^JHpxzU7OjzR+5vE?hT%X7;6Tt z7Q`+AjL9fHW>L$3j?SYE%l4y|yU*RARqgm*g}9F!rJ2VaTG%J0JnehC8+i+0sBN~1 z!8ub%Kb8BCM^R~f9hk{TsJIzCsBgm?o~$4D$$y{w&BWfawuZYFaRLc*gQ?-us2r}< z#3Qdi>k^~8BooyGagx#1EP2m2qqmQ*gu_(3sl7+oGjE%!-D7MZ;H>8-)EB~lE#w3* z(`(0OOboKld$EimdN6{R3uO^~6WJM))86?VqJ!AS%oUXxGk8|&Z7(UB_o`$}{&{nf z2Gf#(Ou6S35`D@<#SVP{75Y>-PdQU2FSsMKiCkA5PCo_@_J$rcTEWQjb!~!B4n0-km_fbi@S9x{J=6_-a_)}Y zkKsZ+wZcLQoza5%GPV93+2#f}kK*KVH*2!504%_vSJScvbm`9gndrXM^}|I$^Mc-w2K@@#{-wbC@SUdXy;$~& z_53NgHD{Nc^om$Xgyb6W`&Br^Jw`AE6`C6T*q|!wmmdS6WO5Y^gJN~5+_75KtfkDkQjQ z#%%yfsxfP{KOL~t@(%O>SskTGz0X;LUgru>=I6S<2qC-F0fv5Y!gU|C0`w%RbKNkT zPD>pD_Q%6eXwM$h#=p@#^F%lB;uIW8@yTw;LfhHMa*h;nBz`6k(Ba1^xRq{(buQHBcp>T293dAj=~P*#=_8fP4@}MvGz(iN3XkN9W^m zMTRUhed$4QB)h<-2Bm05!HFZm4x;l@CGR3Q(qZ**qeRTnY?VY>&Cs2QOZ`AKKVbhF zTkA%O#Yvnruht5WqtZP-h{goFO#XOIeS+Qrkhy~~LS=f2+*MwCAAdvo`<%-zk3d1i zpH^_WK}Ti5{Nnc2 z{b17f^&%_d_4lRycc|rW#Qof1y=(+Mp3lJeU1tKEKH!je3|fpVK?+ayA#mR#p#LXu z4s{OoV*z3ifk^jozl%qpaeROLjVdrH6{TN7BuFJjyA>~fzqB6<3!ZLl9Ya0NVl)4Nz2-ut z4eK-IM5T=@Vvl1c^9VXfWi%19`_ULGHx=*XR=1qfs0`p!*E)Y(FT8rKfa-e; z+8$TwOQG_)8K~`Wd`2^%h;KfQOzvf{IL{NpMVYc?wW0S3skP}pbI}VJ#r;=lQ0Xu8);%z$6Ra8I*V!YYGXaShL5c4a zj~K`~Cr^MJ_A^@5s}E%Bcd9F{>xtK#*vgminm$c9>Fw?Kxl3%C(bxe=wlf)K2OP0*q{>s3+nhRaTeZ} ziQUG)9IrAjF0yVM`(|j`pC)m%em4|v-?mbF1ya?=ky5^pWu74?(0sU9EXwXm+;c5K zIvolyVI4KPpuuQSzPN3L@>JYnlkT`R(Y8?!t}{$r5cIg24IwEwFZ%`iL3Ehc_~g9qY^`*N*trqqqc$Cjs%KQ?I1*HN%3F{*tv}L+Gv`h zuZEUPxS6i}b{;V*+Ij9cqUb84^YWJL<)!xvXXa5l-*}NekZNhi{X}X&An|!17 z`XCAz;5J*I-LyQtM3JzO(pz0bQ2;MnqPm0d0>c&VrMVnJD`S@)*yMP0kB(BMf?wO@)h&pxGCZrU2GpGlfS{*!rnd}dmb7;j>wnO}i7eymt` z#*KM_=0?h26!$F7$XKx@=XNx)yr3IV_2Ul{QIKkXX5?sPWOHU@*SN0OegW-e3D2Js z^O?aS52Lkrmd-&F!q;9K%uZHPohb~pG zr=Naf1T|074E7hR>n2Im-lW6Jg^|IZ-=)%xFB-M$>;R=+D?BxQ&oy}UXSdxQiSnDn z{hGMf=I)-{0z3^}_kLJ+p1jR;o?4kO`1<~W?=MYY)fzC!4X&j~F-3m74gq8N;0|iw z@x~>LTVYz`?P^AW^e#Sf)cXSaB>)+$Hqr|Pz~=oo?g(nUm)Mj5ccUj>uzlfE72usC zLht!1>y9g*hDD6dXUh~gd5$z$0rnUYZ?-_n*5fTlxZp0fonUc+Z&0ObnADnM+u#AG zx$uR$nH#S`w;NtMg0nL%ubaG@dIpn~N@JnYB=i z$@(3e#8HY&qBT%!v(D~?fO({bHCF$AMX(wu)xLL`mm|bht!;lYDoeoCcj>GR7>s$a zNZK#8CS{_=$q3s_M!6RztiwxplP@e3bYph~q6bojl z?wc~EDIpaK&`wt@?`=m!{WDD5+tg1HT4ddyLIzt~hk+;GDS{c{^AKf2qbh3RwpQy4K3(ye71mzJy!jQUxjStBajDbQVz3ibqeX ztD=Dkw*WR?0!7;works<-V2#wC9;>xBD2<&>NqGwE6rw|dFSKl(s^Xdn-R{k2*(pP zdkI|i_rv*|jGDQ%tG-c`?o#8hwB!zXKr5LP`FxzdmeOTZ<0@~ocC?N+0E6-6*6G$; zeXbGqP5nJ2%4~hxA}I8w@&WGTXCx80f5!y1m2`_A02k9}0&f4}Ux^ z@(t?7BfT5@Kw73T34gBiqGYT{-zBP?&Cu8QXp(N2cC7(#N~KTw+TheBZ4HU0eL2Ic zU=Ri4VvN=zm2k6u#Wd?5PXSPghenL!07reiML55yq`yVq5kigb{7mtx0x?^La#_*S zZVrSd8iv*yB@seLkUsbXgAn~5CY{hq+f!|dyt zIVdCYzkb%6JhQ6txPZ|UE&<=);9SVaUg_* z_Gy0`EUW3lc7_S22wJsF%?pTjXG7{PLO#AYe}^(V=6R;B_L?s2X1jY;cJ^o$2N>1B zT##_SFkH~A^Q_-H=1fzL%TOw?Bx;Y;WP)zur zS-m*t^5eYy+cbS65T@1@5&~lRe~G?UHZ`_)Gj;O(*XZknfB44@zt1Jxbuctym(q}t zef7>H3&fGqBDie3R=IM~-F7a!b1`>d zQKV)Hyp*kKDOY1EGfY)f@SKYyvk*RS?n-ufDu$mtpI2g_jR*j(b6r7bA%8^X7l|PC z{*-N4q_sj?S?2o#%Tr~A%;NpHu6x4vPl$z8GiE-Le+ zPaSCL6$;K3WPL#ZYfEBTY`YfUkof241BOu#oj3r%3DyrYC5{(uG z%Ry+2X>6i5#J!I>hnRNUry=GCsx4g<6?>%wsg;xEfksZK_-_+BUY-_9+**id&q61y!UU%wb4IeW~I zlM|0kmu+yEl~VRc+no;fz~!g)Vp#CQccG9-P!oy(&4S9?zW<%tAIH$%Qh!>l*gvfn z>3^oy)ydiPf1<1kVk1WwXQm0I+*1{MY)z#OXC3_HN% z4EQNAl%Z0o>GmZ?aIrAbu+wqqs$Ufcwy2&Btr@lDZ(G4%!WT%uH;|_GZRx`E2fM)E zB4T4|0?O@MZ`T!goijo9Wam!Voa?9S(HSx0dnNV8a}i6%Pqu}1$$+|l0k4hP=hFx+(6CoDv+ z|L7pXu~f{B23y`_PUS9zP3Sl34o^C*rF`JLK3rVHO53>YZEu|m_pD$yB9EKbl0OxTQ zyXkcn1MFY{Vuj~w)2T>RgdaXbI35ez&9PZ3>+E{6c+`@#)R*b6QIyj*6`#+;rWa8M zU6H5qbwr^z5ZUnRNt%2YaB&1E7;-u!zcceD9c0fnD65eFV+`4I)lCjeqb%fpW%bkY^j_Ev3>$tJks-vsE z-TDW;e)&%7nCVYJV7j3%p6;^9j$&H8dE2SQ*}&i zp`|OBZj-RZknTc7Hs3}v$qo8z7wW1S1Dg#gj8`xBO>$bRpqeXA(Ya~TmSs9XR6Owj zYEZr`ZdSEo=1@;ee6Zb0_T|9@*?I<@?u--QS4G=?plNHXoQYcUxYKR{29`KLY+z#J z_Oc+P8p`!e+P>e`7`SOfz&{gho17dup+eq^7z9m_G~rlQWRB${YLM{F(QI16Hlu?a zxBqs4oA8@W_xB9i8Lw+%CY=%*zUTb7(Masr^v%MAO5mpPJ6ssDJY|V3)9^V@y9lS# zGJj(Pj$N&ckI@63tC_%cvlR#&3rv6%wn{|aQ$m+6X^IfjqxU<5M^Jvq8WumRfq7FG zBIq3{U4|SYDC%xdXBto&dpuAsWGdZP`t(Fxi$m0&T}tkdm`$K}hhmxgal$?9d)Ru= zU3fkmpvxtlG#ui*NGchJpZLSkf`d&8eSZc1t3$Df^ej6BJ@ckeTBdBMJAH&>mh!5({ZZk6_!D+J+W; znCS25_?7;OHz>Rjoy9ts99inqVt7_;%@KQbk`~?3#^cjw$#uSF2#h<6kgLHZklBc# z#{~3-k{`}p=wi<)&%BmfBHp?sJzlVRlk2>xT7zQ(3?*x8`~?VwZ(0&kvsz}zD#4F3 zNt?@v>9p08kPlU&oDzl~%x7Yh0u2Gbxh4Ih$)(>@9Ek{Ut_YQ%h!UOxvR&L+LvoJQ z+&|8>DkN!Am8t3W8nn`p`el=J$mTxo@n{7%u`OE@4U2Y$rHp)q7TV#?g7ipx ziWbAo)gZ$t=ukZ-4yTGR3eJ&+|E%tq8;sVwguQ7nB+YC@9t^1_0v90?;F>3M(Mxuo zQofm1lq-km5R<#jR;M@kS>_m;W?#c0u+PM!iNG%B^~?HIo@-EayoofqcAOsDtpCza zFLc3kx@+BXf4GN#>4C)l$gqz^V9yUI2ncVu|GbK)Y-(=m@&8&7$b(#rE&j_4`+rvP z)b#$eMnJzW^`l@Dd=?lhx+b&&iad%kwTeOmOxh6G2xy(_1XCUgo%oGb?^zMo%9J+< z`@44b&1QDG`N`6yH=5x`8+3RMlRKlw%v(R9sqV{_@9)pQKSFp`hOh>=kbA&gK7deh z$UQz@R-^**P$eKzL|PfdHB@zx_wb4#f9@B+k?N)dT0Xy!MB%P0vf@hsoaqkK)|Hh^ z!scB-sxp17RcxY_9tz)U4$IrsCOJ)Ez}u8_Y=c-}=d#`6eouM#=GFv^PW76Tz(aNI zjQBhaSM%P@?FEq+lpr>F9q?Pe<@KP1Z5AK>i&xS(!>6>(8A6q8oxj#pQ%KuMPIo5n z!CD*JC_$ghwbs+BPpZeIbIuuhYYDS;4otflCqgXSM*A;ReS4rrV&A5k*n`cRk@azk zZIvWK?45&1)2y84P|Y|sIP{dH++$t6e-m**x6!q$P?ZD}3<1g)O65IeJ`FqMS0nWj zR!sO9Hk5m}d)C_=19u5Q1mWy0^QxmBO;q!C>WtVFiSZi_0KfjbFrfi8buY^>W8uMk z@S5hV10r+9lVU%c3?NNE%2W6JcEG{Stm6wNYHBbOx>|Jy8Ayj;*oVVv9i44vOsOGV zUVS%Uqp`l#fzt>2BrBl6w{*7}{H;!gc()vmzYgTQgolC9qExen5>j?GaCBfHf}XZ; zg`m#i6EUUgQ$2&}+siW3;oO-ZnF$w-_ZTKd_7q>d{m!vXN-;qN0-lc2<6wCgs09j9 z!j+ZyN*>N~q_m|vtqE|Z%D8779_=g^X1h*=uFFb9^CWuBNMi4lOe^y(HJwl0QG~22 zase*dM|}jp%0)aw72M9!$UP^oI>(;x&M+08I%M)n3_9eo&%21b%e+>=wgB`!ST}ot zrYgg99Wx=&8}p)uz+yP3a_tl+f)Y#L5VsbKr1-ZVOqyn|xITdIeed(^1bOb5e*O!& zEJ#Xbdw@}J29pO?%_x4hTY*QGGKFQ$G+yo@a_5R%FBt_=oLOi-Js?HWuP^)%zH%tA zL-Cyef!~f$^oIN5D_D^DO~k`d%rh!sPv%!==*X1f3lm-c7)hg~uh46lB13!VTR3R{ zmjFNxcCYsb^VK^zg=*n2tZGQjbA51>`j_Empacw$Vp=3T2GHoyFw}6HTC?bIQ%2u57pP2&kc_N9g^07mR8XMoh#KF4UUXd99dB*5sLbg z89rYt3O5Sz*8paO*jPHI_13#Uv50{Wy-CC&sT;x5muAb}h)mgG$F0E$*L0FTngK?R)EVqE_rb zH$FgFvlaRZUg7`l2<+{|6cctz19jiHYc#Byu?&T@siTIU_E*J(*c zL{UqVUqcy_xz95o!9#kP#4IGJUlnFw+OL?u>@#^zan_Y!zUJam)+I|z-I-62 zr|mul>zvm&vNpW7Ri;W?%^^78OH4OAmNE%K551;`{Ivb{_PJ_sG+RspynLU+{=8#g z;jB=~B`4ZWIZz5s<>X^)S^Ontt^iYNkAXI>^$PVfxLSV_i)ZD01nG)! zN{RuTmQzjG=8o14&LjI9VT@ogbl*ow+)D=fFtXx~w1>$o?wS8ET7J1) zICoVG8j9)A{0Q_h#33xX(lBG?046;Zx^~toLy2BJm&V`c(7h%e&@DRCyW_In`v(ODaApC`IZS5eN zCEQABxlhL|mDVLpW!)sKDoz@&qVGWAw|Y4hlm|oac|$d*qFU7)kbD~7fZi-TNauiO}|6@#3+gzBAEysNf!^+|IC;q6qFQ$ z`YhG}&vu6&+6l=Hq|z}`!jxb^^kl9klT||BfgzO%mOF+xgP0K=Fk%)`{f4$hM=bn| zO<_e*NFOXOgJ6TwWkV$0jN0>YMjIVLxBs3*5CeVRVqk>4XuW45)+xoOKI)9My+veo zMwB8Z*RN7~_gZBaQ_VNq0|Ckg#8EwCEOHiC00|rC6+ph9RY0}<-rV~0r?Z& zm-cX4A!i_)1WM@Nc*lPeN0RUiuqjNt>S)H`P3sPv1$QMp>A&azaA4(lPa<6T&`DjZd6?!@oeGJ3BG z25h3D*Y5_WAs~N5*r+g)Jgd>1t*(61>7xXWXHy4?FCmJeq5s%*BN1Cb+>GdH{QWsK zZnzR5AFf)4cn_VWlqWDK=T(@8P>Vx@cv zWm&$x&P6*G_sJ&ekg7H`DwR%TQku~sUP>9o17)5-#va*V=Mh`_L>6p9e*2-ea;kN7 ze@!7q0K7F5-vGI8pIjtCJ~`C!)T3=3HR0Bt?p?hBl1<%DG3lHSz^$fDEm*G^b3=%4 zfFDL*`i-G(rSOj=z6DrIVcZB zv+Iqou^QN3AZA#n^Kpfm(n89<1c0f7>ynKmkPks~Cp>V$c}8M+RD?@_#JVpZspt1@%?RI~YzwUsj(F<8OS! z6l85m7~pP0L>1qFw$HC0jv&q@!wAXV(p+tU2WlE_caYLv;p0ABz<}QlFdBJ8ND9(W zb3gTtccU=hm!YL-NRz(s3};L(IR;fFIwv8}i5NeVQwZjsLa$1c?*T{csi(OxTZ~<> zr{WoWtYD={hde5dir6G9kYT(CVa{rTK0(Gf=-C-1LT&BpM7c-bw~!|?FkK7&;86DP zk32H0zgIAqhJ8Z#JLeT^-Y6Y^IM@8cInVzw=l^*8C+q(Vz9_~?PF6#0vl1SpE5gDS z?hHf}Z=4k=3?3LjT07UoZqZqfoN@me`my_|93fE**HIPz8vgIs#F?Sw|O=f^A&_kjcQL1)vLvk$_#IayZC=HcY_;f10Ss9B~|f z)mph75m&WZf?Wka=>+e*lu?0CQk1aW2rF$bo?DZ9{WSck-O$(Qsu&esK!pK zeYh!K8j|_OT(AZCONmY=@|=7OeJaSpU0gGK(N2^Y4+h$t2rK~)oP>sC2zmji9a{FwW@lu*chw*s?TUm za%)3*3Imf=DQCh7(HXA6Qz(z3E8)XNf{a$ShmCwKLMs@hEG?X3UH$CBiG1E|?N0bASzA1QmIQ4`n z-lTX4fLKAPS!=PvVHw^AsN_v?n%`(UzdFLsNYW>53PQljlGe2YCt;VljQk1kE}Zpm zu)fE(VjX*#jN=x)E5+J^*Z{)) zs9$DKajUmECa1?7u=}HRIkj=Clp>ZME~tGXmrYC&3Si;zCP@o_@(21!i-!5d&K-%; z$1OxsToL}gA^?Q4_ju3{5LO8Pf6mtbRuTW*c-yM1Nuc^o+Cvt=2Gt=KSxO<6F+wqY z*^*9xAT28k_@oG&)c_epg)t~;T};0vyaoD=hPqL?QBBB|Y_ZLKofVpK(NK@t$`o+hCfVv9#B;a~|(ZSzpSxe{K45&)#v3p*|klhdHP zpTrDyfYaf(xm{1OsV^|(icmUZoz;Ue5RdE04z$Pgso3U&*`l9@0bhHe+ssAb%4zrzIU2fbqw)i&Cgvoh%`B#SS`)|+c=Mu|^m>7>7r z1O$(@%g$pEQX~^dzL#0d>uSg7ax(OHQL*IsQBI_^nYzJygzziMMSv-}P8NKRZBBm` z|7=*M+*qF>4Ep|iG}hY?^--7lG5&lc6K8h69n=n1%eX*fK~trl)hlOQYo>LTB}tuB zWC-M-b>Pt(xr-Wf27sn@P{XQ;Qhvr+FJteQixpZ8P0jWfiYGx`^LuSl5V9GzmcXn# zD?1bwbbKmtiEZ6@P~l7v#P9vk--46M7bzXuag?m*E_0K-6Y>^fG3mUiYSCJ5govZ2 z+oyv#Mpqnn2$B%T!^Mj1+(8_9+bzph^9lY2v-|Fxp~?W#>J`Ak8WQS3#)3sr(;Zq% zeC|dU>LP(C_A>|xx7s@JgmKY2cws{i%hJ7@_${iHzh2@kKJY!M+qHRV5o?VDA+|dE zJD>9b8FuUJ*3NH~!mRWkZanaX`bw|!JgsBxPz@eqAM{&`=0{QPR>Azm9$*Fq=zFKM zJOkK+o5_-2HW<3)Aj!p6dbwhD0lbUn>>gDr+LtD1)_^6}a26w7?z^dQ$8(SPG1%AX zqGHw_EHULg4N+{!hC=D|kMVMr-$)v5pg!0(2jnK(lFfg9a-VXD8KP+O2Z~Bju+YSF zQ!7hFIR2PhRYij2dD-cmOO3eVpu!;W{ouJ}8beVN(i93WWWg79RhW7Qv9JhB9BYTQ zS)^yvDb2Qh?He|tLL;UFa;*;!_|EdAgU>X!HUI+%r~Syb!gjj-M6^kL^ik?#+-t1< z2~KwgWsY&@xID%ToE}s0=%5_jY3t=KGc`343Bb7eA8L^7g zHPX;BvM&IM18wd1{ff{A&q%B&GHcvmaB2wE0pDcGeb(@ij8CAo-eE@!z8}hBCy!xf zXEgsHOC9b;f#?uEaHlMRJ9}?E0)~d{TdU?d_mKymz`UIA`e|dv5|CngVEF=r0?4(J zl?n+vpbfVi_7S@$f@^cYGd?BE4AEc@8L%xs%QU@Cqpgrn`LBx}e@RU`vAr${}_vc0>;z0LzckYLU%UJ5S&JA@k7IxHIF0+HJM}755pJcHK7kDX? zZTm6z`V8opS&ocj$k)-raO{Q{I>^{5BaHS%2J3ytuX)|IRAM7E z(Wpet1qLGQSJFE7pMwPCSq;*^)5#eW|3s`Y`UUV=x$@oN1zb~!Y7ix*RhGd|%7X2g z5V+tu^;Jeu0WDH-LT`r9CYP!*{c4o>6+2(%-(GO%#n(!$oB*qXSSk#^)K^FY)M+$y zRid=jsN79+lBtilBWMXFr+byAS)<1Rqg1m#N@Ni}acR}eLuE1#4+wza$qr8Rj=5tO zg+4T+UfDb9F*_p?;W{;$zU!_={sUSWVg+z? z;Ayd~2R`MJ5vTwz?px---mlSI=^8a#GfLx0uIGrmLM-3gH)?Ikg~@rokUvU$iPS%z z6eOnyQz*rZQMBr~D3iqS8)>wWI`K{F* zkkG|?zly!u5a%JLy*U(M;{vya_iZR?jl1n`K6nd`{>bfnJSveaRS)vY6pa1Q)FejlBYYz$nf*bBX8yf#zW>g$(EM5LpWTO8m zGGFRVq?c#0Wl&`~H4!P|D2nLPF|A~J0|S)%KCYF!YT5NKnqs(fA$C9Qif+B^Mt1Ye zrFA#QXj>5Kn7<0}zDdR$Qu*iERDAS4-29_27tfPzhi8{xx88|9!%9FC0ulG%zcg)A zc2@2tnE@nox79rT?K+%zXq&fNmF}Y^TW6HE*?6TsP7iH6+Z@7fc3e%bnZ}^&9IQE)^%#=y zX)H!+Dm-3ONQaYgs&QizRtH59?X-{N&Ms8rUXEUmMUNTBKJ2mY#ueldrB2^|h%ij$ z!nsX&EF_?#A)V8%viliD;3EF~{6xFExKO%yXH4;Al!QaC;VvC~i|Z7u)5I_G3+sEO z#LyD5()Ew}i6^N#T~`1rXtBOI)LLfM>ZmURkM}w%A`oo(0~H;a_GUnPa8@8Lduvn9 zS-f%sAD()WI}i&DlqyobPGua3z~{rI=c~&DvR73jtU0UPq?>c<_As!2Id8v?i<5#uGh3Vq%<)doN0B0PD z3Q-FWA_GV!AMbj_0#z^uXqd>tah`=zh5@i~yLW{v5}?k$5jn={1YL%-FT3&kSN!Sk z|91D4e4o5h00{x{1OoxV@c*e7=1%sm4$lAWe%|y~Xo@iK4cu(=F_I>i22!0?QwF5O zPby`EfEV8vLb)EF7iH?or(^Dp?}Nx3Z6AOjyc-g#v(@hrHpIp9)=`B_ZQWHX{V4Q9 zXv^mvbkIMwWDg-{#DqdP3Pf)O4pRaKrDZLF;pBmh;29uClz80z?>#&!4j|yXp_pTX z2dwDjl0?dHZx0Wi?4%v6*U-nY3aQcgc|5izZdc`G`r@{M>&7J?N~*2gtl{Vs33$m* z6q(RjcZ9Agy#1JjYFbT%WQu7^83mV5(d?9M*;eeL{GDr(#ib@G*n3F}Z9igAuTG4g z0lcmh45P)F#5gX}&R+0KW8+1A4+2&=G`Nxtz#(oV)vAjY^3p5HNIHzu9Ff19-t595 z7q3?u4qlnX=~mNRlmorGRz{ndt`|9q4j4m4D2!Rlt$guR4v#l?Ov2Q`q9h1KmrMQ)pXc&p7o}gyI@Gp#wTG>quWwoKofQKWyQ->3;F zHZ=}IoA@PsUMhIJIK+46af+GE`>EA1o(yp}oZ3W5(d8R$#X1|8dbaul&hztEd4bE1 z-$9OAY>3rtrpL@&Ey6ai(q2_APv1Yi%-w&87PN$wmSBtbgn3}o6qMe2=y^sfIjUHK zoDP}$(1UxYocR42w+}upbMh?L)&?i9$i~d(d5w`Rv}lCJU|>Vd1Y-0#z*2BVM2{ZBEDukc|M)}fqXa(fJuXl=l*RbOresoy`5 z6U_bZdLe#6dPzOZOhSWP$z{R;du-Ctjeskpzr+6G?Q&}V2X^=W#b@B}u-pFQH~YWP z{?D{m{boIErO%4c;EfEiQ$o{pQJNbSu#YZ z6q#{H(xphv4SPRllX^9s0Ryc#Mm~R+J`A)1y4{3(MXXg=&ZKE`1AWuBgU-@KwS%-!FFYDeGLh zn4|>nRHa{CdSWTrbFbr^s)qO1W(q*om1`?^lrtrMpHJwyv}y8Yf#;=CjRdiwhv#h_ zrpp{rWbum>&_dr49Cyf<>?`(t)OixQNi@R`&eVbWj+!1%p+H5tc{ZiVpm0g@pnnEu=rqX z_(`5DrmMqej{boe3`?%YD}F?Br{VW*nV)Z#+OUCbbABso`^BOU>JPvYpqkj-)eH_h znOY>DQ^`%CW9y*#JEtQpkaBIO+{`|>|LWUit`0Dc7uR!|Lw+WS7*G6!SOwmXyLUnI z1SN({%sbB5*BpG%pn?an2a2<7~rVL1=b6;K6!KY z6yq6r_IucXGvGkjBvV~aAlfpT z{8=;eWM)UU8HNyc2t4u?Re(r#ppGWhl_QN# z<6zpU572^g77YUlMswdtW6l;b;L+gHuv1+8Kcu~5bfoRpE}C?bjw(h69ox2T+qUhb zW81cE+qP}n=;ZW!zP0xG-nG{^&e~)Ds8LTn^`pj9^P0HkJ@5O1BKzRHOchlM+HxZgeQ52{rGzzOwf8n7S1+BY#>bT#4L@;8 zui5{u-Rm$aFV<9pQL(d#WO?;=l40$N(XQHV?W1j4Joxmo@oyHrxK|1r)+;%R&aD`U zlC83|J5_=Dt^PH$$nM8CBS*~vSd}FVaxIr&r=z zz3fWNKMqDJKu?sT@_YlG{*|BWByVa}+P5lgPOKo^b5(K9T$f!lWKm=+)ze8M0R z27VRaj!hhs1|4?!4X5V45+Hnj^C z=kqUB#5;`ahTe@wLCh)Zs7I@i&lK$jr;4c~31>YLxoX@*+5n#8?BuT#zC{ z;U$v*JgoeCB=SRcKQE<|=js1}(hfrHuDAS!W^nq})tLgWs= z54+~rs9~tYc9Va?>M1u`N^Oj9yud2H(cnNuD7nCsZw$WsNR0E?Ibg`XW)S`Dod1r5 z<5H?>sY5E8(El;#^z}Ro@%EM1RB#>Nu%<7HCJ$yX*&N_3C0>=}MFU_vC4W2)yKgGi zwm)PB8Qd)H7<5T?4#0s#Px@@7rUzIxxIU0-?q5b-3wb8$-=ZgFAfZvzQ7GcBYYK-S z_OG4vEOPxps2O!T04Y=ykov@ZxR6R)nYc-OEr=hJ8_LGc;)k_(5FJRp63cn4pF;{3L?sa2Zc9$B}hd;1Y1&l2)7z}L$LS0y<&MZt^ zkyF(jaOrBaXtlCWpKExZieZ+LPtQvPWk2?Wi;@*x%6q`aGxjKMtAAmPi5Y+vB%ZPy zGW`VJjO8N2?^sGDu_`(?2d9aE&rE9OVozW-|89Io zP^XzB<$P^@y~Pw=MrWQ^X=dQnIJ;!tAg@pfsmMEzVWHmGb>4pcRQ&lvs@viDst&$~ z+4CwRmBC~xW7uVC;wba0;|=2%(~AmlRWFD(Gl}6n*Q)1sxD#tC`1^LDgf-_$AUID< z9GqJ%HeCB{$PXxNr+qpW?-L;eZ^GB&4%eSDBS*vXPb772^2|JmZ2=3!9Bg$2t1_*( z4L?-&3c!nryo9N}mcp}l+2Dc*kB{Xq+*UJgcYa`Z;I`Aa-%4~G^s2#4xzS$qhJbh9 z?HG+>Cr+kd?pt@@OSvn(Ic!DhwBKU-viZ6aS~{I9=~n3Q-l7LtGmA6`^2@Z`rt#_} zV@I3vaS`nff%&##rJ?*>n4BE7Ezn`vbk)i!k$^h|zYL91?Z&p-Z~nFwu&`-ymhNTU z!FOpap4{I`x&xV7YsiTw(v3tKvKGcx(07?;bXqi95nC_CLl}b-8pz*9R#W2Dv+!7A ze6>93PJh0B87l1i3W7k@Ai)q>gCO33rmiDctgvV7JBTIK?xC@szUJ=2UZy&#OJjkhr8QK;!`p{1s!z}I<@zc=K{M2Z zgpA9D>Gf0N`^Ui#lO#uH$A*`75J{P|#=`pc(oU}M*~Ph~Iu8ylQ3iD{E#IpxX&(=` z{&qUcfXZ_)`|>gusFt);VfH0#W=9|Twc_+m`i!|RRoU>1g^8M<9FoaQXwndhl6UmR zXOGO3gt8Siu{q&^di~}`6>SEWbOZx|N?qn{M{&0Vy8La22Uwjk&&Cz|K|*$uk|*?vX7A#~p}`TExTHc1-Ly&oL#mYV`dN10 zadbx7<*Sk`QFy-zFIjyT?n~IK=V8ElrK<%wD0Hz}rxNw_HS~KUsftIVZcJKIrCPl( z?lErqH}ogIO(<{@c%%#Wu2Lk8?OZeH?4n4GYWGeD-TUuBY-I+_sz3FIT(mn;Kq?y>oBHk738hNs@C7Y8#>}Rj1cM9j;A{9;^tVedkQ|j84P7 zvs$O2_=Q$`jLi9qItRp_xkE0VJWM=`8R{fP9v;?`R4L^%@k6JW>cRasJO)m!#qNm2 zGK{&8^#i052VU(TlgZ;u(otSTaidUZO|We89ISbe@7Cf&lwRT&#*DsYT*{P}TYhC` zMB>F>@3ZG1X`YP8v?^vxWo9m!ry9^6ero*s zAfPc;JXpW*QXAhytKquE4d4^EYbD*aXL0*|yn9+oh9kf?OxwW)Q^g{x9IZcfF8g6r z6)uo6A0wikjNPKQ*}>zM&=Ni`@+98wD6KhZ6_R$(g>zgy< zUFVD+!Giq{f9C|fw)H0u5EsjXGur)~IBk6%{3n`jZ^27TkJj{FEc=po;Xi-DLEk|K zz&y6IIuWYjgh1xA?>$FX;p$PsTv*N?6EIsi_s&9 zn%CJyUA?SxRk`Xfp}KnCO!`$drieQQRc~yS zrwBc^es-h5Yd8C_%<{fu($U5|6dt$r{LaHfcL&oRPO zmLFeRMZ`P@H1%+{GgHE_M)^rZ?{@k88vny z&PGIJ5M9zHR%7=!+%y~wbypnC1GWQL+uFEurtC@TnJ>J zk|0w@fi5cJ)Ty9j)WvaRi*7x=p=rNmde+(KjK_OtFEx=mRIF|8?%8DQ6N|Y4SV!zP z>rzBc7{t#(^}QF)B{~u}0##@1bC0m)$$kTa720n$TdZBo-{dZ8Pro%wiH9qtQ*$P- zE=Z$Xlfqq-K-SrBF*9YTNhDVp8Epv49<3-5gKrawZ2bazVbA>yQ)Py0MYt*Ij&=H2 zz!GDPZ-u`pxhB~b*bvx|*buoO;7-u-1@`ytZd_k9ctXHHK)-?iC!XTyWN$5I?ciwd zWboI4dxZaW=N~*JmQUi_U;8!l%gfJ`3XPVe&SbGS1cnJA=->zZ!)9{zH;U5KO$?k_ z-qh##NKZf>a`RZq9ZzKe9d6f?U%$8ZCy$rc!GEDTV;#sg)?VWJo5xB{4#5iKvY2o2XzacY<`$RFY5&7?#d0uwZ zlMa_E+e;umN7O$PEEmvWzc@<5Il}-RMH|p9ZTCT;VTY2AI-a+N0f0yzJ<}NshX(DS zHsHAAT!DGnp~90CYhjnFR-p9aX$!;2A3!QKwvkSE8-);u$Z|bHaJoE7-wIs}sZmF| z`qGMj1BkPewBigIgj7lvdeC1rYUDn?|J@*|-#JYpK!AYo!2i9z;{Rrle=bv5In4hx zbR$NfCWmC+gDfg)ip$C@1ml&9ERcp)>|{3)E`?j@DLX+_k|>ik&-Oy{!14h1V6jeS zoWpQ=17`dpC;4p1Ho8K%>tC?hzG;%(xyjY(_P(bB^y6lxk8Xk_c1Q?1dmkEFXOAL$ zK|;(kqPo#>wTC6Y#c!PW?t7Iw+F(bh#anxhSJ&cPUMLX~7}9d1#Oy$w?=`^FCTD=w zKDayy8Q?4iK@Hu78N_Lbws%R~FX$#Hbk4a zI&Ev6sMi9|xd+%clDQEtubncQ)Ot1}Qi46J>OK>fIltYjalb$aO$A<{UXO!Fv|Lo0 z=&M|IQ=pUV_77aSGsMNvED0Hc|Dgehe_x|h9c&UNe3|Ki0|Ya-lDFW)W6Np58v5^w z8drVPw;!^1Q7~tg#bvD!P7`8jsLZBz_UlIERNdE5cS2*G>-X`l4ndKBw_a-rTxY(@G0zWbXI8e0-Zk|xrm)uf{{4#K*UdXRRUr^p?$ZN$60B+No%byPpzLHgyGt^LIDG%qq1zP4X1HM(%AZ!&Gs!KPQ7C35-LR?zQEH?XxOwm z3q$4%m5Oi$$-cJ@$1W1oC8?jC`9m2zQyo{=aS`^6aeTN4;F!UmfR0soGi#wkX(pYB z%U9`8ywC=E67k+K8Oz`LEC3r27j&9BK&GCGZ3!bouie+E_w4~%=2yLsi;i*3=4K38cU2P}XSZN}w}zY6VV z--r((294flP(xA{!6=A6Z0xf=)Bj!G>IIAyaLzACGiy=z2DIzhVj@N7Sfll<0bmVLNHdu=_Blr*x8P3Yx6zAX~Li?`Qqk_ zL3$oa?;`2Rrj{eBK6^cD)cs3>AH$p0p)*zochhB0u+t7~)Cq*hJ3)kClLbQC=41FQ zl5O6zi6dLn=~J2TGXFU8=AReozj0^Y+QTkL0%258OArRc=Ks*n0WTuJH9rXp=zX>s~JqmM6P zb9jkyLFM_?nJecz=$Vj+iLy1C(tcEy`qy@qEC?aQ-I@3M`pb9w80}imXqG~s)>@bl*>o%%WcBWxj4|Bpj_>vsSFZQ=-vx6@U{tS*^VcdfBZ-Mz2 zS#`;18EM{cKtL>DKtRm@$s_*lhM4s~_eWUS%*i5qUy&l$j2TXx8irYu(iS+pSq%+P zF{t%LAoPJVrB$`>E!u~B;oT>vyihRG&A;>}SAUZ3o9PA6QLPj_A8s6T9&b2gJuUxr za`A#KM= z_UgX${7U^uT;+O^UL!yR^xaqPRvRjL2Ih0>~gdl#A#K8oF(l9myN@9*7`wam65AwGGaX%vjj;?laUN-(}nG+Rf332 zr*FA;gnx;F<`Y^Hek$5truWEUDeL??IPtZ6Us6?=5;;`j_yfoQ!PQ&R@J$V}n4_XE z_b%fPIl00Xm~|IPZyivWRGeyy%fwj*#sWL>ewYQt6O5%815%kxD1kYw3#N^MwxIBl z@|MAxr*17HRWuj$EaZGdjHRSp`dVs&od6To0{ozlQEePYtgANA{3EK*_k@Bk7ObOy z3-qKFo36_!<7eu&;on_Chlr)4?lV%G^oANXu2C_Uko4%p!YY)K=1KB7U;I$LNcqWx zAa5~dh4T}pQ7YX2UIl{y>G>3hNUDrnxpR;hK4!ucfhbwudKjVt3T19R<45?~%`+L& z>)6tuAj=PE#BGX299h_0Z?rg*Q5aXrSI%C_Ec|E_y&V2*OSF;@w~YK9GJeV(PB$Ig za{eSCeB9i*vynQ%;^aPvWIN^#JTXk73Gz{%zhg2s5@M6neYW z0TiTp03G@g`dy+82;P~rtq7Uu035GV=$ zTz3x`LdHUeRngR$5PlRwm|zRXHhUwFOxvI2@GU<`nv0>ZHr<2%Uf+cH>OwpYIIX)5 z*Bx`{lMMibj^0JYP(%_1)vr60GJTWV=*y1Klxg#3oeQI{a|$)58%Qgmi!dZ_&TN;a zi>p$pXvzIK&Ww_^PxGUiY73RAv?EhDRo26qT_MO@F?&W>SdExTe(^V7a+3t^`Ix#? zg?RI>g0CYmfQ19k;Y(d2&9=)~orzQUXU%3Oa<2`AsD*n=-I zQJ5#H>~NfMs}BK5r%3k?DP;u$5Dn14OTyW)M4j@9mo|(2*%L1`_C)v`K;nESZ zbL~uTd&uR*fhq36!?W^G_B@w9Q|!a2`fxGavse>*WEEE=w%4H1>U5*|iJ%WBy5}0a zWPJzb^WC3EBac$I5YbB+zm zCA`e9ct6(a)SdkN?` zVe`TF`Ng5hkocg92W|vQWCm$Vb;bFVdl>~va@aU+P+k#0#u*y0&5bo_lq$Hk(bimT zT8XYO*ahk}=rde}dl|kDI;a;>nQzs#WHK-f??(Bl1vO=;?hnFzR`pS3GE7u;HnMFm zUvOC$Kh{moFE$>A>9qwN4*Yh#rSLe0aNeo`xWwww&AO&|+K2N^C58_aSxwfwl#hA) zuBWT_5=uB$R#+S*8DsK4N7jiZ0|V}1_J>GFfz5*30r{bxb=*9MHZ;No|V8cK9%SG6EY$NN0gotTY>A2y=$YKi^AZ!vSnx=Fx{9K-u?DyN(a*OhC z?#c5`6lSBCQJ_^7XUPkQI8|=pAyN8Us`mm_RfVIXDsLOm*TBrz7Ai6y&ikmBOF>7^ z=c=zB$8vN7@ouYc01T1zMxvXp#EoMfheh0BrfpMLB;0hVqqLM8c~pbDi+NI^rX0&g!f9uC*cOon_>S4a6q8h5 zH4aDtTwH^6Tg`@q7qCQRCP7SCrhs_ilqsvg4#mM7TN-z~1P~oYKcj%TNICK#)*Kk4 z)vy*mJ~nV0<^dkR&x1g+_4Za@XSn(%49#YO!_k(y!5`p}tm(Zklk@?C={*=i*IJ@Xs?=e#`qr4_Nnce*!<6D@kQUXPG@~$)H z&u3R`$5qaS-P#|Y;J*;BVD%xA16%PYl=Q054N(Dr{kEv-xtEP!QG)>Cnu2|35cG{1 zJB8t7_AY(euIPAP;eA*;#>|*%<6&#B7t5Vc2BrCJ+xF5elRvdgo2Ut6Chftj{7%z) z#zBR|LEm8DiCv*9F6CUz<8A?1y_ zs&R$`i9-2abLW#?^5%^ds1^zDLPA&Tbk^`_vy>=}XicG>4ZRjeP0%1YxhVUcpvb$s zGlHvGTGTi1MfN20yWepPk~rLO_8Deb#CMA-W9D`T!7ywl&^EK&Q9w1Y62U?~NqTQd z5xn_bIZrv+GbtzVZpA~f&tmAsxgkw>@6P?z@FZOI`(dxF%A1!NO4$%wAT%#`-efixWrNF)`1;v*IDVReQF9J)JvmY%m z7MW&uN(54JgBFk!(4RuqhCKvmCere?pCZXDqaPr)x|m5_U}V?%1l}>oTb{Gg!(EhO zrD$+*^(VkB3aVrI9Y{md} z`2i~}69a!c!mBJ4oV?U`HU=*>sU{%vktlFz_i&$^BPBKx+mA1xG@BTygQym~Yv78g z7gGjv03TV-!WLai)JZ7N3UNccw}Egvhk!qZQ>^U{u?cAT6%Ni@^QlDILU>vH!rO%j zQ@p$5<%f+w?dQum=toZQypQvD=jTyD0A2X2%?JALTYdkN^Z%2bty|CY!gKAnInny^ z<{qj;6ecq!VvuXc_`StI6o``XTPcN#ETbnBPPH{IhfMnwi{st`bK>2Sbr2Y5hW`?0 zZ9L4}Ol2@JF*f;qxqMs=)FgXP7v7G2^=fOo-46l>2dTX>{a{xvKmU;BV=ubl0f2#yq+8EVl_jE zY73t?OzaF*i+x>2bcaiELpg{2?iD=YIJ(ncHEzJ#eqVb6BP7Cu>SIlm=f7Dc_`ORl zi=e-Z8y=}$aT4s%jryJ%POBr%t+7nyU@Ay#CYlg1*gO4DP z{}3O>X7&z_{|g`T|0U2>)NUl9#;4H>O|Ino5GT7$$IZ)VCQpOV_g)8Ut4m`$rN;k3 z_5tOJ|I!1uBZ6+y+;|(e(l$CZk@|YX;lS3s-MtB<+Ha0x#F^47z&SQ(04KxANhH~+ z99m}sAzj}nV9PR3Bbjnu9>8OGOMQN+%YrCVnH|K}fMlAO9W1?!O)7Bnl)&tqFLL7{ z*5}Ru6`=>&@a~bu2K#_;Zk=L&Wqm6)BsPMX8df1baYyTRWn#@(9q^UBhsc;Q~f3)2*c8t+3bO z-lS;h6!&BW2 zC+~>aG-#-{B92m&Kf>k3g`m_17@F@u{%(7)iFEDSKei78`S)|6|C{aqnEbz)eq9<# z4q2->lfE%RlN=W{(JzEbiu4){8#j%ybO_?~o!0VU#PPfF6z(0FCm1J!>kY^U>3$lz zWd~uCG`-38lD3J?RP%MS4seA*qaPx6lmT}1T)y#sZ6pbl0gY46WD;;)B$F47_ zq_Y#QP5ft-PuIEL4H4OQ>~~6izL2`_PHZay$^H4=O~vGRzz=;oJ&oB z5%_eC{(fs;I6`r54IT1pdOnh^w~yOWkhI|px(d^sXv?E&w#1XJs`;(Itx9?1lqqHj z+&REW)wA?eWoMd?KUcC+s+3g1Vp?M3^$XeLR?jiWu#5M3;Sq<&ZlV{5R!u!_ZI zPL8c_T$|-#o0F}-K5#O~5Tw4Z!ddp{1Cc@2cs=+8lVtwbI<{;xsR>&4B-)W}cAfZS z-!}^K`YbTc#xWkCzuVq(vOkFS506>^{SSGRy^*t#y@S!8vQYlNuKr#Y7RFEhl_`e5 z&ROmDG1R%&fDQ?GNnd}lf=kQVnF@nJeziSwK6XlCvuODQ&O~i{dcMXp^b0ykiFWxB+zI!y2BC1le zPy~Ozw#ciUx|osTB9GZ=LG{b$&%(zXej&KI-Z{26;E_x;XTQ!e3(Xl3U4G))nrW5c z(-hn*Y|(a=E|h zuzYp##4im^9<8f=AmIpkOR_dIu?2dilNdP{0hk zaz_ECX20KuyQSJ!_fa$+o6HjRVbVI7In5_y> z3TcGQ*zMhvP<>YOA5)dBfRwqWc7n^XaLxYKor$QH5<;m9dCd07FbJUD(U0qsJ}^e% zhVi5;WDJ*}t3eZB(u_K$&{Vsbp^YY&rez;rB1`#KH0D%5w)FgoM8_cie!lmAM&mz% zQT(*@IxqZCx6{v`lDHo>zvSgd@M6eA7c@%Ufgs7`OUOfF+%-2!+jdxMEF1)ce!2#C zfpN(-%7ZO)D=yX|bqxryX0Yw*U^wQ1(DWn7j8?u=9q zE=a$dIUaG$zZCo8HAne!@ppa^qk9zE&nGq)^O9^kYh+Toe$|M*6F^DPuP%@ZVi*bc zM4!V>9f1SeO8g`aSYQuTDW9xzkXb)m`FM3Mp6L(nN{YJYQj#enceN=y?g8y@6LeA7ZX7a~*+F_)go}_GXL+aBPoW z+TEx0QpQtF5V_rt)My<{Feb4w^w%;9BW#}%an>{V{0kb=rGE~t{XqiJAHpi}pP<3P z$WF(=#@bQu&xilk%oVn=7qGFkH2QBVrj`FVI{j*r88eQkfy}J5F;2eB&9`8uy|PjY zz!>+78M&})r%p4jGF@wBlXli;PUaKTVi-1$;mqVK)Q6wTMa&E;6V#ZU!{Ms+xr669 zWApd>_Vy=Gj0i&*gDXuK=oSwC6^K~Xuq_BqSqpk^C28M_=#@=5>5y#SFkJ#2$*3o? zi!6E{iE2ziSzeL8+#sSrOQSJs(jcwYremP#>6J?#)k|KZ(PX42vL;KWf(F|?|O!I#rbyLpol80E^BzD2KL zqIlC*gAgh;pxhU95VR(py+GI@XW|yetybdE2*Ub+HM43xJxuyk&;PqI%d6wB8u^;e3eUS6IDQKR}3r}XNsJF+%zDENLKJdN?KZ)kK@)e)8 z=B+^|kmjseUSo>7H{;l$fzoYs1e&g}T* zOBQfN(ehrhHC>pkuR7@`^|os|iSI0! zT-w!X2!ysLKs(!}{N@GfrF4|3htrqf?HHd4y#k%f8=z;|<2J#jkFszRGTpx&9{23v z&w?WBGm(0t32;WS;`Ej~X05UG6G;LAy9D;t{7Nt2&3Gwy%~VD|BAFxRQ60J5MNWJo z2=WneWy-z6zcZn35UINTk=J-ZlOq+OXXg%w(Jv5zz%W58gm|bjfb;o0Z4klf9x)#c zE1$s|uu>m#Cl_%?IP}V9_~JHkN0;ydHgO-$H@5m48CG7q2UAobZ9j!Ss37A6)V={) zFYN$ow67s*SG_r+&>G#GnWYi>2~b#5ks;#VR|2l5IN=y8M~8_^(8_X)%I3i_v*SvV zbB$P*!;9A;%tODgxP-n(O(5PaLGc9^>QygLa72fBM1=;7mZs=c0~4|je@p!TjzyDvg`04w3<9UQb8zfo?IioBkQ5(wvcYxPG_Mw$KO0 zF+(SIa;Rvt#KqEJ$wHb0X}szb$aAI2hx@H>SKm!O0D7wua(WvOD!Ya>O66vZ*`g6zNgqtRf_gByXXg8xt=K3*`Ana#fh)PURUD|-!(8bMuqvu3W^~w~DSSXb z=6WF#4PWhj6acTep*81=}XT*aLS_H z=730x-k!k*ZUj%@_k*U@O|<~W^$~m|Do}_(5`dp=o&#O0gF+pgyNk1<<0L9#snxzL zjMsW*^qO$ykKBVK91d!$`nB1C06jAU9)d#ZDmn5@lv#vOyg&{a9&y~{ z2GbU0%_6S#ETbi;Kw7~R`Td+uljA2LJ@{_jt|`~Qg+|A-7q ze+e+7aS1@LSAiWwX*TfpCMiSZL2|2fSrEMIsL$V{2p_qnwj9$Ca7g9&r1#m7KyBqO)Z!xGzFYLbn2o~C7LkR0;M!*e~yPYRm!`%eLNA^hC4d!g9|~AXw-{ zxN+{%3=1O;JVk0p`~hCWnRRM4EmjI>l|Iwk9%dRD2Ya@at1&*vN<>j32P)m97J9Un2Ed4B}x`mDJo6iYk|{W=mt`Ia{Nl zk?9L422`y(s%f>#`y-`>6_CqrP#1>l{?co5p~XZg$=cNk8$EH{%R+`Zj_R|C{%I(dg!7}&(z zeK;l@F-@g3HAFo*Kp@`|nvt$%mK@q4yh;pb1d$di5Fx>jNEZ--N5a#)`0mjPsc2Tf%dR1eOq2IX2mZVcX@aI zWeqkuJ~PJTPi?M=@*gfJ{pBuZ)`mu|IyT1t+ptBY%DWEoGRoJ~=4z%_1YFFZ{*QJ< z!gK1H98?rA0_1&+0q~&^;y68*7`k!Ft0@f0v;wJ#da<+ysmf?YDJvE$DRX(S&>@jH zbN%h#h24!`VyCV3{a1dVN#0|}{hcOPT+dneT+{6?U-zRDdGgeZ z{k8;=1c+IV252I$cM6DENB1t7u0xR~w?DsLvcR{8?-8|QY$qZEMeoYB4;Cb(J0^}* zHdKG9u&rAldgJaok!;=Me6wl073dgT-9GA%ez`H={ul^!xlw=|-Yn^x-Y6J{B#~yf z8v_B)I{sPA_DHRAaolt~G(7yeh7PC6dfv;{F&wNT%1X1FjOb0&!@ZI&4+jn5^hBcM zBrC?9OWYsC&Wfx8VCq=MZ(Hm)Q;IHIN2Fuw+Tui!8US0EbS>jTh%T2CkT?N5R{S0E zYpl;zEh>+U$q(#fKF3jr0?naEKU!wkqQFeR1-_ zB2dOHhvk4KD>EuIf%-ebJO5JYKAb=|udwH(=8Yl6~K@YekIQAUK$^k7%190=$N+(}e&IfBZ8c4*|Jk+ID+1;Ue0 zee2L0i*G`9X%&7$`uz~svySwo_6!N6x2}6)OikgoWyBnTD!b~z(suof z22B~vhav!`QnXOQ=S)=0q#Fxh_?SEsRr@@ST(KG3ScsZx~ zA%_u;#KNrLz=%lKUvS;AwXjt5Pdm+s)FUrII8dr`j+gN_9Oyr8V&a&*SX9Yp>L+Q4z zdQVKy$-hp(kUFW&z%Lkf+K91L7@~?8JLxr`N9KOe#VLLgdyyPEe&PS+!+yGnfskYg zdkjZ!y$_oh85xLxSyElCgQr{DDq1;^($Qatwd4FEKcvz!emHlGb4vp0lXUyzLuqLH z#s%2oYxz!6$=EzLg9x_%m@*q0Vp^{5*CE5EHoUM>JqealIMB4pcBdK-XM&;vSz8FA z!|3w0@%T&8LV~M#d-IK?d8yDN?UyA`i6QAMDVcm{QEu+aP>oE_T}_!AFFE=QhJ=}ei=Un@&fdfz8GBC`91WroWy*DsE`OF7 z|Ac9tzaNq;3sRbo7>ch!wSM}bn4c!kl-hJY?HnC&D zw0Hk}-QF3a75-%0rKp}Ql!|t+VaS99Eni2(tG0AoLtLojUBGvmUbkRp>t3h64Lc*3 zjnzo|v<;V zqfAp0ZXQcb4o~oOsmu3UTs{2&GnOV?{&o#BB|=BIT+qywq(P#G`7}X}W&wi~nw&wB zEWXHT@9*PP`h3$$lo#kikb2Zuy?Jx=7{WVPLa&iAR)BEy)I&@y?psdS0KxnARc*cQ zz_9pvY@IlsKbN6lbe;-1!4cJ?y_0sB_kK>=!=&U4hB$e`H4S1DIr#0TkV}y}8tC-o zlb^)16m|8sUJ*v`zRuI+k+XKX|&NJSTQTo2{l>}^<1XL9<{NLy3p&vSe87F zOW`J}I8h8JB&$HwbuDJ&T88&jD^b*M&HLz-y|5Pr+mpkiVeKJ%cD5WQr|T!gmF?awCPE z>I;%wJfLhR(%h-Wrr_17{nikaZUK0Xr-7z!Y&6Dw9Z@c^_v5@?=K(^bTPkd5n*g&a+O}>B4Akht-L-CewXR(m(Gvq z3};VEC%w{GW#i<(H@N74tW5MX#Ez#8hV`OjhI>cxHFn<-QoSpow-?g^yUnJkBq2?yWH{A@iqwxWQh#REUa`w z&etNWbf-XRuuLXsqmR-a=ybtQc9LyC@&3(YHF;&as}Ih4wCSJj=e$&<*{;j|{-l`Y?>F_hp5+qR(6Ws*u98woV4y%EIcl+0U_uor6 ztpHlrztj{mLH`dJ&;M7#{j=+?WrN6v9JH;*ofMsDZc(XT9?}4&o=d2mqRTkf015dR z6f{6lrzLIVm}=$n!|!VpT8dGM@fQ3gKf$MAqrbLM>6u?MVlLQnE1Cal;loErxh(yG?qQNEUD27At=Du_KuNZ)ugb zZ+=R*D)M4qjl2yrq)l$?E^UN03khLcFmEIW*y$w9B1!2{Mr&5{iM~9r!oRZ&og3ZG z5Fe$Uky=s4?MmnJ?t#g|&p^!H<=tM-i_0Me`v@u=xnsVTIEp?~t==35Carwkcfa58 z!W5pDaFcZ_cceWI7baRn+n!PcRoF-GgvHkL+u))LCH0yb8*diHvbHvdrjDO8a7OVHzU$+@l4Vh&u& z_5Y#lEQ2cRmNZQjP95CcDcs%N-QDfr?(Xicg}b{J?yiM%a4FoOfcd_eo|(S4?~Uk= z*gy7;*b(c;dNOlKX1-7@NkKgpOKb4rkQqLX%5;0ZKOT+O9Og5 zyP5@zfyd#obWkRft|dP~5kv`J24x5D@TfMSYesSPk4vt_PF?^HN6rQlan}ZtJI%ZX zSsS-%8l7o2F1FvBw}|o~rVzahOm@|)mEfagrulBPGvXZFrz9@;fT1mmXErvV^ie8+ZrYqU6-8mmB8KWN9sQWf(9vXDsF8V1VF7m*Dl#^3lSx7e232#cmxxT=q!U)5LS079$tyYorxVXb zb3s#i=on4+;1UIf0B&EYRHWF1$5T8Yg_JgZahkv2i@2ar)=c8q*tSVfeIlnJ3bv?q z#&GDzKEXKJxYZ5VnSv#>r0=L?kBhF(q7z>+i#DR}JDl7`e1WjymVj(}>_9!DWK;ZD zgF=Q$zLK%Q-hGu+l;10i-cU(I@2Ht^(}B2b@zPJ#t^z*MF)qa1j=?qy7uz z+P^>+_#c2QYUE<}FDTAc(fQkrewbrsH0pWVi^WEv(WOiTwH5bgXvRpX6jHEuBcA_~ z*K>1qXF7{#yzzhDi^d_8&3{)KX-ZcFmm}((>X^#B%6U1;-tqVQ_^LSS3yzl!byPpD z#QtL+V>B(0mKskj&NdEb6hY*&z)9^nLa0vF8<5%hq|8j~mO_&c5AAzO7}YD1nHp#D zt?auG`Y@0gm7pr1Nd9krz25*wz30+DFa9^bx2VVy!Q0WT93G@T$X@&+Rd*BVPDFoJ z7usxQ)73S4@ugSOyhRQ}Cg3MvwLSM7q60S^MYr0hb5U>PHRBxOtB>DNf#EgdvZ-Mc zFrVefTSmqlYt~MhfC%EUnH3u`QQ#G9J+BO#Nbg%ee7sq?4OG!Nysr+w8nXZS{^5hA zAnF|>wpCN3C}93>-l{N=Vo=y;(x@DdhGcFCf79&OyZr)o+K8u#CXe;4y;+hvK|!)I z-UAZ~+$dk6+sFr?r1fO8`+Q!1PrSkZcDF5ti&O}o#m2HnvUCB`! z5$$wwT1bQd>RmXO*GnpC88V8tv6#uU?Wf3_bX*vuwzE=_?*Pe*xpDw`HL3DG6n$y9 zw`xr?-I9F4r{EFVT5jSKdKVLrHa**x)W-rA&Cuip!CX$WI8 zgbt)sSYON?;a7n_u_SQphOA+$Ol8IlvD+GiV;pW*B9dv)f{k{y5d4q$on&o|`gi^Ym0`@gxXk3#=uMtgQWaJ2iY z+)!$_q>s74rFsVD?t;{lx<^qweB16y@?{OGz=wKJ7n#~Vm~w0zIqiJaY*hhAFQ^0k z%K1>1Ct_*zPjOk2LL(-%E!rFN?+LQGH&8+5L$KX7e(+_X8HNe$-|!c$SNED zimQj114RX?W^NPZc@^z7Z0o&mYU#{58%0mu&WU`i(&s74vpD#Le9rgYSEQ4EdR?=c zvs-G2(#m?5dPkXXiUQAIewZeWHzdm&@XQ1uO*{eik8@YPn{`eqt3Q=Af0p1so~^{p z(W}O>4H6B6Qr+`CHTGObdIC<_XNBy}@kX8sciBfh>A|QnT)?6cnB;tA?>uc4M|Sjn zj5WifXRUq*%Az61>UgCHXrZUQ`xB#3L1tt73)*O>VTG#q+R!a)@^U zO6bt3nx^X)GLGi(7&&{MGfg#5swDa4B}6I^hZxC<7vjN@5kl161fcNmbjk7H3+0V% z-5#;Jdnl7SF{8*5Bh^S0&>;D7crS*F(uI$|w!MXGPbAJU6h8)Q%J>`fN}HjL<*J5? zi%Ic)uU3dIQ}sx=kQ{vFOji_@_(%pd0A$@!fJv+pCq;7E<3m6{xBULCcoqCHJ+meq z{;CQSaK5R6(*i(x0iQJnS$=_JQ#i&t9xg$prqQq0d}c=4yy+0QJfRAug3s0DeFAi= z5&y)wFk46sh(Ot-*I+s7^}&%T4so2WX&_sz>?5AYg+X(<(xS7X|03nD&c$HLxr|_m zF~~+YpgnTi1A6uHN6f(Jlttc=rx&%M{ce35Ws|!mQFWHL3G$?%xt6*(q25HsUBF({ zO4|c$=%WJK&;GTsbOz2RP|8oy55p^#ZEXU_37ugx-G*b+nj|wd{b`aq5K2wefj{zj zxuP9;W7@8{B>d$+-Nb(R!ky0b7gegzU|^#E1G3~@ZOxqi9b0O)Dkw^5e)LE*xS2}p zxaipEL6MKf6y|VJTBZycEWX{f8e2hnn?3ih-(QJ+fu+qAnYYdYm8Y9}07x10*S?P9 z9Pdj{-G&Ba5Fr;^64k2x#ajm`{+6=EjbpnNYBfP%WZd}Dd7&DoMoQ6o^*N#@wyC%TA z)+CC2!GNAdJHYoql#_z5=jU~~p@#J)Xu%Dubp4hpx}~!okXVGU+rR(r<_?ke3s- ztG?6cjV`j*eRh+zFYCHp;uqQ(t5yTr##oylL;3r0KCSWWtH!-8UH%+bNv(ASp2h1IV}RIcGd;SPMqAqS;yO3@nrbr%t zK($1;W7dq{1Z5odL}m0V!6^2be3WTIwOy^yC;UH}W|-10vI_tVtPbbDng9ELO!Ge$ z4_dGus>|pfv)NMHlcq?SjDlcBrnzKfMpO;*Xj5UuApxdfsM^{eBfHByY|&8_QJ9CTK;=rpcC+m;q9>vQ2*&nDBP7^I(w+k8)(P5I8V zJsfw}-cNX66@{YpeuZS~S`Kok`Yb|1+bvwv!S7%=+d9RxwUV-_O5Q$y)y#04{VNDLbio9~TMUoJaH z4jN%z4!+~~6@tFN3oKu=pd(g#jD_a!W8QlH3RUJU+)JnSBfm4~QjFXwf3As=(9;YW zRsADBjEq@%oe?(5##^vAE}XLaL=SPDV)+pqCSc{E4e%{RLg%amX~Fwb4;k~8fil7b zFpa7582Y|>DDg7@pQFQmR(fa+?&w+$Y|;P0uPgUZ6a6DHC_s)=7a9JE@=_OF$^qe} zGW=7IlkijN#sK}3^dP&TU2Q|sfkV7Vyqmr-yVMAUVr9e_StP!8y}p%xWvgh^l?LOx zZ22mk351<-asv(C0x9WSau({AIPYjs@NvkV8hnjTP>nTiD{CFB9ncoWuEHLMeF+lx z40h--rYc%YP9|O(_g-?q!GS4&k$-RrMR)a=PwfvX+^uduSKC2uAsSke;MzJ^c9;br zPPX7`y{6KNf>Nz(d4wS?kmWD!k)szGcBCBF283X8j?f|~o&~$1U@z|wro2+Du4bY5 zaI-vN?wT4S1Z^o5i%rJPhi5lZee9^=*a?jNfe>VP?3PG}AvlR?u5kyACet(&X;IFc za{vo+1B~_i+V8aaEz+vgezXLPmMr*a)%2VMcB#SMjFHfgMnt0YU8`T{%wE-u;rVyd zR1rGxHy*UT>x^5LYc3)R0to2NGLw0Dh;VF|*#;!1qOjs@b0a55_oFX1bz#?CLB zr<<~dXNIzeW|B~y07m6xZ1#uDc3Tofb>kf#$tyxG2+91j#cB8&5J?wBZ6;!9i63Wb z7UgI*6zEb>wiRX=qYvuiYwR-YJq%Zx?OBA=PT=nv8)$}H6Iya)sL~ab5IA6^Ls-ru zz6nW-55P%KTkkpgx}$1$~+hV&hOUkJgrl<-Ti~(Wdv@mn75zroNS!)LC=z z$H{Qbvn9e*QJT~Etf-reRbGYwU)JIEv)cnk6Y?10vj^xc#T9NYmgGiG)I;sfY|0u2 zBN*yoVai^NbJ?+^hxWU5e3j*T>#=j~UtILd;Ns{KrK7U(hAx^ZCGAlyG(4V=3-P-!v37ABIA9skI#84N? zV3%zd)hc!$L77L;&-EYhojndAXe$!pw2nER%+Zx-l(yrDEmGNJ&67{nmF0{)JLpJP z?y;$^bS8YWyH!l2%ymiHTrE4#ayZgdi|b5@C>+mOM5U6}bKti$b>4}_*l0sbo{afc z$b#_%+p;9miBaT6D@RY>wZX=InmZw^$DX73=G7_oxS29;8A(j#DY0jcGZ zX>x0VvMr_4ar65Q?Xu*{Zj2X@^kuaUO0ij!aTP}}>;y&JI>sf+s#quGnt*ZHM+6hO`O&aB_bZ0Q$%_wT#KU5xez#muNen^C9;{5-v1HPX?6B5zWqc8M4nL#6oVI8foE zQp+@(#lN}wsQ_)(ddj80_BOuP@~AIHsa53a1WRd_3YOd!I6YlK!Rb>))_`~OHCs|1 zy%(ZP>UUSnZbqLi>Qd<&kp^#c9wQl5(;lE!XQwaH3a5oap#Ystj;{M`x_4fj#K!9O zMs06)!NwrQdB=D79J1q&@8^YnR?(xg{;}9&1hl~s)$W1_u^-xuR%gPS=`>c7fQzNt zG1}Oyn#@G`%}}rDNwhem_2Eo+MwwFM{z%I4n(2AGW%znb4(=BJyr^nDp9}^OQRS(2*=!pOEk~ z)DYT@ITQxwnzH%Dj1|nxUtG9%+OcVxk4h>LG&4&7`{*J1AfAxd>&G~3HZzc1<=a(^ z5U2JVD5n!M>w6uhXWk$Fa)MX^UrMZs(-m4Ci(M2q?A9e26=fb}H~J~M<>7pwFJ%se zW!sO@!xd-mG>LC2UJ#vA2#pl!xhW&*T>2=#<<(uIj#B~_S@`?lzVVeYa}pVME887BS6`6@RfsPe2rA?Ua;<|m8a=v-OT5>L7@`v@@Py%a)* zV#0n}Z>=+_hCz-oeyHU{|h~j>Y03&) zbkCX4lp@kxREuC>(Zr#vXYL!Lrmh2_d77tQG~&Q$6=cr|0vZP9W_+f%qmVjQk9=Jg zpm>$sGiN!PMOh|q4TZUGa;?Dw%$dx^`H+PnQf~j~`(P&Q8E9`{a2OKNNJ^d@mli%D-q2taN7L3kMWNB?)qa1hiF+VhTf*j5hWsasMieAJx8EzXt3Fpg;Yf^>*-<%Xy65e%sb9E`Gy*DFq*9>flr8 z!=LR_K$Sm2uxhCLfT(>I-MV_Wnm?zf0W%&-w^hKKY5V-1_Kp^l?ii2W4S$AF4Nr91 zp%gb+7G0`TTR|_W0#m~@gR|*jFtamBHab}rJ`WvOdIVTp2{WHP`CgR*eyDtpDP=t`(4lQvspK$1<=J4HeYu38~x#pQtzU+%vO5F8x zR8k$45-RGhmWm>uBJ@?3M=?<9oNOV7w@c^p>33UfbTvKe1Fp>D>9PI0HLtf28;2mS4 z-@J)}Mk9l*o;wyKso4_6Yg7ffJIaIMPKEvI4HU#|UdURvBqYi+@^&q@mHbY6rWo2Z zENhb#4yC`mqzY3jMU|^&N}*5CYFDeO2x^JTq&k;NYe`v93RSAJFE||WzyjIB=l+wcr>ULUWOa>g0tl&^{eFzJa{doJ>XPjbJDMGn*iPW|mP( z?P5eU=-0sZ%6bZkO_n#$*QhV31L175Ro>Fqw#=qTO;oibtU4Ryl;AbJm7zMPS~!A> zcwRT<@co)pV{}=e@~M@s>qREqZ%Cs94(jCaz^egl!~WPThS4P$xUD;UIl#*w4G4FDVbR7S9|P5e9(6K>K7{bHg()iI9P_HT1xsQTTcN3cxY=fmE{@?K1* zgJ?73oDBQE*qB(G7(Zti6Q(k9FjbusvmLWBqdb?7ZZdJ0rt8w%^Nx~7cxU4oJ;d4c zniQCZ24)K|GtClEM46k(*>V+9;i&9p$}4ys*OSGyr)MimDOT7@O^;b+MgSsJW*Lty zOAEgsL=1&jJ2JnhcqljhPLxbd)OfJ@qiYpdX1h+OQ?dlVOty-j&M{tQtFqWcW`Xts zlKc97A;fCUViKs|%qD_K&n7HWyfyS?@uWyp&oj54zOq!C$if>ZxM&@_0ust#i~izP z4wsx|dXz2Dpq}YHgAuupSQqdE7uswJ>iP@6>B&xQjQq=)Jl3oHsv>~lwj`p^nctqO zySnt^Pm+_W(zH!QpDPaq-ZZ2GY`T=ihO=;qhTJIp;TjAOOv53S_;%{MT>GC0(5@S~ z;fd8fi~59V`*=NP^8N!E+J<6lF|Hc_xTD^@jaU=5l z^!V!KEtLL*t?`aj>MJO-tjq6cFDTrLo4;fEbq0r~@l4th=URG!KTCOyRN7gb03@>Xz$HR%<7~<8 zR9Z9-xIw747*i_MXH4Whmo@Wjl0B^r$c8&C1r$VgHb_ZC<>-0Ge)dk-c8G%e_F`*P z@|5=yfItwKFA@h$SP+gX#d;*@|>_8aTRffAarEQ0sObOc0WAh1D2nflOH`Oa`&A%*%wnjAzaAqB`T zU97YsAqC0WY)x^SU${x*AGY^!qt=$$I>UL7Jv5exUg~r6+fqw#K_q#zd^RsTJd-U* zT@Y2D1iJHt4OjH!sba8ZUkl;JAYGKbo?v3$P7KjqnxIdNtg(y*KxEz#5Z)nVI%O6E zCb~un<>3C}k?(=bZ;%{ob{B3MV=@J6IG_=bB{&kLCk&}|OLt>Loh!?w3)ZEZ=i2m&b5$!cRW8{11n-;9 z#u6vVkR?aFb*fx*Tr*EYOFp8M&dY2+p}K|~QEAT(zWtNqLn@8x4*voMM)%*Xmi&K? z@BiNWNXZN;B8`47mdfdz_pa822Q5o`pUfXB3Q?*e(?KdEm6D1tiW;EwGmr&g^1;IS zfeEB=o|5bdSrgeGP2Xm7+-<*&PT~fTs4GVpiI3XAAy1u-ooEt~@oBu2O>ao2Ce(5x zROxM8^FG2vO1tL2JGY5N*lWcdULh5}v_J`Mxa!Da)o39QLR?T(bV)kpwpCu6eYvuGIv%ZUIKW_eU`n}f7U#swAxe$(nNf`wP30u#J!wg9VE=JaS&Y4J;-SI7h>^g+DE=Fh`X5uN zVeNpcf&NijSDboKlf0gaY9yROA$I_+o+M1*W>b&%UCo3iuBOyc%5ilewI{N<>UV97 z9zp0eg>3;91Eghv;uI+_PG2pqB?yycigEC|%l~E>r88!UpJZIJSllU4_xd3%5CM#q|- z%Pfqf4?e^7R_q8m7@6s7mQ=9 zmb#GA9F7f{gYd1nZDENj2*UFM$2~S z>`(aoIk|vS!T@?e2`ATp*7iatSFEFuvg3Z;DcIxdS=9P`KHG#I= z3MofMEJcS5R%!IB1oOvJXY7N)gIqEZLFRhs>Le!GBuXY>BqwH;ix;LqbMwH~B=X~G zpgHukkG?7178wV^$m*GcXhFs*UZSM;7>sA?m92kJzd-`!;D_xs3v1`*<6KLUICIAZ z){B7FrbBoP*A{bZ5F_5|I26;YgQbd`$Q`y)N<(tGUz;fNs75mvUE*p?rYQMKPvcb3 zE0K&eTZ2+1H0@R<9gM^*0GmaX4dv!A*T#qjTE0#ydDaQ?kEca}q_}33LsigK^|Pwe zy^nCz{YobnNVAhkL{!`edeermf<&UCB7|wQ-eNH%@g+u!k~u`fS(p!fg&Esu13He7 zU$$U&k(9N;kh6(daXpt&MqNB--V9UxtgA-nwagf)Of5&4a4?YVakx7<10&1m`{hG^ zHZ=N`i_X!@RMVha=R834f(C9e?YowcMKu*b7GXnwMkfbtD0X}938G*s#e%t zG97E(irR41GnI(7Z$navuDmATJ2V@qd4{~Kxj~aCtxS^J)YNce=fRKlAyY(`(J-+Y zM|YFXt~z660hJr)Kf?VCYMUcppR*vZD9o;oSUQ;aI6MUz!SV2`jy|jB#9cKqQ@( zwZyy|`6Ybix|<(j!9mXj01)AFv+lC znW?&%TVK!0rlSmp`340hsYtY47X!SPxngU5QJ07YJ`T2wg1lVus7jFqa40eMOP3QS z6EBkej%7r%WND|6&?*U&y-7~>`PM^LRyT_}lOzZ~s?ObnuOxS&)0^(Nr-ITz+|=@x zTc#^Hf?53cml{npCp@>|)%b!(*Ww8?389e1WD^mUB5+a>)D{t2&9*~;Rb@#67qfg5 zd7gGvvlFBDdA0YFTs1U)lW;}d+}WQP8#IJNqJuOI^FSzjHJ1xkyTASq(THxAa*bd8 zHioCJU3!+FJFZmDMZuzvveWl_&&<*A$csFpb9_W3PrynADZ3EymbBI>WF#E z&Q70mf<_emN)y3q2wOAV#T(Tqy(X7JE}DMR+eQ+o)2=YV(bgeT(&_V4S325z?BYi= zWuhW07CapY{J=dCZ%aqKa1qkc$>j>pSihZsdT>hv_CW~clr-_(4DZ}UC`k0NZWj!a zM2vTd@FsPO`o&|&V7T$!+s^aEmU@mzoH0zi&ZmwD;Tl!(S&H?R;P-CX+`wCXG$PSN zGUpJqV@kd_A>ja#Ks53P<;XKB)-jdt(J|w2xY90Z{R<_=v#0K{NqaxTE(PJ}&I|dU zWQ9FjKkUyvg}t3WRNaGY-IHaR`4*Z97FslzHiWYc^!$VJ*IFx+u4#K3npp;BD!jAO zn=U%mu+vy&7}6l6S9ZQAgq%S}Ha|jNu{flovi3r(VNWYbTn?&%Z_Ql+7E)(lFZ9dm zW?+kfPf&TKDhU*HSG#@-PRK&tGM~r;!Zw6%$QO>!nwTwjFh+i9Bm9MWB{s0#=)ZiIP!Fy$?w`eZ}Qengbt6d6Pw8N0|q60rQT*CG%Cve#Js`w$99 zyi)byhII_j|0z#Q=&z7YXTPYz2mk}S!u~fQ9cb%dV;=^ z^pBM!TCFtO;Yhp}%CXyL{85*8DTxigH5@@2WLiyy!O7P?%1f3WwN?W*(i9G4Tz<}UZy zHRqYUyNk7^E5F+nEihM3od6_)gd-s!!R?-rkCu46{z~#L375g!5mw)EzZjDy)SX;E^{C6vXEt^ft$Q%jfdT^<9S)7A8ZWFQ z!`$B?YA(UaZ_L@QN7?=+{u*xLj$;bcpoF>lHo6Du<^0)`d7w|)Fpd>Lj&?hqCXJB& z=SDN=zFV&`AV1O6$5hgz5xi`CSEeM^mo6CO^5!738Z#Tm9y*{&!j`m_CWQ+khV&mL zsH}}AKktfhSd!$(qJE2QrnFL`B!G*zV-si579^?MjUs1{yR@HU%|&vAP8RdN2JbQ5aEN|K zdQPLDLrcIB>#iDoF;QPrz_HGwBS9)ojVeP?E;M}aR|C6#xC~mO4_r7ur9=ni_k13y zvgR-iLDH?YtF}czAzs8r9X31ljhR;H&IEXI;Krzg&~(6ZjN_LsN z4<7(;c2|0+1dfp^&@u^*LmvDZu^kqNb@7su4AI=ETDDpmWZkDZFSu&7tyDtI}9P0_>l-LMM z$IlAV=AiK5jOFls{$e*Jo$V=Vx)#eXYV=(HjmM{58-mri1#xxEGB<{OqFm*O(C?lu@aJ*xtC&VBS15PbxFn%kmKlx5dOg{QTuO*)+E9R8>vblQJx|V)Sx%{@HVC zxL2!amaf)UxGjSMZ*l-TK*YaAlPk35(+}#ZpX*saN6xT)wm7u;h)cYKG@fv2dt*Bd z29OgaUb2CGYGcQURz&wuOJ5PaX4_kTiCnEzfVeHL8TF6d2|nYr!xc@@d{N~yU67*cxp56%$y#6L%zfd$8H+(#v$*n_GM8LylIVRs;t7=k5t&2+CLUIJAJBj89QH8_c#~*X z@0hR7h+A^9QLUOQ#F>|;v$X=R)zFzM=xh)RZBTn)5ouO3VY!u}8E|bUp#K84e&eaf z1-}agKPTLRiyxv$FtH@}OV}4-eLJcKkL$&xlsJ}1`AI2ARqyA%I^Q2m{9&O}(_@Kw z+TKDI`5(M!PIDFnopRm6;b^f&T`_sV{!#2<@Wi7KQKJqmRV zc@$lne*bqlpF|yRpQ(GAS{-%|e@fHV$jR2!$%QHT#&r9`_1L93gnfyE{iqzwT~)j% zYml!j2zp+D%KJ1PLf>e`Hy6tTcQA!J$ob$I_Hn-q%ghCFm!n-p!W#SCJC3p=GGh!? zL1&(OVz4K6RNJVFe~%X8E(s_sebBoMmjtdZ5jgCJ?I`G3dlMay!d!IRJ zVw4EBXpd1HriJ9>DXPq~595w=dJn#rw(s}e&wx*oTxubKZ0Fm$q*Qd1@&+(* zc;?%0NE3f9gO!-9Wd|kVI&$`J<2;G>DB>f{<- z=0&G=7q#JDKKwZDxL$tJC74B-{2a?2TzXDEFqh zx*R231}fXj%DxoouZpxUr`biqo7d zFDM1{Y_m?3L{dTqWnYf5({=ZM_c&Q(_jpe%$Xz$Re{)S^w5JtiioX+H*NPj~oX}~D zx+r<3x%w4vdAg&i{+??#FW~X^p3L=Nz#H?q!lProZgXYBVN6?}LT~|^;N@GNOcaUV z!{d7B4X^gSDu%exHYztCUx4&mdCkveUaW%jnfgGjp*L+@KZCP%4Q=fdmdT}*(v;S& zzLz1Fw~!~NM$|vdz^LhvPT|F(4g6UqxaR3%hm|4Y7gHEO|7V7PIE)?-^UkX-;aQu5 z?=#hj>TtSm^>Bz*bGkhxd z%(m_C=i;w-O7i2_1qk}Ai$3Wrv_AkP=^5M-JZbvEBs0ti6hfP{J|PqcCM@cetw2o8U%h>g4V>)oyyMaGy4$F%`PC`dyd!94%UnV@>gO=GYv%l< zrpi+22T|NbO3Kv*?>^J=8HJpBJZ4%Yex&Yw6|IGuuErf_do0#Gc1k=Kw>fFQ~jzf+NU=k~zgOB}{nuzqK&=|8n};KI4Zhqsdm9-UW2a)8Vk zZ4i-;DQP5G-byg|ZV-+~%>%0CiE3fS97A-2f-C+3+kWolns0z*imK z0OET9<5xx86F4(ERE@7hdB~_#jX!5Bxwqaf5F!c$tlOUx_5KJXE((6V?@-0QoG+`3 zRLk!$=JTsDaHU^i{CUu20}ooAc-rm3>(Gk-Im@w*fh3ype&2d(MB-H&3OGpyPQqvMr zBPs&5vr6@1_Y=j9!px!0++EfPPdagRt5(h$qy1E?e4$9dn={zF5iG9WFD+)a@Ai+= z?ZHaxiHi`GjO@lwhEoWcu-lj}By>mcH&Y!H!U$RXrlO90jR+zlxQtLpn5g!NOG7hJ zN4B!luO$aepbV5bTrBd4u_o}eb1+rUGjy1yn>}c4Q(Pxm;Wiymk~aW(DV}}Uoy?v6 ztJ0yqcD5C7p6jrtvU1b*RcZ7etL%I;xLf8}z@#mgDdX3kk?1%(9M~{7yAiA~aX}{KM{7oZ5nDREQWP@UPYGfC}WKrqPML&wJ8w1D{}{l1_ejSY$f((aEtwu+0pZhOwOYWuO-5-oW3g44B7OsimXt6gRX%3nwM&P`8YP>|Bz4^eL$+#q zisfOl+gN2*RB)B#cg1A6FdEBQ@vnJs-Sbyi@lZbKl7viXFL0liu=EfIaNLD18b4GW zZcvLQA#?YJJ3s0HD)2-i3~6G}(??({$fHo^*LbkqoWtqWcjS(!CZhYpv?J#}s1|pw zpU^uc)CPjr53IL6#o8M~Z6fIU$UF2m7sxy3EYHFjHoM=tq7n`MQE)ARt9zpNFEfdU z1Op@gH)ir*DK2ucT5t&w!UFT9bg z^_YpcbQARv8t>c>lCr&mKLSbV@g?`7!z$>rs=TXXp8CTYP=; zO=PssFb1yyuM32`-eT(!cHy^DGp`VWXU9?m4Mx9J$CD^G z(2F{OFe+zsCPQzAoq$tkrB%KStrlH{B^v$cV5JI&Q4>j5kRg7?K&#c}tq+Qk9X?}> zZiLBPR5&w9s5?3>^Uza=1|#hTbEM@s23we^dE=jXPR3ic!S(OT1I>@)EaGzC(6lr# z1qnm7L3Uypem)Z|cB^8c>9Sg`jem`eEi_7`f7%}R#dy00-?kNntI|+vlo?K0%Lr^x z@O%8>>ox%XB0P8SXgQzDemj1KI8?!YMr&x^=$VyInSIeg)`<`j(cKrVc5Qd zb-EGtBBa9%T60cPMV@aXkz;;0G4BhQ>3Bu~M@C4FmgG!!F-)$|Cefr^lC&w}yul=U ze`5zBj4vr&2=VLVyb5&MmQ z6b3B*pw4Ac+5)yYnhW?7GB$@2AE!kL?uJvjduU99jTBaaO&wXo3qbBLMlP&0cc6Dl z4)G!daTk^MygXidByKx33mG?ysPAtcflh+wmO>WU*Ye;0bT*Za+P3lSF9QI9gMm@~ zO9OBM+F1xWIT?BWV*|WcWhLvs1ydgB$6HP_msVDOS<2PeGFVs^FMJn6Do~Vdc4DG@ zFmu-1U!D}>z*PDS@*jqVlo4vEgY-|~>~a?mMVjc}{5{37bDA{z9AkyHTIZKx2KEqhMCViS!4>w=6K?n)y1H=QvlYJFj_HI$sg*7J z?gZicb{}$6K8&7K;&`#1RPMZ45&GT|X4aegcFyD9uq2P_JjN{~^VR7!- z!7LRT7U3EMJ3{VA)ygMqpJ=93(DYt$zY8RA1yu+i)|g+Qm0XSSt7P7;FgeNPmV36$ z7Cla~Lext5^C{7>pdM{*t3Z8v_dE zi|0CVzv{BA!;+YpwihZ*{`~Tf7nlbjv0C$Az`*|Q+{*lKiTeL)aR2}F|7yY2DBIej z2qF1F)#`fd1L?GzALVS(=NxWWMnomq1qkQP3`0FEr70*^<+Uy9iR93r;j84Xo66g`ha!I+TIeOg8DKtcs}L6%@~9+A@n# zqDhkSs~ec&6TOUtC9ng(#tfnAT%1@nwuw@f2HxcXM^aoD9{fQ8Ax15eWEXS@JlTrATE?RM!cI6d@Al zdd4|pKj-q?G0Oh(2CAiYK>boLw;za@Rs5IxW5W&c&>klyxMrB>1N;7onTow|`Q~xy zE!?SLJ8|e?_EGg+oUey{V`N5H3N3fXv;|{;{h3Y@Y0ux^{kx7KL9lO=67C2ueF~$2aYHu#%zu0hyLu9wllvlTpn{u@dYhQeGiti)~Y2eE-z)eYrEL9CBfx$IU5CHWw2NHH5KW!{3X>cF{7?)h)g zoL>7O?Ir!J71_4=ed*ULxb_dFoXq4me@HTYXLaUx@6_Z^#Oi!GDAKhiq2y4|cVxjLG58VG|JSfg- zu?o5iqtka%a{1aHtwyEm-?Zt(clruiA~+_Wkk!gbvyl0S2&YqEu0E`$>$1h<+t~U2 zN{=7mxoY1 zz=!swqw8Lo#W-&^p#q8ybnRVxwl=qOI9q`R6=x_oss_GVZ}`{J@}wPTh>Qko<`6w> zwAsawhO*m_3q()BrtnhJca7Xtv#O?Z$pEl?3Lt0g2*f9Y#XCw+07)F2v+P@yiv{7mv5|%5Y-+Pb3!&klW~^zOuA!kNS`nl@C$YO zzqjJ;6Fr=uBg;Z<$uLp(BW+g2uZY<4PKazTh>DthuiTkrN#)8Ubit{fu_OXmJj8w? z2-S;dQ^TTOz?eijpfSm^e}|zWUKg_lk;#jpYmV))ibaF?hcg9p3Tus%C}T}6in@;( zg`bF&ppK~Yqq5lJX|&J2|0C^bIlpb%|E|sk|2Ngy|Als-i;)e`%j`dEYb*((eVE%1 zYl~vu1O-)*7>S)CYVLuHCX=T^yAy*P%O&t~bCXV8P~X*FL*|DFcjK9J(xB8WiCRx{ zHr#uiPyf8U-Ejo4(Y{%N^1|Qvk8b)T;1T&~y*$X~v^B&#G`>EhUe*eluy`tbWl3ai z&W(K>M>y;?SKyI0u5d3=>(JxIy)2T34ALZ^{@(H`jqA()Hj=Ql#4HzC#88BoW=VEo z(P)&T2?sqx?OdNob&(>KPSND8n|(f%nHIOLlm-0Gs2j;Y-T-J}g*J1#`g&^3qR!4l z%3Qme8^eu*e`EuySKYpi$odw^N_hU2r7mbn(-5?P^7Vsg+(y=3wKsCj-$Hv*3)~|E zUF@^JmTq@Z<8=uD|J+4H^%`7jLd z=T#5j>~ZJy!vq}33OS;+P8`xLzM2g&EIz6G=lg|>w7TGLKuDZ`drY9@$E*<(?y?_q z76Ez0j`cPT*UYOUAY@&N=u&e=7McEz!L*9Pb?Wm!Pfl=X0MK4ZMzeXZ2a}?{32LTnlr-+es!3}`$0m&z94FVO?3=bKK);Phc77Mj zlosbD@TpTC8OW8y6OTyQo7FOlb!REbVLp4K6^ZlS^-?MgO?qdZY9fhlf&4nG8ls(E zl$h@k_!62yot3VMyK<2m$Bm=l+~TN8UF)ej6-qfZ+SxZrlVC2b+1>=+|CKx==1?ZZ z!Sw8=-Q9T^gzy+Tr$QeXiNSTK6#7_)xl2TN^x}qu7ji4mDh{}hi*_;JK|Z#)oT?yX z`QGH5CtcBMi;}6!o$Dw(%y6cD<=hTChGqYF51bQ9y0QPg_;Mf?tqX<}dSr_D>KW!^JNQ@== zLZlmRsM)L_!C1Ji^rab4N~i~DA(Z0%&Od{PJ=hkAD|-s)7eu4S1E3^9md00{+>()H zEjtYh(&)37@v6*h(^$V$#IC@1#d5&o533QZz`OP_OY&5j$cN1$^IOPl2-Fs^W9BU* zPBB zQYUT8$f!@n4->DrnJJ3%!X0uR#pr8SA(ioRoH|mDgxNeZx3q*@*PQv78nQ7xcic&x zGQaEA)CCx!I!g`KSCk?jl}OF%o%PDO4BZADB`Rui3Crzhq2E`Wpl`C;@#q(@a1&~t zl%m^jCaR0KEyA6ADF?Rjv4OdyJ>ag>OzBN`4m?au<7VY9Sej7RnJ%j1Z8rE0%2x)Y z1CaUP_x*aTII)Lj+}R5`sH(Wk951Hp5HXHVmO?OD68gb-oY2^7DpN4!OcQ1kScvx0 z#|G!_N@1{aGtEnXexwCZ*$Ry&M&M~K-=#)mMef>(y&`TeIhrzHmb~Uh=m2(xpk8K& zBwjQ{Bp%`C?;;`;QlRpTltdhw7dKUvX?*SX;e5&uDzBuyzY-$+df#n?> zI0?-rnW3kk*C(RB!AK(C=P`qM=2DL!*`Ku!sbVtPab^kPS!wZ5w=T=Wz|pDT9`ec0 zLg)vqj$=A!+pUkwu2;q5_!E_x4z=1>P5-2!&?nB2tvK>FdH*UC%AP}j!M;*GElX`XHSY8$Kq65;U)Zfo;pr62y5 zr6C>1jwo+Zzq3d_(3K2==2|0xYUxL%2}#dOdNg}|L)@9>@+pp=hLpJH42A9CsciVs z!1GAXrr6~S%d(KcV7IxB9^%+4q6!3HQML^pyno!25MKq2C(4x=zK+DGtm+NJUSMyb zk+a)&=@BXf?Sq^0(*-T=>n}u@j{ua9v9M`{wxB$wD1*9igNPov4{EmSx`59S)OVhq zer@D1sW&gQu-8T0{GFd(EW|VbXe1~l?S2wKvJKe_r5C)#%O>s~&p9pO$%Reo6&fHh zA^CLh84|CGtOVb^H@}AG1yvOiA zhdFBlm;ZRrz74ze~S|x}ngagM(Ls6&Q9PDIP!|kdh6<>A-lI0NsWH&uBAp z?Dloe)M7~a1CY!3z7M$8FK6sr;DT~I5AC2_8ATiuB_t$c3npl23_h9R91$P^} zvkopIc=OeEu1b?#wML)wX(gvev$|iN2B5n5Ns~BaHS>PcYfS0HlOQnbs2^9!k5h*M zO3nKuMw@!NfIpESbh@f5pAZqwp2dKYepd;S0A!Qh6i6}NvTWGnBb@^T85f-v)=vFs%S3m#Gc+i7=-?Jt?K`T zfy=+(VDXRVGgk;z2FJV&0D}WFnwy2vJO~9(WUIt-C%Y5Jo(KqTRAJ7s-`DBK07oMX z2xIT_v2){QB8Q#3c-;7nXh z=>aFyT`952xs{`4q;3S$=>-%I%RLI?EA{M6txu*Se-W7g>yrQsE#l_~NOq95)y<4L zk)!qbyBpI9D21a_3PvA{%mYY}v!c{AZe7gDn}rjqWU}b3`%&R&W;h)eIcVD_J^OE* zGj>}Co6Ejd#9L_VEt!K#G+y7SvUa9Y6j<{Mg=yu(I!0xqkUM4=KMi3ZIl@uVA_+3C zjozLlv#2Veph)0j3iZLHBB3o+?eS?nHAgPcd-n}fj1KPLiXMMM@tU@<4ZaX~SC@4U z{o$ZC`e`M#*{i?T3X{&Q1zPgiZg1~tPB5j${w?{mC??1#nKh4; zL~E-JglA@eKBsx|mB7T+>kG(uM6@BQis!vV@)_BXLvl}dyXY%eN+S>cJC1}&!29T4 zLF^grwGm`vveLi;?E_A3d{vVAFz-nD9PYTd*&)N4?EeXe z6y-Jf4MB9iq^ZSpFe5rTWOWq5JE-FGFVMxR1xRv{Luj~@AYYQ0aN|hsG>#%FQr?AAPZo;S^of6vV9fZ%F+DD_tbd(a=>Zi|6_#i!-eG%fQ<)?QbDAC7q= z60zdo#egreD<4j4^B|T@%cHzk-7xA~BI01KXR#R99}71+WQKioGL2b0;h}@9Eoo-# zjFd>ocP#QX4>@&mA&dSRBL0#C%9=VMO;F7*<)G|Vfj$(ebEhU+-vGZA^F(&zV&LSP zYsO(vcYW5wT5t_xm-RUM2Zt4yKR6_R!Btiw!XyjsHY_!R-m*ydZw3$EfH6S}_szI8 z-ak`}30VpbCIV{fGZ08cp3atSa%$e!MW=xGo*Tv(z5A;_IlPcGmYntFu3dN{jHpvv zIWSi^n3_@WIbNRqi3!ssxvjJ1yx+E3Ls#%55X?F{{)!1LFhGvtS5lnu`(uJtJ6!iO z1F4+v*rmN3Ao2KeFe8k)Wd7m_`obT=dzKeaksg%3{v%GQ&Wn(3P>4usvc*nFN$G{r zV5JL_I9+5~WYy80(TYVFiOut~|Fmmrtc6!<`ws?P|DH3pb?`8AHZU=A`LE8{e&H_) z+MF&r7K`a>=TY;~J7FHdf?h1al}Q(nP}TO~BlZ(PFrfgB2{~_q1bf%o$Ur zi0WQ%ZhB3z_B^p`9U81zAQCGJw6quo-`s!Dn7 zD0!~g>g9WZUZBz#m;?CJcw_Fi1b7Ks>hwnVE_ZQ>sN3|39SoC9bDD4qY82bq$KRLF z9sUjrE#Gn49vBD+BIJLwqvr3h*t^*on>qi#^R;>^e}S?AECt@Gfs2Vo-p>h_Xe%Xv z!D=>Xd)C3T@B$m?=3E!nilaYA1@alLD2q7x--_@Z<|mRDx4XTcHeGJErfPQ# zdcSB6*&v97mxtS=j|Kt3udSgCmBf^X`4Fg$jW(Z;lYv6K&?e(LysCGSA_9b!fI{O? zq9$wD1w9Msk$rFYiB#V)97yNVU7n?T(6r8xK(SoOX?pDCTp~G#Em!L6gfqsF(74S> z=2I=Aw#^3k(Y+?L84R)$Gm)MXX019hg=0Od$a(XnCS4WI1%HK7D)Kw5iqyUP*3EKl z`ayfz=V?y%#8e{bso*ojfoM+l61oZ9wlkMKUHuw>?f6#d9Zav1D})@Zh>t#pY%sUfgsftvc#r z>S}ucff4*u0}!~FQYhXuS9gk%#*0F?uI6-FVBpo4@x*+&8U*fWrED=%=uO;6ttM@JQa8v}%bcpar{z($RcB5)^^V@RSU#n#lSuBlY*Mc=9)-+{7=EFCnrAy!I`8Hv z6x&OzX3G+5@Dc(`VB3iz!ku*a>@nAAtW33yvv@*pU~%1VAFmkyp@vBBrkNwsnQb{j z;oTaKUF5tskBX{msk+|GFKmYp%2`kX&1S@*Jj02<% zh{xa0X^%R=^ML~U8rX~m{)EN`j%BTQe)`(v0_N5m>v$-QutPUk_{tpGs&YdoMt`GPVgpO;8AzAd8ig)W@MW~BiQZA_ZS+kBei#OH*W2kEot zlPtg~*$v*L14_YI9Pz}9DN2L2tHMZL0(!w{^2be3>~|;rXfdw#e34?bFSHuM*f)ABT$dK!B*#jGwhBjjR*Ai{p1WL&=% zy>(tid|AvR-{c&BigqpvlbkE9WjwW)M<-zatPOo6!-S384~l zyT22@Jb3?}#QN0;dtImPRlA^157KVVjpkZ)v(Fo_(+AZilp0}_;w)MBBHFb-GBcE; zozaPj!6ILfa0$(zzfaF`OJpw@Ipl(%nx*o|vH`i=&xQ_^$XI7>b&5s5I zaIA1ef#;I6omo@j)YTD%Wx1LnF8HdRbkm7yR=fH$?HcongBKUtefr zh`_*hcF|*i3=;98u=fh-BiIFF@EgTEVnxlh3p|S0(-0QHNz$@w0|42rfm8a$CA|>! z)&j9Xx1Yt=#EN0^%1voN?r1ySr*8zC{RtpF!lu#$>K?PBilYaOOpolbr789uQb#PN zrHlSdTRV(=7>UXg;Hyw+0ada6cJRL2nMl-byhIw5EjX%sO6Ry*=_O@> zVab6GOd&Ut?|k%oP=~i9H3t-LG#|1rJ659%WqTSvK|6J!0=HDZhx9&#C8@Pz(|xGMV& z>+1Doq-Z&|Q0(E78LCj~$iPz(1mUj~8%p1|CMPCsZ!OM}W`)1XoW)Uhvp_~b7ShAJ z^iH=w=jQZ&`h9@ag<6L&(E>Fi75kjSQ;;37M+79vt|WlQcE8ezR>yl_foG|z`;0g4 zA@&dQ(g|zoskcAVZO%UY80#$N8D-PEOsZ1PT|37a*HooXbCU5$DBIV#=Y(C`f782W zn`#e9aFn#mR;!kBgV-xtoF^VqweB}EdRpVGH!pK+A2>}cS$*BW-rrQ?D`#24m|$Oq zYE*ZfA<)^p#)E1yl#WSvl0jffLKc3+o*>a-6z#-{;A~}9As^DYk89ASFjnB!JHD=I zJL-@%#wQxT1F%)x;OrV!5-nq&$4T&Sn)lgJ1IxXCcPhbd+fUz?KPC6_RJC|J(-h$- z3JD^u_(E`#5@So74!b4^Vpkdj>%IPDG1v|2Md^N5Az$=#GNc%ayNKKT1 zmwf*Hw{ML4C@=pb$|k}8twiHy|NpDy{!wNM3x?=^+toU)%A&8Ri$s*hqmF|Ns(n;6 znUksv`2D9bRF4Fe?sQf>ve93aB0l?d9J-dWj7aa+UvxeY&OI+g`7xvAytW^Fb6vI< z{NC?g;R1M%Frk*L=J1dcdoDotQV&XRJxGFxD-gMaFdD*@mz^RY{#W6nqZC3bV$whMfSkj2UF} zWyj_U0Sh!|#)J6MNtgXwT$@21ZypwPfkWqy65v%x3tqH6TwcMs>bNzh`Iy5){$2$F*)0rB2mi_V;zl4xl*;W zLHd`u=b8aln(G>7(oTdm<{=PfQ_ zUH%qdngEC%X@lBL0M&0+OS1m4HQMtNS_3N&9KsY)R-v2Ury7EJ*mw^6BdsESE&ROX z1NN|Q5T&-0{Di+@vMa=C%BFJS-YwX!NSU4JaFh+*{;Jun-Le&fbhRY_ESTq@%*F0@ zP0BBgpqU*%m5r_q_Klu|3MVHyLUTn^^XJKj`lS>UjBN?wA1ay~fWmN`87?Q4!GA{J z<&r_ZpZBd>%!_V%`}2daT!KBmElWqjnVTtntjXt)Tsb&`e0~HH-RSD2F2V@js!&17 z3y7X;g3REE&Ts~GA8FWI+N>QM%YiaNyhoXz=7Wf$EZh{a+-HOz!Oa-ok8BpT2YG}e zp4~8Q62ckbI$GE1UStL~I z$N#XdPOO9$D3X^De%dgkn0JANRX;)8)P8|>GdtHXLw z-m4yp1AKVTcD#mVyeZO|7Vu^QoF;YJ<2wCyYYEcX=D~0U-XFx|3e8EPy!;2+$4^66 z8PCjSj*WYYryM8>!%|t3Ey}{J#<`_Ig$mp^O~_wr1YiloBQT9tEX&_0GNNNt&-z(A zq}r(zl7~0LHHfE-2WKC6zP^NqF=_mQY2%W3(~T*XUlgQVfG;f)hX-=$tY%R%lno;R>-rc70(zt>V&=7yfBC;%(_Oyz1NFPgKZ+~vRRv%UesT# zzO$KFk#Su5~s(4+*@T*fcXZ)e;+Jpq)Xpw>-sB+ESN9uSYYr`zv2Q9+Wn{ zN$)^$e1_2ZjX?8AdU*6Ezwk$OF^F<$wuRFYk(Osu$)b4!r|FG=gud{NC~syBfxoda zd$J= zm<)2FGhB?CNG#G&Y0-|=>HAf24Z+lE^-!;I=ui+DoFDo=XF=jrAsWr^kzX_*7+j340BRY3RZIRWTIb-q6=y{A^PUxL$dRz;0 zz_IEb2XQ!J{Mw;+6d2q`bgFG^^6rA9{>VHO=oi3C_ZgbQ%%Dlr-XZF7QtXGFVM9Ib z8)T?*R?SPl#kMh-d3)I$VzpwFFbMUiyd9^G`(YZBO>}Wc%Ox?L1b2wxoS;iwo47J| zafonF?itl3w@q}D_&jEI&%btC;Sc)vUg1lFw!{=D5Ri7{|8Az_FMwpNT+N(~Z2z&B z=3N9|1LL>37Ir#(+-!g+8P$Q|{4}#SZVZ(2~nIJC`8qSWKu_+t&LCE^9rn@*BAcNbQ zSH5=&=lmu{<*PN^h}#o#!peH!*?u1siB+;IgWEDN=Ln%;b8FT`D^WXktcGErbf<n8%+Q@;OB?U$eL zJS}M&5;W5DFp@o&!dP`ygR;V2eO9E)N~f`UraIs_d}uf#XQ2zx`Ce*ElnCUbxvT+9 zVCoeSXQUGI!6cxk{s>k>%1S-sFU+S>t!nj^6{_Q58`rsbmz9AxO+*_YWFtoS$MtkJwBBsUvSWxXs;$_ zH?>w6USv{GmS8BN%=|;R4MCLZCg|t%Zq*$a@+9&k)bSSRN-AabjT>LIo*YQZZj6||J{&^ zaj1Z|Y&t;F7&z8}Kx38xU$dQ@qpE1a{n~a%d`OG)H4mM5D@Rfbd{%?lF)AiQVPn9F zwCTw?E86gfq_Ry(Qifx?$i@#DjbXBIDPX$ezPL8+-L^V)mUQCStmznwGuVBHU61St z8=5B$1L;&0Ar}T(1{FkB)X(fOS-IB&&izn8?HSo=WcCIF(is4H)D3?inA)%GfbJvw z`MSOMVDtq>qBh8FHD2>hVZ_j-YlW>SDn>ekAn}xB=8@|bK`~R zxMaXKUQhE?Ecx6PY+fb;17kinag;hVQAxX!ilng-bjheeX2QPN}pjb(=mYmfe-iP1UjmyVuN- z>H;^gh*ct55kbhW{)bjajx(ocd;Kg2-{X+7FE4P&iNE6)ri4293NpiI+V)GfJn&=7 z(G9;B>?>+t)h4p-&fdGWsfhg0Fx@X>p0^?=0QoxmM7 zcm{nPXsq2EeH+*+!hdw;>(hs05Qg!f{pPrkmbzkl#Ei=p-dyRG{Jh%dUn_!i}l4@)d?YpFa$!X^Mge#XYFSO23=yXn~o9IqOQ06${=9eq@cA zH)i~hx_edE5J1Nf;Q)(C4>&C`L%OepbwsT`?Wb~P9C}*djByE9zK5AWRORlqMTRq5KpUoWRQulHb^Sv>d%O13ut1b_1> z9n+jWXk-tou6LBc+`z2=CEgFJMp$q1BfORl*+2&HWz#@;bHE|~n@_8IeVPRgSxhBH z?j!nnkDw4ylq=y9lq%&fkLa*0e&Oct!MoR2HvlZ2hSfD9j)qmXS(Lr1hY>+Ux_bGJ zvd5={{8sUEtKa6A;^BFhNXkax{mykDrBiUjE+24Q@{DM!;hba;W)@Uja;O%Rd>4TT zXv#dncHl*eohT?BHj^fYn*9MLWY}CPhNRL~R=3mmPeYjXt@U(KzVi*wDEnhs=5sxn zG~PHGJa8Jmko8^bgPw&pzBP-xZs0WAS|z6T8HqfEyiqg9DYA2=`9GZy_k74*8N138 zjJ7VOgRLtV&DZP8Z$pIl6xO8^=K9N3GFS% ziBSPj_0A+=)0%DdbZuk)c%Hd$XD>B2t5er~g5QhJdTeHi5fsdwJ~ND50%wJW{*mxU5+cKafDrwwtnOjuYGNsD>tJH@pLRrD zM+IF1{kNAxBP~g$8Z!Eqh_bPYEE;lX@*rd>WYyasrGvVSzA@&;=}F?kJ4_S$<6H`# zNjQgc%@W0-3f0{Ec!T(ljPzOyEKN<(sKUn$sG8H48_|kyB~UV-o9ZG+6xA)-+KgGZ(JJPq4vNzsxMA0zm!0Fd z7vpneGo6vDw2&lOe+CGKQs~vXFkeWnu-VDvw}?8QCEq8gFEDopgSo}nz+Cf_A)nVR zxOVr9Hkmru`$%$s8BqlC+!6AanabnDmiNGA5jiZnLbRl4UiBJ#mCrpz=inCkPf31% zAX-WWyERd+38o5eAr_}5Ys?k=MXgy4vru2{WaZf-uBtzcgVV}DQ`fjy!(ITUPu>G4e$PN)2TT*R3?;Tf5BtLPhK9f zRz(lS)YNcffC~|oQ{V<#pbeDf%8Z00OnRD=uj#Fph*!BNqX=u%KuUa3vcpcGMfuSp zTUz|XeWZM|ji)x3sVc#=_auE8Iwf@c(>@4q0s&4nExhRj7*=wxER+;hlI1MBgR%9r z!9_vVDVuVFAojZX-S*Tn2D>~jD>K)=5_{fu+^tP{k$8>?X$P>Mi< zspNo9cfnC_^m|*u0lB@Be{&?VB_JW>ysi2h`1(3}ArCkIpdLcrMOzpHtIv1`p#I~o zp;|shQ0u~dC9X%m{Y83kg&VO*Wz^S4#2M-Q1#{=@g-{^AY1vdLeM6uysie2e`>Ozq zt=>W5tyc{%LHxm5^xpV%wCW>CU6JGf4L-dT9eQM+xB%{gy!$i86(rtLb$Q(?pJ|7o zN{Wht6QrJ6sadHv=T0PL??VdH&vqY(26#F)&+lv{D;qdrGz@ z;-a2|x09t)*oG)Z2T%9piWKw4dE<(ws?uMV`pC{xRA&^TZiwuVN4?%lA)ys<>q}lj0pwsn~J`^KrPMSHn<=@ za?T9tlFC3H;0$a?Cdot`VDHuDD@muf1u*5VkA0KzrpN0%d2j?%nh?LkY$k4UojoBE z^@f^_{$;vLU9!EGw(n$}P)pTR7;_4iUOeqL%}v{be#7z_1|Zy%=i#R8AJG|G7vNP< z7tb?XFzj-U?M+o}3e>XA6?;4r?Gl&kZ&~Nv&;j=o>egPFHn9;@+R9qxiP9!>U5`NRrcav15HDQ1t zFN56J&d7|KKd9`$1B*sYZOSq*6kCf=SdX7-@`rG87-iA9Wn-i>qT8L<{&?8y1hXQF z!Da4^>`Wy(Jk)K1z!P$S^WbRUxHs0^=RdhLJsLgN-+ydA1Ngu0lu$LZbF?*bH52(O zmMfdNIM}+IIsc>Z8}rv_vk*Gpmks(Vn*BGJi7>$uxR51LgQ~kwLF0yg$@&Nf+cZ!p z4~sF^_0!&YifHn;>p14^oMkZO3Zzb!=jrZ~>~@dq8H2ytBt|o#uv`d_@A`&=qQsC8 zQ*~8!d0p!#75(Uo85yv}D~*Et*A(Bg_q1tAckEB(YCMw6#dE)@TP3og(!q9~xK8rS z8G{6WDofXJG!!rGAHp1bnexm%eb$vIpXXgadUZ<0wij^+$e0n-q!F%Q>uxn;KULf* z%}W*1CWI+%SrQ@HUAY{c~jrn|jdn=K<`d8t~}zl4S6Z>Y?%&MPbUb^hXkd(jq%C+Of$quESV< znsdHuD@h6{gPCGyUTzGJ-OX%iC<3o=#t5)Of`wK1Yf5?*O;eO*2~^zt1k9?1_vJ#b zZ4Oh-{LT%eA=rviw0Hm>x*927W;bee|2bB)kJqtJ@Pqq=7LU+b*c6q#gm*Yv(--|D zi?HHFx_h(+UEz)h9dsE^zF1=qJP%s&fX?)W!Y{H1gawBtXs)cXqvNG#O<1|;TxbP(A65edkCkkcDxdJqc3t(JB_Ri_7e#C-TnP+=&K zMIl7zG*kBM1BSb`va`tEB6f^^3-%nBz*cEu2$W9v@8?ObHF`rqr-=w$cDX*g3jDHt zo_zoO{ToUUbOs+^upaKjaeE{{~WD z`7TGx@20O`4oc*uf1qwHTC>e;uO(Co_|whc?F~}I!oWU~hz(sGLd0V&&6u`g3Yu-) z0xZ#V!YC9dx{ zcw1Rmf1=`AAZl<)BEjH{?-4}LP!wpI%P>r}50}RJzNIGpD|Ip((IbWQ7IYnEdGf|C z9imJ>b|_bm7C+{B0%PLRUK&Py*)PRJBMq|UTkY(3OwFORco}$!jeV24tUB!2W{DrW zRl^jJIT4J?7)<+kxk#<1wT6oAoFRjl*KIE-X28Y^CfF(LP|5eeS_6#hDcbNzLgG(t zF$@A~EDt90z1*mGfT7XmFgUp$FKe!R(*x^=vMOUEeK--Cji0cWjf}78(STPqe|anJNchu3H?;XCCU^XP5xb*tfyZ zHtoiXr#18QwUL=I``1@^Z*5jd?mN+MI;Qg}_`iZmVox-*)xtg+?uLqv5D< zC|AJeNFB_v@-+;``V&qKhFK;9J*<}5=?-~V%n=5M&FT=#ZHY!gJFgBV;ESH{w8%QL zkZLT95EchetJkk3LKMrNfe#)Y>MZ3nKduI3ouEK1!Mr2B{$P@N^=thb4emnyEl%wG zDLEu3u-2&N`hZhN{rDEDSQ3%;XIsH@TGFv}1YppqG%kzzS%lx#!2*UeKBf&GxKe)TsKnCYPgevjU zUn1Wc02=Cx@Y2mh8>>^6XdcKqQ-Csb2A?Ruz>+pB6{N6>7m=|6B># z`s01+Qdk|Z=ZBSpi5f9lzz1dZsOvW_SVQ@DrvgY{y-pwU`{yn^TAK)NR4}-eaSLbANV7OQo|UV=eW7!bnI`|0zIK#DTEgU@3R&<5AJy7nHl_zK z(d^)ZhV*`KWatnFM#7rhgz;TPc`(!O48(|)k0^1akH8O}+pVUx!Mm)mcy8FVhMK2u zD<$krNZL!Db1#w+4tCLyXoQX&2_gHT(rHky;KQXgwBPQxh+K&e+*n!3>(K#3?=%Ry zhAKH*5P;48KE}Ycow;s@T<9HLxyzfhaz4*i8r7%*XAy_w5z)b>Bq-Q0RN(ut(;u_^ zvSUueM)^vW$q3|OwWrelDejs{HeHkh35s?Ex|$~Hn`X(5@)S>T4v*l7nu9WsD;z_+YjLvs}KVciufthGc;U8PrxW3 zF+``2IQ5j`Hu(kqO!;R!%sLBi{ucR~sx!|s+~2Vq^A z+_PPjJK3o07Lf78eLi6fzao6~a9kPWL(1aE-+WdY_=2QENC?vvj+#*_w1bRL z@+wMR$I7cvT=K2a33cPguJ27W@y0TBGkH`MI~Yw4iziW5gle!k50)hitt&&yFG==T za9oZ`!f46~T9`JInm+kok=84jnh4r4I1v+ez7r>@-1UWwcu!;a)(JU^*(&WpML&=W$XamMTI4Ik4{aCk6C%99L#6^T13NJ#YqyZ;GCk z=o!Xg%7I5#rFXRLo+}?P0AD*{u0yb2plcqtD#_!sOzRR<*p6Q=Q zSZr;#FPYrwCmw;_?_+tMn;k*m2e6nKZdpoW&ntV)Z-;n8C(}sD^0|IOuQbPgOlXuQ zvCjmwcfC5Iq^Yl+{Y+_Y>WXxQe?B#4#VHnb8SX0{nl6odn=z8Qy&6^O)W===J{quM5TOfD9tyCG0_W4#be-N zcfH*N4A+m>58q`5HpHYR3$uwZ#EMPU{Vcc3inVFYta<$%y%_6eyAHpx9Ew_aQf^al z?pG|jh0&cgD@`G^K+|t*M~|5`^0aFOrz`~o;yfi za7dxxhpn&Dg>1wPER%6);tRKK+(MnZ?Ij7fBHkvjB!sN1em`vSP!ZO%qDW;aVG#Cma3qiGM73rmZNapeYYUpIG`X-MuAT zdIHoc<)>3d_Kc~JiDn=1)d{K=?l=Xd2@XxM+SmgkM6rb(xceJHC{ZMdWicOaAuAX~ zHSf?OM=?#0^fPN9C?=?XX^Stlf9Ak0j#vOf5F;fdn32{2v#0a8i|0QLhi#>bj+DcJ zfI#8=>+MVbAVJL5%+Ac-^&cfA7+2LLoZr`zeWXcPk^|)AfpySQ1;_V#IzOI2d;NPK?kN-m;PPSp;f+A;r-g0U%@5#&Hc^E^S|=PEFMX8E zTSITje7Hhtcb|}ZB5TJTB@nNNRzyhKX~H{?I#t}=$1e#pd_~N6;Eg!05%%~u^QMgA zF8Pp$g0%pYA>{x~=+2-Qb<7?*i5--LIPf`w0r>aZP9a`uin#Gv5}vq|T^L@fLH)Ih z6fFbfUqq_ARBLM#gA2@;X?r+0JrskDLcCZ*56pbu2A_jp0tZ%~ETt8SG0a8Tzq@wR zWp)TFsEsC4b$2K^*u+UJc**HHkc=CLW{239J{}+4nO?$%Iz3Hrv18m5r%AMmR`Se? zcX1o1JDXgti4RCJsNJTeR;xi*NwQzS9*~F&*IroK%&WxAm2!H(5|3-L_ONF%n_k&M z&R0XO#m0;nd+`vZCL<1NCaoG5C&IwxK|?RuqG^+4Fa`sN!oQ-LN9F35XVoVgUD3$W z(lrK-6h)+-16?O1n~<&P&*+i(s^OsUeCsImDq|B#lh&)xvA6#cFMz~lLi29`%)8YK?!<8n?{!9 zax0ZAO*5xMC3|b4m0KobB_0=a^st#JmZYXT9WP|Ys3J`w0ctAxRHYV^#{MGcjh2ym z(y8Twijos8Ll`7IgA82mdV@(MuE}bjNa@KkRY~)x95_rDLG^PzHA|96;7#kuLqg)IM$0XviBvpd59=y#sp5P~=A?yAJPzh5 zxzGUtx`)3)dg%Cm`U$o`3qnVmhOHU04qM4U23pO?RwCQUbV8xBoZwI`JQW6wxRG+3 zS`lpYXCGv*SB_VAY}+okUcfZmSMUsTTgr;X07j(Bh}IG!&rWcR10rxL)FRl}XotCQ zr$TU>RhI}-$f{tH~c$UKNU7lhtEFNC}i zuh2qSnOdfnv&kIMOiflF$TZ6rvh7(%9Cj;!3Xn20h_h;s?t?nKm8~n-zy^RN!#X5r zlY*EUW>&7+v@mh~7VG-!_-Jy>e1Wd6sWV{}H3n~rOr1Ca^Tz50!S4qt0UL~^CWVW% zc9FRhu@-auIxc&W*q|`2F+4&LwptHxXYUzyAr8$3w?LSSSJo>_%3+z8F9^;Ab3>m8m>J4!QQn$e2k%Kf3n)*HFQbo5Ix&Sig) zIo70l>geMOYZeGih#ZJ!1nzaVh0?1dzd8iEb$zByC>*jAwgzXkZv{p01tgM2-c-s1 z+o5Au7M?_x*2#92tNk0CPliSoug0(IB`@7mT{)K(ih&=`1OCVd&m?vFrN6KjNFMy6 zV;l*1!?Wvr-s3R{lbx7L0*<)DF=Yb+g>_>ysv3_h8xQ4MJb9eq65^s9>mgeDA^fSV zhHO+O-s88z6iKr+mcp|8O3C&L`7MJ7Mzl;dh~cQ1ndv~up421+F-M9}@`w-qh_ooT zuJU35?m~4QcWM+l#6439i`Pq$ngMz6FM7}~oh;F-XH3QsHbV&XJFkd4x)qG}E0nS| zkBsAP8FfrNvi9W7nl^y}JOOt+1>>}vVO{ncU)ocl2uINUTVs5(eFom+Z$w%h6t`t@ z!E9xTo+@D40`)r*yg8U8?1ivf_h~ne@20_^q9*Ch$|9(JNIA>a36?5!Rk_@;(K+)+ z!0{Q|TW}~SUApM`v^Yjy(tcM>G#{Soa%p=BvG%B`=oQu*SZ%oOeFKy zkEYUNLi2}8DHu7&A&5YKH28q293};tawKfZkUpc06KWp{X&(}0$I>GuiqWI;|9^CS zQ;;sqmSvr?ZQHi(s;_L@w$C|b+qP}nwr$&-zk9kT=Jwo)$d}BBe97Dqd#$Y%h)epy z<%x`Sp4HEvc_^5s(+Z=>Y`QJ0tMA|>0G-o7bTm=oKoIWZfj{(o$I9haHzmYAA`x1Z zf$yD&?;Yvk%@`qYPE&_ro}2Re&ZigAsuv+>o*R+%YU4E9E!h~4iKE+iK-Y-oo4Ose z#J+0@nyIcg7hxdg$spa%XfI%<(QD4#TcXiR^K6(*aDkhz6Je2#2$wwN*@#=4^O{4{ zZLVpZGXP7?0|9Zmf`O?SqT#7;lI9bZ_CtMe$tM49=i<6{dP>}&b}jXeT}hS3=FK3@ z46}7HV9ow>H+G_PP0kjEPSq3o+g3$!QST^U$Fzxd zXhT&}Llx#;?kHtcHF43ubH#1k?I)fX;{l(B=}Qd6;er|~&iTBuOM1gTX}<-Jzx-Bu zPcG9+KWk!Gq$gQ=israbcCF<@p&Mmw6OzUS&sRPaA=juRYjY;xPT6uJuW}RWhbxkR zhhl<^2Q5W6I%#k^z)mYd3U|jG9p5n0r+4!smi#Sr>D1WmoTTs#1?MtHv-+q1^M~f^ zn*)3AhW7c#0PmH;dbLNR ze4Zvl#SX`0TVwsI_uKw5)qkVbQrQ8=)sS4lM8aw^8UuV%e3&PhJ}p@m9*9tH z`COm{Ef$6+Oy_R+Gboq2-!9j+FT)srL5nly!H<@Z6S07lT20=brUFtgI^r?imG8bPA}+5dF`fR zA4Lxa9vWffOm0%@Za1 zmou!bUV)}p#X@j<(>h+&u0}NDstazsx68qlM3=nyYdB_KQxs;!tSi#h^OF$y@d_O+s^;8z`igGzh{`<(}%HZO7SI0mDZ&x`+OTEc1o@E{8T1O$Tm z@2e008|%v(S(zID7u0W3({#XHLgS;GvhWh8W2h(PX@&*CWWgRoPNj_o;2Md+hX;a6 zVrC4+E|-$6XP@DFc?F^p2HM01Rw8CbZ9(|}nU=@O4x!y+DEW}R$x%zG#+QE{Qe3E0 zpLAbqvRXyi2p3yjd;5OSpLDx#`+hzD_PZzlBh;DL4+Jg6=^%zGwn@`3lSfcQI@CqX zi&Pz&4=M212^faTB{%ng9}7c__UzRK`sLsk9>Vy8xf0`TY~Z^MFv7)aX7tR(t3T8!SY1W04t1!=ZIK3sykVBuI6T49nPO1p21+Sfg&b;}azRxq) zwxiF@=BGAzS$2mBuFlXsd41~MDPJeGuG7+)Tpn=Jn!)lgB0H0OqJZ^qQzwHx|J3VL ztq#J*5bLq}QxgD#nZ@8udvzLb9Bb=q{xF{S+-=fxjKXp*R?2=N#<5{F%*)MtEqeGaD( zeNU0bJ*hNy{|U8{MtSmpeQkH`&VrS$uiZatG}jx-2KI(J=pOd2p^a2#5bDLvL&Edi+sL6FZ3)#q96lsijM2(`7kphA{Nf zewCWaWjt~(oi~?EdLhoC;mU!ryY9E@(4o!Vt08@+1$S!4myJTrUtMFHmDdw;&yM6 zlEaO`$wJ}TjbekQ$|{>`JIv+_-7>iH2Wg<$Y`2-?qn9(z6SgH9&tt&ENmFVL`UZ=C zT?B!_Bbi{UX0Tt8{A_kf^;jLGd$SV-H;65UtlQr7oDi(-(3Y@sv}J2l^sU@Y9w_vu zj1+ZEK+;N$@w#L}uqP{Mbyj>%-n+yHzC#yrnsszTGtEm*n5(T2rN_24kuC9EDljO^`nfLH>((^aO=ok-fMoS}Xt}0g1K9g~F zDJ*d5oc0L?@TJ)FFrq&O?!4HZ1rr8j-uz5u?!$jS^ER$X%)y%{8= z3#_v~c(LV}9Cy%DJ)Ebv7=cQx#0Glm+YyFg3B^~vY7{z`&#i^KbW_c9&7ImvaL0&q zUqnp@L7I;@@Qr>V&@`SAQriuS zt_qTS`mwTgpta03_>T}~Q^|&SOe;{7j*QN7)P4cGsUUTQjJ-gGXQ5eiaE?{yx`TCy z{njL%pO|5reMh1{EO2eaukgqHXTb=KU%KJT|e%#ry6}$d}`}8vEIH0oWoNdv@fSH$^-ut zZFDA2SNw~1zlwoos^K&?KYm7?)vHvBGDD-v_*yLfo})9$FGB7!dh7b775TS;)bGRj zudp1H-)6%-i%-!YOLFc&TyBhjDKpiQh1I7MVl5YMTeJZ5ua!}Bz8G&|bB01`_6>Ra zvw7Tv`BJXpLUm_Z$(G~N27PmDEdSsyj^>)4hRWZyET0LpKS8kHx+AeRY}UywQ$iL@ zfbOLw;T*NP`ya4>E&6&UtHZs92LiIg0RkfUx8B&p<^L}E(tz<$F;DaRnM|{WCxQaS zGy|r>kRpfrWwO8yY9VH!}PHN%4VMkM?qOIGME=W~nQLZKi z^9!s_SG&BbLRi#oMvQbmvBZB4Mm(!}tEM=V#~XtNTXa;S)!{8`PjE z9YYWXAFelM#N_b~$gZDCKq4phIN?|1{v8m1ki7RD7S~fCMh;vqVu{ad=3~ywUgM*F z>=c9aLm`5Bp}@sJ>f?zI=gmM$;Co6@8(|>B``AgoY!C4inPoTilydz?BkOOfsTGqe zEUwCx?5F*D0-D=QR{fMNd&!4RRtC^pz-LlqH<>gqNrC;ul)35SO8s;G>}zynH(mS} z0BC3E#pE$QvYVlRVDuW{XgH?OQ!`y1`p&qMxFARJL7BntcxcD#&Y3~)X&*!HllhPS z-iqF5*6dFd#_t-1&Nf?Z^OfvlIsl$`IyZNEJ1VrDtr}(H3P+QjZMPKBVmpJartjRN z5REQ|Oi@+4oHbiC;_qpmg)VXW zWz|MDU?idIqTKCP%ej0+DRm25Uh4|PcT26EWj$+G+R~aD9dH?1e8B9E9(DQcA^u!E zrG9itxMEN5yLj}r?05#-6 zop!h1!fH~JWE)McJjQ9-LzHx_oT{zKme451>)DkQR&?;rT_x5P{-K<9$OjLs>$rJ85!vH@?V=DLG}sHlRZC~+m~cF3|bF5 zZ{Zr2buF!OQeVuE`7(Y-@o+#S`0aRhSJIMT{OqDLLKJ2M_exfiKc=n4Fw0x|8@4eN zMZxTQaK*i3%cYE;(0P^vyX~}G_lP-Ja($Y8Bv#W18JKWw`^jlmOsln zrpovY_f?%`+0>J$KzAC!(=A4p(_jU-bW)YsGWW~cldIb9g$_-W<6|=B&rS`8C5qtx zTFxIQ5rD&4LmniRd3O%So=&qeB_~6(c#8G$QGz@pyR_pzv$!f;q^DUuG?L*wl3q>} zH}i0fC)CDwt$iu^U_G!baoMluKO?t4P-kSA^X?nATKJmD*oBvXGq*)HHs1dze|~PM z+4EYerwjAh$&rD-Tc`*;;SgZRR9`gC``($b&QDg_pM1soT0}_&nIj)K6iaE)! z7rQiGSfB8@z&&oA(I5#8FX9IP{S*>uD zGMvKjtb#u}!SJ>s@o=S^6AaL$mqs?{MTiEj(uZi!gtZ;o6?(yf?KwLDidKdxoH~lt z4Ra>vU^pL5Nd3`oW6=8ZHiyzObMUwzNR)ihuO(k;c~K5!%D5!^cTELqFz)U_GuF7+ z8=BY>@z-on-458F`;Wb*&>5+EIGn(*nO=*_9cX&g+)mO4C+FDjC{{(hyqgG6^FMFI zCl!g#G`x<$UONJxxj?nnyn~Ut|MXWoGs>7p<%L#8NSilciQJu?FDSEaiqLyAg)~}A zdJ2apMWd1@AL1?~8~_T=l)F4TM-=9z^@>Pt6Q{Z83ijJd6iz~wuBfwlg4>8?(&%KY zT^(~1U@S%V-URdTG-SGtD;D{|IND4xRh&-6t`=6!N$ zQnQHf9;}JsjBh?$+`ZpIejYu8wc#v-j(blR_%p)f2wE0iz*aLqXAh|&9ndBx=In~C zXwpW>p053EvuOw%1|Z4d(AN8An`C>`vmgKs(D{-kp44!ConX!>+M_vLW)L8x*J zRBOe!>G$2_8(;e1^6F`x0M|ai9gLoj#%l}-6DVLqi1kLIA~+ls%MOvO5GncNx84%) zOdX36VchfLI3ka2TrIwCtf@U^%B$xLK2dhFA-BJmUQ%a-iLl5Ugm%?ruD}JHpo<1) z%sTFaX;}~l9j0f&owA}bgez34DJ=u z9DxbOH*pn9h$|XNeWVT=!59v|uZdGCLm-@-S3J@;^Otw{^E>GLD`^+AG=fjK+cztL zP)=XSo#ysCF8;`f1Gf1qN3m^B#&SE(L|ndW7q6mZMKjV&N7~8uSX>4wN4yb^@1kg; zna6Z4szhkOulE5N{E$!(q36_tK42w+d3@Sf^TMk%f6N=Sc@e-mOT{UcD;r-!`f%rY zVfkFP;*tGvTDf6SqxmwX_YjAUJ71oVj#;K~P~>TLcGFOU9P)%$b2Fy{a<(_Dsr=Bb z-AK&-Q09Sf^Z_|UFC{Pz&JHtYDiV*BTNOB&CiY zb9B$nH8$<^YT&l@{HyQJ@b0F;pK`0wH&1)ihC^9h5rfBZ7SnIT*Y41!M2^xj9>KSQ z<~a_%QIIi65ro#kHTAR563F-(B+{8#z8PfF6sY(b6w)0+$!rN0yZT%-r2@`bT!*V)`j-I5=sk1%d@zKY6Rs0|BX?NMJ!u11k8FdnseWM*~hr z5>?O!Rm@H0*0ySGz^YLlE_OKqrj!2h1L*T??iaYtnWlD<6={W)r3 zg~9gJU=+)RQ!B=q^y!3yv?9e-|3+C+*(pxc%BUK}lncjW;waECl@hm#R84pJJ=fyN zi@0-%JD^Ct%uX5w25^yljthy+6k`l+LI+U=?l1nBu%akGJ=Vf0N598&%ZF`}EL;1TP zd0`22e%lY0#%8A)0Rsa6uK?}!v0v(%oKj7%(c`#`XCETbWA1hzrwM6=oY$pU;39mb z0*_)*d#&_UzIaxv_*U|RTHn~+|zMJwQej*i&VN;CwjhN_Aofcm2Mw?&N`9v7@beNW~adgB#*UrDV6m#~m z97pWp&hG~kCJ_@W2^@Fp_hbecvjbKP(&v(DI-{msuh?{8qHeXOxLDzg{jOd+)n=|9 zP})y9ioGbzDp-Fd4gs_E^0J0vvx)M-7wC1#Tp-q&IvrLSVtM4qMOLK6ZP$PlW{VyC ziYDFQ4MpHwe>`RUrKTzn1*oLCOqZxl-FhO?=(S_f=e)GT6#BD8AfGZzlC0!@Y+9ho zRZ(RWhIQyC=*Q>8DGp^F*F=hY-gasi6KJK|lrn8Bb2S*yAX%Hc4HLsHJ#;gpTpK87 zwNNN?OEe-y=5r_s>k(QXv6Xmb9;ydw6JpyB#gTs1J|_}=lB`FfPlt;fq-!S9aXlsHvKQ*8dpVt{DvT+uMB@CCq3wS zY`jt~T}U8EH^$&!Nl7G2Z%E<&R!4Mq6mtwLi1P0uJ*_fiWXVq;KUAYmO;GB-_>-yb zEKhs4m+S9$^j>y$UDR4Vad;ef{`SBNcz&+e$yfp@HUk5^U?+W1CD$TkShR!|S6(a{ zaEa2sL;Q=;zV9{>)`!r73MADQ8w+7#qDK~c)d}b9>B0~9PXW;&7{ldfpPYzjqRAvyGS-m zq7vVe`E5p(rgBnZYh!SfS;^D6gP5pG*k2FY!33~3swJR)v)bS>WfBjR_EBnIVU_e07(Eq-Z{XhQ{ zVD2R5fl^$5K7TcO0<;PK*`nF zsbH-ptBR)r-?K(}*Yyy$%=_82XnxdG?u8J3?gfFo8UAMhhxZP5ko;je_v1{y7oY71 z9(Viu)3KZ1K&QRxLWKi}oJhlva?)&axZhFbjS=jXor!6Diok zMm`osZr2^D%(GBMsWSiU?$*_9n{cN|Qg|25Qy|vkmh6&3qa+KiW~NG_vm95dqORi0 zWO1BKPIp?G^MvS9n47;eb(bRFdiSxFW!l0enhn!Y*hZg}%_#>(rV%h@W$L6Puu2aNOF&=U1m4Ter& zEF|J=(20{w8v<@wd9D9e74&FTaAH=|my0?{tH)ywY@!Ci6N3H{(h1*X=8xKiu68mg zI6%@FFjsOSYaq)=oQ$g!tH+Cvs(;Dy@qgv@zi1^&BZ4b}?2etVZXKIHk`hPjS6qlX z4*RX5W$#FQH5Z93q>|fAf(=+t6COK8tqiL!4U8I~bWMT$ZiT6V)0 zF3!|!q>&CGVKkA@7q5k>gWMhvYQsge_@0@&jTHzgsVwuwXS^n}U(35qxsDUQ z%|0NFN~FJ-j_)s|QVKkbU5=+u(30ek;*r!(5SMa4aTKUlXCQQN!WS5M%BAonSYeZY zC$A3SJ#*7R@Saa`In0o0B>9PO7U*|?l-3+vF{^>X!M&Ohb^k$3!^%G;j&qa{oj0|DC z#n>J(#zkY3gu?ssCqd6(3T)A|MHqQZ1=*a)^!ps!8FNo-gEp+oUNgQOBQg@G!i}{s zX|jvf@XgsSy$j|4)%IZuxh&&?u25s2J4+j+PG$2BpWf|=-;un9U0PYA*I!J=s-$Aw zB}HW_`v7h6ZWeS#-D0i)<3P~cdS1M-0p-Y97@Y)QH5#`=Nx&p2OniLLUo2@)o;P&U z1<31(9CdTQCC4qM#+(Av;H%7M2QQZg+(?&xt3U_9K(ZtVkkt zgr}6UqaHmaQni2mAF`dzpGQ<+;6OlVaQ~lVvXh~mvzfh^_WpT$ndt$#?33re9Ij)&?EixaKIE_&LInHa z2u#8(?i=eU>y!C-z?OM`;F^g(fQ3~~aDejmDlV*&$naVMRhQ9r6=~TZ zeT0Z8(`;gpcTtES%P+5T6>my4TcvvvLFUD~a|Em|!c{R~;VeuFxzb9@JdsBt8pBNFJB-d zlh@Io$<9cp7+RP~s5H?=eOFD08I_QTpWLm#imMveTlTWM8pq3QYqF&;LXszO z7Y5?dY}K-So8jG%*(ut&oVm1l1@+Nuv#9deIZYLCL%FUotuIGvLTQHwi&JTj21jU3 z8+9G}*Eq`&jv&{XbP^qO28K&bT`NSj=COo@P{|MkJOu%}vuH&dk3m7Pc>-UJg+T!V z>w}>YEY$`V@kCg;5#`g7u4?Je^Qk$0yaTbph&s!5r9jaZ3xxXgcu5ZE!0ZqFBO{=< z`^cb@CVKG{tEkLm`Z_%1hd-d{55gl6P<=vWp!xep8kGrap!tzx&?{RHJ8b|cLM~zTWR|sd8 zF^g84VWhfi1d}hMIm)wJQ$dxSKs*-St^@U|B>jZV=q?sgjbf})TgX{AE`A0T+8+mr zz2!8rD#lHAwPI%n0S{qGU_N}Wkf~^0bP;5vJ<90vipxyG4fGlYFR`t=$WT+5=H3jk zeV^Nzwp|(icw%Y;L6v+Oo7N)>xV%Fx({}t-I-hk?BA<2g&X2bOfsCZA@!?Lo4&^xL zglvJ=y-SGQAnqaucpiSP&o_Im_++>-O7%FVr+wIu`Ov-=#4SW!Ip{fVl`1^Xq#?-Y zy6{66zwDGgZfUt1Y1cN@#iy$j25uaR6y|ZdVUJOGmk&2K%E>?9%NnmcDi#$z{ z(f1N&FUy{2`x*AY;UT5tZaKy?WUOS+>%?cRGi1PYiB8AO+SK5S5G|hBmy?&hFcgo5 zZ?Ar?w}L-$%0B{OvK@?}FYF4$TS-hlu<@vCzY%O&TOx-HyV3ssdgmWKIYvBZob-^- z#Ul|lN$g2T-9=gIrJ8*B>-Edr<0R^?JN%Y;{`3aa@3=w5AmvYvx3C911LB^djR=dD zf^-;lqf&(|ogc0sPUmWjhzAk_QWGH^K54z(`IBiWj>4%>M!;Q_4ZU4nK!?ZC9y#|} z8w^8&_V^oQ`{)T;ay5u0k9#<-en&)loZuBO`?JY?y(MQ>LY~g2_W;)8M!(GNOAz(B z(kd^mm5UN#b1*eLq?|E3LbgH`MGzg84ccu8@CGQ^Y)?#+9J*2|N~MB92TRfIAcN-V zhGL&%u#g0l0xS;HjNTxWs{h|?vPAOe0peZu;<&;=E+uEq8Bv`*4>Wu3+8g82szpiz zcjfhwczER1ci6#vlNwXO$GgAtGE<#Lb3LFKLhf8--9o)hfAIchJ+cR=M^6+*uZoRS z#&5?fUiQ;Wzf!Z%Oy2q%qw(o$Jq!G+8==p2o2veY)(wIFfBFxcEN%ad`tybyiXy6R z3Eh=KvBHQJ!yok9`DB?p|8Nx*L|CmbaAD!4ki5*~fUC4)7wP?sp1(W0A^=ciz$cKv zcE(kML3U&S zT0o`0asBcI!E1!}}GvhN#<_cvsBx2JZ?m}V;+y}5@3F*h_ zN6hNv_a3q`$`#4T5|`v=Op^{*0vry@pfyVs%@Y{qIy~oB?Zph`dM8c^hP1xx*$dCj zOL6wW7mYlrg$#@NGwgp_*#pa4p97sRzT#UYC-n2JvdH}tKk6Y2*1q{b>p{FB{T}qX zWaorK_m#tEW}~9sDNxw9^H1L3^rL-7CoMmruQb2#vZf zSUE4Kjd_hrEOCI(aJCxH?SscxjB2?#c@_zrp zAfT3RZ?rC(`KCqBk&E%7(}3wIaozF?4S)#)drv$ zrPNSxkO=bE{*`@_+AT`|vl#J$6zR!67bvpD#h`-AM_0Sg1P@BJ-7mjrL zs}fuxcGTKw7kc?fC-DysG%Om$tz@5ZFuz1g_@*JIOqF(Kit7baOEFCGPzj1QTEs@P zVK^4}Q0+o+={oEszX)U2B(14BIx|#o-y(^xat{4jK4%sxJcCoj^ouT2;GT{#q(u9# zotR_HPe>K62;C1fdKs)pPYr*_j(U)@u8cG!F*>i}Kk_NPO+vU8-Z z5kH3@pUfr<&o-rbyzJr+X;^2x(lEdPvsfC8Ir(~}>v{3Q2P0&Ai46wXg1XQscQR49 zk}4(Q&H9z#%q+trbKdj%l4`~{+dpovTpe=@AXaELRj#`G5L_8&TvHK5B_$;S%E8(hpo}ed z5E;xo&6LS!AX=u{PL^m`xOCNa{?6S}N`ahgs$~cVTpSEtZTX6P_@}s=_|)pmhSFx$ z(2(0uk5gw;ZiT|9r^fcoBHXQ1+5F`! z2^zy176mW7wky92bjkxSwn*IhaNuAM0(XID5xBYbJrpC;&fo-L5oihlKFP7?B042_ z`PrJ)t`*I6nK?6x**#KN7!_{KH{dQvmfewoqa$^aObs~=N9s*2WPkBubDeaD{cWN^ zO9|4hEot)1uxoX=4(-c@2Rg3(R$!8{^T=w9iMogaHih`AyIF=C+@v+2EYhs@jPG6| zehznf4&#>8H^dt;9s#II_#Q6zt<(lN{o_=^73O_#mKuQ|3k=+-!=UaC<929RFZTok z`Hk^9{loGzb@&3(2t9-`1S&p|k41K#g5X+OZ)7v6b5^3lGXEf9rPiM!^EmNz_=H4Na22W3?KJ^^hJXDYo_U8)b_`1KJZ{^845RqhLhXhnWlhonYO~>A;=}KfIO3(I z3B}zMT|W|hxvU8waVp=Ft;Jaq^&Y@=5$UdB_m?wB)l8CrLmcak>_7$A;Kj41bjhQK z2ZFIDM-d7eZo;CwqfZH#O;MRqFpj~%YoVNVs<1~mEpTdyiU&rfn>)J~qx33>4bdyXzrqG2TaO3Sf3~@(|9)bYs-2~orKyRCq0N6y z!OYTt@=#eq`@WeZwP*GWL=?o7G-0GCN*F4)wH;hU^cSsH5Jc3DU|?a`>pKMaJOGPo zH-)QpwC*FXx64>vNE0D00K3IWzxXyRFJHUWMQl}kpG=X;GB4zQ-A{FyU-P|W{?NW; z@^IacCqMu#miZ%UIf@}AA4p?uQw*pw>(C866YB(6i*Q2SFbG4gShngNBaCiCu=z+1 zgose~p$TmgK131OZKDoO32hSZ*uxoOy9GMn*sVB(1oK2Ng=S&%Blr905b5)4MaJw^ z8*N5;o3yGA_zr1=ez5TpJ_KO9L2W1?@kfV<&Qh4X76yli1l~#_#)M~&_k>W;nkN)P1W zuDEb>#>va4@`>9RJpH-C-auUpf)0wH+i=1`V^;xySt1AHF0+~0>-RfMB?qoquU~5> z{G!vUK(vq>2GotzPep%k(=TWmyO6aiEhk4}g*62mkG)J9^=?@pIf+G=KiF1mFds~b z6ASS~*s>g@-;srx*fjL_8v`r1zCK}}|N7~nrDHW>YM41;CoQF5E+07+hK~{R#*qQCuWip^xXSlbp*vFV z-HNtpMEbrErm-6bowRno6&ZCf+|1&%Z<`}lU}j2XW9o!uH@~OXD|wQiq-DirHrdo% z7=sjMX+MTBW}~jqyitK@wML$8Osa(4Eo#YEykWB{wP6%YE5mJ)rrJcA1Mn+1m)8Dl zM23yZIm{p*VFG7v8Q59csbb`in2!Ixwo{Iz%G)k7qdwNa#{|~Sx^y=>W|nbkV5Nb$ z5DkuAdaaLss1=sLS$EY5bwAe#lf%P1UA#rZ(;r%K@xj}fy#wgTns^pe9cXJ59pGsc zIn1m4!g5dOcYKR7NK_}YY_%14@xj@dyVGU#a7Cg)VX)O zJY$xkKsMvecNkZT;FybU#hD7F8Z+|f9J_{Wo4SioE;;aa7(&=txdp)!7>q$JFJU%x zN|qh#9A>&y;W)Tqvi49LiMh+{k1V*;wJT(2{&D>Tow5Fpv7UQiZ~`lLFuWxPDX&TW zle`>aBQ>TKF7+6$pW@3WUpHEL2Q40o12-<8_`eY&ekccIpd-k0ESt_aX}ZTvbYywl zSiQKvNre>kLcb@i(CZTH3VGJ-M=m@_uup%ipi(Qb)vk#i@=C zppHr!y_z9^_TQcFJqp>TVQ63ea&b7{AI}$7RQw6F^1}Ycv`J_G9X?-OyNj9RJ_$^t zxwD?;O7N+wq&Co2($bbjuedqi?KJfcC$r9-p^hk)jhthc#6K=Po0zTuftHM0P}x(h zrPbc(EFy7|epH2bVrOA*rMEOjY+RIVN?*Vl*Ui5WO|z(SwA`_Y%&FJTN}TLB1H4PV z;0;}J6z4d(oQRS`3x0;HCcWNQtYcotvvSBWa5()g&Qm3r&MrhA)ucq%<$L`H!;RnE zU#~{T7I`JIj(^Y5`K%IZgfBZc=}e!t0A;n|T}$(t`pJ$}2~QTq4SOSl+^uN38ZhaE zPjAAgCP@GvuaRNb^xf@;&)GnoBH&I|GkfoIcGTAQAT?XBT;0c9;NY_@i)&m|YGQZm zgwI*i6G}jHh}_3}Gs#itXhe}(smMB-Vc2BNS40mH#!I*w9>X4lDtE+CqxS7V`$s-ove4&V z`reE`rqi>CLnNCYpJFv|S#ZxsN!>|b?O63Dpgj6IsHWYF;d80U8>ti?;yHg8N`6>t zPl#yb0Wmk5*orDIJ8coU_|tWhi-Zme!=S6gK08FxGtuDQ6E(;F);n<*+QVWyNyyn5 z9B>568r0O0cP0Gyd=%ya6qGAlUeOxL8qZMo&srd3NccF_JE%?~Sd9~|-VtY~^o%Nh z40eDz7yJ!zXNGs+Nk=q1c1lGq$zKj48>mcnDj z$IapJEXX)W1fvuOz9{}QaYlJViv5CA`L`puzmG;i`#0wYXxPyGU?dv3uODrSl>9L8 zhK3@Btq!0Rkh*KRP`>%I6l|aaLUm<%l(>-Ad-+J2mm}?Y>IkqztvDsDpw!?@9Mr8A zN1L^$)R^K+h-Q&=!2^Mv7La^wA&MN~=S&?HAxLP})|{ay!HU{y9Cn^xeY6-+b=m1d z@8t8mUh9lnRceww@;`-RVy8>R-^A?tA<&tLR71(AAmFD&nifWIrj=adW=9VDyeJGxWoN;-F(D`SpaWiXlMZed zP0CAIS!B>;PcAF8F;b^gO38~+@@WKKJRD$M&p$*1Tj`xxPvTY1iw@o0hEnSk6E=3W??u7?0F z8+ffbiy*M40kTEjwKY^Txy0?;X>B*!a#5 z5aXXKplZWHaBP0m5ep!Ky#pY{7Su>8%ok%~Ag~1JVpJcc2(3+c18f%PYfwZ{*}h7D zc@T?UUB^vj#v2LYP+Ce2*j;4t&sK(Pnf}Lm0))W{5dr>(181-p)JjHBovrO%yG^YF z*c9Un_7lr3zsW0$`Fc;6d&}YDXk(3I#<6s-bRI0eF+A{{P($o%$^nPMcr`M;7vcbS z9k1#LEb}KTq0Ccjund{ zp_vppnQVIhZ-e_X$W%f{RG&Ttc`&RMzyvGgU#bZ?7FMx#W9|25e8AbUxXX4EoO8fq z04Y~rR-vt=D>IwD=@n@XGpJS{F*S&=x){Z&g-Ay@d?Ss9YTRHtbhK;mwDcV`4)d|| zVR#s0qe7nNd=V$x)?%`maXOIr#vwb#UmL{uBf;Z^a4h;3*ZW1)u?1eCf(>SJv zeMkoy8Z59Tg|LJREZeNgTH>JO>>@E{ImuPBTxJMm6&7Ox$Aq?{dpc~7z;XvYE4R#H zx7>q3WbtiI5lvHwDxI}}iS=*@cERz=hFO2)HmzXTp(#`SG5{4rgPCB z=GUl9&io?T{$k0ZdolpfJo7$=J zX6QUpHe!z!c_gg(yew-F2UC){ev~jg`DNd3HC(?I*1& ziA!){KW5fJX&J3b_i_63O zgY=1}`~!aP1HR9fa)Rjh4ZhVkY4nLbx5(lRVP{OR=?%UxN0*`fZ}=!fhB7vkhO?prv$NKg8z6q> zoy37563~5%!UuL!0f5CMVI)uD9&KN|9iAu@GZ6em}xS?O7WZfNNxb9^x_9)S8ufGCXg_vOb$lq`RUpfX~=BB(K z8L&`r8Wjd>PUQ%5MoCthV`L`0JxEZe^Tc{HMQ9ZBCR`33j!IZo?T_{OOy|XL{pK5eEr??+j2@Q=OnF(fVG^OC%%}fD9B1dv z?EPb=g#bvLi9i@-7<+ew4$CgY0m7YaGvUG)3*W*6Qy9^hITC`2XhjMO-!gUnR$~Aq zSW;>ge5MAv!$jj)+AH~Qmw`oQ-DLa#z&z<>q95TUhUqk#67^vdDWa1QGe6DtJG$h4 zb5oj*tJ%;F!1#I}EM-nRg_z1JJCJ5%5s_6RJEC6ZF}$9;?-1;TJ`q$|o8rk{lUwDA zJS>IptIqB#H%-apV#;ny1iiV9;ch-l?aHJ#lt4{malh~S%?n~88yOIaxZiQ7p`MatCUnLp~d$~$DZo_Ep9RaA! zh+U*XMLK}{u)D&asL|wqvG$HZvNqecaND+R+qP}nwr$(pt8Lr1?bTjwyI1R5`<}he zJ@0!EH@riXh~axmD^GjY((x`qZpgM>TrNTlgJZ7zTgRQgTAs|vgw1O zuQZ(x2rbeaVYk_F-C7XNR4%i~kSa+8|EuS;YQESa)%bp%NW0WI@4h6%`r9$O!lDlB-oSGFb-L zm`Pw{gDaH9FiB-`pL_SWJ@{L3&b*)VjY}?|_{ zg{GJ)%pKXoMv9)l9ka7Y5i^JrP#aA!!Du-dktejWJM5ukfNBD?c@$1ayE zw@jATn~qCRLE&6zkF8F7jWk+YAX_*ODmja{(Kd<6f`5`c{&umjor*w95$5z>Ez?}! zx7pg%tn$Rkw5(USSRTsXutUgDh8j(LpHby)`>8ZYOZqv7=F!j-PjL!sbO+($Ow~mY0Tsw@;U3nYU$W3CoEMs}u zb>xl5y_Y?%&cHliq=L!l?TM)3%s1_zXyASAEbm9tER%z)D6JJiO60Ved0oF4r(`&=cYH z9YP!9FmGf>*)7d+-cWRg_r^_VUy0i7yVT|AG5=qI8x-xSI{OE(41fRtRR1k-%}q^2 z?c6M#?Ct*dU2(SY16G3q2w~rhjMgn`-qapX`RFgC%?1S!P&>v6!x;m#;YV_xz$iob$;X6aLUhmgY1 zwbUzUAFbT?WU3cFkGiHhl2X?K*h}=990R}Ynk>Q`NprsM_%P{O_un+qv|3JG@5=p2O8 z>2xU5heJe&$5&CjY@ke~!YJ=HbY21YQtq0ggsP&?Nc87?-cE8nzdd|`6^1GTqXLP6 z$AC7(np{8EulauN^16Ty*YvCXOjov*{MpnUpd?`0Ki_zTExKxP(4_>Oqq;R0Wnoi+ zNV!z%x0liPT}S5ygguiEDBC>6222jb9X0wDgGT$tkp+cPbydLHBr}&3x3MspDpxG6 zI&{-2>{ZdN(DPae-+Ym2>t0z0GW+dBG9^WG0kQ-snSEKB(=nND9MxPxYWwqr2P;H< zU%6{LO3cGBT!n&2Qflu$K5V$^7_(5r{gaS-qwRYoq}ZtfdH0v1F}Ghn*s>Gv!NBy~ z%Ai)@eIKO-hvQ3bUA-A9tV`H#S5Q>orx;LZJuwM*LezQd3vf<{C{9l)AJ@wtu<KmY)6 z{7=gzY-9Ncza%pD#)dZkvMD&(dwBj!#`bSl@;;a6G?U*8BZ?w`S{Ixb9LOUq14XH^ z7)bbZFSgX`++p;fbCb@hA09($*RXCMr<}x8S&(dtH6LSLPS40C`3swmXKg194SUoR?<;ptU0KR zvWA&~o7<%Ou~#8PHiR2idxRVQP`yv%BrY%AqPK}-Xn}*8<}ilgWpuF)JIx$|e8I9s}nYu%0g|u|zdAzDZo-?kYsn{yRl8zh;O!^##W*st+ z984~XLv6yGBlXNu@@kTU4fRyde6DH%a;v416~+G13Q<$jFg5hHRuxf5uJv896#H=T zC50DAmD;akbrCKKB3<7or+VTVcxfrdFMj6)6|-}I=a zJ0VcsqA3hw}XRqXM(#8XHrEIzn}=H@TO*9-Tq&{=lk z=!JXeT*IR~otD`Kf%1e$ptJf!(DghQydi6%jqpU44-sh}A`TFYSb565eei~M5=}QL z)}dM(qcmc7X074%skPq9S2P^)t-Hx|Wu*WvWph<RX!8QuS3*lDI2v+u4eCURs zQ|8nbRw4+V`KECx{9gJ7))~MH`TI>q;XBw4{}54>LjEV!(0|3`f96tZ8|weqvC)Od zWQZ}PmX<286oo~RkZv)usG<=qM5&~~a>O>Ho9H(&%gL-)vA$4p$M-!=JWPISwr_!t z6rV->@rnJR&Ev;zXfKqU)8+Hh)o1^0_w{x&*9Y*pFOE59pd%zC2CA2Q+nGUb0^%S$ zSiCMXk>H>UV=v*MJlG5adPq1O;i(4WOxR6&+-AB=K*_P2$bc}|9piqd2XQm?3VVSErfuf{@w1@$vKJMSb^eR*Y&)~6`WL0a~+pa zdEyvP=rK_b^9?0z+H4(1$Y6AlQ{XmO|7yb4)c+IHb>N6w!@1Hr;**VWuMBpOgSX+- zDNpgI>Gh}!Azdr6%P>p(FLtC+!J&lOuI&dfWYNY7t%~*L z8!R=e`YIld0kuudANwYES%zb!Xld=o@}|Dz7svqW%)=^%8Zfru9!RTxXPQ zoY!7qvL7@93NXerG!Py&FG0dwWhj5`tiENGb1F-m zX)YA|$c=CHxI-HwqKQ1XkkU=eap%}6A&I&DqH0lz(G(g3l^ClOr@o1V{7HoPVt)!# zQ8iWi!8IJE@C#q4RY&3SyM`cnhh!&9FCU4)GAO%!HsO`aX^oqJkU12eIC>PHNN%X! z!8NGffi{>=d5O1Kr51ELZ^_fU+@PD#U2N%MprQWWF1|UA((?z6Rd$)gpr*80R%O=? zzGSy6RmI#cbv*0#mBR0vbD5xh<%&@2v_fAM0;Kb zO0l`eV0D4=XE{aT!_Z(_es7HuftEqJCaI&(SUWJ@daLaAc?90V6sT~j*(Tm@v=g8K zdr>54*@EOv&8y0M`X&lSr=@$KnV7SxJKp8X;GHJc$P|RkqBmzKo))Dj+2i6AtO{|M z^ROVmCE?vN!qoy9RnkvePZc>kqJ+zt0;+feo_a`08zE1Xv8q8;&T;f$*#WPQcWN$n z#pLafr0K(oFk{YTHc;ns>+&*HI9N{>JIJp?|Ds4g$BKeC_~v2ZeFb@8Yq)(Jxe#GP zNtr+gittt(IlDsM4&O53c;!2*BpgU}{+OxI&~Da^F46N`$>-y{N3ubcawicnUgnho)MJEVoc$P|rMr3LL>_(0%)f37B!6B@7|rD z_u~kMiieVinunqfQg3ax4<6fmc2d3AAj?5`wXSm=^EmBZx(sGht?c8PYCwDWzY{$U z2~T_5LupgNfYe1#j(k`$k;U-MVk@~pD|@wG9(R?;K`db>TN4_3q@B|=R_NKe;dl?` z7wFhMMm-Eh540On*)#pjal!ndWBEOIi3C9#$p-WW0~!L?IY=oOxSV$s{7C!wxBQTF zu*a|K&!lJr|EDI=|28rIp}0|Yb#^edGx<~Sxcz&8iB+1iLuN$bWlsi&T_OV!vZVA? z2w?&?;mb$OMk`h+YP6WxnP?xl8V){AtTO^cLPUb*3y2re;Z{^_sX(E(*}d?_TYKL1 z@B0QgJy69(wW-UG!DYT$tydqC7Gh4WKyuVC&6IjP*3`o&O^`(N3TdRPSl%Vi8#u~039>Kn>Y>5D`#0Su6O_zdQz}V?IXu=8) z@(+Hg9`BXHZCEwAW|fX|vEaPXAYB$?g1=(rz>TLjiao@(36UGqepWj-S34_WGHbhe zT4rU_VX414Ak;yx(jb1FVi&d8l8e$A37nbU-2VtVx&6IXfbdxk!tk5zQSpFQ+ps8ActeD()}H?}K}=_MDQ^XQNL z*J4|L?c}-D%$3U+qlxR7QbnJz*bbxqs*1{2e#PHzw8||Ly3$v(P{+%|w7mKNZoRue z-p~Wut>+{De+7c0h#Qi{A0R{m0RYhaS3t0|b+Gw&nkbt({m1rAin`K3f+)O)Yv-M& z6~6v&1O;HVf{#j%Mj(MGCa-+8OP!r@jMq?~)%g@&r{Ir8h1}T&J)8{g*Et<8+srS1 zzWzQynshSw!qwAZm^e(#X-I7lUm`JAMmyCuPNFL zip>TDwg$U{fQ`#JBT|gj7GPT^i!JtD!22MNRh%y9Qg827_e3EiY20xc^FCOxDHcAG zR>DzkdQ(Nrz&%FIvL>$4Gk68?M!24J_Rf_5Bd9t)Q!m#h>!d#opNdUurS63uk0ilyBQCw>1n6D>L@XB3lGh`~dod@CYA=QAP8V_-TpFhPXrXZ?JE)F=uv4N$G_+S?8CX zhu5FZelOd}pAR?s{^0e2zyp(r1}DQ?F>f zST0A=IU9pha=@KjO!xz}zU0!Fd8LJ=ECa)^wdQEuk9N$)PX;i019Yi=LNec8dP7G& zM(3cvdJ-zm49kS9M0QPSLogP(#m+K`yCXUV<9XZzP7!m?s4E~=epY-q1qRpiTG&!F zFC!HO8Pv{IFNAa`jCe4WF%}cEiDI%nz&)b>aXug-nrUamn`vi^6cgVe8vZUZCf-qV z7!_0fE;2^`4pX#GD2$133>|1yT@@w3>?rB_m7@uS1vbm&Hx;|B`?MS8nuG3WdOP7k zX^eKeEZLRRs1vkT1FvzWvdpM@JMBSSOr4{8|IW8AEzqi35f!t@lQt@@Gi;Gg-+-xl z010PnhzDTJ!mJe{Ep3B@iz#f~0vS*xCpsXul|x#Zp|y)BsQ8%%EToEcRHag?+oOx} zi-q3yxGM{l9*he<5C=1~J_ zmX=&C`dO)e2TRC)gCTcR0n!z33&yX;vx|>-?Y4{qx;!JBRNC5P{d2Ik1XY|(H6pF1 zXipxa3N}QhSv8_(ao!WGRWKT9N+f02%kHXE7Q{#C#M zC2bG}J>WL{{ez3(|eE{DT>-6Q+1%7a_6`&ERrUr1a#Dw^M z&^Vdl%|#)scL-lpf^kb96%I>0K|Nm)KVp0zG_-{%4#-8zt3qz^HN?Mro)UjY^o1OI zHg5}4=(Xy|&+-!@pm&?ATjA9}N91G;joy|bv8BK4C<$TH4$3bn2zhshnBytz^^2ar zVN+G$i$siCr|h^kD+XWp!ya6bk@`Z@AF%zdpv51=jZxC(i|(3tfM=?c9I=+xdNw&>~r*KOT1#`oGx`{x3Z4zqZdTz5h5@Kl{#U z7o3n{+W8=if>uc=S;`1gL|SRqEFd;pLZU$vCrj|fOb+I=Ac*VtT6~`mV4o5i+IU~Q z&ujWS_41P)8d=#%hcu>@6qrQSYURYiU>h_8~->^7k9_5U@<7_o0!VIk!ww(?rueHQxI}J^oatO5IHCun- zo1aE4t4GQqUQ3csVX~3aX8)j^Hf!f5Gzm&I#_FI9emwI&OIYx?2enyzhVmSUHkaQj zO>Vh7TY@H=drvb?{xt%nVx0t4Y(e1l_LU=2ScR;bkJfIF-q;Q5}5->P0&zFrQs=T-pU=ys#<7=llQ}ChN^pn#YRW z+N+W1&O^jy_NN^~&(pc|k|L|NmW2+farFe#D6CfkhO;-a)pq8MD%DZE6Z zc4P+N&2v4y1qNQY{QBcv?yM$NRaWni{m5V(LlkdAo!5kg3-YZ1oRVY7r+&@LbBrGYU_EK(?>TqO5s%D2zDfPk(W(ai= zrk=}UbONV5MU_3<;qTM}2 zf{FbAi69$Vuo{6YuqTOaerE74?wwXJqONb9FCr$*b^=G#a=7b`r8eC=YU<*+xyL)0$!Ox<(Ux?XQwrjq7FS4Lct+5oc~p_`50Nb>OK*51%(^yMTBiy+>!F7D#Jup2=tnAOHimax z4+795$@!^Z$s2E`Logwlq)T{4df<`ifpNqhY`6%KyvBFngdskj^l?ZL2Y4@eTdXh3 zC@DoFujIobvd|Ir{7A*MINZwI>?%>Dh9+YOEel|1Myjnov+H<#9Z9VApG zzH@w9W1FYfiYDO&jJRDqyqhFrl#)O|dW0I2kQ#@}At<<@nnuY%$`~%iqna~HVF{V% zmLi>qXxPWq+W7o%@j_B}}C2&8;1-u<9S2_kD8@n03t; zIK`M#0gUK@6w$%RBtd_Rm5<`JdevQEHc|`aWrcf@~2vJsA?0UkQX3i&2t^ zAbT?oxzbWEc1-QH8Smni^d(sSt^H!FfHH(-cX;m4O#9x)C^G%#_4TDN7JMlWpz7>mv+C)3)AHf}sO2uoy^l_1bC6nN?%a4zQmTh?fx*IV- zZS?m0K($HzBEi$tvO9(-QlUA&_o>jF8Tpv~PIUJ(;Ev}lF zz)gzj6KX#Ed)Pdy>lYgu#m7)SMg!LhsG#@6<+WD4<#je!GcmGBc@Qi}Q(2 zh#6e@p}t zB7N{_@^#pV9_Vt3onzZ8wGUoIxKbT?%(w!yM>$F}1Wwr9JGWA{p50*l-b}Buy?&DW zU}2A?l-YWP8RMeKj=?m_ev5qEVGQ$sVf1a3amJmdR0d;rSQ=$+58Y~=#ofMg;%ma; z3Hen2y||RdL3*eU(WKkx8Apm@{d0Nu&9KIHn=@NcSFO zE#srtH){HC|Fvt7e*gN1^2!_RKQ-t3?;-q8wyOM_220G!y{lFgiYls5A{DKLdauU= zSWps+L51-(e}m2#_ezhctL8r1=WalnNDNtD_Cs-$c}vSeaLG4=li7RLy_fSO`|as{ z3myP;n>}H)IZhgk?l3B>3Jj^ebiXr@q*Qr59vci+ly$m%zZA>Pvb|@8?d_ELithH?VZV`H-!+L5>N9$s80m)9GsnaM5 zW&(3R@)S*2pRR8*A>(0<@=HL{!>8g}t=-2&-Ksg6@-0qRyQM_oV%3bui!wrPGjTia z)ri}dFa0J{pmVZFGs++Lbub!&Hk-Pq5xZ5jsi#skuK2cc#K*Y`FEUFN$xy`6Y#1_O zk#56o+Fl$%*q_{u69ERCv)nZEXEt)LvLNZj@%@!MP3yHj~MlG%_K zroD~thBf4oH{Dy&-D)g-d-J)kJ;PrrcV91ff7ln+D2J9~v<7K9+usbvm;>+%xQg z_ld77IzlxGG;I4CfVy^lpFcnlxd?;N5zUy4=12zSkYgw_Pa*-Y)ul6P z95d{|;0($-w99XJE7ZKbK3gIsK(yH~wL>}GgePuI=%;1L$~{=cs4vB5z?4Ps{$*dC zP}%(4iC35Xh9r`+Q3_rL%W{{K%u0MU%Eq!DR{XqGmYJ7Zy}J?eB{8NqgGiAebG^V^ zdU%mZrYt!SX3V$J#uk9D!mfkaociOZ$Zu{WYa3+m-GSG*qfN4Act=0b>=?te$RWs> zW`I(P)Xf!s!5^lnB(M!LKxBjH`nki;>1I_{W$mJU9K52Qo3D zR#6S3iNx}uuE}sEMoLiDuh7puH$u)JfD34p;HP34oYXwxKiE? zx*y4mX!*XOZnC*WB{+k91-z?t`900%z>3<4` zO175&TZ<+6$MR2tslPiTuc3a`(s(vBlMRl-8KiUVlS;dx2wQDtkafc#Cg!4GQzVpD z*No`R4{6p!KEVZu-@Y?|Id%XunhfDMDNTke_6G%`!?Yt}P+;8>oeE6! zr$P{UD8fa9r4g-1q{H~o2T{~wz50RZwo~crrD@b*w4;g9(_wqC2GM%Z2CX&FgtHU9 z0{T&eS2?{V23i8!i!lVWkqpPfehdeg?v;W0neEvE-(YyC6KFN-j!ovZ{w!1;{~?8o zia-v+6_0W+IydQER%0^(H}H)JRG>p>Y!2#HOyAj>+q6B^n*DgWEwp-ndDM(XR=k)Y zFt4puADMw2^ zRd>7lkaB1ew>7@A$-+x5<%KwjJo5W(U?d41D`U7PGV!|gUS}k{qi}wmsF!kdc71N?U%jI=;7g|MFC}a zt0W7e*mxNqWSfJZRj5wmt~DjiR5>Ed#VcCNqw2Q}f$}mRIOH-PKz%H?)X06K_A=YU zWwb=9C8Uy{tHYolajx2ZqS_$FgU`p%m{+>d9LuLr!`YT{U244^4SUB}mt|%rh;u3< zyEB}Uc$4boepENpTB0|_xzrxd%*^Q+e1Wv8wEn$bHZ6N4pVd@NXAd#H&757F+{}4> z2koIgv$NiOGjAHh*r{~QgNwK;`yFg> zrLC|W9-7yv9!RpWz4wc)KU`<0_+PfzCP)1OZ|#-NX2)YWvC7r<^IhzH#x(E9?yJbaC-Np(oGDe)D3 zY=w`#URkH)okX$mv5)bGN09Rg6XdnWwthkXAbd3sWvE;Q#?84+Gk94`?|aAC_%P*f!pNqwbyg9 zETk_x8H>;e9|1xBVnhB?$ybehzu%es#ovot?>*}6S(cH{`yzYy^Az;Wtn0~D7-||IIjm!P%Fq^d$70eXevTf7}ZX%hT2egDRWhR z8P~^@G0a$qHUO7lTp8fLF*hG2_sy2YoZs~oyj-4mFkCh5DvhcIMiwx&LgsDtKuY-v zDbW}42QdHnF?k}zQFV}0N6anY_UO8M_mu)YQRlSO3_*Asr5{Dia{ez21uM&rGf3p_E%CyFUc?U&u zvp3k5lXK*pLSENoXKcjEFNL@NgM=ct&)Ju{xm2b*~ZbQ(s zrk#&LruG7?-Sop4ud9i_0vVqpe-ZycGL=%7(JFHc3iQ+vFm-g&FmJH8&@gRSyrZi4 zSes9f`vsRfnfp=Wer8H`j(S~geL7aP9=f)XwW~lk;tRFn!Y8}PW+}EoY-$9o)1Xh< zdesZnqj9Au`4e8qg;--(ZKsm*F@X&!t<9(Bwa;ggg}x0pVmG)U=-HHz!j*zjfU>Zd zpd?mm6G5FfTq$J{jTBblTr2P`-gHp6Yedc+9{7ApP^#-O9l%bocB3Z z58y=n@$97hMfw~3uLrhFd4U(3{{-@NWB>rB|MNhuuk7M#^v~vI>fQ<}C#c`L>r*|| zRYdTS1^`Q}-I@r?80CaPW)gwLg`=qxHfZhrlY9>DiVJ*55B0~2+R4pl#JRAwqV3XX~+q^RmDA1Wi>R6FW-99Wum!7|{RF3EH}=u&Ev?Gd=akY&^{M0v<{oaZ9VenGx^k(n9+Vg(%^Sb_HHWppq;ySi@ z%HGsAnOfbhldSI;ir>X%YBc#?WC=UGEdKdRoKMxO#d>!icy5wD6K|y3ErnY(g_{_Mja){Z19#FUDNw6;jV-AO1BjB=tH04L=U%HLUsd zX9I1bgu+9(uPoC2F~#Pm<4l{L&;X9*i$=M8^l!G}N$-ON0gv%EMWF)G9W+R=mM;$i zr01WE?x5bgjC_@EY?AFGL^n||7J_QSKCn+nX<911%bvoMKDv|Lii7vVJ|fuU@vvx; zG!7CEtn*pZQIl|xZ>Xuc-k8dU&boI-EWFW5EqT*vg46vvVf@t@B zt8TJN%V>{dMns_4+)&k%Vs?o(yz6zbPO1=xYS@Q6o(5{KnrZ zfEl0_av&GZ2P@s0cCUmHEByI|@J21iRgMgIUJVyzpHvW%<+&+f!E(BR2SrlDC2?>O z8ULhMqdk3yHBo`-;f4WhXoE+@3Vtq~(%tf~NSX1eHi#shE<25MMw`2&=xSRSuTcl&57^Y(2(;sQr|a z&VhJa*?i+cl@zfOX0rl@$|m-B zsbFf4V49_Zt$lt580#}wrKN(keS$64@&-1CEO2~J;1r8RBfEwbRyBX5Dg1Q)dUlr$ zl>2mEsa3$E{F!j|vC&?1haSGl3g#n#rs|4v`$My$yo)3`<%NCO_majBZPwT>axQa) zqnfL+Hi&3|u%s-`P7qhGfcXjeZvf z_Ql_NeyRcY3FbxLxZXOn;7$4xrCe`Ljc1u)s`WQVoyW^mF!PxXocq|f(dzXhdl0r~U7Iv69ZTLYcYVBK=& zFa&sqqTFKirz-Jrff$)TnWD%X6w$k@&0+E5HgAH^7M7{pYJ*xJPJ&n<&Kw8ljh(>E z{{*v$1=JGF=R9 zAv4-2B-9&jvP7_kY#0-n)?^u$_8^nJTSh#PLv~yt*+j4LsLjZKDJwoBoCmiNtcl39 zL_n5+8#Ksyxz)+KvLVWe&*Y#+v*q5E@5;S^ygU4kzZ&-cn-F;PsF<bX)?O1gF*T>Swc_P8BzJV5BFtdJknOl2}Iom-BDb4h%*PsK8YPO7UI`pg8W zuq7RevTJ8`D%J-g>Ul7ab+Vwb9c}PK8`}=p%~}Zp_QJKAG))_6I!I!)+sBLLhOZNx zbP$iflNejJ;d;+E18sR9`G2-NU*<8?TfTz*b^N@jjj__e007%y006T8f5!j6?85eT zW|rozPKHJ{rvKsaS&gc;J+e5;*Qi@}b}Vv^t)y^!sI@Km3>eg}qy#h}2taTWG*PXV zB-S07oY1FQRz2Z2?(W;HkgE0`q9<|H98B&3pmeGT@VV)Koa;32bv}Om;jiBZ&Je1N z7RI;{&*P^!lmZIA1SY3>I%Emlm&IXxP#w7|lf&$|GYpE1PCIR|+Mg4+i^;@}&XZ24 z-#doyP?ic(pbVEa0V6ycU(}Mnn$(R26(;k>RpJ-k0z9P*H!L$V}k%Hi8G8i zv@RP>J;IGok93~*7Xeb6)>CDI`xc8E=d)+~plN%@U=Jdf`+1;PdE`pysUX2&IbESiWL(^fm|9yWJzfWqAqFi< z7fV+Bkix4Zg1AX?EoHEC=(Fc|QPv?DQ-l@s$h8ELpbQVJ*HsJi*VeEB~a4RU!$~V(bj>B=ePd5PEv?R3_(?#9}zvA>#qa-LU3#K z;|x30D(aBrI#Q77lMh^}lP88uFv^`tPn{A#eME&=zfug#vBnDa6isQ^r-mo7V+k?E*p8_nZaJx}dNyN0SsGA=W4Bx8 zPuIWZI?XY>*h)-wF92eETy{P7jnpSw0#Curi?&=)$ep3P?fr4MR$*3Y=UfYK+#5|U z-YJJWdSTRCtOfd`rj&2Qm76s7m12Vqg}3JEOSZYInFr~gW?pURrW`%qwhVHqy3P$t;Qpj_Oo6C0Z7C1s#qp;_V+4c3Ij8~O2 z4fx>zJxcW{qBvxWY^NwQR^&~gkE3u}YBxRe6dli=;GtQRapwwweG$qHajAKPtam_} zzb4=r){$Yl1%I%=A#KP2^5v< zQD?0faMpbX7na^CyEe7{S-WPgU7Owlt}|EfTx-4=T$?_(DSSS)YniOQyV#A)tV9~H9>Sl0ILZMZ=Z4KysukdVwqqy6Rc8$Bu=Kz0m}+T z`#XH?NE|WTeC&vQ2})r|%tH_Pa7D-pYn9Vzyr)DFXX-&*O2&(8nCGr&R$ET(aIj4A2S;PYPbjk*K zz0)sZBYcUN1u_Cjv3~aL{2hoB=JrS*29>LjxcSDzS@FNi5J zA%hOk(SI@pD3W*d5~r{uj_ElBGJcj%WEr$J$M8qSZP=^yam0Et_?kFylxDdWj8>G1 zk&rm1Sd!1bMHz9N&AwlM@Y?k!%EpPu{j0 z-j~NK=l8>S_8S0_gv5oQjF5I1_*t-my&McAzz`D>Mxs{nU=|XSoH5YMXF92N62qJU zcmAdXV+hmq6;@Ww7FOQO6)Lx=f||x+t!|Dwt*opy&(H$?E(=FJwHj1AQd>Q}71eC= zlkJfh%_FXnH*yx?CUQ)$BG=EQ(uVTX$}}tM(!{743 z%~HkVFkV@0VA%YTeWVR7nU2 zP(z&(FFZ9)a4}2*0c9v5j>3FYTO=|RouT3&yho|_+C4Bks`k+45X!Kw@YL-6S%0BK zG~MDjG3+~jz1{0ihR3V3v>?ls@<@VQvCK%kyfjcfi#{`nh7U>Al?vNUYtT1>J{d3B z5xnG{yqF1ojRKF{tpl3RCnM`ed0N498@h~Ns!f9<-a`zSHM;~)H4VWxE8~4>U_HgX zXkLQ6r)ZnbY9u0AzK@}fC@_dxGmCxV8V5t#26t_@G{bFszM#8d$V+m@)ZHw8Ldbjw zgXS*t`eSk^T#)#)=NxhfWDZDWI+q|bg9lq8OTX!|b{l*h6;g72(L*Cg3Fr~u6U-6` zk)GlE!X9w~U!`AHL8tnE^O@-*4zp|d*BPR1n4$^d%OSh~Tj2_T|4l@3LuSe&(##@@admZTib7@;uJEr#cEDe{hNxL)t{@2PDrJ0{zvLK{WUvA=!ga)E?!K zQ>iXs;{}XXph%dBqC~G&ot=aK%#MR4nd&3XmTsGG!J~ze@|gj^P&8Yjg#02OciWp^ zBsdIkrp;YVkG1xbK)c$2v+gy>U~+Sq;%mcdJ|MXQ_ui@&Nr(sZ4Nfm|hl>izu}mr8 z*=D0rDv8B+#^OQo{Hv zhmDWVN0RC_o2stHk6%hp%Mi|$$Xb)No@$2cAOkrB3^FE8kC-b%)&MgHW=GmJ5QNwTEKd#F0FhP8$aK_0>h zP(}pq5$l9py+YiBp}_~_r*#iwr@xWB+={|)vD$f~K(Gbju|<E1OWgL{$rB)f5wV`azf2o8(S2`4_t^1a;ju&Q7yq* zFj)axVasYj4Q5{nNCRyEMU;I40gbKe%xvga)sI)`ujuBLL1X-uAD@bRc^f(!9WB2T zP9|ojGo5#wk9nERkL&vU-+}vaFT>`e9U=8Y<^#k9ANQp1G9mV=5IPaigC!v&5rY0d z&fYOdleXO!EW5gFTTj{OGP-Qrw(X~E+qP}nwry8eb7+gb8zRUe;=11hj`n1QRdOPlQKY}#v!P>d|wQg-Xv zXYAftTg+i+@W9jib*C0qd(#dfvpLzkNB`u<(2T?Ikl8j1Law9B6#6gj z0tW$|3{EyyEM)?1PG{o;chWQz#2gG`-ny|=k6kAZBgP?kc4+jF{5y1hk@8xJYlu-+ zad!C_!-U9qtCVYmyhX^Rp0gwu3F0a2;WyET6DB^cNf6Ku24j#mljnjwHVV~ z6VHZx)Aneh`yvEHOJFU$5(!x_BG5q1nGH){{6|*vloK#z6#*%i;aTf3)6OeITNu0C zRB)670oD_T5&-#=zbTG};4Kg!NfX)&~jlXN$mcCo4%#GR#4rAo!2ot&xl*>CZ;1d_I;+zE6KlHA{`iaC>djY1t%fhIq zeejk{M2)n{4sv-VeFTX-Z;t3wdd%tiz<%1RuO*O1}JoRIO z%5x;}kjM}6!n|4BUuYjOs1BKyZidR#Nz;;>#+sha7DF?@q_=U=Pw7ZXQ<1hYxAXcE zrM5>%!t)QiU9la};b~q_#@i&i?vJi@XLW|v2V`6HGct$`h}s6OPE9aFju=IbC`XPk zh^#T=R+yBZ13bzJ##QUaG}le+U&E_AFK-LDZx`Rsu>7tceC1D`0bT79{C8bnOkN6* z_c;7@EWE*#>ek1QJX_y=MRY6W?<>jjmTJnfQc;u;d_`!vv1JDAvKjf4dlwbsnP}I@23N+;a-(qe8eXGvDO<42@^S}~zaIndnj&&kHU`S6o!!=y#M535|UEyXhG>gg4S9ntgC>nB%kaShdKuWb_Na z6vrxbXPn9ZxpBeZ*@^|Y1pQp>!*QtjfKxxjUC6w-bV=~U-l#8yrrh#{v0ErwUi%e& zo9=EB5lx1{EDrym<353j#3Or4Pu>4sT{`WST#nl;k8a=|XCFgj(lOG<>kgp6mT5}A`7w8c)u$8%b ze|532OP$@nfd&knV5q7g zYqQO?V|2w=(w;-^n=I#|PjCxPxvVDdxB6$tP1vjppL>!ZF=%Oy8KwK(lyk20tn*#R zTbsY%CuBdm3TUjwp`6u|WvqYVRW>Yr>xSzbTu33^P{g7|7YN~dt- zQf}dAb(Q%Jg^}8|U8e)CfU*R38l}c?gQMm)b3e>*sYGt0Al-QuwwBwBakPBn+AI`((Gr*oO* zzy2H)r9*Y#Uea)vsVl?_tnZQH_a^qGBNPve=7CVU4ZMStKqYoD%ID}C#RgKIRpz}jwW&=WZNFJh3zdOi8;d68>1G< zJMn(IkaI$ax4_$5UgP0N@=9iwsyXz%t*Tft6LUyun)7ghOBuHmP4MES zSbu6#5ypx+m%RGd?%|`fT0GxJsD7dEW+ANv5gD6}PJ=tko!8 z?De5<+8panx>Wl{@zk0!Zrx?yHh%C#FQG9B&&fa(HS$!XC6-9-VSmdTAh-}H-2I3l zdnTBawF^4YBUZ}wi9M$@5-2>g{KX`9gCbh-4gT{zNw1{OAyIq?Q6ziNlK47jK(i2% zWt`)p?3~WrXbyRA-7G51**^@RW!y6{Xu^#uwdp6#U$SM*|wKZLMse4CGc2y zevnjgDGfyevtxrbRvbZ6f$SqXEA_P`jDkH2#kSI%37patnyBmkk_>6iX*Y;duGc}$ zJ(^T>o{eK=jFZC5_Fj#0eEVohmyV=h^290exNq(J6 zv2+eb=cY11_h3mXsoIYB{BkEza?6oUA7bQ9g+LOeT0jcC4g}DL2|e{#sVpc}6sl>3 zmYy#x9X$v?WBT|C<_cbJV`kh^y1@B(#7DTB&R@+fmsVn;3fiF9H5%yRH^&uC* z2sW^Ys|u)$y>hRL&cFbJZ@YN0az)%*L|ogQq06WqFL*d3dc$;nysPx3eA(Dv@bgh} z|M^ObjHw<=5AJ!9j%f!7(#$mT zM5;|MQFSAv@DN7?l-B0pFgkougthzkIjrdtNWiXh3ho60+G)mvsY)lY7p);6 zc*S#=_1D6BAq``Vo7sWB%e(S3R29zAS^}hHacAWyM8<>uucOQnG+s`zSHx%X=Nq0n z<(kx=zu@DacF07d^%pjSmdE$n?Y|&>(TuYDM)T&O z&lRoUu_o@;MddMaBDWQVuqv39x_qrv6uanrHd^N;tnMgzsw|Y3ci~=3#Qm(^xnk^M zlSDn?2%0?v7>q#D9HQ~T)z7UX%jXv2tbgtE)EW_50uBjN_wS?3!P_3_Z$CY<#ljO1 z6@-HpCGe_Pqg`#q?r6F&SL_`!s?3^0E{X6}`Ih)<<}cY7E6PS0*98i}ICvicr_cbH z7iOqGU0)riGI4oeQ}|8cf=+#hc$g&$k(JPqae^W<+&l0GY=**~ zde{05FrXJz@nzKS)gZs)P$~|QIl<#l7BgOue53R|IELqup0t|csS2p0C~p??_KB_;?6?|%b< z|BG}H-UEFF;}6w@3FXw|COID}f)Hoo8zniPZ~&=fxpdMmG(lmjG+7o&%vY4RfhKuN z>6<9En!{i<6xot>sCkGO+-9+4BWYVzpXO$xyj6Z1+ZxPG=ez0ISvxbyK0iy!J^#~O z=i86D4(HR|4P`7MU$6>lGzc8|srQ6vRu;YZhr;MIlkAj-#%OhuZrUSuoHLVdh9g~^ zyQy~KqrzzaDKPTvcn77yI0`<-11eNM+Jo*8PVz6Q!8(dB@j-ivFS)@xif)<%B-Gu+ zdkI+o#CvmC|AhP2kUpvRtPpqdFWo@_7A9~*C=@7dY#Y=1m;pB^UhHd=duAvi^LtpR zJd=AGs5~21$16{T{aj$O z-NQ%J@7L8<=*y9_MfFIrB`di|B<*iJd!2@Qef)Aix3h+w8?0fGk+VxT54Ra)q*?w2 zm+#pc&ZysKr`hGRTl5j$r`sx>`!C63)$JJaT8?R!m_y!I{!G;J-9^nH+2(g+EzW8m2I8bwk@fc+e%aKI&2bNHC%Wc&Ypp;t9D!c$8jdqq z@dRbIvF|*|`PM>(z3lkU@7_A_kTRU-S73T|i#V?kU$tTntQybkTffoOV*+TPdYYzG zHAxJBLM!O!O5M|($CcISObZ51s^rmVH&3Xes$i57V_7LT=m~tK;_N~c=npitQbp?H zO~Gs{;<8-xXO+b%lJo#4Cmjmns`_%rB=4xL1J~c)_?NURl$9%Dq%HK7u^~V8ptYm4 z2rUT45Wybdqc-unf+G)|p*iVO9(-TVrgETStckA+pzuy}He z7gaE0DRJoh0xz=DD`&5MgnGbI`Xy^LMC|5UuCG=+Ho~njYA~{S$ zlQLdBdwu2Jvw&VmH)l2TuqainL4Fm~ZxQL8y^34dEU43x3+6NASUn;;F|@FBq)`hA zieI_;x2wZ?^U#E{+g9O~pEoSdsaP|Z`T0e(eMrG;K*7cQpJu z;Zy2Jn6a~yJ)YwFX4dM2yL2OYNkb z+s0LBk^ZS4D@zXxXUHiyWbYa1S91?jk6_TV=_&^26*3Ozk>;#eDSih}b)$CMR~GQR@U)Ok!Zk5mTyf63EMp>UbI(CVP_(knd0~sl z`71MDAWx54IRD`zJ#Mbe$nEXcu1WB*V;84hfSDsEuR;=+znHSOQRQMsSs_{_M&Wy& zx)2v|kq#6#St`5lV*&$>Yl_oq?jP($y4W4$N9pL+PI|L=RFmB;o#@Hz)=hG^c$Aaf zEt&Am+^(DOX7?0KdUK>{x|5td^ZsJhHrq=EF0eWlEddoNV~9rDEWfZZPz#7?tBK!G zbiUbGV1666l;96RZ^a&3X=`mBjoV894EkIZVj~zCB)2QPT}>_JWyB>rrM1%;iAGaB zqIETz!A8StZwSPJTv^YT)3M=KlqreW9x%L(ujN%q=l#_wQqmDz%{$HNK0Z%SIZXiQ z6nR16>IhEaF0T9`w*|3d*y{;Vbz9%RZJ2ngU@gb2>8@c!Xc&20zsxtNvSX+zK&i_c z&27uEg5P5faKmim(HMW)fAgiNy zhas|<5xz&!Ns299JWA)7SK%rAMk;EbN!8>D!65rp^a1&0)QBvmlWIVjcG4bwj0W&N z%$8Ie_18G+%YEPYf{O7^z@FPn9knyBsIb|uU`r#ASQT{M2!E|BRVpo05>f|EQ{_v6 z1MF9*(ZeUZ zU5RKKjd>TtUku;sz;v(}{y_q7&1Gyn;dqQ-bW$*yh;pM(LBAmBd``Rn$Rd{+?DNk- zC-X~xP$dFE)9udYC!OgBg2 z)Q9xtvbYJl;Zq20beTL_v6Su5fbZ=25Y-bCS-#EE@h|*b*SlQen3^=-l}qlmqqoi7 z(pvQ7dO0(uRkU>Y16lUNrk_b1CGT`q-m3jBd7ml%1p6UMpZ-~`-`P$piQK_w8%o_ zG=M&}jG89|AJ%{)xyR^GR5iuW)Wzgmok^2*Ax4yswBm9r3`0lGl)dA9$KChjFxT_- z=jjP603)0FeC!HFrCYH+Gz5K1>H1d#-AFF_ZzcR+j?`i-Au2EuB>1cd+}oI)jsvz5 z8mFE-BmHvNpGm0~?VT5T=i;Gng|CJPB#U*CeCFY%{F~WnF25tU9>C^QBOMiK@gABI ze@!SRY;9!P1r^w9rw{I!YOHp0M(Hs@B&h{vBbtRw$kUbJw+Wnc2b+nrsO286(s<#n zQ3c;p9WViQZ^&egBc-`Nv(HS^l-z|qq&=@f2McCisv0R|(hN&w+c~fFLZoUX{XhFI z5#A#HGKNGu=-4@B88*dW^{J6&b}UzUZO_jbefi!do>4H`un{}!GGRkSZudllTd^0e z3}C2ZJ61?)J!vI1Ra?V1rCSu0c4kkOcYUcadTKjOg&PLpo6*T-WI^h2u~ZGVPNTl* z$TzpkX#s^K7u4cc;%B7QQaJ5LJZvxBUPha@QWEgckV99~aaHkNmuS)nWjCW+r2o00 z)yj2GKY&SE%;%?tSY|o)7#&6tHvB`5 z!6b0^VQOYjffL_VM{Yjt`)N?MaVi1k1PbuYq>54Vm*r`@*f7$|>|Wo+6mi9?E|=t% zL^sG%c|`S_B+1wXCDv9$uLU7r#V@S|)h+<1b^T*{7U^w86CQX12NVIjIEUW^4vd!@ z^A(jx99m7vU(M*}^7Xbr7i!)RmpLTKq>Tvz$h~_Tj=y04wdF7(On~))0s+xM{{P6d z{D0e4|EbTYQQvY#Ge!SPZ`-+rY}XLlO4B2#v?=vq!^abr>z-R8hR6N7L_p6PYYVVEr z?01fH@6(N)U+3pa8+AXbj>3I$P#Jo6{=OI_BMn#ietZxodUwS>8e|zpwxWaFfF};) zl!w@;Hp_0RqsAx-&fPc{?Z3K?2`i@g20KwklmOa3jU)fTFpS3p(X@3-Bgo~NJRy@Nr{ zRK0(9jF)fqcHgC$4mzBiq;K-nrTky;5#3wW?0P;c&+Zdgk^ZRV{F#9c9P`CCVxBe% z37s^;i&DgN#Dv8}GUkmU0J#0WXItdw3-00Pn=%rJ0te(8KkyaR2|pdMUq2tXUOyff z^N|?pF_Ap94!!Ct2R>nHqB| z0y*5vbq9m+sk7x`VCgB1tXmva<*i@`#0gMoS;RYkk&lVV>2ONJv}-)9B`EL}B8CkDYpsTIl9kMOY|9_!FHQIu3W1r+Fpu&<9`u<23yW=0 zAH*GzPUMJie%fb+=nLVEc%BWDjNpmob{=ODEzb6s@`%D_68}{7YU^=%V)ww6hhMZ} ze}vq-wq>Mpro&4o4EfE?Zeq)^S?PvH=?J3Rjz^O5N*I9c!v%!SL)5YLJt4UYBEHSO zz;hSQy+r*?hA~pLlj=;=Pp+H57LPn^7BclziKEI=Tsm@e`nEpwTDj4X5S*$ct;ukU z(b8Xhvc`9!vox?uX(8M{RO{N+Vgs!q$O^c+m086@3dAG47d=xPl7?tX!i%PHlNGFe zC)~8=ubT~SQCAo^GE6A|ov~u69<`%0j|xh6G34dZf!Ck(r=Rp4 zim7J>8}C-S4K^kxwPi6{JV?rD#t#bm!ZYjJVn>1X353Z^&W|%Ot$CDQqO=$|rR0$_ zp!Re-yxX^~%|ewNx%d>nH*^v(Ykx_Xs&Ff3kj`W-%DaSRuq)?q!8)K0TwI2w#>A_1=K%xP6=gAA0=z3}s|f5Q*+bh*g;Z@4 zP)DRmj<3_o>}Au(07Y(4+vVX{=0kL536I5tNm2D%uUD3YGeb41WUimsI1=S#6Y8Y6*I|I4`AZKHjSYmA{*GKcm zz_tKmp|i1KkjECd5V{B~bnfW}(7_{^>xMNtXV=v7)jD@J`#pAzQP~7#^3~h>Mh-ja zcsT^VIAd;THs%Tq{cckY7hGm`y&;Q!f1{%`d_M4R=!zLj>X_5oQub_Xa)5bWj<^?v zrKeFA+~%)AAyfrRfFr}p5U|C9Qh7)1B~JkHrRO)~%mJ#4e}r~a{RfwnH>UpSU+MDe zw>cdj6zTBzoXHDwp^S3~`mW%UeE&}BIirFYd`%1SDt*^RwtNIU*5Us#IonY^RaD2v`{*Pt*4feT+Z_8&&m zuh&8e7aJB~*vV4$i_tY*AH2)CH+H?#f7Lu@&<@Q2%F8wYAd zs$`YYYKGvteoUVzMbdUo%II1P~JH5D?b?oj2Kk#8>}MqL`whsl23s{>M%`lLIlTr7=njqEqk) z%uY;4!_0wpR-qp!S7u2XwpEf!7XI(Jxy}N#e}KT`!*+ZsoEQbG0-F9&xTlyQiV^gTj|?twq2!WP({sCtah!##9-^&%Cxm8Df6 zlV~x!7!f0$ZE**S)AO+1yE?DZWmJBp)?0hm!*K1qqshJOxk7S^PP2cF!w&VrM_;5w zUxkNp1n6N;Ofq&DU_vxcFrEXbi;W!~@!9VA%0|c-2hK6#i1X320j! za4Hev#qv01`LP@W*>mlf_N2D6`cX+j%i$%|h@&V9sR>|;{_e?#^I8~-*I0pRz;>_p z*f|bUopL+Gt6M!3L;AU!4Gk-g4mhj`azvmx9}5VQlv%jWF-vyrVHwUir}F@wAvC33 zV#?}9amd;QXSd3TtXa)M)oJ_?kPI^X%JVHI&5^LmTOLULgy>Yo0p^;~WFFK~IGI;B z@lFsVy7RfQRYGUVa?#AyRA*4I->m~RCtD>s-fXS}@j>0$1}SdYzLyB_ld!TKFC{`4 z;E8n6e%>2vJg3Y)GSw2p0jru{NyM$KaB9HG@rIFo!z|xY`Fx(^O1{Pn?01WJ-$4IZ z5Pw7JN|=B{pisgSiCgR-IV#J<1B4bO$I~gl$i;PY;$97P#?r5_h7gBGa)iI^66Hj- zT@ygKUoZw#K3R*&(sKGSw*xf~(@4-;LM2xT6E!06EyTO|>=vY1&kGnm&l8rZeqGqZ zd^o@{c2#nJ&b0|iXw9RL@_$3SgeTghT5ik2!bl8_#S0AjADeL;u1b_cU1Yfgm-vDI zS0YHK&9go7Pk%KC{lDjw`!Cz)KM_J-Rb6c~33R_O2sbpf5fD-$;d(_8LCl*n#Fo|o z41{$v$V@9~&Ixi&NjFb7&Wcy)=Td=?tw`TtOnUd8d(L<5&*y1Ma%Li%$LVSAyA0=D z?z8Lbt-pW%K=bQJ=#Bc~T(NMNIN)%@B9Z&h9TbGf!fKAHAqWVuK>kjL6-F5%HWJe5w}}tn4%EXM@m8Kh?8^|KSlK6$i07O8$zhRK0sOK9h z3PHK!P?AyHVpd=O;H3Mf`YG%>wKg`6%u>zWF|mP#tPxaRV(L+y8S3n79MeA816Vm5 zMhZm{*)yJ!ZSEa4W}cnd>gqgPS{3o=SiH5OTRrU18nlH?{omc|z zI)J8LqwYM|0#@*=_`9baq;u_;ooVQY1uHu16e6;Zi6@U9?oVcWNQ?3?5p^@oSJYRs zdIWar)SjwmlDSXmQ&Aa(hPb!3z}}I~!9EjH?x75dDHoj`m$ql4jAMiE=^x%TRSdWzaULUafGFm>=J$&y3W8ePSFYf1p1LzLN&)18(nt9BjhkU>~%S*?`?C&2!SWlpti zvsFw2+n!^7GDA2;7BS~Chyx6vxs`=oO(X@7RjYWIW62L#UuE>_)DUny3N>n9FSK-G zRt)2i{o@j6^k^gT-ZT5tkaM%8K|a0BaHaFZ#*jrYya21M{YIgAX2p~?R>Wid>Z0C* z5thSm1v0}yjx(}Qo{IV)8(@=*Xb#8MB+V*N5RK>3qc4c`=|JcgO%g@H*GB8rTj z#$99T=$`Zk@2)XzghDUvi+pdCihPgcg82h&t_NJ_6AKjgtsulp&ye&5EKPX&FO<`y zdw?WTHhO*?oSYRS^EVjTZ>}z12nvixBBSSb?hi;iLlkohvqNj8D0EWbPqw!aGbH9e z-J{X`Y{eMws-M5$_|UyWD+Ev_&gEx%Mc6Hnn?-bQg-O^i5`jl=n?2T#5ciQ=_ZwU=WIp(egc#zXq?N`#*=*26znq=QHMJpT zgM;>jIxU9${b5Fhs#fLFP*ek--kIbkqlT*)ydbg)v+rpm5k$D19e5)()p(r9WLF?8 zofM&)=&Xfu`WKbiwfjf!WoNMUzkIXqKeqFj9R3&ItRn0<73e=?V*MXP6#PGViZVwb-ToHh81$nIK>{tT= z-NI*HyR{cXis`U4VvFS}ygM$(h${XHdvcn~h5V<#eB8dWSCaxAoPNZwuF7Z#a)TX% z?kQk@8LJKE;^nrLJUNp#bq+d5@KP2L$jc zO!}VVP~-CD*YoezxR%q{)JC%B-sL~7^iLSZUugvFU@awflD_%E9S*=~Z#UJyj%DV+ zA`bm74f25fH7fI-E~_!=9!(O!H+0g(laBrwx~+|Mo@`?b4@rvHT*qm=p^{N%r5Jk$Jp!_CoD5}7@8tOap&yKI z$d+DVs6Ar{XWeLAv|LEP8ysL?lv`hIdLLjj7#(2k6-@=Q-t96ovXP8mt7}T*`Wj~A zG|L9EMz;vECgZa(~ib2eWSPn)3ItL@LQx|5bO4wGHjTw=0;$(lLNP z_WL(mdP-s!{}?C;$i#oQyp&AMOr1>a{+}39C0%(mMdY7LbvI+QLDX|?l)eD@` zJ_G6LY}gjTjJ?|oOD}`BYWD6Qx}W=4NWjp(ko4=8ALXUe0kxwNcM?(saUGbYX5LXQP!8S5%uEV=5_bn$Levp1I{sH5# z^%Wsh&ywMeWyY1#l?U5~klTW-NJNH z9MHx3G0AXyz;Eb^Srsfh`1Cgq(eT7R#a=Tlqn)HyA{7Fl>(-GaHfZ{t_tx}^O&)oVB{B-=! zFzpRr?M{hRXB6x7p~rvA<)vDTC%;Dd2XZMvKp6fHisXOjur%R)bWBtJ=9y4(W^D5( za@dw#kd@T2Wmr;|loXeg$m&}rJtxd_bWf6Jw1Ox7D@k2Mtf3Jeo|GC+MJPGUP*Yvo zCMmU?-lZ)ij2f+e|?D`%3)=X^=u_TBEC>z}jizubEtz_Y*a z&zvCBDRxAg4vT{V@9|+tVlW3p^x2OCS3cRRW1RGSXCetpPu-zdfbR1l7@w)Iw0m3l zy@!F(sn7S?(7O+&f7rXnN*K#mQXJi%4w$-w-(uzcNPzC!A<=BWDAI#CGv>jJ(HG3$ z!Z;#rk1A~YBLX7xzg0-A_h|3}s>F9%?-@u<_s;Nt)uN@ox{&?`>TA5q=R8a2JkSyO z#k{Gk`d6g?ZM_%ZpB}Pz>2rU1C=K1ay#IT7y{Gvu0N?j^fb?F3ly-!$0P{@34~XXj zi}$HTMdCzZ9FPQs3@<4P-4>7Z(IDfOj-+q!)u1DL_AcfZzc6m*mwHyz0vMZA^G~|$ zaAC0QhQVdz|Nh-#U+9;5#lY_?v)DVq!y~p=ddYzCxi6R?Lq}Q|rBbA?$+DA(lRAwq zXs|YBbReqBmMjBI3QA0MFjr?whO_^12SYX3@amwpH|e1LHv73A+n&$H-W(St!M=^X zNlcpUhnZdU#WJQY43;yLT$Tb1o#rpGP}9&3e#wTiJWJ(_uu6wRcgq&~qToYD;n4m8X`W z>h|OA-l^;5Y{0XWY;nJeRyKuPt^UD_(UZaEYAZ9F9UJ{MfY_mJ(5$IY26>lMM9=yD`jQ z<(`R%w#;u9Qt+YmE>iTuG|!S(q~cZAr1FDUbl@FOTNCN(Zsp`Ou9g}@cU8Ta&ie4D z@A2y0ZIcvZmc*ucXvoGaX1365vx!2)oFWXF9Xv@+Cp9=7D^}H=8V8QpQm*LfLpV)~ zz}C|Lm#8n=omz~zE5+f>fr(R-xA^bOqn(J?`^#{`ilZ>Htg6b5@S-ROsJ!oLben5o zlXZ|NFg(sfN<2k^9G6*gBH|y_w=SrIjwI0gsn(%sx{G%u*$R;a1$(yQQ5p>E%MBMN;9;Y5)#&*pk~-ll(YikLtAwyqaa%Rxf1{# z+o@WbHdCk_gQ+ErG7b-U-m@D{B>;08*MqV8%HAOE>+Z8qde_FqMAg=6HEnrrcTa;U zT=q#VO*_dR`YV&37&0y!>EO(lInE?$@sTZRY5@te)(5fY^~K^JI9XTQ=+XFsd&qG& z%_hP0c&15qy&I`!mWt<7HXV`ercpMkU3N_+s0g^RmT5n-RG(g2uN7d!LO|R%rjeS@V;aXtVM86zKvC^g3fwl& zm2-@FC>WyOiaa(`-y8`)UH3w6Q_(k1gWEL~JPUqsSyLlrab`Q4KV9$%-480)P9!F6 zkIQEwB*}ruwG1q=W7x~Nwjt_(LOF?+PETB-ye};Qk8#N+vt&Y1<=`mOGL;Knv$Rl2 zRvd(1KMp8Sn#uuKGl^O*9CkLAJG%;d+k-(C^CvOo?qP*HUQ~eSVtbJ4MyM1oP0rxO zgC0IUx6nk{gB}`ZX5*B*h>W;~6mILTgkXDgh<-R*Pc|NdxPq6G4OSd==jaN2FA~L` zv3iRd_?A03cN^J|&d$Mz6*z0P+DIm>LLV?LX;8@tX{YD4yq5YIxlpLBb%)q&s`3e; zo+f=Im!bs`#d&IPVH6Ir1QTakxtPps ztqz(gpN2-CC*doKRuT|Tt)$RU6jAy(ORK&nEZ1&pByS7mtdzEED9HpFf!W&fsW&G= zTAr~Popp>8*h{F6o>DW){z9fDHGOgSv3SnNpYI*Cs|P;s&?o666n?XyxDgqp34@C) z<55O4?6(uC@}M2YSJh9;W<>*okWR zrnauR9cn)cqrNbz9`TAUC=U6<7j48}N48pn9cr5%t~NcqlI;q9cC$at!Ilq>hjKbD zN6zhyzs6wzp>%%gHypLI4*qS=_*&xn!F1-aFIFvioqLpRW5`nKFo3ROq6Mu-6Bt<9WKoa8wt=20O`<}aw@2Y2z~9dq=}0oY zJUHCH8HH3bfG-)mF&`Jfrs*jHg`Q=cPR<3K2rAuYmO;S}=*zTM4qZ`%R3sc~=Cirs zev;caLGrQeUy*QBd=awag`27m(yr^bTH>iMLuRtb6V|do51c90ttDRe3bH2ej)qfa zN=fY;DX%A~5hhvPCtJ5yd8f8JiB%!7N5H_I$ZezX{DhshAa$#1SuNtx7|@&EzI;R0 zcdSXP+4JruYSOBrg#69awK_x-TGOJJqs5hPXB*f@T;tHuixWy`P2YD?rg(Z>a5f$H zt=D8uqV0e1kZ&ifsrvKYsfAUo*jQ|AgFxflRS?5O5VGwPewv&}yYJ2;<4w9{WEP*- zI@b0y+Te=Faa-RfJC`6vk`3{lbEr8Ahuo@}yr=Spo^9H;-0U~=_RL+^1I-eDtO(ci zE0gQ88wcT_W9!_3YWL_Xd$-}{k;mvW?`z20)5#b!QC|MBw<8As zOnh&gkdJ`pI|zYiKqAp$q(u0k;TIy|$++>gXAn&8aN2|W_BX7QFY4Y&7wPWwjtKRj z{z08&?2AbUPj7&A3U%9qEx&6=&fesEn=XH!ET20rOZUt}S9m*e9op6o`OHtsiFz-i z->^O`Gp}#$>Lgokz(3pKA}^)pRbam56)*2U!yFw2PFtWVxfQmFFKWI`K1+&2 z*Y0GOjDmV`v;gJw<*!)yBf>zT`H(;izKgbW`9}j*YaJ2CHG?iof+V$pu``m!SDINa znQ)2oT7E#8G42Cfrf1H2P#trZ&rZ5IjS%PKogPmkNLtC!;FPN?<@gHqO|9bQMf~sb z+O*mwhqY=?0fHlJ15j=D^a3qL2Hrq1Xk7zHvvVA>Ww+9fEy8~DMeS{&z)WT^O1I41 zo3WD`3B|3j5v%z@!53!0#F*L`W^R6INWW0h2rX02RcVsIl5WP)v|btaCqC=u6T)vS zi+rpdHbHI%V1Oaal}qX2+@Vm>rpUVvt~yoU3VISEL(%|T#0gxd!jiI~^1jKu$H?JE zVKL#H?I@CD8Kd*Fw~v3Q&}(JZLPrI>Q6oyts3&%wyXaGAru}T>ck#+1e)A)pb9zoH zJ%F0d13Bw!w=pQWEcm>3I_w~4h>tKzqG<{GHV9r6q6N9qZCp-`Cr-rxM zbF8t6waj){Z-?Xw`p0*?Io6L3ySM+%@|MV96lo%tv;1!sLMzb%iT#06cd+X_Y{r{% zuIF8%ufSQv7kuqE1?x*)hWj4tYkO*7XXxq&7lF6>Tf?1{leDL$<5?>kBUR!{ z9J9VRO-aUqKNgKRT}SJ-Jy(rR5BH2}-k;idw{uV})d@xAl_(x9w-d!`D}-#|nL<8R zmArwhvcPKV;^a%QX1wp!SFT>Q0NZi-2ja>%eac^gx#2xl|8LMGF(&oLXr444(r8pB z`yb?4_`YENQ#oJ7{YgGk=5aI8FBG(=OL^prOh~2j^Ccl03V*0Ys<2{C;`-^JKUSBq zxqyh5ixoZ_<%GIR=zua>sTgJId+#5w*`7^S#Bk;d>G5FEslv%p%(NyDl_un;6V!lY zR2>H6deKRpXH`D&KBN1YB9R}DGa_1ZCPAK)3hosP;HR=p#r1DhGQ2-NUB4DJO91g4 zG|rNfGoD_(NW_bOxqoE9#3h@DidI~WF1qL@lnDrwyv3l!iQlm)@04#*J{J|Le$Lx~ z74z&DNAw3^C&3kiL9!t7XT&lOg3FnimIPVWj$2wLKvHw+C=2%3@$II^jzI%Qk37cC zyTTw(%o~J)AF;I-ar`wzSF<@ueN_=A_;psCPqn3n>7kjF#GteB+4!XHSi+Wn7H|Em zMa+EePqa#;0?|HQgkn!8exiOyolgCL83#)=Ai*_3X`MJ(XJ|Q(rwE@&IZwq{r=xR> zsvgZziu-MvgV(T?-j*G{Bge~&(gg;;guqf zj6>cZLz?&7Ji7*ESE_3bGCO=_aMk%2c3~M4#XG_(VE_SNU`tCbVKhQ1c!qh|UeVLC zgZ4&I?}0!Z?B$o9jqzUodhJT0e5OS)Vsx@Bb%I%R3MQ^Kd`t@>YY9e*6XNNVs|NWN z4m-)RBwozwEny|ZCGDzJH0i0VstPoF=J>>!V*@S0o9l&6{)1ogSWD6C&;>%hfrF4g z99orzX)6?Td%P>5>7?nIXr*vG9t6&ykorhevr0lvJ$Vqyu}g#~vmB3R{%D0((3gxE z#@C76KwrPARiO4gk*mGZ*rLH2UOl1+obQYp@D>Y_#nn$a6;%v0?8;oP&P}D9P~kvI z3;Ijjc=KAPHH`N9$d0HV|AUzIZbpNcXw>KfCUw%UIw`KxYTA&&aTz;IN<)7ym+I^tTv8Q3QywtKWZzZQ_ zl(R!FqCFAC`3B=dno8aaqGct?+c5_U6f`R!!^EiH#j}d)cTY4#UmB>(DgC7&q}@zf zE^8UI3lpb0cR%0}2WtHPqU@cbbnBWl?X+#%wvC;(oln}fZQHhOJ9pZ)cG}p zyS}O#e~667BK}W6+9k@u&9XFR@ zyGI$&eMWI8ureMWeN#-9h4qB3+nkOQ7&8Er8Vh)!&0SVo*$%p z2>4|qcwtW+qw~C~r7MiOB=SgL5wLCt7tNk5v7Y{=W4tqLOqx672J1DOHSP}Pe|H|0 zm;FTjzq*k)G(ZTu#X#C00|EuJGeI{nao3wKKkc?(?1O}JlT^aG`n&e?{>g)TS3Di3^goc zK;Gd{w&q}gj$r0=A#!{Az>I;D@_y@jD^=WSh;YIVd~T$0`+6<5Aet5MHn`jZmk2zfwLUuAJJV3srtV z88UD1E7RwSjv#leo&8rq3B zK#J^G6sXjPa+C|d?Q(~T+qp4DLD3s#PM=aY>eaD1Ir}4XOmF+j?GW^>0QJ=nb1%wy>3X0S=Eixb zRr7a*U`jmyn}dKr&_^eC!G7^y2Y!LES3-?D=sdpj5M0fMwL=vIzCQz^2tHZ2-}ymv zRBv=an*>yiJduv21rCu*#u4O!nNbwd6B0QsYznusMIHW5P=x!dQ zI(*jlNUh-2GStD--U1A(O1qd}AcYuRI#i91^$qeQF|$!}M)`Jl z$(qM&mu#fcvWRSuE`lHo!c&VxOIp2( zI2LhC_Yv-IvWEnd+}m{$MZi0Me4R97#G2@)#_rH`mm;SSLwt~P!7CD@4tPTNl2RRbmp~3|^YNj; zi<~88epA$nG|(rwAXdSKJcViMBok;AvV)gu4hztCNJoQt*wJqm)dG6~L^wn>b9A+r zFj`^;E&nY1EfM!y%^oy8#~GVDo4^-nOL$V0SIwfkI1zHxGWa^o{_9ec-XBWMT3I3) zJxa}qY5R13oi@vxj5^%YIgKXYtV*U|A(sl>zdZFwOwIUQhXE#X-I$^R?qa1Dqy-TWObd=Er8rx}CZ%O=qwqcg{-q}<|H zwP^)@qEJeydWx7!t8QU0Utfn1seN+Y39UBi0Ro3w9LO);>$t>`hE=Q*{@BM=$xxu5cdd<`T$ z`iS5htjMG)7Hog>w@u8YSLI3MXbumVyhAH6EEniw9zG-ahnh)?T4i3{e6+&+v)PF9 z^JRt%g*v0B^=nOA4Um@ML^+f2rz{XMXYK-ywNyN$`gQyN2OM)U1%$SQ5Xm|DZ9d}Mp=*?JX8Io z|CSG>{ClXfjd#pjFhndM&=LQu`i@P}=(#6~aX*@78{ED64W*}ih{4a5k`s|BV~1^M zZ&=0zL#u~V{JDlfmO^k+Wd!6C6nVY|9A0lQUCjsFfc$UhP)Yv5sTsP#@EW?0=qTrX zd`kA)%=*y+%4BFcy_p!lTvzz#vnKl9P&@WFNE_uI{MzAyXPxE`rf!;)f=#1 z#gMhE(AQ7{C0d-<1d?yysT=|Q@j_ONLjoa`vWuxI|I9%IO^C=&?H^2|2_M;O*if)h~ z7BIyA$Z%lEuRb>I^fx|eulmh^uVzSaKcB{BD3@kiIJUq@9$nx>j3?s2zH`iQ>6EUV3YDRM$VaNa-bs0cv5$iYxQO@n%yX54;4OHAJX-(fM$&K z{l?E2{cn7f7D1RnRTMOwB}ry16)U@C5=l=L6()LA1(_gam8#Or*7&_OIjv|6P=DI| zs+eRoF^vQvw|<3DQ$|rlWfhmctjdUs+VuXK0+Jdu&(d%zjoHH^yODYqh?`R~Nl-DJWk)0PmDXmc@lX;jVqbf6GzX+CKf>D6Xv%M^Q~uKQj1&8AZ@*(-6$U`D?9%~5RD+lsTK>` z16(-N9)Q-sG7ImOF#j^iT&i5vNzy>W@7^@DSX> z!R9pBlqM-H*he4riOmFqy^fa5e(vR_{f8LMWB~PCL(}GFO%>lu#j*+yy}Q?!RaZsx z@|0zsxn(k1`RD1#Gwx7IQ%iJ?ZHbOZK3_<+wlpo0`~(R1l#XvY(r@oZg_)Z7duUNF z1)b6MzcVE4``URTtM8&y6wl;U_Anb~Dw19xtK;B`UpA+3Q`2*}A^Mx<@t$7~q~Q0( zJ`Gr&A+|~6nF~RhA-zXc0mww~?9eZ1@ORPFkF`wr^ixIJ~}K)gCS(%~io7 zFGN}IQVGb%CS;}?V@jtJGF$q3Okz$DS1+kSIgTalerw`BQ~8t1KVP@7(avlhV@nLY zUk!cJJ$w82;W!h7JiaohC1qy7WLNA zGUZp_+Be4|fnIx6DUkZ*XYDs|LD+i34-r504So5Ytp1a-LfG(sjr?q-LU$J5isF!9)xqnB{&TIpR_01MN* z%dfZ&9^B(nIdO@z4bBk65>fzn9b|N?kF^Rud_L`*? zkSY#@GcIs}3wjIyo&sQ3Jut}#R54_b4-MslPuq9VjC4L=LiB_Dgq9&eoEwH+ zChdV@)C!p?Ob2^*v-ia8@HTLJpveR2)TAYbV^z>X@_6z_0bSf9Y#PQ%gtq1$wBm!Q zNk2%nX?S1-)RJnJzko)MPB-Y!AXuAF)UZOWW_}HL4Fo;oEKrfvU{Q-8Jd#j$egrutLKwd0&4awXKm{)sodLK|>0tUC_J7#tt{~ z4(Q$BP(q5I)ZIH3tn&>1!pTYhs|p!29!sr|N|8@P{>Yl|#ml=Hn%OW*+0y6>LDz z^6(Xsm$=ZKwNNhC?RrM8%>F>)P3B4&1At)D)y8mviRz-_YJSmJ7T4fX;157-QgMS- zSKxXgnY{+M(<62l_7t)ppz|7L=&~GS@TS7+Z&n%Ami1-Pl_uk12~NtuF(Qn+4zZz{ zsKH2rbl}5a0k0j~WjGCN(nt-|@<|3jovOa1KD;o6nIAEKL5v=}F=VVl*WuuTIwm9L z3_47R<_Qrvl~q$9G-oVwO_wR*$xp`)<7qb#hNyH#4{vAhhwESJnMLL9n)>%Zrf}u7 z;6r%N5Et(MA&WvyILk~(b(vU9bszST^2NhgzBdHmVO)of>NzyA^NP<}ZCEeWQz6KB z7<=IP&4atM^498miL(+{#c;P*&m_lR``M{?f?ZiW!= zls-dK^i#lo>Ih=Iv6C~{ z1o}@QR5PQl3PP`PehqXD2R*+6A3oC$zSj|I=AxwS+kcmtH(V3hVW0$zH;#p|ciI4* zpas*+07^?w(7DmY)f_dE!&A$;&a%5^Avd5N+eACF(fnz2c9$>hLX=uEvNO;YMga15 zL)pD{I-H%UAzw8VlIWHkou^2$=FvP*E6XdHW36pt@*1nPa$4tMD&2;$Yqoo^<*tM0 zJ;Pk{QUZS{Km}TVC3dqT(5h5TI-hmUIxJnYYIyH>I&xJ*wzTrkiwW*&|C*k&ROkG& zGp~D8a^E7FW?+^0ZGy-~5Tb%I|FHA7PThT10P1+a3Mc=%E!&vK{aqMKUgpyCjSB2& zK5g5|1@%J&ZaeqPZH#z2U^|YhWoh#P?X613HTP(?eZSiGpjzvI(Y+chpD>ciBRHFi z9E%;?>6qcqb2RfIpNv`X=(qfz%Es>N>2@v~J}CK(HL6M2>^Bj+#f_7O2^8;a&-mFN zDulB|eLTOMZJxPJ9>GrXuNI^CR(i-kN?XDehN=wPz(<|^7QBCdM!up|?n>+shP%Xq z8YqRXD5eOd`;L8^0$(R}dggE#uSgJiO#BIS4L2ss6-99rv@#kN;y@u_DVHOJk&r}* z>B5Fhhv2tHpgPoILVAn92v7+;ebiR>_>EwD<=@Uq5*{C7d72atqfX3{Y*7bBp;+|lQ8}xeuB8)a^TVecFn(N@+2m=+VAj> zhn+P+e-51QXw)F~RESFkwlpDrN>L_(2~|!UGGGGv@L&u`i-0Ka>0`JpK*f)P13N7! z^XvjW?|5oAHk!#k5o6sZRa1InMRs*2T5}gc&muto6d=nS1E!0W?4mR=$NJ`5macLDMgr>^gelNRH6A3WK|7FB=1Uw8W7sH`JD#qn$@*6xEfCowrI5v+Wq$ zmZbBxR)shY+R(Rb%|`*Wa#6HSQBtiM9I9w%zuC{XqG)&8dL3Nx{ETokDdCI|S$}z9 z%>~X5r#pAuP||PZ$gXK9-9r|k!-xY#je21b2Pu+l8pc2ki!C6e4h0;Ep_xTtO{3!i z61gzblEN4;F$Z`YiQh&`=ZWirW)7XWG<2cUqiP*OJ9w~v%!ZhzDf!!mJCC2a&)ZcZ zk;K%TTES+=K(O)06`vSN65%P7=?KL*oid%%#9$6|>4paJkl*rq)qS1Nb5Gxo#js%y z?^J%zT}+A^w1Co7d~6_4nO>l#dB&di)B7h#5_$(OGWjX%LRPIqh>kEuqHh7(I+(Ru z=S3%hTuBfTVTy)Klp8*vMe1R={`Q}!1N8(ODm#R45_F^`ym{uj6Y7SmuG))M)UQMK z3#}uhvb~Wj!~6S+dY%ZZ$Eh}5{RzZfT|CxsT7>5uJ1CnSW=y%2E~15{cZB5{sb!Mh zmS5}w#faiPFj=5hdXd(T8#+*xIU7*Sh$3wi8{5#Xs_DFPAK?4#$(7u2-``E2(qFO^ z^N{AWRxed4&*56R?aC@=m7M22BaEfS;QO965~#C2NQsDc8?1wDm&Dw`1-o$cj%2HB zU3qiB=>@JLzKU?DPlfcFsOUDN=_sfgsmCP4C$xMM$SR)0XT*8Fr_W`;mr^1CBuaOo zp|qP(;3uOTp|j6)4@?Xhf70%N7k6grG6e^I;I$n!zW(@4_^&c{Vy%%Z8aNQp@IOZs z|GkVY?df7+ZzpW$@*gB@bz6<)Uub?Huv#LDn&PyrC`xFUzuR8aRJBVKR~Z=58$?!k zaKm}abGskg<~Q4u zdq3arxBv_?(NHOb%Gl5Ipy-f!Q6UM{RNTiyg&1EcoL1Z4jglp(?3I zaZ~JgR5cCWbZ2ke&wfgx&L%4fk#r1?(w$n=c=ckdX{qp9FTLkh1qatdP5V7VBQ%)Y zeGJai$(^2au03jfF6?8DgC$4afe${D_juejg^jn{uJDyg{*h34bX)}aRccYX(~U(% zDb#Nq&h@MZ6|Wx5IPpZ1cHan*)2`O>pBF&|x z+)ky1&G!DkiB+((T>ECPvsB@X4dr<3?2^<(RWF;4nB6(l8C~Neg-kUNONh2%t%3yC zD6w?hL8K&OtFPP++Rhjk9O_<4ewjMf7q{`&! zg+SjN!OmF$LgnW&Jp`G}YH&~Tz`f~B8%hpt(W1^!H z_~5Idx)ZyAQIJ`|xG9L*nZrU#tqX4s4PvIs^(ni$)?{jqhe2GbJy`tN4AiamT&%p) z8zYpcIsVZy#n2R=<(Ekd?LXDBHhre!pfZ+uSC5owa=2vA)M<<2u$Wme=tSykpy7kk zjMTBF!)lV<)^N%l^u$M$^@+Y^d+Hy{Ty&r+L}S~=zo+~5S7`<}Ptu{IZtoIl{5*td zH_e%8``|*2yS4P!cjaQodlaW0ubO6f%z5(Vgc44?RxP@go^f=)bzrSl@05UaCpz!A z(TRddn-$W2Ux*4D_Wf`SX?Sso4iVk$d$q6Pg(??m(Y;AE;l8r-w8Bt3pzUPKp&~0| zN8O;lx=-I=Z&A8mfW7W=;ky32aCR(egi1#xvqCbdG&hAO=a8RhcmlOZ)q1) z#={Wn`{Wk5TKTt#y&If9+tMRwOoI3gFBW2E08IG_IU&?)ff(%zt02=3@ZMwrwG*>c z(*V&aW%`j{U^zYoOal7uAqjw>fBGum!;hSAq$S-szUZr&o3Bg$(S&*!!@45F*YvFx??8+PPh`8aoyNCKzkMR+^cWEii?Ynit zB1y9!>ok?JQG8udqVP^dqWx1~%>^mk0WTsASNtne5XyNPWeuTfj#!rraroFAD*aC- zJopeo_-Jc~o^E~!j^F!#;;NR4vHZqAJQV>30%HE}xvFMoV`*n?YVvP7NvziF^KjP|RbLD%4P zHAK^!I|8${&>9m)>FKJ>CI`y3;0{?q$yfH&61VQ# zLx&AEJ&BdJHd6<&_nj|JIBd9g=$r+r{^Sm-E+-HVk3IwoMc@uNG!e%Ey^#^GhrENaMebLQ9PW4e=@i0-PmrmQYGxV74k1el~~u` znF%MBic%)bNG9SrQYMY_L7}_b6Nwg4W6!338E)BGCA}P1waMs{1(^|5kZU+Qt|808 zPdb!|lKXl~bsch%{JJY{)TqP>r_F;@CbuZi2mwq$gT;%j4Z)>9Fh>6{ZkOCq;rd4F zqwxV6r1L0)z|+GEp^WQ9C!w!P7m2A)Ro6_Yl_8HVzt%q0_an&V{9g8E?d3;xJn)S% z%$TeTqtrn2b>2YOVXZYyvA8K1U68DddnR+k8c6rtMfGS#(_Gq(7)!h5fqpVUL0w@D z4&wshVcqXj1HCc&#yBzhM!!UZcHuPltuBtI&`kiSuk>8&Mhymy8Q#ZL*@&T{)Omj3 z$W<7w*nj5ZI-#rPYi>x2PTIs<2Ke`qT}U-NmkUs56bRgDS)|+bB8_)8tz!p%b{O;7SdEe(d zGQ5RkiDi0>uvJfR*seEi7Alj9z`AeakR>{Rrnu&(n7AOOb4xiTg=d*-uCI+{){Bp_ zm%+Tm!~sjIC9gY*-GWss-hH_qaeh$*`{Z<(J_%oGPuZC(Ql-q?UD1coF`%U7U6NXH zlg5(PvdwRNdedBDuCiKphd7d@C%JvSDE_@b_NOdN9&0}ZR^R0_{hG{8(LEKo+48*M zbu5Kz(#K2IC@IuIq*mLkB@=&kor+Ps%zo_QSVs@c9SqOHXX?7zW%2l4aMNtP(_e1{U^MW%6rQ1TR+ro;;$`Gdd zNz@YN@Yj3bL<%bT+6Us@;$5UrRe{#g7Uv|!pIb0=gcVV zWQ3*10jJ@peht385~T;hN}a3qDD*iIfl{1 zU78h4BW_?b4=SI!0lhsD3f5m~aHGwd@~76DEbPvX;@j;!_2G#Fna# z6DlNaXom z;>SLoC-@5-MhbdlrgBM_K%yw<@Bqy<6|6xjS23nC-tj~Vdu95%L|=n{O{zMyu~aJv z5YQL+fAL=Zw@H<9`Je2!clvk3tIC|pk`UTA2fUn4@hHq2C^}WBWpEP4J!b*JcgCzL z-vARSTxx8@)^EC=7twrwV9v*JtXaKQjd%Q_P5 zIzESv{fmZ?f0mQ}7X4Lr7iyZOU3brC-*a_#>7Ay2$5fKxrelx?5ic9W9B&Q!6wB%F z#KaIwFpmO*XxCwf55T+mcQ1Lhc5$j~shv)%>6G&bpRTI7mZ}Z+ejfTVKSb|U*LHTj zR^OcEc!YEoFHC7ytLu~j5t1mKfhKYH*d*axI_xza@ZNTn7BFYJ$XUfT!MNTDeAsev z*i3tfTVEKjY6&g(_`}XZMc-rE6v}TL3xqJrg-!7nt)vH<*diwKumuK^iuBRZyf~ST8q#p)FrRkwfq7bwnXHq#%(*Ju zZHgV3A5`1K{@v5M9W+J|TITV}7)hH;yz@ds!7 zky|FAJo!MdaV_0|4(H$wEae$w<*R4xy~0JpkHEaS`DI2$V*?!@$4Jk;v6Z#MqH3Xv zm!_m3^E;q>dweiLvOytKG!!WN2p+Q%(1JxS5r2$gVoPv-7LE^vz^}0ToKxBh*ozM! zoYX0vW?vgxPFyqVIpH-i1SOjd%u>+5TQ*Q?!|^IQM#H`D{DJ6J>;@feHV_7)&kt)Zr&NB#tuESY&bfZXzV49QT#BS$nCW6+`KlI?u^-b zdq+`OLJ6I-uIp0slK@6Qxxcsdl_}F3c}flJA!ipLQH9x-zsjX8vpeX%J0x-jv&=5m zYVLBK2q}O@OO*4%(|zo<6?fmEkrusl+DPXh9PuyTSdig6Y!8$Sz`3_K+!@ZmC)%R^ za?P0=U7}40YL9B0%it1i;J&lBFZwYKjnkk5X(E3xZYJyRfoBK^E$`slV_Fh}3|E?$ zFwTDCyCx=l9TtugiePOGFPOekIImNJ!4MRwE}_w{IE*Fb7Mx7<5Ic+G2JNdC*7;P(Ue5U@io0x37 zv7c7Vn5;p0VL(xsTn0|tF;j>wcv=_=6wd<5_uFN4ieFq9OA-#nooX;_)#3r`Hrk3) zwI~I4!2!K4pks3=?eJ^Q3IXnyJZ%ei_@a%ZexU0E+okDu%aCm_WLsq#`8Ja4?R{BE zSE1RRchmvj^TOn>OYX9VOHP%`hlndx?_fa7J#`iOh|5Drl{)DIae-+16AHSS|6xhy zmEFOzNm!uSyy{-CgmyZn3CI#~HG;?-IO3^LGNTe=}^T!A-VG4T=ZklYH z7lg1A-U+6am@Vu)GMW$J_lVX5c-^A=q8jD*f!4{qGA-cbSh*vnT0fBtzX4e*lP4fs zQniq@u_`D*(NCmn>+pyge4+Db^#$VBDn+TPqDP=jgUUpWKVHx;LlW^z9+7=f1vjw; z5%O010vR6RULH7G9rC=Dn_B;r`T>mO31k$?(tr>}9_C1;7-F$a#}d%A+ob#!WyFQv zG$Y7A8}<3v_wK(1`qZ0Y?yy_G$h4$FC_}J{IyqC{@q5z^4s_9dKca2+UgzgSAA$AT z?b~It2qnK4#$yxfvS0SfEH=rc`GfQiF-T)xCDZWs%74)8znTLpu3;S6Dox=zfrQBu`-Kb#my&(o8`kwLnX)5`IbOXl& z1WgJak-k*nK>H7dVDm4K74u|S1m5U&OFH9A?5c*Q*k0Fwe!&0L9vutylpg(0-GvPL z-|B<^MktYgzW-8o#VSup4=W<^x7SVvA*H+mu;HBCV5*odD;v>2-Uy(DQTw zl((Xlwts3a1akZKP&)Mf(d8kbb1<4ZD;SD5lA!`U*Ga6?pTda(!VY}Ps3`Q9y&r)& zX`x&(L@(^7{`lF1ALRW|5nz=#;@344Y?gfU_sx}i`YlCxbi4Pu9)RYL@xk7YTBYVV z&7q4-3nxzvlrI}|uS*o%g9}Uq<8JUyr4!*si1emplAIf`BysS*1q2fo$1PD9)!$`O z5($~9xrkj-w~xpXHL^|yCNk(EVz_EA7*ed#IH)nzGp@yB*Q!zUrZf0|O(&=bE4e5F z5YRXw5D?k_GoAlF_COQXLv`HsdrrVbquLre#Dh+=ApqD?V{sFV3B!;i1Po@;h!jwh z5u)Fsv6!_|*Mlfj61&7@!&bLd=DO8l z`7XIMHY@nLt5>T|TXMX0o1Mw)d^+vw2wxz+dpwRHtA5DEPpDo}s6>k4=S7da*W_9FF<2kWM zC9wBw%v)#SAvL`BjyyDl^DQrR_v*)XK*;7Z7Z3HVH1nAprt!I66Y--p+;8!wA=q~C zf%7fbn4vn;Z~YcX@)b|>i8NQW;BWQDDCl<7&;F@^zIjIq|5MHOqeSi(^YhsJ*I)bv z6~5leBlZI7^AF0saeoJ!V>Na>A^)LTaTLwMhz5D;p@v*4g%|q!F-5Do9yxoHq*m6i ztfWza%F?nXv1A@X6hFMt$1J+%ql^ucaF|eDvCcc*-6;4s4m^G#?7{`YivCYgC9X$nbXT_E$9k;efMjU#+LOa_~VBjHpJ_rqQIsa&TN>SMmlOI zd&#N8Vr;K5?;+#uRFP*_*^87BJ~V@X^c zO$bJqh-=x=cyV1B^1u(!AAmi`XYF)VN?htX!gdX!on0D!)G4L4E`!G<>$Ca&Vo|vs zYN!TStp050>bJw6q;B;+6B?3AUXB(%xs^Lv1T{0)C2zS9nYB{FbuGCsi35zdZpWi` z)g%^BSi5RbUb=RQbNp#SM!dvImgCutem%z;4|nweBV0)wh+u&C(45!h;B_OnO!uH8 zgbKYP(p0Zn%G=&Aa7`9h8H98GrRWG1$HS`=+{Gp>Iex^Y5J+BQj3k=HcD`5>;>}5b z5`vLO?Ae<#84m{JxHPc5f`!LsQKQL}3irU8H*FGo9DpqgzsNz~C1%5HcY;8{IlEIf zW#*Y{=z5ou2u-1~v2RF|-tvNJf6BjzawToHR5@J{OT>U!wn!Srei}ixvH@VVAm29R zGq&y%Pp?(gZlh+5Jp>-y^h`DVO)vdRZ!*JkGiGL1s%x8J3mkWfr-4&GtStA4uB>aD zxK`SAsOCGYQ$9VnNiSVb1dSm-my`F%EJ({?R2Mt7jE**uG+LUyun7!OA?sZ1cSL5R zQ6u%e9mG^kl1TcR4DN6n8|$AYiB0y6>Z8|tNY+)`j*G=W3GCb@xboznI6+ln$EBF3 zTB&k|50icdy$1+A1WC?h?L-jJ$`-AWVtVXLcEX9w5qRrzr@l75WXeTHV9eAs{;J5+ zd)wUIG`{EbLkyjP#DqO8*P!{*uLc0E(5R)!&Fd3S$h;LBx@nU5N zYb95m2$0SktBPG8m79X{c#n}MGH$NU>L4^{L}Ml;4p-Mr%gLy!o+Uba%|>%~=!7s0iaaBFSB{YnUO&&qXqu9Fb~ zJ++^6PH3YBq(fTG_PnsKQArKzx?A{f)}9rlP>$KGjJE+c*7zyi#ndEo_ArP+D5uh= zk*#Yt*_{9Pr}C%l%F`;ipfxOJA$hMiTYB!1Qcr`V3i{(99;>d#w5-`t72F<^1h&m> z=C?|L4K+)!NcAsUFdxNuEzrKd&=S#cp=I$aCJ7+zC8nW`v zfR*3%Ep(ZflQH*Jl!hXdDQfK)IMYRzqHbls^_2M^b49^$8rOT;gT4eR$;y4Y;OAc5 zr55_NG^3B!fjJ?Nf+JySRO^9&Trd6_J^Ktc7!>MLsLyQ%^vbMEUtuJw7q!Z{~X<)8(rR@9nk(L07VTuDAzl zab)8NXB<8gspj184a-s-*y4-)tv<*7r_hYN%pex=WL&>hi9&Hj8~F}`X10iDzZdF@ z?#=U`Y7f?8t$_k<-bNi5k(xj$B``{&0GtL!#kLKLGuHSSt?Hv(aY-;zyfvCqacaqm zvcUw!RfECk94sxim<5eu_yin!;-m-VL%P}>h8Ct^@BMz8C(Vi9FgR=1* zW~LbLgJcJ5yuDW6w?8D{xz=loolz-}%PU>nD z{b`>jZXX-ujN9oioUlXeO;=p|L9+*;Ks@3h_$NbONb?&Db$`&@LG>F+Uzq(NZpyyS z8^TuldSA?~HUptJ`kYo|dqQ^lHt&6ONM5@6)d-`b>LBW>b~TQB=e;`L#7cT&XmPuv z*z4KB&;sL;1{8As^1jBsn^n6e%^gC}Y%Gr>st0MyWVhr6@d`}c zhcNwOIA3UC)6>>cvpT)&n`YXI z>YEe%5k5M*Ommv_M$P`9qF=%IHDtT+T;)2S|#r}Rdni0uU%Ec%Nla~dV}}d z(CqVsE)xUR7Bi5)bqfw*g5zfI7ELcL`=2cu-U+2^=}NEDeoL?Ly7|*y!+nM<*Dv1G z15!H_83{rnyCW<*=AIWgn7nbZM z2RC-VIhF;N-***1ta!8Cc(bV(0hA8r)Jr!cWvSq0sp?_0W;7Rwh?Gxr+=ccuOZ>q* zA+0!iqc_k!-@|_g+A+7r8YlE^x?}i3%)5G-cKootbI+|cU6AqJB3$FB0}v zy`h4=8>QYG#czglozNhUXT&2%UC@v}k-yiG-w|Gb(hZ4kHe`S4r8~A4l%KO8KpR`p zL;6(di|?7@VTcVAQ8Ckx3)`%n6ii9cC97zXmM@SPTcom1^V&Cp z!6`*xL|KNzk2;F2EC>S#izlWuvHXHw`>i1u2+a%D-8Qb?#>}%{c9li>G)pJ>5|cEgPSlSwV|4@p(6J3NuY2PnOxY~ zEsURWeeU;*klwZ?5Fa{_xCdjj76XUF;e{y(4tNHh?; z~K6llX=SE{$$vQK?*E8P6ZtJ`;diiK?sbsw3y)}Fmvri9-?lq z+*iVJD~#C#fbFb3v#$ z>5EznO~Pij=%Hjj8>x3VtG5X$_-syUg?di4p199oKd9RhG~W6L%`xc%hJM$=oMN=n z{(f?ACx0pNr|hP1+SPQ5)Z+b}mJ`0(ndKaM;`njmwe@Ot7-`fgWZ_k3R-tPW>BRWa zoNv79e7y(*3;-eEH!4pvXzTjeNB%0C3Sj51SXM1&d!j&)kXt=hGc?u=6KF_q?4dUA zP08P$h-@mkSYSEFxmE!oo#Yw5DZw{exfp?fO zu3gpMx~sEae=XoS?!j1bi10lML_AWuYdKolvmzVnY?p8dam!!eupjCfy$7xB`7Hs? z>5`0NB;f@V??hI-R>tEC8oc)4J@*kUkJgb2-VvXgL#N|Agec5 zmpgY?;+Xg-b4dm@7mDiW1`z@4 z8bu!z_^I*$DEkMcSGr$=Jz%vi()GfyboP<1_iC9Juf9QsA1g=u=`gZN8SuF;@CtfB7%}`gkZmLEi*k|%jBLBp)7m@;h=!?fYc2IPUss-f1 zS=A!(FQ}ff7vv1A(Ts<&%rhu+11+3gm9y^e|1=ZQ6(rK*0~iSC4ipH8`u`J98cqNQ z2UDm2qkF2z*`qQe`O1s5X>qi~zEKECFC|g5WJ_;rJ6e>&lmLaR3;&+!#_Af~i0wg` z&tEi{r%|{R3L0wK$R>0zn^M_O%z+QPP)3a=0|b$*!XcCRQsq&cHcn_*KBl#pN|^%& zz0t-+Y^C$cg7{#~msT_?*NrN`)Hb4+&8q&Ss!&u7VT*CJyb%g)pP)CU%A|CNi`TJEGX|hzzq!=LTJ| zWQk}O0BAW#dc@a;t3;TzNVlMFqYP}u+(M2tuI0oh+a(>o<;YF*3C`(iufd4ksS`y_ z^LW7jpzNDtJOP3=XJ*ITv2D+9JUia8ZQHhO+qP}nwr$%pw=a1wxp$Yl+$H@-rBj{m z&R1Wjs=HHlEvbH<6p|+@=4Ca%GY}@|C_Y*0dw|X{tYy_ASHPAGv3n$ewF7CGGBNX1N#V4&jar&-IcgDUZtV3_ZWq{jRkv&>bswCr-o zn`i55|M1IR$M!l_wo1v9E%8J)WGd{We)&40Hb zD>^bj`9BNd{C~C}#{arG*OK{<6vi!D?M-Nu1o^r1XkzLlm3wofTzr53%Afy|g6ot@ zkwb6pm~y0guXzjuMec9-8N9`ZbScL64+6zAKK9P`xX$``Ilsi|r9y+T1)S(_4_Tnw zK#%TLMS!6jp`-q_=8hET;vZc;xAJdD!V&KmB#tz4n7tBRLdpuIRfr<_EvHdBds;R( zx6{u99JnuyBhiE!=B-n2RCXsMwuXAHN+t6>t1S}VdSjLT(SX#It$4HSS&c_Q$xMv9 zh$XV$aZ7~g^Tgv6ZJ7JDfuZi~fhbbkjWSTPgS{Xgq;*ZosDzYZnBJ-oxSI{z2N@Al zDoSxl`U`dRYF1MB-dUmoyepKP;&=HAysn4@sbfA3)3L!BtRu#jD`XOch>5sj+BLDU zBt=xSBt;B~I!N+-Gi2(3O#jFu@Attm?`MT~R}{kN-8kZXrw=9%7s7IO{o&ojg@4_V z!mP~&-F+65@Oy||a>M`-*8s_+zLee{DeHdzV;W~DdWH#1%+AKNnpF@9fC=%#%6|vk?AMKS?LWW;|DOS8`Y*txWU&7o83}=w zq6%1lDZhZynT3dC>yp^%9%oDAsDd7Wpv`Tjm#xrQJK_#*?`qbO<>SgT-pwEh&F?7MJtNrBiENKMtUJO2SHDA+ZjK`9U!YnX=iUjW{$F!M9G8bWk5- zHInlW#XdDE76-KTTpocq2>RjZFas?RmTjK*o4VE)(2o;5=&mzZ{3RKrZ$HB|71OTJ!=CaK_de*2QwS%|9opn z)c6njkNhY!cgQA7XoPDj(&f_$mAN1jl0c@W0;MnN_HQ)8)~;T&Hbm^R-Hl1?2as{` zfo$V_0(ny$q;36`=zt6JN=?h+NZCpIN&9~LxM1@&Kkho2uYx@5F~U&W-m7t|CTKl4l5R#1Qb}|kayfz(a5-%x`m}N}*ftOi zq9eVwJi700%%ZIyPYihYWZkjdSsXICfPJsLTK&cm$Y5z3&ZTX|_Rlj}a~?dmZX-B^ z(WZbxU8TLB$4Y5_ueLV-Zk7^*D1W0y?IU#w*Ox=FnsLSje<(YEY?Iy3CLgtTc2j_s zJHAhf<)}MRvGAxIPKj3l;+UhtK%GB>@{zN=--?&%qf>Jl60cK365>U7pD9&WP17rF zf)a3-c$JW9;W3uV_P8;lA9vXNGa@HPDwD9Rc)=;=rrc7vVwql-POG$fo$w4LC5AHI zfKIC#fP>EFQ(9NWax*7V&c2xMO8@6I-2~t~@I2R&6LOp+?z4^h4d~5KhIZk+HI9@WhzD{;ZGJu9t&<`giq6K#CBXc?!H$+RS|*&Q z;8&lFY?l9FC3`RkW>z#7eR<_MQ|}s;jA73=xJ6N1NFl zsu(oRj2Cd$NWup{wcd&*Sqc>Tx$ZNNmZPeonuC zoneErZL~`%emyi7h-V##+f&;Y?IpC7*V_rSv)%|494}cB`7~i~E4g5mpC9?3d(LJT z*T9e<#1v3G35l>mT9;y5+a1vfNfq-Vhcb^*s&~*6J;Ds0*J~lv#}v;C0V^n1lyBj2 z3Rt+})CA)V!JaYo@(WAqOS>v0D zU6YQ1vdyI|io}BxZSu|{^LH4n3yD3O;1Q>fS@TUqTJ!nv6+>!2#F+Vh6ElC24?gA0 zmF$dM82S*i3&)G88er{NNTLv4u}cRtgM}MQ*pPidazC=+5jP9y*DLryO6=VBg#_$c z-D-D+wLpsBo(9J1gruD`_z-qSOFqjCq6_2813&tJI^YTvo*B;N>=rp;tRu|kzvRC> zCq84teqjQBq5)nG9n29JGRT}KaXZt*F-)RwZnKNQZkmM{bRG1&O{tC#8Mw)K&*wfL zqsqTA_lIJKD1-pxP&)!&A7F7GBtk1|Hg?M|L#GRNe4XrEJR+D7YG`FQpPV1CcSnLX z&k*m)1v0Zb#XO(kqt+L3y;OLXzaZe=;RoJd3bP&}IAi#C1a9!(k#L3XdH*}B>-xaj zJN^IxMf?3<{@ni0tp3kpm7Wl~iAwjco%dHQYo3IJguU~yzX=QzX88r?euIF<%l-wh zYQ}@1%}-jJIuC7gPsmwP=<-K}kq}T3K)XL{&$v6w$#g9=+~v6KwCp5Xg1G$TxOmn~ zX1F~V|8sLxSbaVo;zoc8WHJ(aS?}=A9+17hg>rm4R7ro-PI^v1dFgC#b+mFHb~G(% zf3!|~S_$HQq^G_Y-}KNO<-ma3b?Hv2*ii#vc;oHU>2T;yt(7m@ZOKAG_w4;NNaUw; z&q>}L^JEykxsJLVm7Mya1?Qrw*`Q zjGD1gni1dnKux%!ZIglkQP|@B-zB3&bRqkyLeBoTp_!m@5%`r84&i!G`mJghdnm-n zgA@%6>y*PJp>@W3nF=@(XLizYIRwKQNywS{L`5VjcAW~Dd}hE-j2!$Z^5hDF@J^b7 zIc1<(#Sv%Ha*_9_Or?90B@}jjAn~tca^m__628=eX>`V<{X~F_^~t#*P4S7aUM_QX z9dsBZy)f0%2xMfvw9?rjv9MarOi5blxuLQ!Sz_seej=^RYM2_B>E97$nq?7GTCbY3 z6v?t~Wpv4B{WtzB`W#6rvnA^2EOhJ|G%|rFLRECehAe;Js>72qR9PK#xt8Mj;lAvr$pxVYMtCxpZK--psl2%B2xycUQOI{=B ztO-V==qfuYf$^9L**J%Eoa(X(ur*cN0Km?vu~O1@|1?NPt^R3bQQg>vPqnuupacs) zL;gfj-PniIwy&Q1bL(S!%X*}Cj19eqb(}fK__v~qg?|h>&o6(4SvI)xp(FeeN`T1* zIDN&^rH3g-C~#e(a5~PN`=pd^ay@`%aGur&UOet$=U}S?-q5XM;u=W zyl0kkO;hjr+ol5L4!+kVoU>B)3O?;~N5;QHq~Mx?;TDqWwK7Hu_`vh}u8w%g+W&RF zKLC0c_nIopOW6M-ijosP<9O#rl&}x;?s?V^u7g-tqqUE17s|s_7GR@g8TlG*zoT%S zLw6VO3XuCG`474v@0w_R?(3UTAl%{KQ7=){?e8I*X#}J9Y zP)R7yakb2)!=xvOowWXFS;k8CA^-rQ?WYN+iNOkF97gDcf=XV7{|J*=UopMmn3g^& zJkIT_C;ZBM;mml>a#a>?KIRCtGLFV=Dy#IdH4;-zUx^php4Z8zR6y%uvGlP42Q z_tCM6a%6M_RDyGwn5M`JNqwZ7fG6cmk1W*+}`Wr>j?+`_^OE@)|+uNPf6*0P!A zg}&+u92?scwjBj6k(Mfh#b)laKF9&am`RjY?ON*$SNW<+>yPE~{!#b%t}8fYLPQB_ z$`p0FGP8@Eo*2IyM?f{=6^fT-GPB!qWjqmyX_FXTrZz)MuB|o(b&;*In3&vN=f0XV z@k*k7 zDE#b5$l(}02^DQT+sxoBRDj3$~C< z5md1o{c1*|x1RgIXHz5 zFZJm~cx|uu){Z@Dt?mjP5EW}C6<++cIbzgd7AV?wXG|3LSELM}cvy~|!t~2!JFTIq zs<>Bz_;Xpzm5=CjP+?UGm3KHSB9|rk4DP8^zNbhZ<_t%;BD=N^AVym|T(Bk%ud5}x|xdtjei$2(s?J9i zj>eg502ZW_p6>}n6nHmpx-LihhSbrVQa>YEKQW1AW2<&-_%px1o+~re6nM|l)Mv!Q z%$(_h2xpdUtZr_+8y$o~C(xpfNdg^r7&bH6-)^41HNNH?0Txey3CmhBP%t?tXH2y* zo_P&NLtT2mOuc_~EAa`8qNZ-i0*y9Bkvvg9oIWI2gxjl#5O68|O7W64cRG+Xa9pHS za%zhKd!8sbJ8V57z){}gOc~%^XL#}s;uHm!)IAo}q;weTKFrFeV0D|1%5aJcL-iM* zpO5s@`Mt4en-)!8UZk>cL|LY)`T_jlmZzv%?rq%Jk*tRBskuO*yRw=PV+YAhuljDk z5O+R|fS8+ZIuq(!-NzQ`R~(BYuzSwmOpHUfuO=Rag9k~OY;}2+vnuU>9;L!sd19ZD zcjl_JPwr;Ak0@A5WuPxTMtPhXIpQ8lWjZSN280RjkfTbg#Ks={IF`F&H&GP3*$JI| z+@5pNpq^YKexlk?-nRh(yY%DO7$M5Wh|?WJKJ|Q^m>JH_>J)ycN>=z($zc1~Vv!vc za^2CV?~HnIW|Z?XAD`N)j|;((DTH)Evb4Lu-3q4%`H=2nTQ5}G9vR#4u6fviHy za9vvPE*S%^n4zn56EgKm;!05WjE6oIVV` zj-CW@agNB_hhK~C6~fCm!PWNDzMj+_y!)wcA(-dnr0LONP9L9lS7`WZp|V_cn|2+@ zuhgkF@7<%zitls(!=-0Y`R(o`i8FL$r5c_u8nF;XhwaohpQ(Q&2l$+Y&-4fd3pcj} zi?@k}JVv(gs_4ffo;Hk<#Tnwgo011LH^(q^s!d@?fyWQqamHu2o6I9iwU^^p?3nTs z%Vl2lcQ3zlw;RM|Ddd4RuYkr%)~AujF6@%Q@s3KZpan3lpU7PKa++VMvmpxY^(&Fxl{X`E3vXArw3yx;*y z`mcv^2(NBzmGit&U5jm^;?I0tzuBB~Lgj~wr%}6Ef}ElbSNH8yB=4E};4RCDW{G9l zT82(dYt6*Hw7iJN6j>BH&kDg69>_=1Q0FuryW_5dG$FuQr(tmbHU*l}h5?9~Ju@q`PQ95^3FQPcu#Rk!jW+7Z5ucEnQ{` z8evseD02Th9__5LdmLL?gS-HVWwCZ=Oax=1SJXA}N#uN0&1^$j#m1>1(yWB+^C>v(qu)0p=F$T?zBOp@E=-bCKV0hSkk`FnH1`L?uC9?9hP9iYG z&i!h6L0@A;uc=qr+BA;4Z41&4B$dfnSs+i|@ObX`Uk;)hg)cZiUH(Wg0DDycDNVHP zrNGAYezWsM2jr_=4d=PfDVPynvuh%ez(|g;x+z;|ex7WL zp^I^B>XbA?;ti5zwpWYG4PcARqf-bwxBR3)jEK`Mds1)wx|y%0=9cG`yp}SXLME`B zmf-#vcN>9TtPn99{ld~J)2|)?{I3%SJ@(64G&a{U#IW-A+^IIG`MRRD63FE$K5n6L z87D4;f;;uicxF}aerU$cVtC^M$xr?t@f=c&g%6V^7l0P^g{PyVQO-qf>-~Y60cXx{ z`ciW8=+4>ngR17}6XcXd76Pq_7$c)5wgPyHHf48g8kaB-D1G_;3Kk(`Sq?dYbBQoq z;DEbjpwm%vRSet24aM%(an>|d=ustC_QjTX=fiE?YdP0}=ZrVvO>k9Cg-3F&Q+YyN zyf12q1zzgxF(DDZtxrEpJ348`eB+dJ&v2VC4k&D_Nou@@$e3x<^^EUXc6h%UJpPFR^84Y&e26^46e-UuMG9o(SE_bKkn*7IR{{rLP9z&(*YP}F0P6nK*i`^@E$ zSHMH0R4~yX%XM#geu0ySc)aRysTA;))n!wQuu2!;C7KgcdTsC=*2iPiVf*&yzC0QY z4E!U~%ewZ?)YMTM6{*HWIBWgvX}$olo+Fsa1iR8dd@VteLz zX>r2}tUxwBeeO(9uqOG+={-@v%YhiUM?AODEe(%o3Oe>Zl3Q7yx9$srXg>VCD4Sa$ z!#Cy6WNgaVgp*qkVU1zV#XVJkmjrD`kVf#0mZMu!pErqZI0$ly+wociT@7H>1@s(g zxNw0$OWUH>26C1q(tvVM_lJ;ghC%odH;Ar=X|-mNgk_TiB^%=s2I=y8S0nL@~RCm6tT zKyt$LI%!(}>{ekE4=}WeYhlEgKZ_%%4%r5;c(YYVjw^eodFcQ06L{l8*9&MQxcp}~8NigRG-D?YM zleZuTeZal>ZW`YTzvcE_3*Z?d-}p%=4Ynh;r?DIg)Tgyt0am|67B>@X-?(Z1EfE-N zXW-GSXyyhG-PbL4iM2;R^+%xj99Y+(J4qaz$G$P3JVeI*BN~* z*&$#qz(WsEJ>4+lGap4ilE6TB^0u@ZO*x`&_gspt8CxlMG!B+xpV$sf7eV}ssj9l7 zs#O%I4}Oa2ebJbmjEXvM980v#e5hex(5GVC)0g7VL$_0W);=alqaV#Zj<;~+ z5&X$1GibGnqVroMfauwn`E|Cog27^*6O;S2%ndW>G=Q>qG&E9|aWNvFFPm^@gh9sJ zckoSI+hP=<>;-GGuFEo`FS{23;Z`KHB?i_Tjpa?%TYuDNRHp2j>3z5VBj^*!?d;GH zofZ;(seN5n_;i;*JP)%q1S*W*o3v;7h%K0F5FYDZLx2EwAf7&Bd90nVGgXJ!}So=m{O9147AlnpaoLIPGzUnC?EoXRZoyv|fx7p5a}fThU~X^;FS;@zjuI zfGZ|9EWZd#Jw4eMyQtK84xKf4IqHykzlW!&03HdJHj5~EWDSoo*I4Vq+LXI7JNS6n zJxH@`N$CnY$0?eHhHJ)(GX|r@X&g2Cf#M_+)+TmYK3@6tavU84jpuxvsd1Zqr;+DV zR&i!8fj9u>{sYk?p9{x48_Qh#aUrETDy~G&t#65V)i={`5ghB& z?fdT{k?FM}YIi5{$bkjA9d;P0YgbX3!geWH~ly?V5HreDE0Mp)|v zi+-%C*!rew>#_n9%Utcr1HD^&P$>Gxvl#Ypv@!k}kUCY#=mOZm8k(79t-vejA=VW~ z`b~io;!Z|YV3SX3rQ{&>>O;8eNKEOrifV*^t>@0&7k<Qm&}*)0G2i%(v@< z+m#06tDxeSPD@RL(e6q`S^Km5LnMM(g|RJ64`%gO2^o7E8G>w4#=6O6g*DaV=D0pg zCX3~z^q&#l+bQDlE0-NzIaBd7{&L=1_?E2tqh3 zhM*D0lrNQ@e(&=F1O_a7{-Ul_S5_#_?Q+=!xN{oMJcJ6A&Ble=ha*ZkKK>kwHALXy z6V7%dW5<>J83Fso)=sinQj_CkCi~L z3&_wWV0%i;ZF|A(iG(LED+5M3`sGXxp^)r1IV)O`OPT)d2K(w0(d7fzwF6z-5wBuj z4V)ZzFHK#99yjKEO)8vM*4KifdWLG>eEZ-wQEUk`k5nZA;LS*C6Rf8vjo#1L_|V~MoETxpGPB# z*j!#*?=hke&+hs_G5}|Dn?3xXhqb~+kSzM@b4%OA5{``5MKR`iaz)i~WhGnM?z4kO zq^ZW)%odY_9o7)q|G44wuQ)VRcCO{vC+%PJMV8_xhWWD=??!(sO4r7FB8yX4B1Qo% zigH^<*fjCjGEgz*Uy}@`(0;|G*_4uSzsQhv>+_3=mKh2&364PRMl^ZVON5U3rd$#M zFk0j)<#&qwH;5z}W}N(>Ih9!@uHK;YR8w{f`|0Xy6aG78FW*yb^%+#V7ubeEPb2(S^X3?MC_ zP(nowCrUI_MLK1Fyd0B@6*sxZi-bCn#jSKAB$xM1=aO$+QR8#9J9xfmUngbU*h0`uJ=Udxj$12-o`{S zPc#XM3PMF=T1D(h2*YLiYZM#)z~-)Z%}PcnM4b~(Si9h$v(W!>n_ROpJ6++BYsCb# z+HJc$UxVVS0GKm8P0Ul-6=OKU2I~nh@O4_i3Crn&;+zxoIKYILQU&DW5-pSR){7&ok zqzg-nvkgn=AHc^G@lR1h{8_FRXO4|4i1nEA|4=sWwQT=9Me(*-4T#ATA@G6}+Pe)V z^e~fpI7}2aL-4r&us0syI(Dcy$43**iP!JSm zi_8;Wq%{pD3IV2JaDvR_6~hV@t^VfP+4ZiUIhM4$nh@F1n^@Jz%%{bGL1X@D3JzUJ z6nqMl$tp+MIXqPI>w~g09aJOZR4^0_RXs1_+kjja+O~Oyow{DlWvNVOm(X!}a^QK$ zWFo@QWuTg7>LKn?kbrsz=>vK2OGhFJ*qk23X@5zt8TV$Cz2`f!09j?eGzQ0C@`Jz9 zw4Eu{=8Lz03sT5#UA_C+1%5QiSXI}xWReWYenbNYa-SP(5Wi`f06;*$zyGLo>`2B=O8>%brDCk|uRm%CmU{b%ocvO6_$= zAF&aQ+vvYlh2C$ddXwjW(tUd%OeFqrdgv74Q*^Wc$7m6>&wp`@_>bO_Px-u}J7e+i zT~LyDnLN4HqXDnZLJnK+JeypRfLxJHf%uM4Qg;m17gPD8fa2Lm>AZ|wk&jT)H?Gn< zNBN_K;u)`8kxqelk5H2LKP^P1ccyYj_Ig1XIwEnJ^1%XeqI_m3j4p%0nqR(Ry*SI- zIa}b>ms_!_bKt}9qWzZWlVmr(D3i`re75KCq7&2GP+QJ?f0ms}+VMDZ$&a^Cr)FUy zx?Fr~!@VZ+CzCmIZCE#ezbITJn^%D`AJ1~Kx_*JnS`+9SBGvJ8>e@2Fsv-P&j(_^C z2EB5p0dDsCg+#ImGiHnb=>MU|zy;(s3;H$-J2VSI-oIf>)%h!8PfHd0hM(mVciI<0 zm(&x~B>zbZM5j;bmPHdHq!qag^SIQ_Kb=3a!!@505hM7wzu6kXK<^bRGQ8580cgE3 zF*euO-)vBvpOC5syUSk#0=9CrOne4n;eTBkl7xUA%*Ay_I$>n2MJ58`!;6++%$}}& z(WKb&llnV`F&BM{Px>!e`d}IX-Ffqd-BhP)~d{hI(BdE9X0P{x32aNMkB^sj> zbD*UWm)qEVYa4dxj~j4ns2zO)$>|B{8_;fD8hWbKur>jR9-(X9dd3Qf=&Q`4x z^a^=zP;=r8^fA?)|opM9YNl zyX}+~c$4EU_REWNXyZU4;y?wj!-|<0lT)Nl9c;pON&AjT{qPOU$OB$t*z`Vz=G!4g zoNOQt@}Cm?G7xru(W-l)ECAJG3bRl)4-E8spP^#Omn0i0*OX-k><;=pTIA2Us_Qwr zX1f6Uxz_j!zLD0h5VeXnwTT`D0NQmuA)ms(X!tlx?(&rB7h*xavT_4)WS;3ThzXX% zJWE53Q=^Cm3q#8_S?R7bJtp<;aI!6E`PtHb>2{^-UGj@cN(N)w+tBL9)%FIih1g3RH+O(XLR_MfTUBZZ_Vbxnh! zSGtwQ=Ba>cXi##7XU)P+Zc>L{>&Zj-z_efU$xZ!&F1mENZQ#uf#toj3ja9LO*J$(o zu#MvlMfw-AJaEYP*0>QZwDlpmp(l?gsJU#jSVC5+h?=BM6xaecF-0P@Eb<~gnNOq0 zFx4tk#K`gDulCVk@+af!DF`|i3O)X*Oc3PSNLYY=7`M;R`&P#2#ztG^@gjV8OdJZU zlJ#p_Ot?)jI8I98b(679MLgPjGo5|IIPD+lclFNHr`ot2G&av4OB|2tkF%fEqrs1I zrXs=sbEmZd{6W1KtR zeD~z8!Q!l4hZUyiDUftoqOViweti~4Q$CG6Ppk;k;0UUA!zeQltKdnY$8_ zi|EesBs1F+n2XpPe;{XRjz1` z++$*3%z`6+#d%aZVn~_^(C_|T?gm!5Pd=dbiNZ`sPvr^F9HG|xRpYPmD!)4Mb^4^z zE76IieMG&7+YQaLUttHvj@*54!idhB<8*{x3)>wHw~t;&SCv%S>yc}Zy)BsUb7ZY_iuV0yXL@JX>QkyarDsTI_vTLJ z72@?P)~BC$f9F2tZ6@_2$%hz&mjw2^O7vtWEc+9}4)#aR@F8cA;+r0j{6kcHr!$1} z-Jv@9gHi#8oB~B?jg-Dh=6F{t`dcPU@Ge{w@g}r-pLhPcpo@FgZrdN|_CItCa5O!SC69?s93?=&xr4>>o z5xG{&WzibA8t2bUAk(YipsoF;!^2-5u)Ll8ER?(=_CP<5rI1nhr8##b^)LpLD#27H z6|Qk90|>jJbK>m71wdh9EUmg5;J7i=Xef5(t*08Ya;U{I?GmFS6q==m&4)2mXI8=#4;+wW&`aaLrP``S>=(n#zfC4Bu~Q6~NlRDMryDnV1D_bfWy|{jrM}3CUglMZDUDqjr2u8@jd{j55z?P-Up)(=}B0hrr^2?6gNT^p?8S_h-V3xyA%f`TOl5-I@{5B z@Etbb>T_+7lhv0DL0z%{(!3~&>*)uXpOYw}Lq&V!nxUygmZjp9q3E0R>zhnFu!_?- z@HSs>W>Q*bxz=E1tVn0Pfr=8hpdq&G(YdCGpQ+5L$WIYrCQXyTglr zHF=J(Vn{@3>mUS_&0Q=)K0OF`FI-s$u>p*G4{3u6^0Qm&MqHj-S=5(ztf(fo6wt=T zb_OyDkTF&}dqgOYty@DtoFrQYJd!P?1Mn!YnYHVH=LdyP$yxjO?5HJCUHIx+k&i=Z zZSz;5BZgR239p0I?GP$aUi#MbIfa!FdXx6~Tg90B-0v7R{qiQc^~pD>@%*m#rG0o<$6k1TGHs$VSblnQs0nmq6~ zDLr5;KoDm#f;}~bK&cb9YmjAI6Zl{#gF&qm%xK^0(dI@F_TJDVmRuv? z@UejT0`A@Yu7|N zKk}%9w@&!|CwYJv$GC|%-?~#Ja!B2)faBdrsQ#eYo$h@1v2vp*+aFmsfU2<@% z+Zy=z+}Kui`(thg^Qb^&2WpHH&~ao5}RPA|z;3N@;%LuU|G#n*!ZqAXxT_iaw3qS~|u z+>sBBj3#Lq)C;7P#MEqB(SuGp7DiB%(+;eBD>&mFo9Sh-PDo0R#U|tuG#g`)n^`nt zu*{KJl@g_nK=ETl0)Gmr(MGOvkC+M78Rxc#M+ zvNtnXliR1=TsQRYBfOfXCYv&flp5=-G3-tkxd^%Sh(9N)O2{K8UD~v&XmCGnq#;Nk zW_h;4swzj^UFWU}HD@eiI1!0aj*De#JO`|Be7iZU3zD9cwaxG^8h|4$TlAbItKN^v z+Y;b=l{l_Rm~zkeuj^x;G!WhlhptJChQ_W9T~fL#@v-QSkpO+i*M<(e9Gq)_Yq~s# zRLW54I|XQ>-iz`pRt#ZoBTHYw{3se6fzvR=)38BrABkru3V7lYN*x%PFlJWSDX8Qy zWDpjx5Zb4B${Hh&H6GSp#v``bHh(U#%zH)AuGrh7?tnd~5AFIG+ZnIMfLH(UB*DSO<@MDzh3Hz+Q8 z`hb1t4J#sg=Pr@1ldF>hZv5Zx|wm72+Da+K(BwTVE12B6g>Li!?pnE#! z^v(WHdu)qDmxiT#Jm>7q>FRidS`9;{4vpqot$U%##X&9uc;AXX8DSx348T6^y}_P6FgcTT z#%lVZT)DA_YmQfZr=JaeD~;8VqEGU)$Q<&v6qhG>_0}jTIQ{8}(y8$u3xXL+jZhfMiwP3?m za!#Qp1}dEXNA3Z|KFW~)*LY|fT5wx|;c!7rqZRLQNM>lF8%p%WJY zJ_2I17pItk68lp&ifLDj9du`dNe}QinC45!&|XgR#ylNpVyowgR)6$xx~S8Oc}qo; zSmUSjjhpqFAxpjEPkaB%@esf7*S&#hQciEey@IQ<8H0W}EYEYEK zWbF?gYzORF`Lyw)G!x!bCaVy8Lm8x(M(j5->QD;h4JgoH8-}HCrHP18sno7$1`po; zSK8&|G)e>X-Ta-Cjg*&T)cIXYRHxKFtuP1!o(YJg-@WsN)rYWvG1gRSZP^ zSmQ1CR^=OcpVln-f~O-ld0Tjlw)8zS`n$N6QfHf&0gG$ati?nfQBkx{hk>t@6H2j~ zL*TS69jom6RlG-%#fdt;1%ZR;7m{=m#DK^h@hH{UdYS&8X-I8#sTj1AX> zG%&E`DN3Ga1k@?mN$bG+iy2vm{h3(dI@FY^ii6;S;- zt(DfbU3!)^D;(ei-colS-9t_Fqi=5?SiL)x9idzWz{&0T#KiX3Z~oeyENTxig>4n$ zqWx32blzJ8Ci}#HnpYLbvrdJPuLW7qsaGG&P7lX}CqMlXMHh&8Dd-B$%AB&PA6n^_hkQKv<1GvJ&d$Hs|BH4Eu{Cqjek z<>xg|!Mi-gYu$e3I3fCwlU8r z?(kB2rA$pdm%>rLplXIqJ>cr1+&$R7W{$5nTxWiKq#!-j$x+nC(HJ|;!gjs^-;)!Q zl~iF-#r;o2QF140DYInD(9x@K_j3x59X^fcTInW1NLmY9&cm%(U6_;uPo;NJMk zqE&(uRHN}`*Xs(x!@+@)Bv;#oSca`^vmo{1ub(|G)})_((-cZA(D#>qajwRqq2+tttZCR?) zfhn@^ooZ8yq_BevC9lFvOHKMH4uUXD-i63nvHDskr{r`zYj)gIuciRrq)~@|#e2Z* zg|mH=*LLj#S=cNj4+sK)%a-4OgF}UbB<*4Tk^%LkX$Fm0^Z>g~&y=s+l;-G0;GH(`B7fvS5C|a{%g{mzb zERA*8jjR58WA-V!*NnV1IvSf`?92Xe<5gYs@{B#_4%r1*jjF$@&1)pTM4;JmwFtN3 zpnu_*F-*?Ek+IL`tb2cdK9(K{eaEw;>&Oy0<~GI0xjf~% zR6YF<#@;bXvo2ZJPTRI^+qP{#Y1_70Y1>w1W~FW0HY!o6^LFpv``i7F@ANohjkW&F zpAmP=h*)#Rm8e_3c*}pef0PrVlvDd0q~Bz9IQl2UKE!GLeNSB-w7zYCQHz!80N)g+ znmzY53K>yf;_CjXH06o^tlOih%lWvw9ud;gl=&5SRA?_=&XF5JxXG01$q_DSC!P*( zTWQSA)2M|MGTs9YwBD3$$+%l$lj}quUr+uIv$J^qvTh zGH_5CNIHI;Dp=&~@&`x=o;VZ4@S-f)|6m)`Fmn7Mff3_L04)~K5t3(IArKNWtv zI_74{VOFfUlj|37G^?N3a8a(**iXdY$Hc!S?rQ;Y$D8W%Z#HR?hGTluP5*ZN=vi+3G4Mw}4*G^wcC6Pfa88l~~4$mbc!j z%mkbW^TAeQNny~5<1F5Vc-D!Srz^&`oI`G#{Y~vOe=WhMTqonlOzxF$rys@0ikuxZ zd&{R(mga$8Hw@b-JJ-}5eTnG&2ju>u;d-lKWmb3Jk}V$O1cGaqz59Vo<7nAUq__31 zCF~?H#5Z0DNR|At;oN}vchkP?SK6}Z(Qy7Ft!gL(3-n*#mDXQw(^n?o9YbJxH9(l{LPR&P zyBHNQ?^^BPRaxt$(R1b$g|g^{vburn&6DVRFsP25AbL9>tDMcW=zBD%j-?=a>mb!x z>&q~XanKz)z;*UPeQeD(=zBbv6SL zWf&U0Dcf5ED;ph>E04zLse{&9z&1>dhOpUtbZfwX z!N;`+RW8i0&_^vqu6+0iSS@C~$o(7gDMU?@;Ylrcz5a_m8jQfc2G~6bcj~RFx{%*j z7HeZSf$~=Z9bwmjn``zRG5o{5W{gd@B9BN;oiH=lDlYf8%Nj9{0adq%R}2NsAds@A z*=xCb7N$(wAU!`qPv3MTLBbO+1l_Bx7O&h{KmT^C9V%d~`5&{-??L|4{Z|JE+kc;z z9jCIXFd&4)KUo{B4mQ*c^=DvsP7{7aEcOr4MMz|ngRWkqmW~R{ALZU3p3=T|pdVC+ zPbeYEMOHjM7SC6i>+4?Mo_?T8Bi3-nQ^QONVN@bosSRYt+9Kh^e0$!8ObxK%W9b%_ z&m4mmy(=f6b!S_a)ar{%;G8tAw6c*1?e?Lik-WOf)N86$@%-(c?X)#Ah5bky?2OWk z28(b`TelShRW9n~QcV^dojZH!C$IiYW`;KW;jPFA1{b6%OSEDd;{d5o6}%AFOLS%( z+YS|oPV%eVynsC7AB;+nCgm2p*3o{`mGsOxy;n!6$iva0HL-XLEM&3FM_)BL#H>w3 z`H6%iYekF8o%E?)h`ly;aDCHJ8yNEMeTpfs^PJWp7lq-h5U#aI@-XrspVFuPYy!Xo z%0pxEDIVcOenLOBbOL~B)ANu$Meh2^C(J0fulbYLD18H=ADVWM9}WX!$`Xl$A<2`R zRpm&p%attMo(F~{!EXCPN$v0E&{O$?8ON9on=Ax@|J|N3hBPKfU_d~{Q2)P7w*RuH z=s!#-V(emW_D_>a7@N8}ID7qzGp7De&X_;Ny4j{VEt(9m3A>i=;{=U~Rbdgh@Gmm0 z9h0h0CT$3vO^jOu?4ZHIiq%b7n%m(Y}L#J5K;d33W*@Aqy+-%g(95i`~Pj zVBaT#5!eg-ld;~YJScE%z9gglxOow5N=NM>EU4=1LP2&t+*W@}JT|@|E)z2?`^nKm zT#y&t*kVzF-*DV8o%k z*mp2#h~hArd0cmCM~{(uVJ3=ZuDxjI--TKgp7yNHoD{B_B_Amf)6dn1b}R;(Kyj=*1mo+!u%>u za0%!W<#Rs@BQn($=_{TN$s1lFfDCGn-@Im?NAVJ`t5N7zOos?(hM(!r1VkXWu|+W?lO&Sy&RQDXihikIc0wpPq9pBN z8y-D*39e?)1(vD1P>q=vt`-~p|Zdf66s;A{s=yAFOR8gh;6cdf$&3iU9&>DycLeZrDA5hTN*46#Z^$UAiHcWb2YvngNtz!4I>nW0E^ol^t(he$jQ1!vC!0%ag7I6_2N2 zQGR9XD`%_@tdv@Xo0YlaP>!y_sDCC?isDXJiKN}Nz>h9FI?~iseG#l5(cC8DdHyt} zMw3fVTq2m+N-0agmMEi;&Q-yf6m2f6S4_#?EGRtw74ONCx2+)NNBn#6-Jxl;Ntg3l zgQ-jP5R8E^lG5(0mSb1dB5yw0)AjYrB`#!i+1BH0#F2%qI;C{M)G>AOv7_ndju^y_iKw6F zY8x|?)%AUezhME-FpvJ%;q)=N8v7mMIL{NKIuJ24^n^C_d3W*TI!$PQ6P?w~cU{>AbMcrgd--j-bDStSMDX`=fFS;r<-UfrmuTKFyb(!6LZU8Pk~E5J zmN6(`wk|-hyd58FMeRyH-`L&6h^n+jSBN_g?y3sMlA&WQEQQ#QUG98*i#+V}ns~s2 zblsWUD3+Tng2!P4T3nteJ<6agM!3p)?~aDznN$< z0V1T8nNL5qF)`Cl8rDr&f1UZU>!zz={^MgtqwFXW(M2P5}Q(0=(yEO zwZ<7>lDrR}zM;AH}6Z9~exhQB5yRSB7i#%`TmAN+?Y~#4M|7 zxU=6fuSDPT+ofDgvo0;Is>p=VwNBH!(z!Bn!qAo{sUEL2#JCv+Ez_~v=K-#n0(CZ@ zQnR7EN?LvhzNRxPi`H7Bg`Iqa?Mlt8+8FpPOV%~~*E;=H!x0xXpscFV@i6(&RhU)1 zHcWF&M%;gx+6v?5(C?n5)1;5B7-aE?Q@Ye)0x~FUTQ**c?gm{}l{PxhuXJ2{=qftl6)t_U@L%+?Axgloc<;o_$gv93xl( z9!lI*dblzk;ikrIAH}CO^Ro2Z9jm*+e~0jq^niO|$~Ql#Z_7>Hz*LmArtMX)%K|^J zr%yf|C|h8!dKl2Inuz8V%cY{N6r`oHq1=u_kG_Sbgy#4R2h(Y4cwc;Wy(nM^J3Its zR{m*5O?iu+8{(UJgR{e)-0jBAYNzZ~nV6iMC6FkyFngN#HJv|02QN1N=tHbO;u_h( z3s`!4?P2l8`3i5|EMg}Ndou?6xoKl_BdITHXVZ=B2N$#vc@G!-2t^=DWJ1>-gd7ripG4gd zSy@ZGCP{pDMd5fZr_1tSCs>(&ZuXlwcaS0)Z<6Y-dP>O_q)FfoNE&M0n-etgsD_vx z{2e=X=YjQiWCPmVtQGLo?RBT2!5F`Q>-(+#YBteTXIK37%@C+QMv`}uGZF%eI|0otSFD=iwT(NrntoYv$l9^@{YL`I$2yJWCY8;qbBEkC z_USj55hn+OPAZX&0t$I+WvS3+8|fQ~1t0L`je#$Yg*Oxw?y`Fb>&iCKuCU3Z!hs@h zK>U}2S*I>mPQS3Eo0~>)kjs2{7C0TQwVu$M@{dO?|KM$yLj$l^eWwFywHxlZv}*`S z_3PfqTc=R;_ydmfS`|;6>djB&Z|oW?&K|psjH->0qypGYVt!1F=uj{X3}#Yub^y{_ z!I^thZ|7sZ&L&1hiu^Ln=pN?=$mon92EtaH(op0pX2bK^+oqUQ*nNSeu8Rl+?SlcU z@W`+Cte-aA4!TjId@oGX9<&$t<*vh7=D<}z8(C9LI#p|!;eo0V)|#y{*}yzSFWa@y;` z>q&U&iopAsFYHdJ@%X!y0I?t`)_#Nzbxl;x^kqJqaKA@z$n1{F^o=a!60Py4;am-Ah%5P`M{S`KMr1Zt&IrWBn%gb}Yu!+*j2_j%PuYbFJ zufB6ta=OgwP@a03?Jd}-zd!Gm5w5i-9wv1QF7hCJF{bP+JgFhuK{a<=OajRg z);+z^XY1%pKrM6qJkRv_==cgH)pg1gUcL!5-{{o6Rm&l(&f;}yd(!xyT(eP0hT;uG z@%Q)~LieMOhQVVNp~)WE_d-d7{koUmPIRRQQlP~?Qm0)U#rL+;MTfENZ`Lidk&Njv zv!Q+p7PgOzxZK){SkIR&W3$*lU+r^oK9g}e8!MTwP!BetmkI2cQY1cb>`(R&vS)F< z1n~xB+6?!ud&j6gQ8HgyGT&f0_Nu424FOkvAvJum620O!e%UKt>8&T+>0!4_j{=I5 zei;H!{1Ug1X8Vv?t+;308Qq;LinIEs-g~s?g>r5i;gZfD`14mZ+b*wDXk4%XG1~%e`2MyQ~Q1JF@JfcYJ7eT0*(;jb|Vnc)z#Mb4N$GYaD)zlFu4>nSWy2 zZn(f?%+YhRo~rogR8)jmBQ2F8R0$X3z$nMLXi2K26lCG6rAV+(TNOTb*dpjgS|W>8 zhgi->rfV;KoYZE_8dD-?gFA(VtkocA1Du9$JuNoz4#aGchtd#CVkB%chv#l}*YcAHtT$?VfU*OJ9nDF|!6qOtIcovHxj;tYr zHa(Ecl$mxO467!KRZT$?fL*0V+k9ieRzYv6cI`#3b)iqb=8_6EmXFziu{bUn!AMgK zC{TdogT5uWFv$tOrOriy3-2zk2z)x4d1mG28v~(kPV=25JoLEV{zl3tnPG?AmQl$L)j<@P+vFcLTFMT{qdNTm@O3uFIh@47)j-d1t`-vg06lAax&Vl*f{cY?n04SXW z5)=ps1M)u*ghd@}ZOu*p!HgF+Gj??S|HgIas_XufAl!zwP_|E!8goWOmC*tY0u>yH zDTLJW3zYMo-cA!&E=3{B`At#aEH-j1_UC&s-fXxE4GYq>TvK-QsqgN(!|eLk$L~+b zKw-K`OCge2@25$uUq)a!;X|j6V5FW@#%cpUVvz`;Tb)BhxrxH^dOFEU~xUI?=QFj4BjyFbt_rRJOEN zRVlP_QrvYoIo(E)cF9eZ$i{&n%*UHLSOFJdAe6FOlzta^itHqsN)cKdESp4FVENI`R}AL6)D9)L+uSFMhT`F?{f6p68%`@68~wOyFWG z)t7f|RWk3+z}Z=gOQ$QYT>f;?4iBT7{HB}?JFM|^;Pw`{-G<}$e-`uC=L}W`MX%-0 zVvVg9V5&b8c3mLf5Xu;#2eT|eD0**GZoypFA@UdY)|r>MY`1EYG7TJgenr;ebBYw= z`vMPgsNj)E+(%l@w_*=;_nyoHa1JctcvzMpQHUQf+{~|?8!ys}BD&G_fPdktc_}N4 z)Cx$z4~`x|i)==bhAQ^FGVRNdhx0r@n3zcu1^XwIhOLks{SN#Q7SJ*zIZ@m`luXm; znsdyMpCpdeEAr+VRUd`)b%aYiNkz@3abi=qcS-g5TbTYnE-^t1Hn+h29m=iTJkFZ$ z-7HL?P{lX!nS94d1Wji_Fvx@8^>2tsd(@}JJ`f%-BR^{;h}mqAE^22(KF8r z{Tr|I$RItf(O9nH4uf&yNRQI^%_iEuQxxqqLhR`SCJna+0b&hfYBOzyp@o#r(5Ps} zpIqV($*)Y@xVfgd<1s}biFwrw)xI6(Fv@DO$QgN6FyS^e8fIJ9noAR4Km^t%@t>uO zI#m0pIhIW?fcZ|^_vHI(byZN1`M0LkRpXnvH(=B0;J(@kHN=hwT>Aw zwa|+vy%n`~Z#Qi}OX(}*o>PsBnw_yFHZrUmaY6++2i=#f)=x3FO^Rq`18Pl9O-s-A z^*Z^3(y@33^u03|md2|ilSpuIdvrjZom(hV`K8KN$EuXXFt2;UKwZ(J-y_k>p8I=~ zX~T)pamw8ySK#;ot5LQ;=#*fC#3Uk`g zjJvRrkXat$#rC+xA;=Js>+uTS&k#S(pnaRd`r>$z{X=Bp<^?<>#ll>zeU3#-Xof-0 zB$27acPY#h7ShOPL0o^TEn)MdB)m~orr(DsCzIXm3*_ooHGHQIFoVxjwUIN&N4ZdG zouVd-m|M?wSHl zcPDTAfZQ7l0zYuTYYy z7R^lEVr9&PPYAxFka8jfu#Nq|#6|YWF02f1Aj_a#Ds`{1f=DQoh-_mQAj%r@yqyXl zoI@v+o-~^&3}UBnj9psnQDx32Q75Qt+>C+W2NFm>QyQ{=%1sn-ek4JDdbLsrkj|n? zVVycn-HpcWFXHZWew?27udSe-WyoWCO>gcoQ+Uxo!`@*mGP!Vstb_SR;x&CRehQzM zykoB`&W`aLUoj86Sa?l*ZiJ3roiI5(lK&h8A!YG&NFw9{v0-+g9W@00catYnw>X1= z0Re47{RcA9-%S4BWFmc!MG2%HT;6nLG!&2yhE$0}pf*&;b4+S!E7Ob?``jPNNH~9} zCoc;Mq$HAM7c#yAd!I@XKOzJ|RpVWVPUoIm1*^)NX@{Skd@Bfl^77_&x&YiQe$VzX z8h~`b=ni8~5e{BzDc$WunRHYx?302M(rT$GDJ6+9M=1{Z%MPOmsNZAD9K3eIfE!X# z(P|O&L)Sq4h>mvJ!Wd;l-%?HzQLeb9(b9BO?AL_hz)CG0KF~Qvkj9*FOL(*!^cm~n z+l79Z{?+t2X&<*K8;;$vbHgWU((hceM=>Z;_S5{sGE_o*wXG9dtB!RSR^>SS@D$dh z=M*~*;^n0I67HU4pCvYpKBAtjy?RTRwTi=vVxrD!?J^t?_9DQmhu9p-9J&Xc+pvUOxI`D(!!i2bzSnaN3!W1fvWuMy)+98Oi}MR zy(64(qrB`4y8Z>k5f1FW5x12cps9hxFMU(pv8woE%fFg)rbU_!PV5M70vVvZW^!IQmp`;b^LRXB1>XpZo1w$`3R>C#$kXnwed4Ux&1>g9$Z zR-TZ$I4ol@6%jZ)gYQfHA+C2%><~IC2^5N&gAJ|X57RI$CDVdt+ zA5ccm>MPYB$|<}Q3AU#!`uc{I_Q-Puvmyg&CkNPEApMRyu?B>GdT=a*zXhBiahF4l z_Li_Lx`_vzrvV8S1NNkS_dA|!l57nR6IcosUHYZTz9ZghPY6kq(T(&YbS`XIon)Y# zsp8OokV*zh5%|q9-QnNjHkQnBw77&)ka!jMi_}K>87(i6ILMOpU$Z$}a%EpJ`u0fum4;FfV_=Fes zA^QZoDntelyFYUuh*}zZI%Hns3$1erIhzuWQY>Legv!I}z!tk&?!O9*e32QcpCm?B zlrqU(k}hyazyEmHD2?^EU*wZ?Z|)#LrD}u5JSWYitZA2uU#y$E#o39!AaYNVViOQi#5at=gGdu(N#eZ!d6#t2wE@td%{abyGfxeF{t=tHRYdbu zzmU%_zF*Dt0v?*^NDv}O4c-tgA~|V#r7^jQaj8?S?E`zApE|hkQ&{YQ758=10l&>X z%`DJS%`P|UcHmju(S-16rUaLJ5hUpf(KkN!wwH<-OX_$DW5o3!?tY%3koX+tL=I{t zp%KgYk{~{G%a}{0&epr@W1u9jD}Ck=*g5p!TNaQtZi?pBD-4Ybi~a5$pWFIGQRuu{ zjS}4~KGPiAOw1OB8+L)Yum1s>Qj#-F$d#L-dTD}*eZwGM$vx#Z{iUdNz%7U%1Uxy%uQnhfXHObNRzKV)i=Wr|Hef9SDGwJ zxH*c^@G7Pz1N@#0Ul7^G+>e5iOcTX{)myR1G8}f@c4M#ZAN>W~_bPl4B8FOQ_^CX? zy9l3NB$Yii)#)?a3Ama1`1pN{8;G51B4wmAxJ>10#%9KTWHMGvbk7dYiW7@f^drU7 zV9*VolZ}qal2-QkVj~1TJW6H|xoA8We;?~04dBYR$a2%l5!O0zX)w7?&jQx7-DYG| z4Y!|cmA!)>9soc%{b7C+Wzwf2@3_f+GjX3ZxM{bK)_h5(LE#i$7;P2v zo@*h`rEbtnm0Z(uv88hwPu)le=RGTzVf=A>&{X$8BX5slgmu#{-tD(eKbt5JBpH5| zewV&wPM$GkmH;zCEzD3|MIR)Wj)O|QOy9?jR^T^6(8i;nU-QEmHw01vP?8moyk#au zW&Yx&sWnPX<`bgcOpT8>P&b-w2Oq;@Ph5J)F*dVj9I{k6kuZBLyX-m>_7uhR7iM8gS zZDFaKyO&~{=t3;R;q?RQ9`yFlm;xgAQ3~k~p$*D%YTd5`L*(r>$t%zUADQojA(~P- znsw@_1-xQQwIq_h|CRNK{pG^1tY*_Cf4T70UoK4ke{*4RdpEm(y0FW?d{|BYAH5TP z*%Szo*D|9|5HM>QSY$A zSH-1lAe92vh0K!fmpq@F_2%xkxA#ltK;;s3ODrYk$REM)G$M28L+WE#)?y&i;Da_H;Xm^H4xyBfX5t;;?q^sZf;a1!FZ)*U3>aW3(GATLSxVvi z=aSj&8nviT!kPyjF~m2TOF`N-I!*sPE*2cwWip5w+C2c=OMj5^Ov*D;IVg59JsFC^ zh?@2zZ=nkF50>O@pLB0Ebo5x6(cN@ada}n+Mw`d%jZB;qRgmI%W$2=-Z0M-pUKXLT zo_i@I1`oeHV{O#67(t~yY{KE!SF6ar*(u+B=p|+Nl?SU0v(l4}PNHdM$fB1MoyhGL zrn{g@_!fjyu+d^I-XR^rZJ!Pwy~eL;?cHF^zcxUJpTrcg%N-;IQ^O}P%S)_0IjxgH zf;oZdvzIU(HuD>wz0EQ(lUb91uv&D|a)4~%F?y1p^4DG`8y-EB-TC&)jl1*P`=CXi z-EZ8S_d7LvCFxx(9jgB@pJl$5A7ImONVlFqPcWA0oA6*qsb5wj_pXaNFEXtG#%2Ikmt~0;yNYp0P8vtF}E-Y zG8960ETudjQ(lzCNYG<+&uyCFuP{(4J}{}ky^#cwcQ=3;oDBwHS$B2UMRk2u^~qtm zrUQ_iX<;n!QkxNN85|z1aaSxK9{IQBUO5chM@_on#L|cLUOP&B^~%*)@yt$z89k# z&H_9tK%sWk#KTX2q% zOm6*2*cZOex&s!};&TewSdzs2nx?uiCD@4fezJ5Uc?5UzRy6wdo)ZxwT^2cBCrit^ z@h1@$OmW~xqKM-Pe4mG+`e>d%Zrf$(1yRU39L%x!AkQA1t|riWI{UcV254XlsyHz! z$qRQHybW89%MV*~FvUyOQZ~)e&dbppX11mBR^$sYmMMSexofF%n4K_ArJ7DBGr1C= zQ8AeSCIo%3TD#R@zY0soti>B!j!x7~-U<=6mucYqkWhUidjH57eRKLyuvR>86N9vV zH|O3iv5N{M!5i&`+sqt~*cm+Y`V?>1Ovc+cge+#*&tvAKg7;0#9IEk~{ zQNYADc=&XnFNH!+Jr!&!)*k|WON)*ff>$P8W3o4c9g9jWy%B+;}yPF~wDEcr{N5jch5OkG3#a*hhg3Se5mDLxZ0e03$)S+o^t|X9F;3tNwBor*hMNDO zyA;M1D%H%w9zu#;4f+AIboACp+pGuZpsf~upy~~|MzoJY{L$|O;>aa? zMj`C7HF||Gfe~~{C0KX)Q!XvzS;M^ES9z?jqH`ATsyn(?nO`EeAldqXKc*OTp~W+}0{1qs^)dK}&a}t*+SIDrPMb41|obM|ZnK!Gd>rLh=jTH~)13 zk*Lu=aA-0^{=nmo7iqS&m@QQ*hJ4p2e%5QoZzkrt@9XWD6R7!h?U$9Fyb0WG#j!pp z;65+NMvJW>)Exg7cg{(D6cS>ZQzCH)9=x-1Nmr()bO{~5-K_@Z>|KL(GZ7Nxe4?(^ zAuTKYv7tqMGtDhPn#k++*S$xH!z%c}SNyg4soNHEU|{DB*Mh#4P97zHP~`-u<^=zw zom4v+;d^OT3toMTg%>YpduCa`d>ya+?jG(_58 zh3H(r^UL-?`ryjnL@1GsH`hHU00ng|Sz&n?r+x^hm3<25I6cK%s$l@6ume>wm_MjC;5T{&Jcav3EKGNqt*lV>w!wRV3MNr0ht*uos z=`6AjK{&U_hgpe^VTmiF3Py@w63G^7pUC$WHcDUqFF~j~fM`C0fwZb{Ybef%eM#SW zu}eM1x7Y)(<^13Qp_DyZypgTKcPw(y@R}UOGngqWBa`Ae)Jgl;qQA9r@gNoc0X98q zK(MQXPf%(yC?UN&7XQ_K)-cqne%`XtX%^NnK_}OhVoVzc#$BX#=PMY&O)=`7Vetz{ z=jnOn{2v^cR5iouo}4Nw2=2HApR6R3C5^Q*C--;00A`m|la|NQYl{!_cJ~yTh-m9y zvS;(R#-Tk@=%VV3DqkmDz@$L+C=&dznQ(mSG7D84|psN zq~pyTKVkn}$`fpEn|gmq8TLPQ%>E|j|2|Cpub*%9@S$V!VBn0A;6B14_aM|Ql4yyi$>n7oy+Jo{PBgd*C{rbITKlSwFyc-Z-C=w<+Ky_GL4I&jnv1#mz20DD za73)Cl}>DCER;&kHYA%Ze^T3RbQ`afZV^K&dJAW4V};Iv6Z;tglM1gU^G@x39INn# zZ1x-}m3}NxtQP7?l;?_Zd`T|2Bxk+G^9$Nw-FSiV+$*W@Q)rfCvR`+0gDhLd;iJle z5a0W@wn@ZnG9=-DQjMe52R5P`Fkhpklgrc?rl-a2aUZ(L;Ko6jUEdvt9`(na0qJO1 z!Sib_5E5AYY5aJbaxp(`j_87+wDbI2*wS^5FZDP(f9vGyYNK0axQ93lr9b`tQQJVj z;(R$!TozKrmx~dP+PSehn)rY!!y`Op7!8sgS}8D&e$|4-X;y$Uq2^ucf}=B6R)`M` zPdQ&>q$f(rz&!LR8Df0LbsTK-BfPs*u$6_x&RN$CqsiS~)Z%JRjYZM&$53jp6+B|n z!dx6Scr(rklOpwR)C4J&13r_E58fR``trotQ(H~5lZU2;$l9sHNJ72n)p;-#75*f? z9Dk)oxZJdTER$Z{zI0|-mH4(9;H@SwS_nNZN^GU8rAQ(*Iv8~ z+q_wyDgAk^;}g=J81(*%9+(w~T5O0S0j31I9pZfb*K#{sWPH~_&V|yAP@tYAl@I|3hIYSI76ju?*vrV_0LU$^G{q7rg%{qp6%@|{+GP&)19mO-Q55ntkF+0 zw%Cd@A&szjJ>CZ_yHTtWbSxMc8Zw z0*4y)u%M4O7r&(`N zK6>q*sRHLkw7d*z45^1V%l$JdZ`QCVI~6{+#>V}ugCO$XmjWPI8Re^UQ4H|>9hF8Z zgY;V(Or^#+9%xgRSikhc^&WMYsX?E)W*&R z0nsSB3rvx+OGWbta6J)e4C?&5$7Ov~A3^~a{rwe45#%&uDD-TLo1<+ZV&N0Yxe{5S zDw{RY^cU`=KEAK(;dZd9RXCm~;$L8n;f;~6-|j8}?%%3SosR=tRCafMf>u?zioePj zRkzu@mX7EXldol6IFC@v0}$7-6y~i#nEwD<+e0?$ebKG~ykqv+;%Y;IWzI^KVOMAt zxKM}ieyuYN=ti%JH0Qm8Jj2s>N3vd#^eeqZ#)t7!(H8SszIR3($uRVRy75A#6*bfn zE8{@poQ`QwT#9<1Lqtdnf}u9g``wwRnJlw*HpBQ49e3cY#d3`q!_60Ra`k{)blW{}RZ*fHM=1cN&XM<%T8`?Cg3Eqv-#~kfA<@RDTr{x5u=%hp77ig-{r%z8Nc08cMu<* z@N&*kQxfKpPH(O;Qc>$&b>%CzHG_@r@@&Wt9+9oaT5EAWq!UWu^b;1}@PHQI@Gu)n zF1_aROhQLgB4nw7xWKO4qL4^GsBkHq)_lj6P@0q4L(N$~t1aVa|K(@XLW_{i&iGi) zuVHID^2e~8N;Bt9=MFpXbuSIFn8=niU7ci^0@mMiTP!K!=Euoo1sUaa+HIv4U?+$2 zJhmhg^XNf$bXKfI=96J2{`y^$C*JX7+tieHCmM3A2dB|YHBIT1j=jAu5Pf;fuoD2H zF6w1ttw(bfiG$*A+)rZktmElp*ebF)6heJeBryJ+HD`NDde{kPTj%+vaWR9)jLfOb zXA5Vi&qBHC^Z67Kl>jo?9G6_pYpYR>GIJjf?b7-@Nti}j0q-J9o?#_uIinik8{y*< z_q8Rt^3qdyMFoYGm7fB;jE8(Jq6(YoGHnww=A{X949pv~8RGA=yakNh;+*sjI$J#R zH1E(B6TgT|Aa(}TK}pxx91%|0&EUIkrGvyCmoYk26f8*hSJ0BKzR!^0!Y)HN-&%8(VNF)POOB6>CjcR%R4f2neOmqa`s+88YPbA zhPk`&S6BIuv#i)1Fu)GrVevZ(jD=8bN~l@D6*PC33ZA~^Vpg0bNdc2n=*I^VhndQ4 z1<$>Bg4A~Qy}34?K9&cVc3(%YOmTiI_|~M;TV_RvXrdd~S&eS2RlAmpqn3203zD%C zdAsi*{P)(XhEg24>?9_6au`#5agjTo`gx=i+%+nOJwTe4&N-!s{BCqQXU+1aVPEX7 zk9>vvL#r9j9Dm~WK&%PlF^wK}aXb?{VXJ5|Gr2&Ke8u0LxSyf|LBb zra+kMl=&TB$6s2G6N~)^_6->Q&|6&@f(DEDOA6dIjbD*fJ)rOs(DHb$=z2|1;PV@Z zzxw^``esv9aPsBuf7vlspB;5D!KCZHmdQi@)&iI(#0@rC^pqBN{!W)s!tn? zAV)nqTak<|Yu8uJTK}~5-~{=g<^Xx(x%YjK)Qn7LGD;iAX`iv)X|CW=pPKl+$!ji% zDTx}N4~U*c%t(L)0S?}vj$Lzo2)zWPA%pEBqV>5*Z01oC5n3cGc1=YW|>5gse)*aKW zO7;a*eB1j9>w6E3npP2o<@G3uJ*%*)QzAon;>_@vdz-_}`d1b81!Dxpxp*d4i2u%9 zvnK~bYBgjW`k)Pd%2Qy(mNQc>?IPSijK&Z~U|PsmWu(_{4vq>#fvr+zeowR~3wH%9 z`Vf7+aey;8q;#LuX@R3|%sW!E*GtV8(DXWY`qSi3LZ`!>n{jIAImC!7*Y3;ovignU z2__Z_>kbNF&9Ft^ph{z6E1z=`!Kz7omL(T_v0ao~g<>cgpDD*0;fwbfKiE}dz`exi z%vvHz*h{B)z_AIu7Y-2q5a%DPse!NRXezKVHU|HCu6v1Lh~9RJVq-oGCj&N(L^z=e zj9P~Vq0>)BC-IhVDOG$ltzMg^i%{>VxpbIV+%+|<#&qq4kVJ{#VzAu)YNxB=CK)Fo z!iK)xQFK7mh4sWAwFJsMHM3}LnSRQ(1;dUb9Yi!5p)Sd~O+L+{Km9vY<3#70;x+lC z*2xf+Ru8u0I4Pll)|afrQGJ+Qk21WQQDzuAN6iU_Q%%k|OL(&y2JVwwvD#B$)pHun zvW@oe>joOzHC(34gO(ZZ8{i^_@Rr^kTzDtAo9WF>dUSv0#$DEJyG1WZVp{D`-F<(S zb7$wFeUXwE3cb6=VChY>lpwzpbyvw0%U-ys^L-(|#%B5D>gW&r`Sk8e5)L{RJTEgX z-KULv-90b*NSu5#&xu~Hz6?8<{eLL?rXW$fWXrN`+qP}nI%V5FW!tvxs#CUY+qN-( z$L+qiyCjE2Td4;zAXY8VDl$OxeM_8`p zyai6K_(I>QrSwN6@LfhtTtlUNn4GxjQdc+qTD2=BDi8wO3z;?cIm#F1gYGIy) zojh-$h&>x#5hbi#)?O1Lj(2KC1X5!p`>18Uu9*4hTg0>If=OvwYobQdSU063Zda9i zP7A$Ro6aOb&(RdpSi!86Zy(uJ_@y;$#1FPF;^(iacU9nv7OsoV$N7IRL0%|Ge;8*uco#v3avK3%Fz&Ki<* z&?4V!U8C7d)Gx4dh>J1WMM(-9UHMphB97`;0cW;-z$x&~lb+ zb|O(x@ikhdt))g)l!}xI)Q8$C05n%sXkOitO58>0WbzDSy46WzCv}x}V`MhF;aUNN zOm3iN?3>9{K{p{M=vjjnW}IaBTT`uaa87>O_K1>MvlJ(pdAu+oCFh`GO|5rQ{t|k! zsV~aQK6$72fQwRIpCgBpFuUhq;fAoW$3elsk%)Nqk5vl@n4BoI#s{pk|15NC$wSjQ zhOF2OQG@xfh#uDiVtHnyC1!=RkGU$egMW8i%@idoeY!V_R0y_}=NaOFow|;P` z!7|~y!803wl?lTO6;~7g$BId(R&XGL;qkHxa!mz)5Tlmlnc(Afs6$Mvb*GEN1#92-!Px%_-mhr{o%AGpEbHfI|ba?Tq5#~+Za3U0$JGd_Jxwe z(v0ye>MdXEV_@gG>x?q`307DaM0AW&X-*|=xd0mreAgz|7&Kr%4c>Qf#E;nj>J#jt z*sZsJvHbL3WJLe};}ic-HEh@}2q5rg7P&Y8Nor9v1udh8ve)hJm4vGLPb(*I@w41NCQa5v#hT}hFsX(&r6ZcdG?{u)J!CohuZ2oce@Nu5 zU*SS5x;6%ZWaQ638agAzdyp0;(LNZUO*{%<9d(lrXYeXbI z_BnB;c%dkA&8CEiX(gZG`ll3c@?lCRk4qGf`|di2giy5_lc_>myUZMCUE7SH(riOk zrS?L-eyoiSE~?ku7dJ+1@R=F`^PS@@W3>gl`1_tMvrT7q80p^D&GnMCfOr;bdg#?u z5F~qIbVkKcwg9~_F~jgBj9reJTQtPW0fjQrajX`yBtoWlM{zR8w(^m1&;Ci~I$rkL z($k>IF>BF;qNt-tEYc|FFPYUXag71rdT>G&oEa{<+QH~ntujn;+vHXCedFu(nppQq z2{@X}o%EW2G3fTeCzF$aZ^ZPJ*||BBVGzOB1~rV5P_kU?Zg&l|e+ppn^) zUE2p*hxv&)x02KTh)9R}p6QzO&o1Az(HTw#YShS5cgXL(w;QgW>ihXO+4x~DHD>N# zmxloOKZpoq4eb9nnQXrR!Z%tRQ2|l+&MSu>Rt2~`D;^6Wqad&Ot&7%q#nOC2@$0L) zC)3=Z`?ENvS!xCX$$5TbW8;I*&ZILR->+=|l)AVee@Ng&uo4&TwUe@$RbU?-S6 z*b%1y*${KOU#4L;A149%J%{dwwTjgc9;4KBqD-Va$F}Lx;#&jyG;NOOF!~Z#?m2NA zbhRs>qQ_F`N?}x~>_Qp)d<@h9UM^0lE3V-?x;l*#YbgQXgN_;0x)0j6?VBAeFVrjj za8+vF1Qo2QOaraNV^*w$)!rjn1G95nQbQ{QOTF-jU-(TooVN zH?B|-oWZsvm?gh$vIN>A#CF@LBofcldWx+nD#K1NO@GoTgxk9WL#(mO$}0gxZNa;} z^)=v2e{>U;-d38`jE^QXM6;eF2nD6l@?$efwc$O;vYU`kwLHPR=4U7y9B_HW=+{)3 z0evw1)^lLMgm3W-!{*a{MGuYNaOaZU26N_~R)?KRJQ}7pC$!NzZB)^$gP`mlS% zEiElTHpPe(NCMC#O8n;yn<2qdWY@M7M}4v7T<1~r-5f59ch&TKP3OJ(W?9{w2lz+s z*QVGB2$aTcUN?VEzI}U~uK&DzKiuU02E^!-gUC*UGQwIhnG8bc%Y0g#9G3_|9L%bl z46XBPHSVPCW*34mP@JTN95I=bhKx(HmkqsxQyXNUCEMJS#k>ib^@k7op~b`>S1_q! z8dXLPFAm10hAB;KrJZi9XdbKP*m2zl6=&af`on4~Q=XC7cpbwCGUB4_R>PnZM#jEK zyX2(wV6;@J{>O6t&Z99{!Pd=SzG$NLNI07SWY=Q$@0wb z5|h+Sw-vM9DiFDvI@bBE(NZr@&9dP38s!h>dkkS5#2ecR#`{E}^mz+2n*s|)MS3`W zm9700;f?3gI7-8&vxJe;6BJVO*iA&QWfhF9trgGBDd$3pV9-?ipX80hh0Vj18d;}M zLLZ6&a1Kb}<}1g60;4n25S0|rvs>$J1zfye_gwOcq*fOdtkg}-sYVI$&ug;6aY-}b zQD7{>TWbd9oFaOdX(RHCcI9Ag+%YxXE8b;bH9Mo=}o6;a$!!w#B#Y!u{M;%ZJm znqUkR%w$UenO3&Yhd}{}97Fc!qf0QntS6D!hksyj(h;w#PL_3M#%w}XnH$xqOhTmR z28MhmBlGL;UuW6OL`a*&%`EY{^!rf6GxrQ1F<5_L6P-L`OfM?vIt8l~RPFuFN?g(L zF_Z}In~G|b!*!q{mxvJ|Bp)OvyhmDgEGaxM(dDUYE<5uZn|Nq^fIfSx@VfpT%%YM- zPo%!GOa?<0E%8>JIEo3zIJ=Al>3Mc`S~TwM|1BS;RWu@9;)~v1ew9B5^Z7_@Wo>T` ze~IYg(**OV^;WiY#=72XasGs|H5=;Nd({=j3_|2dPbjsmQWQ3)-fM|xZD&2(1D^{o zzq=F6f*$$h--`?q`b_vy7ug=F8pM{dn}qnB0^!9NMo45KL>+Pl`AjIM7EVL2?1gp` zu_#jzFT{SXcb{K=5=M=gNKYh+FdU^BFov zafjwm906{<5fFowJuDnCo*#l2Bo$ttuEWM_XcP!<5HkcnC46XaoDsY!Sl0*PyTq&%tiBT;npO={%Fe z6kpioIoSzdSeC?m_QJpL8m7sG2FVZe_Qlz~`Ez7a9g@C;s8F^H>+)UNpH=>p znTNFUt=Vg_D}^DZx(T)K6FT$u1xm7%V?Jgy@Z*LPWX1h){uLx^({0UN|I8d@E*`4T znB5aY=*5^bUc>Q}oIXC|0Xx(jCpskrWdSWc%5eF;Kr3u8hZktTje9v8O?rlfOhKhP z9wC+C8mNXgpI**i+Q#)_30yA6S{hl>zQqWY zfhLqRM?=HZxoC1sAUN&G`iA`OwR%b$G@4edeZ=_*`WZan?ntr*w&B1rH8tCgJ@Gh6 zPyhY>apeZUe%l-nnU;7L9zZx5j5yF~ejRqK4C;259^fSrJ_Cvw357BlepbxDI>Dr7 zTt$U3paWr5@C$y=Y3_GEK|mA3cu*apklL^h=C5&g0z!Rk7c#;OU(-vhc9T_A-Vxk| znrZ2{9+xQ7L{6ldB5F7zmw~qsPOgmu&v;B%>0by}DP|(imP4D;oJ%kV&0?DUPv3HD zy2l!@g_Gks`SzQvIJri*F&3GhH9;G9dK$n4>1!l^$!*uP z?Y)6dF$R}Mu1M2}FgL^|spZaBT#cNJX*VKvP7Cu3rjau}AO^LKkq;#EuV(@(?Vh<& zzDLH9GZ4jP^Y?n;tbf+(#)QUL*X6>i(+cL}Z5iz#_)*p4661J;DXIAk%4h90hqTj_ z93br`Mk~{XI+&oS*y@Y-adr5(_e7XScV016E6$zU63Gq`^N{gZ+ukZgH?!y&X|<#6V~3VV~Mdx4lQefFh-i z$%+Z|n@(&bEMtlv#s@9o#lt&NJ}y`o6L%z1)6`rUr#x7#k#hO;uad1c`qbp4=TO@9 zP%4D6cVez5y4PlN)PDgf;f^S$2R|(dwZvWc5qON8;sOALK_xFxPz7B-llYv61`X>% z$7$6BxCV-`!Ysgtk;V{^#xOSd1nmKXAdLY>k(k0Ge2zV3m$)JkFVZOmc|8iy7ywPQ z`Jw8RYEDH4aF_zPktj%9OYCA4C<2YisbzcCvn9NO_ThIx23#MuV=Fwtv;&?sxn|)? z9fc5|2;3t$-m3?7kD&O3{D=ifP>Ad|0|yO7F>vG~6ygYgJr*Gb(FcM~sZxmG* zE&hvNBq>F_EV5g0ijXYE{u;g^i^s%c+w84m=3ZWhgL0Flf01vHVoMy^SyyM!sNgmz zkDt_0G=p}JTg98Zd8fE7_T>&x5eIZ6v`rL|-%(XasPt#VHfG}o_+KI8#*doi=dWWW z+JDft{1;@XI$Ky_ufe6hubOQkkz5})n!X7E31vRCdQ0Bng{`RUw6}OX9f#~5x2&hEr$9^E znkHnGyNEW`scsc%@`{nuQj}Z4foN;9EjF{Y7FAI}HjW2(Iup|Cu5Q*Rt3kO3d@)vv zH$K+&W;y2veFwMr`hzM%E@IZVnLG#64xpsv&^1@=%!5QMto7jykidJNeYWSsVM1wR zm1o4quny8xXU0peFN;LQCHJ`(B3?|_{Va+75)bNh%&r`9zVHSV*YwErYn(nMvDGWY zTLAKzgPXF3mHg8$MvN2D6fBc{2C`uBbn4(Q8m(JWA}V~GoS|85(^|pZq(GCykqn!H zH%F^`@bKtjrIv`;8qlSsaWg;QBF17lsP*9`xuR*3h@_8H$RixnR+xXqvQsZCkY7%B zz_x{UNxZQHI|w<~7iaCdiZ(e1^_kRO&93%7Mn^ptASUUvBHIlf*d)_43slBjBeX-9RUBI`j$T2ls6 z+P?2dsH?#%r>SA(ni#%D&Lo(x=L+O~&eTs0YI0ab5}(qYRxIB9eq~U-G9Qh>sgwmm z{_rr2i$jeajFKJVe7rwKuH;)V&&Cf4gVEP*9}7#GIbBao(X7aG#hsgyE;zAhw1ru# zwCvgrURneUIG|i5Hxz__Xj^6E`_idUeMkOK zy8jw-(30|?Me-#L)<)E%su^}w<)Coxr)*H&LyCw%gUYdoj-~1(BCl81{#jS(47Ci3 zh}}1;P#9uSJ&fS-pD#z!7S_QwA!(+Uj(ipqN+EkG*Zx|HRDws!yutG3xSBS4CNg>CHL|we-OWe3 zfdrpZBrM^1PLjR$N=$BHv+t2;JmkAda^-L-$xK@ut2n~IN?kN!NsQ>}pG4~NhpR); zQStzn!n2ca-RemhaRJ#5%#$NI+00iOMeaBuB1eHofLy2}c1+$>$t>>#xk~$GcB+uw?NCkOTb}Svp&JOtb@*Op0CWc|aQh^C z)%^vGndUnSq+GFA+x`cVoEdlj=o4w4+*>P1`XqP6g9V#TiG9%^JHk$lebT6zx;v!s zRD|w?Tcz+1j9iNYzVHu-T=Cb?=RWoz&8V4{J58kArPErBzN```{%HU4p~AGxU}-9G zMtOa7`t%uTx%$+}ROw@Qy#9daK#jJ3Nyk#Cs?leYSVKhm)xpLEkeCAN;E59)QO>>y zdC6XB_Y}V^zSbF5pdY$6uo(P@Ki;;I?wUnH`n#`Ae5Et25mNVNyRWutEorvjyb2)- ztfx*~Vv5;A8DJyu9^l8bZ7DG=fKbbX=+R|D$Uu+i!pwZ)9$x?^&kspUcFJNs(tkej zOdcI{h$yUvaI6ta2}x3v`76aWbRy*DAY}(w zd0_?$(gQ!=NZ#vU<)lJ(R8bMPyVD=%Xe`(N{)|(bt@mR)8ZO-(GE?xw zW<+N<;KQ9+Tl}2qqjhF!ov-%>{c4NG^L5jwcQpcVn;=MC#U_^li#6pozU}-JkwNii z<2Z#MugIsevzDdxMVdN5n}$(*nE6J^q|r6Jteiq zA+|tYLHQlb6ObkKLor=sT#U>~UH1yZ5Kb!sX4!sUXJsuH~J@95KF; zcF_#E;$hmM7bT@5&I4|d5iGA?I$3scMsRs$O^BKD>ySUhqzU^+kp_F1Gf;%Cb?nGE ztHu`=^l_8;fG<^IBJ{MIH-ZO;>>Xmu&qy-Z6%qHb)Fi*lKgJ8nN|?hAxdznbY7ZGTd21;f|yM_k;R#pF$0;@R>plw$S#s@=<(= zaG6~#PZ+ECXk27~Y5>;TlYvYBBMuW(r+|T1d|ax;zR6@SHOU=S^Uz8Ww6Bm^+^6g- zO*C_P>ZXY1)LT2j9@>m;NyEUK6#Q0DAnhTZ^wB#sJ;}~8T%kdoBFs3fM|q!aQbKbr z@`>#Fwf4b_U^1Is{QaM%tvnd^uLfei3wV-8bfskU!06Cj^U@+0JdtO_Kf{s+Q&MM1 zE(h(pMPC!n=;_*FwMwWX?%3TnomW^&{Igm0MmPdX2+NE;bH}xbpDx7aTz(HB2>NAf zAwWn_5~o1j*hCf=E=gCF4q)fuULBJW+~4s38b(KzFXv|g0st@p{|9}8oXg+JCjZtP z(546eo4%o%PId81P8Sd5?4C^XE-zf9!JPngyTq!_+AZ^J`RLc(VvxxDrFb}VVmJH3bjzqZG?CVA-8>-`tiK#&1xD{?G_g>M#D!pz46$=Q#-*#gAZkJnWG1F z5hb2bBT?HgcH&{+gxeH$S|qokT|&g{+EwZ=-cf-^hrCOK;2@4-HTz z)&#PN!?UtRsd=K&dFu3AGF%o?v(4)uUdz`sR~9y#;`mo<6aZfsK^dilFeAIdMR7&U zFA;-lTF_%pXiBoqykEQZtnz#j(H@I7AcgC>0~o`Q@x4J}atWYZLrpQ4-yr{L;S9a? z`R%_f-0`1A-T%qLf46VKp8SFU#&E7tBdso~2ny)Xm_mzz`C}sFAV}(DoQ#BX-y}Rq ztD|APRqBQ8ZBKx?P(b)y=r%kpcZ0)7fm=FuO|9Fm7-(Af#R$A~{Lp8S!bk8b7;kn7x`?bEc}QU{?wu!gaGtt^>NCLY0VCx-MnrUo)m<$^>RkyCnjX*_>2GoTM%DdsN3bs&4P!HLV_30KdrBL#F_AgTtFV!tbJ z{KZ*{;MQMW@ z80KhYkVV8>9YQNGO-~bGKC)cDrpteitkR>zOt+i| zleay?rlbsqAk>x{PwU?p^+A+ivdd2Y`qvvmh@Gz$2Lb@#3;7?O-j{bZakREGFg7t3 zvv3!5H2bgA`X6H3EoEeNlpo#u`VIq7kiwc2HOnQCI11GbFhya2d@>MOfcWJ$Njd|A zwb?1La^~za;g99i?!_~!?EKnA@T#lDdim+c;vdBgCw7ad2DHp{FQ*&Mlbi?c+%f#$ zU-u}z2+KmJePIES7&arMI&k^e>L}|-NW&ncYcUQo5@|4dR3#|uCBc&;NHyU%Nd%>& zlR>k=Q9+uJE0_W3uoL!ljITs<9$>#4l=fk=DF^nMo1cJMojm(Uq}(c$7NIMddR;29CN_^+H0Pu{SuCu{E*&$tsgvg+gvE!XlB6^X ztf%ogFldx8o2S zs*q|Ee6cPzMSm+IJU=UQ8-szYrh+4&A*>_{6@+x6I~Z|^dS8LzO}>p3A*C*{mo^qDBInK2o-8eCbd?=T&oav3e%n{Uk=1vGt|CAw1&CS$oi%%;~u!f5mi^#U` zAV<10&(+R3SMl6p$_V*3k`U|a@9xpqThuZV^T83jal$h*gw&O_3l(&!a zHSr|i1Jqiq$@`qA6x)$e_`nbR5(#C)Dd0Ut8nI7vZKeZ&71se3zf(K7GtuJH>cEq0 zgO6QGp9+QPa^E;&?iAi+<9gcL3Tb$#frB?uu4xE#F^z0EaGyEKUDY0H=2giWq}-2( zddB^PKs2%1kKI%Hf%|mmIsU!=p)d=)k@{t`}=3D7SxAZ;h=%+ zC&p)|P(Cr&;Fr$XN)oQKd0+0_8+AJxt0*+z@VAZZw(Yye#ujtXHyPC)?xs-XYFX!-xZ z+dl(aw3@d1U%>VqB7+1$>_#JKUX2P17}cCir8EFRK)$~r3XR5W`$av-16MF^d0jZ)3TF3h@fwonY?zA<@3DuvC+!>F!GDP z2AIQ-n~z0*GcpXG6oXzEnXEJIu`gR&29ilP2A=U?fMy!oo>l6ig zDbzzGSVe}0m9TkNbTibG2CBfTo&-(@iG)yMJ~AmNVy^zrsPWINj=R30`DIX0Mm(vD zCM@Zq3J(igPmyS~5mJTcfX_f+qETXeK$abWx2d6Njhi^8Z!v?PGq16UDV}q#*cX?z%^^R65 zcn}k4HH1{zHUM*xDcYJW)N_HTkS^o+A}K9d9o1^+7Zi~BT|hvpfoHs;e!jLK+Jv5t zqCF}#l$@bLA6{p%KE!~YchxSkjJQl1d_$H2DtSwRyh;<1ZJ$5$Bs#=MzM6E@>8V9D5D|r_MTd_xNNO zV8R;e1r_xIG0$K{$621s-UhE;`iiYljrb)jG=oq8$GKUz}0<+8b zFN0V>ud9Orw!k2^>FI$X%sTouFv?dHQf4cA-k{0yOywD2clNg87n`rE7Pj=JSZ9o6 z>s+xcF>p>PIc$C;A%vblcWyJu_pDrSJjWdH-+rxEkmFJeThAEX_8;#K4N@EH`1zlZ zDCi}DhTVaa5$NVnY!m3Y`S*lWAccQ;k*s}#DpYk4C!UV&92m%FNufg~=sPZ>N6O&d zk8Dakua5HR*64di(|5P2v~;qsJzIb2{eVULYEGVSg|5Hxh{+ztXls3a$ZPu(G-E4j z_~kmI9B~9vWr@-bV}3yp^9ufuJD@0^_OZ}sVO~!s0cVD*UMyl~bSK=KoY|B7!Q<{r$NQTQMruC#H!6K>fHgFeYtt{` zvIBF+A9#sM9nE$C2{Z7Gx51ZBl%koq&wgPfasa8_EDYoR?bt!No<*1lO_eF%rG zPv_CWB|^x`+i&H1d<55%Rf*U0(W;u{=E3pK%l~oY1)?D9&8xB@9O?xX_nepH3~C}H z!dg?GUz6w-h+xO0(u#4v!KQ;~Dn!-G8?D!pVLbCbD{o_h6T1)6$F6MY2TRF}?|mR} z7<_~6#gmLLZxmEIfB+qSq#RK%B<#9@2$qpk;IB*0>(|3z<;*KQ0DOrAO0kBgvU+xD zrkpE)dnH99vbVMN&l6{VBaAxacIWfI2xA%s0D$5Dl`#G}cT(GMLRQ82v2j|va?Q8N z6BxItM44|Q4G2ge(x5WWN3Sm~COU87v}mz*9WY%$QxOnEvGa>ix_R%Xo|ZUY#iTn3 zWR9W#2AzIArM}sBOJI@Ru$eG+oL+P4e)#e|>BxQ<`Q5V(R)@+z3bAL;*|ICT{Wy9$ zgox>Litdo~8|F4P)fi`Bf+!}^T~rKIFL`goiiia(3uFz$3|Hk}8eT6r?=YL7U-(44;5CM7C=YuyoTB;_L+^ zlIxx7%=Sj{-k4c$8)+N6Q{-KnMnf3^lTh1+8X3p9wXXHNJ`Qdx3Fdbe?US8g$=bx( z1)z*gR<~HDjk+d`NK^)iWnvEvRh7In2WR5>{L<_cFm`AN(%L>5o!$(jHN27KsXd=`_pCLXw88M}2%{PfYqsg{JHix4=ZQnTyy$ci zX54jM)>KwNa#mS^0iow3HEUL*>IJU0+Ry#x_A6C_F;SKcoKkyaQ1*^_+`* z&?5$8N%@>K^V%3P*lVSkjBIjdau=m%#yJYWniALbOwS11c}^!w?eAvPCxrw7jZj!~ zMR}OoqFKtfXxnHGdVQds!eV-1%>j|_>U~~qB>O&~_`AXlt&xhLEYs?9wlPX^cSm|m z98MAQP<;I(P;`aT0`6lAseV?5p9 z#p#SNpt%Roh%2Zvx53n}2}Elqg7^JI3}dGHytgj43MAHC&}iG}U;8 zx7>1&*RD-?*e$nsES+Vct`7WDA&s`8bX z%-NE~G#i914ihmII!7;!Q(YpK%C?hJ)Z-DNnv>Ss{M|v;@Z9MJ$FnR>Q07$X*l6?? zNpmP-56lVzk2+a!c;KW&?oEh8FEey_K3z^!il&&_q~By4Z94o+ zER?JnMwmP-Cv}$S*r>a}tu}e)z>~N636t^x4J?5_wemx?{B~#-y$BVGJ)+ia9$5vD z@Xo0R5)t~NTNTi3+d*gKSyV%={@CbQ#wu)tIzBFVom1eIVzTzY%Iky2VLMM$v<_yzxX3J{6Uia?|kvAZeQ(KjAQbyiqD%#C@!J{ItVmxk( zilRv^qCaj0^7xwwu9J#)vEzMiWeqh@olSzAm)3dfLnQ+zmO-hQA?78c`X{rD7Lc80 z4_0soFO|g#i+tr|8%AS1?tCLo3I2|5LGyo z>$gV{4Jlw*-1xPH4znZT7t-}(2urI$o}-|NcqD~DQ7}lQ$spBHaU(GI5#hRZvk{5z zct#vS4osgGSlL6I@47|oeX3a_E}qDn1$QV@_UeO@4|Gf)%8T#jF1!VYP>`t*)u0`M zGmu4hEYGv&q9pa`GqW3B(BC9QKAbPx^zC$fzFbR#{hvA~0ESU-I>tOzeAW;-(sG4W zGC&t6Hk~NK9Uc3%E731H9iaP&g5?e#b366c9Q7uB9s_Aminz&r2mb*6D{mlldLf2` z0010A000R5-+4pL!12H9C?x+7q$wB}S^f8e-KsW!6X^QdHe|~7-_Pr78TkN4veGxr zX<2|)&1+b*bV9H+<;{|660ocdPKBU9B_8148jUzOXVv4Hox`Y>pGL`iRs2Z$T$2g; zPb%P&b(qckIpLh)eEE~g|NZU)-mAF@BQz8Ypyj|AwlYg!4G0@3*cl@&*y+!%%@8z! zr6kxHOby5vQv6{9YmxpQW+E*Dg=;$H9!#A+^m^IdGK{7+nZ>N|vX~{rm`Uz(!>ogqExVvP&=L(RSKUpauwNGGvW*MQiR2)=yJ)0v z^ctO|%uJ#r3`H9m{M1#uoBWie=>TO?S+S>U+4~t+S*ZjZsyS?`@uy#H0-8GOvO!U| zhPod+TGC%O#maRWhi-I>f6W_sMoIxUd-T*?JTwFmw-95&0fx}kv#uz_0r$p0XrL&D zQfDDM^Lf}cR9rQMjT+_7A#1>zTfV)mQ{G9W)w;#f4*g(6Okn&T1F6Ovtn{25tI zQ;~z=j9q4=C|H89%UZKSjz#4;hFXk_oH#t9f&ef+*x?O!+f<=``k!oewO||e;K%LXQS%& zFOr|&rI8zDWbXNQDC+ws z>_y*S{n&RN1Lths&XfkERmZLQPgVxaGx*P;$#(YNGIpy!(4TlbA_8=te)_)&kX`|4 z-SQ%)!iHTe`H)sazSDngetpb@(N~EzjfL4ImY?^j{2F|*t8k{Y{SzjJ2O`my9zL~& zXuOqg!Wm$3+BRK_ZS4rAI9U)I>Jw(h8_D@SbwCD#a@H6>0CxWhBK?Xp(H0HV-An5| zar#2BC$4dg!B1qEqS`(i4e;)OIOBBiIhZ>@`Pe%GHQ?^A7|p?Z&4sVXg~bQw<_6tj zpFtgD)g|GIw-P}JNB?I>JU|ob!Y5Qui)y;9AK~+aK5kGN)`4U4;T~81GiG_?RFX&J zB5bo#@4H(}0xqh=5j?{YJ>n(jWgD0nerG__XKB*(`DdF zXXiN<44r-SWr3<%wVmchsh6m??X3~IMlHQ{ug7i0$7Law;1Q%)jZ%HzzlX=_0?1*6 zkN^M&i2qOJ;(vy@zvG%3q&>De=J&Fm1+9nCiBiT>d>~G;3Ae560SYH1$Mn&#c-SQf zyFfz<+jIN8l!Vnu-Yjrx3f`=c_IgmskgOFJ*60~YkqdP3n2cGPzX1k?NlBKn76yhs z#0bE#7qzCVb+IHj@zsXU&F`O|-#foMU)F!RnSt~%|@a%Zb3m`sM_R(6onf)=uI`AO?kZ|hHJ_YTdcHT z47ztD#2Li}V3gb%)WHyCcAtnFO@hq=2G#-y`loUYYGsi%IRxFLX*2)VKWS;K<+N#eVFebMptDh+Q)X6 z8#1W>$aL51-<)s(MHRoLMco-zL>;luDo#v{EtjP1&5cud!#ho^JA|4ya`dMTm^1~W zeoScer<^8As9WS`?Qm2VDTv)?KSt=00v#$ar?+t8`z<;xrq05*RItHILvB)n-Z+_ITMEuRX)QIYhLO=174as z_h_bhiCxayh=(dcN~MBgBW3C;n>!;@=*lRqF*;x=*YKBfjHQElQ_B^E3ybaMTtkhI z(S}w^Te<}o(s2}K_GXl+Tz0WmY9qJ=6~*pR-2Shpw>#Iq9r1?5`>H$pJTV zPOF}>`g|90EA5Y%m}MJnEVfcfIrOFXwlakI*WIluE6^j4wYO{K|H+>>eG20bOvD=hv~#v z8)18^8Z}v86Nq3zcJZk%rCpN4@k!4mO!wHi{4))If+g@f12dTp48PQwjlDkHq_)JD zOF)`_-8Q_JU9e5*xR-p?7b9pq`^_GIw+D~3zzd2!q-j(CAcaVHu3e!dEx9ke%^(CP*b-imLN0_KH--?VN=0}F&_oE;9OclyP2+1usA?LX3IHq1#R+tSV-@5G zY(|N`B*82WIFvj}d#UPV{LbfemV%fFq=gH6sCiF&qoVp256`9bm*;tJtzGvxGk9U} z@f-RgMesZPG93_G?vhO)y1X}%HC zRMVhi=pMP)=5|;kI05mo|86EaO>$Dc&K}GAm3N0eb_zlKg;Zm}NpqwTte$4HLw-@4 z@bNIYtUedBf-|eF(XgO+EZ}li%V}pjp28S`odt7Ez&e3Di%YX`1d=l2!>&jdn_xq; z;W;f+sM08$roK7FbjyCn9c$#EFA`G)lLRJZ6{?7nu?graAk2UG5sOoLT-2)2%y3cA zKLxkaD{jFdPccos>rH4zr>5uUnB{gf-k3&c&^%g{r}Ir@n!x2zO14mwmqmit%O^_~ zC@88-C-C&=h1eUXF~;%4dRr0t{(^^3{*8c5)dJLPFHvF#CwJroPb9zOm8V(w*3p@n zYM_nmbg6TM@kLV&f1I`UxS*HWUTg{*>z0A1G-MakJ{B%|8+TUco`Ho8|HV!5o&$^J zWr6~dssP$zT;pV3Cs}oXLYAFD)E#X$$sj2_EH!taQ%-hHr4yin*Bv-p6MsYcS9t0(W$ecHzKXB&FgcDZhZ-#c0gl#rneLh1lOqIdNL$`ld%@I|X$gpx^Ua$H}8nBkMYC)bbc z$~VkVNv{dX?<77txg(~9zX??Kj~G;Io5AjtQF#OTIr)|hoeu2BuF-mj4@6Q>9k$u^EQ)a&p3;^I9{y#YA{SVOp*P_FR8nzjRFE6@ls);!GL}@_^Umy@7|%He zE{`YonBTy=chit5YAQf>&dsy$%}4i~SH^bRkJ}pz!0)>*a90AIh@A2AF*28R1ao^r z?RL&a&e&6SOaT(op>)MVh9`Dh0rWh@#Jt);vs;alW2f_3B9&KeT$L%Y(OYtmwBarA=f)7=S>()()TipLJv;+%HBjW~ zEjY}Yylo>4rvT@=vuWY3Nu47PxGCRg;_Ss5fR&~+*3Zq^?iC35 z-6>{6K_>lC->h|1{5#R5##lOo< zDG{-NM|INi2DQD60Dplj$9YwD{Mp(v*bqtvMvCdUxw-1Z-^P@2(KZSPdH#8^v;W+d zio~l4X=sr*zZ!hmwG7GhKHoyi^2*Ngx?M#7ZgDaS!QGakd1yy*?@!6V;zf~%JfN1U zzjpqpB#s1L>W8u9rmA6{GYDv)^<#QQ>nEc{>8R#2smvIJ?PFJK3Z_*QNKA(#VG^^> zhGT!;bQgZOua$hqF?%=9jqsSUps6-hj^Yk(s#0?eIt?h1e1dr9SS&=fMzBdD2SMvmNB6b8#cm zBCC%YGY18dGq<=^+i|;11HkmxP?)jc83HOFa6!g1dO#>+sg10C$>(rN{% zSoHR24xBm+cN~s@nJG{GJs52UdlVn(+>krea=Hz*d)W6EF$UAUpi}+L)Nwf=zM+t} zqJvuNJ(=ziLrp?2=uhlEdj0+Q0KJ3E0KNS+(4A4cZ?aZIXms-_N8n$_paxLfso2CsQTemWV(KzfMsm`3G<^?E zn#cih%*R`z+%WJ!LaEJ^LilO$QWC>mICm~6qT>1cwob>>wbSWHFntvgXU1$gh^d4X zb?$p{Cjjz1T)TBh4z$rCSgBLx1L)?Aw@J>;O!m?q7Qv!tK1DmDY>e0@>jhk(d=coB z>M&wcw(N#*d3Wbj@Fw5j(CTk8^ND!HvoV5%KmadFkT3?CJJq zHXG75m!or%*;t$n@x)4gkkwGIvkvd1$on8`IKm>a1(#|zu?K^k%CWNrid!kcg2+T+ zSD4gYMwHqxS>~hsv5#kwEgiOi8j~We8W3IzqD0LL0V*)?2ETG+O`VIvIG3x@J}Qof zvaPtG9){9VsEbEMv ztVG_f<(ZL7R%2XH7UUBOzmW(Wo^$-B3w-H!w8t*8DlS_wtUDY)kKr!FSGszF7w3mB zy|ZPVUWAB!Kfa3AU*_<%r#=kDLVowotKK9Vdf2ps^^eB zKx{d-N32skXDrcuIQ0p4VI9wQ2gfrierejl{Ud$2t@Fxmr*=E)eV!}EVpf_q%oIYL zJ3x;JJt)c@g&=-lRai12Fv=e+whWz^o|);zQta^qSGmlj)PO$&s#i0nwta1~URIqgfpeXaRL!pdUs#1L z1n*4B;vH9)Nc}exH+bsVe#BvZhLv9#pWh)qr*%g!cGMGo_s@Oq7rVG>4s#FtfhR+` zX@gl5wUgx~X}+;w+-q<9ZB%`dwl5ddmtM|2!1pT8yZk93K3oRREyaF*QEP<$l^mD& zMs0o3FFKEsZ=I206pZ^7GW%Y-4Upf@YJU6wUIo4@KaIx&0svHi{D*xo_6%kJ#@D%>Gkz}0no>JX*}w8Vrfj@(*F+PKz2^&tfpopzwb>R zVVS@L z5MRaYMUwEM(XF0zqrqr*42gkA@z?{=eU#r5+2^yzVK=UYD#lA{;kVm>I%-m_Ask{U zJ6M|F@3`jt?nLtJj)PlTNL@ot=gIgS4=AZz3Rmv;$ztSmv@5~+kRIS>i7YB#lDQ$G zD24pf=%250X1$)IqsB^DhYQauvIr;?V$#%o)$L}z3&DDIl45fvstrL`KB+@UdVguz zgVK3lF^2Hx8^SPm0QB8qiJ$HrI(rNRrwv+rFx`KpLkcj845N*3?xhg!S?Yf5DMwy) zt#$Anwu~#F@zVzAu)XN8HUNYgQrb=NSAYQuSJb*xiYYRut@3kba{6FKE*Z8mpe1tC z;VKe31@@E&V%&L~2CX>RQyzDd-pl<*mR9Rm%>j^}RKg4Yp8hyTjzm*hU&@Wo% z8H@LK3o?4~Dwsy`g)J)_e)SO_b5#qxiaFGQjf;T~Gq5-8G;X87e1#{6a?}VPFtogV#nwH)?rFP+Z=1G&%T}WM#Bd zKsXel%R$K;hWU(r8XIk*U}sBAa&Tv(OE5>|q|(l+q1KgXGSJTlt|u0OZHf(=Mw6Jz7I;;GtX8%WL+-l~mm z>U^FcJ>b*&5{3$l@~8$NQ-PLB8MjpZz$r(`q~(Bm%fTxWPn&4}JZi~-0?Nw2N6ilO z9|j?nENtxmb`k%V7Sw#ge~Z1LWInrU606Vp(C6 z{Y2yvB7+_O{L3=6R(J{9alJ0X<7Q@hcIqO}3?NH=x_{6NN{@P4J$(j0fCEa82AO&q zX^~5JPoyjO$g)9D{3--3kzVs2&||$?rGyhzC6DH?WFEy=gj}xA$cVD@850=3kuQ+H zl1GmjGm(a>M2f^jrd+GS`i-iwN)Z^Q>vHA1mmB^GNcAqQ6?@e!1sTC9r!LiYIH%qR zL3=}N1?x<7)+<$W%$2kMRt`1|tJjhkK zRe!I2kvtE4>*3F9R{GM1)b7bKGSzD+^Bk5zd>Gw86xKkULGOn5eYL)R4amFAmd4J~ zsCyvx&4w(1C_N~T%3*r=K$tkegxNPlMAH*%B9=|DCc69O!JCCUWX^iJ*e>ba!0W?n zIE5%Ny-j@HI$)CFrZ8;pzx|RXNO%L__?t08p#cCW{&$f7*9_DDCk|zUsNT78zjCh- zl{&{t%rC4(6{r%fZ}C7nu=l+f#J|9GYQg#0_pG2#R07V3;hlxs-iDM3@*$@dlDrx~LcR!Ov5`T<&FVE9 zzZO-bYBvi<+qfdCjl@tDMQYP>wQXd(oPmB7HA#LC{U4)B3j`Uwt9Zj=3iFkcLBPpz z{Y%0IV`vxKGt;wLtX^eZl=a-tT3$r3!c9NeH0)ujnM2klrfj#xQbrS-70R2)$= zT*arrP)6DF$V=S*UZN`!-KKfXLFd>xVV;}^P>Kxki(6KbvRGY%-jGYD%<5TJbT*Nm{jf}YZDO5ER>SJY$xCcxad4~!9sYG5d z4>i#Q+%&BA@|7(wkp2K3%4-=0d2mb|qbwLR<^`8rprQVX1T~|G*b$G!ezh3jgvNHURNL7DBUtR9^Kg zKe_!uOo4woJH-PZZbg9B@4f)B9c4v;{0gMvBF~BeVN>V@aR{7p_F_EIPKgBY6|Lzq zlbZ~V(aT9$-;r##LLy`3KIahz(_f~|hqU-s5!R(6j3tQ{Dyk#FQ5rv>bv(+p=t3o_ zygCxbuG^F?#K{2dSE z9-EX^j(rl{W&K0ismBiMjKV&zbHvXhg7etFY>;BuD+;_i@hB8Wj&XPTv~WX1s3`X6 zW#c)+9^{J&5*5A(bb$LIa{iVfkv+^>3H#&%nZS${O zv)oM<*8;>6N1ZTSq0w0p&M zetITIo6;m2sj2I=oe7cI(AFhcQe|YM3CGV#wGjn@$f2_cFxGQox|%xtS62ZKwpD3D zEGzV}v|8k;CBVm2jUw*ek}<#eO(Q_AWh6ycC(r?{9LBvUiZ@mF&Rz-ncQ&c>sgqB@vQuy>wvk6fGkUfebI~6eA|ku?ixm$02L`l84`}| z*-6PtRo1kHCF9EmYc`5lt1Ly1poO$~a+&8$4^j%2PI>--uLWTb#L2FceF)uo3IxL? zh#^{0iORP1H>^S#xN{#rzt(suj4tU7zp5!s>nvmygdr$O&G|}0s#Xejg^{>=p@BG+ zPhdKV_VNQ0ZA5cl=QIoJg(_bzGfkrH5G1nVG08fEIMXl|l(f4@ZQse~CF`%`gf(X^ zDJ;(&S6aVONpmQk%}NBw&EVWM(P@XF&C&xE?S$GsQEb$a7zrMevNH1RP+UtLT~HLh zF%^(C0&K&0HWY0&2cVns_J}r>Pt+So z??PZW8CU=sqF;t(qQ6^`Z7oz+SGDnJflF-&(Ob%c9-IfltyBqSQsos9NgYBRr7*Jw zP)v(dnwo4G4>JQbP@LLnVpIao%d@xlMJ`{Amk?R6KksfXx4Gz@nKMrD z;McVk%CrW6kXdY$deyv3HpDy+fp!RGu%n+|WZ7azyFE7TyCug>jp8(i0BfXH+6CI! zQgAx*E%ioqtvkW$>*7dp?JsCbGKdH@XT@UeNp3)orSjQD*8xZ-jt@zceJ6?4rEeUa zppcsH3J!BUTmn++%a;9zpv>2wH*dqJDQ8!-$ABn3Q|skDCHZ zSSBoQ)vncpb$9Si{TS1hBUVeG(c>o$xscl)PG$(*QJw(*{Tx5cNNMe_@A@IGp1|1GW3}@mx4cx;qm9u8w(5u#AqyKSVsb)P>6H@NF%|3#x3S8hK8_Z! zSNrfPU_NHwg@v#3zHi}{-{w#&lqvIvL*4n$H^^TTbyNUmH<0h5GJ`{ARQ(^FWRyZS3?l1=jCCpL?2)ry=JNOH*x#m&h1mv z?qNUWm=)0Nar*Uq2czAp`J#N`(Cq_h5BuFVmLIn%z^9F9b`#JYLI)Vf7sxDyr(Uy74PkJz2GJA?;-&rO5Z+Er zBa_kAW<;bl=cmYjxCsW_~E;pk-F- zdGH-68yayM8hMmr!e$o<()#$z(3wyzJIx!Fxw{~}R}kNtlXc-^Y^lC?zE7-kt}cRL zV}w{dS5w!WkER=LF2C=u4?KX`Jui%$cI}`O2EtG(Mi@1c=tvLgQTAF1ceOz;M$21Y z8d7?SeIN)W#&dg~aJUg}n$WnwbcBa$Xb`r*c8dMf;5d_J{-lLy4h)9j5G`5)gyHUJ zkW)s~24d>O0~b|6$v}dEI{1v=$Va%;o5}Qx-Eje*w*wX6H;T=$s;m zsE1@z8V9P$waZiNwP_uvwZZy`f=fGTpaCfe}d8IRA zHzrJ?HVFl}Ne>hAZ9b3CeA5}Z+A@weSd~;khd0bPhHPs6#Fi&xXXUwdARXOwrgwB1 zlE4X&DQy%GaEx6lEZwNP=9(qsotk_CC(2m#vj#4WZtiph#`aWx85Rx)7b zEHN^uC>-=k7oyoU@=tJ-qy;u|D81q+-N0531FcSmIeTVB&6qB#LD_T-s!_VL10ZHK zeQ(ipa`}epJ!Dy`@O-HNkjcAs-*Bq>gp~S1eU#*71UPo|PO2KQXcS9Gf?VSAcAaI_ z`dAo8dLh_Ru^S@`G4#gR202>-JhvrJ{LndK@7g^m?}|N? z?#X!v{TXLa+Hg6%Ri^#wgo)CnQWGUch$T*})Z3K6y1SU*FvwmPskd0nOM9>@d=Uj1 zfrbmdhb<^zv@5o0)4#APKRoFhv5=9{xGMyJBEY6ADigX_0$ zZ2^!lf^H1D&QtdJcmW44vub|RpS*0S$uOfBcmieDMRd()ew9g^+>`AQH3ao62c7~a zszZA?AAf)H*?dP&!jxg936bj#Y;q+!)aJU*^Zo6lfSex$21*&364q-A=iyu&3QzvF zwIU%?MPwTA&bqt;TA_r*EmoKXye>buxMnGf-U96i@yvOr_tbVXxOc9fviC-s0~$t* zHO21gWE}glc`>(WS>=6V-Fyb(_N-b?0)bs-wWXp$EMV4}#aj+8f|fEixKdX>(G<_E zAN1Zli#Euf*pj?a4Pbkqmi7qIt->gz+eWJha$Vr;l4JB;79m8m=_+AnKI4K)(wc0fEQTkT; zC*25~o;?au3Q)27c`UD`_7J)-S?8 zK2Seu^34cRogQo}Lt!iP{w+7Z<-ULynQLhV_4Q3b)(QVfxL zZTGN1YZ-25;9-YC@oQ7wv;@4lf-mBe@YcfUQQ3g+a`1bp9Bq>gnxNS*+BN>r2zp6@ z?+(=nY>`5?PR?ExirD$-g>oI4$)5V*m;Dw@rzulA3~QXkcuff45-J~c#c&P3a|3Z` zORr}N*AZ|AS-=_QA$Zhp3qPY7>1nS+_OkDT_JX;j8u8}V-xEl9l?OLFFxc3z+e?5y zzcq)CgLpXv&85FB4k$wgY!LS9%27;TpHFSPlBIHq$f?{nl?mcyml?o|(YRQninda> zscEn@RPF95r8O;C;$~Vctu|JCjl&(ctD9PGURUMTY2qJ+(k5K=;;JbgR991EJsh^g ztRa2@D&uk>a|#`#I38-o4&2kALiTovP}MT#a_FM?y9Q!rrAzwNya2gC<|-Xm4jhu>O^`x{97)IMP7CET6(lP zTBnJ-j~ra7)%?n=Hg4q7mCDtX*|KcOCla_)>T+uM)xZ-yK^B4a)m~!Ck}ESIp8YH& zX9C)z=eUWsu*|}&r^avj0W4%OBJ(~WrbcSMvK(EJo~wQ|(!{0_G%3PZ)x25!;M&gV zQoTyh-JgM?OXk%Ibs_=QD-bynlw7Q!cxl#|SQCo`g>VFDUOgYbiO$v~vQ>D>a&!Nl zQku4K_88Is(w$TU_!DY-qdIQvDp{87&R}rwlS@Ua+F$ne(VRN(yWo#7D@qF*M`BSJjQEhH0b2v~u)cPmOjM0C z7!Q2|@=2CCe^CS}HN(DsO8{P0JGdN`G#(3`#y1$lTt5@3Z=e~>=koB}t&^yA^Oj0E zy2?Jl0Z}OFYoN7OmUFVbuJ`cbJ&{d>vhX1W!yR@mnRg{1J}hPhZUhaMJ!BUvsP+d^P@gz7q}?kE*x%8wXJ`e}cibT{Phek)Snm^BE= z9F)9_2ywP(W6n!)ZiKv?>DJ+F^Sn_u;SIan(ulU(&WPQ~TUKAQgBSO)VZ2+h5D73T zk`N1`w21c4+6cb=InvpoFcet5#!=ZC84e6U%moV^4U+nvvEpuZp@|TDq>KsRYz&PH zV@|><^q44+l4jZNa9gI#^?p6+?zlARPn0_J*Q|)XLp;!LivvBtqrN-5N@_)A(r+rU z08K!$zcG}XM%cTS2j2E^Uw$Qtm`N1P#RTp2ybJffp33V(15|YnS*HC)Wpwijj$KW`wG&L+Pk#1j)rNNmc z>t;x_Te;pDPP!9-q_504O2kox&l~KczLCLfUesCRW-QCZVLzuQH(wHtr1OOW`u(Y&;__(D=AXT$=&D)oz;$^FU=BNRG33*qfsMl0$dlcX($6#A-Rw|sE zi;K#TzlWQ|XS-_!(qFg*$i^}RF$xjJ_w8%|fgO+gTlHDL(jKlDlw_UOa4SDDvpanR zA{f)Fw%+iYyo>7Mi@_46Hx1sT!Pae?}nem!EPJ_Xo;Qyo*WbArObx00Q@#$-d zuqlhsaZ`2eZ-eNG9Mis1Rk{-N0~vu)aKD0&O@P~L3-HW*mUaOgIuH!1M^t!|)$BMI7g{ZvALu)M{HmZ`-LSqM zHX^#{o$V-fXWUCWX|tD@VR*rx6PAqJaP zUr-**+I(`TFs3m(=rOD#poGkP$eX1OwB}>}Bupr9cN7n)S%A=8tMJ%D8FQZ!B)hi+~xAnQt1( z3(DM;QywEr6qG(C78ltXy2}f}k%?~z-eSg|)O(N^d zp-b#P&xM{Q>al>^YxX(**nvmxs8B{1FiZ2?qd1f#A0b?(nZiirV4ijNtkdo)35~hkkMALvt6$_7718 zep!;@Dv<3fu)xJtG~EVsqRCZ~a+l1GFWNY8{L+gf$ltGOUWqG>0Byiu}k6IFWn!v2eW!{uoWcnOocg}iUm@^ z*>FVSTq*)rY}>0fyO1efs{PXJMzMIN3hM0+g#O5m!{wwFJL zYz%qPU)W|h2(wlHk};$h@zG_ArPI%`wS;_dAXx>K{094{C#QFk!As^Z003Da006T8 zMRn-(Z;Fbmv{foDeN=*;5|>zTC=i9X$!LPyvTOPq*Q`y4?^W&u1b0B62x66=2-nEX@A>|Gpw8ccV zDM~2Z;n^%cxZ=8XP#TjrOz0Q;3Hst{-Tar@%awxHca?GpJCdi4etA-IA9(^oIi3hZ zmp2DpkyLZrqyl`D4C-olH=hwds?b7dR3K`Ef0(HMP?~)va`D2+X1nBxDNyWE7YWx~ zBW-PbFdO1dGkF+zosgT>DL(+8FI*Z`sfVm}*Eb6oiO z;2EERWzJIxWQBr+$~LNwuOT$adjogHJ+S7uV$&d5A?X;y_~yq8Q>rp7#4uZ+p9+LJ zYFedm$4K%JIjB=}=U*X=>If|ov)8W>r&*4d%t!G~z9iYq^YDAoo5J=0{nKel)r7tx z?k~I;|4A`Z$=T7u*6jaM%oGxU|88wl62o%oTRJEZ!QLT8fg=_~hASTY{j82HJ7>|V zmF72+6fDgBpZwy9b^L`E*jcxF>z3>KmAld zzCr&9>hVs3 z?eSkw-TsqE=6?hAzeF;3C9wpMNBbBoT(_$+f0S!lF{^4Mkkg(e!;!7=@rzNU<(t)# zTrz8IU574*TkT5JDajvyy~`hDY?lCAHK1j1INi_Oc%NK;_V#>(=mS}yN_V4&27o|C zkz=Yi#*akKb~D~?_E!cV1}W^;wz$5)V(7B+N)dEw=R%%^+fANP&AIUgj}6v2sfFBo zr4Y0ogXDUS)oWO0-!lCL?UcRi3TeOc+=pN57Tt(^$gTw!@b*QCh;yjAf|TS!8?Z4;0Wh>!S@8tEjcK;UxctC`i-t zrcq8!w*f#<4-&B8syD6(;bJ}q7V16p$QS@L)Q>egN;NEa^69g8ZSaz05UCF;t&++9 zx48v4rF5l1L~fddZrB-H)%JqXwD}EsflIP1m-Fnrt@7$>T|X^3_8@u<>Qz62<7+UW z$cS*LgEWAHuo6*tY_4JEGBlGi@j!2h&X1X@ul^|++Kygq z70?@&FZ8Fd7g5z!LgD1d5BT zlY!~~c~y0yb#`}dQJqTMq=)amN#jR3#@lN)NDHO}*CJ@k4(8Es5In?`;J$xKNIGasE}w zq_nnot2DTkUCbnDM}8~y(`xx8%(f=O&lK%*xpSpFea2?;pK|+B3=Jbt&B6}6*=e)%TxXh6B8m@1?ZEm$`dTnyN8&Kz})IPVx{FPN{Y@Vcv; z__3JuKq@1iILZXh_Pic(Jp;(GMUx~9R(pQDo-t`Jt&Q)OFx@p-t#=u^u%bR&2U4CI zz+SuiD9SHx>?Kw~=_Isxauyl3d*Y$E%Y`TpS_XeEawhRkDxTBpGp(3zb4M?q7Pe!YICNXC+! zVvgG~8#o9{vE^JpZi4i=mPvQ%vFs7;NQzgUg0Uo_&|9+jGwC~`(#=$Dl!ZA`l`GEc zCfn;er)azF=kp1%ANpDgeNY;YH`wT4%J*?kkdO925ipI$JEU&qPb6lo<}0WM%QPu{ z*&jQZX)X2$E6Z2f01y_sOm)TvYr_x%-V;w-`ng*L%9AOalQk)lvdgvX5d8S2BoR=f z2|B3Ifb5G1@1|CoBhcO2M3RgLscy}qMU{_nb6~hF&>`Vk!oS7Ro4B|bH^gTAwJQ_6 zhoE**8|T#gP!PY7%ZcgfF2aCd5r0@WPH4fh@ioEjv22PLm#leAAhK@m8o7^lq-ay+ zueb=7?NP}Z+)q&rrKA@O(6h^J(z;F*wPYcG-MWSj-z31`wkiA8rszbvkfwvH&czqY zK`8M0I%>-7`(vo&PFj%>pFw?;&r<3L6}6|s<%L2sWG1X3^%e&lws29mD^^>>iks@oje)qBdKqvs|p#hTEb7BK0O%SnI~<*R`Gv8WrFbjVLys{$9vgEe$2G zF@0+&4A~r{wL?4$`>?__y2kifIyRFR zM64bykV8{gm$kXJBHX1=wx>s7JHLO!iBP1gV4};v7c9ka(n0tyrYR1_`psJ;~&Sn6i4T?|q&8Sh+ZmxHaW_ruYk zm)uOkhr|0=d0OC(Qeg6xZgU$x0^C(R@~-1GM;Zi+N@<-?ykqhftk|Q6EU^Qfu4rTv zL7zhwgsH1N;<7V5VK=Cqa`+F_uZ2ciofL*P4fTV^QY?t!mxRx!19I@w3DJIGx^iOJ z4Sezp^YRO3z!fCXn`@J-u2nQ*0lQTNJ*g*;7Ou}(l&Sj$+>slQ8saeJx+u)J$;Y%% z@$HtrvuSu)_#!)=f9O?u`3-7LHP7dnX%O+$^r$Y*V#*nqEYf6;V-k&GRl3}O$l6{R z=?|M5(7*kHxuTu#3^_8GK#M@HmlZ)NKZ2q3NRp&9jO6{b)GqcDO*6eOM!ipFIX<@> zujkB>CNz1KYA=178m;u9m`?miK|RkU+Lv#E$e*bS`o_fh@YwgyXKB!n{g;iuMNHuT zY!UpgyDVgG;AmjvY~m8YZdo3A?5Axh!__oW+yNO|*qaeV2#r?TA2={Q zeR%`gVEFv zL%c;(^>Z8LIDm%j^;SjXF%1R@!jSJ%1Ibj_4!e(01VbW8B)|J3Rq}c^O zj%c|gY?GWzc^)2jhZ93z`8f~HUqZF;o>E|x_=H;F(5;_{ZN+(PzD$*)9v{)lm19t0 zT9bmE;|P@;_86K!HVR=xo+#{CeB8UHI#vde;MRkHHI*&_dXuyO*t4?ht)j7LNks;4}_Vd1KJk0$1L->aq9- zd;%xYR$np+*CNrtms{=4uy_$&RTgb$hVP$IqDj$>IQKU~_`v_i3g%x?B5Y^$|B6xl zgY0e8utbo3Ng=G&Rm&655RwIHNVAe_ltoGmX@XnRfuRBvn>S}n5nE+k9hxkr%=Iw6eeCZ30Mo}MMmu<8j+iM>PrhR7 zjiV2xDNw`Ad+H3T1%(@G46ZR6Z^hri*g{T3+H0l6r#6IYF@`#5p>H7^xa_~zgbRUU zKxja4gbIwcZaaslbsRHJ8%x5TsBC*oeASg)uB-mN0?X()m@&(Qq16F!Lh6 z;VL_)S$X&^4Z=54_P`6zMr$C!3wBFV;64Z`*zmh@d`<6x)mmt=Kwv=&1)DZCL8To; z{49V?RF_nN(V9SvA$cLYPStXO>M`+TcA00Pkt0hVaD@h7iRg{=D?_-USQ|gF*TZ%Rw)lB$MnH0OEjvfJPER zs?mqVAxrP|>~-t7FiQ9Q%B<`4R&}$xXz|&V<#B`D{};@QUecG9U^ z=FUU965U5&JKd2-B1(0$Gb|%glrop~ZnR{Bd+_YwIJDeD?=xUUlQVi^7I;|wGgD^oEMX2 z&?scL4!gFvinP>FV>+t<*r@1+9Z;miyY2JK3ulB$X+_5|gA6;o zf_jw%*yFsb@Fu-Zfws6ok23}USm=W~gjPxNHv5#V4dQVtoYxDsX}w{VQjf|@J zwDc&w%J$9=^T!MOT>Z@#zgJ3a^KH*;<~mNkuQ`5lckuZ7yg}$AP*AqfEyhfuDbX+Z zu@50h71Na$LIojTkhjzpV!qeEZg4!^m;HMB*k|@j?b4oFC>*tYF=sBDI?I7@Mhp!KdW9e0w`p0Xc zd3N!4shi$%$aS5qO$|*Sl)3bI><|s2!RHn%w;skpS@8BPf6-w9)_ocrH^5~hCoIkz z4j0?P!XcoO1{ITv7F=nvawl0gIk&DMoa@}Km7j-WD@{qw+cmwN?y(2nu^)~dGM}?; zvRqJlxwmfep<`U_{gE>J5-c^3{r(l*>`<#o2b$WXeNQ%C9nnUt$vccKa$q(OdnXJF zTl>SNas7B_CYp$ z6`pkwb9%2wr)<5223#b$G1yQkr0ZbH7jhFJN4*zmNG4-?8VY$M~Wg^5oWYk*T{r5@aC$NL%5ka_pl{yl$&8b)r^|g+8m{s ztJ+_Lv=%cdrM;BK@Pc^RY;*iSl)Y1wX5F?e7#X&0+qP}nw$04I7q)HN#uv72 zBg4#a*1xOnxvloDds?gWupZ`f?`!lv)|h=Pd_Q+prWypN2>Up8O45nEQA9E{r5EJc|5+_i3V{i_W*trHSVGm&uemAN_Ce&P1^OO7K>T$zFa~+=XOV zAdJVwJlDySc?hp((cO&E)xpesK9qtZ)82K1fZl*V}4E9_JwquqcO6JBcBOM!vR|&SPjd`x=K% zSsg25czU+4g|UkQy^KJZynqu6e4A~tn~I+!Cr%4{{n^o9ZK&E?fyB9CK8%I%Xbw`FEG^%ud`|cY?LxE~Aq;$`g_~`a~wderLJ9(LbfpyvLl_HQLyq{8;fkB5X ziG`7wRN$yukTw#u6t$6THgZ=aUz`;;Fr+>7!|9?t4O0LIZ5KB%yuHFsPR^X0ya@|B zTR#g$k9Q+<;+Es{hm+ka8T3HD`77J^;iwVECxTPgy%)mY0X|&D!4cf=$RL|nu5U8y zIu!rE)gWBoH;F#oWcfvGtQ8~@f<7}Qo1F8nU=Xw@cUw$4k2NaEMk0gT-QG+Me*xu9IyE!oz)VXF)}x*^-y&g>qUS^;ZSkaa($1S; zyuOTiLWk83m^kyvVeP*YM#`ju8r!r>3%=Tbzht3BoZ>IvPcYRf7qeWATM!@IKE{(# z%Rb$_S3;Wks9y9<8ssY#UWr{&OZ8=y!)3--iB$K@p!y>1rfD8+ElUDy2<37o?jEs2 z4UU8~R$Sn^kEAw1t=3s=w0M4kJ4jtWEEqPaY z+9uU_3s()5AGs@mi`b?R+9m2&5?zv|I17vz#R^{g{Zfs+A)3tb(;zGVB0xRXwyx3Gq?)KBMC_-~@nk_ml8}SIryv2*DfX!? ziv1^;{xk4Lg%o#lVQlf*wgEhq?)>aV3n+%>0sKHtZsf{w;ruVfXsvPmlXMtHLi zsc8DOO_e;DK9-_)FFDVZTC!CL5wLQaYpVvfi#N1s(Wk4HBMw65~M< z9Yn|m#T@M}g&*VS`HRtbF_$?s%L6Q9i8HFNw~(4IWi0XZnm=yx$ojF2EWR`T2z#=k z{j?RV!Vc~_gfm7z=-g%b50paHM(`macd!rm);N{9sl{Azq0ll@UjCZV(>eop){*U~ z9F+glwaL@c!qc*U&WyHpG=_e-3!{K9q1Wsf#HSotu%P<^uDA=7`*ye^e-t5qJhveb zvL`Oq8?VmpJmoGf*U5ks-oEGdDf?wtr6Y0OBq_Q3`MxLxQyJV@4m;o6eA05aQS0#I*x_B*W;N>XsS#nNh$j4;)vtz67e z>6oToO!|RRK@C+j@tQCP1llMqT1y=k3XJ_z?d!vpNv|-zHwG2^%eRweKFNIN6`qFU zt}Dm)-G59~L-wx!z?+8c9P?o&Q@yGqutesU2;~eb738~Y9#M6jVZ63W99bFM@9hDt?P>l@C(~q{m_!_Dcyx-Wl!}~rW7FZY zitlbX5#aop|M&J#7A+_epc!q6!*jLABBxb2i0YPzd$Wi94V&sL>x;g zv{*8aPuu?d`1f&`QyjL0?hg&6{%moFF_I|LdaIu81@Y_OYIIQsgT5QXN$@7(#c#}o zo@^I1oMj`2!gGu>*(IP7Xqte9RJA6GftY+pMwrA*V|cj+$1PCxMfiIV6 zgernAphg{ixv3edt7rFB;X$*>(P!#k$hm-Q56U^({tMCFB@?)@0f0h_{W}<>Vl@A{ zk8~%6b4w4t)xzS)>SZ~*?dE#3^KtnnJ|D#MZd`(p>p|P25s=Ne>M{jDz;op5INGlZ z@q_OyFNB|A1H>2!8jr6o7aD8VgsZYAiRhhUI!T41|E?M;2CEbE%MaFZLm!1VzB81j zac4Mmp@+V|G+-G1dFdqzWojNQ#sO{kkeJ}~(#c~>IaIi4`6!cWvSZD76oI#}4~Bx| zBXwoBfFQ;2tQ!um7uY)&?}O~J0hc8i-lWBlA6}7UBHOIVDycXBzD?&m-os|bexH{MiJ^Jh@#*nY}GqdL(CZo zoOE-2P2>S(==z92?ogBkBNgHU4V+?>3U7tc6=+@-N;Cdo#}ae>XyT|yX3G06>)iwv z3Nu}xOb?Ez?x+V28>=HTczs6OMJ%iPFxn%$>LiUbpsvN{F;kakY^Nr%89K5ox5s1# zua0IELHQwVnidRunP%(Magw!4Ls6RFz@3K)?di{@}f; zq9ZJ9Z2nSWrJz4#3;qnT$jFYi?$Dq|D$E1fXWNC|aUJ3N<5d{aCQZyx;)f65d+03n zz?IK+hK*tABcp`zj^800t4Xfzae*ufZh<=dD@*73nZ2co$xpTUtCy-3v{TkLuKMKn z54IekZI{BOruIP`({7A;dF#nW0oNhtt`VnQmrg;G`iwfW^iG9l0rw|WjV ziAHyTrBbV8pPC^$f1VUmFA}`cqM1vmU>Ab*vQ!Z7vpW*md_T-fwot7K-V<={4!+ek z_otN$;^C-ZJlrs;ndPDyDzW{S7e3Cq@K^(S@;5NkK{|R1n%w+tH^;rkNzP0 z|IGXNGtWWqaCB@czd2kP?l2T_4G;l>Y2EWE8pqU$|I;izeV__He{^9NpBKHrg}S8g zPBL9|e!*hhbLa$w(D=(~?j3Ok5?6C@zb2Z0gw+HM5`4zo-c>UlQp@0uQbmx7T<-n~ z4&*Zj+R{#n zX4~&-dC~%LH?|hwVtW?(%3H1j+HT+ruSL?W}_hY#k^F}rc zWBwAgIWa`t+-VIEUFHf;YDl1C@ER)yv)PLbNy=1ogjKnLtNsiUlf2Ph0Y_dWs4cxt zFRG(p+xZ-q zl+c6~n1-CC71-{AZBE1En^yD(T#3exL`M6+#@i_A>101Fr~kE89k05VYsH@ELJiyY z>psfvP5DWsq2p6R8M?6;Z<vA4U0>#ZN3a^ovDJ?jxA;XIN2^X;^iE>7urcJKKJ<_-XyqOh)L!jb%})eA25L9 zze1`XYFm=X--!0n&>TNRt#>GaGSD1K_tX?DHmc6fcBaH9D+z*g4;vBdNef`({fqrY z*GK>W=S2&f167cExgV=LzO!k2*23?W&7F^%?j3>N&yNi^km5THahBRcOh>syWtI>= zSV2`6tUo2M+EF?XZnU!`m4||-r6#g*f{9&9rE^ROQbJqZ{`Z@q9Ms0HjJ`@&X6G_pZf-#Fbhbgm^+K6Ddy&p%j7oSSvH06#n zP*BPs$2~#nWgwE}O?eBgayW~2aBjM{a`;_3PR~^`C&u6%|3@_#<;{C^A zhzVxO>^$D8?Tv9QdYksVI?qfuEb|xcimRs{Hen}?kE3_nV~Pp$Yft@cdX#S_U!Al5 z7x{jU6Q0)Xn) z?>y?%=xwz3&3oaj6Z?=tDl|04i!*YM^O{b~p&YFw#zMbWN?#LfRq;E1CmS zpu95k@zJNVc1)F69ThTLRa_A&%htG237Q8e1-M@q(?k&?{;TW+Ya5K(`8APvV zgf${?GUnWzdB+B8y(6Z;*?W(}v(*YvsWw*P%G>pxM=i;h`!3&%j`445MRToADbkWX0rHVQCxmRsj!%e!-gZ2jfx<=$V=9v zkEy9xHjq6Rvx!PY?2u=$q6`(C-%1t@^etJrY(4>XT2rh4LZw(pgC;uIrsVsX6(K&fAPsT7z>FststMGSd-(eFvMwhkLq8cD z{}U~BzRfSXcKUEWj_VbTqi`w>p+lZDhCSJCl6uZ}lddq4 zigC@o|1`V=B!JHFe+d!<2ngT*-;yNhAmQk4jXUEKDb|N94C>Uv6O|GLuO9%i9Z z5*3kNplJ`+^z)DcJJyD{lGBtP)!(fv#=?bZ<|ZZO?{Nq@ZUoXlZ7!VPc}V;yTX!ov zgo0VtO=qChssGtk;MemT+)thDl|*0)B7#~-$Q>x1Dvg~hV9kG0Z*a>Sc%s?5Vg34R z`gv8y6dTc00Fjx0R;%p|k&EDFWu^+=zP`_WTdm?%WXHZU4(B0F=LJ_m=Q;ZqMa7|T zv5uR4bx&m$FQCM`15fs#s-thaNnC8R56d=V#aPwMgG5dW9o5bP!42LxWA@M5$!C%& z?*gg%9yG4L$6B(U=qBb4oulQ5rWiI~noxBYD>L}e0I@s5BP6Et)&K!LEB*Hxwe_Tw ze(h>on8c2fd-Ha-&@MrZ;KsT0L_)0WMxT!1^@HN`7=&0|zBqsccO}ai4>4VQX%Hq_ z?YzvWO>IU9o7CVejbf0wompzg*K_grSM$K$8glXzz_x`Q>`AGDW`Qn;G!`J4XVP?& zEa3;y+Yv9$@&+>@(1gle>QDYlOw@nKW-*2vjci=B_E0CM7+&K9Bk2jOX=IHkQNFj3 zb%_m1nt=GLuzcGqNvOy*nWe-)(Z-CMh#+x<+XhCTSU}7b6icQ%bn03zn_R=NOS-)G z7C#{}N2vQI>js^u=;*LpFrq_wKcJzP@XiFBFdB__pS|u7ccflQ6SVW(2dtP}N@i;Q z>=ypngCYv)6Y}5r{b`ODD*4ax8}q*%_WytQ{lDm}4Wo~Lg7G(~8?G5XS(rE>ArxQs z(AA!kd_h}Tt%;-y7W`Kza;=Lt10H?f32#Sp7~Q)z4?sR(K*o9r1Xji4JTioR5|m zP5h+0OjGnjUl^{t!&ugwS9-I2vn$F`!MSxT?C#7)y^QbZ&v%MI0sR=JBRYv!T1Sg3 zyOGcUgF!BH`Vp?^a~8&fh?tX%1ZJ88PMj5PTC!g>f%wTT`0Z?I$7Aj0+rRjHu0vyz zJEkJLadyd$wq6l$cjyiTaS-f*UM@mtg2V@YsC`VuC{h%k!lRV<$74uu_hc|gtZ!nh zZTlvMKH`J%7VJkVF!2-IL{Jp`jAnF0ROT(r{;GiV1GOvSB0t^Hu+MKa7@^d=n9zKf zlpE+)K&>}OSwHk$SlXN8@v^h*7rd%RGQ9ibDy zrMM^qpb+Z)2(U`8ytui$vD98)T3uaQKeM(&ro7N*M4%$zLWca*a^A(eiWz|;u5-ba z$+w(<8C?}Pg9n4RSwYfJ#88Cf^HN=`yUrGn{)&kJ@T~R~zDCM3)yW%TbzmE5BqMym z`z5`eWVT7^GF~XMJA)YfaRmCKyV|q;=MWwa z@k>&hu=Zs{_&Y~$_%kZCUG(dUvE8Ab#05b|wL+tUXB++w` zOS%Y7ve;d{FL!G>!_szOm*r1yWeN2Jj8iwR1=qPQJs~+!`l)?sh$9k|7^syt&W1=i zn}#HuiMiVtd!dzfJif8fJ>fqV)dr48vh!*KgK+*+M5CP8@>N&rOE=|69@PFrX0QqW zLmul)Rr*`LDrM%$eiX{)EPdvQUB$dqMLRm2o$Sc+S8Uy14tDZ69K7g-E~lS86=71~ zRaPlxcHZO#QiCK6)3m&;4MMEKO*A^JpnNj}m?{={J5R*=uhMySgvi=F?U1N>rK%5? zxV^7~3mpptk(Yr@r>JmtrF zgz$60Y3?s5z!QKq9F~LiZIl8|c}oBpuQcyy0}J=lUsHqS7E1TmUSmV|XkQ5enGTR( zzaxb1VS+U8us$`6pD$!n<3F;4`;Uk~&%XO9D);kW(}j0zw$#$Zj4$k0rf|RX2JK+K z#VX@fNXSjpLJhdlRfu6Rd_81~BDBmU(BZ<#(Ix1S;UEekP*rFnC8DU&PNuuHjTmQn59MQ5)5buX~y}Yuzc~y7gX;?HMvDL@-n+(r8ROwK>I785IcT-6d*>mz;Uj zG@?`8Bd5<0D{aivG*YB7|2+Cz*yk`El)a%kVrqM2J!IEcG(*^)ib->=JR#=Siv!s5 zFRpxOSlqg3=Z5Fo*{I$fWN? zCL^3ig7((vRFD!Tom%RGo})Ru=n|F&hH6k*)h?JBm=(wpnstxKDoU1jXjqGxL3=j81iJZWYh za``C@-lqLqD8I07fn#TS1JHmD#b?A4o?|~)-*}k8nWm|VtH2bpnaAjc}Z2nhI$3=!Pmq#J?6w`K}v;S zhex_nnnqSb89n;X*dll;WB#1#)#Nt!9hBH=*u`A<1IY~q&{%2rXV(;m6$pcG&IrFl zp<=y;U(P{6CcB?fHe;)sg5a)nf**1aEc;@tPRhHaqtgX>ztl4{QhW|h^D}oB?P4?i z8aM}gF&p2TrgngANo7|v5xgQu%?8@DN z>3jwf%#=4Z1oYy$wP+Trf^>2zjLj;$iBVSEsY)>F*OI)PY8~;kSb`)2`mzErFccZ@ zWubXqzXx4wQB4L#SVBnThY(~$RL01cbH?FK#!s?e!O7J2uIfDRS+F;CuI%{X=0h^v zeA|Ca0#IlB05IqZA~()T1>8Tv27ytAhOyi#sY4j5Q8myuNx9 zej^n-gId6(aABxp;6u&)ipy^B2F1{TcsZ(QIp9uPXU-d5?5hH038OV-s^N>W&yK%u&#eiU#SS?o2EV6lj# zr)n26_w5*L$FN^y;w+J19SFr`k5IsVdjq*eNR#qpLCFWe#I;soV#!T;gMK)vFI*A^ zS1~$C(lv2pD!Gs>e*41B3i;lwiEMa6BX%x@JiQ{-=D9dBQNZ}13{`w7XiT|GAPI0P z&cs760MrhZySVp2Fa}7ALujw%)R~WN@C?eNXe*JiW^cgOS~}zp#%b<7#N`xT;70$cT&;Jsxi^!+%uBOlV=x|36Xj=;pd2I!6Pa8{*1h=#)#%W9d)6eX1g zI33em9V>&@x7`lOj$ylH_Qd@;%POjcAYEvcJ7)@6C4R-1J=2!JTlBhmj7xuew_V0$ zu7dQDXMNzSaXX>Lk3Bb9Mk{p)Rw}Ab-Wy{-H z00x_Lg&{b#yZ^{61bMp=0e*mh)PepV)3pC`qyLI2$lJKN|67_iOhxWr!^7`3h^SWD zzPm771gQDpcW&;-xz-(^4I_|K+eAjV+_AkMr~|jqDF^i zrvv%+xY+odZk6UhG@0wk!e9`Ram(DPGgg_4Ny<&qNLo+46&q#>Fr%#CBb$OqumSXA zXyLWK660!yE-*Na{@LAD`n(4MkZ8cvC3BFF##<<`;42ajdlY}@@b4qao0T3s zT))Cf0DpPEHS|P-VMCzi*EfMcKw3i-`E`a!aTuMuHD}iadgif>gfyeT&mF0`FLN~% zZGgz?Ii)cOPUsZ=sIiyLkit z2PPN*8T&Z(ijn>oradS-wkZtdJqoy~gU7mjQrOHDFPj|dW|f9*b%cgpSb??z!-DNr zLBo$Du$q_YgvsMQ0$gr}G3pBdpp zf$;k%M1&TlOpkXNNbw(c7({))ht}4;^J9Rdq0U%He;Ufk`1w^rsa(`YS%?+|;on^F zsXo17hXna&PV?^%bcpgE4@!{AKPv`JaOOT5F^!nWbC~YziEdx<;6EZ_u)ZqH3iguj zn?j4M2OFLVyLlGM+K3^}7PX30nzB7VqmKaajCvLzALLLpM+^ z3~^>eD=W82fd*7}iViV2zHU`^-Hwi{ZDTeR^BEDg_Y7G$M}Afd4ql`5FjzSbUa>4w zgd2rh$Z23lUyGh}lyOL8dIE$j+4Vf_W$495A>jE3=h7LOdugFrEQT$Ny$ae(Ny&HY zA6Jv8RkXNX*4-`AlW`+t$)PuKa2-pdwx}kXW-fYMOusFdP&Ii*kFpj}Y#L`W7F5)D zGR<6Y4E#9ox9>s~6yPlc&VD5h!H%mh7%$u%St&J2LYJ1t_U2 zZ8nCAd?uJ_252qbP@F_fR$E`qJGc~}iOn{7H?!dY^~WPA9LeQt7DRJarcrty$9Q_E zS9Tdu#WqD6?4wOlvepX%4P?2Bbf}w>PdkBAB?JPD>y?jneo5$Iq-vLrv#iX@Dm>rH z2DsN1=F9KCOUu5w;c7It#d07g{t~-nglbg&c112!mo%T^v_W#D7Lw1=W~B9Q(2X$$ zbg!I-D)XTXu#6&PbA848V(ZjL-LQS(S{V8vb{PIdLJ9X`5cLNhI8F`g@#Ga}hdIHB zJ+wz-uz|t(wC96!yZt}a;UP@oGAl^~dZdG$fKc~S;V4M^qO8*F%$c25NnG-^Z+K9{Mp zky5&@U-U<_T8^Avzi5Sy;^H?aY<;0-0-E01rnY19YB64_iAG6S)gSW80-ctrnChF* zPPU^`KFN5RuTZMG?&4nQj6^EBH}Jo;#%y)!^FI}qVdh4@!!%HZSGs}B?#+yKI%$q4 zRk0`0%@#1xl)MA6St}Rj(cRgby`dOyyq}$hVwhU;haACn<34ZiR2r65DzRM)CSFmd zVhU>nWOSc>3(A@Gk634`!i$TWo5PnA9k!FXN1x5lS}=B!?Q31){EEEplN`z0${XNc zF?aKQzg5d*xOgrfUFn?jBs(&=1T)JtmrFMm6n7?{9x;5fjzaUed3}l{{jxb%(J8nW zWTV}*igIh)CDZ2cE@aJie{d^8=E`w9%?a9RJ#R#!Oi{eC!)zV;Hy*IXZ1l!$r@B)a zlD2VhaN2W6(`@$bHE}GpwT)&3glXD#r#|l_cWr@jlZe3ia)&6=5pK7?(7 zZVuDOnt;#VI?S+ho>qVn{1r^n5mIP&m&2k%?`-fRQ{Guez|2#2^$PtLpP6U1*^B3* z+mc78S(~we&pCJx>N^XcH@a)ZC%8Xjj&LEI-XC;nu)hIx*t7Tic!s#`NoNijzclGf z?2w5h!L{JfMVgEv-dZ+knHlE}b>ga}6;atFPf^F~@{luypmY|<6AZ-0>nO}|NxIYK z#bI=|$P)t0@tfj#$2pVPr?8;JK(km!olfa_&%OC*PFW7*W~|Kx&>y1WIrgT<)s(+_9-eK%1QjP6vibwOhRK zut+6x_9Q+zVLlui(_=#&cw{7OPDl7_&{3Wu#$&FW*haL^JQY~4TTV%lJkZhNp75JC zWn5g$pk%sas-gnyR6o$DqZ={&D zZ@||Lep_BAXQ*Anr28rs=!@dIv3>eEU_a^(*;I&S2uaHX0Y#QWLE#p)*TWByb4N%U z+sM(i>G@|7Akt!tE3kpeG|c)!@B7W%ZLy;yh+S>VGf=sbcjTfgd8%`A32>16R@Nr( zZO@oBNpi=iPC}Nb+o*5gXBD{im#4yGUSdF+|9Yr)LxL0oJaz90k&5okW~;f>r&gDA>6I$8Lm`aE?n0~hWzng-VjiC zkneYth=&5(;Y%Gx4+jbAqHC;I>8D2|m8f5;;7D>B-1N1BKh~2FDI*8J!d5qB@D>p7n)YiIwOp+HyI4h>S8txMqu4@_}S2ESwX$lAZgV>C7v9 znuZ0oNecmaHIe?rw_z!I-5re5;s3O2mOD9Ip^aby%Le+zuEQhw6pCRTE0u9_Jfn7i z#O#2 zWJQKKl~f+&4>AW&l>TZ@){(2PbASFL>H02ww8w!10&>m?0z&%V`_ccG7cJF=@mF72 z5jwL-`orpj%u4>N0Wl&WHdMia3t5;{MtJZBRO}%MUeWT99(miYR<~NCx^1LaQ(^B# z*t2STb-Y$n`1f(`u7cOSF0g5Ke`&iVZVhjncn*Qr2|Yr=F>5>;em7@G&$}A9b?nnM zonvyB$(w&tcG07GcI`-eO5pl9F|HVb2hk)WNgtAJArZZ;>vj(Ma@jMr-weUJU)I^? z?9fD9;YJ;f>D(QYQ|z{`5Y0o%rV?TXdCTb?4Q~>U95<)e&i!j=*E((Rf+Wr^ zcibuW3Lay5gH{x_-t2gT49)@^Hz&9*{F`UnJ0=eG++I2R3>>|n!}k)la$P^lX1y-_ z+k1A&+Gp`MfqO}M<^H>LgF9619}*Nu=br`q{S585*xMF&Vuzp~9)iTeNZoHJH=M5p z{C@B^9Iq-NAMoFGz&*BCmR~;G`&8y{$xU}Ox%r&0I6eWZ`(ln=QCKkdLp&{E{Y?8p z;|FK2KDj~XWq5B8oxRj#LaeW2qQ_K_f7SDZmfp@ByHeM>-mpI9fPa(V|4!~3O+8xV z8ZEqONa+DVx>Iz)B{Y{332I-obKkh-hsOA6(!y z;*(r{nABb-su=!>ym4~b5UjU~0K%#uV?OaaLX$IWlNL>+VYX%PK-s&MX&oJzW^@HG z$PiTx-JzGsOvR4+R)P3RiW0Mt1MUw@ljQ*C)?!{ZXYoO=6L7=B*zt`qnYFeLb2p(I zS5F%^T(-4CdM(mCfjlb(@={qs;MMZhz!{rhE`y&iE67r%8sCQV_o=*QaDs3kC@+C< zFz5(uAoztWXwv<5GN+BwUU+)9%F^+_8l~L;zpqYx?QH!n&>*tgvI*mQ^@Ow!V}A$D z_BZMG=L?Zw5L07hVtf;Ng9+8nG@p$e5!+JJo>Aw{#H1Kn0pBuP04URMTQh97)tYmM z*#&ZoE+k-QNCIlx<{hhfmnr?hGTKGHUiQ0i{V(|(bTZ=b42_AWg{4_AD0#Gn(93q{ z_;71qDumEu&OZUO{Y!5OWe{R;JT(!`_Cys=;j~(BU}Gg1j)47%>I_=dJNRe{yGEh& zct#6aYC?R)$*rQ=qCf&i_4-dnBE@9NJ64bZcU2eB9!~M0Z(})Dq>#gg{KRQv^P_iM zmqQU~!{W#M3VAQTK~WKPh6!mwGSpKksg$e)SNvF~^{pFgfmqWRWBgz| zWBTf$;G;a{oP>V6uf%hf&4ClR_Mb~CmDLhzEOM*>x|X?l=37TthEO}=Ie5wt#G@welj({^4rO}Hd5qI_(jJ-CW57*@FS zH!yNA*~zo{;n4tj4FOd$BVv33bMTU;<5rymOgo(=#t7sXM-a-pJ$yLuD=n>g!pPS` z$e`v9O+R!?ocz$%t`#gv+txukf0g_@0u4+21;RE@xIEkJ)X&gQ0;|*sJ^mWzu*Qhi zLE9IR-ia`nRWW0>2n=#+=Dei_b|N_?0{y$rg}lwfp{V0Z7i`A}2)kfp>T@`9rPE?( z@;L5Rfqrjg7p&2i(Vq;SSro;|g9ZI03CHHufxf!c2WPLCt%%O-pI;40aE#Qni#@8Vk}Ti9)qf?eC>5DDc?_ zTi0ONNzJ1EB56B?CCU-yM?lzRUQ4-2`OFF=39T?wV43*bJg+6N8H)=tr|F=LE(aYi zrMTlm1DZBB$mu~(AI6CQk!`c?N5XpoXz=Z(@S;Y>C)E2uiPoz_GGPIf$9M6>?K~T0 z|5Om`o4~fU5CQXr4bBJKUx~9n3chKGneG{XZ6Bn4S4z%KUO*jl$lB>wS>*Px68a~$ zOB{KjMXIahzkmKkbkNk0I6$DZ%lV0bSVV-iZS{J}+fPeTLv&0hW} zB>znn@YA!SN;b9Wn$_x|pBOEO8ck9ol{l8f4Wq2yexhV4js1=(IAEA4`_l=S1xHx} zt?$?!yIu0<4eiG(QgB(-Z~W|N(*sjnBBzJ)Pn;LTp|U6NW&`DGxY-Eb;)C8@>+xuF zLfEUe9_hJV29H)l4UV3Qx|7{p&0-{;K|FXL4QU@TPkEm&6sF^6s1k$PyH#;3@t!oJ zhwkZ@mnTn|ksR&#RD-*CN@L<{33Qk8Qhf6h6ErA?ohq9upQMzbtc zk)9E2g(j|L8PAobm@k~N;26S@s=xTmROD2fWf^^ocZ@gn7*iA5xxxb&UNRPh0QiLY zZEjtT5cGbOa9%;^7$zxSO#<8b9O?}5@AkE}*A*GXT#$2!fEVyy)uZ0v2~6%}8__T? zuuWE{5)O1Yc9C{NZewWKUx?-Bx@j_h%ak%G>#wY(B!9w**i~@+>fKeIe<+%yyCJ3Q zt-IK#SUE_Ty;Pe)Z%0APoPLU|#Nmgi!LNlaUGoXzaT9)6^4KtqvX@Sx}r`!#*HG!7EZxL~_|d%$7L4NUW!o{L@616yR~7TLxW{?2FAH+KMIo@v-!slLjsRI1e<)wzf@f@qZnZT&UMF zd8~S{mgpI0oG^5>O@4C-7a?Nxs@5o+C8v!WG|sXdCn>W8P>!;L!IYAs!fC=6oq4@i z1P-R!KvT8ph4^GxJ%SLEF9*60HJUGaT_lq4AVy@G2gBB}bJPP~iMWifo>`7tIOz&` z%_~K3I9e-JV^4jvMGKwpKakem{t_8e_=9(|q$ z)y%E34rvn*cTNs%ubU+z6Ks{EnVa}7O)8bKdai@GzQsK7Ii}M9I-b)nN;MZ=?QRnU zDvZD8$}j?YR8?#W5CqxYq>Byqa=}h9H$oK^I@!#+EU(^{xxSj=!86}!+S(f9p%9%k zwG>qh+nYC?JLegf2|57`nv<4I{aB-(#jn~*1M^D|wE`TI;U$J=CR%8F6O3CSwL-jM zhYrDy-0~|e;9{b~l`{K6QDdi?K`lYImp{7DRTrCxhBEPS?`eiWS!M(`BbSk_^p>D< zi4i=YAq7H<6K4V^lx$MF8A{vM&q$jdqpB4M-ZHQ&3ApzsWVk7WnJ`p$YKsLuba}1A zxt4VjG6o|6@7Y<6Hi~sQ0bf@@?Um^T=4{vXV8uiB59<=j8IzH}f0*gzOlj81samA= z21@Y*A|2OmU~~^szYxwc&@*!*C4N^h_Kr&lXd(mIqU3NBex5v8Nh?ZH5|KoPFPH38 z--ph z=LFUK2ia7?J|;&WExxT>5M;{?kE7;2lM|;~UTAVdM^L=A4!^D3IY6HfGBq$tEM z9K8mD8oAvMJ0`QrAt|ql*)Al*wgNt|CM2{L)x6mph{F@@c|cu}Yg7}&lV8+UO>mdQ zc##iwRulkVOFl(81+*=&aR#)aBXJ?_bA);y0Pz?n@Dwr914dg?68UlerD?u2K2|DO)l}cMjtp z6)>}MdE5N1csm$pg~6`Q{rT<{q(qb0NZI&M)hR&I)O~Y8dlsTiLr^*TaE#D7A5Nwx zFki(=TMhvwA@!d6GOW9@A6u-xiGkuc16;|0@~jCdDkMk{Jo zb9}l7ySj&;8=EunjNiDaa|BUqU{GrigxC%@Lf2dtq#?;3iP*7LD1g

    wPg^nV=?n~DYzmx6n{Q$eA?Fr*#|B{r*?vcTdg8Q3h=;o|BYVdA?n?1R^ zm$bbhIrPNaYa&z@?! zjQSGiaS|?brZ|Z*?uutw6`W~5gl{#3&HUWb1zvE3q3lDXu;-g#XnIAeN%Xh&}0RqX_Boys%x1 zh%wjW$Xf`XF6wo7q04!W>AAF%BZkx@)5{->_$d936JMmo6TfSW^s)u%c6qjF2RR zXS@wW{$G^6V|OOrw#Au>ZL?xOv2EM7Z6_7mwr!hFY&)r#l~io>|BUY2-S^&edW?Rv zKf!P8J?CC)&Gi{y0G0SkgLkf6HgfnE*sj1tLL0eypdEBcr>oY%exMzH>8iWZVePn5 zHBY&Dz|}dWvU04odaSj3TzP$0b9Ptr=dR}BE@$yrYv;H!aYGb~7vnnIQTMP??l4@2 z8q0Q?lp|lT`c+gLNU6j(SH9%=!)`CMB@=6bU0>GX4s~--rZQ2X%)E|7fT0*fgOV(x z8h>NQ73MSd>&FJF-(LQWiw;q{kPo0R#y#qb(4W%P1=9`GtArBG> zYi>qzk6R&bo`8ee1GVJD`zIHVvq;cqYsaTS`8OwR`avb?%}aK|H_yZf^=m2zLSmVK z7$S0&#GVX$-PR9M7=NuG2D4qn<#}TY4|21W#6vv~#Wo8+J<8apn)c*;AKw!KkQ!PA z>gXPX3m$?Co?zHly1P4fntcM*34ZM%o^w-sWjb%W11FJua1pp@{ld!S3`zkw&goev zRdZ;ao#lk8j#cmxoX`r2q!yl##2se=k&p+q*h42EGM!T(u&H)u{ zCLsM6!<>Rz+i3-x2OZYY8zZQX8+Tv@B3CBkWpC|^z#{27dbPJy$&b^vsjEqeSO z_+&)3NXjyHTGGX1MxH9*#-rnVJ1s%aieMh|^1CvpH?OWt z27+rhp{^_jIR#-lx$N5oc*H9C6+-@)Zp$}OOAdB)YOnR|CNM+j*=wa}6uVMWQxp$L z2F0OuBpM9Ts8_{_RkvNLB5FA#!HOGHhlqD6lVcmWc73del9XmJ1Bqi$Zz-XYMZ+2- zq5d%H9Z}-9E8}|xWm3KfH7@j$1`;l>-k!S%k}@15Yi@dvu0&au@)2KiS7I&iTj3 zSY0U1-Q-iozf*5noAXkVi;CP1Y5rQI=W&GJXT z(A2AkD$rrk`-{(Rzul7O`^SYRp7$4N?$qCTu@8XWXh6~XE1!49w=C2v!vj^nLj0}4 zInEc)=48OU%Lj4q01f4z?vbpSWD1&?l9RtV%yd=ge_iEa6Ri-sZ>N; z`1p~vkQW`P4|*McCO7Z$pLrxgou}J`2Qzv1jt0R+o?mFLKaMsOu-uo#-l?D%@}j%X zT}qK%2b@&POT4IMvW4$_bPL1Mw6eunTFzC=W+H6nL_OnFB-lTD=LsE|_-98D!=o$n zWYDqlu>eVy2HX)(oSe{B7zKJTo6QB;8>~v%GAb=zFs^V*^SKFO*I4K~Q;-Y2zR+Ei zf!DtCdLUhJLLN+K0GzOE(Y&LVnNaH(OSf}k?Y{gvPT9^phNt;d9i(}TT<0uT2-%y` zY)fw|K}^?tmWJR4leZBad&)T*_)(&d&msJ@OV38( z#m;7Wql=NpG+Mh-W6v5OQeS9lqr-sRw34Sq_@k0^ZY$YJSVf`E()2!(eJ<)oIi*g6 zEm53J^U0;Qc``dZ;XPNHwb_E#&CHe`b9S5V+$vi_a#=`~4NQ6OwDYb3Rd=FXyX4W5 z*YTX0e(pz$uEqpC1Jn3|`!P=}3o|~_(f$l;*3YLMN}#>jOqI(9%Ux|6TT zq`K(}k!E7r4>NVk5PxM(84c_sm9)?&!!6J40?ZnizCJBOvj?s++$=jox&hWNWM2Ay?~cKmuW;amxtO(oE6XV8&sgV`Rr{1?x$b5}8`&nD9!35`pepWDxPO0uij)F9 z+D1@w5A*#$cB4J#nD3dugMbuc{eLzADY&^hy1Bak*Q89Wrj?=U3dWZ`^8|b{loTW? zv<|8&{6q*9wDCXz8C|8wP@G_+JViVsV`gM?gQcD}W_40Hk3LjiU)u8`muwhjN1*2}{%{8RoZ4IG&I>dT0Ognr)h5 zJ)8~%0j#$zvzDz;OfKhe+3V>6y$+o$pPZLayw~-Uq29&s#nAVVjXe16cqrzZpW3BX zE=782M5veqLk~ujPhB?=c>25-LnZ*;>mjruqx_$q%JyE;WeQVgI4D;A1>8TEEOtB* zq4Yd=Lk%Vl-~c^m!!kG-ap`)VVs9FHFRc&toi|)4z;O0Wv=rHRiwtaflQh|w zPS~&vJ5<3?p1I);Rq9hyTC#nRSj$>y5+t)un}M%~6DKvwwifK|oXm$FvB9MA^tJi8 z{4gU9=qR)`;>CsMNEpz(idS=6s5pidnL&^%H2jIJP&XHyRUL$f9v1o;YhE)!#Ap&t zvRcG|s+Dc2jBU%LFdSUi#Pzj)(fLK;Oq9W^Xa*?^d%hI3Z`c#0jPZypBbv)?9~o4v z43~Qj7dDe6YLbhicT^9T3CfRp6Q1@`ER?ww9rto!C~G9^L9XZ|mDU>RsX{`?Q5Y@l=mwy`uRNpk_D-nB!QN@i7-$mHpDZ0TxwRxgu0OA=TPEpbBS$uDE=rP1cnNb|a%D5SA0s6(u+}ri7<_KL zjTx>|)BX`ms*QJ#_NC~kHeZw8jV}GpG`!#moe_wMRa?urP_o>Nvl}d-MwWn_O24^I zHtA+XASzdNeAJh2g@J!L)Y4GeE7d!T+N)l}x!E|2B=E*0y<|9QlReECPj|;b6~hyC z^&X91Zgr)tOCyq~Ns0A5BuRqHXaUiB_~bZzJ2WmxfZe^}M>0C_>{zE+#Q+IrBNRV= z(dTB)OUQPE!e6HHU;zS_zh?p_)36)~gybLji;xp*2Kn`C4xVld7A*e|4(#`cGz9hw zX&>u+#IHb?hDAZp%bb_Vf&7rSxtGlWgBy)EkJP~a{lAc3fetw@<$(b(@d1Ydu18;2 zf<#p7^VqOs@oWSq9bL^qH_GL#mpwobW-i8kR+@b6ZeI6O)H3BrYoJ{Q)z$VFTu*l;CPmnVn6~$ zDRBL@jnwRpi_GrLF&WY0G10DP-pUFlnN!G?ZQSr}s%FYs?~mOBywis5gYEhXfq^ zi2BuuWE{@aBpO-jyGKk{>))wPe(By~IciB_A``N;_dU>Nsi9hlmd-Lpwn_#OpGC9C zX{La$!a|h+*L&WRiwr=TUn8LXUcMcar6xVMD>Z}ovvvt;V$kAp3MD2x)>+HV08pes z!1oBd`z=#ux*=s?W3Ov@SNBKW=R9VNe4?KZGlMe7UC0D*F0@-a@AX#4jB}5pQar`s z)~;LCoA>aLSR$u_chuDQS=lOZ*HVO$sx0l?wUrxo?TdN*P>!Ull6F2s!BP<2#)cs;^HCV$so9=U_?adA)lr#>7UR%@!*CJaqCRs+i101~hvvq#1aNX@)=ZCxu8#e4WzBba0dm=t z_1f%nJb3MTcOCU!e7n9_@M6%fts4i*pM`bLGduysM~fpttvu{Hhg#-?$+(km@?2BY z^?d2a5#RCWXz#?MdaGYTXCq-vi%dP&j1STj$)HxgwCjMf>)1a?Qa42x058S>i;gB59$<&J7Au2ic_!8AVmH0| zwX^^V1(Adie&@N#=vfKRN9d!w7)Pu-z7c2irzx9Wn#%#Lg|uBJ?{?gi}z(AtC}}I*q;%7S7e$hQ6p*yW*P-${_t8hcPd00Sw7gE)ETKML2;Ws%wq~lZx1qS@&dh z-@%DwrNz<&6=LHEn}EHg>D9w6-czzq4xdB?1;91jt8xyDHA-?A67f z5w8n?zb9_`vYB_PO9euyWHz+#q$*syTyw7$nNeSr$2~%8QN~qPlUR?nX1$aNnv7oo z_EqU6jn17(;5?b1{O|3N{onx{PJXdZV0$#QR{7G;>Kb0nu%g2Us17`3o~=BIk5;fq zflcufxTM|m)~#zSY@H*47FnwqSsJ!xFy@I%I?M3&e}5b-q-3I-7K{`G&UZk?6T^iVd1AeT1#ES2?Mk12*4@-qBvWUtWu%b zw&bkTxi*$e?-R|o-_|Ub6bWl8cDbuv=RG!N9*IhqGq_WaCF5Eu^i?Xod4F9sLe*W; z-)5TtE7#?zSC{8{-Ar*;grg^54<%6NQnhrR+)Y@ci*W&p@Z=B5B~%Tw-3tm6^|tzhC!qR z>A0mcv!tl=(%i3^#H-)727l4@AVi(Lx~^G@yM&60SxO9|r< zLH*Nd`wG|N)hltOnbuSol_@b`az0Fd9kXPPxMdu9fHjOjI`->1`C<+dKKo+9a%#JLJcEKO@77& z42cF^p*ZreWDvF(axsqm>kfcHR$o7(hj*?|R|#wAJn9?tzuS~3dk1iAP!NzuFc1*3 ze{WM1rT*7~44r?4p^bevE2d37k+fm7Vp`k4p?6!$`BtD-uZDm}!jwez$r%l(Jtb`n zPI=r3p)HBa#mxCr9d5`#2Pv^+X1aV{ZMd9_%`yB2`Lpki3AxHLURY6_A_9uXU1!b| zKEv7;^sa5VjaWiJU`BvJpcb~QH`S<`Yt+5%dOYCU{F}|E&W=CTUgM?j7#=sS{-~mw zZjGw~pM{L5i*K-Dy#;>(cY{*c{beG7?zL>|7-#~h6^xISdK|jLk)G*8A3C{9O(^rM zE^=Vi4)GTD@f;}d!UUcKpbsYCLA#x`r;;H7ojVtOCk$L%#&ZL4vE(en5!do4S>!+MG;u>a@L*FeZV`tm1jWlgOQr&|@f@8JF)vc&!&D@#?AA^jh+pdmm&IQ~6ZDsJ{t_WyWa zdm~#-BU__?n~s>OvL%nEgsxXkZ&yod*clN48l?$vt|?%uycGh#NYxIb3j6ZNDr^m& zXL_4MzCxoBu~NM4VZHofu=KqF`=C0^lj%qa3ki4G@Oj#_`P+K>@%j9Y^oxY>)DgzR zdEA&Lx|>V(P#+Ou8hp#PLC%aZeb5*38D~*}-pp$bJ1I1iK5V&3B^ln&OlBhL_hzEE z%AfV4iF5*$bsb@yKmr~W{Uv9d0mB+v^2a86U5zA*M%^{#wh(_(w)A(xdMydfL)Pxq~bUDd{6#^nTkv6hl8%raevEhp-GxO28#ZAdss z0FaR}LJ6`h=?BLR$Ot?kuI6x3paixFmA)q{{O8zA&-O-Y*;s=q>g*#1QVSYuW7*L= zeYTDh;k8fN)m_Dm#-iJwUO^mxp(mB?!~|Bg*HtWbDGpa>NhPyV!D&27O<4( zs|w6ms<*i`zuF1TW1{lPT(FWKxFNcUZu?vMrP7<`=cNm0XB&_6B)1b?!W{CHa6Qce zgZ}g6f%=bwHpY{J50Ne7xlfd|nCATSkY-5TODKadd{O2Xp#v3CC=Rsg? zTY|NvY}7?dm(iTE(V4Z@(5uBKFO`!PnJiVL(rATvOO3W-N+^q6R-GT#RbF!T+YgP$ z>WdHm0(*#cG$-TgtB72Nn!&%ydH*<>&gA%h-n<0izU9E-%Sdz-7Dq7mJqsfy1}xc1 zH(dNACf*lFc|&|PLd_uWVum#Ff=~E#fC6LD(bvq(exOwM zb)VxcJH!QJkgyPQ&yP!(ekKte(izvkN& z@H933^D@8R_jQ=~g%TDPh-0U&f-sY#Od3bPQXcWjo+QJabsl3aE^T2MQJNP1+< z%|{fE!}U4`V?-=m{Wh_-rR-PdmGGR8;NL9)M=}DvDE(XzTVw2K9M(%8hgC)hJ zLS}(OYf%uY9S9n>Dvct{yjzj%9yW|Ad7gByhe6dKI+=9QXnc)rjjy~&;hcdfSpYqK zRAM%^l89Qm^?6>A=V+WJg{s^Fei7E1J@^wYdF0bMdq~PlD$nreSW;;U>iCqcQWHWZNv*`Fw|nEh-^}RDCk;BHS3?M#llN0(q^p0O=FH@B*J78Lk|T^(7@rzGvOQxFnlM;94a~Nz{9ttl-98(H*N66y1A0#!Eo_~!(4fO@ z_k}G{3!TWCEJXhp5t**a4J0PU2TC-&H5+jWd~lUL1}emMZHyO8dm=W9cgSS7xkh=L zqsX?ZU1aIkDDhddva1i3Cz``8`gbH!K$(g1@OnrcPGB+HxHgp!yhn;slk#|OOz!Fk!L$QCed7EK zOjw*@C+&@170k+9nc<81l>QjaegRWQTBC*90syC^Zh)thhlCvdQbRH-o~*-ug|bUl z(o`~9MNuJD=^v9sqw2G3ag+Vn%f`Cjl=W`6)%4oAYULm%8hfPwdwkC?i_7RN+?H0q z!oiZrfN^6qX}`5Pd-!|U*bYDh$ERw z-IZ9~UC%RS;xNGX#ih5N>#HQTh98m#ACKQVDXvfvi z#%n$5?5G#?PEPE`5c?4eS+os($X}EKD)9M^J)?8$1dj}LUZqt+nJO#xWcv( z&L-R5532ylccnqB7nZ&+=mNQQe-nF5oLt!jNglnG)!fl*M1Z2Te0tMI>)TscD4NQ- zh9=^J8LMUcvugkI_+>)=N|6w6?AjEoabm>z#-n>nKd_rLddA1*GiX;)#zxDxVC(Ri zu7En&k#NR@fXntg?L&Ese0%@d6y@yctv9_fwQ%e7Suglc`bQsK+pC|0Zon3US>w(p zK6?Mrr12QO_2(i)ot*___D5dzdZw5RWMA|;8`PW__=vF$WUH*A9nSLU0{w&ys#?RHuBfgsEo49E;dIv{Av zo2yA=i}r%sB0T}Pt4;%_QG7#t`4!$_V&?gGkhu{cHH!02XWc+=1vS?| z#5VzWN4*{65Dt00?l`kcHF(E1tc11E_D-KzJ|B~WIDopeBj^-r_4riV81j#=dx3GxrI9@KNBB7|5Q*>qH1Y*Y}^J9rk z%)yY(Fb7be&rPxn0~HiBwm?hZxi_Jg!LC48J-QKDIr!q`u4dA23vr=8*1AsSI@h-! z+js8kUP}*`g{6h+;bC0%^uD~EU0L*p0T)L)k?NJe>tTq*Aa>^VK=oo02v~RHpd^KK z);7bWzT4mp@*$8?6YFzD2P|4aJ;HZrW+H!_>=!Tdp&#*_{R+raEsiu{rz6zmP$9^7 zU;kqco!wWC#s&@q0@SNRFbSJ#c;`-{QD>u(){oHw~$J!vl@ zaj$s_f&^U(Vx`>TV%gv?3vdjVe~$bC=H?Jf(>SE%A!xIN}_2& zQB?Lf?>>L8onbVD?FO_k* z-0tU|ien<&gsZm^VG@2Blr;Pl_x3nXXD^v?V{Csg8b6tN3lC4Z07F2$zw=U#8B9H; z$CkMB5|5j?^U$hJN3OA0d#LVZaP?PjqmX27s^I%m_BC+*=>eW{V-CJA^!ixkAM!vv z*j>#co@9O0XbFr__B>;I#!D0R-aqlm^W2M0P)E(o=e&7@a-ua)nnfyue-nmhL@hq6 zT$3!wXk&FyRFIqJWw|ly9a`p~=_6ee9Mw%Em~pR|lP`-W-dtO%dF;!IAK_|6C2Clb zS(lh-g>*gAab&1uEBMcsoKIR%`{u37bM8hpNj7uNwejTIGHeJYNa|K(M@{qjTsX#k8SKAY?E4e>X`IdbaZ>aG#3vxZI;hfO#23|_S&B0> z0HyoS@c!HuY_WBi+@x4h=FKuBxm$5J+Wdy}8xU6u$!V$fZHG$BKv3%ggPe}AWO-Fi zYvreqp2R7*+3*{A$o=g#veLWdyO_>D6Wi>f*dX}GVZAjoE4QSphd}~21ef(#?lzn$Qn899T2h7Vl}cP z^h2!(Nz*XWE~T8Z)CH~?t(up`k?U4%8oZe)8`Ngqlapkm3$|XTwY6y4VA)Ptf#7tZ znZ@N@VH^lOq3sAg!5(ZMg9Ajjd4X`DzP^bM95?)QV3*+ft3nVL&U(Os{2L3ffI%oo z_2QKQn3t%)!^Xt{8XRrY7g~PS8xG$JMw4Z6qXGm<+!r2x<{P9Qn}20Og$3ZfAbr{F z1$gQhDH~y6P-I%ZBn}-J!<><28v54kqXiFYWI5whiP{F`^pAP2jiP2b<4qPzV_0ji ziUqrSgO8jTTIZ%lwnNp5`novMx9==S){tVRCP%oIX!E!T3y-XvmNb%`T8EBG4a|v^ zt(aHFGTdTiq!6^Gq)4OIu4Di3a~FN5R>y-xf%NnZDx#fPfV9-aazu|cNO+{ zrc2JOGE$yotR*rDiR96MV27fxrzpf4CDIWXFWQT#42Gm4igS!8r<5aWE-q@~n^TFz zGO1?XWateP(EC7dQ44lFr%KKEb20NFi;Tq z_^7%PgKp@$=~(!tDByVPZX+X$uR;?ShG0+@K1rsw4S~VE2Ebt3H#W{@zZ8Yqux;xv zT)8WY3Td`MMYNTYoIH1RdIKL=zH}Qt`1i%**HspHrQ+GsY<-OA$~#6BD?g>Wgin8FqescN1qS%qU$ysL91 zV~@Gcm63e>5mL^_X4h7gfha~V^cvx=E z6A~vGd=;ie)IN=(a&uWPT~$mam)S^BXS_4(*%B~T~BL3_nTJsuaiYBL7sIxs#q=|g4o z#dJH5j7;a~H!}ZH_?#?F4EHCu@|K~WTE=xjWSqb^^Lkg^T*Nd71HQOu~Z1+tYk{6QMd@iR;emwW~v^U z;{BG><>*69wobYApeNB)yR9Kms;fZeo`-qecN60(`tzPrUXrVL{7E)%$SdkEF{Rl zrn&-_T(yM{XE2UB>&mE+u$B>EsFoyE$(G>?$nmeR zUvo-`8E3V$plCo)Ym-O=(DSin?Exn*_}I2J*-&nnaMI z(p~V^#Sfz5oj6nd1s+k%Vt{2V`XZGr;_&SKj*SwMwMjM;s2aK!l68QCHnkN9GE#_z z^;ESZGUx120fT>=Cft&F3bZEzm-di)z$)H|1LER#QT%NHVhb3OHXEU-{hqeWAC(LM zbGeZl>XWNtk@TRL;fYqYSj@Fp$Z@f?m?_U>CBLN0wZASy(@sCyu_P_^x&th}PBCDNiIICO3Yk>w_9Q{Blw_%`*A5Y40CG_`z0maGsLzAN(ogrqwM4D$hz;Qv%LkrRkB#0g>B0N>uo1=z-IM^y+yv)j|X zo)zJmwcz*9&-DD!y%<_CG7_R6RP02JdBALbd`!1Xo8hI=WT!ilvpp2E6XmdP?F+S* zaK~+|KevPM(Tn1-XKp)2k3C%LiQI0)U_Zvf>qq2q=kpBkpWls*Z;Ula*iyr}R!eRa zQ7hJ%5y{sM`_T&fObr)&;mTXkW?bF{*1c@cTS7PnypZB8(jO_laN{lGAF$WJA@q1{ zTw_B~=%~6W(R0CS9Fzkt)y%7}P84Dr=C%n_$|1PvQ}=GOF>Lwi)p4ueoYye6SBJT6 zOUI{l3Aa?IVw}4X40zj{LEzSH)L2^?9M|D+W>+h-X~{L{Y+PCxnquDlV=VWTD z{;ZzTTDo-k_L(x2m5)yWz1%F3q(7U}UM<+(EZF`zk&LBu#=lGb@v+=x(&%=AyqE(z znYyzr|7JDu)c2CEG_`fI$>xvRO$QeWu1OUaytDC6$$#UQ9e7QT!r3x19Q^DFA-!Ra z8>GGaR>Hl{x*8C{AGzUs_fP%K%(LOBWq$g)x5ZLx5X*Jwwxo$O1=SS40F*MX&xgHE5pkDd>c3&;^i~RiCuihjK{1P>?=hKL15_PONM-=#v zM5p-iANOef?+?S!IJu}HLF7;aF6+_!P#4g4Zn$?4En4VF&f(B4_B44`sqi+ETWi1x z2%+?!Uy_a{LP~#Wqcr|{cYlCk7hV<~7s{PE4;leJvYYwP%7Qoa^IM|ax>N)%`N9u0 z*aO$8c3y!StIU*}gzGf>WYMh++Wf=YwwzBeS57F-6p2#tgxqmp$y*7OO4A|rE5cI- z2^N`+%rpYXZx|W?Q9Ie9DvOX^8_uEUEvh+eIncterV9BN!5t@{5?6K|U%Aao57>W? z7u}%=HydaMzgwD5=)>cPrSQrrz^lKf{R7_vi+P7gPq@?m+ zbppIitL~1S+UD+70i%Q9QEZ}*A4E40u}J>Eh|GGLy8}1b!@_%6Tu$>`{&Mm3e}8;H z7{c-30`}X&Sk)IbR~o{2a95o)LUUkgsgG2sN*V?ed`&mYo->H^rid8Hq~%2zWz}SL zR6l1E6W%|@i)70VmOI@BN-JlTnD<-d(tp6e)!D&mHFaFVP9D+7QHzF8X$a#M{l!5j zH^Fy~-U|2GwpshIUrXHGbWbGSLe)?82-!MzyPZz-QD&Xt2Lg4EGoCwyGSZapORUfW<2G*`7?`BCz32$9MTaMN zZmd20foXLU{W`xW(<} zDQ4sZ;wI)IW@--}n92$PbxgVYTuR&y@zRih!Ch$yP~esP?p8psNtM!6i?!3iYX!G6 zp$tmFeDN~BApTF$62>M@3v(*HFVwquHZ}z{Mevc1?7w`1tO?`=@f-fHBJ!&^ z_&OD$)kV-DD`ZXuge_Phh20^*7-WB?u1DKwzoapjyPZAK$07A0iJ=#nvc)M!GfD(6 zTOU8`;cYS9-|zhSk@#EiUj2DmatPYA25Kh8eU{5*_OI^AG}O1xGarcEOLmmJEH!6U z5xfe<*{{N%Rg1PX4K#&6%l0xrbwZ=484iryhZAm$wWr6_RDYh2#9&c|G)SoNhShuC zb_690?^0vnIcY}(2-oyg?ZpI9s!s6zs-@@nB4zJy~-Cl7q4G-V+1YxP#j%~pD zg8fDZwxj#%40@pZYTV3s)=JX6BvEm7T$#8LylO~MjTy&)~!j1NT-P`YV~ z+8J8Rr+LW?%4e~h$heku*D3=hBLc5_)A&%9O}ssmppMmVZU!&GbKx(2AR*r%i8vRR zJRB{LB)ql(dF z-WIf$Zl%x2BO-E z4bZ6w!js*Uwns&>1TCoU8Gqv=ZZ;Zd#5Y4g5O&UtEHzo|ShwMlG+Gy-a9v}Vx3w!G z!wd}58oI5>=y4P_Yh#A}B5$1%wLLt}%dEJ*u-hRH{C6H?WL6bJ4pnLaX&OlIFrbU8l8NRQktC`Nfc(6LI@k%`Y4K$rTJ6;qTC+pmm4Fjf+* zoV%yy51r)QjC81LASleL;dXLIIN>t3Z^vN(4h%|fkD4*rCh$CdMFVp$nCnq-w2myn1cVd*IGX9lK5!s_<;tHd-Su2f^wXD z3zMI3=uWn3s%G!|61AaIXGgnJhaybkc4i_;iLKfz)ntLrl)Ay`*vpGG8sGWqD0T}w z*0npHo0xEPgidI$iK>??T74$@q`($V<8=*!**G21l$nzC6$XZTi()C$L|aBZ{r=4( zDGOjhNtJL<&Jk>%?;6OmwM$-IrvLWuEuLsXC$m8WeL0t!muj^@(tRK+IQf-Fob5=& zFY^1k+zqGdTuBHEt#;?3m@wG=X~~+wNpVA1O$M^YjL?h}rvotbS$5?8OZ;{mgpjOn zZV}p2%RA&upaCaegh45xrb)~jtwI%4p%qZ@Atu|dKVo{xb5kprhaqH084fCg-ii>fDyrSFS+uJ=1qSzN#H$H`J~Ds8mGJmx>{NoeB><<38a zZ7W|$5gviqW`di806#K!fjyS3(^js?lDLfEw3LA4IUZ|6XP+UJg#67#V%k#LNE_VE zY$?!>AKpFTIG7Gb5-t?3Gyk%Uv+aUIm@^!Z8LV(%qE2eAK81UsK>jx@|EM=(U5Gpd;}K^XniQ2E(ZNd^@N z8fS!p_!S5K6=?MVC-s5H@`4?IfJY1~0NM|ybv`C9LfKf_ zZ2}<=&80_Q?yY66`RjINR}lc=R*R5+Q^`F3!r(EJ>(sbmL)3Yy>mqZ$EGitR#eAg3 ze1mU&gIjuW*#YKaS>}f9V2Bk+{nN7WaCOOEQ@CKE+Yde`rBaBLtI&YLyqgsad~8@* z*&&rj@R-+KW!(3TemTAL0aai%B?in-S7XGLKgo=ZY*t$s)+xi zkf;7p$khK^Zdm`voZwWIoqx&WFZ1_i*KSZu(PD^Ndbf5O`sEA2j(=NJe0G?G-)HG?-anLDEGwR)5bnG8R##*ZiZ@kv;+p&|3 zwqRh7QtEr}LeHGPV{hnh0WI9`y>)7TucEWiLb_YJkMgX0o`>3?39^OT3Fct(8PQ{5 zjAtlBe8c15S=h$V9{t5~8_rkfQGO7lLk0evxf^i| zWh23R9+$ih<03?kx(=KYF}gxP1a2;~BV8zoPBR)XTgK}DZXZ#hH1?$N)7mYKRnsCSC?2H z-s)+XHaacFtt7>5w?hFBja9=9e2jeKWS3Bu@hw-d!7j@|nGQ1g^0{F?ZDlPH`P3fXT;`J9>wTZfe?o9%_Dsp8x=R9XZPf@=j=+ zJ;Z#VZ`P;B4M@|5D@vEvEA|n)$8Z9PQ4Pkc3h>XzRK|^+ z5?TXAO^7nI zmNMZ-8sRs81`Dr|uHh%9X^W?0_yvIccNiITG4~ z=4$4m;P`)`sjTO)#E8!4p5={zvo+~qG@uDZot!1dTS!u31qws0LlpLu=U(O_l|13J z@Iw0$bqk7$1U(E#^bO;bt15z*tp2fgX+o6m<69r__4R-wh)0hEz~obHq;lK}4(0)s z0euEf!>LkGt(sPWq_n(ZR%LJIn_$GMRJD(n;Hxwk?G16iP+E;o-qECurp(4@u6H(e zAe#td(taEjKiL6;{1(fS?#&$b0z}?Wd6$;rkG!=m7xJ?1J2K#fZl%yDcWxAAuqs%& zVvD-}bhD*WV2KF3&E}Lna7A|a5!v9#RqteDr-7-3)vG88eSPaU4a9(C1Rq3~U*%~- z{cwymGNa)Zu{*W1ekxV+gLI(8yX^C=i)zZ>n&|H9%#I_FCs>DB$nx5ld9j)%=7#CD3(md4rgR zQjLoX1t|01{6+qNvi{H@_H6B8MQN#)>Ch$19Ax8eUW}()T*czq(x5&hoa*R^!*kuG zLLQqj?hECLLTK7Q0Bl(8!A=rGb5!pV{daP(h_lcBwOi^E{NMIV{d;mmEUj!!oz3k3 zZ*Eln&#hACZC9IDBv^$s;^05*I$f#tQH+ggD99jUkWurel}DR6cgVLY10}vghqr=} z`ihV&eHq_O58|2gHfqP|e>@vm%wF;Q?)>LcGwA<8WjHB}`-w^Skd577XgEKN0Vky^ zM;hJ}N(`Tk&8Eb-&sb8%`&-2WCq~yll2{2=9bCj_<9^d3f2b~OW-T)BRP>KuG^_ua!=3acPp8dGXs;HRot+A$3;KmIGMKwaMh%ncT zMU$0LLi0DhFD~Ln1k0pi{zaV5^JDCw$LM@tbw80RZsR_;eMX1XA*OwHMuQWS7Fx>c>s*-1YH+O) z6+Ti?>8qupkfh0PhNt`jG5E|X#ehgf9cPJ{C)Q5hqI355!FeftiI~ny15@gRq^KLv z{HM9BJim^Y7b!1uqeNJ~nEc-&s*#&rCB4!3yse#Bm7Ma``p+L#=rlKOj3U1q#f)PJ zOT>863ZJchT~a5zW|4)k zP56aa{Nb0aQeor^66k?8-Jl}qgK11S-HBojhn=qZ-+E8pWF^bsD_C)rM#_F?`XWJ5xOfwBHG zvh9pbon7pm{*Cp2e=Kd)?YJH^goVi**0`KJSF}+F5`m+j2u_%ZyEI95V?bP8=jFrs z1O7&QD;!1Do&Mtp~W^(w0=VsEqx})dK=LI}B2pSUJ1PR9~t-k=uY4nr^ zCyZ7GFb@-vI;%8ic${h)HqDn!j*Zi(`!$lZeUFQ0z~SfBfWZh~py373ug z1Xj$P_i*W&D+G-3to5bPbN-?sP(vU#l5zqfKgsAmcT~bcb_E}62c{AC>PR`VA5D!C>1wC z9S4Pw?MU^dhx&e3T&I8$@2 z2$N67+1jFK$*LLan-hsS4KFHB6uEEP=Q)7tt-Jh3=vPNmu3-(j#tPCt-no7|df}h} zlpGU*lDJ&A4*2>93S(b9$V1l!t=L&^Om&*^HR2?kHu{J9Vg7 z{tc3h_G45C(G!f~o)K%*dVgpbpb6_Cs8Cb+dlaFfYsvKf)J%ip(F7sWI$dBJ>RBY+ z7uSONoNLC?Ee6daHi!9sGCSN>+ihfJz`#00ivzX{%!L+>VVdFgdxy~ac_pRjwhcj% zTK)xe!0>h>uWL*>P&V^;Xy#Ovb_1x#Fs0IF-YzedVrTvyklZ~p3?L++1i+6$uyFib$^)1>bjUO}L`=VteF0we z5pUUFiASeU@21(738#Z>=Kezd(C4t3*stpy%z&r@i$PYiH7J~bicz+&4j7$AVCGC? z;VMslAjgoZX);P{~q~C=3;!t7fb3qSLS%DWE#+Qo>_XJ7<%@$ zn$h=*yE=@Vav;}kr#YMtVBnC6s9KvER}zE$QE{P4WMyg~T}hHEQJiU`3L-oh5{q;C zrcT*yms@}IhRCfoIevPOV_5O{Mz%sU>$fm0iebxOJOqWC{MK*?5Uon)@cNzYd%p;Fj3t)_0nwocGGl0ul(!?d>w~cfAj~V6I9xq7T1blW&P%>|*ACluFNebj{26hfhh5prs8Jxx#aU{O zj+E^NxvZtIa7Nr*9Y0#(h-%#q%mKP(D(aS+b|7$}8xsVU1h7O`wI(NZ}PE^sc#x;2McVg0(G}MqGLmPQRThsqry7g4%g)jtGlVFTcN;NT+#DugX zkcjC-o@!MU%@BTsu|B6J7eUPzCfX4`(!L@3&_+#hKcB=pb!IFyE1LK6oBZzbzSwY{ z-dOq4)AJQJu0JG%h=SvmtjtJx$Qa4+m>y&a1X8YB9#4U+)d$e|)vja%nZS9?RQWYn zYK;6z>n(VaHO&-v!u3KN7T0$H0z4DjIzN@Oz3nGE<>D=-7*p@7kG1A%U_Q-;%XcTz*bfe^sU*&Nd1jknQ7hZL& z(D$#=>ApOyrInJE#Nfj5V!j_mvA*8OtIpi9a`nsc=1s1xG!h>{G;ygUtJp1ST#Qqy ztKP+gDO2vCpwnlQeSg?TZHa_nEoAyE;kEi!)Io$a>*>CSAfl`sk0_O|%!yd2&ya1g z;X9Bo>=&l_#CD#%}?l?!n47OuCYs6F{Fbtkit2{1lkx*lYkaDG%%3U84Dn zbVF23xJpoW9BRMZv!sb)nrM`b0N5553`xlw6U^zDd62q=Z_Xe1eYWAm&$%{VMIQ%f zd8w?!7IGJ7q|~t)IV{Xu-9!`xzMU}6T)^CVp^wYs`CN!n3L+|g7e5+DOBhEmO9C7u zsh!cC3Qog&ZMp!qiSk5K$*ti&jgozJy_mxr7VXKQ8MaVxV^R28$^`z>0#ye#!(9v+ z3uGb&+e9SYey4T_T?9`k3?1L3vWDtglKje>{|f$}S~;8klK%%B4D19F42xtT6@kU16KK zzZk@TV)Fz?L4@Y#-)gKAkMJF@^RnwuaLRWwWs_JC!eXZy+MfdvQ4?LWrMHgMVI-i; zRL(%gAS3S)7zS|{=FfL08Y04XArs<69k%yovXD52Sc9EVG#Bp6%zv98w7aIMDA|{q zw-7^4N&Zv7tTsnHUiMcW7m6*shbC`CvbZ%9}UIK5lk&bJOdMI~JF z_c+Z52qk5oHpEUq<-O*$$U9Oy6D7j!#0bHkpLM-*3qNvASW@l)l%aWLr*h5 zf*1626bm5xo3Xpt+XDOE9o! z$Y>Y+krqKEzzk+m1*61hNq}m&L#UBmrl61#?*G9K!oA%~l{JnWh z;yp~)jzSs}dM*>egCfaDb#Z5hg|)G-Ci2ibyYfmxHBc zl$1Y3Vkf*eBAJMhNxam%u=$*P!ab>|egb=ne2(-N0}FHBN$am7ezJ272`o7LDkre# z*$w7BH(AbtWA>Y`SJ>YKb(c^Fa${fsR;{^#6Rsd$W-FYxnGrX~ z*^X{5+EcJq)PWZf%YssqLg<1d**~?#F^SHi{JD8?@h0Bjxq66*WVaC^zZm`M)o3jz zwKjm^L27`h-nNExPFQa${d%R|zzF}4Cj3Eteu`}!_3MZ8ivswep~xs- zQ_S*3vxx;+B+-noORBQTfr(m3!fw+mUs3+*QF2LI+|Fh^YTF=OV2zT{Cg%g+!brK%<4HRk6u4}>z(96Z7Jkko0slRI|jT*ar^mW_=O9e7(LKVcWqV3HC` zZ(Ar1*N8O{reLSR8|QvWgd06#5G()oMtQ><%MLsFpSR@yQuL@=%E0wUb9nqvHShmc z(f@G_&Qg}MpBF;$#piQ0memo_5qq?<{KZQg5f~Jwh?0^o4YG5F8}~J~FH;$*K0~7W z3=fZ@8#V~;cpyn?c3!Hy0D`)&ZD70E$heB~dwqL@6vAgjr{rffG|dtz$5=5I^tY z)#COVtje&z6jmIlwVnab7@^H+9yTSfWk-9BfiG7SSA$A%Nbbn1>XTZU!diOnjB6sn zhQ>-0SSJ=Z7OecQIajQW@8QLZyuUA)uJ!@+YY(vjV$olnXVEO<`1~+MLf=dvPb_Fk zuV%_+uX*=oHx#XEX%W60tMwx7SCrm^V|7&#_-AN_YO_SU3=^SflXq-b$mhKVeO2-xNz@ol{%xJ9XRaJSD5pWoI0SF|n{s)f@)j#8+QF>^xoys$+rHSu>EQ z)rZGY8WI@aobH4mGIXa(xm?N0&%wK4|YG-P&GRrV~w?)Qe6Fd z3TA@5*N&damcGJcGR2uo@mig}cCm4rZNsmluwn)?Nl8dczT#^QWX2lWF+PK%7Rg6r zv3BGRVZrbMO#*9x!KjJ6aGj#+5d3*H8$-@`W`r_+yOSiSV=Q;6(|;2q_B=NM*5)Q6 z6`ar<$LxU`c!Z#Vw;+{hyeH&cn{- z@6Ql2yO<=il>%#ZzQ*zus^wBuf*Et8^f?;s9qH(=JrkybD8z3s22{AlzWtk9wyF^G_$)AEdh4 z{!d4&s-=Lggz;u)zgjo&ZG0z$&p=T<1LW&(NEMq zLnKKT3u&UC4zi)uvLmiI(%Cb!-&_FHj?yERChVEB4(bCuAr?9Nn%4}FvD9|JpoWVi zgXPQy0v265Sp@sF%tm<2A8nrV-G*Mta~i$1nRO9>XK}7Cba0X}KUi=AW5_!zZLuN) zY{u3Y6~Y3J*Rk}a*S?pn(6+?k71!)l<`a-vwrC8n0n+)X`Bl)oz4^JUH&|4fk7Y|F zsLaLn&CtMA6Oyx(p)gRg*aQ&nRc?zR-@tWfMCwBbdvb@HR8_B&GR!T?LtdqV@Lc@C z0auSObH67`r-Cnvad|oSrcm%Z4o7iG8K1ia50X1OTTPy9-zK=q5;$i9Yympz*yg#! zS`npN*oC*1V+j~AOh(`Gx{Yv4RB@WC%MuOkq4Dq5I%%*N&An!5rE8K>l1~@rK5@?_ zJXA;OG_{$m2awGH>bR5_4<~W zT)HyGfsMA`rvJ0v#DaHfNI8`W;xR8>>UQsE8L@PxXe#XkvvyH#5vwfFs=Rgt#W@dI zmJFOgi6|W35uqB%mqB@6e1Awc!%qvub=WTf28#-;vde6o3wNkKL`ZtXy%TVs1cpRK z$ZjksDU>B#S`YEr?=iF$44OwPq0OqISiW z6h_@d@E{8Fq9%jHmPH=82C?db!#chgor)B78(P6WA_mc{;(QTd^9xshL$LkBG4}^a z{-)*V@HenOg{5zEV2>C$@Hv0<^S0o76zm^FqN^H@A3es|@3${5NnQ&fUS}iVR!)BV zVy{}qS-gZ4#O-vKQ0GS^@OToLg?PiXn`nT*s?Slj{-VLa04UzEjeToUmzUo}XH;#G zf*WCijdRB+0VQd-H%hNu|EWz3xRq9mk1pc<(M3T2NSo4P3UdF-po)7?{59Kgb}%$H z{nrWB!$r#0;lIE8rlP0tuMoAHmL^sy=96-Fp@C%w1Kl&pFsv||tWKDZ7;%XyP2}pj znLF^6Qt%PhXGo0YIah*6_K(sqpA0yyTog;jN}Kon8k_k=*3;AJ4K|o_t9>r|uHFob zp#d6K2TO2cj3p$VnakQ-{4C3afk!7*KW|M~TwYD>^cTk$A>L}ey*u%cn9!KRQAt3V z>_pE;*BMOcAy-Y`4WARPVhE7acY~M0{Da`$;<;7&n<_QVTfUThWaibyv+B_&Yod!9 z3C8*7jacp8HBgo6S*9c=*+(HFM7QdvUdVpG9f?>pEVH-)y4COBj~pFhFbMKAk?bAE zpH1e^RV_pdShw_#oM@-uPW_i%@iN}jw}3y`AC8@Btn5d7ugW7EQbXcCBnwQ_!UoqYlRyRK5yxoeb zjagqLK#j%RSOOo9H`|gOFYi}u`$F|@g@5DX$=f$0PG0m&7@J;VK`gi%8U& zWUb8wq|t9OdEzc_RMm3Vr=DipcKS)OR zRNvU;$Q^f%eL+&x0WJ&5Q&^XKtajI+m_JwBfnskS+*jY75=RH}eIk*gTo25k2=~k| z+BxOzsNxrjfyG6Jmh@>S&tgX4WT2kR9XY$zB|Yd6-O|J92a~VDViqs^l08RoB2d2`3Ri>>ko&6HQq@J z5xXST=PELb{3#=QGPkpVfPT#wggXTDJ}j5P=h}ewoUAf!UIC~J@TS8ti%cdTuQ~|7 z{CtI;5oa=6<=8RqD|69dz`)-C`oZw^F4)59UH6g7GA&xA#WFd(%mUgl+>DP6#U`6T zKwE0gS{P{Ya-M!EGT{n=xte57VxxpeNoaYF4D;1zjzp$Auu)`!Q)X?#9QK|SY)5tN zXs_02DFY*`!U&r6&X5zPX_1z6z-RXE)GV+i*x2oqZk^t4q9z=YzIm*wE zpj~+YoEv-Qd4eep$g!XiLH?-7&$hs|qPj3|y+!AKBX;I}P9~tzMtkob^I*4)KG|1c z`UbDQ39{AlJa{T;W2!&v=TnYMbc#(INksO&Vj^_JjYYc@( zOgl@-qu$_PSTOozaMWeA2f~mcagj7!7HE0P3y7GlapqCgUMgc?q9iX7sFH>&#uu!u z(iR-l22Sxd4B#d@)ohMUxRbN5f@o4VIxm%tq>2xU*G1@dd9|J zw0V>T?0J$qdmYI1gYAq0{2x#!YCqfZkg3qg!hblgdie0-^-N2J)a;^r%(#jfoZBcZ zloUoCgxEeDCxY#}6|*`T(BhTD2xGe)2N(+ww)Y*tMu?dtPaG1=M*tVzhAh| z3v+f}4jI$9cb%HLa#FH68O_WL2MPVdnuHP?5oSYa=|+*AM9Ij)JL!Ppl&>RVdk+gy z83W5kC1SxN7#EfGxBQEng-=Ck;^wXD#`2=wZ)aPbN3I7MzuP>w(q%LG{i=Ok>ZY-k z@(@4w`6XLPoO`YB#b(?%3THphRKKs&OuB3^n2pw@3+J#8K4j|Ks*gr}E?oU&6GKag zQ=)`vLN0P@VL9IHB>DmQLkg3?+(EWAtKtfp21bW%-bP@3f5HM#(G8{MmRCf z`)rV;w2Iyx=?J~3*4xf{Pk)&YaY}FCiwld9s%p>(Au-`0>mQ9^qbXbkfj@3R!Mxq0 zw1kCNvuyy@l3M{sWZwGnCC^u2uJ|SFwbk*4#fv_0QwXW&qrsr2KaGH{6&%w2BJAF9 znJ%YUerUw)w>U)m`SbTgqrIaoJ!yF4_(f;@!CyOYcZl_i%z1LBx%vIdfUI0BzpK|c z4=WD0-Wr4Ple@BBW2|zg-66tBCy;};f^Id4*de)=MC}ijC z<>!@+@Amqi>$WMQ^m{Te+=-^+hrPZ)JM?{F-l3SKaST1O-h*;H^x=8?+teBy&A_Sh zzmiK#|G1$2_gODmW%Hu}f1LF?suag-!fA5FOtywypjDw@DPVvJvJyd;20q8*rWhS= zmcIdiXy33OS;Id`e0hzORlQwvOUtFI{&YCvKF#y6_B-<{&-*2+5O@XeGq9?FcpmTK zNHP9r{6JJlXADL?-o?pL!gDquSu9%*(Vn;a<;4 z1pS-dy^((YUk}y?SnG;TB3GG>8R06Cfb=hi{*hpfE07O8$zt)-tV4|F>!jR75Pj>qr$%f?x4j~s==n4c*+slCGm`ymF zw}o&}JBChNG%k)q8Ll%-Z`0Dpge2qk1Ji$vP_4YdfAd=Y8*Ba)p*KPolz zBlv&^{u;7RMrhuy8dsMh6p{{iw|Q>ZP~=0^%l(B^7QSZkLlp{r7IJX;A1OxByg-|T zeT&quLVS)ZS!dsjv_t5y>)}K4Y%co0xrgD`NRyB1(U5yoUCbSbtqQZJS$CgahebQs zW#?%q?>TLIUnAoYV{SGbRD0soquz%#LGEOV;sni4}v%N@O-LuVv>N z-9S^Fq1Q10Xi*9kG}Z1Mx)lk6Z-!AqOh+`s+GFO0m~%DPIeFdUU*6CcsL;$o*=Pw7 z@v7+Bh{qA})l}^|VMOF!=mLy`VW_fG>(e{pZ}@65-)ryc52 z&iLXOZ|zM{?Aadi#^}K)XlE44XJT~&Xbk9Z&7uT*!5|z0I5Uc-b4LlbaSO4bAzF<$ z|4+JO!J=DRwW>wm5Y-6sNX{^1dL6a~({}ED3?|!R;&fO&pVw@@=)0dL_H1@QZ*enV zK9E!xeX2(YQ46|E4VY))uik;rRJtsTfRj)i1mX>(noNyPs~}7b0ju*d4~;#vtJ`p> z_IPneFpAaq0}&Ar5VF;P11N-?3JROA@ zZ0*J%L6nen@q*zQ!7>f8r>Ik2iMor3GP*!cJFR|PmOE{^xS_x{Psy-|3tcRE30+q< z8Pkr0v_f5;f&=*(t9v`71XIPcatD_b)+~knUbmRFNh z#|A%M+97Ulob-9_6{J=;e~(wd_DswVOYbMs2|bKzB_qWfw{_a^h7c~Q44c@AarU#J zE_MnXzA8g3Y~1^I?;J}Jy>%^=>Huu^&M=uIWA8pZ{r*hZTh_ax%8n$}lmIg6=rl+N z9HXCJv+UBlrbwngP`~I@x8;+0l0GFHh?w+n{4kd93kVU%K}crT4Jpg*2R^=srn@z` z65z;R0An!ZJgNJsw)oOVz1+Zv3FWO0pR;j7RQLp>_guB^(hI zWwOCkTAL}eaJ@3_9K0g}-{A%1XA=W3f>p3_vE?!XbFkS9^zs)F8;2wW&j<{5OMoYxKh$M`+)awBbaRlTb(Pfmg#bLt~6?$10nL&?~{XQ&~_uLlC>cXmN#3 zp|PVMvbDaoP3%7R-!2oAET|SeLG!o!l0U!X36GYg+`=~_z8r1xXgs(nvE(|Kup!zvaFz2rTPQ#vr3+`_3l2e1URB$ z^1{#ij+r8(zfq9A{6*OfJqbuoDE{rlZ-y1h;Jq&Va*EV!-xqCJ{Hg9fIG7>tpX@cik$v#Lt`^kJ=iI zDqt3TEFgF&gl=;gwjy$JkBH(u=OiExT_U|kl1t8degA%kGmz7KbuC(3f@%OBh~vHQl+C%e zwD$8Uro_IA&r(2GXXr;1cF9kx&m*XYikY?-ctq!H#1Xc*_DJijXGp$|wvi>Bqh+8u zXE|?jH0QNw2sTI4=4g!ApqtuCbM5x!NDI>?NB+-w#*d9d^K17#D_@`Quv?5vYsH|U z?zDsq-657oR$19G&u5jl+ zcd{+(=jn+up5RzbV+#+E%d#$H4VGl8a=ve~so+HBGqtnJwrL3%lFRC!7~xu+`8%_5G>Y zR%yEO@LJ8Ey=h?S(i1q*#6r!8$vP%BC>@W3iS&+PWHq&5F5Wg0zyM^$c+A4yTq z?unYD)Sy|4d~bTYTb_~BFyxq2M_P{p2jzE+RZuIGd>=;cn-T>PkHtBJZ62huxTTFCPvkYTl83Rhq_n%d57eGkqtS@g8=mal=a^NA0OT`dxHIyu@6bJ z4okBsnpjH@SN?1#-tY(adz-HXPck2>BmTZgcPN>!P*##CI=s#Idlp*X{z{iH=;Kjr zZZR_L+3<>17_CuS5ay!m+U5R;BYI1ihGx|u0Z9cGAqHxA6q*E`sy}8;|33d#5N{Y? zD}6QnW+KY{W>%|+HR7y>Vbq(YF#fdy(i6JriT!`7uVS%0;{HQ*@!()!JpWvM|N7>W zgQ=6Di~WC%0fH5U1CA8oT*cBMN!yIyU+{+`@0{uC9rQSE%;W2#Ni9a*ZxS;c`} z5NaXuQFANR;ngM$-}K9}wEl~&?4~!7Xe13Ir!~F|_me2T+-mZ9wE9#Xd6XZqMC*yE zryVchn~i0O22#f`H>h)rL0={~#(pQYP{7$Gr$N&vN1eWFknj(FKGm;Rr zg6m#wx#$Sp2qYn%H1D|P{1r+pw=5w6WsGYKQjA>4ne(yKU4SrKm1u~|`e!r%BGPgA zLG311A79CNLdnb}UySz=6l?v+R3mRZsc84{tvI&>?~W}=%>HrTw?2<^PqNYuc^m|U z6>9=mk=v}TE;t*<^0STj&6W(+N>b6gkV2jAAZ6pNHzBB)d~MT)S!Y4+=2H*7m)v!9 zLbV38B}J*F7zY~C^C2V*CRk@xoL+-;Hiwlm@p({|9b4rj##Eejmgk8W&5GfS&KvM3 z%ojKILd1rW%&fPUe;}XO1-(_H`Up`0x3+Gw&Nw$hFJ=VhUXdb5YE7mHVugsV?<&af z;d6+z+B*S~s3{By@28!KOUU+(NHfb2R3&ANQh4H!d`k|hXt_U4$8IJ0&PkcKy|pIV zDi5pq@g92P4aJ%?v&5~9+*eK@SFJ-@$xpAy08mx_Lg#`J=VZ)5x`Q%rYg= z=>?(1q?mf7S{h^ZQge2s4R5$*3WbHWLgt)KR#;e4TnS)%bwL)0DM|#?pFqVRJG(#M z?opqjf6qvOV&k3y&Ukn{clOA2arsuB3MJx!dA0%8I+}}gnzJ^Q)<0X#So#Q;q8d+I zQEz|_8E@i0bD}FG7gjdQsDWwlvM}_mqVKn`b7L2GeF%u^)22eBz1#B%=ch*fj4{C}7E63wgl%^sGvk&1e`^@{c^IOy{hb5NwHs}I33 zE+_ReZm{!j81Le~Wy7!qHE%S#D|#ZO>0vLxL)Jr|!wl!Cx5uY_`fqeZr=uh_qLSIW z&B#d5gyJ@*t$`f`#mF%bl4%9~bpvr<>GaC7SuD(s<4D^M3E@MAie1F5*^dz3qt{(W z6K%Z&R(TqIaeo<`D-%w9Gt4vnBnE8s-sw#_Ck?Fo-QK_Hd`5!e(zEJwipWy?>fYZn zSXM6|)9L>+Us?{gRD&XG$21HE@*$+Z1yhYSeG>hp%a*5kwdL13`m9Q{@);iOu_h@T zCB=G}*Zs6X3>_qntTPPRoy2nJpk=h7cdO=3uL_+>O7l!Z>Y_$4 zfFEoOo?kzQcyEXKJA4O63Ic|ES0^!dkW+FKu`Il`6sTT5bOTk* zh4LB*<@#?dYf~os0k3(5-HPa}0G@`0%ucHvd)XdWI$pUk*qR4i^&fK!CVUHk76qvy zS_El82y&HdBbIWOmUs5EuAJbtddk+^qi--RRlIZM}rqrTjf?2@FM6!In7d%54qxCJHJs3)0(g+;!O&s<*uc2YT_=gMa2k zRfPTp>ju=UFkpR+Wdgj z5d5D868}GKDpu~VHWj>?geFR(cn1U01B-kF(<6(E({BHU*n0d8Et9)mZ=s=X3yc7P zg$b@{eQPqqp8vDGV9&;9Fbo{JJ%kddecpR2Rzn}2s>zJm#YSeY?$WlX#EP5+I(2o0 z3KZ&~KW=(X*z`*(MMYe=+F7PRJ?QO%>T-5F66ngs126F8ChkD#tzs-nxEl?BW zGW*aZu_qE!I)0MG2|Gw2C)lN!`1?kR0zc7Y$@h2 zj0<4ZJ!1-5coj4sWhaOwmXi=5a;eOg$+j72VQjI6j%h5J3gUJZ2?;i)-^#X##*Gr4 z-W6VN>W`b3FS`=l@-cxX_At0+GemxQ8|BYu!;_~;r&wRx+`U5E|h*zO>Q1v^?;mU)n8KC6&Y+a*1S>fH|^u|q3#~U;QG?@)#*i()}AfiCuub2pVXXFF?3K!aVHgChV z?jT@ztnTz?Dz(oG9g5$|(~iIyVd0lK>R~s2*J1nsb0HgEP`9%ziY@9y3q{v>W3!ZP zKTE8xlrO!T_uf|r!fB)s`4X-j-<8VZ>Trzgg7PvFdkeplPuB5KmP{?xVOp9YLyCX`!(SKQM|_Duh_P3LLhAv6 za^;yrU!-xvH^iJE#md?*;ox_F3j-JInKaa?aeZ-S5e_F`pa7%{)Ew7w9(n>!UKso{&8LGpofe+4WpZLknvfOUkv`MWxwscx|3@ZgCZD+!i#L ziRJv%eqYWZwZfHmsS;bK22P%}A%TcZg-QSs#UZCOMT-TM3{<1UFWbT#srx*;H<|M+d{^l!iO?=gb{x)RFUl-uzySK+FyS7ppRY?H_>%ubQn zVeM#J*~?&teNC)Y+jW7TJBh=Oe19MXOO@c$OQ%2FPNr>@BA$iKoU_?fW}5v0AKT06 z!_sdsiTFiBlIjBNa1<$WK1Y}WydQ+1lcT=Wg=s6CB^G~Y(##QPBy0}dIfpb-nq(V$ z;Fts5&GLSyO`Afi^>sTi1)JWKO-E}FcNN{;l39*5$ca8ibElsv?lkFqd53O5u@P}| zSro=KT`WWocXfM3+ta_p(>hO#dRw;0;5(6aHRIhu9-WHu^36AFS_Jn7^)zp_3Lz@; zbMCb)Cavs|ld99t>tw?jULqI(9tpK(GT@c3~&^$t*c?McGLcI0MJk zJ~TzTMF&`qmFLdgeS&m1Tqwi(ZL+w_!RvU{IIR)ZfGgK4Xl4zWT?VZS^QLC>48dr zoz_X<8?iz+slzTIZb(aIbY#(ZK5>jhA!72Ydj81q>hh-ro$S|umqqpgA@+Iwy!S$X zGVHnZi)9Du=AjbHl|ccuW$-Gtw`AQt3o*u)aO1*@jp^yh!|P9TD>}AcVy6gM!zp~T zyet9FN5siU5-&ufISAs-M8~g%a&g5o)gu~tgXlS^k3#7I;M##MuqSM1eXlA{p$u^+2CKt1T6I5DT9L^X6`D&at6frnKzSdlkQWUuXop&-}vpUK}I5?%v7qn z3%Mi(q>)mXJV=hZ%8pv15T2MJFmmIxNW8^rx=M~}LmVNGo%@5K;?Ujvfk^r43?n=sy5nk<4W6n`JI!wHQdM#5zQ+$PW{v}u>w>0 z#ScN=Fl{(G_;v%DMF^A?v=@nu^THPX!mcfC<_P2IQ%TJ~N{S6LcJP# zl5Ix~5W;xBR+RZ=sp*=7iBdU7!4xB2Z^UQOhFlr9vAI;8^BN^0Rt)D>wK3KV|JD|i z3iY|EXCZtAvD~)l3xM254v;S32)TeIJH;^&5;XPB-4sFQYB~X@sUrlU_0Gz=`sEDA znsG-tKH@E;H!PW_LZA3shBM?Q%4)dfwwtW_od^jd>$e#5_ghu+SpA$Q;y&|gYn%F| zS4+w`E)(#%ehlX}?VP6;R;*L2Z)A-X>NRnDr|9RFZJcb`dc|l&a_plvzkI`vOTao0@qQqVcfnU~1@mhx=WRv`=(BeWC`+R(c9y6eh^*Kr zbtudC&oT29q2b#UW)2aJ&T!p=_2#?3{&rse7BShR^g%xq;y;bc{1tltTU^E&{ja#p zr0oY&#DiE-$_zz9UlNo(vBc^awWSanF`+Tns9MgOGuCTY7BG}9hp>D2IKRv==aUn= zFfe}FXQ7*V^cQ|d82&6G;Epa$j7yug;yumNBT(Z#)t2%3t<4Rx7b|nA7RwRI^#~F5 zC-E>Tfx2TM0VLiykmiXLv&Ir`yEI~nqto9Qub-PKg=@eA(SBk-C?b(=L&>ldM?GFK zUX@fe3gn<_6+Jej%2I745ADxGpGuuVE?khFzj@j^O z!TPTO6uiv(E|%>yc;$8LU&Sr4hAQ(2E*Y_`mrP{1BSW;w;)P|ap zNJ~jRN~5M0fL}AJ+5|vGg;s!9jV)r!1S>19@N%*wpPf&s{8fcnG4=QRVjKv$$&s

    <36?F=V<+RILR0IYj4svy&3qAK<)mPu|x*fXBtTwvw$ieJKChI|!vHVNo zk63AeF)%i9kyX363l$D7g^m$%W<;meBgmv@JWrWV}CO6Uuby6INm^VUHg zi>h75kxHDI3%!~;!3{=OOGFfdA?yh@4N~FxiE261Vk1r#z7W0l+hokAc zF<5iI>w;Xw!>1zez4r{bPnGU5Z~94jfg!Fpe+-wT!em1rj+@xBGd`-1mqqJ@6eGu) zv3D^S2Z;oZ`XpjUmRR$p(Va+ICJG_(INKW>@#!N}4r`;plnEnmLq7;;^R|fwZ~sH; z+3n~;OSs_?T}D8?&7;wRjP<~ByPyluBsW1VYXvP4Og+1i;9QmNro4wdtL5kw_@mO# zL};O1LPWjDQG<`;^&V5tf1)P%s6Vn~qK;u3dnvYUjUk39+FQl>I6j6UMVZ%FqImN+ zsojf?oXS{ZU^R#*amSFZ!<257i0iu`x!iESI6fg?Vf=+D_6b_>0VcOFpD*C_C|O%l zL2T;t`6;O%K}08Rm_5b+VeKtrE9sVOLA%V%%#3AbW@bEQW@ct)W@aj5nVFf&%*ZbSCqc;H*}20Ozi< zJ-*2#X%BxXr#7gDTGJ7(sJHdv@%MZxoYJc}u)nvn)mjv`mmZc7gqMpXDp?ALWFlEA z5m^~k8KzN|^f=HhV18lr(wYD>qS2ie;ZKUg{)@bn#~v?nLO_8cmk=MC$P$(yZlV znz<4M78`Q3=@M-gMTL@Tjht}G9!VUAFCW@!tU=!k*!(a5-W{;YBJb}=Sb-4s4;I`P zdY%{d;a9gVB9s!St%pGevJr@>}ph8 z*hc4SNL#12c5bD2v#-Uv=8N@or>9F=qv=b~*T-UZ%jIPHKfcM&Zt;Cj9PWY!avx|R zGy#zX2~Wn_@E<%wiFQ}^}5K&O+Rutjl7L4+rHwj>~T)_K2ZX{xT ziUMmrtYC`+@h_we)dOIwpT#w7gv~IhUC>-sJ6g_%JKW07FtDiYmzG5;S7X->FfdDC zWVt7m34`o5#@J>H$EuHTA-EsvkT;E!$i-@ofOlm|)nGBiy(lgaYs#${(h8d2l>`zI z`cGq|s3+xsrWwQDa61%nk%0-zsf*`3&%zQ%Jx5#N9LO=}@th^#xHGF_{AOFDGT#*M zrG;f{k5X>a^Smrp!Vt&Z8V%*Hre4`Yl$cW)(M5P-qLWaj8brahe^$|IuS6VEBZ8F;l*Tl}w6ow2ard|LMq@73d!=d^*G|gJ+Xt{LEs9yA zq-Lg@3~Lxs5yH^;*;2$1eDXML8}L-G5yFGNG#mmcjAhbkwDs0juWyVtEK^p{pIC*r zk#Fo{$g*Oavv8B9r+$E@ASa=(S9K2&S(3qIvP8d;Z&aVLkz3Zlw4k6FtjUTj!a{M{ zwaCZ0$;UyO+R;*wwea;3zc_JRM6Ltdt#qp57L0?^V~6jJ3} zQcu-PS8pLl8$%*%O?)SrR32=cMS3VVSAi0CxS2<1qwW3*wEq~+_NvGrA_r}giZ{- zuc)V~udr#@+8;4+u;da~rOpPJC!;jj=pLwN77Lr$}dC|KLrgvW$7Q3X=;rLyUX z_gl=CzdeMT3O0jT(HIyg_Tz17>2{f9)U$WGMrN^M=}7e&Qx0{eh`oxY4VsK1l-MUt zIUu-Qk3#$BC$DnAWe}y0ij4Bv3 z(=P}ykhiB`sU$XA=S`Y~I1~L*!#nk1sF`&D~p_2?%4Sw!4}mIOB; zF`dD)DsR+xUC#EK?y4uOR2Yyds2eF96Z^)~^`o@vKmsg^aRKxEE@@%i85N(F=JGPt zWjzFC`!CXto=aZ5&^R{@2T5xihOwB%Z z1QV+u|LcTtY4McRmwNygYHgAo6>~M5=cjOdne9YX2m1@mE&DubcenO_MQ=L6_SI2+ zc&)pchfh}>S^yiNd-OsQi`AmVv1WPOudERFl9^Rer|MQevr67IOzBp1ii5s!s-G$N z^#^}%TPWl07NTU`m|T)0C+G=wfC}eae>@9aE8ullwg z=p=jz{$zO9shSLQ5^AR#XLia%Cq4etHS-&Q^s+yBu>!InSJmUH921c63L%Qmjd1gj z{GM6pVNYyu@(h_gw$>T)wY_a>zv8|<0@y5B7@+29NH%j8l*IChseHhcp(?^JZ7Xk; z3{!wcz{xpa?`R;{PVIKK7vwIo3rI|!J_v7`p?l1@gynrSO!L4UYhJ-SH*8xXJaW^`dqW8E z#At(neU9H@U|i20+BsC~+j8h@hy0tHp4ni__h|A3yoK8dg~5FR^xXLXp5FbywVBrm zH-BPAUmZM;G}NNHc#6gyu9uo}Wm-e{?@9dq1gt7Poi_!k0{uvtLNh5v<)VZxgA1M0 z0ivzjfwgdip>FkM2#yEut*%oLErV+`VYbjE3RaR9f?J0|bKwCxR*b9^)`{%>$%q3( znUN?`qN;BARNevHfpbN>h^}-7j0?S_God>MjR_!mit%Xyg~?zkOtf2bxG9-|Z2wy0 z32N(a%*0@N1kYhfeYuWZaBuam#@MP=@@I~^J-I#(FLjK8O2N*Goz+=~I#I_2?EM)} zS$#^k{C)J*7{BWF0UCSLur2c5(7nlf$-Cep%Y4pycJ!xXr`Q>r;{&jpsWc}Y>|6z& zk(uc|%u-hFY8I)W(cN^(bIlzMXXwqm0}ZDfG*%^-XvUb$yt83t1^k%=X4}M?5dvrz z0RvB0W6F&~%$!_Bo{>CL{R28%rV_|JBP#t+EHd`&V?O?Yi5z(ymdz-BsR^eYsaM+iZ-HpCpWgG6ilRtOb;F~s$VT3{goza|JZ|!2 zSY;rLyT@UjC0<2O-2``TR)m8K(S!~*YzqnN4jyd@xPL%q`6qSqoc9uZVP*8#>yL z*%ZN4ar;qk<`S|wT1|3Ohwycd<`f7Cf6WF?jg75G|0Gjalr{=av;cUKmhUIoGz!%I zw6vblDjp(_v0qujNE|#Dvwdhqlh(y?jl(T#6_|K-?`$rZZS`-FAt|V3*!}E!48x4& zoBTzsqw`RmxPdx%Z1+=wMKLmIwC#+ki(*7x)ka$8+KwNR*C$~@@hXbdRPI#l({=bU zORJlf&?VZRc@KST*hxk}p}my8@P$2C`Xbb0FOL&4w`p}` zegJbz?(rV4nu|=Oew(Vw7uTb33*VI|{yo;j_4*j9vw3u%?_gSB)e&Jd^2w&V46KK= zl4HB<5^?$mO~u@|u-yw$KDU#?(pI&~>$zT?wMn>t7+roV=DfZZ6BKcjRGhl)h z`tmE4Vh<5Dl8k_GE}S@!6}uSoEMcWH?3C4D8Wy&zVnIC zmst){PO`K3cA}F!hDZO)2k~P~gRkDCUuM!r3D%-g-c~yGDVyDTda15T?nx`@S#B0_ zTxuy_-Mm@S{a9NQBLE$n2u@whWxJf3y`*b`r1n~P0myQg(z@(&CabR9m*}ywcMu97 z^xs9A<5In3rBuThj&cGi&KaFqUOYf&ENkJ~Kg*YWVa$}5k|6Tw>fm|X6jE|n1l%gFvo z4nshBu)L0KomilFw^&vG7cxh;aYNM0oGO4F7V#|=iw%u6T_imOjhD4lRCw~Hh0GT> zN+;=hL!g98-V{Bm%q_gLWI|*`c`h`uF4S?ttL!VTUG{lH^aQt=Hze=yY=DiS1FDmZ zpc5|Y#SqtYAjdGQZO_gVYA0-0m_zQsnFK_bZiBourY{t6iF}%=5KU5=Ya`Gk);|k! zdeBw~pYGex5WmGGdE>B(pQMUEX``<6iQHOI!TMCiM@Hox-da)K`c#-B!xm=lls1W>qD-1ErB7ZFi`FpWNj<|wBHGQNneS7tp5ueu+8kqh7|aOO&vkew>}L6K!Q5+ zVvLP=m(qb^E}%YiQveV@4rSu;2Rio-en0yn&EE@WAChF>%v(%rhPqe^3>;gV^txXR z1^h^Q$GOKS&pb!*_Rnd59x&yix0qb?%49u0(BjH4H;!$gJ;FW3amhFNrR?UD3OX*; zuu9Gi$>B+A1zJ6!k)~5dXWKh)iHaIdRX~N6*hSRDUt#D9pF5KeioFb1GQ&=jzeoq< z_V!0IA9yxm;45hU<#qCLANz`<69^~GqhS_BB3)A?vudb*u~@!vm~i&`BQ^}ni1dTY zN+g53XexK!?92%@z?F%zJ8krL@Jfeb(4rr{1leVT?wk|$P^33F%e!&nvYbjHZPR<@ z7$AD`c@R+E`E$%D7sT5nsb{Mxfo7lF5Jo>(8R)VRo>BD)TXmui0IjF6o8i$VokKLC zCvuRdVPHSf>9^a_crGzaJK(pyYn$M7kkwb{$!N45HfzuIMuFNd#z-!AjO!wDehT^N z!#BZGq;)D8GZ8$+3u$Parr=1ThDAt)G2q{f%z{%?envx_GtTovHCiFr{%t>2-!mst zRsKMY^yG0cMl83LXw)ln1IglP=)php4;+|Sft7o{be_fIpfKqyN7V1A%w0H6)W&{t zOyob?aQtEqnPNyNa6Uz8k>Zq%k&!OmWtAh8jhT`EJb+3%%O2$t#Z`}GK5Xdk0*{$U zz(}qv`(~spNI$DDlHgBG5Lia#E%;iA#ZuE@U?fOyfr`N2m4MEVahi0@z}mXck|{G6 z5D5D%T5)5r^u{?If@BEeE2Z;^veX|?2=gV|`pJA5thi_Vf_~vRt`xgI?K`7i$)1slbxU zvTb;TLmW`}=VGn{uAGX7!3UyhYRH>T_6(t>5mFW-p^Qj_&{#*8)B@CT(E;pJ1KShs zlcB-@Nz~lF2TQ^W9XI`4pnp?cf2dZyOos8}5L!*`d61|BFHhhK`d9gh4cUY<_{zMp zKHVOu9;7Hy;@m?EI-PP3%qp)-g`Lq5_^{u2nVtTV`I30 zvs>JfZSqXq*4C0_Q#^xr{Ax$XsA{!gRSOW^6!T&$Teh~xF+rB5g&^oBTUN5x29l2K zCAYg12!kUHxBD^QO3q9f!1?mCp?0Y#rj~zZ{+NlaA#c=r?mkhW*@t-H(~lJ#sgbI)0aA1m1_W^)(0Rgrq4tH>9|-#*_}s3pMbw)JenA!t?j9fk z5iUM4KLhZ-<8SufUl_tpc42sXsbGO~#wcIvgcA(oft-5`x-n^nBSifj?TD)(U`T^k z0P)N?)4nVuxY|ynx&iIU%1htNgQS=So(st~n*Dx+)KeI04BC|x*@k}SqIv6;lyHYo zNi*<9N&<@kqL&Bg;8kSJ_(-H|!fys_jF8ro%UiI$zb4g$qt$#1bG$5mQ$9r@xU4tD zqKy2VWWOUU;|S0139|I9f89#eUyQ@6lq`|?b&&mz!xbky4<*P_wm$MIy>T~fRWbP` z>FptDj>T@9bxLo+Y|K=vE;SM(Nobb7o`Htgm%jIsUXyKi{+?@A%RHR;X@|sTkWN2{<8m zRbJ+edR;Qbd!#w7Rr9kDuA-mcVmHCYmWQu}*k`f|2Q)B3mx|GuFjoP*6c~V4#yEKlBOPnln&9dS% zuPw{PUwjM?v*4hlq$Hz6WX1j(y^nP>Ff+}DJM498V&mWD*M6%`(UYg*#@04q+P5Iz z#Md_I&va#DMY}iZ27sUqi?Dv@fLJK4-B141vNR8dqoFoOg7M*PV0SBLcL$VHq?b=O zZ_HOP#$OXf!xOftG~*xtVI2YUT{+>jh%o&sBx+7!ii`h5IkRR^&!<$fy!^h#b$&%N zZs_W81R2~4;^Z?9l4lU_w4xKvcob9S13rkdU0chhnJ()U*2F)akdEkk2D_?2$2CNi zZh~);=Sm0t{INX>D@!d4@du! z=^)g$aYdG|>k#^aXBXRrj(ps%On&;6HBV?mNOxMH7Vn>guCsCSo55FXCii`o;v|S6 zc$`LS)BZb8*aYE(x+qeWP>pJI{zDZ7d`f@XcH)e;(}mts#9q9}8exppWIbKUnht?; zd#0gO2S|4rq$z;XBxlq&=0sxIZbPJ<{W&)4R_f=|P`*H$Ysgma1`?K&OZiUjIue%4 zZy^WFharlshckH@1%~4j-5%~XB8I<1!=TB$hDDZ!RbkBOJlGEFAQpfNqw+G)X!^K@ z{sr(Udc2~oCYTi+4$+=6oK`?9)%p=f*4OP-0B1Ntj;=Ue>lC=`#^K!-)jk}1I_iju z@p2EG84SlzA9@!K1(XXuLj|Cub4it{k$S9iHJYJ?MAE4$dCZGK=B7gMVABY3eFdXT zLpJK?Sh^3gbBwd?y}|%?Mq1LLV_BfQ56!gSTkBLd;MBU)DX=)O8Zc0`W*BQ6VLJkv zf{tKLjl*Q%G-zywo=Q_vq&*SJLxI;yYf>bS19eKr?MSkpL5p_WxkSoS;cB~ zE}d#ihO-v+{Mgo!p{z^p@UvG}LOC(hpGwULN#d-Q7(s$Ldb_lixgqE7M{8j%6B;8v zsutC4K^b;uEh(<12?I^CH;uA0`a<1OM48yng=HI$b%aOE4jhU{@3Ve`GNGy=vl->* z>N97yqctwNl*yJy|F>eby129&ZLaz$WyC?x44Ka>r=AVz`kRiWQ2jZ|3E?bQcZvj8 zo;X(?0_Rj5Ch;to-)UN zN=2z6X-(+XX=d|<^cj;pIpB0*w%wtK1YN%<4@v7q;&horDAo4LJaMW_XmO6P5}hG4 z<=5eAR7jZX`|0AyuUHQH1J1InQZ-h(e%B`q^qO~~Y!&hfcs#{1w@1MkM5Ec4%PQmd zh1rWaeXL+_jS}?XQ*9B3@Mbz% zk6inB%-d3{Y|GIdOnD(`%<|LtdIn9T-L~_ zyv^~kkf~{=J2m}fYJoah@>KQ+Sr6J9Nixnze+zZAkTmJk9V=82kf_-mb*sWo(|A19 z*FgeQF7{2zKqcwq%cq)4@>BwP3_Dl1V({QIUWZ=vhYkH$x1)(_jYD;JN|s{*FjYpO zv*#uF{;Qldv06C4SyRS&Ra&NTIAC;cjUPduT^!O1(OAp9?#efkUS`9UvW%wfBJ1^2W1O^L5N$ zK|?-yCa?iV#I~P6H2;rOB0*lh;h!JrsgIByVVp+AcbL;EJKRGwnV7+-K=TQ06(k_yL*tp-wT~%Y)><`*BgD(1c+PGCjg7V?3wpx z7e8!yY_CnyXolJIkouPidvU5G=7>Qc-Ne_^g53#jr;@%T&c~xG;Audn9klv3}e?#v7R^xyecXxWaYMeew34e;@<;E69+4Krk7umh6QpSRVXat|4U4;OvtC{96V{ zJkW>2Cj`6!zae=+3U+-@J)X&d{z}<+hyIG$BLm;1^28emK=TdUg91lF`AFO|3MNA7 zF4zlz{)*lUfa#S0nrNZS1uH`LDgagEw-UoF7YmaMiQ8q{y1ya*eHwP(Q7XR@3->_O+^$T$u~vJtx<#r=dmy{Ig)avxm9)^$dRhC| z6%nCN_17Phgt4#v#xavy4-2Z_IWwrlN4Z-LPqUxbpWCO;Gc`m+exO1KJGVtpJ+#+q zP8mqt?VAz0z5@}*YeffyL~57glHAuAcj6=lsCQ<9?gw=KTM_SJe1!)!0!@A82Y;Ic zDi82z2~}|3^aelbkh*T$BX4dGVSE)wo<~NJ zLiuQpBK*M{G{*%<1n>4~J^*6xAJl`3BK`-GF#fbh7XIjmI3$8tcfYXS#lJ!S1kA^X z{75_Oja_AhBAK zbESzqJaT4u+eOTQO>k=;q?|c=5qn{@50OjF*6={;&E{OebQ%}O3E?seF^&>#ViK3s zFzs0npq3)%wQ8|COJ|~Gk(cQTTPgEqFmt_zkY4y@LN;?*DQ0?I8#7$Wr!vY?B5(rv z(HsB9tgl6|OWzE+ta z^^Rq>YHy9*Ul{HU5A%v{AyExxEw6f$ zhB)7Vx@rxeDAkZ6s8e@R8)D|GKWGofaugY2bW9F;!AB@H0?Wpr?=I9<+;wG**ahUM z+|#hROGsK-2*&o1K^)RDDN|%c)&I4&L1Pax8ZhksX^ADHG(?lT0+jub8H&MHYcTD~ zkDO@>F8{+YSpElh32h(}!!{1@DMm`tV(H9qIN1A_Ci?9QG;O9C?!Kpw+#4qspJ51! zw|#5lA2fDc{lUWM4EAnP8r>ipweISD_K)mik1wyPeNIokA%|ODguXF6T>F7qT%ux1(@E;t~H09$gZk8F*Vw!fTqg&YM;GC14 z3gR&z;D=2=H&joPu`p%J^65N?rTAR}Gf&q~qSgf^4x~HD?!|5{*^Fze$j)@{$$J*s z=VT4?K;){%IXu*0$%hVF4kl(E1peB^V&iyF+PwijM`R(?J7*3FNl(Qt-!i9C1jz1Y zd3gn3R+}H`Rmac4s8`~fe?w!7jHK1@XZe13>&RwWJ+3q0e|R^FasD>+E+H|{e31ckT5@sT}2$) z2F|n0Sf*fnB4c8y{AiWzZ~C&zS$6gCxj#OH8P17Z5`v}8XJ->Vj}6q1H+J93R94n4Rj5G7@u%LU^vL^HkNGnkpmf~-EEx(nIBb@rAC7W~K}=We_RZb!^Rx};kmK`(9XB~khBnwEqbO9E-UORf> zVj3glpF$BjlkL$_-u@}=6~i)z7P`0HOIO@VF>|zjb@xu8c) zU*4hn5`YDSP`-!Bdz$f3U#z8bsB8X%f>JN>=LKcX$uOLJ4JTtoOd{*yh~It|-#k1-Q=aXC z-*i{({6vh&z0*>CgCvi*BDxts7C_9Z-UmhI@kzLH(71A$Y`0_mg4Cn`b z$LxOtiwB83%+JgEzlS~dzH=S~!Jkm}zcYY>q#xfXUt@=X4!Woxit%8*gKe-uG+vqI zm6iLQfQd2M5syE>p1TS0?Z1~^sWt|kKhi>!5ZMSt?cpk_EkL}eE{8UUd_-m=yG9UN zdr&v+;#PA*XApo*WLWD*5X&(P&)%JrD@dtOm`KJGMsob2WsF8DhU>(2w%oC0ewjju zj5-m_It-f8c2gEN8>R++==!1Ln48~7|E|j5&1h7?!9YN|pg=$r{%2Jt@lQzpKSMGu zj>3+PwpJ!au2v5A|1z2-|G(G8<^C)7uK~ri>UN4~!pQ!u=!o&6$YRLo%5?Z;j)5<* z!GNl6bhd$q_ea3wfYa)h9t^oeTmjn`j$AXU;LGwbky&mJrnbH|yH(C+&UT(xe%5+c zk3nDGHwaU-Iu7g-C7X%VD1?|9JQ<}4cnJ$z>;(2$s9cwasoX)`S`XEJZzvQz!dLmZ z_$URR>6uh}ZvELchsSA()7aB%{#+sb28YLC`nA`V2|&s|aYdo9EGfA4*sLXaKRF|B z%KYczyx(GD3~`c6UYjtvS{H_~k=C{gQ8xDzc&W23)^@*`(5CL5HeMzqGBLgk|f}sc*Q`5z)qM zq55m-CYmBVzgi)sdy2T8n|pN+M)d{xRTfneB0m_BPh~zh2DY5(=YC@_&a{kYu_2-& z#V`inPR+hhCmaq1$o>62r)VzA?TV3KhTTwz#30SJAc0Tw9qoc48A+J#U zSu?9LL*Y8)vE^56$tyoKpSkbv81qNGBK;kMK3QJTOe|bs=(uxE5rcc^mp8{C>zcYw zRo8<4z_D7KL_{F29vf{CeF+{vC}oQ!ictzOgt@^3oJd3^-Yi)+ z>U)&8yJO@VfIcCduQbGD$vxD{S2WV$Pq+tL01?vzmQpmlNT&qSh$8N)6{px8!WMm# zJz8}Cc^s<2;RT9^9JCkPF-bxyH6!>u5p`igd$1y?UbCUU+^S9~+QLt<@ur|i`xG_F zJE1^!Da05Mkx;H+4R21U))%mU&$kb6|3u{B? zZ{mGEM(=*n090cm7KB8EE?(5%j`91ROwwl@*xNcZ^&I%;uXt}yNtxX0m+HwaS`&C$i z+kBq;V)^h6l-=yCCT2@TzJv(7)o4-$>4b_kU$-C3d9&vPg!NgBo=08pe5RT8%QO5o zySUg}>=K}pxnT=y~ajcbO=X zB_BqeU7)3M`uOqh&{d_UH>UrmfQLf=pFQ>d-=X`jL!+8e2I#8<--thc!HiNefIq(!LtN{Om91pq{|@aJp* zBx4Dd0E)2$>&nE#F*dbHQSlc~@Pc{j^Ar?c8JUmf=s8P3f(weTMtng^OhLjPT(Xr| z_KSGO2L*z`s3z%4b$I>0f5*ooG=mru?JA>;x7G-3Q+Q}it~<Ffy73 zf%g`{YJfB5mbz|oj2&Z_R)UoWQOhVXb^7=1Yd~jNneiM@Cr4z#_+Ri8<#MDSuGZ_ocV(Uh1sSWQC z6yyR8L|RnJXrdD(gUann2R@%hDhq2}A%nHne&Z;V9xH}o<_gW9ls(EUwj>^M7I$l@ z>;`iQ!x;X=R@QPlZM4PrBL;SFZ@CQZ*gf>HvE+p;>l@n^DfKy4i2)XafXRlpgZ#e> zy>&)YS6Fpfrs(e3>F3uP4VC3jmBAmFU6Rz)MODQvj(eewhgx>1yurAa*2T;-*| zV_xn1q*+@dz{Zuv6wMcIv(UHlq&X`VX;`hKpqkDLam*fQq!dZM;^@!r) zNJC7gaUQBS^sY90pNNZ7D#JrhJ;ED5*jPK{&-4AMDV%f*$3kx@qeQ=9SY@v5C4hrb zL{)|@(PHOR&uiT@N0Na`CjEIVD;1tO_%~)z;x6?M6(UdZDj(TB`y3+W&X8;cvyfd( z&)J-iq^2!xxM5`0+CsiD_nIwI#Ug`bSPnia zRC6qoovh6x6FA=BBsmuUWu4YUu5O`3XDszA5kFJyF^wv+Cf2M;jlLB#Bp&HM=95iz z`a<$0YQ-gBc|7{TqO`sBhfZ5#{>{jNS~jfod97p3iVtsc@g}@H{()4k-RO#wV^f*Y zx>u@W{9NM)eObSGIvu43%nPWz1^H{4DtV#yfg78@TUUJn%Eki70eZ2deXc!fwqO*ju!i4kGmGmnnF|nt*#PL&Q+}^Y; ztvK`%`I$Cja&(8d={8Ln%71TwJ`i?o`uWS;`m*HH-^jDym+_=+-<5|rd^HD(JYTVW zXD@&815S5*c)r5>=m0DxhGcPzw@4qVV=%ylUGKlGbO0VS@;+O1+w6pyQ!ZVW3RdJI zv7`Vrt8QMNOlA&a^U89L)tMGPP0r)x=Eyc|v)e2tmTP>0UAct%d8vvp@s)6h4d-_3 zBX*HZUplh7s~ctM*=O+`sS1RM_I2b9cL*biB~OBB*9gCxghWH3897#`4U374DvmM2 z#GSb=66=JCn%N689op96b1*{GlzY;&M|FLbri8nVseMb!W5+&|g7oMfAolmFoeSJ5 zm)o!DNBz@2gUofG9CpsDrLA{9o`AIVb552#!rqrB+Cx*X;p9@r?h&6?!v#8*swW5A zs=i3+{8=ME1>d7DA)(k^g7>052J}0hD8IA2;V zhrd`f#hSk0pZdK}-g>qnJ-qSP-cZw3&%M{3k|cUAdpk(0F{2n+6v#*kg!|3m_$8H_~2>y=ZO7Er*um; z2Gi;4{FgP2K|3VGyW&g&MYucXCnC|9LEOalHyZD z))@z~`YR~4=0S+DdXZ};(U-qzjjwjc*{1^=k$a+lj*M|}v%K-xcDvg*b;^09=KUw6L2T%KhP&R&PZTwXj(meTCjq&QvL(^50G2V>E3 zCBSlTmh9nX=fF=JM<=UNpP7HaQ5EXXgjWWBJA!yXSy7u}?@HyM z*AsM4Ox5oik$JN2BrhY+QI-fjwRWrn@Fpcd#qp7%xTct1NNIaMvwUfPlgr)rv0I)$ zYJDYJPLV(9i7bo!`oa=GkARf|P5fJC0ID4b_CbAXekn364%Wf>e3YLuG;_N84iyNgfgfwc5rIC5c*0aL zAOaZ!Z?%~5=M7V|WqDa-%hB&=Gu3sR2L?hnrEmqaD=I?v7H5(Fn#p(zQR+DynIGy} zhD@uS01yeUVyz0-Y;q|MTu=&#uQeyI5SU*D7_ViZ5U>chgQ26Uc6%isx zzG!fgM`a?tUCP7be5R`)pqb{|*0_>eXgoDDI^FULM&F@+zxtdF-cR)eXa(Nxaia-w+${KXy(8tqpm^I@qvhx=pQL$@pckvMaI)o+ef%2x@x)(iMRu{3 zQS5JL%xhl9wRDqOYiWgfA)=35dG1xMk*YpmHOmHxp3y$K(N-6ru$hHtqZUvpnK;&% z;jp}^S9+~avBPx92>~x<1|OG+1wzd66mnzL4_%F%zW=QPybH!8a{gxnbs#`Me*T|t z;(vKi{a=pk*BWaYP}Ibcq~l0ts->tzB)!P#({dDY>HRu17A1fUZwJ}(fZ%{Qfh4Ko zn=j>2mrV&r_)=+~IsQ}MQ{U&mR{uF?upd@K9$ks1(3&*j_(y&Y(}RB*h^(RG_T%n{L6*=-4~??&dq8j|5(jiO)}+PVWNlxU+fnAIlOts05pLVA3(2 zNp7VgHKTQ$QGZ)tZCcSF?iREAO(TlUrQ$c;33#2s`ovXkNtyJkIN~qSHt%fvOxVfJ z-v}V#nGF|jm~5y3H=n(NA>@;y`C4+&4DV{y%w(zlD^`V%sf`ZHvZsxHkmo9UVxP-}kcj}UFI`=o#KaW5InT2-V5xCLaVM>C4&R~2kovu$ zYI!MAq@o>p#T;t^(V45a)IDo>nQy#jf#lCH;84Mhqp#z^oHQJhIm|C%X#@M572ir| znEkD{;T@TEx%GQq#?mI<4?<$jgv6wA7Q=b9p^}oGvPs~S9`iQykeg5XE&~{=$$Cq^ z`oCFMiT?v$>Y`*;tbZ720rY?NJo$eBFU!Bso7ngtc5~t1HX=G3B1LK<#>Ql|VtQ^6 zjl^a`K@`+ocv}Yxlu3uAo^+Xs*q$JSuud>I$i|fvyEpHC1#?gTNkAxXKik)AjQfK0 z!JtClIux3Fh`Dx%N!v5d^GIF6@+xy4t*fVNa~ampA*|>#lGr-O=@wg_d8pt+vXreU zW1k_volLEjpLjV-aOKkBnbWSY63EsplB-Z!kUaDVHzX#g(3`Pf z6|wVVvChLTwnU}X$HYs16Y|nFAhs%KiF=)-8x z=I-O2wQSit|H?2&+r;M;gs?1{xp3}P9jL&#e6VH=n15nis!|%X*INFB{C9px5MV2< z0RsW4hx-3S@+{2%HDg%MWl;l}f0ZM>nA*S|e^Am2H@4A4lGI9;M8PrytquGiJb`az z#24#AmBk+?nT~#t>VvtWTAIUxAx%F>x^-%?i46C8EO`4o3!`WN6Efjy;_#xXx>pY(R#c%yPgAX4HMq6!W_3DH#GK$ zd%dC85MG#_Csba0R%K$%36I*2nP4OD)_Yg~c%w^fIel`pNugt_A)jgfDbq*>ZG@?= z5oCojPHa*ypBUCy^jb*9Hh0dB-}bgE9fc-25`IID^iD)vWIHBPX5;7y(C1=OR3hFE zB5I$P9M81!_S)=IY%X9Iyt?+43Bq}41dD3Bw!BnM z^Yzcyh>0_Q zYn+NbK(VZhCEIb2EkkP_F{MW6*)Z^mt0FvynS8y*7~dOpF(%Lg{hsnSzNZ1+ubra< z#LKo7wwDV+7~WViTW)c7ol(!)l-^N{{?=hQYJ-3$YTw_-C^AiRGCP}F`{e-RW&R|O z7RjA+wt@de**gdK_I=r+Ik9cqwrx8(v6D}1+qP}nIk9cqHcpK9{oUJrUw7B*SGTKn z)vnrqtbgVlYmBwWTyshk2I9Rd6|En|(1lv(6^@okl$g%mxHF0g6eK+r;SP8-=sA-` z?Fa75gwJBVFMuz6q3WKSWZcc*625OKd}Pj)->Ndom2E)vnUao)+k=f0daz5vj}~{= zF3lTP>=UM-3Qr-9BuF?6V@4MwBxZ(#LRcX6-n>Iq(Y&vDV0hir7B9G=a5W6Qx>Vu zA(kJaG@z+nNGIwMX^((y45o~#p`hWWRB;Zswmv~y)4NC9w=^S20Lk_^bi*t77N%gu zdZ?0(XONyaYd`TaPJb+0%7~4Ai)*5K^*+1(i#WLSH3k#y+b3y#g=VyzhUpVZ>G6C& z%s*o6!2Qg0kNn`Ie_m8+1it&~>HR_QpK*U|4`D+8k1kOCZ`xD-C)_IlFKU=6hmG)n^#@!c{($4hTmnP5xybhNJ%r#It3=& z%{zsJ8P7?1oKB~@&2RX;PG9nF1%6c*=nawD$`|-YX4#_Idm+0;jumM28U1ntdw^J| z3%vz9$^3W_^rXJi5(jizC6hJLGcJGU+vHVW)HhvMm3u1W&wE>igD-TE9L~>qekh&U zFh3CoXf;aU1hje&z`lh^(|kx8^s@VECQi>qjp4qUboaCryd;-BL#~xl!a9pynw#nF zB8}OA>LRBDsO16_d9#v4#?AhLF@^X{wjE>DXd1^_2sb@0+*Sm|=4wCylFa|Crbw@lhwMsr(t` zr2f<*e}ghrbak}X&JMycEt|WipWJ0Na~GIgF@B!8=ib!h3bddlAYRnu6MeQCa0)o( z)d}-4LEl3*zKV*nCTciw$Y2Vf(UipE)8hh0iLo2=ze|EqzBn7f#*i_O1!%mVCe|J?-q-%SEb4KV)DSoHHiQ(H2OMY;`p z(M6(@{)%`%QjT?Y=#*)Np!*qzkYfdxTQdLgk9g1LuMimEJZ)ZCKrD|y;Mr#RnD%z! z^ZB`4#sLaS4>u%%ADs&jLSc_h#~heoAX0@jdWzSYWWdWbbWMs15>k5DY zr$;8PB`tPB5GIP0e^m@_MI8p4O&G|n?1=_z8o)^*b~ZtTM=3nj*-gQK1c_j~uH`8S zY@JRGOIi$GfhB;<;abHwj2gy5lILQsz`ymeocKdW?7Tc?Jxji@(Av-|DWP+sT& zl4lU}-UG>!t3nMm61NgYIS7@-SIeD%RQW3 zZ!*`6i7lUk9$2Tzfh}_R%Up^N@=Y zxn3cR$*Vr7$)c99Rd0{NHBiukN#T*3qxh(WIoKYc9c=XjV1~-V#!*-+RHKIS0%KkF zj(f6~uS@!^E7?_qFpNCgoTKR_#2j$y5RV(zdh}cJ2PAv$M4f?PVBe)2`?k_#(IBvY zl6xkF&{|=sM%@OMIxW2p2_iE>&X*auWw(=|V&E+Ve_Cz$>{x~6(l zt6`A+3iN4{{)utccDny~-yFg7H+3%0Rl&d`E>0>E8Si+v_~!PLOmnX(>|8A7=F+2& zP;}2gu^k(Kl9JC_)xBRj)JJ{qgk$f-f{I}T(oVllsF?dkUu%X{ed0CG!BbGv$8Y1y zO5@9lW2{l35t`PjXhRuMm8-OGb(%`rv!Lfi4WXs#BF^Hf;vHnk#^GJh5?12C=2Vci zf_37pL8rBu<@43udz}9aPFLIT?|*qN(Tx8Wn)^S1^WXHK7LJez#j4EFDlD7h4~@KLS5orvj%urvg6&`fr{J~V^esfVzD zKpw^&V1ZlreI|Y-V?m3urs>F`H4MX}UAbM|;}sVn?{fc<*SjaJ%A+C7inmKNvjv;s z?}9KsN$}*u8*nYkaGI5OL0VznJV6%&O z%M#Rz$4Vpup5!79Vt|Oen;w<9kWI*s)@_v8aFP^tVdNlIAV0|G! zq6*2rC@zWCRJbh+wgH>kytBF{9@-?V1-b=*Re%N!KwH}UY#MJHJ4%9vu{Up_4C%1c z&TBZ-=O+I%RB0R|70#7gjuaIv!W2|-mYgIjozTp85hof=xhPx4bdY*Xqi(xl)I7w% z93hz3Muz@7L$OsRE#N!yxM56eUQh=q)&?mF16rw|J%8?Kh_%>3g0g2l96~Eyo+Cmz z5GH2EydLRwv{Y6U0oO-JK4rYv_(-P#Okk!Z&BVZ)^tPzAY!3GhWWD5Xm=M}Z+5bS z*KC!gwC!_hq@Ps`6WgI_OOnlhZkG8PKj z1J)P?PTS2++EzI_zPPufw*DwaE<{!nLxsiP)L%TU1X7{M+KI4bXw!UR+)sf^;EPj*e>0xwvjp{I zmhL7G%%ApeT1^H02{QrC301>lL2TnT!>eJYd5jZw3d69APu~>91JEqitVF?!Pxb@W z!OY^!9c^G6+qCK8{!%21OEP1DnJ z7BaR#8)D!u^e}BVNp<@{f=Y~a%V5!Uk!4miv1jFKwQT4=UEA~l%1H(TlAK1;FXFJq zRw|qeM|Nq`B?{}u(4$xFil>k))%-;Rl~FSBA!5-G&XI5nbfo0NlAEexM}vst0nM0h zq#9z$*-9xL86|aZs_5hJGIOUHYLX*~x(mjQuTvM+*5e8KZsIea= zZVzuFJ%W_zFJW4+`t8$Yk0PJOIrzm{3#<$n5Sp23FGU?Q*j~=Q>9?ktFs1yc{XOb_ zTep|-h6Go(qCVn4+e&QY%l-&N2QU&uFGv|2!_$@O6Fcn*6-Pfx*~Ec0^f~-Td1uZT z+co!kIXgxA=gt&gf@N`UN;x+L+uVFYy4>3`0!x56+V0}KlFrGD>cVkyVb<|kbl>1u zBh#-r(iZ|Z{O4HiewVc^1d5K>jE~5Xxbr8fuN`Pi4fu-fk(41QiTCJle`-pw+Li)M zVq_?ZL-EUra5c^~#^e%#vU>%WZ>-zJx6@C~#oxA+sp&97ZvNU;0mUe6TGu{({Z~Zq zEWA<#fY0C&UF=(lMk#zO8sH9@8)meBN8tBBcm?gVEFZ8GTb@Et1iCsjt5en za4D9V*XTq#X>iZ^8k~36;Gg5Om!H6SbFX4K`bO=CXufJ?1oJ-JKZy#Kuw?wFt1j<> z@rmDKbrdSjo+-r9JCX`ktPdS*u5bnef@qylOuD0RJzYLpNvNwB5xwjZdo> zzoN$vZ_!hPGmspCqqserZ_U%)La`T_8yupp39{0OBn|8g!rRr>ao)62sg2hsl^dg# zk?pc07tv<8pg$?GJNsB<0l#rL%2~>A;nfK<{@@Z`q1+e$qMuZB3lNbb#!lHfxXMfQ zUEgz@BoFy&G;mkBSP20XSV^&^cOu$dr0==%pE)t4QB+U{9}1mQRdSl=8056cZh9OT zI>COt3sSU1KQ31bArad{^e^%U%HdnIeC5*|x>8Emg0k?&R~JDX2P8D~eDh9TZyYR5 z72D@sMY?YCs(iG>sA0Fywt?6xD{TYm(bqRr)PfOzqtlv&7xB3nxMOS-AKVKe9k|ca z_aurmX6$Jtd5Hg!6gG1PcD>+t=F3hcZkBM&T&b=R zW3RYnA=eO-sk+3mS}uv%T4vPMVa*r8>(n{UXAprorGbpTauNuNtSkTV%3!Jp$Yi|8 zMZctXmb{KslbgoDvC29+;SgIYXBO(&|J)RQ$jaExLaKgnwG1@pd_xgX9Nq?5rlK6)X-ob zT(Cp(-%I~f1vYf)|B-)a){pgSy9#f-E#aRy{k>LM-av;aKXe2?V(SUgzc!?lmoQB4Z%k6=`^ddqw}YOF zUG~Zn=Y?1opK_P~3yA2&Wq)%WUu@m)WRg>#DR0b03?=%Wh&pkUwhUqUE`ET=3=R$lSF7Zn2EHY=0}Skf_*D!$6muhPRmfD58bS5>Hcp|Qw? zLsmX27x90VoMzw?U&M)=`~x@DYJNnI@4fO(6Y4P*8;0->9fu$<(FqruVb0& zVYzS6_jo|!t;?@)AK6c$W6f>_rhv+n->e9Bodb?mpI1{A(O9(Hfa1LhG`Gu_2q*y& zR6<~M20i2Y1=|hs=?w|$1OE95vOR3-EWl6<(VmHa1Y?0vCsg4JRe1r#H-+RGTvwR4 zr(b9!$uHalU}!gkp+94Kr+SxZPw*B0@Gsd@44Nb9cWU4BbPF3bW&w<`To+|AyCvWydKO+z1$Fvput@715yH(t8YmAOPf?4yQM1z5toYGUul<>WjMjfrpa*2^!>G7`OP1Wf$z{-+~k-l z+O(i23QPCh_BB}B{;|ZZx;!V-lB!z(e<#xwuT$~g$tUcN(Rs~n96s0F6xKZR@D!@CNV7@NZB=vq zt)8#~)lQGo%~`MQS~t`d4Hzb4`~b@+_tKBRvPxW=VvFiv^jv3ta-bxn_GVr$_8=OZ zOLPobT{JqgtrV%$+);GRrr(kynTVYafhg|@Q#VnVHF7+#nI*;4C1MB*vuzyA7y43IApWVAddzkk#=zYgNd#7<6 z`ytN$5my-K>CTp;;8e(X*0E5Rwt0eflw~)ARcapt|6**xklyk(;<-n`AOCXI!O=Vb@`HTLCemXF1rs>Wla0by? zm)wU8y@%b*lsv+&n1r?^5lk{;NM(GK-A{*wMHdib~M|7Dt&9VcNNm*!`H;#UP z(Sj!rU?;u|-{!V)dELCd1L*vM^IX*OSYmEGc5P=j&pUT!b$ZF5mte8WJGWl?^^%PLzpkE zMMFL;8OOXWKyMY+xjPp#vlSct#SE{K1^tLWP*AUstl%ixadZxyX)a;Mbu5x**=__i zeQ3%`u-r#nTSnHEnEFUT-^cS@ zEkRz(PDt`7k|B#H^UJCy52GWPux0-c%PgSolyWs)En6F)AscWufH`PQ8L1aa>WDEb zT9M+aA6n@O_Ko5D&FT~9YYdfF1_Y*-a?hf6YhRvguJP-35rY1bek|L&!wT$)D6+CA z35JD&LWjaH+Iq{)QR(CeuQtgqYzQE)XF&HSZ$l;}eEbdH>$_|XIPp<#AHQm4I=Oez z<=gxT;^ocUY^Ha`<@;2!=7KUvZc22@y#W_ll`yK9tn{paZarBk`W}uo*3Mbbs0%LQ zer5QPEhN-osxEL zj_irxiYi5@mgIIQYX*H&0zXcWg`iYUq#L0J%^@>}T3{4TX=4xmhqq*2l*;!Feqx^| z;p8Te>ZUa0lTi5qpXY>Va;0`+L0(IrP_NMfS3c3N(64`Df$balqx*c0`pFays5}hM z)n0vIcCnX=(mSHk&^{agI&HC+Mqa<*hLI}==4_H${LmlAMjSq-05sN3W=Ids8q-j8Ovr*+XZ1wIb zkmk>M*67&;ssKuhLci&Z@fc&)>Cc=#tvpAN@)kwe4AH}7K^3NaCwG*(0m@tIQtIK{ zE4zvalzoE}$8oC5_1DK~cA^<@F+@dEn%M)(T3cQTGk>JqVLDuV#@u-wr9)#wx2zD? z3rEWYSgSb9+3m%F(6>x(O=|f99=g;bU0F+5Pm&mh>B!lmhtWdVks@P@{ zWXUS-_lk|o*@V1N1nx`=r>(OI651U3;z1&-kBl-sl_Ce5-2$U;l=%H7Ysjv{ENOZ1 zZ4hGICjpfDvqgO{8Y%%e`K5!urFb{Q)hT|9bdpX>-%>%v_DN3IgA=5en%%Ec5(LEu zvj~@eV1nkCTnKT7-J#sE(xu!Xj%QHok$CY^b>{#*X2iv6R?yz_>lRCKKw)+M#bBB- z<45#Ox(C~6+zu4q2gUVW28m5S5hRBEzxh4RK^N!H z=qmnD{n&NXK7pCUo0ivZQ3kbK{0`k%nAeP^!0!&*mJ`e(KltjwqGsg=xsX92)@aT| z)%DjZPC_zlBmjLRU{k-UtwJcqwK9EK^zR9G(;ILRu!}I--1wnaVpk_V$r3m zTGp1~7N2LYk#?(*GkkjwF_6&L{T)BP44o2gh<$Aohsr8l!~6Q{KSvIzj9cOOpU5?U z00A-m4?>1qI^1s=H^tzq4y4I+wqSUC?Z4;Gt;A}*2q~v1JY+VXz1+v>SiR%EB zpA_=K2!wASzvTOw2P9xo)1(})+jSQ6*&Lo;-=9|~1GIuLWc*~N5U|cAUf!X?C^8He zj7iv=bc(-gvY6=HAp9pulqjCrkSK7CL1%ckQLdHI>FI2tjxR~f9|L3Q1t!m?>V6Y* z7gqqHP#r&1ZeqP2yQKUYT<)T~Y*J~4lEf3XLG?rEkMI5Jj={a=McsZx=VD|#iNV}C z0(Sy`k!?|M zmG2UpR^_+WBW&|FPWW1GY0)d=i(A0Vo{g-LgMmpUGX{;S+hRiOaA~t&dgs<`P%6Z}CqsVv;wnfGRCucDhGZK!c;jI@w zrJ#{w`Q}dn$$3n)V2rI@1o%mzf8}+IBf@jVhO0sqa5vgkK6m~V*s@rp&?_FTHC`bi zKfma`jC^+KvNZ5zyHr))=`X0A&~6--bh6YG53zaZw81*c)}H=1Z~6Qjm?_+ZSTJi> z2)FYOz6rcYr>8I99w+=ZO3z@qW7*IDk~4%KzK#T7KtT8~|1-2R|ND# z?@=Tdhx=4^AzeW?G$%|ZawH-nbf!phi(0c*H#d7%v+N*}7a#9gg!y920%5g8yNZc8 z>Er8MG;mF*H%30b+xxE5u5G`c$IV+H=+|+e!SGls@C`;I15{&250;=y@DYc>K5feL z^f?EWQ4{bs*sFm}Zd;tQ0o@93h9EcCuBh{zVEf%Zkgl>r9}q667a)SO*SS8SXp_4H zZzm9zdQ$7(zR(p~^GeHe=kCjukgT|rYQRJnyzZ2N#7I$O!WisM?YUlZ5C#jXetIsCYN(Q6%sPB1Qnw*^;xWT$H-3DFL}r8zj$} zY+2`@CTlxXvS3#lt+}~PVPBv8Ki69Fw37=-3S3SU(AI6--ufxir%H0@02J-P*hrMH zp{1M4dY387F`d?Iv*j2bJzPzrsnlcMg+FFsP?iTCPfFgKwau|%RZbNt*e?VVb~Tw}+JIK4F6^7bXy@uo^`GK|sF0s!UIV!f{ck-4`2M*KzV^6yodeI=UsgNgLd1)vK^! z8=1m&)^I{nmX_^)WIYnniT#+wa#x;LQp-uXLYbb=ao?lLTr`_ltWjypDzRo;GZC^A zA+O}Zk-~NAFbUj*BDv8u%wLaZ{5BkyO11)1I5a2z5s>%)Nq0kLSbbU4Sc&!RO+Gp9BbY$`{Uk zmi;C5(Ite3!??oK415k|x8W44>bmtu<&ivRy`B<<^mtnI^3R1Yge4AQ;oJ;1l7<+o z&bRS|x{ga(SD7eYx{)~tICoGlQ2)g*&;>lx7ZnBIt| zE;ANiAL{+jX6K%0Qp;Cs zMRhN%R235z*3v2_+{u}a=LBVV;4c4E`LlcdIU`dZ%Hmqb%{4nT`K=T*0FJ{Zo(kP{3QpP*jX-vxF;G<(yS&!s?&Ot+ z>dk$Ul?|KN?s&~(Rg-{a3|$5)qV&*&sgI2TGPQQ(2%9Hi{Hqhv=LlYc`V!s9u^*wd zT3seKJ=>rL6*a4&0|Jp=W+T!_#W;g1vcdnZP~|PyF|m%m-V8F&Kk8%LIBA_h=jE6ZX2Z z-&t1K%5ISnmCv>*G&MOInjIg9W-f+33ww=&RZw`DJYXP{a>I?|kvnZE1GkO(2bvTd znc(%;C*_dK^IY@2BFXT}zEj-n-@mi^yM90xB<1>Z!sxN-Q?a&~ z6tEjI7-_}+rOO!qmo9^E9K55ujgtSDE`$3=mlZKX{4ZSwZ?fV(RgZpc^)Fq9$W5xF z*CtlM;cOWw$(JOZi2=Jg4S@bBs%e?rb6()<-;+>|xSp@4c=Fnjp;U=lNT=x3 zk-^C$#jDEu1-nC25`06-I|*vKp)zJ!ts>Eb{yQ^z`1}_v&9shfy8SXjr?|}Wu0@W_ z^%FR8E5-#S{}h;BAd4zHMFS@*vsy+JT4d+B8Spqe{=ZT?l^ zc|nK=_A+Y@)0Cd-RK2$cEHRVC>do6FGwD;+6|@+@B{w_zuwv0 z8?Qls0KN`=Z01Pn`(LgCyxsHk(?b9OEhGHTO8)*&t*^$L8_Fu$_Xs;alPn>mwIt)6 zB-|LgdMVS0ymc^R`tAb$h9TFs2fjf0Y z`a(U_qLB@G!0(0!8MxkoI+RyA;NImso=-j6Z=qop?AF6%L@)JWCv0WTl)lG<@4!%u z`^5V1Mt2`E$?nPnHn8bdZAyFn{?M!7S&#X5g^m=W9DYEJLzQT_K4zidF><=`F@u$>O-k^o&E$De>B@ zR>U{Y6&%3f*&WmayRsZYx2kG7)|zb0QV^5xy7}PQ?Zi5>Jghd>A(cT?@EI^^q808>YiTVZ=BOm^+`C9-i38G##a+24nxU4YYg?#@yhLpa%t596y@h%aNxL6x^IY8xTC=H8!6-FA3TNjv@Nf^ zXFnY$V)rKh>IQ-`*= zWfa+)stFvt&{{de*CfXC*!|ljIq+CRRWRciIA=c z%xnz~TiH#aE!OXV=EA0B+DIQ@By1guH)`^VhGeER|48g6jOCZ?Q+jCSU38$0_cM?k z`)HJ;kC+zap7lKJSaq=Bi|EKK24ogHf&g(Y*j&ZlpP7kQEm%T(98KK98uL6Tv;kY3 zEq|>l(e1jXT=#cjJWFbOf{L27uoc6;=}3Fux^$LxyxHJhcN3lS!ow|iBA`)s&jajb zD0LD!Wtd;3_1-cJAttX>3vn@Ut-_(a3YVV`RYTn-*fd~^PRub0MG166{UtccDo7kx zI0w5&sd11wW|=ROM!7p-&7xVeHn_xS)iHie9J#6!4-K}&me!j_!iCuqhKpa94UV_V z+r+Dmg@ZIrxx%(v87v5|f-IWJf$PSo{a!!$?hbBECaLaTGm1JqS}WxYdj*r!rAxF7C@2&9UjI zF@DPfie_{S&IYN9UPNJsJ#Klu)}y*3dh@g~Egn~#r*;o;T5%0)&;45ExmlcvgN4P8SQ6!`_Ps(Jh*j1PRvy9}tj6`DK zP2sV}RpzLzXRd@Ne#YZ*q9vJ~U;{bjVHH&yPD9F-HHp5wq>21Mau4gAgvXOrgzXQ+ zf975)ria%qFd(46us}fM|2_Bq?@y|R|JIB$M*Y%G#T4@=r}grDW`cc0jQ)^1trn!x z9YfS`0P}_%XD<}m{MzvHY{StL9EX}(PY|VuAUeX$Se7vqQ?ixKA;R0=B!VeHK(IIS zbvo{K_|m6X5suQkM7Ys?QVz$DtS-$DTFVxUrW|CXe>3 z5jX8v?6=;+ePaL$C!o*2!nm)G7#E7Dmc%e0KQ&t+gb{N<5po>@x_&9z( zVcB7%&vFeMJ7IAjQxigav^=(ndjokY$ zWYm4KM-Rsak}>2iLw-&9m+rCZHftHBiMHf|Q@qIqZR(FXS~)>I3l?>)oq(zKN;n{| z^(x&s#zdvmc-S-1yB~Jl?Yp2(trC|15*M#mZ6TM{=?CQ+V>>-ndF)m1q z&#J^tFUiL1AxXB{RFhLoA_byme%uA&@6|aAqD}!`&>!Co?I|va8LUkW)$xlas=Vmm}9hF3!(hBLmhAOr3|2%!y7S%YhVHHM;d zsN$&8hSr0wa4|3~4Y3W3BMy3q`i8R%yoA<-8N8)!!VLHmrrSrZ_1!9gua=l~`+*ZD z8A>##YE2+3$zd9ic6gofGWcjw4sPhQrg4*ARNesLTx5#5IXuEjT!%RHq<$_PuIT1}% z6T*%;DZ-9_hu;#3SaKwPAIzyVpd~~mm7HW-bDs&f+$Qv-_l)J(czKAuS>NxtOm-!?+aVrr_i$sBw??Z&;d_f(O^=Og3aV``*CyBW4wb%ky4 z&&Sr1C;WyEO?+NFX&2Vin{z}u0)$<@QW>GvYw1@1v3P_PhWn<0WSxzu0`d&J&w27+ zNfEqM?E!rP@Tw5~skAbkC!-c`OQWKXixsV$h#&>9@G3YfTR3b5n(J2E&?D)qdBiT_ zqxT?3eQ_#Ah}CC{#nNVbXi8>9tg7SEPCCRGoGaNN7d-S}k?e8y&w2@3N$0awnu9gh zEG0}wGWM=c5_j%J$kK?pp50`>PC7X@7|G|-bXdED88ko(rCvNxSs46)q+w2*ia+9e z{rDi99UxoqoWFvqek9ERimZzMhb6}=;)!oOA8Kz{%}V zXdGaA4>-Pg(!SijnK0h)%540r)Nk0WHib+G*p4fr6xuk$x4j`Ol{MNyUitFAfOJg z|F#{mw3Ge69k~9(Y}^=CZIwku#BX_(aJqf!9mFGe8=(U{G*Oudt+M82Ra|d}1xHG% zZj(gR``y=*Cm77&1GH%kp;h@5QOLQdV*prg}7LO*rxx zn?x03Nvb-EI}Fy#5v`{9x{W$xmLhMmpOOvk9JfkWbS*L9R^@u+D5F=9Qq5L84Qt_9 z&QqSMZMRH2`ciFW_Z^c}S+wg+FJ*{-(*F=bb0Nuxm~<%d+sc^2@KSIiEj>GJIm%@w zM?=6io?DPjmZ&OIex_b|mRO#?s;F#P)R$a=B`EeI;#0Q=PeRuUCNvZqV8x+U?=?hI zKo@GNAr4{>4z1@HoLSW*8ooD!^KxY8cv>7yiL=>WZpVppJ6@~-5Zb06)R#)s&8p~I z3`(#4H(1pRJlKb)TO*>{;Bf5#iI}-Xwb1V)?6gsvtkTjwBW*F3^D$luv=WGm1@@Pf zInijBce!h+YE?x)vz3O?{9wQ4ECovg+=PgFw7ayP;A+!ZC6q-JeWw2Gj}%|2ccdx!-pu+!`cwfV>h9Ld5rY_LJzP=UD`vai^pg2P(IV zXEtbIibn*ELSddb0FOz0a+05+GJ-vze;15#NcO~?6)bYNLHz z%xX?e(;ti9{QfgCfSjoZZJaVd1HJm~C*ZzGqf8*uVbHyo2cC_yPD0wR`&IY zXh#gOBut`%_xdd$^|nxi`C=#BH6WQ|!5hGC(eqw{?HP8oBR=kW5O?A}hED^edBYJv z?}V@jka-E<_X-d<zALNqcbO^G`l|XJvC!YRY~xiB=L}iL5e~%m#np$ zNNMQ|>zn(dQyYzSGx<#5(>PoI!Z8Qjgon zBO>eClp={#Ze@3dJL#thKTt7c}Yp950W-dV}B0YNOc#4^WrIX)uOxT3@^Fu#U^TDQwJ; zXDdtCTvUK+Df#34ki`ftC-2z=QW+cy0#k{dsZL07m>g`im?$ee3Hc*M%XfSP1)^{CVOTQhaT)M{`&+R{pFMNej0nF}Hjdb++wsg-A2T?#YQ zj4K|{0Z1xywQ+6_9;yQh+qvJ5dn_jhA}lYom-i~pdK z%5eI!KIG<{p;yq~6RmM;2^dR(*5Iho5QHvxyVI+t(WW}|bei;1L% zm*mo%yS$yIh!Aj6liVtUA*9Dbv$7Ha20hbfB1%UpF6;xy=aJ=U7D^j$l$8u}oPIy=tDDxT+NMNKh5{LSUnFfV7 zXb<5uQ=hwGwpjYzMK|+AtBbY;yzxgeeiiD0d({^VTox>+iCmWvO{ag6_Yo#r4@}!3 zDbTz=PQpj17>ze7kMfl&mqwZvjvGv1aMqN!ZV%(NBpL(t6MB~FwPo$kAK5dS*JE8BZZtw&wyvTsClC-~a|}DixXe=|;)AN0 zc8Yhzddhbc0XunUpJ09^5ZJOsLJZ{D;7;+feuKMMVKc3Rm3*j|ON%_s$^6v|;c52> zV0C+Wu1v{~FN{GJu25~f7FyetlyF4y&Pth?xkn+0xq49@p48B3v-Ts|n?bU^t0AjXoEU|l z$G<=9vfD^glqZrocIa?rb?9uV4nII1xf;7lQ$k&jET!O_oK8g9@*3)pR~J@7WI$t9 zoOr^Tp38&2d{;2bv>v{P4%v_CN0CTfrtYE#QRbpT;tXaC7^uScJ5(p|l%2Mhq_-@x z$pvYiD>HaqUQXeZ&Pc6o>9sM;Nn;=2U!2-_SPj**%GXuF|2$j<>%$fb+)1igWv1FQq z5}&nD*9o*No!yM?>?=&JXo%I9OGD<4Of)~9k6ne`E3{_4J64(?)jK%ZDz6LEu;tw}bhM9MGEixy1i6OBE@3*+b3f7`fTwi8~ z5)*E7OR8I0_5D_AZdrY2AEF^f1Jglyk@!qgLh(TsV(MW($P-P$=zjSqZqU%TfMa;b z8$95@1q9dSQ|s^rWcE-X;s@m=o8;NydkzDZpgnVB>RirR#(`_2K1LA3H6$JMSr2%E z#;CMXhA?A|p|01(cwFx*Kxs>2WE6+Xl;BcH0@0p+^X19YG~{+qYl`{Rh+_bxdJ0Bf zt$AbFvjutZC8FIb|F)-ec7X{!tM9Rso?T9t4_-et<}tMWZ3pS3It1NK)jd0*^d zCMc_Wohjhg>))4#O0tM2w9gr$h8n$#KC4N!N3uF_9KuMTn5PuCg0YB%AV%AfBs|}n zjkp|sFhelcKIoUcgJzu(tu>hZE&4H2n9{I}Zp&bxo6zCE2D;*e+Y>;rdH{EYR_}mo z*G`Du#vFL@(S=-8(jI;5U4QUz2 zP}8M@CpSE^dgVO0b?l9X zBs_AlkWgJ%>qw?&IVTQs;MrhdxLR#v@A_POJi2mh!f~zc2zO2pzWLUUHQT?}qM#B-{Z0aavVrc)*>)-s9v`se@HPn$_sYQ8aJQ&nKNuk261$0Qa4yaZD zNPr@}3Z;firu?R0W<(NHbGbkCzaAabu09Y3eoD);#FnS|md_%c8$PVkaTBuugzeKK zlf2!XrrGbA;-Alt(L5may?|g>To{tjL*kv}IsZ0c_bdsu0YYZp$?*S&v3Cs8ty{K) z3;QYCwr$(CZQI^u+qP}nwszGn+qU}cK7GIV?ukAT_vgwLG1rf|W{infjGOte znQi18JLbuPU-ub5CN9;5*eeW{e$^Nxe^nVaMO6P4?%M-;rlMcx-@g#-57uJ>m7dF2 zkgIf{$;)S8B0IBAlW!@_mdDx#m5%BB`;VW307C)1B}i#WlV?pG3tKtn*SSHgn%0t+ z*bJ^p49)LW^q^ylRtf`0ul4z6#ubhVOh?P;J%{v?@knGP;a0Hhv=g z)f(QUK5{d0!_-xW3+WS-~^2o<4a7Q0#li)*qWy)I`fZ=tywur5$YqI++%eZEjs9H~;bJ}P6(ROs}pSY1lSE*k`f zxgLJ64Fza`Q&goQX5OANqW-u>*weD2{0C*r7$*l;TX3enl~~P^@hKnI=P!Icmb$Ek zK(lC5S!HZ3!u`x>+I4~=&>W`s1QbWzQCJ_!18TOf^)a)w@H)<2S;RJvZrXjgxSjCV z)Uhs=Bp=GOq=pzn`}`lNX>ZhyN&r_+)g|`^Dw)B$S zYq9~;>Gx-=u9f^bV)eg&fIErJN-uhipGdnFrR-t5#pyMr;^N7=J6$%GwV2AP$h^sT zd8-;Fk7R9wnWN)NyM44vR~NZ1IE5k~oOJYDQA*j=#w$wE=rjK4tY(K(Yn6(Wq;nYf z&RV%dOy^q*Wl$tu=n0o?Gn4f^iMJ33)Dp6gexjD`S@e za&AwtT%D9Ex--4tMGo^%Vc8VCNdk&-5*NN@433@ML3|zAXp6Lg_Jy7nK{hMEM652A zZ=(Lz2x{?XHKx;rspikx5at7kan8%%yEXo$jXh;?{t6qwB$Ane`2Hti!Nha6Vcp3z zZ3gWYi!B}p(R3A&1e+o87r>HK=6BXNIQ2Wssu_Oj<$%^B z%qm(~%XTFZLZ!-iNQHBJb>N{T1Ayc)H$bbQlD`5Vh=N`Wak(YNvs& zYF`WI*J`L834}g&#NP=sQ9yOZF%P~e4GUE~M%jhx z+K0YV@R8_>$@k1ok}8%Y$?ZcDS9;3hPZXcrBjkqbXxcSe$$q#K)k}ye&23>G={x6! z>vr08YRUe1W9hXb{X3vgzgRcT=giKKDwd&)swqEOz56sR!Y{;4_o<|-q=I9ynsY_H z=X5RHFUM``wxo--f+MrKfc~*?hvc1h!*%nYFPQZyznJ%WTqo||yit4$=uVvF0b%n9 zSPQP(AIy3_Olcg7?UdaGgj|=mbDf%X&3Up32!gC$BFtb_4u&|S)1^<&g^H%KZxPf) zkv9}am-H2e96+k_6KIX&H8^p+{~Ll)S`oy10)T*IVSs?B|KAAq|C0y&H^;yfwF@<5 zb(C*10_4yJDHMf<{SXTf34xk4p_)j88p&>dbSrydj`#t?P&qQjN4={aU*Np{KD|{C zb=|7dy4n@-Ghvq}?j#9vGnL>J&XdcxXTA@nuxfX$P}UB)D)xiSNE~!W!m#)T#}Z#7BIQ*vu-GJ8W6~8EOAL{ns7h5KV6V~> zWSSHYS!>NuoT==_v1=%fRo4|c6lp~6G*N0v&{aIJI*Z%eQPfowmF5$jF9T1|oO2JT z)>CttrNkzgF8?G`o6#gZC}Hj$<(v@$yq!`NDO{vQI=Tq{CX#kvcMJ->0F2e5IaYgH>aTIrYSA3*ld@$Yx4;cx(o9ihcnQi*otMfO`;x@2Xh!oX_SmC z$;~y?Vb+pQs2UcgvH*aOMdn(Bhfr_fcFOI{LbM8hG~-Yf^91&`87TYW)6T(XtL95- zk|C4mgycI(V3v_)nqL{-dSR*s8(pA$oYtB~tMzinPK62>v?s%X=3Hz6AHqJrSLqg@ zkr)iySxCd}5!eo1%oNhH4a?2(}Y+)>N3#w>G8OQe{-T+g#B36Z+cY-F% zYBz;LSyTn;2=c$0ab9$ma&e_XMR=6(s#!OGC%ASqmRZPy&x9v~o77(vQ-#BwR9n@G z3R8^Z@0ygO6LO|%TAAn(n^;zi4V%oG8u%ZJ7?`7n_RtP@T_Vf=DC4a^nnstD385jTIa8b{0#zn83q9taiIZG zxt1B*M(2&ZwCUcp>AB-wv$B5xAZaDHO|g8J=9tUg?W4M7Cc&;1R$eX9#%mWy>SOe; zEn+`@LcWd#jvW0q7ha-jR2DC~&AW?bJaMToRTi&TY#qnmdZ64CQ!A*Cg|R!utU2@w z^+?;VnOcG4veI=0 z?kla2@p|i0v&^Z?Pe10O0}1n?t*KxgN1}OB?>i;|fAb%WBi=z^EB=`9Mr@#+xA0;W zUSTDt$i*zYo>ZpjHjpt?k&@L&2lvJ&W`519(eNS`D)?%W>i>g|<=M4po+05mI2MUG z1w`v)*tqVBn#T$pDieKT-|GgRc#rO%lTNy8P0^(ve4D_0Sw2S8aQ7AJKpeqsK89hA z!4wmp@ZybNwQG2Sylco&bOoGSA1E8RBHnodT`xeik@vsekyanl2@CBZ?H{+Mct%Gh z?X=SnwI>{!-Y7S&^F^<7^KFk9H^@Iy7a9h=xys!lgR*tPIEPdpxuc(a;O5f>o8ys+ zN^y&?M-(%?qH%PDQ(v`Q7KT>@WZvJ~DgTfLR*3NUOJKCG_;decpp|3k# zPebPf_;ue4{VS43U50n0Ks$3|1Sh&E3ukkpA;`=%!5*H|eGkd)0BZ-z%pC8-07=zk zG&Q}c4P)56pi@LVXXGO}+eBl|u?&Gah)h@g-aQfRz|JHg2G$rq&olNuU5)1iENx z%EO`d!KDHzjf8^k94U=4*RR={q(g?qf1v9U!$o8t7l!doyPH-^1R1W#xS3yOJ5Kzr zzdxUju>B!cbp1SH-${ z-=S%RlM6L5)m#2R{);S8?zgf>hGgiVWvx0u^Da>pawc^P){eT1a}VNo?w)Te?$GLk zHF4BmEMc2~*NS4%y<2qd6<0dx)lS(=l?7Vu=SAnF-hhH zF{TX4O5w)AuM<7m%UuUH^}mhhtF>p2nr(0Rp~k^fIS%L7Y@!LXU<%6Z$JCTQbU`v0 zThU+aALd=AdJiEN2%5`VgmpdS5g15>lS>S;_my45Q$C92pWt&6mO=}s5(lxd4-#kd z3CjyXda%q~*ZaAlA6#aP!wic`!7%FbHDVA7v&R;)}B@oYEI@s(xCyPIP0m(jM7<)zE!2k zp}<25{HO$x$yR`w3(j)#60b!P#X2EMDSIqm68-!o9-{DtZF8Ie%r{|?=t085(N{tv z@Zz}qyj3|N(4}^XD!l9u2LCAq{c(a?mUfwq72U8q#07ZrX!FcyZlQxJ45DNvKk0e?E&y~Gfdc`} zBK$|C^Vos*QK2jdSV2rV3*#aJgA;R&9*NN06G)Stf-1=Sx+gS{MB0_zQw)~?6aPqFSp z8(Jeh#>AbII&{82Xw>!{Qg_Bkv>&PEQ%S#j6_D@=|L!e-z-Mn}S4C`=>WFHh@w-+;Xampc|&ew46iv?l$-;!p2}O zTrhHWsRP4S35ykj+`Op}VZHX?!b35L&P=owL*a4h%&I_h4LKueHu|b#w%H-@dj8eO z;Dk9yt>9zA>R3Rb2{nA$0uutYZc2%H#YDyj@r$1Lu z%&wA1{oo>mxybORlhWXwmi}bQNHZ6vbb%IZ43)MeV_ISH*HCT27oAh_fjP}d{iWv5 z$`KEeM{ClBT}?y7xmlcpcnt|mhhUzz3t5%00=u_{+80#?%?4uIsi|llZCigY>v^{_ z-SS;xMBYJl=%E-ED^B|m(;-zUvJsWZJm>n{HKloWBRokpnhijt) z*O1di^}4AMj=Ah7Rv%?k7}xuQXF}7xjIv^B(`39ZweK~hoGhe#WslW<+hXL--V0V{ zQc~@0QY2~WK!wcM%o|#433}=WOhaa!#j6mbJH{U8I-9sEa_jd#5}4PgK5vbrbdWu zGM}LKS+8Z&Gu%$E=(SG#Hs}8H_2yRxfG1-v? zWA`IqY}Lu@g@4l#QV-1EbNZdX0*kw5snl)RmwtCbb@`6e9!;OxOnP$HtDE9$Gp=D>@$A)CCW{dj1~spDJa zs&J|M*V=on!}^pxC7TY(LWe1}1InFg?OLX8c%r<7y((vd2Ib3nPYHHxk(KUlazHWm zUP}d5+ZXY+i>S*K)=|1vS~(^V0bOjXUYuK_2*rw&LQZt3QgV-1TYBOiO%yd3rbz4e zXj00dq-_nW{g$asV_XY!F z6HU&QpI}epEt;d63NZ~5Ws^nKM~{GLQ$0xfmCb9H8M?HW~m@v7eQ1p@A0d=;^G7idJm{?fKr&f$7t-*m0)qjm&*-&~K@P)mA&cSO|y z8%%wFPQI|3VH@g%8$7tR24Ol&n6yg;X}9DvZq%O8ai%XlI8v4w!?k_u<^nkUy>*EX z|F7l?Ag%f7G8L#egeK}{Wc-n_Wc)M-9nTfv_5f%4A94q#N9hmxLIw%Xx|-mZt-X&8%B z9w>7~c^h~m(ubXqhHN@<%9{+P{F1iBm%3sVw$Z#}m{!>4O^#?k1IkpcfZh&y#Os4{ z<%g-{rMX}B#y8Ixe6uQBCYo>t@$I4jSVXTdNSuC4AsJ)Rs~g3W1DTfK-281WK+NK` z7a&IQcMw%1g(duc63uV7_9G{JqBNa_bvMwBDp2V1w2}U7QM8n4uom1w2~pHzfs)rk zhO-N0sLgQsy`}6STGg<*^1G&2H1i;wFciFhS4aLt+UXeogV%jXKtNpoZ@m5osa2c| z?VQc*ooxR_RE6wKJpa!Xgq@4zKUn^M$9Jd6x?roLj{VFv@+_JdaZ6$}Wr|his9AIfErD;i9^%PX zy+iz4wqMk)KLYBZFfw*~hrw5{pTsc)mbbsR#KSW@G{nO*I8?;r6B;&me~SU1caT5p zL}9MUHMYo^I!ob^T_<0DI&`A>9vE1Ll8qiNGdl;Nlg3}0H@`$mox@qW3EEnd$7hp< zGqg=S?*1|kA?pg_pr&FU{uVNrR~L9Sy^YtiWJ!TX{rbI&PF4$T^%&=%ZXz%ICzCxJafc31=NL z{zEXtVOrFxXCS-N%3!5KCX;u3NLrhzfV=8qf{-)|cgt6M{ZP8qW89bHM{2uFXuX}w z)JRI#*b*Srk%4Zp9zbu^j;!+MB2$Hb^Kzy9WeF>Hlo_hGcn`PR;AsWW0jejfKxyLA zw04#N7?6&m@K76aUavC*@dV6SzcT5~-=fM`y;4ada|{lZ2cm0!u>zodzB&W#Z=Xm3 z^bb#{leL`sbkwh;W|cY|f8Fpja{huUg;OaggFl45kjvaw#jX0J}DxOm?SxtR)a_q1?$V zy!6$R;uIz(7mhq^Oe76e`Zd9+LfH~pJ6!CZuu`=XP-mUWSl5<~qCWwjgiM#!n^#T8 zM+Ix5TR5wbxURabHfM0!X2P`CAXAERQ8;esIbepZSFXC-`{SLb)ey{=k9qJabFoLL z(D+Q7uMA2i{IQzNTR*ZX`C)o8n`Zzib4+$5N#4iJ0Bs3pYDwebxcL^|l|G1uJDy|} zR9bY&rNB)MdhNaa0fLZ8!-_b~|!BX>SMcnqTa#7kh4v$DFjTmdBadVq<^$#R!yO=-5U*Nfwt~+#Lv0Idx2B-ZK{Os!roa>c!ckpVB6u) z-O<0aB$11D{K4_uK`#w&;TtLmX93mS(d!E$K8WWRuJVwD{&2_u`g~~mLTqT*Z7-p2 z*zcWfJtBMhq&D@5&5)m6+8|%M`?fC0C=#{qec;XF^G(?J@U$C3`gvWKqYjO8q-H9$ z_ZOQ45G^Z%VIhzSuVz2VvK>)Tcb9DLn93NE=nB8Umk4T$1HR zDg6Cw^>B64?;9Ijbp~t1;-*wSexbVj-n#s@6(*>V{7)atQ2ZA8t)9zlg}u}QGvMW4 zgcF~LiogFRck&D1-enRIRq^GX>kgjBlYAzleO3eGy!1PQ;6wPsd+lnq-z}$-Rzm{+ zWTSl+Qoe2h-&z1=>j=?9f$TO2P<5u&v;F$C*1F9q-Sr09bwua66w8)) z>I={?+5$n@7(Su)- zbkD{A7}vZj4_ku{YuOXH=B3FlkfLog6;=Efn!-Eu3G8UXHcs0I1tbT}U!~ z>_hyz5&02U?(DmR(mPl=Oa2>U`1l*?OJC%76Xn*9KcEh{$!?{hVw;LBWL^}ykSMU- z!dB|V-EiPy(CbpWvYjs)kJu~w)asuVP@(mx>88BhF?w=NaYb%yq+VW(2QJ3E%sQ(c zTcHc;2))o3*4RouvKn_;j~aEiaKv^59!VD1{|RCL6FOvihc$e}E3_wjhm}419?ibJ z=i6IMYLWMM>z#+Q(d>u%E+=%Xy1Ama3nubPK%lfiU}tTY@uExekT+mH%?rC|6yo}h zJgx1xJe2+!l~wHy;p1Ab=q>Cn4LwpCz_I&a3jOk5kBeW3_MCG!a= znP^gQk!{H*YHt}+jxwq&cmq%IK@4BV+d~CV%5+`0ci}7GrY*QPkFK|dC*wPtkH6&k z2W0enhbt?J_T2=dfQCm5kkv(PQP4@dLdQ<5kao+~qCc*Dk@yOZe8c{C=)Ss871D(O z0&+nF0%G}}LiazBf7QSLt7s6VjkALKql=bqnjs)1MC2LINNA=RA0wp=%VH};KqwUG zA3t1bwvL+`Gd0b{JvC%yRoyb$+@e}FvZ_|YW-GL^3`A(@Z)I(*^zrHb{&d0V{tU38 zxMzHEy!QN_?Kruf`O(V)o%jDu9sX7iK1AvPL!rcAd8fY%v0KBue#|hYZ+V`ZNeNzZQN6CKK z_ojLCrT5z%iQ=;{J%{&Q55Q-flCC~61=J-Qq5EBqROxjekI27T42G@UDYw2dn|TdI z<$2#h<8KdZcmLKNpqE|R=6v-B0ghbDvZCNbj} zSc>q7hl^$;U#}9+{3UhJY~3IeCIJ!iWSr1jmH@(1uu{oY>jeO;VX2ig?|) z53(QJkF||kp9sn*ycn5NU{Pq+*01~Kl6a@5&5j(D%KO(cBnIP*`V5mjhj1t&RHBp9 zN-U=bWbRd+obCWdtj3@Z*A=GA@~B-M|2SfUFJKU@kx*e9ku`>RVh?!edWBLhAQFzc zc^qQZv0v=E$)58UwKrRUBnT|M);n)HMg) zksHm1=by!reXwJdX=Z1FGCmw*4!k8?;`J;o2?8chqIqo>=d>c&afW8##ZuBjv+?;~ ztrmt;5*DRL7K%u0p|DE}O3zpv`+xvhO`guAQe<2C@Gg5ZaAmk~Mv)T8ERarTfG#O;2&EpNMM!w{5g6H>u!iR>=80 zhv-4yb(Yb6v2n)1sGdS1sW)Y@?@Q^m+P+j--@@HFs_($~NO?{{c1P)5xzK`>f#+KB zu4i1E6|tvaw3zf%*~}8M99OGDsi45V%2ya@s_#*_5BuLIS9fSzkgzSHvb<>6>UZuK zRNn(`KNCZJ96hjkb?T5TwNm~?DZWE48+Gmj_h?gFdaf^S z#~Pi0>MVHg&_vlvtD&eE!}Nxx%ktOx(jw3B$yHLm3a1Gx;)z zD5h+`FYJJRrXyWCH)=%bd!;x2QD&sZgKKEJe#I(uOQ+;=d&;c}t*?WT8tJm02oY1u zbQ{#mLfmz8`n)6ViNa7?&wkB{{;R1Xu|B2qX4nv$QCJ>h{&egT4}zrt0`>EI{^kVA zFVKQ+H%;>TrOeE$HoOh>Q(Z_O8*cF%p++wle1zo&W|>~V!%P98JS&h~fg@y4z;pp6 z62x7;fI~s_*HNR&wwy65iU5vi1VJZe$QbzC+%c>lAXazofi)mIh4A-spDl>?AtY(7fpthr7Tl%1Mo62?*<8!) z!w1~DE=x>y3&w4B${#O(2aCI$OF#a>6U)=B;7^njlrIDyqG*u^&I>fQw+IsWFa%tL zqDuthW0Yeyiu`V}2hz!~W;XiVey9hY^L}z&kPFK%Idj{n7<#L8m@lB$+}^ zVu$||E*)u2$QG>tX^Z6bRLyddHuH6tXP;pB45ATqISRgE)+>hVK5}J%`~rzxVal;w z=Etx(C&hD_5Ou#LCts)>q&V=(A5E8eFZdbsy{~_hHk2F@i*A4e0RB@iA z1faE1)-e6dHQiEOQ3wMyiyRdt(sT`2OIrb~ipj|+^HeKBiLFCSG{jTWZf0tP$5wVd zrDwdW+ndX+rKpPNFt!Aeo6QwHFE5X0FFBg2rta;Bo(8j5ygN_4Cq5tFKifXg0@&Zm zA-?sm#t&nA@@&D*9Q4LQqb3l*JcxnO(1bkxRTE^+3INFbKXDMq)exrowBqpH?2 zO-L*mr-;zFBuZ_b*pR6Nuu|*An_DFMt}aUmNvxe)_Ofo3a!$?C?8`1*NA#21GSj6~XmsE4i60*@`m@Nl4e)!de5pt*rj0 zZr57Ypwh57^RQc-B!<$>)APqmNS`^!^((Q#hH9HT3m4t zNq*)kZ4+ht{z;X;EM?<6{iInh5tp!TNDC~XMB-%-J4u3LWl36K!eZ_{Q;d=qvqx-h zW;RQ+Al)m6aLsXfb52#6ac4>{kl0KjFvG%DqT?0z>YHAm)I6^L(L(MDN4g)k(Eh%4VYbj3$QGVm8-6Fs#OZ}?ZxNo*9s&DQiZgQ3GP?9p}s@=q}N;TNeTDp;-~}Je}cAqNmH`1Fn?5T=|8gy8}PJGU%k5|B!D>z zH#V>&sZw71I|CJ-uh}8+!&rn!J7LF|uA);-#H02Vbe*_J$4MIGamlfTll$~Ku_%f@ zY1q7V)m-(^iMOz`TtDhsVmI-JNW!en6D-&pzTzpPxFl93{c>)z4 z?_DY+$C^)D>WDpaG^2L%kw@Y*rtY~NYRqXm^=L*Yi!6=5%*1#+W%2a9I+RVVP4KlP zBO+_R@tg(NA$<~7b@j3$eGx2oi78Za8-(dzDEv?_;Ra&QL+TgSYz^WtUXL!J6*%c6>bwxx|u7D`dq)W$t zsqfac1Nb2;4HasjD-rXt)Z<-p9^d9=cf3><-Tixm)!p0av$L_*4klpr>PZ8b9 z7O1;Vi+b}m4jzAl2q@tK4*B+k3$5?Y*D_IGGyme z($E^g1tJiHbDcF1c1-;YUQ56eb_z7o)Iok3M{ghw*TDS!6~H+RZse$>hMq1c-G%eq zcC6v9VJ4uFdv2X`!oRx06~z0HjO}nG+~?PkQ>Op)w>LW2K$Yeiex(67X-mqtPAY^x_q|PWnXCz4lhEEi*x>UTUNmZ9i3_E8GOdlVb zRvzf3dAJ8j(JqmiO|lA*Sdz^a;*Vk9$KnfFN{&M7meP8sj7nRGAJY|u<&(`wk*tkt z{GhnfK6gkcDJYf@r$|H_O`wrFiU-!Ak3y^It8hsoKYBIfjCn+4l|BRT?ztn ztzAgth|cDLfz``f40V|8wS_)yCd}FP;1Y2`iSRh{nWXQmgO)DrRqPvXTZz4U_nFK~ zGm_6D4-Uhy)_01*xN8YHoq1A$f-j#-MbgbXoIAMAM7Hco!09TjPPH_FMp9~D+`*X2lGipTg;3%!4-%*G^OC(nqjXi8E=~!q@YWv(~i|SBNO4dv)$Wtk*}Edu7{DA+F+k+bB8VWyh3Dj(xSJz=#-EZqy#@j6OWbW|K6 zMNPvzr_+i(N@hyJ5z1^T>9&;5s3m=2WjN<=wNrFn-33^m#fsMy`7Q@YK>f5B^@)#ic zmyTE}t9_7$sX6$hMkxlPU!*#Z_QZyopNIBCFD>v>Z{$H#@%^bJ-PkOFZ19K&DQh)< z9|{yBmb@)@JR-Uqfp2YS{+r$=)HVrq>^F%I^;~`kW?1#^y_(}vBQfsGdcl5WEZ<`l z#yn%VHB5|k*9v3s1(n??#wf(lcS*pLy3fK%rOc(o^o;X?&*XSWrEM#cz zkLpO}`=~QB(GByZZU!C7)Rh7!o$%&rkTFLyYQ(7J@x$Q5#@zF~D+{S|0o7!$DR$9u zwaNvRf3C8ig6)`^6&nplk`{bIVK^QSdMNHhN;D9OkPoZ~50_IHSudZxQ19#FqXBG<_qJ7BrMI*R?=SvNvp_jS;u$!h2_&7RN%DEqAj@% z%*T=wpb}%ePfko6+U8ZsczOf$KVB03c9$VO93S<4Zm;Nos-l}O^l+D6k>ms1Rm#{0?b9FjRfOsJbc#z|BNd z7u8P$H9;IGkFNM(6Z_$YD7Ge|@r3#wM)8F>g4|DVSbrRiCTi*DIrXqHH$6``(lFee7m7$IFOHqO{?@?vetKRjrqwzJF0 z23d*Xaj-<7BQ4cwj21;=NhKEBqMc1)HwDuyeXoIj+60Pux*v3ppIYBUGxlq6DA)OU z?e|aLLtc~DS6^K>R6gi$r3QHT^3!0%0z;NaltrfYbY`Yem2n2*cIX4e>;O_?@*%Z? zJzzj=`U4amN>ddPlsv;56;wI`lewu(rNv+}Mk%U~#sDWO{(vVc{9X|hU+JzPs-}<5 z2>ESzr1)KW{Y$%sFH@xa-VziaGGQn=ijNwDpWMiaquxLgRB!%n6jX2V?v&6WHB&Fu zfi+XE5yYF=sK08^o$N+oIup{x#2m+tQM(Gai!3E5HdH42x$sN`!8}$nY&$WZ%j@#MhHvvNS$t^wij_R&FDJH96dx5U@h)UBM-f2>$%Zo5v)_b zp`dqEkd$qw4?5dSKDii~`Z#4WnuE)je4>7tdiHcTOO<5XUYXSzu?c$PQyD+zD{4TJ znWc+1w8ZjRZ^M?%JJui9C|`Qqw%D9T6&Y+-Ay72NmrW0Vyk%!%@yi9rp{t@(Y1Qyw zPY#p_TJW?rn`@XsyJRI&qs<lm_k_rZtsJc5l!o#=lpDLVF|- zsu{jq3kPwb8!SPFby|9xW!5=}jf%q3?|EXTv2;fhxgvvTB?es0Gek`>9kX-?nw#h> z+%kXa3{|yP?)~q!YkkXCR=*(zR2A(unYoi?Qr@kphvW=K&&=xcZ;Z9D_qfvv(HpT2 zIXDwQmo!hVWfE~Nd4)A+VDG-*IYN1TNSrJj#_1o%H#!E0(8)l@PT{j|FkxG7&qyq~r1&f-K1i$MIH1tIKp*axA8xy1)=dAzi{Fz`-*jh=EJazwT6WD4z zSo9v}NG)$m<``@q9e9M#eAz5&iU4d^Sr{9;k$mLgqnW31RZOK?JooG~goeu5IGR&% zu4{dCMvk=8H;-STN+aFNRb+VyqhY2M`bnr38s1Jh0+r>~oY;t_4iR#^tN;vbY8|g!{-6 zSq0=97<~FC&Rsw#QSD`^E1#u#Ca~qoa>pBUajM)iK?14MqFNl5HI*IF=tqF}gB%X2 zriLWYeP36g-isYB0kVNB8ZQy0iujcDPf>tm=*zq_j4umRQ&@z!!%Ca3&`d68FbNl! zH9d_MEVS*Ven3kp(n(>9*I(JpGZj?z6i;7wup57>#~H%uTcMEJpI@ELNNe4-w)>GP zQo)ZbR%hzW!hD{1!&pJXRm{w6C$N5O|w$;yA`|1d|9U!(QXs$6&qAbHgEG%~U z1v$AyY_o-TRs>CwLWo&OhDuGOlw*f$0+m@}MlDV4q!q)-M6G1R4dbkT6>FKvTqcE1 zT34FKh(x`-j3xsgwL@ey#%<84TS!D$dtAZxGO*>R39zbSLI8wn+QEE5 zohB?ABZcalbjIQniuVTgh}==_wqSsUOikKSe-H^-Lb3z9jdY@vj!27LSACYa7os6x{!I| z2@XP02AYa?^++P(6+-frp%koJTTABLq}JWS8tq}9k@K|9_}k(PDhUI>z#NgFLhp*( z%@)@f2PoE&Ak>Vc>kUX-gM%Ts@!Du)Zj&NAG;-8s{c7X^yujl~2RhF38cTIDu_QujK0We)_G z*m{Hy+p0b|j(9b)(U|O)(2S1;lO0B5D5c*DVX6;8jVEseFz?M|DvK=tX7;W*=m=U~ z46&h>fk13@x{{ngC^BR(4N69F()&)*mW;)8o65mrYF1kCY4XxI&q3Sk5U#DR^uTfF zxQVOnM%6Gu0!4QWa_dZ|LJvNRQEAv+RYI52Xt?tZ-NkAM;Tg2oS@W9hNGo6b?k7G{ z`GZ^wh1j~)Xgs+p4dJ^!Wd6x&;*m?e>6!BYvv3)`hoDkvQgbo9dt2{BwNkuC4p!kl zg5wwnn`8o+H4EY0skQk1(?lW)-lWio;kM$ofLzSXlYj>wtXLQ=njuCtU3k6Hu1vLI zCd8%mPHDJq=e7QvU8s$uIY+Z0e%x3{0%+{^ygF+rWLKe4mSq*gWfg0Amra32D@LlZ z>%`hN0UFA!jnVYXs?3{vVkGH{V{Kt)w)bWpWNt!XQKsS6WHhO)YMNvtU0Pj$=UQwP z+9?X<7N%KC01L6v|AXOxW2~2`J!bn_5R1R(b{-{rxo~Ta`+Go}?_RU-FB#Gcn3MEB zDQRKT_x!vg`1SIgdUwsi*m~Ik?*I0|eQU!12v<2&9{S+=4uxmYnQsUW!)TQ@cc$!Y zZ%VyY`Xv>436Y1gQgv{%_$-Wzzegmffj{6F<`GZL1rQ~KoE(GUb+utm3}bP<50e$Y zH(e#q36*#G1pP5-w-nZ6ye#iA&IkZsUat7F!)CGW-5spSo15>21l1WVa*`->%Oq?> z?1seYtIoNUt9Nv${0}9`h$a2g^33(CREkP--k^~;=~}&TakO97H@ucv<&145m6y00 zNjCA(FoAh8)qT0XjMlW7apbH=OB&ycZ#bjT5V3{Js%)B9xeTHgbPGN)K#^*J#c2I3 zuJ)o&8?jE~uCv6tXAAi4FNaxxp?i-Z$xY3<~h!_Qe zd=>b_$d3vC56MR9_rLOqoTyjW3*4P#V1^c*ptaV=wr_!OoFjqNZn{)R9bQ&gl38j! zkuIFlrdanM=l%L+gcquhBKAPDnQU9CH=GqOovS%>je%y`JY3bMIjGj&x-*rgPg8QP zSW8Q%ML%0gkN8H!MotQeC`rl*YINX5T9&C5DP$R1FIB8UNHaQ_-{5D~$=^lAWk8!= zwSg}>!b69u!Knyj4GAK)kO@=gxALcLA<+ZO5OIt0>B zlEdV7DzSPM1<66-4^9H=(94e*YJ3|`w@q34B61kF(7BAVd<5fKBn*LRgSDs&T0J3c ztre*WCTxp6B}IF;UNmF=hUqIfrzeU@>`P&hRtQQOw}TUI^r621JWbEIMXb4jm!DBX zN=w{7Voit1Rzuwi9N`)Hs)Sx%$0`dp9r>B4T)0OaWkT%691}^H$^I8(?--m5)HMsn zwr$(?6Wg|J+j?T#c208QoFpesPHfw@ll$J9TQl`e%~XB=_U~QYtM}?vz4k4L4bpoP zs)#WzaWo_ajrqrl^+j@VX0rt@p0H+UH5dqBJit!=Z|!EexaFN z(5c!`pQPPo@}J={LfnnFRKHSP-Dx;v6E^=?+<@)DW3g*tcSxe8uV6|@Q`^=AP5)xmA+%lXqfUFtKoK~ zX~<}_{S(oD6#Lfbn+tgBwTku41bleWVg89Oe}%3~G%|j9NW|2UwI1P}a705^{U9d& z&hH0^7d>>4&N7n5qfAlRBaRm3R!li$B}gIK|o5tK|q-P#{%wd{eKp>sb1Os?_^=inkDy!L+VJ|a$}CIU8;gL zk%&r@G7SVK9$dtCHbtuYfhD&*SBaCx09Vnj(EzvdC&=&$%FVw9O$U*n%g&SOP2QKy zHJ^{KBRdeiDqd&jsR0H}x1k1l8XavnmM{%SZu?Djm#x2y@VN+{E679SM8vEZ_yOPH zE8s-W=YGwPgWC>~YeJdb%{Ua4Yy5$yqh7cf6DL6W4}@dSMO1{hNa9%N15vp#Dkn&> z7%2y$OSiLH0RxT$@}MDO&M?K2o9oEpqzzEwcnAmY_y!Eq{v$Kei+vmYo5aW`svF2a zyQua9X(2tO#FT|8+Kh_a)&rVx9IVN78#R8vIqkOLgvR=xITyL~?lCh7(X|L5FZM&0 znfABd*>}eV=DY+X5xAb43v4E%I_|^|KQ>@b{?VkCd7TwdQCBf`zo#5d7`fgW zp*ZO6l;l1&g`7Au#qN2wkfI zao_#MCKr$oUho2TjK7M(HrmMI#v-bDr=~5DE8?KWBXRwj8RoNf2EXIR?EbHyDzw}M z-0Hn54OvMBSsk2EQ#6>Yy%@{HAWdP#RV#yIJ4-j`tJ)`ajy>CftOZ1WD;5o&vc42BOlW&;e?T0aG2duMd*A>x6yI}-pf#7li+5<&T`A8)7?qC zgv35`&(q&)-bf;r&8ZHPVQ|lGq(g4NeH>F!^$ewzP^l%U+}Pnq4aUP zvVb&CXFsI_R>nuy--RvxKBtC7!XKDg=EW)%HKKZ`^S1)e#L6yB@;fy}40Z-fj*YxR z{${leRr)G25_-mn2-==J?jE##@A2+80B=g#<9YAtt7WNU87q{ zY0{L&J?I*{OF7y;^jubzQQ(g%Viv8-=#WVHZI5}V>8oSDX}%L6yGu_`K>*N_IQqH~ z>DAl3#3Ru&KK(|Abzdl7IJ0~|C8ZQdbSK9z6CQ_&r11fmXU9@;^%wZsOg$o{Li$C3 z_{C%CUZhjB?z1f3!0^=|#_5Jx-3nH7R;h_TTPB)DDh|~QOT6~_=#qVhuz@AcC3%PJ z_98CU13m;5z{^8=rJ@5w*gsA=2^%n$scc2D=gbPc(gX@mJW@|yddyBmgP#*i+u;g| zJ%a7is8+VoII_Q|wQ--kyu^Y+M})}#{_&oTk<~%ui$&)-6P0p-b3x{d6}tb#P$=qy z>yYKIVQU+2<1A*Ggh@v=jA9;WYfh*#e@@p90^olnC_bCP``1Ac*Rm!qWsTPS3*fnW z!WZfGs)-W<0<8hB*#AwTPKR6_)&J1P8vcJsAuS72Z3p}RZm2fY(6w-W^34H%JufIl zBQ$5}mT@8=?W#k$56P-Qf0IP3Ur^;y0CN>Kx2zZ2p5LWTTiK`GB@6Sb2lnMZmZQE^ z@&ixoVN?c1rUrR;-mYIRg?}18VT-VZYft}LVEWxk(2FkYXT|Ks#_If&aORBj!9*?e zRuF;Te^pItgx^GT@h{(}ii4RC&44vyMQ9+4tc&G3BpZ`5hKnhOag;EYP(}gs#2IFh zMHq1Bot!PuWxK}dvRLH}SpQE$N87h|FkpxQ^3~yl^c!$Jf1fOsj+`VS14SX1j)L7}|33Ufor!p(@%n zSn+IU4M%_s9=&eh?qF1?{4`08xvw2GaG?G&(D|pS!eBQ+qx@LB@m-Hoa1tx2Ema^o zb%+>cdW3WraR5&~UZzer8xG45r`&?kvZ%lylQdk-sP4$T4B)#9Xp57tC*NXmWDh3ojFDXL*!`Ms5h+(9_(IsqMI{ZY z09sHFjw-ArH_rJ;$&3)u8RIlSAzPf^;<-8?d2tn*A^P1V zNAh>n7Ki%bT?5UCpY2XZzFCN@U-5R7txny{PJC0;4!VrLGf11?(%9X(o~IvgHF)7Y zx+0_gT7&JxSdb7_wv{H0ci-HF1>fYhCYz?3u@BBe7gn#dU{&v3-@7xPE#Hy{nx4KH z9Z1Vn&ixi>mt7owrhWvk69 z^$1Y9AQ3bt0t3n_2?05DI@aCoxezx`hzTzDafC9|7;(!n@hBwLX!ZyM$S8|%O_n35lm%VHS2<5suduX@+WeE6OmC&S0_~yGUJJC$i3R6az%gCSUIHN`t(?2}E`NW`F}IpTEy3dLe{ZXBvS-|SCh zS3Z-!tThTiIXV!n($>)Yw0@RQ?i18o&Q~fDbcRx&(kV@cd^cn6tbh?&x?u~NIswhP{KxbsS z&$cV7wA+7cG(x?#H#TAP&+#cVgm5U{m$R}@Bo>y)8x}sEd4^GEZxD7p0M1j7>>Vy&TAF|#tW^Yjl0-fz@1fr zf?trI0}YcsiX`&HQLJ&vnvhB~ekaxba0O`7Q8Zppb&ZSge^i-YW$Sm*A%Lds}wWBB@zqut7aw9W*m?rVeP4VZmmB%OJ{8hB{kbZGFC?e3i1; zCbgBz02N{3kTRbw8`sh%7v`5Xs3=NO3Bv@Ls`~SM8Ko^`84cZaZ0tT5jVda(GRDzI z;m5YUOpf@U@4(KJEx#GT7yFkyx0}bcAE9pzvYPpd_>wSzt$52w4)*f9t~ZW?qy06e zf`baNf(t6_8MlQg{o{RCZcLZ#x*X=wZ$qst~`R&Z?6y}?C|ka@)?V%n<92COm7vH&oq2Ku68-j1%G@wA_h~b!1wpR5(Rs0p0&kb*%VF?7bcU4EWpY`-cd)+G9 zOuIZlzv^=rjuJ0+N=QyK?~~ln?Q1%wj<~yYH*FL@IEIkszjVBUaXaib0r|HU$5hUS zHvLIQJru_@W%AYdZZJOs*xp3n)*Ib2r?>v@M7jTwJ^^}sH%(`r`d0&)-4@>TsiuyY zzN2$>%NHh~%igMT8+Yl;J7secW!!$}Htr>Mzv^;FymgU%Ll`knAo8CPzs@KQoTHje6ILC2i@fmcXNf#3m=upDh9qUGh~`t|jua*MB;DMmfK zWi}tYXNVUl@IB))^4Yw&C^AA3{9YBm;4ePBklAKMQwjOSi%TrIgK@TJGdb(UIT-sZ#3iuDuaJs1< z*_Jeao}oz&wwtmMIP_5BD5t(;Zckv$;Z2_{f$_*p)6S9CsmTz(r2BnV=26H z$Cc?97=UT}o(WU+B@o}?G<7fwbubcQBx*LpANe&3awKZ&0?r6v`d|naZa$; zaJi=RcSQ~Z-qP>SMdY3Q5HXfV>jY_F#-zqR$_7oGxba>gH=#)Ejwcmv8f7lf=w)_+W1a?JQCmsz~)2nu|!zBSpYs0LGPct8K6Dk;T^>|R|I zR(xJPEH=bhZ{)j5PvVr--qGXv#o!uUgLB4u@3)YXQcRbA8nyJU$l##qyB$BtLri+XS-eI&<4hfDBwvpV32Bj4nEn&jB^ z5~k=}>$FniMAh@vZ`1J9rsrg3B&xT*g&pOFn%kNqW#z&)D<;O!(`6EMI+org^nXt~ zlZ4RpY#@yO^CoLrwnwh`JMJ+ct%s8)5xC-5JIG;0A$Q2p?_zq)Qq=A_9i z0Y z4cxe4mO}^j4V9?hJ{zSjjRQ*eYEVIhzPn(aBzmF`%KsMp#r`C-WQ}kyJL()YI@Q2y zA4y}T@MDb3knrYp)g|Zf~F?|zhy zBAxHqEA~MeFlD=G3~NwO4L;q%f(DpzKIOjCfkqs!EB>3qeXOtT`^b_|Mg+j1QRdE9 zi!h_To$gm;s6N>l{7590;)(fk194%Z^0NCmb&0*UW&0G zwpWku7T^xcE3-dA2PO=ZYqJgtbH@g%S22j|RKXYiGML?|8xET9c&TzA=%8<~ z<$|AVj;E)M5feVjSW~U_29mS`4&=Zo4x3tFk@SzlRQxklsSY(xOo;13^MDiFMXF-* z4?-YN3GWlxcWwBGu7i#V$8#r;+onpH-q{8T;AR^U zc|7k9z%TDate0ljU$+L}m&RMgM*9GrP-4Uxm#t{&BfvB(`@LFJap#msBJ{(3NgCSWes!Xd$ zZ*UH7%gCI6DQjQ*Xf$bM{HCiKnys)_%g&H(Yk-9qBCbWNme#OqRXY<-fw^Q=;H3&Q z*0T~Kiu3x-U|-#^UT6)dXB*o5RXoNd0J#MTnEic{@d_SttUk1XV;e7pZU8%UDqh|$ zG_Q*ZQ@8bNx%-b#Dt6=(mo|Lwk_J3@$a;lnjAlDS-CvJ_YF`#hR(6=wY|bBk@+AO^ zsspN^8H;3E*WsFpvgc*G2005k8aPJhs_Nk?D0xV7)<4~5Ymj&ea&~00U)Y&En5siE z*qZr{Hk46|XBpxa09;DshoBwzy07i~VPH1KkbJR&UUZT?(`+*8x@b8Uvsf z>ItXo#!J$wIaH;~Fhb2j&4LtO|H0eANk5^aJ8!z`CO3y=n?KfJil`AEDg%JV(5sx! zmK;rxbhBr`o@yPAvis7Yt%TZZ^QE#xriHevwA06%(Q@&|KJ_YV8vi)t=I1GgA`x$_ zD*8RFiBr{WbZYw4P^|zsB^{MjSEO&44yWe@eNZd1p<*Z;6fZy}vHtH1f1@6hWHIqj zmdk&8^+1Db+tKteRwTL{?!NGfy?Eo#eR-0QO7m?=13($~@;9uvRMzZXCET%K2ia1=7l ze{vLIcV&bcvATQzQDKVafy;Ajv-v*>IBM3t1!9%3?44coHWl&e;ejo(3{NnSEs;U~ z11Zs+jfP(^WJnw{SeC2Qxh}B4A8`hll`ZVJN%(*_-V$OH+g$zdq+tqcyj4;Fs8(fh zJIGZvKwj^BrU#)|9<)a?MLwf&5;G<%}e%M)<^62wjx^hmmD?3X_!ptVNM*#(N zTcL1pRq&pkbV}^!!QH7M2}MT8(^_Id@S8R!5a{aY5PMm>BE%oZ=ELX(c@R z3YRdeZ8VHZ7bx!Vg!x;AbX{&tl(x!@`TfJ1%0Slblr7~amt~GjcJ$27cA+!YWpnck z))&ofRku4aPb}i(ji_{vAHNVo*(GkoM*G0#zK|rd@4h;UmG4=Tt$*9Q5P;(oH&WJ2 zwa6n&NZoH=U0RYUYi~cAe+d3AUg)O%7+ZSyT5^j`dQn(mPF^#xvoDm>+LA~GKrAny z73BC079_|~pIJdX`WF`wvmjgW5Yi2^VBtTqnl568?y2c*`80pY0kAF0JYM}0%IRKU zZ_J!XfM-9W@~V7W%a)k$sPnH`^vRR8=BqDlw?=aaZiDn(n8EN5G1R!F&9@(w79~42=eUi9{_Gfc?nf+#R?uI@5lJ(PkF*i`japQzu6&SG%{kzG)M5#LDE^M?!;yl=7m7w~TR6)M;zx~(=L)}%1 zK%+BZ$x7^5PnVSmvsUTStM90f{5Iiv8sGSuGY>xCH$r@`=*B6ttZLz~)N$)o(T$j; zrV&|4BxZS=zm3ksIHS^K27`VAF14lOqadJk7+(-LJQX0=dZ_8Qi@>Qo3y{;2XGGeR zQ5^kJ1BQ9cRaFmfy(BI8^fh)=L}ldjDs-#)CZsP^ZYkLLFEks+ln#+rIfCqFfHO4t zPF@$&f?#^hdV~BBnuDlskwPG0+!lNF={g5V!e5|XM{h&CIL+a#wuEm>{zDZGjG{Bv z5QZ=uk)P}g)@%uzwxnKaQOxzmaEJAowT?A^NDa0D z`~zWY+ROe?Wm%c%XX6vr5otBd%BNO3BKvwqo_>~`jtBOkb4ywOD{9*-dQ$=HYm^wY zxmsNUNNGQZ2FXZuJYW+oH$J6iO{P>%E0ACDE3?L%i}8@R6~`HJMnm2={nlz-zNCXpIH#3_Fj>k2=(&4nK>TK9*qAIU5aDL-RbjLR}Z zZ}FGfpTpuPSER>V!g&A0ET5kLYq;)vy4Br0&;~GH>^Ll4EGMwTGmwYwUjywD6O}9F zOv>oU74S#>HF(4U6c)4a2hr^ft$CAOJ*11h<6N9tnIHBSG#KHY1?{(c8_N0QLeHDD{9iR?d!%~mpH@1YWN0S+o*+s&e!%CRio|N^0e{D>~~?bjgrRi!4gT8v~3sS;&cq^X^YfYBZ51AXW#pZnw| zc*?X!>yux2!|eFE*?SKX0SUkaeN0^JZ=Ayt$}T;smt{~jYFyRbj&=V^Kx;yU{pj<2 z_0N=$7EWg`rI_>pw0|l(K#u@fK&HQ0Jd675(hLj65Xo|>3y4o1jDP>};Oyr8Asx4KY^NAz%5q<}2#=Y11#k34nZ;7(Ak3mu@j=l*#lEM~Y zT@OCz?HZ*KPHJ9bZ*&wOTQS4oS}+yQz3R)BwjQb1)fbJg%jQ()OIWObRH^Doz_)TP zmMzVBUfJ_0=}8%^Lv?A|P0+Zr-6yBQi#kwAtd{GyB23rQV{a+SIV;|1s62pn`{GKx zG~sh9Ieyi&gyb}e_^9+Z=;R4)hQ6mWnjfbzDiYPhSdOp0$Px{jIb;f8>rEaz5+{T} z{K|7qmvc#ufQ-#}=&@@TN5M?Sth3!+Q7~9J=>6kjEp;$#U2n zo2!LjE`9A^#MJgUaQuu>*1LpJH8p_qSwwg`3jclVH#)WaO}WY_CSsK9Se^l=(ebrj zv}|b>HLXBm{hvpqRFwoBetETrqDPwMA%y8vl6Yarhzt#jKedOXzGH6VDqW9F5V9UJ z!t&8hm!1FIeE2ecosbuRuT4t{YMJwE9eXz1`!j5G^0m9gpB$`B|1P-rm9OO8FyrYs zcC~r>X5Qwe*7YDQ*_zIQ<-mWo4mg}cIshREd3c#;yP{dLNmOfzG_DDV;QM{BST885 zWveu=u)cD}bY z`~uO>KkK9pSM~$`|M<~TuqGlNq(Al~s30Ikq97n-|KEPJmxU>#iL#h=Pp z$wUZ*8#brQQokfg2cfVhUl1F<_!VpwGcxw720hF%G$*=wrk%rYfYA|2usTkmV^!Yn7Qw2Rj%r|3@~?9HY2G;+vG~YGOuV>o zNpR2~n)^7|jB^^UW4?Y;$PGpgHlq$@eSvyAXJ#%Cqb$LgF#X#AP6oADX$S1iFr-7$ zyX_TWDd8t$iqOq^jHP5%;_o?YUV+}fnkS8U41gB=2U3m(EF-`NcKz6&XNlxq-@AQp z0YzR^fppuKzxOZuP-VW|c}mgN`VXuM;ss$<-*je>V1~l%1)vJ}f1qU11I3?`W2K)& z2311p7PhjEBwwOOmQ)zo2I`iQQSCxsTVjQfj$YO{=&LJ2wr z5p*1Bnj&8X$SYNKBViHaknxX(|5ed5iEYo3{Tb={nVttx ze@3&6jzWSCyTv+e0)Qw1tm>^Y2)eko>h-(s* zAgPJG@f6qg-Z{V@1*uT76#15tO?s^$5Cv z0^JwBD*_r;i=WkHU}h%a!@Gr>>t23BwoDV^jaoaX*yHkCI*Oz>qzzvT@i_WeBd4eu zVx1Q42q60B>-qqU#DdMDCDbL&6OVXeFpKE;Qu+AS8_;~PwV$)<9V8qy>OQpaaio?w zj*?oc3r4b$^ReOp%a?LK#!7nvt6d@s2%?y9?(rMEi@GRdc5ZdCA58q@ibVrtM#jflXL-(_`?N>J5$y9&$XNQ&u72IUfFM%cXt8kwRJ}M}blazx&NF;GkTDqU@ZmbA=w) zEhEC_(erC;WXw$eP~H!PLe4c)vFZ_OnH59|MrG96o!`S7k`nG{C46w>bMWh24frAH{Jh~x!DVcmFy4mvwy~*d zHU~P8)a--yQ=f_IsUq^Wzo42LiTXu)fO`>)&+JHE;S)?YTw`VFrr6; z2c_?dm$4$oYR}BbYj}ZS`f3p4raL^Uf=KFK;zAOu3xQswRREmntKOumxz0*UG)tLT zNk^GmQ_Te;YoOte9@ve7O%ys`Yf^k`8{ye|zxQEZmrv;vL+IiKAi7aY(39msfW_U6 z^5>Wqmh1AdDYL)8IL3td=;%Ajy z+PbS2J*|5y{(S>+P!m;GYu?l~w!IDBhT)1A>}6)-#+}EI-Xe)2X0e`@k7QvDycWuZB`hdkR^H%&-}_U)^zwqF#y|3qkvUS|owa zE3c(jP-tMR@Bs#w%k$)5Kz_Z^#eVMGrszQt)q4h6wIiYy8@WHFe8CyTw4eNO`hh}f zz&fk8#Uq=;=Sq(EnE1e+$y7ByF+~JQ!WdI|_J@Z8{P9UvYR1REzO)(I#1;z#g0vn} zYevWfM}Yk6KTs>pCsnXVzuCbPC8VD7BfB6b#xkoAFM)Ss?`i9(*+=XNdUu!Brr<8W z<|*D%0D6DaRf5oyd`PC&^Rlaj3pc;zM1U6nij@2%rU0CkFiNbFWorD&gLAs6{9ene zaCVs}RsG7SXn7J|g#8&MNlI&)@c#K*z)#o)6*?vH7;$d}>*`n>Q3Tpd zJ#=yZD{5UEQkGdoiAc8yn9jizy; zRWIpJ1cz?`Q?G$tPyFc6JN9OM@AzGf2b^`yHv=r*tuJc9J?3s zs}3tXj-xcLS|NQv(A5NPY(d}B>~U=`y)p$ytHVsek%bbenBA`=1d?(-nH>90i54s% z269)Z9mH%`v1eZF-p{z!GSwhya7qALp#f2@J2xurWM$%U;*FWcy{*nsE?Gs~m+t*4%6j0^{pF^TU^>^C*E0q~A%ol($}8Rmamn*Mj& zGa#**OOMz3=Umiu82m|KrCvPm<5v;U7a7sj_o}F-b}j0&Aw%0441qiC<~Mba7oJ|s!RBQsW^ z2~ma7VyGIcvLV)nRD*wduB9jVoqYK2ikl#i>pKJ zpk~e<3H}x^&>!7-R zAqzPxw)e-~)o_-9KI8UOW-UC;6m!E3k&yl@?$+=|F63Cyz2|pR*Xa~FIHvHRP`fLFoWoEpG;oh9a=oI|Fr0go=&|i5^v60{#!ElYFTF#Cj8U)MkJO( zu{pQ(1~B=R@)8dz`OQ%nkHI7h2a*M+RhrE@P^z3oBZh13-igt z`LxGe2epJjc4lMFdB#XBw&c~5)BWqpb%e%`k1n`qB4}kDDa7BkG_mMo=knPS?^CFy zCb7`6aAqw|36FJ70z5@BZ_c|jW%IH2H)R0}jmw+X7#{V-KV?e$wAESW=^e!cTy`lR z=bxACvuwk1M+@9&0wI8UU142SeV0OpfBA4;d+7`--b`A;or)AM&&Z56PjDJWDbK|J zirZoNIBfp?o%;({%!UaVZ-bJo_$L)Su=x!8wdx!GRxY*YS1ok_J=S-Me~UIKQ5o&& zf*}5qHnr0?@V)J93>Mny{`388yT^eO;no{@JZjNk<-jlcVu0s5JF=Jt=)-~9{D&G= zSUkZXtaaeY@36AvE1?%o5JiLA3avh9bG_7I0lg7Ax?tL+(R`GZ)&=0=rGZ)e(Ly)Q zh>~U@AtmeKT`lWrn+aykLI#s}DyyG%!50aJnYuLSi+{Sah+TtfjVXpGU6R`^ZL8`0 zwvUNtVKv~g6vN%|AAmo`NT@-P4?SfuzA4i_w|j|ZU_3->l5uNr;67umG-fl>Z|*Wq zy!waN$UHX+cdI4>fIkbhX^s=I_y#IV9}u9>=*i77NZP}!v6_p$ z=x%qHL}P7g#f*lgm)`V9h(=$5wGTCZJXloVciWI+Rl780suLuOAyqZ)ghhN^yw&kO z1v$6F_t@tpGy@~TyCV)!gjYxxzMH29XW~8`@Bw1{FyRL>+nFQ;W8r83MPa2n$1=8? zFar9P01>P;-&fcc{-z=CIzj(2jZA#3ALZV zy=4->(RWqD-W+0o2Z8>#zrq-jMo~rx0)pxLKk!%B|F^%gCAj8_FO_l=w=0~s2OUO4 zz(@7DYceaEoQ8-f;R0#f8<@igqEJ*W$-TKn5(69bX=!O;u(bqTACtfO1cWR~=%Krz zD+pvKA|{Tx@Ww5dXhpN2noyva_Hu>&$+dbpD*Z=($F)&OuQQ@U7kTo~P7Nj`**P{Z zZQi+R=>q|bw#dlv=~>OZH7L=@i7vS~K406jz#Vu9HSD6li~qa!ddfdUAK! zyrRcH>m$pRFXkJ9Pn^~Y=A2n9#o~s7{_=H9){evL+eVu~eO~MyI_-nBwBM7=*I|5+ zxn?93WXv@{D1$a!F~wMP#S#4bM@;XicNpH2Gl4Ps=vVVe5$KocZgf>w6)TU(-=g1=~NP#9=Ibh9haZ+ap#FW7*x z5fJjXMgEz7x3}Zd+2v*9YUvJDZa5%=VvT%1jCxOM_;|s|JIgx`%WSu)nuttH)l7Z-q1%R}KY?fNE z_W-S*HH1M7Yo11P>Je4Co~pL$8MZnlf;DL0Zq3cK@VpZ_&soe+`Wd+*!w^e>IC?n5 zfP{xe8XGgLkG2d#MHsq1_>w?UUGyFf$fqS~8;lPWyAITo=MH9Qo5=lKvw#tX4w!6_ z&CB~V35Z0+-7w`M!$_l>T1cy&RMDe_X>$7oiE5F^bt!>Q6+`I!49#i(Z`djxU930Q zX!vm&jyh55f-#6u8UrE>sv&rx^^7O5>6Hom;+5RI zKsS$or|1Vs`P88pV2DTqJMq7&;xew$w?4vX)hgvk4;Yg3!Mb z33%f;Y!k&H8UnSaLW(;5=|4x48!!&HV8{6U@LeClB;W@sCRtxlJIELlRhZ+jDRTWk zAm^_#u-`#} zhVO>Y!_#J-@>UYqh2hIJ4zgSxua0A`_Nfp@s}-JDcu;rNCGDzQmLN{ zto)Db(pmvIjK}74=ly@`;d+2X*+Hp8>*g2-Q`?ANP4g!KBs7n7AbpXdru9@>t3dKu z$nm*Z7@vTlqqdn9Wgf}1k6I|%pgeC?{cmf8ioE&W?@(P~j15E#ey}^u+jv zZ@7oVHI`4!H(m`*AKNXEVK%L%B^|0;dSDxg9Jr|kE*O=T9=9QqF?dKC?1I|tIZavw zvQTar-l32>;GH;TU7C@T%J!YBHa7b~PZ~xPgs49g6@sZyeoA_k{O?2m!YV5aV^wS0 z)2QhFCJx4uzBaaXAK0GuRVIm1V#+5!^e=fijSxq(Qe9R#8zb4NZVD^X38j8<0#6p4 z#b(tAiwsIgJ-B7@c)Oe}Vzb%gOSUF$99IJ3yoZeW-QEM_WL7~ z!wn;|>^c6~XWec}@)U8w#&fDyLoomKN;91}Iu~f^F|Q=``^^wCV!=P+0MV;tdq{*7-iL#{zJn8IG2WQ;Mv+quL-n z$pLsje-iznZ1$n*q5*hrU5SYe1r*^YsKcd|On6pWdT45K$*F#D!K6Jx`Mzf7L$0uM zVvHAmZC&G0Zg7zBjuFY^dzDSg$$msClWGO;{dsht2uWiPcWLTG58F=3FLwu-5=}B< zZLrsqsZCXPkB_CY{3i~m26yBv-d7EK`+7g>#gO?pUEa$p5Z7Av&BC!p`HdCR405#P z_mCqW&bRPI=Mu>*NuA*-o!ExaWu~!)_JZ5hPY6Otr+M+UKmqM6fZf@B5JA#u4L9$g zdUNM%tL*Lu44-y9GG`G4h*N#=Au5W&&UJ9AUYZ9Fb+o)gzWL4pcM;TLFwx`9lQm5n z6L?gZ#oY~1V)75pw~N4}y5BW>^-%3}V(*W(90+ZkwyMi9n=0~%loma5wu5lgaFkQU zcb54@iaapX+Jw$_*JjgJIN9(QdMEnW!si5s)s_{!tHk6mLYkFo4}gGEb2bgjCWc30 zs{TbMr=>p8A-VRge}+4OL;>uH(NVI)D{8`J_f1xqXQ@1t1R%e9b+ zN{_2EaNO+|rQq7HDZ6%lYjAcT0`d89q4=kl#yVUzDW7z^qu8E~%F$k$UR#7~gh|&V zeU*xxiOFdt&v(ef#HZAjVqc7CGk>sRTIaDfZGJw`Y|L2`+fZ)53Nc57=_6%9Fz>g} zR(G{C)(uNp2EqSv?hS9 z&ZCKAq~TLzZaU_EHk<$w6D{pEOvV|zhplaX_l|Hlehx)QvVzpeL(jB^PYimT`9w}` zPJj;~#ju$jXHsdlfBa^u9sCEEPe9?gFvn`B<7}f~mP^s9fxmNoQEjEQE13ojWDLN? zXT^}Q&a3UcL*_P%bBz~T8e^r$utw7b&tcR|za|@Q*u2#)y`gI$f5YY}& zF4$BP(w{w#hUuVgf&P#-Mm^PH+E-dbbBP#&cdC!SvIq~6!Ka~78ZXVVzZ=-Yy$_KX&8DWOZ&P5ko*Ms0KWR)2%8~6+9s_wA$bi+_C&<70A~Nyrb0p zS^gJ-gt&{!FF*YekU}uhcVi)DO1ce-+A5@sDj#3Lpu+dcqDzrSF4k7G#XT{Y;YwNQ ziO&51Tlcib)fFZ?s-0ZeGyZEROaJ5|jIN_|$H0EK1Jv8+Dat2XZM*xPu|l%OXj%kq z`3bY3<^8i=hRW`Nx#bJ2wA1RotuR*AivFMe(*nCjT27gT0h|QQpyMkqmr&(&FyJx$ zNEd)hSb8XJA##`*t*X?7AzqO4O0_2kYp>7I-

    zPR%{pH*!4@(75Xip{)gdY;r$>(S(`X!4nY!n?TeNi{tsf7`Lb9To`Ccz_D%Hwrx9aY}>YN+vZMo zY}?6>ZQDBE)LhM6oj=j5yPjI9AMd3YqxKfBpyIq zJvLDFvJcE>?Nwm5Ci1Dv%!t%drc_+OSnAxG*}?EH9#M*f4ax$Bp4AyoH6I*4GAj&b zf}T+KVf2zG5D*UM9<|ElN%~EQTN8z5857%^ga2VCx)|t z+*fc9TD9SUdv|JTxPm{%Ws^15bZf+Nz&R2O)-18nDqbyX(vc^mQyPJ-P^%r>)EFwG)5c`qi*#*^7;mS@1Fb;eK*|k+ z0Iyg0VvOr)iCt=HFqT@)=Q?+eb37ROZvIPr`)}{S+#?t3*dm!C7yKla62e{EVLe&-|YtEib}>e3R(Jx&A;`0p-JGR_>L< zgLk${D%YuPmK~+aNeyIHK-QI7yz^kkq=8}od209yQz<;|0?kyOJ#TfGLMQ(DX$`MZ za~t8wUEhSMvx>&PUpB>7U3R~4TfM?DNN%{PT%U3kjBKBYhvmQwuf0G4kFnYz{v=^t zQL?Kw@crWzz4!91eS<&Xb5zG|wuOA0bj3p{oX3>v^y#qz``L_*U02PAmIkdzF9L(t zQJdbrrMu5fOVkL#m`7d0m+~+dhkU8=*Iosz)2j&kg=ZWiQgHSBxnnJEWhJ}3xpW%3 zBjNU>&A!05y)4>Q(wb+X?Ctj4LqIe;k-3pA%0zE5d$F)Z0hr!wXtiND#q;}OIEnc% zaR4m`jXgT<&cU6Y$)+?1RZbw`-^wfA8ve;S*&fju)onEdhZ90hO@(|$k|aMKU`Z;S z#RB;iAr^K8QEa!@|M}@-<>=AgkH;WhXp=FN7V&y> z;E%Em^V$HrQej!V8eO{%9EWdN9tmGj5C2W@MYkRs1 zP*KS^p8TT0(69c*V`R&7%eq;vh6WL}2Q*tjVDAW9FYD_&q75&xUPSw1Vb`DpwssS50N=W*AFrH zfueiyI@`LaonZUyec2o-+Kby6_pMlDm42@7;#P3Y1upUfVEpX2W#oeP7}le_NLK=f z?vUJc1M_u`)wl|y_2p00>x9W~Kv|C|4$NyxkV=z-kQlM?|;(SlH zV#4!g(B3h?1=lqXw?O?l`O_&LsI7}ve}6U!^x|XGA0!J#Lnz^HWFKjZvrAT)Fp%d6R)?X8_5p*e7?U1)Ko0Kgr#0v;m9s9i$WzF_xr3DN}}g zl|;W{ui4b~H=F@~TxI)(xm;{BzfSHr+vee>6Z54USnqLwd;%R|4ik;o!PI%zve3M$ zX&TyW`8@kzd{<^Ay*i_8KJhG{9I&oAufmxnXL^B#k(=WhB+&A}4EtPd~0G52C~?9~8#{Fhk^8LD!4H8 zc3YvlQw)S@hUDDHi(_p2jwK-&*v z;i6N`fgs$k`sPNp?XjSqzTqyLlhU(k#G)U8UCVlHP)Frk1R=w!su{Cpc%J%(O z@MS?iud=_goV+p%`}txC3?rMZZh(L8*+9f!Ogz5Y<3aR}`xQ9Y#{>HEkuGI7z!K}7 zQ>M+UW5gS@+UHMc*n)x0iWE-YY%a4E5B9Rv=Ec>SQgU7@;Ixf6z~(({0|o!Dgxh;d z=BsMtuZUTsvR(YUX3yJ^B2AONK5#*8@}y;)Or06E*&0u0ZO7CyYM_ja*_psBI2_x} zh4eKFKeEJ(`~1vlA{(g|MOas1rZP@m3(iOImqD3_g0dHeChJ zJct_OF4Y)Cp`Tuu&R4!1!$9Vol^gp=Px#{gc0iaaM_u8vtHR*LX2(*QFhLg9;Of!O zOA8q)KR~HRrT;OCww3QgK{J*dtUvNa>SANy#RdiKnLg&1_75MtTC_lu8^*0c4 zc%{mD78=rgLEGmq$cU zPeSAqMV^$y9b1!gB>dQaheWCeVmAapW zRMdD+UFTanY&2;bXO`T?TQwH!gpjYa4TYlE=B2;(QcRpV5b}lojdptxXr@W>X0(F! zPmtulD$9XBla`=?K9ei!$)J@IkW1;zB5emQIzXo3H;6b`j;ypY0&+3zT|%wlVwXnP zf4CAYY>}GdjTiXb*6Ei2Q~WS+%dxMMp!RLMjA-OksYgNRlr^Lkp30w98(ozRK8>*2 z?e+<%os#8A8_(85w_kA~{76cN@Y!Q$UA2qZe4WOufuhu#<>2Da^5(bYBl z6c&&b9PAX$kN4RkD(JA7O??iap2FuG2vED;Y6QtG>-Xhv6TWPf)t?t$h)k#jM>r!= zpLEFRgH&j(q~+(cD6VhKW}sobE?JQ_QHA2~Hp#(j*Rb-xR73V~efNR1X?Tl+xu`j- zT0qzTD3A1DEc?HbpXdT$`EEn99XtW}Bu z&p{D|%mNU2{{1EK-}He7)~%|OKg6dxt*3QpVCNI$t_LKZsTLw{I$%DD6|9X?zYtbN zh*8^~zBjJGKGEIhU07SFrDA+;NkYS>I8=H^V)?S!E+>V#gVo$NxaBnALMQv;GXe=a9@riU>j(Q&RVBf|JVB7e^6KQ%CE<~mo*B$Pudi2TdvSz1>PS&4 z>NrL;ALqw}U39dB@UR3HwFCNnZtfb^sNHu;Z8w=kBXN@^&9wJYMocyZuw@9xlhan* zyAmLj%`ym0sSnNlw_syA+E|XshV*MdU&1h6m+`m`G+l)sJ{OaQBS5tRyIBxZa?cK9B^)Aa!L2Acuk2L&(7eFnq%8DPt2J zs(v2+N^?_{(A0;bAGhgUb66F%mjUAj2Q5ZDw9Y7#9HUIK0duMpGyNIUB97Gh2f!Ak za~(n4O3wxcsx3h<_{pQqGhWKaC26l=L=(OnGvc^oN_Q6~Ur6Wz%`)Hnwaz@shrh|(xSOZ| z*4>7t<`k0lS<}N!sQ00)9vr6~N}lcXUl)9%AG5L+&hi*!98{{sK(7?GIZ#)U)mrcD>9fKcqWx zEv?|TXy>zdOYDk?B_=wpStbFgJa~y&<&0Td>_Mr^X`~Zj*>Ne?rUW>P82!-plk{ez zl0var_s>!czNpB6+b*@9?d!pC{-N3z0QXDq|219|zWJ7793UXYg8zl_vN3qNm|pYS zxZrXo@2aN#2AZkUxW^-II+eY2|51$=qkOU=FCZ&mOf&T(f=)(7w8+dVBA7VtbMQEf z%i516yGVn196*LuQQ?n4o2nbdYkxzC;8H$+e9mb}kUTD#GW z0dM}mmjnP_2;)hw;WV5QOfnaw)>mHw2gTQG=nKvz|AxgB_m0g#NRLd< zzvq|^T$kdNacq5!9NQ(4Zi*wE*}e%BIg0vko!h+R5aHAP)YElKoak1Pa+k1|*XY(G zKHeQcL1M_n-E-I-5%EQWvSbMK?UH?y`z`2u^~|tg3JeKu6#29U&H~6%LQ0OgENvyW zR9T2)pzkp)Q>@t%L{;|0MgY?`KNyK@oSZg^z61}G9TKbpiXuK;S$Hco;}jh9*_(>w z^!-U3;jg|kgh<*EBkwFruAj8*-PJ@&Mab{>=?`wd@qF6CMs)hd`w23!73lbLA2F; zI;Qn?&%evk`kn=uxsN&ChC5CYW<{ZNOJ@Cvm#1sCyjo<`SIAKTpI_`x+qW!h&Psc# zzSn+ztHy@km&2Q#*@@W%0D^KG(556eGaOQqG!2dfAI7>B9gGs;+`3xr!4t^-;O|Ka zopw<0Rac>y8*Z!aDL5`{I?$z@*6H`%=FZvP^PXJnXX9V|R1K_Ykzm5VzK3uEkmQrB zi!z0_?gwjy>fE~azzhA#EaE~ciy-rI&|p-lZt;s@b~}8y2=uXHkDss^_V9359N@&_ zZ!qxukp~2I#a|>RZ#Evk%~FP=!{x`Cgt2B12?8OcO%WIxsotZIxPE-pa|C zme`X*4^mb+-)f5=W)-`)85?P3KDrkQWG>mYKwQ=fBWYxj$=fz{jbS7hbCP2a zBCyW$kC6A$p7T<$7-EZby!_4;o^lL>Es1gFR#l;(RmWOMCF6(QSz0hWL^YS+z)8~h zqP06j-Wc3#64Ngq2rsNAuA}u-R#{^TOovPYLiRKhRCSY6{^+n|TBWT7>8z?K?7D`6 zuE`#15d>)Ajc&hw${2zX8C#1*GT~a!v>3$WwJabpM-&aB5#O&aPgrpXWe}h^LyH7U zk{2X4C>lBqyS8Yc8MLtBcX~bEIH=CWCqr@XU2V2eO^jB9s94732GNkcc}nG{DChEp zh=_L;L+guWH;PBsq9TdXb46u!+jwA1PFBsh>_K@aKbE$V48}R$sLNxA_tZZ5#;bcM zReyaE$%Jn%A`27il$e|ij!iD#N$~pjNSlcb1g=W5!11qfwwo76d~~dZqvyC#_s5kE z^S&qDJ$N*xo^@|1zIG^*E4Yll#XB+&Cj2hBAe{5-UMOz~`+t zhy@4-+7Gn7E4X9TP}MZphL>%h`$AZN`T%yO&(wO>aMj7Y3cPWN%>Bjf% zeEn`KhOd}k0+`=zic>QZ#np8%5335WD~R?6w(zm=$!B^#fhVqUpu4p(rhP$8FrB}u z1Px(4o9#W@49SXCk?at0)$({u8)|Af(xx6SCx#AWzi@iM1bv-AXqPBc8aW#e_ZJXZ zbh?RvEkH-KhFKT+9cDocL9SCY6>+yi^yfu*Cmkvc*L2V$CZc{Gq)mDmI<39-q7Bs` zF8ct(*Np90yMuq)jm`tui5$USu<9h(K+@kf~`DQ+0(m?)B#xx2N3BiMC$N*7iT zp%Kyi9HCv@zQht-MU7rs`XSA2GHJLmqHi zHR`FkeNz&S-N29(h9#)~+KH>8DWq1B%`&SLYlb$&fPXYTl7RMT*;0qA0JCe_u1%Z$ zwO-V*?K+Kdg?9x#mWtv7mk@Y24K7kr`Rn?TN-^V}UFt*^*UjgK>z-z|i?NHdxLWWbd526NuoL zF*Sh&krZLmB;4-W7+~}cj`WQe@h2~D85)j7w&@=i*}CQEC^f{DBOK(iaJ)G(k~Xg8H;E4UDNQjxb4I z*qIoEqYoQ$Z{&NBBK}VBEP6Grv;}Cff)2{r5^Tw1}rkT zbzPIU8JBaOw0Hdg))xujQO*$G@%eVl1o$8|TmK zy_t`i-Z-Tk7l!2*_G3|(?k^I%@Ck}MdjGuqJf9T5JUjx}__)rm5fbifU``97O|#AU z^SmzPhD!d#s(x-JdMrBK55{0Q2-_Hz*RG{8>lgSLA`77%Re8X9%Q+bCO_>tNs6bEK z!H%;{YLrGc(@#WzLv@38NgGOG@W$Q+4~X>ba&KHVmFx%fg^b)bEezcJboCe|_A&AC z@bG~cDfQAcN>)?eVQGv_ud?KNVg#LogDR>V{h>0$BP<%6jNuQ_CKS7kwOEo&7+4-= z)>g2<3d^8v${Aa#`pBe7fF?nGOMZ|9`b*hqYG5Q8ZCfWgcQYQ1)B?%__8`HasB{dg zt}rh`jMA1zP)22nUD$izqFgke8g+V@3&Ma_+~J5lcx18{vES!`R`PkdvJg}+oA9NwXSLJQr9^^ z^q^&dDtE8gkc&U1V$JJqCRaZRR^>ge0PTe!N_*5(%Tx%BkP_)8^gJvH<4owCLQ7*JoQsj&=1=wh-n z7%k>P4W_B2yKSc!o*cPZ7uA-c`>htm9KBgzh0V zC7JhvR$)`5EkT=dhE%LN|@M$%Kj}Yd2(uE-A%Nz(nCLo5w zUGp4L^y;Vib{v=2pU(z=325q-devzj#q|a2EG$_N2g2PacyKQhsV?$>wI;1&M_6Gd zd9=|)3M_!Ze*993Yk_B*s$OCzF?Zi0AUGMm6y0|W+*bqt3<#MEA>Zlle~!P29`SRW zMGx5R1^@1$6gpzbpmgo6#3ALRK6j(ZpfOu;v#mav)P!&g`bXX|n-;Nkd&rXwAM9Ek z*hjjSBIOVxkWnZ)x{R-^$E3NtXB(s5f2I#8153+SM$as|x!PVB=aqI=jVeAO9VouW zLhT0Dwe~GDJMwMPYpi4fg@9ysXr1)A^={g7HF;PDdSBJrTFSwCa)7pnU`$cH55Sa# z785~9r-0e-ZjX%fkXMO}9NDVn4zNEnj!s^BD#^Tt(AxQvDsCHpfa`Bbry zy!ezhrr!`!OO+W$dRD?XQyL11jb4@F>e&g^lDf1!FhFez9ZVtP++7uRY~g0s%-PI( zf1Q$pxoujU+iH$@08>D$zW`+4eC&kPJd!?ag%76*y(Qc25Prjfc*Ugn2~nPGbSE^D5UOQjluxqCbC?Pgut}*_N zA%5?XPOl-6;W+co<8A3=?*;?jgxrwlABU*D3)Su*@}Gx!JwPL;%hiSuo#_ezvn6R& zrFz2AzP9qqHOfDQLf?-QwuvCLee?vOLJ&zvMVhdcnrt=M$JL-UEEukk=PjYfR$B@5 zEh5q!|MF(?_e(k;*RYFAYB~Rm*;C1J(>Qf$_A;tn6G@T`8 zTZB{PPN`~3BFe@b&d z3$?X)TjIWF;%TMJ%0&8()-mJw&Y?w@5s{7%E-~R%&(``onsl_Oe z*T6bPW=Un0hcU0L71=YTFcPvm(;)OxgxkgWJFWf1W+NqNV#Svvt1$LW)GQLxg5@r} z3;=DN!Gwu0?cA>Bm!MwyNcK@jlAvlA-?bRvF^g>WvVB)NwL@Usim>hD7BV($W1#?4 zU)O}|$a9U;YqM(a&@RYll@WIT?O35_J+`mY+3`nxGo>VNdmj|$$G+3e%!VNcK4TAS zABsUMtsuKT;bE-ph`3I;aG`MJY15J8UG@0OKKmz*IrW%)UFhSyUFWEd@nean#){Q3Lg_nT1QeK$Aog!r|8&-qH5 zbOYfFP0l%p4ufS0skN_sR-MS6kfBoXZbt{@!k0E8XJ3}yyFV?J_MqpPlqMEgwca5U z5XN`5rhC+N_xbTLT7_n%#%+`*(+un6;)lc_%!}BRj7#|Dt~h`osgM{Me!4K+pwrP|n@ho%oSJ6N>0Kt<`2Dcs(yR*5nzE#B?LLMP#=%v~TdFFF?FBvn zE6*+S(COUAS*6cxv?``9RsKddnRiTk-=-x(@ zRGM?XF|NH`EBq9KLdp5!)|ro|^sxC36%&QL~8+lJ{uR@0cj zY3aWJ8F|_v>f4wT-I`}+0Uv=FZN>5ave`utO*N#R`4uUVT^ePV`U)M5(TH3GYz=7Z z`*1FbV*al_F6b;)ZQ|~@ZCky1J2QYNip61F5;N#Eyv6Dp4{=1p@AJ_n;Vx8#{?S#w zW5YCWhe=p}Y`$uq@AcOso?X|j%?Fsu9QTuY4CSb$zw`zce`ck+AR}H*_fv!Bjpa-JtaoCxR!#-6AGT9t0; z8ac-twrg5g*e0gX;aHwQ#h`i^EH3mdYVFmnTB%RwnK(+Dc8tQRBJ^6qNkRvEg;8oX z%$0hZi=*JTc6HD*?MvI!V=#vQ$=#W(f8BsHvO~Bt4K}?=hfzheKC#h?K12+kQJDWwrnp zlTko+;>7)r(viT($)hiFDOcqW17VU(4D8tkA(yYIBY2&$tXQ_a5YP~@Vvg8lLkXI@ z$$ra>xO>-OS^1%IoawU1ulO<8Jft+jbj9z3LC9!k2V-@kJxXNmZ&2;XW2Mn6TJWrDHiZf~L)OcnedUEgTMr!2~)B7l?OTN4=q~EieqvD28*y2!}HE{P}i|hZlN|7N?ko43>u6MzE09(gAj})w{xdj+#}my z#euMo`3~+PTZg=yE^^nth6(u;#jvRjWCTEDy{#VOm7(IHiX9L}6Yt<QiqctMtb zyazp6hp_mZ1$h%y-cBw_fMazHkW2m{{UE=|Mq6p0HIdIc*+rP5FR4{ts&mF)P8B`G zNL;PXPi~hNKgbA3(e9K7)3@z~SpoY~+u!Y>kkyi&{ecNfi#|pAnd>NP!`u2JH83B+ z&IR;ujES(kxNVT*0lP#LaPClW74G!lD?^c9ge|jdEg$_x7U)qC4#@TNsG=v`(pr|H z$>KR!#u(W?!su-9Qk?lJ3@75bx6dviX6M3ASKsKO+LW9Xm_&=>RNS}== znt|?cp-dIi#daH>j?KU6eA$#N&r#KQ&!5j2p){UXa6A|F463J^IveAE8W*_f#We!B z*PGs2)m#!^+0Fu-9G=aqVuky{KtEG-r%v3k#hQaplRRKZRy6mU_d_Gs9gZ*2Wr(<; zU`X5Tn<;Tk^an&j!lum)1lA zr+iR)I{cwX|IWMvU1T-Uj&e@|=UjG>^VwF10A|&l2cUfb{({$!Tb_~VXE+W`M`D*Q zo!_4zM>;$5uzOn|D<|oBts~j!8J6}4;=r`grQp4tMyyib!@kWn|0G^?MnX0h3uy$a zjDS{?)&LafJIb=Q{9lmc*wBxULWFR#5kz|Bi5}jI(p-7RInrr(>WNm(Cp;fot!uq zaD>(|HuYJzcxSE9ElG~PSw;Xw^=cYK7ETf5`lfcLH|LVI#IHVr?G(ewZ2!pb;j@dheuoT}4KPBaV27Xcs^cmv&LX$9R2%a;o1&J221Hp4p+_Pkd`lqF#Gfhz48H0t~u0QL?{ zeV>tiyan>Q;&-JF)^oF)02hpvhpOyeb+=nf_V1r9KVW&_Vg@}ICs{D6f>+ED7JtWk z3up`j+oPwEzW?uwafs|8)&~y=DB$n^Lb%xfuW;%3Y>qnL{s{a=@SlZTtC88AKIDB2 zOQUNkoL!7pk*&%rF1kuHNDmYB8v;wqUHtB3t;1sUgMis3CokR+$4eQyySv--^0Iy& zudc>K>P4%COMmfsE(YK+At$6rW6kA5Ixy(J{NVV0uYCI${FJSB1tjE!njp(E8)*$T zbr?p-3WNvDrdYX;s1E2;c=7FH_ZuT3&KU?8-&IIyp}?k>+9s8P1U5RMSXgmQvc55> zAYm7jiO`AVP6(KsiXgo$tzr(9m~g<84p0=SF%Fz*7;#7nt@EW`(Ma$9p$H_1usd;ehU*+^hkPZfUS=$sk{VlrulP#b`DX zksROj&5!%r=gC5(iWhseFM-+&re_Nl2V7f z4hK?F(4`;jh^j<)mLqQ{jyR9VhB)`Mx&qoH+TQ*9G~n7}&7c&|8>CnsaWKi)U`7Ww zph9c}&3kvb@N=LqGyCs%UqC_K`1-!DA2Z-SKA!IGp5DxS0u~K(YYUf4m_sr9m#S}< z}LEoEqPb0vnLQGhax{Rv1z=hZ(%p;+Ie@w~3!0TYY>9WiS75iA_7<0}7sJ7{W zNW3ipg zV~P;J@2@E?-V92YY4@%aO{%>}C>XM9um1ZP-Heazh;S@Gi6NSc9wKL$R+$zTHS)V4 zw!EZNBq%c(M5>I#si(>>d~fWh$cajFAbWg0m1U3*?Ve&mf2>ceejoQ}pYfIB#)t^S zb{pUzFAXRrxW86e8IF0evSzx84(x}evNv2g_01-@8OivsTZ~N`7qDT$XMoy3Yw!dB_?2qhkhrW za2SLoU)H~UDvP@Xo5UGdIZ)^zUa}hZuJ1W}_Rpt)k;)Na@e6AYs9tXeI3+5PFCh!L zy=1DP*rtupw8Xj(r2>US!|uU|sXD6rO|!p+{f7Ww-H1k*5;nZw+jryd9~R`%L#hI-4#vNU$)eFzpRo%e65HAyuzF1zW z?n)*7N!D|qbp#;kb?JjdpK<{{z`Nk;(65ud-!1Y#_bx@Tcd zdNM1PFY8t!7ucq}HBD&#rUDmQ=t7_%5D;0+k}2k%c@-s0vR<9lqS7jfO9Gz~vD`PJ zPzZAfXD#4dw!|c8=I%O15>GpRfIUrjTw_ z{cJDqR9Rson;Yj00rSy7OwF9v^nt-|j3SVd5>5Abx?c05OKe(=dzV1ZN_Wyq5n`nv zFf(Bdr+Q}&}=z^hYP*cEP{@|3XI(0G*1@p z!4$15QemJ>73bal*0PQ|ad@|?o4TT_NE5a@4Nk#qZ2znAGl7y9*bY&yI`6FFYn%MI(Z^QAegH3gC5sM#V1q>5)j7(1wo-Flv%v z9Oz}we%mcPrs^x7S5m$D+eDOs36+<8+ntioMK`~}Xy?X^nGhHu}x{j+zf$l!4DfO~kW zHcqBEc7|twGTn3UX?KLud3#XEW$E+OS$zJc!j_02L5bwnjEA3!gaLV zQr2_FmVVvs+*YtX2H4zj zcnzL;d>xcL_YR}w;iW{z*zUU^W`QirQuONb+k6jX&LaKg;S?h8bQ|M zXSMiC)HES|Z&CsJ9K#Gpd=o*{g(uW8j6=&X0t6=Y;Ohu5ftHe1xnfDqiF|Zo3RyD?zc9QdI1c)X5WfnGwoO0V#!*Qta z`~1^`OCDt74m7^Hd{z+9NY|`rIg3N*sFII;DI7)xHU&?dYHF{*U6j>O6>MxmbzKDD zS?R@TX~vrJ_9~P8B*aB*^%BGRRX%+l5m2 z8Xy$dEM8XzB-u* z!MEjm*!anWX$DR&7H}BL>IxXm46$OELDE4^re8&vBQeu9X)0`vxXzML#7-QzC7O&g zq;&E1upF#)5r}6uiQ%Y%=hu9V7gzozSUnjiZZYeLi3qFo(5~F@7}R$VBIcs3snW@p zO1tXtlUGiJ74_i)S2}{9JBc};N)l}u2&i0@APj=$o$=fC{X6*2?$oM903zQ6*TBNW z-P=>KhpTV+oO1SJStOHy1!!X3XNhQYf_HI*k@v9uCw!;nu%Lj^F5WL7H zUae}*NLTHbcu$+JKp+4jiY4Cbm(SWg+Qs4P#+JZWtxaBwesCTgw@)q87(!g<0JOs+ z6Cv$q6ye5%fhu3ol35va8F&#o51pBgbkl7`?2A)8wMR3bSI*QzUf}iAP+}>Slt7l3 zya;_cX-0cFW$ZX|I9{y_n`d;={)(r^L5D}2nQ0K$S2O0v9hsT<3=HdD^Q5%&qCFg_ zSZxbccl#&=tG>Nt`8qG~D{tz}y-~RtQAjSo*bmyM zPoG9m3hf=}`Mfze@TsG?Zv&;MFZeS@5FjC-h>yY}45Ok~wUc@gMA)aeEZ_{~Fn3We zfvfSw_5Qu|N?%>{`C^W*sQ!LYuGegg?=k6Y4is^n$(&A_qz5gm-u&c3dV=p$L}w{Zad?Hz2c*>vt5i$}Euyj1 z=G51H@P^P5Uo?PU2X+%zQg@P~sJWySVqaF#9eOkeky+acf}sSt{2J(r4NHD#qNR|9 z3$_a%24O4FKyFDJw~tY9-QRFODm5eE@gdXVT%OpZMz9lf%xib4hD0D`l3_n(U3p%zRBTW@F;uo9G(lE!KuK8xI zB1rwlUaFycdn4%Bn^*|3G<-$vxM9QMg1M}&?SaC(y*B)t_%3!Bkg)p4f$NAd9^Sbs zA({qvMmmV{8h-!Q@qpDAZDVOu0S0nI#o!{IxRE5f$=k#;-J-L0)?qQPni_ve14Yts zEvLCC*ruAtZ{jJ{A*fD{giba1oRZ^;F*^~SAJPOOh@`lU=BhEol>k6T~Dx3MR#k_+(nlZu4%xvXzqW*le zAtjb2>}VEcI?}Y{E$^qFQ5U)>sU?wC?cHUik$pzOU4bKBBbU;V%q_Eg+uCspsFBE9 z8nY7Rs}}?1hYpa8_Ui~R1HHny@DwXMaz#)0*ybJUa!v5eXT!U9bwR*SIy=DTNpLs{ zNuQkOi9Hn96^e_)D{#--6F}{bg2*CX1XzY+*Z?()mCuu%Y$gz$PH9#xSHLoUT$8aQP2ew zKy9ZR=arLn*Miy!I+LSHnSnJSC@+1ci7{a=6GAhR``E{w2XwkC@tM4Qq4ak7hi&6E z2C#rs_Lx?rXV@0^5O*=DdKwAqNI5yZO3SI|44wP~xyoF|-aY-#8nu?mW%>?mz6h4h zz5`0{`htFeW96v+#m6tj%P2gWgwa_Nl$tKsN4=!;%RV&cXNfO!f_HA%k}f1$hB=ii zL3wHqh7Y?~RhkHEDn&*f#k0lLkPWoa=9Y_#lDiq2-=SKx$C*VmE}Pg5^NquY&pIAJ z)i|6qQL@-)P^pvDUn`;{zuHu`$fsf>L4j&Ug@?LgYgLgVcLchneZ!AI@pZ;P*qrPi zPm7hSdVjnqh{fqM(2{c=Zf}C*I%xoQ}zfJgoMC2|({x*q?cnturf7^VArg4kI0sUN%g1H+T z%KnM8cW@LaGpg28t_C|RB?V3(=A@J3$JS^JXSHRfDhb~KbafjYS6eoAz&)>P3Q9oj z9Sx?Jr|P5?0^~i_-+wV6*y_o2JpZNOhFF?Hb|vMi zxaGNSQ|qp-48CX^TkT^zLlB;bU{aD34d5VTnTKxcS!bp33dxXbSu(t%*|;b090)V% zZPPGa^CYzktX-c9P;URY9Eh^dZg93km_L|Pb_2Blg9HR60Bk*fI$uXBeh=Vx(~7=) z!RUg}XWSA6`#uEDnuP?FAjKRi=RK_U6bpRsN8)7E_EIutnQ5A((5cFFS9qxf35HCe zn`y16%XWgF5h%kCFSj;)4x-pYKs!ia4yvPJ!_6n9J ze7^PMjJP?zzw3SXsFJ@8`v=ip=&T?)ckL_$NZNfAnBJci^ zV;C2|aV+_W_Q2E1uwMk)UuYKAZsfA`yD3PtQ2ar`zfpOOl0BsTS{7-g0P5+x<|m%i z<^e)SWCNY7+*-HK@7-6?xLL0r-o$Ws3Uj^IisdZb97OdPq4>9QNTM5w&zrnLTpRRM zmh00k<)azz9fQi1w(etMZ64#7cy+`#CLrUIsQ|P?2K!~0-wV7nHhb7UI;WYaXF(vb ztFV-8-PB32)9}$*sc4KMcZ`7k)c zFbZ-C>VGJErzTqfW=XVdyLa36YTLGL+qP}nwyoW^cH6eCIp@0%H)dky;XLIpsL0B! z$Sf=t%92_1tJ*xpBMpk{|NtvI)V$YcQs4D`7^2>Uyd-Y zFBA*kxAAoO)-OwIgwJb|tq*o~HzGjWBa{;d%IG(a>E-(0wxN`AE2lC36WN^_qxkT< ze>jb!*uE7ww_ofV46vD;tlxLo{6mvMzNel`uwXc-T1gjiTkRTDs^p0rtD;sEdU9#2 zLU7a8QV?CBk}~xnlIeA@B8$h&dLddq$Gk1PnPz8c<5@_YDrJJW(p#Y^K}V~oZUh=` zCP4HY3CprQFDHX<$jaf!b+8Hw79EE&V_?N<3T?^fpfLSi{3pg{a71Cqq+g*I!n8y6 zHotuGAx$#V%T3(Kx`ep;UlyJ1ZNWY*28$^!tB^{dJXJTH+Kdk)*=nnUUA*bl06nEL zMx)i(*fbcb-+iBs1`h;rw#2qyXN8=7-y$%-^tSJ$66VRnn)?*({&LgVa)==2as*0a zr&8PT4$4e|3TK`rr-GnSTCf_hjOdiDC4y%|6qBzxz09!RQe|evg;GIUKlZGI3{%(< zI6I=bGo;>BEasbIw|vc$5@#;505KBg#lZYx@(8gJ15r7*v$Pl3aZ1_`MlM~s=hk7< z#${&Tl?g7_yY!0OuXS$OB&>E+!S?ZYjW_tqtQ+-;pcEPEhk3a{J3?9Iuiq}Ib9eqG z%8+97=*K>(J`M#KkRAU(_JcgNhPSnjOYs_8ZmHTbP~iiTfv%Ka@j?wTPa;8m7UK1OYK(^ex``7zC2(FxVho*ZqIOEgsq*2r6ewv}>9g9|jhn8v4cXfKxzDs3 zu~YV^Ep*ytLl@)V=T~IsK)v3&u-PTr)hj;MzH*5(>afgq7CoBTaY{d|Gl^MVaX-Aj zd3knUQrO{X^K?=T7b4cJaGKV8t*%PjOx$Yd>GK{z29x(1oAKCfzlR`=2i6PMPIkY8 zT=!!`f3TM{vPp(ly5zRuqE-r(4W&5;S?)Q!T@L&7;NjDQcdwF1&?liU-$Jf~6qsa?Z zx^NM!$bEpBiMz;wF1oW{9`>+~R(SQb_gAPu%id1dX(tpd6Lq`oKY@1keWv60caH4Q z!SqzinWEP@bSc@*=hqvPfXF95%9VEvj1boqTJ_z)iP!73{vDOWbhCVCOdpl@J=6+-RH z!*3*t<>k(u9g|;?*^{F}+^z;(f@fvpm)W``{9_i`-uVW>Sw8%4UknS9A60pM`-V;c zx4{q`OV(l9GkqraG!@=rXUqBoG`ksa=O+vj=l)yP+jBuiiBHiUV?E5+&jA)@I5)g64S_`O%Ml<6PIwYJa{CV zxPL-CzKF}+uR@PEZm|9*U>`g2LPaw1)j3CFiDi*4(@vPp53 zC<|)Ng9O`j0{LNhS$g?EKeFoYHQJk_gj2ve6L?scZ%AQo=ao9|NXVo*LsEP~YkA2mP?=E=CGkKWW5u6yHVA)dnjNa_ zE?%s*Z+KhyVW*>taZbCbZ0Aed+@?|O7R=sQ#kcq>pO1OLT(P`Mh}xI0uiu=!lU=r( zArX~Ps%Hy}Q%j|KoJYVR)z(2n7Tbf(Zmf z`~N;&{ujFZ=kL0cp_8XRlRndbSFyHg*e3t!ME;RO{}l}H9{`8=d^q<>?}$jR9d4hp z!^q)Qr*&hnR$A;UWbE8mJ#7bnU z&d`NrqxOXPHM6pG*MW7bt|C5Es|s=zZ{EZYju&E4g(?GVQql=PNvj&R>ZoA!P34M= zs%u5WQr1XfWkU-dlp{V)Y%*z2>NLpwaffcXEzvC|>`n{2PWj2D6GWS1j;!*WH38PQ z$sy9J>6kTX1nE5%oLbpnZlwufv(_Z1G>gldwhN{kogk~-JB3vBWG9aICH%M|AcSo7 zN$(L+)a6;am*?&!SOd1Re+xvPY?_RaXjv;SYB8W*Yo&6Yh*lBFTj3(aC+I`fvEiEG9|Wzcy&7QR5k|&2KN-< zTe$$rsBFY2DwYW^07FhFbJt8IN}bLOz8a-Eq8?Pctab*Xs07oS2$5_xFaS4lfC56rlulmT3aGT$uR{GdHG?;`Dorwfm3*DvaX`)*I9(XxL6^658i= z2qc8aWvWag(HCWH@}4zbS3kS+gyV)^=5b-BUL#jIqf85&W_M!qw!mpQZfN&xrkpbc zVPeVt0!MiWf6JEaJgCxR&O#+Ytc&yCj6E(GF!!34X_*9Mp~(?^#GJw`6UN=6NrF;Z zs#;Cd7F;RhDhr-$0pWjQnU_%}CWxw@tB4r1M3pSFOLA+N>ge2qZJ{+m6?)tbK)CsW zRU^hC9-s;K-&82Pvo2_MYC9*+T=@KyK1g?C<|NO-uHIz;&EGza(qOD zJ?Ipq(EYrSvj6nH;@&(q`Ye-DG!EoRrf1hat!1fw7dtS|EWEe?&^u0B5Ehfa&eE3f zO%>*aB_*i296-7mktC|8-6Hm(PBrdPqGQyg9PQ9?YNPrqhR)2J3S?3B7g0sSXl@~e zj}vG?XcQ)@6P60?97QQLcXGh~cqfwBrBj7NVWO7tTCLR71mIT%^InO7l}Q6JB;^125NC|N9eq7K z=kb`26<9PMYw164=8E)vg6I>l-Y3}lQjSN?jX8Pjo~Xfq5asSPWFUWycTc{Twb}AZ z24(8)#hwwr8o54NT`Ip>xu@GFX^=OnA`UEL`FhJm8lE;Y>p+bLUOQDGy72RU-mC`0 zcipJ1P{3uN6^e!%xW-s9BXVH?@dvVJN97L0k~U>iW)3zDlZD)pC!Stw;(Cp{X-+@2!x$CqRF#B*N3 z?xe4PoMrd=XK{#eGx&JMiM4{c@rmx|?r9&8Hd4`T>7ZoObVSm^8`<+_ZHzKohbBYVYX=Jq}r_JNM#-3ec*YpWg9P+w_Fb%MN@Sj0l-R z{?V@3C6F5IvesO~=c_Lr{ubn&5GCnv1`*S^43~AzEDFSq2-v67guV?aaToY&5y-wb zKHK`&o?&Qj{q1buPJ1a(P$WWzw+L>TH0=?%Mf5Sf8I1%$jGP4 zcp#{20pRNu`CGAqVF5t{zb|eav*`oM<~v5xBlajfgwN^%PxlCl zKhNSnKlsH9<(IdZ?g;2B9DPNMZR!AZ-9KJawCq-?;Ozad)sox5T zIALs`!Jk1kED|LF$Y{Aj7EsIx?$^`=9*Oq3=mM44parm`_oM!ToU`7VJ4KSETtIbj6M_8P+u^%BFboR zvqsBzgu8Vzqh|cXZHr7W>?y<|OQv z*#I33bnRdU)K_6KMjujLBr4a>o68|&Hp3h|Ul>upzKme-T}@boznOF%&X+$>WHw3JKHO@5s0WlN^FOgdU@7ftk z`81#xh7-wH{=T3a3eo#JpTb9SXZ`&Y#GSVJX! zj^IN{lGj`^D`XgS*U{| zb5+h|$0%;Jge8xfuy#4Da?AvBzcv`yLzjG zvFpc#pP%1ojU6Qt8G%kk;}#^#fb|$WK>jowbA0@FmcN&DWSx7QXJq@$; ze6f=7bgTtngqG)I@gF#f*YzWKajU+hZ&YXphS`>D#v;d*jZ3GDxfqe3SQX zZCP=r(KKa~u3&noLl=h;_Z*?d^YM=8ilFL~OSI`dNG5nu&M@N{GQa~J>H~5_sMS%g8|wk}@&o8xHKLgyHr3-S<0ck>fefk-^iM`_ zPQT_JU0HqoIeiHI-=~!AK7Z&$BV(9fh{FjJP4cT+xJMN{Ric-HZyxC22{3s0Pir%v zB{}luk%630go96rjFhk8E;2iNk6?3{J?}qbcE}b$M~l(a?us`0)FP>j^dvywZk~@; z&-ZR_er9_{$)k>50@uYjysOloFR;xqme%Ub)_6QxcTw{L28$F9zXGX}Ko#tfQ5H@} zm-iH@=fRGT@&%tjc^0*t!j{L-!$gtx%UGp`l5vUUmP|%XjB$k$T_9@lw{S8n@U<`1 z3z79wr)Frk5OC1a&LMTrVeFixF#v-j)NA!#o!}x zm`IJLaE!E!=7hMPau$+%gFUnc6oS%Oqh}X}^o+9!DT{{V>wL(cfJDP=m;gblJ|al8 zS6t0MiHrrpG8}2Zb?ER|-GLI(8!mT|J*!7hge{2x`f=_;1z1yh9O69&Q(}KAQMjyl zBn&oj_!JB6!{}4<1ooy3f?SA+iy!+TfnY%{k^V5LO&()ha_}`tiq=+=N>oB>v^6zv z{4rzfKZnf#7S^y=fo!-YO;g71?=RYucQqH}JNzecBY?T?E_V9Qbtlw;AeE}8+3OI;@35D z!}bN(m-XkXYn#R?g32s_3e}#Glz2I z;|VD2?`?3FEqV3o%lAb`#B(>liN2iv-rl@9dYYowPb{A2m17rHQ+>S||EGM{Au^G# z5@vx^Y#=k!n7@LAR-q_p&VeO;Ju5!E{y&f}r}d-# zzf;Nmje?8?@mII{;DgQd*6#}30MZ<_te$h9Riim)ZKK&`V62*izfM(sN^Mlh3a{9< zJ516V2B|9gyjn$nUh)$nlwv`13OV10oMk{6(AHBf8$Aj)9^!;GLs;8Jt#z0dpz4?g z&W6Y_&cNxFH>Gp(@!XmQjMBn|RuvNcpi1!^g!Tv~YH2Iz%Z5}#=YzpzU1@jf?E3QQ zxQ^_}>*gv5X;u}i8eeZu{w!v#(PztL+7Sw_<{*poV0^_XC9Ii)Uu`Q$$s01jgvU-W zo$a+|>V0^I-jL`|1?kivy^cTwo>O)mO;EGA<7@CP1{#FcFy4#@t?@5kzzZUg{;gbM zabUO6?P-)gpq4$RAlOxtgx?%ySUFH;p=idi)?E*P`oRoYOajO% z+{acZNUp0g6=ci1Kqot98m|lkJ3AzYDF0NQLbvn=Bgela{IGCJ`ja=o&-ksH)NlMV zLsS)$mr!p}65w7cMTw7D8jWmjX~_*g7f0lkt*;|kB>;-GB6OYE(8{=JNeBrBOX*xY zkh+2_JdthOfFcTa?+PjAY{_r22Na>SD(LT_0k4Bqfdm1*2cCM&D24nAqNOg{0*v$d zw;*(7ZCej5={%HTJ7(t`(2$~oc;WL_Xox4#5`lvMR>@EL^|Rw8Uq>{Ykjwo0R$fds zJOSSfgtG+Mx*wXh1|ljNu!3LJRyE9S5bjYkn8&?5aI(##Vt*?TtC=KzLA1nn>zF<1 z2+LyYV|9ABzTd*@5T>P_eme}Qvx1*0{}iyqgG`tKEdaJ40CHO36k?mr^rD9;It$Mz z^TWAc=PgO&B*e{Yk}E#M3Wh~LDH+ty{BGqiE2>@^9F%M3yt35kT6^-2G-DrLo8jM_ z^B~3FT<{>Bzq8|7wV>5${JSx2?Ulf?RWxdLI+0p>n9-@9dYREeae%Re+#L4^ci*7~ zOsGcQ7GGwsdon=Pu$r4||U2fDu#cPP^}B=ZLor@V?y5>iEl>MXwyFaiWOx*JO^c~DDGhTITiFG&nd#1 zErP8k{UOOeMTqA41T1hMXqDUjZ}F-U3@D}{@+{m3kT2LNo^WBKt8gbnYE;wa(uln5 zn8I>92xE0tw~$;+VpPvG*i{2)ypS2n+IZkXU`67cGjiC9E9KDAsk!A1Qe8*<3HZ3l zfOOy;rhtrKWK`fI*)u1S<)H`p)wK%rlYg+L12Aj9mq~*w7JG@5U^ffwz+jroOs)zI zt}t{KY!kv3jq@|pJl`OqU|q8PMyzKTfV!6ww!7n=;qxqY3vy`yr!&tH>U$gwW>I?J;qGX=cvlAr}`gXh=Umbp*B6^3l9qZ6lK0lSz=vfE$#F zWyT!FzF=%`8AOUYIpJP&w!t^d*UEn`-7U%*f*0BR_F`q+n9L6inZyhks9Adx{T1sYSAg55>~6{BUk}9wyB|oXDkr(!)=CXz^-XnEtKXLim zX}#M|x^b7oHy?tjY0jWiZ=Pzam>He<>Kv^I#PeFSHo2um$uSD+I%Mj*vrZpms6rTF z6WSiaf$*JcZ6a$BFNDM=z^Xc&4OrG3j~<_cUM#ht zTq7Wq5Prdr+)^R41UIffP=})2ag}4i?G7JeCFB@PCCJwW1v4$DAz#mMDBZ^!U$%JI zs+sNiHCCqeaVawXWTYf4gDlzhQgPp+w=g)b&Xo)6QYAq6Bj02d6{MVFg@gqFhVqGc z!ic7ex2%f4#&Y7ysPpsU^ybxv0|38qY3m?xU7{cKh__5uT0Khhiss$n&A^emDr*$G z9?De7Z}~&exL#cQlHa;%-?r61=~ip-ly+WOys``nkq>*6-w`MhHT`m|?5_dQ3)|;* zWXOlU`@~$y?MV03N@I96Y+v@h8M0HE+gSeGKF1|uofGB(|2!Tx2J_1gB3mJ+#L_q1 z39Yr-lacWz5h)I5v1{t;aYP4;reyW%ro85CgZKX^Nq_J<9mCiZ7z<;BLn=o@wK@a?-R8P+G(y}L%P;H zHC#Ry%~#GBj_+g5Gj2~?(H-!vEC?_7WfquYcE|Y%U@c$%K>XijtG$4fX8;Be5JKSp zK(;dLGyZ=uqHpI-wx)jfvR_a+mRt@zX{m>saJ@RovDjU2{YkD zYC$cv)1S9ZT^}SMev!?l$|^YiGzrG;c*)N|VC z1DAWFyT_6HyX--ChW@XE&3?FWeZN7u!%T_N2#v(X1Eq#w^!!18^7S5#N1cYl8W|Ej z07XE$zaZK+cScUX={@zfBOzK*t#M>yR3fOa z_4kp9Y7(}1)WIT+DmlgvE_!-o1xIY@w%LbQ8-xN6v=I(~yhhGYbg2+2CT!lJkHOXo zc|2x1_|!itnRjNrSfpw2SraE4heVkF6y>qfJOgsDFGJVN`zuO~=fvcZmhs!L&+3E6 z{LOLBdXI3@%)n{>6C=vhK>zO;kq#M?y!n4(ME?%e;YqVGa5tQ@pr=mkSVp56`UmRX zbTCFP-aUHs>cw-A@J-*1Y);tuLRERQap9pYuO6MVpr{Nh{TL2$F+92qeZV7;4ujSiR#9T-EfOYPLb>j_V99a z&_CzjXJC)G)5FQp&B2+~@W_6(^1i-5F*5Ov{pC81FzaXf%fZRLWe$P?H;TMkjcX2M zG1`$qOg#BVjG2-!dvDi?%ulP( zp1hwCrcdJErJU33Ds9pu+IV$BaKmT<(#WOpck=b76wwtLIg+)s(1Xh$hK%zf4a9ak zs>Jwv@1=&cqPcBOn|+pcDjOJFQ4*uD#T0;5*UR%T)~4MlXEuqM`LT{NbhzL9u6lG)fZk{T~S_t2#cj9vtGTY1CTR<`OEf8cof;2 zt5;x~4E5{ez0YGK%vvS1QfHOx^vIk`q=YETX9n?;GH&Fs1I@Zj!<(uL%@B+9j(_ln zy{qgI5X~m6b}rBk2DKAdVzrMaAW-cLdk@A`DRPc@3MI1G z(E%x-Py*JNL=Pif^G3^3tE;H#$SW)Y8i5_=FDJ+B8PA;503}@#JgsPEwWai7Rm8Y* zD-bmb4R9aS61-aI}^$Zdyy7OI3l-2&8v_+~4;)mSOV&VumCP8%rjW_g2muT_|cdw!Xwb|Y{T zbUC~)*C<*E4mZln z@wb$n0d3->M;27lW{f+&r?AF6yd5Q%@bXBPfS`GX;sk1N841C~ z+s=wWoq~c(49OwS-fFV&Oc3IX+-TT(;v7nrBSJ8i{NLzJBk6`!+__~SAaqm+ez-AU zTC|1Lg2rmf=LO3O$II~oXWxnXff%$sVbFbDXC+RB^C9Iya*<$#Y3II0V2hSf+k}P8 zR7k?K0%SH5`D}McEU1Z83QLMmEuPqApRyv|Gj4&_K5^#}Jmx&k@i2}h@n(F$OH8>5 zy)?3G{01P6yVlApPP!1(#L;xWd%L!qNxEa9hM$T}5dt@GKI)gX|3HRS8~n=7EiqSv9nO8R z@7#F?IcT-x0Ab{BBc1f= zBnIEi#eJSHLoon|m4vEIDbQ4wXF-JJ%!c)_X0t?@{~hLtppT?EsUVE~y?tVH{8{BrsIr#)8I;~zkpaF-tRwAM>y{;$y!tGcB88V= zHDx~VF+qtu2B|y_S2$bzwvSuNrvxrhGv>Do^8+XG6B3%|#+Tw8S0u|hik0XNEP$~p zOI96n5HN+maVjSxemE8C={})TFHhNun_fQGNcwaz@VJ}lKcrQo@f#4eW*)(nEx;@+ zS6P#Z%&u0X<)BP4!Lj6|!&nyEuj3!yt@581SK-s{zXuvPmfEI_PbwZs%r-W?F-wo@ zHPgq@gUNU>*64l;WhU1l0p+nLm56~hs;ju7aTd%H{5i}m|7;mPXWDKgV@@!>Hd-i` zsLJdkEy7K>+x*;2JB$ez*EXVnun0ytC`Q~Em80fPjW9ZxB}-;A=trhF>CcUX(J!e+2?*y98Xb9~{qym97hC_}Sg$75rS~A>%6{I5Q*5lT_`UE|S9t-P+n1t!3t(It& z#nb^zi;%H?MXKMKQQ&5LMr_k>*9))1$<4+xyTD?ZpO?$vq?k!L2)0Q*ydKT*$~eCs zE{;e-S3%0iBY_oVOL$A2#vb0O~dJkz%5lXwyj33AhFMXr|s z%oN^0by7yH7Po2Fq7m3HMA>UmA2KDfkk%~qTT5+<3XLHf94y|{NEEDbR79V}TdUhz z6+3CyUEuSt7I!k?>(~Kmb4}Een{F|wnF7w(^?rHrxwSuV7E-RJ1&sq>IgZYSYq$8; zkm_W)(uxW1fyUKns;eH!BAfFOgv8CH(wHFfB%nHZv3Yx;qHFIuAc(TV9_f}l%)~DBI z;3HB4*UHPkX5cDE+T@()dI%pKjLwaO>ttn(Y=7!msr5NX>A z8qZu3hqQDmPVm?a47t3F%)CyNgTV(7jmI2@G&cIfxHyuJ;p{f|-rR*N7YLX};tRFJ zvzA_d`0c4`QFbE@G7VdIOZe5TzlG$CREk?B-65?=(Y}1&_eCjb$K|Lm>)AM=9^vf zF81$16G!7pZ5e_8pXIg%#HK4e3Vo~Pyx90AbhF!mdvYJ<{tCJt*|3l{WTZTWk{>2I z*^_YBnAb^0YH2&iq!3-45Y$W06sP<2NCTJZfkrCjHd63%oC3$rAZDVv*MLai*;Bab zR7Zi5LuV=#QG&ozz?mG1aDKol#D10SVG9DEwPW}gtL=xRm;MZU|IJZIr_n@EJ3@5T zP@trjn_}6J^FT_snmi~W)R7A)i&4v86Xc;9i-;bX5EbYED(=twgD(PcbApmSV4uZd z@35yaCENo1$aO&!38PCI+^{VET({ZzZA7 zu`AwR((GRM92sZXG#DnWxeqnt^IGF{RUH|e2OOmOv zs;n&64iklv0lE}{1C(I-lNL9KQS-IpJeI=@kXA16l2X^&utaKZ&~CA-?xj#(wqYwK zn50S%Bk6f8!MLX)W*F7oFfW)6ipm2e_*C7iIea}&+pStZYX!k#e^RHdG6XI(q1u+R z-;}2EvD!4t$H(ksnAjbdGtkJQ@R~44zbJS}JLuW-Lu%I*761IK?pDx(@d4hpU_ovB z9;Rtbnq-M`tK$q{Hq=f&dS?eH<{2pOSKaTe0_X7?v{q`wT0Dt-u-0j5dDx}JKZ0lt zTEfbCO7egTwR7_G&(sPX0e~b0%be0oM&v&AGyrd-+$Q0qY7u4Sfw(FeY!+)=L_RST z@!BNy@b5Y^x-`H)#r@fx3}OXX4zhjk>u@Lp5{gK-0&d!+rWAdF|KQRMsY_1F>O~mM zII#I`60tDN^XmEFN$ePi9H%&!?Ib81;>5gLv9xu1E2woEDEmVt@fLHlglwHI(ljs+ z9o8^{#>DMYv&$V2>_g%IefCd;_Z2XmScHR$0Qco>Ev`)`#_!)zsVZLn(hV@H0bUcl zRYP;kR}mW|;2uA)n%ftG{znpfc_XRw^wFo(p|h|^^3{idv*dLusaC=$1MW$(^Rno~ ziT-XZKASmxMmQittX+*q27EUFg(OD9qPN4Vu|=bERc}XT&+ns(>`lRx^6qMBAJT7#lQG2?Z{W>63JDfXOw+ zVK``5gxr%-y*!2s84sp_3-CHmE^-vWxPs)SI;hHei2+85N)$@Py0pE1t4ldlQ z=E1>{?%Q}j4o;ke)KGu?Ts#E6hoR3u-+bT?*I!<2qwD@$sZYJ!yzcx3PJ@{RwQ$k7 z-dCE>?7pSe@NaFy<01&0o6d`ExY}Tk?HS|F2IikEG*X{uRd8&7ZNjR#x?3>>7S3=q zci0?TH04wUdX=lt{8^w}>f$_S9&IA?z~m_(+K@&VyktUJUpw5Y@V*-2+cVDA&T3<$ zJ6i>~d0(X5=rH@c3seOX8MXZ-(#e8H>EBgTl7hOh6d5|QbLtHDE>zk{sIl0RM|)=* zMtgekv2ItA-T`#~9GgnFSb1Tqc8>K0ItGP+{qxF~=QPXeq9I=_wNNNrH;vJ&rM{Ao zV{$p$$*<5ih6<-DAjw<*DfaEwyPQGmicdESj}|n_K*Uvk`k$y=7VwC+spUa`)WYq2c|9+vgdf zVcE%#7McOLOu1sab=1oJ-TuL|}CG|GJ(e2(TSMl5ie_)mZfVbt9|w{C4{TagM-)08D}( zuS}f4x9=4b^OP}WLcFqT0#;LT>WC%_Is^_EQb`>3u2LvT$eu-Y6VIB63al3Ixh%v6 z+VZz^+BH(SPmFr)U6ni&8y3Snj)U00bcdw8*4X43WL0Cm=J|o08T2AyHXqN{h=Dh9A)Iq!c&<8n%_1|uZ{d9T`EnEHbF;JO{uHdbjz7bD z`fvB2!F#RxdUTQI{-{4RuJ&^f!{I_WtpSuQfGZ{zGN)M*X982I0~iNSIgIED95H23 z{e*nQe4srEk;sshiQ<_mm?+PPvID|(Z~!B!-2w@=45ky+>OfQtFVW714G2u2Ga`&E zCW%RXMNo3-4TK|KTaOUqLs*7oG0SSB&&fM-xX6_uGA zxm!7{C64BRm?WU9nO5M!3Mm2BXjgL7T8%rrguIb}@Fj|PaCTHtnE{uu9 zd_M!Fzvky#vquGrg3+0P_jQwn^ZR?r{nF-mRn8Df}37>2b7@<6`!J_-O(3sZeh z#sw`-S{j8BnV@2|yf($ZY@XfNTV}9?<#6>y)_dM|CD>cP!8MJNUYQh2X|T7CEvaBj zWZq~EIgc_>dxKF(#wccIUASP8yIbh&rOme~IdO2(BVs{8v|tU)=wCpQ7f-s#xBm&h zEp1Ze5IV$O)&PxS@!s)q{iZYg?zFXW?n$vo$5~x?MgHSj`RrpMtdK?SPT8=1w`y#Zw3~OaUM*fe0;BND~*sZ=J-M5_;SvH7(cs4=EKs4+axu zhLC!1Q``gM>D)Dx2G;qy8);*;M~UNZb)-i3QIu4~#aG5GEtsit%NkmRF@kqZBzmDR zl7wyruol_M8u~FY$*EpmHOFRm#%5zHIj6@Z(=a2Rjv6GU{siezZ1Di}mC$JOz%{5` z-FW!%VzQY~=iM4Ty3zm@DPv?Nwfby0d`|ST8)#IaUXr03RX1h(c~*F2WG6#~oXUC* zk8j)2R2iDFsu9E`?l8lM?D$CQB{?-;dz||!k1&Z^gA`#@=bu0aK<dI^(ejAKF;p5y|~N-a$^q6P2oyI zGmUKih)RK3AfElI_kZc0 zUK?z|9U3mTLM@wn4AfcJBoQ<5rpNys=SnVBmE%g`qX>1d^OO$ruxX7}7 z&wpsT=Wl5TgOPvcL#z^Xe_Ii48ZQ~37rE`iE0Jg0)xjfoLxgFIco6huQh2LIpUkeC zJ8re7yS*$tU|YB!q4`|d^c+<>1zU$7u0V`Me9;Al)~{BHg9?+FwX^po<%|s+WR1R) zY$39aw>7gvq$=-(%sh0GQ$+lEx!0h!wO{C{-X(5J$e`5grE!sQxNNdd?txz{@NtN@ zs-$-BvH1dG2F17D@{}fi+z)@1R1*ySI3`@&_*|V;pM1y3ZOSMjX=hM;#AGV1>YYE> zDb~y|m2a9_0X$Dc$Y-YaDbu1a$Rr0nlHjkVEnP|Kx@Kd}|wV6d9Jn!x_`u za{cDI`R>Rz8>@@W$X$l}7OvlN1>cCGgI!v11$Vn|BliCMQ`z>5EfM!(>RcZ4QR-~3 zGgZFbl0uz)dFQ2}QCW?$npf2%1NqH0uD9A^OHz&Xs?D|bTKcqYV~1k9tJ1-LT}YNND%@Ei2eVCN)zhXG?oKK@&p<7gHyCV;e(f=TsF&wuJ5bJ`m}>%qTo5Sp|xi>03h5LJ$)+QH*p4_Fv8|n7uZcmpC|R_u!0yUP5vv zvi-ggNVx6wB0YL>m=7FYrR5o)qYjV-xHzi3)2iq?Y@A#+XX8p$yL9-eoY`}-@Xh5=qm*=NShMwo8CpYE(Mzu9uKbwZ zqQ08vptT>3gu-5xYW+qGs#(TGxKhnpovKaloYUE)%^L2am_E^26M*fyXX{Zenf1Dk zZWSO<$IWJV8r7sgg)__RccK*F6i*Yjf99B>f!gQ8O%+x+DlqDFQfte?-ky9+7A|&a z7Wczjt>ygC)M{(~-b3Vp!xNfWLYa1_Fh~-kaMAB(+VMm|X51;+>@zIgWILtC7&`_t zYb?gYMfLk;1Li62LTMomnMk9M48nRYD>uj}hBj>^H`EhE;X!REI7oZ|SNV%UDE!ru zHF~5ljD=MKKlKtqoa~kN=%hKfRK&8Of}=ZAQFbf)4={#;ENeXOI?sIybo4go#H8SFhH{$;y^I&Z>WAp3tBlmM4&N~SHdT?J* z0rk5|%cP(Y;sn7AJF)8zA_yx9P#w`Be1elyqc2p-wybyp;OnyfVv|}%gf);BZ>Pj9 z3pYL#E+=JyI)J4IATnU1#Q|EX9bfko{{In^*dH-jnPpTx{t*-4kC>SMlbD$Qy^d_< z7ZuR_E(2U?mixg)93nX#z;rQ<{eJ{DnoRdT3R9pr^Zy7**Gtkl`=IqvOFEUcDcz^HciJ_rfRDnb^17nw3(Gi?Zf)iz zhC6%?5wB@FP#R9Q;+`6CSKZQ&ZNxQr@G>#O-KO6Bfa1BwCA}h5m1!I9I=yyohm8Or zZ?kmnEn2HmJ_POYH#GV}3CS&uc$Sj5#@J7kAefHSY?G~li^I~7^X;3i+d zZ( zu4Kt~aGcjt8I_b)6IpXtO{Db$cOyA^Ea@)=!7<wXC27-b_rx>H(XIGiv ze#37;#j>dc2>oof@#i(k%rM_@Y$m4TRtiL&$6hjc{eB?a-y%}1V3Gc%?=TQ`-S?+N z0`)?p5?xX}0g4j}h0)L)I-a3L$-7O73JL{)aFda#Gr=NXlxJ*&$dB&6jC`RpX-lP1 z#v=>?$xobt$Yq}8oU4daUVa!d9~YB1h~WN5BE=X`#O4{dxD9?hGHv4!>~x&2Jv;=n zFJzJ}6VpWqM#bovruZq`N1T>`FQoesG=T#u$(*pp8~)yQ^cdCk6&!!PtS{&T=eLTi zsfh>S1pf>xvn!r)DA>bg7T5h0igP4Z{<(to6{EPe3XIfiep|gG=ND zBl-c3QZ7dx}Z&c(=gOgTW_LP0Z`_yriy+tS>;P*9tKpC4OJ~3Yk zD+&2~do+g3Solt9h_)?f*f^uzq{-D-yo34(+U0oqNOZ^>3IXHLeW4mXB3kpxPeDbN zJFr=2h*};ve9K+sQ289pbW31sOXSJ9!{{8gFv}kt4b3HDZ5cq#XlrK^C9=!puB}fy zdh1T2kE6SKC{TA*YB)E6i*ZaYL5^iV6VUJ zn8OPPsc}a>MDInQ&3YsHAI$W7PDP1RESGf9Qs^qo#Uh+m7|1}6B&#z*1Y;@H2Z%yT z!w~F8gqT9mq#I-X&Py=Hdco~R#p)LKa^FvLERnhkq8AH{r05g&io13fDYPAp=Mebz{*~w!Z*NKn%-0*=w_A*` z%-H*0eO|vLuc8u;0sf`Dj(fq>Bc2mMGG zI$Oxvo0!^=GX1x7VwAS!QH78`O6mB@MX3eQ(3_Q@>5$a&tbO7`pt$;nO210Tw2lhb z>0D)AV4VAx$dkrn<^C>;c3zKSIuw7c?`mSX^W8o_fB$fPf&Knfii^|Z*G@+;1Y{If z@%2EzG^8kG9n_k;-*MJch)ahOg$a8RiD@ zAWhrIW{aUrJcu80=ngYZKY7JkctFj`8|t*&xTVx-+I}se44w{ACqN7%b`S|W%s`ri zEI>tuY^0T!@wFU|>Zap+EsN2{kAgde945R9rpMh!9K!|a6{kFJY)iw?Z;B@*qgBx% ztBIX+7cg#s3p+w>u=stWHIViqU+^6WYxGvnS@!mS-_~Eg`Kn1EF~BKr9*Nl&VUM_q z;&aPrX!G#pei3-rZC-PSl+=9$3GERs9zJS^!vgJriCz3ct3%Y%=N5DS%EpX|^~N-G zH+_o+*#RwYGi@|80_zb?5iMc3MV!|N**a7`jrR%r_uw-$MaIN~gMd)}`HAL#8~lG% zP1S8>T-854{7ZwOW_c+cafvIHZ4#16jaC#y6jE@BEGVojuIPT^#`gg;j;1x0YoSrc zY{w-5!BK2+-`%&3XZuvv(D;I+@h#`eT<@8u9PgPm|IfDzcMxOB z3alX-UCtP5>eB1VAWH}qYVLTb-Nscfx{zWI0h;6$Rh`l7AY2%`%41RL5N)Fz^@ae^ z8xKHvTWD|z(g;99%|TpLKxtr<4+0y)p4ua-;I|ob(-4xJZTge!AbSp*@%R(1xouDZ z#V)t$w#$37r8*~|tX`HrDLz+jQ*wdH)Q!8L+kt1$fnN2RlOc19{0Xl25Ep&BF-F@i zcfHAM#=XbZX_d>8E7d>7kUZ0=hpnjjqOL18!I{sF){ddt?mAnbVS8R|`WUEl>19?i z)DxkRnNKmsGkBAHc>N;fnBqP8t8y9wo5TF4V^4hHIqu(XC7l-_vXhx-b54l|gYiL6He3R@KjYN!N zc760{*Ggw&4h1FJTV+8`WOC#ZlmmF7pN4G{we1}~SCiekI_Zmz zhy+@+2SnkB-Bbsm!`ttp44z;dV~c4OB*&hO47~8*GFTmLPq#+Pr3Bjv{PF{>+Pc2Jz!0?+NK7i4W=O=W+7&_qzQtmL z9y9SOq3WAk3k&x%d*6Yz;KO zX7NV!MJjc!TQgY?VRlPsgZQCWJIQiMBugvXDm91|cnr%fq3ZMX0_(dbFQ8FQf8JO@ zg3xNNOG02J|7jjFJ~HP3;b)Pg*esN#vqceMe)N#I`***@5k;@c=AcqJ3Qi-^6E>FU zZwL|*7U*`1CUi4l;(q-N)ISM|-R2V_uJZ5Vc4WdSmxv#vW)Uuu zp;{@59wcFOJqQ>i-W-sgL|@w$W4}3KGeFFL5bKI)BhL>=p%cy5Vku1a0yhFS&B;;9ZWK{8sRD z-zn7&{5g@)PgJM3^vhf9mLDLzkIZMA!+{go0n2KK(LVqH#jtOsU^JKrI@c5BC;V_f zi-lx5VzMK5@(nQVq*TL$U%wLS(#X8I455{gQj;DEyvR1t6((wu9{VfZXQeOk{LuAz95Ww}O?1H) zf!VJquA{eJXS12#gVXo{vS(YhGe``zDcC4o z{h=o5^}6~5ZkehTa-z#5@-ql{yD6bggWd-+$DQkDAb?+GSJEwK5pLRv=F1-?#Wpam zROo4aZ1yg$eAh3%TnG|_Z=JftuHupf5hvXi978EPx!2b3G=-l8rNsW0DLTVRAUtLHj58%^bz4S znIoo;M25*E@H1qE^MVK>%S_%&_8pk&s1X3|s zGAnlgLqluU(<%QI> z6JQL2io?NCn3NJX-x)x97dKgOVh$2Y7J4?1{Eo7(a-AUr0c5o+%?0qbnFy z@nQp^Cz-S#5wyf8~i3i>`XEgrSJUIWSp^G5RuE#2F~5nVYy<-0dfuOHkFn za?{SsM^-o;ck3rR z#3{5mAt47I1l@0vSVI%nqx9XO7)cJlrIq&WEQA-v`Qx>gqwl@HgJIZHtz_EG$oUNr zaWe?`E`H9S?N%*f^QBqyR}!vdv2?Qi>}JSsY1B7yOc;KG0`8n1Bp=3N*JhA^UX+@4 zK2fjYcYS=d3wJ&fg4pFNF3E4*ZjK%jaT{|$I0j%#oxWW(=W>Hn$~f5+aRN~k-?b~ zcHWtkw(ZMsZbL_w!^cMMk%B5D6D2G7d-@n$-su3%L#pVsTWVTIwp1 zIYvsu);N0NQvI)oyp$Roh?1)W7IjQ}!FZ!?tnc8PIGxwZ*g&=+$1-5owI;m10mY(b zX*YT^opwA#eY(H$Aht`DhxFjA$wvpUtwDK^)vsVTjk!D6ovl0UN%dW7P^i0ZcO`v( zF1QJXo%T#-kSiNA1re>fLl51mJwOxP8HYadO4>t%mEO8NC`{#DY%q+oaQAL?U`+a) zo6If8b5or3JS)`}dwNP>mHm}=(xJN?mkZu~-x;>8q1kDty&VdDXySt3LMHGL|1e+D zO?VSJp6)Qd$IFiPdrK;OkI=6{q1HOUlECmxkPTf3#${@LQJSE&GLYN#3LS_@M!L&hVWA%}CE)lB|s*s(8N8w28P zyaLRWGKG_tX@F<|)M>0HW2dP^mLwsIC|A?A05!H3Y+VL!HMcOkK&4D|ZK&>g6x5iE zzPe-dY28lu-qTm<)0+B>-0K8In3dDn|HPqjUQ9Vek}c8E_K~1H!vxFFX|-DCw&Ubd zBV)fNVFXe)7s6j0e>d|R05(Wzu?d)~OSb*$7W)Z%6n;s)SS-3QWAv;T$IoT~CWd+Y-%Trnqqq}8!TAdyX(NlzURzkP*8`;1Gyo5E4Q z|LCngsi~by!X;G0`VHiiwsQNdFDSGBk;|g*!9^u8`YVCDM{1m6Vu|?rU2CTG^804! zCP6R%byt|bp_J8g8|J38cbBD^rac9fXY?aspP@b9v(e544xL0aLYsfI#2c;JJq?%( zUWVv}B`Y)p%-L7&+Cnl9O)kcmmQZtg3y39FJ1MBOX<@Z$m#IR(k-LsGg1hP~BKsY# zSKmNh|L@Cba{Y51ljGOi-Zx|0-1;1FmJPZ6X)GN;GV={aC5llbBU_E(d zJoAq12`|mXXfV!Sr9-3nQHI**<8I9L0&#N1I8`#&w3bqaGS?48yHL_#8}u~M&PK?L zHse6Is}`c9Qu!Q8f1{{TtIxiXZ-*khW05nsd#<9gqj2&!eu@Nad$xe{8pO&rdgLP>B6X z8ttj%g)D1->uT7}O7d9C`fcIjWdHpt;x+wq)mM0lF#MT>U?9%{+~4fs6GDE!ZmC@i z#s98wS=!~#(`4jH5xE=!o3adl#=lQ68Ir>^eUKrlGIsz$WTt*6OeiDKOk4&uAG8IV zS5Rc?HkMVDtC$5%blc|ds#Cx z7(3461$+)@`Amr2Ulo4Ls~W5htC7l960|jajq~`uPvgP4(~@T~ZaH;SLcQ2tgO}t< zpqjho&zqNNPjZc&Am5gsi5eQ~h#c7*HTR7JKNnDlMmve=8&m7xxSm*SuYk*(EonL3fhcKscgM=}?-8^$Yx* zFnIr~Bb2lTj@#mNX{P=T!!@yv=Njy2e=N*T?9o{FEzcv5{h0lGb}& za}QX-@avJ?m8YL$v3UWfEs?ip!WJ-BBD%cB)M)Z4a|dg}gnu}WpJQaj+UTUU)Q1** zbsNT;_{)sCvALs)BBvn`K5`?`dA9{9zfoM{9JXZtL%A+?c>amm5+#OI3KbhRL&1GK z_)8mJ4=>MT6AuiU)5Xym`fnjQj--S9lL9+)_{r>_d)VTF0v=|iRTRbJG5*67Ym$6s zVV(WB9yp#ev4kLbJ|EiVi|X@y^jMCV}RZ$1r>(hNt}K zccnAa)d!NWaFX!abE2f{F!X9mMQYr#=}J-*)gv*qDWx@yjHc_n3~Hef$w4%!Iguuj zW2AK2aU0{9RfF|K{UC;0nl#MD66zZ>H0@fGdX6@OGKxUBC${2-Q3I=XP-&t3SeFVQ zT!@4?o&Su>eR8>lHywjrM)J_1mKd$ATd2zkOXL7I!S8W#2wSG2S>xV=K39mp9#YSMoDx9~u$ zxnsQVEm7GTVPr*;r>3r;-{;O0E?_X_y3q2-o7M5ji}j1;D4gZSi0WbIJLlwqnU}bB zKS@>S3P`tlj3$%Hx5-@06gW3#)fxm)lg-FvcAQ)cOE=##Pa8SRgFOSn6ohxLc3y#$ zn6DN#iH*7nsU0>RA%yu=gI-R76jPY1{wMOI-r9|TsQxK4Z64=x_L1KI&~gLf?5kU>Te9!tIG z%W48rN87Owd|_7*+Yd&B)D!0EvD2!snmtO&*A>yAB@(JAM7gQt4tJP3D^n*WE{Fw< z`-a5HLVQAOXbf?`MSDRPd?WS<%{BBAyTSSWttZfQfH#n7V~|r9b8+ljB%a-_bLACg z`fytM;7WUpKGLZDJ>dgS>NVu$gp~}+3}_*V$u};H7eq#c~YU7qB~BL6_{RAx!|TdvCxDLDv^p5(tp^RX0CX zwfygoK0h>2t;g;RP)0nZSi0L)eY_`9cap+jj0tCj%-MAg`0R7wdG~wLNq4x&k>a*V z^-6bi58@A-Tq36WZ`m4YR>pFS&t1ZgvJR;zI;iArWDS3gNT>JHk}#(?jj5jp(lOby zj9&fAMEan%4RQM??2u6Z`DFc{LjRAzt7@yGs-t}%gvc;Qiw1uaZpd#qFk;d2UQ|Gf zurvnL4@8!>xuj=@1dhx6FcIEGY(eyGI3=!aRJ%~_N)?z`_BAtt+f}-Cn91;c{CI4$ z=c?O&f58kuJ7xZLQxXCJ?QR0MQyVQrJJBBQZ75?PNt=OmIoWJ(>JwTwIJO%YVm~CV zH^L0VJYyg_0D#_>@*p)vt3vr<6205N=uccgy2}H-%_6ZjT+)&vP6nKOsT}mwb#84h zy2V$w?EqHLucO=0?k>Kj? zwC=#&U~>WPbQ@w{ei`i1*mAS7GG5uNr&DdiujSv+)!aVl%(^tMKcV5fZXJ#NVc|f5 z&%g|x8jdk2u~pwbYapx5A&D}+-f4!xHj1>3Z}@$aF%#|vb=Mb*L8p+QnNJKZX|$>2 z;P;-hQM(uQDcm62B|ZB#`GpVdRua3uloVh+bL}?B(|zq>{MhIfO6kenWy=A6ofyC4 zO~?@PcOvqr2I5xb8I~FyzCfW37!QXC$Gt9^4Tp7GwNzbRV9pt&rket`@LlH`)w6+& zii}>1cI-?OkaFy~Ah`@27($5l9-alq@_CfKt0cc?BTqG0)tk7#8XJ_SpvD-SH_TjR zfWQQ?*goW-rcoMVI$@r_W4w`^Po)t?Ur-o8vOIssXL63=nixcFg~E=8wTf1+4Vk>9 z=6V{k$4KghGko{}tmx3uJ;UqPaY+e+gH=QOEKCpIX&5)~?do@C@^5T9JGD*{VGfkq=8U8agms84r5FOkxk`;>)AE6Un)A z1ZI3L(LIA0@orkY^epl#yinq~A!pt@q|+^SvOZI591B@NSJ=}dV*?6DhrKKNX zQHcrek-n!xn*${B#z;`xn+Qb&u|feB7jghoK&-#ze2q|>c6*dp+B0jyYq*|_*aD-9 z&QtgicmKw*iD@#k=>8^jfuP%fIq40G3=%di*%Ok5@o|bd{&%F!H@u+S;=LDK3QZ&! z{{FID)}YyIt_#0Mz;jUHwX^^5ASCdKNzKamor^yFy@_DVRH@@)nKY(Q9o@=_@c3U2 zFy$rv;+y_(!}3o7VfqinL)p~P)zr?|^l#)y`3E`VgfSLCs0c$_n`I>tq4i6TRQS-K zBdlO0goF-%*+8z=uffNH9q9K%Lz5152*9}h&{U-?fkJ2YAG?Epi{FLD6Kss>9i&C7 zQNPQ#T5kx7LWcrN5D+GujU7s@Bcd&BPH*n#@BHiO`7N$)8-x|9-NB(FTypB{S7cOG zdudkWUv4czEo^vr5fx*Fm!e(=m4ZFrbof_hZ!t~5b?W1*a=lFOC)t(KBY>2!S3G~g zbE{xOPf|HS1*OSQ4rRnrq+pR3xL6H|LEWuF{!%207A`_(a?PaOR7Qpx&O|#&lf!d7^K1l*bl7&QQ&g0@7qh-`PJn8SEmXUE8{nssV&(xtWw)Xc24-c8 zV|`)28ZA1+Sy4X&!-gC8lyE2J3GvZKgJltez67FjxhE&WEC9I{Y#V^j!Ao1ve@VCt z{$&vdYlwLbj==2=&8eXUjK-FFqF9Or^i%MnmuRGL=IZ%#W%TiIUYeQV_ID$DM3r_m zJK{dsua{o#_rSP<@9G)0dv0RhBOR!7al=fZD6?gr%~RYpv@iPK-e2iqdRt)6P|ILA z$7`%p^_foDf(-;|#j(o@>=&@78ib3~+E=WbKFl@nLitv&c2=(pwFw_Rlf>@KqS<(i zat`acoMZQS>7&ah(-|up$zS8JdJF}A!8|eE+#nvWGg-VaSb$>2e4xl>7~j~Nzkiqi zdq$B#=hdVC$tF0+|J;lIEu;QtPsUpLPd@Q!!>j|xq(x~9Z<`UneW9if7lxq2a0uzI z(B~$iMS_!*1q<4jzXgj$m>P@rdlKi`k~O|yRIuh*vvHf{J383vdU-ipcLy2NP?`He z7iqSUIv5_L7){k4+=chVIfCx6krsu>NkFY|9d0ZY7&(ga5n`Na3?!MpNe-NqEmKd` zJH+y8#H~f*>3mab&s=?K)}3u`hA`LFaPHjYy6guB3>I5vZJ`ay@Se42Y3+Vrce0sw z&?)HQ)zDhU0CG5HT6BSDKH1ml_9!4-iWsF3Ws|!Be^pyX4R7YK?baS!W7IU8;se^$ zTvw83`;AuDnWNw;D(@%vHf!tQci&Qh_}i#}bDzHC&?ho=xZi9U=H=^XBHT!`q|{)% z4a)T{@)k7x2XXLXA6+vJj9vEOLFU}-hNrULy633ugZarE$1#JVcVNRS!>G-uOnkei zDhR*=5BR+d5V%hcxi zZNQN-y=00|L*Cq!ngY$vo(c%GmYk5-iLt&5hV_J_yVUxUmEC85yxSq_&Xd6(K}cHj zVmWg}Q4)C*UYW{g3x7r~=JFze?@1N?#`UwT@W^QQfpGKb0I;nc>S?=FgYW{>YxAWC z5n^)}D5zC~SNCQNAD|b? zW%AwBZeNtmDwWqAPo;fNTt*0Qm-Rr-oOQP60a*mSadGfuEBAD+wvpR z(GpM+QXBA%QLwgIe8z7>Ls}gdF&S0ke%O;jXGUA<{KC^6f@7*flx8GN-_VvDS|_H3 z_C#(4kz~1TwJJ^zcoZ2ivJq>cXQ3G}yI6IZ&t;BT&2Nffp{dIdv)7tln>t0FOITR; z;cu=)CC-VjLcLu;u4iMa(Ni?;v@$XF)ybN&!J@)>L~CkE4)|Rwxi|rIs?ABZY?yO! zEKYA*n+mV_iB|R*VrKCu3Hq?x>ImA)&my}q4LxlzJ}^bvB(^M>!x_3p&n&d z<>Mxe79vpbf!r4rwJW2*FX@IUTfga>!SSF3^nS4;>in2?yDbUcA1h+G4cDw!vJu?R z|9PnTn{ow3QNaNs*}TIIwYYvQ8}aL7i{T7!Bx_GD+{RW_{#sku{ZQKqkZP zDEZPvvCVCF{#B)%NQZOG*RIZ2BZ<#D1O`McTqYY39`scx)`9knvmH-yLvLuW~^ zHipzt{AzHwz+NX$ZSXZhmJR%c;?|s2-xQ)7wd%XR2!N&o&;^$DiYt2?$V1nVo%aOq z(1qWHH-qQ8J-=1H1U`QMu#!{0y+#pkqgff-^c>sl9oy99ccR_OHwr}({{lL-i*Ts~ z{qli}!1;E?8Lsvo5vCF!=5cUtm%vbv@#A-_AB|*KxwYe|L=ZQd2wzqq{dB?so7G^O z%KcUO0Y}A@`<%R<+%9G|IYUo-9LqroBBBF^{|?^AK>lKTl8Gl2okw6fccR_5Q?!DE zUO*1{X&~SM1%1@DaX}nDdysPNgaSTeww+n-wW0*?D_x4N2e1=K^JE|f=bn^iZvSh) zqHrE#;;GB!S;Utw31mBoGj>|4`7?oeUiuOr1zoOl=)(3|;=abyBha@0))s z^Cjx*&ZsNcpZL1njm-w?vG%K9k&WYNAt9hjzkW&Awh`9}x{CjX@v^EH?>=mWZj;Gw zduh8sexln-xn-eE?iZ!N7;l_%kb^7E_ucC%p!#WI7o|D!wGbA({Du|m-TC5&@|~KO ze7B7MT_&8Le)kBpIqC)z)MW?y=C&A79-3DE?FKG4*j+4dhYI-kT-^T> zZIpc|Hg&*ql5BLl8qdc?8sf&NlCfxIw%G%RKfLGjBRVI8rOcI%-2lD_m?-BQjG%%z zWBH4fW0@3xtHP?XBWkzbL9~oU5DnY#`n-q=Agi3J6(k&vUl`x(1KN&fs(T0x72P6L{>I+GlUMfU1Wg?7)5VWbqUY zsrgc);L-vsCyDU*9wpr81sv9$Q@Hs{L`bPMW_!W9b%-H^Y0RM@4L0^=VKP<0gh07@45>i5Rzx2q z0|$&Fw)S;*w0DDKX)3z0MK8WbpV=*y-IxdHAhX+Ueu)0$GyKT#q~632C!tGa=0yxS zY=%8DXoksWI=|65O;0n4=bmVRoj5pnY3$2sIl0JA9TKT;$qNrnYc3Ki!Uwh9rQ=Rx zr$zLX*k>o=KX^;=&q^B zFO-RBp6c#2D_-z`3{+@}peJ?gx}C%jb<=lv|1?MJI;Lvf9~~+eg-XJ&#luD;%x;s~ zb;cgp#Bw?i?G9YyJ)OCGk!C!%@X-?&#oo4QqFwkIKMO9@Q;o zMmpPA3~J_1VILI}5-Dow7G-amhhFs~mIq;sL{4aC8=5r|8q0$V^y|_n=Bk`BuE9$O zGIxUx0<>=5IQm0SVgK)pE{(4GOlbv{00D-}@kFU8ZI6_IN?C<7hLfm;2bx|;;ID-Z z_MVD?s?ya0lH5gl`PoTSRbDJ^zvo&6Ip$=3X44#$Y(AY~Jos8Cpe@mA77n@`)H4qv7s`** zGj4!k1{EGHj#??`fHb#a@6}~~wC(VFZA&#lO3ug{%O0`S&m2QKxVrg*Jb5=C2y^hM zYpv_gHTciH=dFs_!#9hIUmKs-tNhRa>J&RsT(+T)T9~kU@oa~^RTkAwXuU5ekzj(` zutnEqZ9eWYC1Q|k73FI({~Qw+0@{MO2iq}>47 zgF)K4WJ7~_lFiwnFZd3=%vD{QA>F+x;_3qGhj|O7!?)y$Ps9HKMKfAgK(3KB8aJjX zgcIa?Kek_cR{ojp^4fr79j*$h3dRKXAzJlWy8NkN@)3nVOgk4kW*7eWWY`z#+!yRD zu*++(&#QrBK1iGmPX}v38`^Xdwqv6AtjYGH9z@s%Vz*is;|T1y$>GsBKOjl;$_z}k+pux5QP_|PeR!2aW}J#g4leL3U>uYkQIPihSgRr3S-)5-Zq}-tjagTH%mepB<63NUz}mjb zA(WVHdfqytJo>c@rw2Di{Z^plaaQEKe$YWi*r@MtMI(9G@K>>MTYJnVNA2(tT6XQ4 zhO7;?R#F?^A*%q5;fQ5Jm!_iC!Pxn-X{?b|#!!1SinaDZyYBE!s;nGoAC{lzUKhY+ z$~j*ceMa6mbfa8x(zqEiy67BQE5n%B&ix;E;H`_tWj&O?b*=)>{Qpke7M(EUr#~aq zPq_cQx%m&`{=+d*`ya;y4vu6OA+m&00+26KQ&aPknz+>f#G06WH5Fku9y}?7GlOz9 zYvJeHZ@EuF{nr332ot(0YuDxF#}Y)}W5g3@^`{JM;V)FT%;q!v=KkJS_WEXipHGkY zAe+x(BbLz;oFuyt*rHIAlq2QQZrLfcXeDFx^ZQKRY6>iLnQ?IGduGRelU?a`7V zWJ42*q3t15&_@%B!6DIF(NYqrMWC7Bx?(U#WLPK*%&mjT@d@+MuwPD$s7g(>%t>`n z&NPX9R0ph4^vqWY_Qq9&*PC>eZLY?Zwa%#+Xhpn~19 z*XA-VuR!CF5S4>D>#-so!PfdgZ93&KAduc8^mL}O$hx zxAvh-!aEX^z?Y9N=FS&i8Va`>8s0+goYKgSPA%*3ZHn0M0|AHpePQ%J||!M<#31Q&fDA%ZpjL|f`=>g z$(HLQo$3>*2wGyOzW{AMj+=+1=mBS?ys2-cB)q00u5@&}@B^)jk}b*7!toM|g$K*8 zw=|hsgZ0iA{qc4LD=a@nFg80oc(zR;QySeV6CGdx2&dS8{_;guEJPZU zgzMY4B$X_#`{N%a#y$(ZCRm*XJ1}PG=Y!gNH=KYsv5Tgk$a|0LFw=N_L7S^2yOlv; zoaHfyG1bibTH^rIp*BwC&*M~p%{iY8T73&|) za-fa}LVcejcgM&})z`(qRCau73>dgCJi2U^HwRRnq`;`4!f!1%Lzp0RJ(3HYYBh2A~MhXRb_HyDPF(|W4HG!+CP0EEn0tX#1duhNZ0+b^^q!< z*(1}s)QX~GvujIGC`&sh${J@(YB6Hk)P;pG1Nl5ZFUd{esR(?1h_}$cqNecFvIYY+ z_6IT3fdw6UjHo*yST#N>ASqXVjvfTF2lSyAqTP2ge&Alo3)Pf=MRsh3Hu*P3X;iMF zS8NdqYB>N-K2fBhe-1A~qx4ZA3CGa@{<`uAoSN$3vp&-73y?SU#T#}t!& zZsD8N2?{)M-kc}JfnTC7Ic@n<=7!YApXkr2<*%{d`ett?k{%|4i;i2mIf4A#sNX;1 zfpggx-C=aj2TSC0Nfv zyvO)zL+BW|VBM#BSA>#3qaXQJ)~_ASkw=FWT~@lCf){$w*63gLbhwCa*?&bNHiJyH2AbrFkZ=6xv$7Sz`)bRodBl_th+iDwhXo^s_oU!I~ zU(K4}ruMk*mEXbc>7}m0Rl%m+!=i{5P@k%NqYUl>P0_+4Ojf=~`L&|#7cQY4me|rx zHf1GpgcwR|#Uy#;{zzF6NTGWl#NeOv!l!%Mt=MV^&)LPbcmcIb+z=dQ)*6Jh=nB+b zsfN*@Yh_|psuzXQVhx=$%$dV0&Al)DXWQ(r&jC@Wd0!A9|9|&7crMLxGAVU}Qm&QaMOMbBq?=E(KYvyx-Ev`79%k zf7bX9#Ax%0BkOqRwBLq3vn;(SQBv1bL~(5TTy0&+F>L$!yuulPuR&=g*oeUbNhAzO zVbG6=UGP$vF#0`pkiw#vM@ZU3CKXxtBa!6CBqrOb_i+IGkvY07QELQ zot?Gz$D)I5u(_Exn0)3pto?PFttYzX8ga`5v&lAtEciUSVZye-dfa*# z8l63r^uK;|>>_7ou>Qizbaih@K57-8!TWe42aK(n99IpyO*HWBkwhoqEI1rEvS}xr z$OdDEXp3Se|Bx7=>iC++B>JrjVZ=)0SYa*}7Y3n7c0?8;sh!MNs^3K!TDiHjj>qDuL`JIc~AnwJ` zwyi{SEL1j6zlHpo6Z-xeIg{u39vnX2LKS6vNxXjO8Zu<-rCcsk`-H{;FNQOaQf`kj z2gQ`P(*f?<H7aI%(Q3oLDgEw$B0!P1Vj z=Lh69-6?`6v{CC zIPS+b7i!0OmT?7{)kb<5R(+N8)O|(c7#H2R0iiYN^Wc1S_ z)JH+{4v&)yIje^u&!D4fQ#HcT4N2O6RjZec1@=;287M z#KgGBnui0mS({5xtok@0!G8)GS@_;iOiY6-n7E)NN#3@Sy(MpG&r)9diP|CwqzGrr$b)sAtCuQLi? zTfS>nu5$n-95o$~{m<5n`Mu3$&V75`6-f<72X7f_k*Q<*$^z*MkXKhf%f4)ch^YxflH_ zF5WKfQcWbkT`Xa{bJ%acb z3!2klC@Ro@{|%QZhzbw`!P7z+)k1>|SQO6!mlzMPC5I~!7y+-on7i-asdp2L8BX4D zJWMv~fd}G~F(b>LNfGzE{2$KVDM+-g*%B?=wr$(CZQI^u+qP}nwryjV?W+F%+o#Vx z=#JZQAJ)r!S`jmIjLgU}a@O8H%+DozFtvy2$7x6v_fa4zCr)6&sUs^N2C?pZk7*7g zC~ORv3erKhI^ZhNLC1~85So=E0+w*Ev|F)2L%c%~r~#yX3<2@bq5uG*;#y_9mV|z0 z>{{dYRtiT^Gz>-7KJ2y58~;-k0s^wP^A(S_7{K?*DKZF4n^WMKxOCR^MjwU1>c+sc zt(YHT*l-{!!=PQY;NyHE+ay0`n8^_?WH?GinD(_CP9$xxAsIpnuN+Du-a=`dL8G2F zh{T9*gaZ(YT&O154nYQCpnU#~Q-TPG4Iwzs!mJdH8VLt|mkaVt{EKN;h+sw8AjddJ zsZ?|IPD?L(_ffp&p261;2J$zMLJgmeoX-HcluF*9) z)WM=I&f;W)cst>N4-cimnnevr&9qpRAys43ue9hYo8|~-h?(V(t53uPWD(zh7emAs ze^1DVRL>-TzNvg4eo{o|Ctj8!^RhiMM#PtJPsw+5jxOR&cLeP%iTQyJD|oU$>zq1X zX^g2)NMa;2y7neE+{V;9G(yv(Mk^YSa?k6#zwDdLILk^u(H>0=^cT7o6I0Npz5tuk zrD#NI6qrXgAdp-S78Rk~T=<@2X~w3ZINI|qLUw>)12O|`+DFQ1eAya%LM*2g(~Ml1 z22Zl+!|6gxw!&O?KocU^lAYp1Cf`!l%L*09>STNMX^yL$nX7nkMTDgloTWz^(`>c+ zugOF)lLSB7DHiZ@t80^7k4wx$ho{1tMe%)(!a7y1;{%8AjfY;f3pm@ipO@crwH1r- zds>XO^OgbS(M$inu(4)E6y z!5XCV)fDO(JBci;xb53+O>>i;JBc<&qSlTk8`^q8XMAZ_v#WjK7qv zc_0@+DMVOBu*=+;2DRIo+;*o$n?%*6_J5_4jcBbDqFl>^;PGe9{UnZN%Q@xw)SEb|8_`R!wg_zkgo&?l5bXv-kL>t0^`6~_de zBR%huXq;pkQnP6?>`)%?KD3KE|HJJzpVP$|gQV=&^Gh|{Pcq4cZ70kXHo~s3yXF9m zl(yt|3v%q}Yu_Hrc|?aKNK_B_c#gvg!X;|dBW%Q*S)YWHmM}`klJvYo@*IDRmo$5$ z%!{3?_dsI%Zi> zv1r7VNb9DYLfwPnKvf;;Hcn1WQ| zllCWssfJlshIM9{gj41N+hKEw2q&KuChg%q+$C2fARlJW7xN|6Wt_N@`)+pgw%xvykaV-vjhc8l!3f1{Rd(Le8=i=8Cyp{iVw1e zD`*vchGTl5jwF>Lvl~oZI;n&onTEiBw7vd|SSegtu%Uqf09yX{M(6)Ptp95~_3z4Z zU3p|d6kcU1cTM#u&=L4z0%#k>&iptGWML9Q%j9q)?`*rWseQNBj2)yW`1il!furF1 zvR{g$+|tUKkpr@3H?tl3&NtcmeSQD@)R-_hayx6lR(gx$7$LWL(O&~RXt*1rg+Oz| zi9sgeiv$%WuW5$UwHM4tZAoc{WNf7f^By_n^R#YEWF<=y!noIt)YEP7sEq&_%>Mlw z3eqRF=_M6}#$^j@LN1*?R4#-u&3yP`sX%lyznVX7)Xi-TlCrMyj541sqlEm2g43!f zJob2z48&!RPaG&aGGtUO^+IPo#bv?`w6d2~LoI*Fwnj+X(Y(=FtC^lc4>a6SVgckSa-CCeZsV=SdOYv&{TJ@boCE*M#1tJXnesV!6X%_n`=xIs08!U zHn|Vfri!~{N>aoLu(U~-Y$**d8(s$zX*C;XO2>yOH)Qy=OTeonm%sZ>9pHo* z;Idt02MZR`&lkRyEt!5mk0;VG_I{vVDc|%8c~OF!E0*r?!uFGt8ldpRSfiLGx{qV& zKQlw|E7nH)2;a}3qwwX6NSJ#pm`PLLMo!HrK;Zk8W_6ikj7|^lzeHO^eEFSMR@v?_K&U-<;{GF zgo%bU`wh+SQUisNY{M!v#-anrp!(DrstXZiP`!$Gw8EE8PG)R;Y1uiNS<-YRg%j&E zl*n15(86u7>U@f3^19k33Kr6MBMSt?zCHMV8yDtD66UL^;afuohNrN!qWZR zWIp4Z-OWcH*xOAqp#{G%&Byd&o2M`Zl2Z-c;4mvg#MCgXjO@ajr64;=G{=iN#gT3` zkZUYgsKOc#I!db^*lM{4o<_P3xy-}NbS}Nu7e+%)IzEb%@stx+%WE8bM?$l zScU^lHoWIz_tp{3JGzC%5_m%~2Kl7&8gi*bIi|f%EDkeL!BtZ;R+a3LOm+Mo+S{^NOZ88 zHWueYtf72NxYQZ3sxo6#&y@#kHx~8v75f=r*qkw&T4hMx%|PH3;s*1lIAPGgoY_$0 z3;ThUjh9B9n47bNSqHm+Sg9{3AKY9vs#L@R&6ThReJC5!bV>E+E?Uxr_^gvoLzC9Z zN@%u3=&o}B&P$d5m@BO6Ca^fE&{tlOd^w&5=`Ed>7ZMviSCJ!Jm{@ zu&nTk(P|aXy0Z=@z5@8WdyZf37ZSR#r}zua5-MV%QaR=REI{~9h~X%pK6acOq(~&#hD|;Loy++)glHr@PZ^>u2&*$ z1*hP3<*Y7zrJ7^VT86_d^5rXXo3N?2UGiF#-Foko>2?9OcMD-#1#ZDFGR93|KhJ~D znaeM9MpbhAebmMm31)O3+1HAgCK%f#$u6S*xgeCVbuP_)&@M&)i7pHMeRH79)j}-O z^~uMM+?y>Dsg~ld4|Kzp{-cq#F>6tC3nFiZX1F*59=nG$lk-_*MXMK9=l;!6BrY z?&Oir1=qrTdRq7&VdtEpaMzr?eE0MGm1EpZjOpz{-s3sk%za+Bx4zS-eZRjy==}(% zN#_HWxaNuB2QK6<2R4broE14~heA;3_ZcF(iJSGYQ8Z`Qf3dmbMKYcbq;$--Yd?w12q|o zO!QG*z1M%X@pm&!vbq}|VKy-s6TP#c@@i{R+xe~2bhs`us#9&hP_MCJ0|v zvtTF+Uo$ATcaHI&{b3wfa;m|>a|aE05{k)7>VqYsS8sxz$B(P|3sawZQQ zit9Eykw#M`N7dhqGZwU8U~sDnUM;j{YR4Cd%6j#~4H9kVdbPCd$dJhBs8Q|+94b*m zf85*T2_dq(JJn8e^JVjosIH?{GWAc7Vr>=+&gozz>%cr2XY1{~K9+l~G2bx2VRVLq z1K{rp0^;iR$6SHg9hL;ZG%3k2V{bA`V<~}`(it6~+hDf^700S$IYS4%WMO$n$~8p8 zQ0Nq4PHRoDTnjhNk11Thby#4rhYYykd2;XZO^7{vGYqmIc@)-w z<>m$3kU}E6LuW{l*B!+|^B-Z7{9F@?FEYB?6)A!`}&+)du1ZozYS8-V#&@M;(A@N#~78`>rP-IZi| zkn8CTB;tT!B1j_sD>V9aKE$3fSoTKhTo^NNJ_fV1=o?YM@>?X5QWoi-PbpC()-Yer zB=p5mYw1*f-sxTTD&pwIZM~SOx?eywz6#Jo*ToYO0RnkbQgT zR-+$ZV^FzrFs~BKd?*`>72z3+1OjoDAnbBE9%sc0#XMd-Ad^`{B1Qr2TaMB$ulGOb zxrF{nce5AXUou<(fKX8Y0J{Hkx{Lk$vGV^s`Jb7-;tA=Yz0zVp)`*}qFn#*Z!Hk-}K>}+w^GfTnlk?|!ER{smDtbu{+;#{+ox+<(X;DUw}!j+W^K(Q=0> zZVShQd$(Xe2aaOUTJ@{E`_`!+{NB#cFU}tyIom5_VobGL{yZ$?$rlwLVP6pQkAxQd z*%9%Z1)nbve$vXLlb>Tph<9>{n%=KJq~?9q*pPUDm@-DzMi57FBP>zB|fS zEpTg;R@;F#l&^g1L}VXEAAJq}_)*xyTSDY*I08S~KKa8Ndd6oN)DI25U+iz?AwA9; z-H#H>C*#F?O5`sY?=M|@U+S3O_z}P9RiDXzALv(1;4iVaZ`I)~$WIT%XCKv%-~j(* z<4^HnUdb&L`@C{)a4;ti;ktMBSg+|E|ND`x*dwKNwY z(LV%jK&NckAw`YCwFD?XFO?#NqE(V8UZ4cdBdZrOX#y3tpIW6-uxLf7PaOAJ;gTw3 zKJ`(DI)$Znj*~L$+E0OvoRbDlzw}O3lj2??rAnpSua)l#Ril0`6hi0JPko4zH)M@c zsb&!btcUu>p+`)@3K!mB*;HwT%OJ#;!dBTFu_EtEwNllrSwdTFWTjA%fa{-$V&&GK zb*N*n6eXmsYBf{D_Q1VQYn3)@ySQ094;R9P;3S;T%f}m8Uthppc?leFPRFY?kb??4 zDu60vC=&+;Twv?Tf)*XTb!m<0z&x0pDZzmTAAGb0R6xjk7AB3)b3M9q*~(P*QR?X@ z?P~36T(-BizNm2h>e{OEd5Mq>%MIKGj9MVjUROwq2OIjC?z2GRsq8H4Dw_juIAEeL z>zuT=c6|Hf-h9{Jt+hA$_XW&P%YA^vx5i%hlPvg9OJCaB98A*62X>|VCdBfnw>0x~ z^P?0dc?O&9)9Nc{OS?*2%ezK-tR`T#)iXE1RFi4u4NTuvdF$yoi~GxUMi!!~6nVR? zXmstc&fe~Cb(LMEErR0eG*(;F%2}PY?QX0BqZgKRiuqh_;q2aeJb^Z^SL27Q>`cw+ zO=-MF_Cwnnmj|HsmXED3bftZzrA3`-qOy%~4sFfzmIqjCUb5c7$>XQi7R@1>zP5JH zd8Yt@nxC+bY|GxcX8J1g#A5%>_UhtA-R`nNU%(&Es_&oGW15&58_n(>%A6!+@=;kL z=|GV)prR!{+ev@h)nS1EdvR%>st9fC@v@QUfB^-9+BT5GZwM)lMcnh7wGDN8vGI$A zuF#M5tuEq&T>|#hjUHY>O-18qI8k6nHy1ZqQ+XB!4vGarW?$zuxgPG`9TB51Z!`S0 zA;;fd!CVhP4y7gh@X;p^pY~C{{l9RaMhz!O(5cci8aKCbVlN<_LOg0F(1@&oqc)G5 zFCjR_)a?WqaHDI)CMngMq4B!N7lxIAp#~cESXk$aMZQUKO#y58n`ryvBlRm8 zxVP}52s|$%=UzvsIQwp4PaY$qChl1qLrLaS-qoUH{6l0}oExJOE(8d#*Vn7yv?-=x zz`)U&P1=D(Ne$x~LHh`FK}={#3f6a+k>J9py?68exhfoB?|!_2Tm9=F zaSerX?5If5DmE~oPo)yx#wHZo#%tEI0NPp>T=Ej-m5T8gSx-G*;g^l+Ne5-=v-t-d zRzQ#k%}I+)l7a+yaiwpm-{Gt~Neic1Qj83*qaluBpN*p#LYE6(p`ETn5$Tr-U_tNV zS^hJW)0Q#*M(g%P6(7W;P2oc1`WyT@=NlM7NbpY~fx0$k(o4j1v+D*Sdl)+y=dt32 zpCYe}Y?A+!s4J#RqSVR+z%6tLm-5r8+!*0tU>=Q;7Z6p#gh8#`Oyy%&#bw2t5v2Wp zFW!p(uFgs{q%yE3Zm3uqjC<0K<;{53z&6gc^b^@9m|i;0D$$Ca%>*uxB;=fYnXr`G zw|bRp7jl#h4t#f#`ntB4={4>vjAuS2__ zDHG`<{L{sTdcx>EAM8Sa6IYEDvXN6_MgLXXwv`q6^7{%Hl$@h9yOWT#LQqRKaoc>_ z9xIfCq+3!hGZ&J!g{owqD$XC+u#=;dD2U%hhfsBo(km5aLMoIAQ#Q=QlTT{)?^1Gi z*OMHzbY;P5+-XsQuPUU}8%rG#OV-gnMCkkcExDED^)*NQ9D!-_ z0=fs-S|TXJ`Q;Dqo?$6tY116H`~sU@)bz)agWGV?A}TO=U8?QmaW& zqh(Ya>7?2W?Do+8n9iI-2KWEJc{uy$c=wCps0kd69s&s!%SX4xb^Pi*M!ULs+aw*j>4Ex>|Oi zL$kOuev1&&#d1}KpUSG8g%$4UL4udFj$=HI#ZVlyMRmK8sM}hHY7^snwpted#sbwO z+N3l(Y0_wp;sCLD(I{L12w_z@&|R$()YnujC;*pcjhxRHyDcjhVvIRtDW12Bc~OWH z^NOe`VbJB17G7H8f@o>nGZoW1+C`3j6%ReM1Exv}tlZwgSYIpY>JW0dUFe#8g$v#u zNaw~mQ2kq=phCVO&b6I9GU_?P*lq#Lu|S z)Ksiot~8v(g|D9G_&%AxzrbPak+^$^nY)Z0@9xJkOQ3`h-tU$ z*=Cx{=2)6jvpDnE&?JpmGyjaWBfxHz9tKxSRC6I!s#_3XKr{MgHpEBa^4>}$UzBxj z1{*bBut58uD|F4q-&DPHPTa`dwrC5rQ@eocLY~Ks$%ib_{a!BSz7PX3RhIlM7B5xv z&DxoDgIF1NKk3QI(Aeip$rGYtWcD!zHlwEr9p}Y)C10>z>)vowJon+)DNhl~$^$*c z(v3mC;DBv+rZdWg{+wGZsp16Fl{bXMOVH4a#cuILz&i{+BuVWRg135($Y?(E;jw~g zj!XSiE|!-+#^R}?Gp%@%yL^v~gb9BCjkRh}6UyzFCYD!Bt|^AK-~cdGahcV7x^_x65m?9)!ag1Lo-D*jQ;Uf;v~f5!tg05_()EF1QI;T!1X!z}BPFIhC}x z$`Wm;QzXC8M5(wAV+O@rw($6583Q*jSUd1jI;nWfHB2e=PNMqfd7mK5y%tqak`{oGexB=m}^LGbbnMLk{Pj ztyvBZJXTUnhQS!FWIk9duLS)M{?($!M3oS|z(m~Ap;H(0NPp|r$ou_meR*#QCkt)oRtvl{v2P#+{9 z6Y5Cjiyb3sF8;IIN|JW1bf)nA496)Yp`&||Wtne)d_x5geXC;XlT@CQ)emHcvUkMW zr)deMbUjUwbk6CcGvb{S)3OU$=I$vj)!LnkMJwwz|`GG2M5N2DVI$to1*&L@HN zq!xNZz`P(vV#3vPR^ZK!xW{4#sdD2NIgmz)?3RDD~4E#oadn z1sdHnmDnAC^i!9qg|*RPo$fW-GYTs509ZYO>`g%0g#o>QvwJHb$ZmLf$+TRbiA0di zOQl*fdJ7^0(6p%*@Ud22gMM|L(gF1JU1H=Ui60Rd8Sudmck zvN64)d#NjZ6$|d?U06M$dq>kIt?tCiNUu+w@=75R%@ghLjt-(5u+4+tF$_;z~H;Ba|_r~+}Ul2P_z&9Of7<`zw9p}i<;VTCy(9B?08#X|b zTiZy%YMR7FI_}g{yD9)bK)}B+EqP{87n!d(tC=kMb}1fdwivld_LR5xfBfk$#-EXV ztm-(${WclP$gmM>MvlI1Dz!5oZ(f4qT}8_-`m=z)=%S5uZzv9s*S$uj36d|c;A!Qh0Qc6jDW^7jU-r%=OPVR;2)jthKvz;pbo#b!NGVi;yyVtx$NX($*h; zBjCqWc0+*-_GS2m;u#B{c$E8IBY7Mi{SSU}%V-zN#pF;~g?C|lgDicg zWgt?sVo?SxY2~spF={DDE0p{2LRmH{h8V*-7VZUnFj0e+dm<&+6>+k__b6JUX}eHd z%Ir6&&~MarP6bl*Nbk!p@-96&$)1E5)KYOS5G#A>pH^~K5IKAVCAd>tGv0l8Dc*gVh|-qRh3qZsl$a^$ zMQ~;lb_cL8h+RN`)p`lL{PvSTzkocT!MS$XJLj8U(C(~Y^!q(}TL;#mzQ%zpj30LF z?76$Xt$nRfKieR6<}ZA<^{G3*O@oBXKASs`p5_^dU~RH?2@-+dEnqY8Yp2I-nSLJg&DKT6HwA z>I0l3UUcYa_ks|0ljy348Z3mffG_S8?MFvIesm_4fyX;1f-z>W4sh5)<@XG07hf#h zuVon!o#3eVnD*cZ$?&GRK$~&H#7o{>MTJ=Zzwa>RVFdOlIC$nii1WpMvxwdS9vOm3uOQPI{;0UK%wq;84UHfw zMDc4KRwz8L#&v6&RxEUnlhwI~@vBUiwJa6xpm$=5YinW^w&_-LuZHPg%UPk2dFL(4Ee<8H{Qce;X5BIf3+@)JmT8 z44&}ZYNan`m_6~GYUM9_=FfW+%_Pcyh*sS)DjbzTSHK2z;HNqcAeN*1;p&>G8t$~R z!ugCv$u>t3HI7mgu_<3sy>hamd%fi`v-%;l0jCa5-v5gIY+g+80X=UQ#0;99r7Buz zv<2e@I79DT))l>`@)%szj&g6c_r6iE?962W{NZ7G*qsBVuWPUWtGN43W5xs&0$VbM zB~rb}Xu;`*(74W`UI;#Gm=wK)r(xLrD%@nb+>Y{h-QN$GY7CuxELoXTuAP&u`p~03 z#K#x=^B(o8%jc>N_^Jrspsy>y=LT-txXP)YxP0K~%5u&S5l4hvrXIO_MD8A02dHn* z=#94V{ebCZ_TbO+FvKF97@Ab~~7VgzJly?GV2{0wT*2u5})0TdK?uyJpz!Vc)H? zAJ+xYO@UQUro{u&c2L?9T2IWkJDYAy?(YDAXnoWnMlo;slHOIx_qw>c5x?$OV)&3g z)Sq)xAJikutNkGl?%dh?V2^M1f-G%K73ivam{oJM%d@ra!xMiO!0b6|KIHJ1#@;AL z(pTMy?8pWYAP8N1Fa#aageWgHhpz{N3QVbeIXIHx+fF6(dkP!e(0And&4FItzGel? zkXFV!di<+4GKELw?*Iyh1T#O%zeC66MULcYC}$6 z0I7Sb@kxKJ$>fpZ?7YKP^eGz7%Re)kUurxhyNvBNOh#P6u)7c))g*?O zYzv7tsEh!_iBvW~*6CI$h~^Qfgv#Cat;*X2%G>YmGJ;Mm)^dX20)}?}-#jA}I(#r2 z;Ji5BTv_X%Y;eL2yzXR)@dB?i@)yKLW!io5SV0;OY zyOJ8Fnx#s;|Jfc>&Jcr^}v?zpSz2?gZBN!^8@i4UfZ90;~J~3 zt8ep7A^nqN`p)NepuHZ%-_PegR^RrW4P|3y8F_D`H%IM2mm74}So2(8eAbY5=6I!R z?$JAm=!!1h)?#CBV+sj$ zYIE->9LR3VGWXkx8Ro(J+ ztUOJc*8xJdKZIMd+sN1+O1tytnnOoCTVF>%<8qQ0&|J3v85b{>i(TdPA)neE$8P$N z=dBd3bu)_^weAru&FJaR#j~H_)>~L`=f*FsB@Ok@r3;?H( z=?LM=aq|7hLJVMeEZn&)VifZc+09$9EZT`DkrM@7izF4@9U4uG^{Da}CY%8<21O4|~8 z)n!cELMPtMYIh5rn+zqN`To-JM0~02jgEV>jW&Z^c9u4c&+Qp8t0SS!pxEm!dLft9 z3)CC;SPc=lN45~g%&qlJ)yA1M>yvOTBMy}**~a$lTDFO*&Q|dbS^f#@MGHvo1VyBw zS*Fdy4oykmt4rHw=CGM%6Lh17b_&CW@3oDN9;r17MrY1RXOlXH!qx+VDGCy*qfB#b z5s7%p$voPTG;=AbG;~uI6NimU-7eVlV^533+vIo}%749g8>3EQc8~U{Tz$C!*&X$2 zJ;VvRt^m$%!4WbiV})Y@ab$pIg_GcX$&MYH@K`pdjo1f}tU{S5;7ym|%oo_oi?1CJ zT}jfKf?d0YAXsT6oD5l42U$4axuaRiV9+!ODYbneOfT+xN)n%h4T~W9$Lk^> z%<_G|0kDU~)}d;=Z9#|>386& zF61<%@lPZi*lmiv3Q}%@*swz7I`fJKfDsD84gK)~eV!oOBk|7eK0vlbShl6- z1{rvPU!Bwa5_6fGyK`N4M}0M;)$4K8F=_zXz@pXC6lbNaYYqVBw7Uuhj5*dg6dF&$ z;FP7TK`~PkR86w3NTwLHA|@D)OcG3r>#;*JTgx{@yqA$l!Y$k&<#R^wYxlB-b_ zl2w7Cns^+{{^>P@sFNiKw_1s9WVyXuuJlIEkETF z-RZox5I%GEIUU=)R~z|^D|DF1`HZd&@tA}|9<{{}w!%)Zm$Gmq`0AU&#v z-g|`aUNF4-3X+SC;l&QZ!Va>Mq*<&)^ctaV1qi>=%YGow_V~k`-qwmKLb5%tPOy+X zNbp~sNhh)fT8i)5|NcjT;=d-YwJLjTF(3c{O3?pX56J(Txc*CBq4ckvW6m!BO)J_-L92lLRHpmg64P_Vg9vf&1stHOB z6FJgX{+K!Az}QoAd)}oLqs>j$)>3Gz-U5o%I6K-{#4$8)e6Q7_RO=Y}_D`2jrb(%< z<=HYx8=CM`I`T)dt+k_Mqg#d5HOsoqNt?&Mj#H|5kJmaG_7h9^)Po$Z3C>_l9aHEr z1-8(a$u{|2sVDhpH8Pjkl038a*wtCJ4W_}3UD$1*oKdDV@KJY*nAoEo1no(SQFxuK zq0U{Va|px@L#MvKA~g;7HnSoPT5Gj6+R4yt8{KdO748ps+dFVVMAOmMdm$fT9jxg1pS)y_F@RvP<)Vj8?3T4E4)ZbMcQ97MKco= zqO)Xc+8^)QN7SX_ddU6wX94J+Y|{()#n7we8{C~@8syi&G{;cK!Q19F;t(@f3?y6) zPuM;2QgNtZhL`B^O)viJn&ldvKErT0oEPf`N*G0dp!oaix%0oFU4*qrUO@ zFZ{Gqh{z-a&*a=S@LWr)G%05rcdu(|ujHFa4RP82d?ms&n@DQ)whBCSZ+dlZ_sYX} zV`*7hdcBcW=u03MH^Wcu3EB(Nh3g@^tPkCGz&&73xF}CrnkT$d+=L)Q<{QGsa$5fvS{ zk1Vl~?|5ci#LOWVUodk^?+i6|L?YdM@&prP*m`{lxP8r|(e{;Xq1Axk1g`k&K&&x#$+Ob4Y!KQN0Ea06Ty<0+9RWbIxrdoz%Rrof@+8 z=ne_9MA-GlOmt2Kf15h%WR)aSB3S5TJfm&W`$>3b@E?phF;Jx*Snv z3F`~{)!^wF@$vlmals5jo9@xqyzgf&$Xk-xa#c8}-0~571jn*<3WuiIfn>ngu03ED z-Z5Gt^L@eWI=_4It#|z27zxi{%TG%*A4zaA;vR;!w-bADjz+xi5aihB)~C!=RV|`D z^|Gjpl;);!GRZ*vB+S=|7X=_XgIS5w&EltCZP?0lWX^1qFE~Pe`TDD?gfDA^jEZky zh1bV4PFloHY@FMcgzSe2(tnO?6Jv#MXm#8sEbR_Vm0R2w*Jw>|9wxuocJCSCTCn{t zt-V2+`9^iGN8x>9%u7~R{wuaEH83O_0s#Qff&u{W{$F96f}xY4t*MKtlkfWX>-Pet5BMOXL1{i2>Lf+*JsB^GAd=3cz{)%uV!6Xi zr;isJ^s_No8^jVW9qJ9J3NgW`zIa4!$)0$=a9OrP9YYDXe$1+~7U+Z#)>zqTq?>9~ zb|(lecWk3CqJdAsh1mQN+OU>l&5dZ2MXW5-dFUj_cZdmVAs>jngP{BFf7X4DH!NBw z9^IRyv1Ke)o0yKTYVTdQSZxdOo^9h@Jf;p9>Y=66r5&40_Jsn*sCL~$cUn0zq>yOZ z*47N+^vqT~IshACAc-nbPacj7E-X%-=a6a>iu9aEN?=~GR|_h288%i= zV}H4|VaA#rBoL$35!fC4b4;T%1`GU%c4IU!D7$Th!6B)wy7=r4OQY2uMjASSyadf} z!-f^0Vr1S_!2K8OrwCY_g++Mirh(9}*uF0_)X~ioCW_ZIKh<#zkp?`NeEXT>qqUm_%|Je8QJRB?uj&Y!dPQK9eH#p>unn_574PHS!S6 ze2uNyJ96Tf1Y`HD5JDNkG#t>iW^}#O?k1ZIM8q7&8kiLGm%n4Q3=n=NfOQ!_7`Hz$ zMhxJYasRZsi9X)I*Dh+G9~B?+7`X#?p>aD_%0zkD!aMALj@?bmm3X;-c)1f20D$}d zZ|weCUKZ>wPV%4tBDDBIBz1V+-@z6QdoQc;yewnLb9td}f{YI|wO5!$jvNumwh zNAU~)0_cAf%&r?!Fn@1i{)Ybw`OIx#0PQfrbTOZO^v*r%C4D{5MWq4M8uoyqJ1hyH zk0!N;%(;3S5(GeYyfZ~edYi@z&_z&s*BEQfGK0ZvuQFQiQwSw9)E&XvacS#}KSHms(OR!`&={jA0Kg z8E~uZs9@CoKlnC&^XVfe%>)4 z+N=-rW%?aMDxU5lA7~nJho_TBhWC#1>Y)YPeOcbvPa{SNi?LNhJGnQT6`VM@?@)o{ zUf0Hz9Hj?P*mLn9tSYsKKTY^pZdw0@iP7G!NQ~*cKAX$}j9@KZq&8`?|D{#8HI0iu~j^P6{L~LuTU~av(%|$K*N?93gHJkA%p;E0QDYen0Ns~M6Ak&n2+NVYK(O7ky8*U@$5AcMfT5m=GrINgnd@qbZ^)5T| zLVitPx+mmYyzdvm!VDc?C&nRLABOj!DBwUn&LCp-$N_{ojlP7kUp(lg_l9h@Dnz$u z&gP$93O>8X&5%VVtr}D5MbY1Bs7*_y$GpEXv;4Grq4p`8PXA2f;#%;qDdP5A; zV0Idx0Xnpr{!&Xt#LQl^#rwB_9}v&qR7tTGU=AT z7Domheu~C*E6g8rJ8u^`%bFQ8jn^#m!nuww^`eWVy&!M|(^FuVv`VvEr0Xt=1w0Jc zl6W5dgYHN<>@DD_)WrWtuHl9ci**{RCurU!fk&W-vnhPk6h5L54lQA%$OyCSLLBM~ zbI3$Uz7Rm&ylCNrS`lw8Fb9T|k2QV!+1@=E4uQj0gxTDgc_8lyDIx z@PPCHa2A*jS-4QDm3Jp z5+3z1fMN6{wJTNO2<5j$9c=1pJk?~X zL;$r~A}To^paHE$O0)w65V#^Z(7%V~AlXKe?c%015PtI_I+p7wsCOf+cLN>&N~R%b zcKtqN_D!7A_v|Wh6iFf(bC$E~tm~_H&wb+O`PJSJ03#St1X}E`BhYQciBCgxq^S(e zk)RftP`EKuFgye5Ad6Yx8v-P16V<5-NsvW9DdD{$#G^!ohJvH!NMR&tC|QM>izGhVD@Z@N3E)?DkgAAYgbd966p#Ici7IK7l=0l;f+xdpqg*#K|41)s(w<$oW3pcZLYZJ() zZ@U|pwMo6&tX1(q8)2jGfGKP0%1n&LWCM(|aeG~12;R_kGT+=z)!{Vq3P6RNkYl&u7-kU$F2HB9}ZQvTYZrYX=D zc$gzO+ezMUStk#z4`-u#?C1OM(etl-a%EGU6~5A1A4cu^(qUysH^}J|P8s4N-bP$;d1Pyj9mBzph&dHd=>w{6rJ znKOJ5{;3=-t()Z)r?SyfUI8v%4ryz8Ue4mnq8{c43>u`J0Hlk(0Qy0|i0Fx={!$5$Z@fV6Cz@VV zE|NgEzB@eB-OrHM0KY%C1W*2wyN?iuXjq1b*leP=5_7_}C5dNn6M#wN1A#>Hf#7*O zkSxBP`1$f=qJ^3z*n}&x7R%$rgAWjsc$vd!J0pys@cZUnL#h>=54B4}8Jwq*api!{z~i=y$1U8>EYl9m)H`i9>nw zSECyQKps#l^1&azbdH$up?&fr>(Ks!Uw&=1jT^45T?)_m| zb@-4Eycgomv^Wr<2ZhUjUh)4kG{#2CO6CIs00;mB08ss(p;6M#*v8ewRKd{P^xwUo ziF?vV0tjP$*h?>3MX9;DWw~YWqMIMYXH8-Bla4}&4N8JHrncf;SV{F8sUP~3*${l& z_zr%_9N5yg2*D&KY|Pw`Gv;KUukRP|{)f4=l=(~v(Y<5CR#l>7f9!kp+|FQ>IJqjW3NchNZmKEG1F9!KX`ysdm z`liJmlRDb|bU~$Tpq{Tbq7;J+-K))|um4VzK4Wo|lEe<0B)_IM@1i-p7ScI7%c3qC z{+?z(Mex9LC|Qc(Vm6nkt>S~~Zp8qAbO$kz^q`NE5XM%U`q$Vw`_0CiD^5kuG<6r> zcb{25yOZfziTdmm;7y1I?!9cd|Dk1P!z0AHgm=Kof=_RkXD-_~g-}~`~MW|&i_`u{~H^sf4bwS;{I-58M~R6&Qxh* zb*&A|InNSKG5J z6B58Vq$G9dji8XObO*pkA0-Rgkc&7}qQn~#3OHUocs4+d-BSP@SCcyXit6)G?LS5J z_9x&p;5233wUeb^dd;RMn>OxmW*ql1^^J<#hS}ew-gLAxJByI|P-dLX9*1#DG^*i> z-x3p>5W+cnMRnh~rd1+RhH1eug?Kp%;Sh4kHF@+GbPeMQoyvzXxcG3iU~*b>roO)+ zT9#l^+H+%%;gGT2zNDB+dogD`=1k#{v<0PZ4Kxr+uhvcFD#>&LVaT4Ox27g~Iby`j zajnjhF*cpoqpLS*o35KVdBvw~RAZ57Ah7L(>ke}DlIvb=X~XP@($>f#HJcYoEXtqROAsIY!Wu+8o#aBT`-j-K8bf2 zb4(lD2S%}`aMSHn5i`Yzm~mM7xTsh^;n~hEq(ss$>9{Ykt8CLA0O*M@6V{sa-m^(- zEOO{xt)MeQcUYw}axH=-Y39hPb|(TxkK@-GSf8?CbBlJU#L_H-vpGCZ5QCc()f~PU zRa#=>7S*YmK}wZO#ct6vie#j!G}5l}R#J%R;J_{FP^$?B)l+o%OEF-7^588ZCUd@M zuadJTq?XEEdz9@?22}3M9ZBxo9gAtH6_r$Elqqfgp2k~i)D1*wdID>~Tn$SXm+ZbO z;MCb0y%dGJ_Rz~+vLBkWC$=C4e=qcaz4}nhU7cCd<<`Se+aylBc>OQcyfFf*+g+Sh z?P3mZ;U?>aQeg=j{8q7Th7K;ub{gA4h4`5hsHL3^N+cW2pC zot)y|(unGuYz#V*@%R=tnL;X; zC74USA${{Lpdgqh2$X`Tw@whbfeGsTK?Z;dA45=B{h(!0ss}ni3m7v(w@{e*pjAd` zqaQVOzbnI47?PmNAbVmm3IS6tB2XMQB5GVM8E!~e6G?427^t!l0t&$oHF;>;2}4F%4BS2U6w#8<^*V+`C z<`yaX-^3#16d&+}+I9%N9H1z=PHxo6cxCb}oH&o0bz zbO|hbB|17H*6t(uhO|<|{|pe)9=f0nd6ev-Q-?rTLG~JQ-GgXjwk}#J0V2NG-#4LqZ|hW%W{S=m2d+C`!b~JtM9N>9$633M^6 zg91ym&TGd`FP#Ly!xkyooV=08cQ3U>Z0ZpBs#&Dq(XPy;Vm_Fw5ZycG&Ek%gVvS5p zm=`X_BQhtu1@nz@M+5hchOMflovY3rZcaF-FutQzbbHO{1xxaeqj~Lilk2yaw^!?2 z;sb!pTIO(x$CkT_i+aKz+T{zp%-WRjSSr0?ii46T!`RY;l1GTA_)}O%nJ2O@4I4@7 z>oETp*LJk7G4e=gcRAD;lv-`;%+Zs|m0F_DKEAONJ_n*^Tb!SgfS=HbcfE53Dvf9* zric}YU!pRb1s~KYeOzdDf2M&7AXY)hp@e{n?{%t)M zONroT|5u(@MF0RG|6k?#e-_BpE}gK|P=9nLUnDD&uPK`sZNxh*zT#+z_TxxJZivFK z<&`!W>N5|RZnGXcPqR8-Z-2fgM*$4q3ZrbZAb&;FMvSh0VZa*V&q%V9 z3A`F9h6EJ_C4tZqg)#X`hrc$>WyTxmt4hy;6A)dCiH1N@g;CRr*O@f+#qUkD!8`eK zlNs#9M*4d5gz>zE;LDA_k!?vjX8{($b-owZu(ekJG2e{S|8@)3^9G?@Zr6&_oAKN zev7&^J(OE8qVARFKQp=8+#1&`8N?*yqC6&%sQjZa$has~s%`*JR6+C#K;)`@H8bUUG3fGK^Z z_^phWhCB6*Tkb@Ap%aH#3min77ZunRGSDFf2FZ|HU+wqJ5lD6HZ~R= zZ1BjwqqRW1*Wj_pYU5)b%;292 zYVjDWSkH%J=ID0e_olmSLhg7X!A!|cg^jSgkmx&rVZ4;tBP6XQG~LqowB*LbuQme4 z)^chVBOslAfiL;~)49Su0N&a?SZ#x~RwE1;n`C22UWAppeRh;|QcckLlm%`#4$vYO zhz-slc)kKSMM(Ro3i(#(5-rw7S86sEk_R?U`rKk40_=_xcPvfOvLUDx=D~TGMThpB z1(dGvN~oIsjv#z0cW5@0EtJ?+hd@pxJoU`QMUEN`C6V7QyO0x8#fwNg3V*ZhB7^b` ze=f1NmJ=Wz&`9=YV~bkB0|&j${`J;QpO&=gcu5r8#wzC3X&|xtnCJ=I3?`%F1qz!4 zWR64+4I9Q&%MdEVd_@Yy!oAbC;2?Mu>b+FuFKo)>{9a*4F~p7LChvP>kZ2c~vY{Z! zC}qQqyvpPZA>E)3fq8A|fm)O=tWiujmHt`Q(S*E9HY8iBHyU5E{a2_zzqw%Gm2F7{ zFNH!vU0Wnv8r!oOoK=?bp*j^N!uyd;iuWVKO0F_bKvwbAHyF8EFAKm4wK7GAZON^d zpf6-Br?xlE-E1``RukDP$JuV{N)ZT;9d`&JnQb)-ZbT`Gl!;(oMOz4=rB^3n%bnt{ z6iV4Ql?b4q{EfR?FlYx-*hXG1;JhTc0x0m@Iw#{;@!UHJGi4yql;SOAzbt#XT3BeN z$nmIx9bX!PVm4o{7i5&v_I0CPopO9OsOS$U)G%;jlpU~aG7Ynnt)Df{o5pM+@=pQo zIq11Lc^zEe&d3Mb<(@5CeBW|w0#;V=Vl!JRVB~LPQc1r|V5tvjIk1b{(|c4|HQ|O>#)G2X zhg{JW!o!A0TcIw`#||ZeF$jCJ%{UC7lf%C=;k2jv=?%!DE7TAS|NzDw$i~8i{MLj))lnuoXIG>|ShadB3U+nh|VR19fAbXi@tBO2VNUgCxS5L3ZqZi717X*#KLZpCapC?}?jfQA5%n~;6g`3^m*Xi%$;TG8V7Ve&l>=A_5riS1=bpFUf587W zYp3ek9=`wq06c>M05Jc*XYGIT2ngBPI{)?f-&TEBNuMhv&oei>BNwPomYG>Q)HOp&u zXF9jH*B3agPZ7dkXaiA@I|w9U01JKan%<+Co|J*4ipyYYm8PInfzAiQTLtA5^!&BPUA>#^1() zU=gpu^kStY#l?DXLv}cGp!#z}LDrw=j{=J40sDPXrH8I#RDp`>U0lsLc_}nW=m2p2 z8|iyEr`HmaQ2krFOgxS16}KL9Py}%47&8ICvh!hlL}XjhUVQ|Lsj_pPk_b8>R8Cpi zuoCF3^3;BNga9jRn0-%laWkju>x2CE^j0LIZIgU=G<@IzIUv;O5S#r?!I%I z=T8zV)KU88CKU>MEp$djZ#gCK?j79jF2yE~jU!N74ijmCud^~w5Cp_-VZYumb0W7A z*#ZvnKeoaaSNW)+!u9-m2W0Am9sm^aU;cf7M?-Ib0lQ-)`KcqioDjypj6ko|N$OZO zy!?4La36lzV}Ad(g0wu*3{ZBYsGXxGcj7f!DmJD)w(zbEyJfkzLE6C{aMv0|uf7-A zMoPEx@K)RQxj@o>)JQ##I%@D0i{s_+2xEl|l_&PDu5W24ztv9BrR#|?L0BE<6K;`y zr1xQ?KY->CYt*Xm;~fGOox6s~%^S-l0PkUzw@(#(7I`4Yur*u?UG!#;uUJaURdHii z=i)vQ-TwGDKVqoK__F@XkKjN70I2?_AGtVNSkp-uo7g&AID7oC?xtv-NF8K}%>3Gcx#J%s} z?_wEe@T3Sp6LlBcx7X8Wr)H+U-#;(eezRC>h#OHvqomMO<&_Cbgf}2nN^Y^;_YGkU z)?KwJD%wHobu@e?iDjF8eX|O6tUsHGiLVlz;;y2hTXVHAYp$k{W%`7No>5_mX=D5vc*7~Ye$ zin1&U=7EhSDy?j-tk75=1B;!R*31wa%6dZ}CxcxE;T$`u#b+zRcobs|HD1U5o9}oM zS4^0hL?t6JyI)i1N3NJoon;uy*}5!%2wi3!T_@x?^TSam7{>?LqU;`1ZCKd| zFHm74cHR;h>>Hr+3%RQ619*gO1G5cPYvBnKt)Z!9IfMN$Eh=59tr`;BxO!&c_?8~Y zOx*h#*tiB@fu|2w+NzJUds#yga3=0+;WW4VAot>ZR$uk=_JV2%vMR^044)noxMU`p znZNqPo(+y?SIA|IRN%Ht)@IpzG>)u_G&*K2|$+guXsQ3aIo@O9VdOzc&D}39{AT`~_My zkpDes8UKraabETx{ELlE+papoh!uo{lJPc`HX=fX0LTmC=8DgNi{QH@ljh*5I!s(F z2W;gw$oVNB_MxMJW?$Q!LKd&|OThWX za(l3tlHWo7kBs@1JR#a#8^|z9I+zisgMmHrbRK-aW}Vp{JmwB1Gkh+lFg;-O?YRud zmAUpDsK*);jt3?vA!#LPP*&p&$-S0uc>QJ<_m<=s+SPrFHc7iILjinIENO*0OjfwU z;oaX#-V1u^yt{RMhWiK$Uu%g%y6_=tkVq$%*P}xw&^H%~7@0_G4EAWXsoTi=>lK_7 zMtRU*=k4c*vLZ9p^Fqgy$OpeXOtrq%sctS^Q9z2ML;}xdHc$Jz$=$~ z`#%J^pp}fFQGl&rQ;|TJ6xyQFgPhQgllBQjG8+}Isj9XZNO@xsx$y|dvk|q2o0IgD zO`TMkK}N@XumogE5Qeup8b~# z?4p>s&!o%Ggv9hNqJDyY!rg6IsVNSmIY|?}W;wiWI8J?Ex!fL4cYArk?4j^M6+%~m z*`tIJe9qJu3FN zy++8HhcPphlu{5LJ6Oo7TDEPScsMAeH|x}9FM`t%eez=o;&fTAF%7UaG`H;1 zLU{TR!j+piIY;tfj>$j=^OFoB=8NB>>S!<0aWpOz->Y)47iokpND2ujjQ|2um}LxL zkDmku;*O0;ATvA4^m`4UrCJ}+goKDQGL}=H6P(6reHuI#S6~x?LJ4D}WZ6nLXU$AS zR&FA7P4xwbAp&2cEVL?Ns!@;WIF-CpQa?Y{w4und?DHEsCeS@kKzN?lJVOXvkJB9~ znT+$6Bqj{g5)FfACXpWBO&~7=NKz~)G1$Z(g$ouaGLbt}md?@w&c70pQ3pe~gFk#Y zWXBCznDev-5tk}4mhJIw%iVML#{jYC?Ex)d(eM2u7+??6=ECN$v1s!Z22HZ&>_OF7 zyvakY!pz%fi&y7lx~k5yAp5(!0@DL*&NaAbtV7I)(-?4S`%?4f8#NU2O2U;kpVUUa zj{Fd6KPZ~cf=YsYWbr({X;pGhCT(wI)46mER(Y`PEMFH&)Sz3^$PyJ!E}w4wZ3L+w z!iPzC#C(d$e= zy}?;dct=s@jRnXXh-Le0$jl*XmSDu`Y@am59nZ)c5SiHQ&CmfKy=(>0Qw3)fvaI1^ zA*RR~32{Rfb_78L`WRASu{B{@2yZYfKYB-u;b~$e1f8d7R3d@grOjNM>=r;o>&MT$ zE=UiEaUaOh6Fm-(EQA&Bg-^g{O;6YiS_Qi-#VXQrZ6tF!1v~m&6i^#@nD?+n}F0&@Z^?S1jmPBIs8X=vTCc-Gke* z86-5{GrsUPH-$H?CQHwqOT|{LO+B67-$Y9{&$9BasJ(J+-0Z)=Nz$(iBf%8F}oTN000a4KQ-%$s?Pc zAS1WQj}WrkEQ2FGAqGkF6sc_gyJA3*YA9cYjyz1fIfwZ~S@@K-V_+(|zAaC+|U* zWWpE0zO^M5r0e@B4Fqk2GJl5tCjOn;D}xAr(}MUpo|*DhOknm!g|u!d3jF0j-t;?# zgviDc#Il;0pt05@1+nz1xfioQJ>%9`kh67vjuN*ehNAug?wcGu({I^>Z12@%#h^g` zE!m4SSZQ~|Hg|#v(=t6PDA%(TMPsH0BVv&$1te7QRe7ku;F@3*~pzc!-7>Zg}uHTF&g?VPPP0WW` ze*Y7#?BUq!>ptje`u>JStKaoxnPfhm0=Te7g{8%A^->&bdtef>g*=MkH0e2!|uG zp156flSkJZX^BOy=BAc7t?Hxc{G;jFp6!loDV>uCg&l|PvVzNG$^rOLlW7>KnE`zn zyb^}AyAZyM@ShNDG*j-gHhyQ{K&!tLRne%1D{tLBlrHL- z++|5}9+CYM05_=TACU;o16%7deUZEezUwPu)^sSjra!ax(sRkU0ePL4b0lQ>{d^0W zv4!K}5sB0DLP&~FARf6w14k@o=mVIW{?3$KW9(#Z`s{@xa8tMDDhD3Xvk9L(Fdo<* z9^l=M@PQBDQ4{$0K-IlyW&;Y{@Lp5G=CSSK*9@6aFKMv?eixPlrv9#bZwq)0YS}h~ zjWXIT;S;P=KI(?ZJXbCH+aj*$?RJ|-% zgw^We!T8RgXptf@z7R#6)>#8jvl-8|-pR!1YRC2TC-fBJde60y9lW(d=&^Ps9-NuUX*2m^}Fb`&a)iI)?cg`D-Ei{?|g3^?&K#|1-cRr|c>rtD%hc zvY8D^stY3`QmQJ;Ctx7ofkXWX3MhdEj0P1DNu6G<3W050r>D=h;4<1gx5B>`+AMuo z2;~GeDxDe2oO$X!=acumAqhBaVj@V-`h3iK?9TOaCG-1!JhcKS-4mXRseCpcY=#J- zuky?#XDXN~V_aPxfL)fNdMpp0B{Y|p#T_GODv@3patHCUUmg+$na-SKJFkq6hCTL^ zO3w=4B;{pepg@4TYA;}B7~V#tyGsSFYC4thYco%sY@oJ(usw;VJMOyXOZHWy1s#{% zLrXmGdIDlo?=eV)HhK|Eb;Ua(uSrdn0wSFDX~$&fDTF{XgR>paJMdzp(+8P^R@9Hx z){K+=^=MT5WnX>(3gjZtPvce$(qR=o8-M9EsVg7ne_8h^vg#B#2{fOR(Y2^hVgi%; zP*qHE=*g&+o}2i`CRi?yL&@>#py;~OQahVDiI+DPDju%L4xB_Uua*?!_Os5hQ9re@ zOXIg^0h4sM~Y|Jc=f#wxvLPQeXsZ^w*SEUj4n`1n< z_bX7mcKHF9e-g-bc!QtDZOIS z<5l-DfxY`@)w!VpZ%br*AKZ}_13o25%K~$#7f^Y&;c3Qa9GTuzOT)F#e8!~Ko;s}8 zyQ1}I{IR2&Uc@AqnpUu=+e==Ll!IpRSvdnJ-_nyZZDqhutR^(w#&86scg@PcC+3VD zyr-9vHk-{?2l5*PY43MiQXa3iOviD+f{j}9^~xiGipCaeC8zOjnJ&{Cx=_|AS^F!` zEurn~sIK79ffdBCVI{;jpk`ox$H*m1kdYy*%S77pvW`_*tV}&^TI;9#)kXW1nttKphG)-EGqi5R(N6afb6ftBH``@zr5F`#+ zieXB%DJYxLs>vv#P-Ym!dH_b8mBTCy6HYMM?k%|_R_O&fqXsYTs=)&?-?QfK!6E0V zbt`V9e*y%x*aoA(qtrX=BSf3qBF19PKCT+RTm zPK0s?Z7;;AbovCa_{m@kGHHnf)ZXxF_6cG4v0#mYMCkyV#dh<%tx2l$~cC(3w9jb$ZK(uZ3 zFqFUqkgA$_vsQ7-hDxi{wr#h{<%;HZ=J{v#`{^t(47Y6hA}_@VB}Hzly-~27$AL&>JZ`#YK8gDPl+y08 z5llMYfLzbJf~YQHD__&S+~Pm&k5s9Egzv{VQ=?S6S;KTipO&mpcTyC-$HP|c+mU*Q zdN^#ZE-vG1*os{gk2?JS@_oU{ZTI55@F+xuE+8EVZ^ z)V#+FTW1dZZo`BQ)l^NZcW1}a&}EA~KqG(3#Eu?9&KEZnDJ$M~ZjWN~{rcK#HfyIv z)Lb>BOsdsw;x)~v&R;WSVx8a0NL$N+XqB$AVkHWN{3LF=`DUivh$v*VcS?RWF;|2B;!J#v9q?PUw}yR8om;lJiW|Oq(51u)6z`6GDReN^v)`I zo}Su)Zm;$dWk-^oD!4XrX+Bhwk8PhfRjPs%oBDWJaWS>lK$`3lnJ4Y|B`j8F2g`|! zJ=j#yMEB{`s=Xc+lZ9;w&2kS7nzTG#6T?XHII%DnkIGo)X^@$86cyT<>51!O5_Gu1 zx~(_dW*#Amly6U5b10bKm#~QxVV%}yyiFRwt8+r(3+-DDpz%LsJH9k7 zQBgmig4MPNr3P9oW4b!4K?4jIo0xXQbb&fi+igl((%~#@%3%GkxWZ#Oz8~gcvqA6W zxi-Ht(@i^Gr?%^67j2tAjdx@0e_9YZdvtd*<>M%+2#WOpHAZlo; zk{xbivqXQoq0VkV%A$l}kdGOoIYDb7hY%4WJO$Hy(dUvb@u0~4O9VYrI-s5=96Lg6 zXY&4JNp{fdRvG=gU149OM@hA)+eOxE(UeJG{Rmzz5%(824Kb5lS^0R>s1zj?6{=~{ z^EtU5L`79~vZ6GhAFFjFF>6M+z0xaOqH$ZP3nRtR^d$}8B-heH@e=`Ey#cfcr}A`cs0Xvc-V!F$WL$e*fRKN_2WTH zikgvC6j3*DH{3ucp)wO!YauTxkqy9pszNWMY^)gTw8b9Z?(r~O(`rnORO99N@`2KI&Ep~SXkbn zczR{N+>2UApS3_%{F+fVZ%cp{Y|A{kV}r_kuy^Gi%Der{21{_hLsLN0ZY=6P?^Ssr zZ_Ba=Y|At`RKv)s9xVfTFx&fb!mVqiVQPD>p6fv!Mki@}W;OD2=*l?cg)d}-Br!pn zM67+l&ET3xoKT=xgiW~tb1P`?z9KxEaw6Aog5szB&-^( zgp=&}bHX%{h45zSi3QvG~vnT<$+>k zNG=baV-U>2A9U`8OpEo#v@(;3FcKK#h=p(Bnc(2~znj}|zV}86sZSCMbn)QT1xJpX zhhE^?)1THHD@kuJ?<<}CLbX*obZwTq>eS%}v3%vmKRG|G7C#7HR*RoA-%?1F>Upw^ zx`@-y6^{Mi8}AuyQ0P76HhONdk18nZiR0Y zVAxd>oMwI9rE>cFx_M5I9dsqgz%(AAZUZMdh~ynX-u(xV$=L&{`1flPWLok2_ez^W z3{o27CLOt4B7SLogMKfYVHEL>%4>%b>KZKC12c5TulPoyUFY$z86dk7j#OT9UKwIz zq&I&w=>**oIasu@k7 zS|~_qvPdH3G64rWGDc~QoxE8+@E#9OVMkmrh19SuKZ0)y7~MPF`<-P*FFgqj!lkfA z)70DY%m6cRICO@;@bt9l`QZS2kI0jbqOK*q5IT2ZDndN(G z0dvmeN7Y9KFnJ9O90qx#iTc=^oyT~Q8yN9gv0 zx&Oma?}a(+4qD6}>0m84SWAyxYe1lD*7TK8ddtFjDq}N?8WoZ+?3@{+fIorZGI

    Zq7L`v}Nh0crCJ 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 z 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 _zr6X=a8lClFBrS)V%V*14f3i>VB4~C`}j7T zBgawOn6p{=01nd{<7R()KP$>+jlGh3jc;Tiq_pqvYLn&3U5DlE91$&XAD_-U_Rcrw zp;_|crv5zmVA~I!_jqw$;{t38TYq#VxB2P~=kUqhUgo&s2=u4JKHs?7ebVkWC2ujP z9M7D%rN8}L7qoug-?aL4831tSXT7a6o?OrUq;2&%a|~(s-}HJWC&!`Nm^Cft+F!mo zk2=5Bwb1Gf-=l5yw=%5sZa=iy)=De0*$=d>^T=t7p|C%_ojrkejs5fZcRlCK=y1me zdc{aWyT#1)9$S(#w2lANn&ZGH-G(vIw&*o}fiLX%UhT0>t=7B@X>$v&f!gYA{nU0& zLfS26q~Q>*^JP)1O+HlEY^}b@XW%mXwLh2l_=^e~7SL*sS?X;b)jl7zK8nT#**`jeP9997K1m+Y;gtyd0XFMlwW;Qv_-Si zu6RRPbG)ASyq6I_N!INB?7sJ^zZDDY$trpqhG;c(pti+vk1NXn_C`#c z(@1-s9aWAuao<;o@{Do!9B(3zS*477!=@hZrM+9+_qLR*+d_9!Wq)^et_I+r>jM68 zMx(8$E+EGnjdL$Ze?Q*ZM1HoxdsprUXt$&fX9>c z-Xpdh{p+z&)osN#TIz>vMxhg|TQ94LmN?!};9jdk342~0YUo94>dcMSGY27YeM9E@ z#u9Qx9VzS9k@r>IqhqXN#G6vbjI&jz0%xmE72cFO)woOQ)Z%QJG|llQ&;NB^$hb@D z%(tS>HSQAY349z(g24H$GwqFarhT<3O6ZZAqQ*Vm6b*bin<7AFw^A%u(XL^)P+wiV zJx!I_zq(}q>Wb~w4cn+&*sYWTkKapJkETbb->k`Y=xDSp+RlZot!XIFG);ovNYi+K zxX#H7zSvDm{i$p_XtxcJyPMYANIQ21__Ueai1XW|fU{~c3GBapGM!1z-WSI%A+Lus z=05xJDl3tf^W;K6`NPCPoR20`-fA-a@0%QXk7x3KZNW3$7A4*flgq%Xw1w9nbgm2V z$+B$)UuP3d{dnc?==YGZ)VPNPXzJw@iASE7uTpAI&iI!ezrMo1@scDt-ll~t)HW4- z2ipR^jh*uwzt=$5+-9#=k!wH#FVHsd&$e>j9wj$`5^rdmGVI-QR>L@Yc(XP!zM@Sn zc&R?W>ozmarcDw2xRvwwi@cxx`(e^T?eAFYT=MU#-JGyTDGxOGgJ9R6?@OpMY(;jx zV113<*J*V$_$HV9p8Ui7-Y`iQzSHt<$GaL^`u!U#3cfC6@)pq!jUPv>3(Sjg8<1yW zO@CXvIl)`Rmho?~r92&L`oF~5`{{ReasNdVEBqS8hWhc?)UX*wV?t23r5z{I@5|~^ z=8O$}sA3yA-Zp~IiBg(#ef>RY`vCg2%I+M$9?D7J_he=KxVIlwHF+s37rebfXnOvg zspLNC<4KyffNxnUBKX~yydO{J>;nBzDyR#xlMmijt`MXp+&QxM_;ypl_$Z@c943~5 zmyfyT-nDBIYo6&p9&-jCkqWGvoE*T{*)<70m(4S5?p5ImEjepxjVk*4xs>9YvF6_QqcgBVZYUo;?zn3}Q z&tGSv$M-_=@1@aje#@SCu+C&nT8%jCf;K**HJ%?5t*3vjzfX-8I0tqoavTvc=>>TC z&eV(8dgG8hFI9@U1uZA9qZJMM2ptALFEY9My7C)AoPSaJ`#?1BgH~!&`Z*{o=$4EI z9e~w^uAuC^g-FAG7G5{ThFCn&pi{NFuqBkr2;}#Hjh5xwqNgr&(!xpb@1RWiUT!p6 z>-jLFL4TkmW&X~VXB5X4z{AO#2Is8|hzXWk0nUuvLD0XDIo?=$9lX2%I0q4Yv4mZY zmocMKJbIswPC|(2*G}^{j7!IMRmkgK~WE{HfJVUbZS_dq@8= z&%T@yeP5~)@@nUB!MfZp)f(6`M??ItkSw6btg6!U2TGWSJEy7;4{J2|o|g)3M*k}C z403tGJ5$va-ZEpGJpX63;CTU~MK71>y7IE5Eim-4a)9ytTDK9~o~mI138q_Wi5L^Xp2)8z49U)NK;pePb=~PFIQVYLx=+h$MYly&r+ZIy&;=A%VpffcAMgEs!PPt z>&f$a)>7=a-_La!J&$g*41TgkjEQI!&Z@n>-Y3Cm@P*Y=3qGQ*;LC2$DlmVH=J9w$ z^Oz>0@tslTFP4K(hn{oraCHNpZKGAV>*|J>I=Y5f7x6Qp^Rn@@8g{Tyw7?b#wq5#S zxe>2xZ>WD86;qA4{EB!eif#5|3q5->)VwDZ*X!pr$QJ0^Xe0b{LYtu*R-7xwmfG6y z4XMZd*)rx7Hndo@&=r(&MZ`I88?Vn19^h=$m-QpvQ~2JiN!!2T6d`7FemTgPivew6uiUuD| zqh-7cO@PmnlB?pp2|j`};7k||cd^kjWWOdtZ)PS=a~`5485{^*LU^m4ZeGliFN6yNC2V5+%aOj-q2N!eDg50>_Z z;*DxzZ(W|59=^EA9xqL_1bt3h_&9LUsPky$wFsKWL=X-BSDmVbH2Aldt+X{b?t4oxa3AFCzx zvyZ2u4hi01ldn+uV^@S6RYKo6%DCH0;lyzMU`G@UZ>?Q+;5T9m zEP*lw_?23@0D0fUc<7oFW2)^2E7)ff+Bpu`*%hUUyU7F#+-so*)`n=1SMAn?KHF%J zokPvHJJbdCMySbK7!CS}U_4h34g7O3;n~rIMaa52;LLjxkD;`3)R_nRObB7Mr(M`W8R`BUi<`K-F&4B0E)CT$&E8tyQIqKJ94PRoV z>A>EIHSKxER72LaHXtv=7Px*^mv&uy0dVKUI&%)%+S`+D?hCxDv27sR$EIRkdw}_V zP>*g>H)PY;_;R{m=mXhAA74@S@&d6*z_T=|3~xou3HGg+5nF0|yun$uS08hq5_}Sb zO~AP~(H`>`fzxL5m%Puh%v-p}t(%zV;KQ&qazm{Yu=6#Ag zI}!K8Xg)SWm;(v>CFx=CG&>9EOI>hm0s3O`daT<5x6x?uwJ)V-#d-wzsam;~?Y05; zUkU+dA+^9avvLLd9C#K|0A8OF;CpVb7UkL$de$;|Oi$4$2iP6a(=PRixu*P^>5pl3 z1NtmKEkA#mF<7FZ&(ejH#pdJsXCAO=Cs`=r5Nz-XCsYQw<#=AJW? z!EdN9UfxmyL#}Uz>|6=|ir<6JQ(afwlXfgwH$tASq(DIIYYG2J!4!G^R8TJ*uU%p2 zO9359CFc};uR{Kws$_h;+U<$)giWrtCBhoXFVfGwGS~X`m9qi*ETs(U@@y%wF!~&k zXR49{8s7_$4U7g%Hm#fIsjXbY^))$wbzx%`M49JHD*2>(T(zb_PN_=1jTl?bJ$n*- zo%R~mvMNe1U&>X|>usy`5I$zm}Q=e9xp)(n_{l!iQckBG{8v z6>txk2#fc_Ce`yzRu29umHhuOrw#cW_mAjlAkPv(A(h*6Z=I`?>lZPsY;qp0eHSQ(u`V3pJf`U9hpFR63u zbs1K!=Nx6=`C2*P9U2Wj30BwRQ3%u1uUpv#ApmorMf^e~KS8zu-w*K?xHp<6ct0pR z`H;_rnF*e{Q5FTzkmtf^&<$I=@E0{M8*wK_gI&#N9zV8=!S{N&N`8mvOHJ88@z`ji zE%3%SHL&>Q=LX)Q>A7E;#^+Gz))F|vO#^;1OXce^#Cu|@?LL5g)r1t@e@zRlamDp= z91(a>MuR_>(GX{7eSsdy%0=+<#x~)tPyG{t>8nd z{C>D&TiUE;jpAHI_!TIB9?qN5z!$gFZ7LTN=d>l}RBK`x>jE!Lxxl<$S^35|w&3$> zi3UtX<+cOAtNe(VzW_`GV`CBLDscg_pWWiz`%oe;h0)+IuX(}V2o?O-j7B+1@XBbTf}fkwqW6im zT~C=Lv_0+C$SH4ixo)9_kEYR>n>R4On)pACqor;$2#^eQ;YVg7SOGnQVq5%qGbsRP zKhk$qG`vTVHZ-Fp@C+fro-9$4`z6DNN)cUndqU><4bqT!}^3&p7hul-f zsK8HJVm#!=RPg?bfx0hUyO`&y#D13JKjta`zfSW4{y8?p@`*iqJ!7R{SBnkx)UiRH z8o^F;UIOtLBlChwY}V@rai1dZ~vl4$w<$zK_L5imRIdd&Xr zyg}XHFEG6tp*<^_({@Q=+~^z z;M?t$hOR!B$ZcHZ9vgk8JzmiUcn5nhv5W@4zA6)URVZ2hU8t3s&COM#cvxS~PQKqS zwTTAU<2m%r6=H}w7=N#e6mUGo#+(dBqpX`FVl9nEn`@4UA*z&qi*-3yJvr))Mq67> z*pn*9b)(**79c#!!8flK&^yZ^4o&626AEt0>W?9a^TXpBPgF6RU z2g=y#dF7h9uvN~>IHExgtvjxe-{W{03vcD1ud_2)dY!b&d7h>&h*@1rC+*8s74p;7 z_9AnQTJV!~nSntpntv~q7RB=db;&${wJ_QIS(P&#%dvk|;c=)`4tS+jj`ykjb70FN zo@HH<2Ubdzo^b%5OXWC@67lx6o^zH%yi47aD@xgGF@F_u@2MOx#OsQ>xmqA#oWB-z z%L;K+Rt|hbE!z|45AjxYN!_r@aU9YBqFmxQn5#_XI1b|MSUJQK*8&H^JeTmpvvRff zk5Dwz^R*vInpc}Dr@QG2X zBivV3j^k+HlUmF52YxD+%IX5w-pcXpcfrk`7Le;r-{V{b_|nz# z1;f|^eDmsx{=2n&!MG=Zd1lfKVn-Ckhq;moh;{ zUOePoy5Fg6f*S zWwi`-9B=JqKOujDSCOF!=a)J+qrq3L?u;U!Ar45Wp;*f*AVyY@XI#q&Eb3YqTWBLv zc9DXY<&YOoE=7C;66`bbaP{^wqqSaVS$9el(BNw&O@X)n*38{1TH|#TMuRGSL zCU`i=*fp`YwKu?bN*MC()s!d7?n{2cU`LZG2aIKtw=u7C6XKIckP#07O zpIf%8iyT$P(RhF0S`&zIMBtGb4fzLa`K94(5nohXBJP|zAr`>;j9i042jLr#U9_`RNXp&PE70=i*EGV%;EX4Gh~Imm4jcT-aU zgGAccp1CICU&>kIs< zjE1~WwS1mXj&a9=1BE=;Fz&eS@zc_shF0j8l`1|MeJINqa1 z$Ym%8J)zNBysJ(0`#^BWz?0UyfIZn3@TIF2HpU!jz}nEe<$Y}GR%r5|@oWhz%#Tf> z@T{AdudU>L-MgnZ-uer_Xh66%)uUG%(h4g#?A_0|@kwJqMpwnZF< z(U6~0d<6E3Qg~oq0^dQIDly*BfEG&R!?mZj0?#05L*HllT7g$7fIDs9Yj7VJpTqIW zXagE~0b>Qgzk~v@TFN$t^$i7LWa}QkuUfuk;LU7(@x2=P7KM)PeLt)eavX|=GZU0J z*V7ur`Wg*6ed-?Es9JtspfwHd_Rvtz5JJm7Gu~8acsReI1vaG7;QJw#3-@1Wsbds| z73RL>y%7R1QH>3wzR6xeu6dyTFBXWc7q5)FDJ1yZ2^r1%ZPtO2@V(qKf6S#} zw4V9PJ@Y5PX3%(!A~7m#yyWX*K^`vl=>K8?KM$iJ=E5##+DRhuB5S!gpxw&bV)Qlw z@7366hzq7F~02lfSdQ0=lp&M>1@oP!p5IHcXh9UgHwh(AV!+oCu?(D=o18TSDd+=pff zkP>1ztZs$-G$mkgS~=j+S~=jHSh)bcGco_A#BKn{eup?S=EixkoNjD@Pql zN|AjDz~?twgbp)J+y*-wrd=1G>AuRih?=4g~7x&=%bV~?G=JG!1p5JNxJY$)&*{qm8&_= zk$kq*#hsXq*W>r7=eKfrFEjB}tsF4p>YQi~Fm9LQNVE}HIrb&dMv!yjI1*yHRgU9G zk$WRk))n0Py6={FLSS5WX*i;%Rp3i(U%~gI>G7dzx=1AjUG}8huI7%{6js!Q2a|5;S0WD{}+aG9xF0GCOhqF&C`H=HE9f2mN>>zc1fsTQx7^ z*qS2;kI`V?vV8>~uSTvt*e~R-j0S8Qq2;2_74fN?F1P^W$UQXZ`kJ!m43-t%t)`?b z-jwtM6%A{t)MtJiN~VUnm!%yv#Iza>F*-&=-dyVo?>dtVu$E=d9j2s1evOpC2W@2D zISK&b`oh-MNTkDBw%~1*BFMjaP1QH288MViNgs!%$8X8@269(70&7RzSYn?Fq#JV; zk#pQ=!OK03z>iTb0mHy(z(s5nF3CL(8;jAPr)jz*3OxHg?ZOXF>&8B3U~(uT&f8&a zE!n?HRuNAtd2a~(6Z=I`XWSdSODfopbg$u!s!HhpjMjQSOz$A>PT^X49z?!dXqS2m zqk*?I8gOBC?}E3e>_Wx&WNpKn%=bee0ptbXUn1BKFVpEvd%m+#usPm|+2C-VA;SQ6L8MFd^8I3}^`cs98cpItQ zHz4bp@PhZ!gpHmy;LFr>LJ4Sy`4*Zq>z2S#5{-Sa^}zRPUlE;AtJ)D~G`b5z>JUy5w2glJblo zyD&B-3t&0O-AzW$XIX5p9&Ooxe-V}x`$C;Uli@qqD8$aMuhM4t`>!piYf;*D^pAOS zjYj^eEqwf?_%+~QG)mm;=Ty+vSl>YXkT94qwm^QP4dl66=Ft{{IPSW(hZk*o^kLR6 z*4#J-yk#;cqumBMi;dQBkJ~Zg_uw04H27E>EqnhLTMpQwwM5=GUh{{0t!;rnX*A&0 z8V&XUTi>2FkHGA=c7gY=y#X1lO$B7wHY1-%Bj{*+FV%Q2TjDbq4S5EP2HZiV;l;WI zftRCyu&L{bLZ9vAW8a%phP&9dJ@_y|_o6QqFt$X)eh$j?h;qmwZRL<3!e|+LL+~{G z9`|nO(ccSWi!|!+LgL#Kv{6wP@iRgZfgUOJ=qy9)^LZ6rN@diw$w#?Rdz-(t!90rc z1>@Ly);GY9%xJ(zZ(Q4>uBmFmwM!C`2;64b{=fsG(1f#*X zLT9jN92Izr+#pua&SedrKPgBSXBDv&Mnm3atBZV}vU1}5D)lJ(S0LYK)8lJkbrC;p z3yHWun*-RktuKiAwz|LqRyY{;eJZIRN-|J`2D^Qur0u@lR3b;DLM|}2RFdCF1^E*B zs^NPTFh`pnUp1rEj`tCN&%Krcu)UfjDI4v=$4l=5&X$ss^Lw--Ci>}HIldqEEI=+x z#KZwhhB+t$m`b1aDZ|pY{EuE+_BMs zOWZ049_vQWpSE2FO!OH(1g$-del3mGdb^8|%TZ4LNN6MC-e~QA$dlP2&Y^DA(=Ox% zqv36|HjwYmXz)2P8e*o5hWrp}135d3hR7P*_;afZA7-mt;4V=@dfykN!zB$d->vYB(B}yIuaHl?uBt6%7((3|XQ7OUbFjLw zN2wh4RoNi6zEw&+mP5{1m1F-J*rS95=VcP3Mehe-b+hO7jL|D`K1_Ty3WO0ee3RXz8W63_WL5d0}<74&9CL!L)v z6y@HH$YtLuFts-)r$MC;Yb_wmjM@5Z+wP%J+Vqj{O6m8%-tgS$X5rDENPquvVWljDF7M%#gyq8u=ntsHVuw9Bbpl*4OOVmZ(s;AE_Vv8i zODP?=KQnT+VmaV*wQ>eyIq0}sIX$5-1@zu3$37SE(QJjW#c~bixlt4r$^~!RZsi=s zay@-k#0$zH$Dzt`9A)Ws!&VM9^|lKTU^$MX1ZH(B=O~r~X0?@rZ*nUKeD)8%R;`@7 zv2JoILb)2eK+^y-$;ttDu$2=P%TeBMn%J{Ov8T_8b6Qj9A!QoshJ^cBjzRuikU|!9 z6Zsb@JVA@_ol!Z?RYZJV+ZpOW3wS@2?wH?0{Hpbt_mGS+ID@J2wjE`p;T&Yj8a92L zgG8B5Vd|{g;QehL%g48EZ6kR74ZsMu|9qrLD3Yx6kT~d)Bhh2Mea%^cPB-z zTsdZy@I|QP$bDPRkaM$zA~~jza;>P`=9Y8hnES|mZF9~w!!Ydn?e}HoY}Yl|O%!oOFQ$Q08>Hu@ZkfQng{yw5b_4GqQzC;xKH`M|WG1Uj zm7G7ksLSVF-tu;qx?+GWh^JaeR5%Gz=mf9^cmLwQg82ipGfSNUO3>zrAU`PBI{b%Oz8 zL~HdOOk}O@ri6FAUbN2$C^g8Z&QY{>HM!4u0edFJlI^wh`zL4Sb&9&~mf9)ivf?>s={)-~Dcn&8&6J?%&6p+S;hU=iMD_J-TL`?4@&AYF zY}8LWzNWI$r+b}5>mQfhe)Y$HP{~EEM3g$>^z8N`-)7G^h*j)3(Uv8%_ay2* zEY60SbMIBOp8XIgv@wtnc5_#xHMKkdG8AasVs*{mn@y3ow~5Ej-1knr$41Ph=9QsG zYgZ{dfMo|2>-`g}Vs0Dc2xwOE&if_a?!1Bq+q$>A%&z&+N`3j-J>lL$IkZUVV3lGH zOHiZ^R=Qj?=v(o`#y_&`tV)Oasj}uY9n9;OX7@QN@Nx#YX7hCLhpz>C?PAybB^m~@ zy7Tbw0$rKAj6M6!+x%T|9}47L*_N8rF+AYBK_24PlWFPEbimmaUayyJSoF*(J;Sx( z^@q_2WCVX$N7TPRB=83YuUN12#`Vdf>-VYIr42dob01YEOWDN(Zhu90)SlZP`|(}g zJAd(^!^N-gh8^tL-t`Z}npQ=gY>RU~r{vY%STi9#qYH*7Z)2~sBBd|x`w1#Hr+XxP zp=OJvPUOX|9;1~eV;2cw=UAas&pQk#DdFD`$K)|OiP^kS04W5KtpWEXzz3mc!q z?Qen4rM0#aKdVcXih7@Zc&_7aEcJsl+TV3es6_NA@oH@n;X3|j<<>%pH0;L47g>z? z%I@QNuBN&XT;tX1t1#lnRic@f;O++tIVb)!!`tY9(0rqmafMp0rnfJOOvv9q?as>! zP!T$X-Jt$ETRmI@oq!iiIDVF#46`2Dn&V(CIIO;WtehBg|9KvhI1sL!oVQXxx_Kp$ z7`u0-Qf^PcXuMy=wAD9cM9-d{+h2`q66FTNl1 zD9LrP@jvU%gMuPqe5Lex0m0M;;T35dz{+l0&_%7>;pdmXQ=Z*; z3qg%DKc;ZLMc2JwKEk$sD-&J=C9;2ejAbs<(4DF~t#fKx_uTxJgaRdc&Qy`({Gn@h z0Me{H-~(rEKuukIu_$`v(U9AUBdIcASSm)m#LTU5;r`mJnDmK%vE0zrh{i;A#9hKQ zKXO$-H{oU|d($ODtpwG8_u%JO%IRRk2?Dtpa{0KKoxs&QGSvK8o6=y|-A}w``g`OY zLu8p_1N}^}TlRA5U2($Y*2=ScvmIpNHC*&R*#OZG9(4^LqEqk8Y!<%PiUijgNplHf zj~dGSvGMQdDy=pAhN5w_=Q{G28kU1^<6Yc3ZnWjADR}#yrSbw{hS5oK&84fMdRR=SezLnjeIlK6Kf^rAy3`={I z#i{mN-Mp!UJ#UpW-lo|`th4VW>P%R>WUx=G`?SChlg*%s8C=@vM@~-jmsp;u3m?%`iJ8t1t8i_a7s=hSt4=HlAA z%1dYc5y4p4m2LxSc88twxgyo4bQZXMbxyBZBoxWn4i7r-BDHTe2fO#y zk$#UF6Af`1Nq-V%t^VQ|Fe6%GmqSXJdY%^s&I@(yP@OHgdZ_YF-0mk&ICP$s#B+sL z{Xw*?LO3Wn@1`py>rvLc_&kWlG}gg`!mxk zYm?5(d+Ol|Bly}5fcOWMi*K$u(ycc(Q}sk#j5sw?ABb|~eexK;`5k8Q4IAxHmVDM9 z!DV{RC0-?zrT(Y$fbkQ(Mt~o@;jj7w`=_t8M2D=uEKah5FqQ>*^Cgm^g`*Ih;5KBHbj|d<1{+ySmw-<5PD5+$)vgveVkUXN%nQ+dv$Hx$+YW&zx}-G zPDGqx_2R2bK0dwto8&SA>(0B1T!NBCQ>L@7=2zP$YRktCzkd^M4%W+(%=)J1`Jqr2 zeCle*j}hserB6qfd-u+2TNGN1pkivrrosVPhiPz;O;Dsq+h%6M#F6NL7_SHLOmEGn zspAPC?xe>}r0IcYq`$8+=9a;;YoK)En}pWw@`l#eoEB+#*=wu%&&6FeeyQp;Ca9a) zCCEx{#1l@~u&LI#yX?nrT^Me-Q-yMP=^L?cl0AEfsGIORrZR7JU6eaMOk*DK{7TD9 zy4xe#-Z00Z8)e^`bEb*=@0G{(7s9OF>e=|E=ByL)ev02rJ6~zUHHN?0H84|kCV{Ki z==ip|ifh)3YvMLRZ49B=q(*~X7H`3+7Z07aX55<6HUi2vVwOrHbuOjizXTPs8TU$m zYye=ra3LV&4#Q$O{KtCBgv;vkKVq3K#?n*+EdFjRyMr7H%3!2pD!=}LHplzi2aK!> z2j}lxGqpV@o`;kXb%(;WoD4toas91&Ja3yj)UW|z{1kS#TV7EVR_Kf>7kw$XYoV&z zarg=lzIrO`e!_&KgWIBgu+sxj-RUm{kIHw%SKc*6>21EOduI#1HhF7bxn55zZd_Nc z)<2hu{T6h`^6SN3(if4rrFwm}^nECQd`-GrZ5rlwgAdOz ztn%E5`NEgh;SDN#J6&=gMOUtRJ+8-A*)9>IZ(AAEMuw(a4HLT#SpvSI<%IcH-iBOh z{2-GWjncjQ!RJb2_mxzV)pWN0ugUl>6E99-s-X-1*+9e3Tg$fby6>>zTh)36+}Tkh zI2$J{o4wHsjQbY;9pt*6PRX+uAC=bvg>gvTw%sFD!^PNX^2tUNF=6lh3K{3e6bc_& z*-gDK5#2UOBQ?MZL#cqWii2uyZ*>_wNe5JRPUm9r=a8gF>D0OOTYD#ZcE&BX<~ZY8 z{djPt_j$pBhCj&VlgO5{g=|6RHS^!ZW43bxLfLvRD|S7De!4A%1f}Xgd1W|kJ<^t# z{3}n|LFCfeZa`6hXzWdBYP_iaJ7#6M3;1V20+&kTM!i;qk!(*3)X`4pEW)0#s!1=& zz1Ea_d-SYWUD}fHdSPcn8id?;+V0Q4UR;EX0CDtRj!^AG`v-;3{GrCle*vkH%^>Bq z$prS}e;{$cpPH1cXkq{UilQS)@)52`E;O>pnNcK-(`J6zkFRe(h;FL>*a5(Mi9FU% zaGYnp4H6$BJ*u}>9L87Zc_v2X?A|x7eyK2$e;4>zf`^&q9u9Da;-nv#)P77(No1$| z8o4T9BuhMu2|Wj2nI~M^(GH3{vi7<(W%x*qbTWT?^!g@i6&AFEO*CBCL_Z@p0fJbx z`U;*#B;077IKRools%>I>CdzFNpTHbz!pdP+^Ay5+*=5#v|T#r)Qd*tjdWASRLTpT z=dYSffp#7$3471>{u?(_i^7(QOtHFEvdBAdzZ9&N{5$dE39!u8%ylli#uzYjwp-wC zw?u!Mt%*X?#rqtbhg`+8N*tUG>S?6#M-O?!<`YMfM<+lZ%oT*GWr^(BUq&h?QC1G$ zVT#u4K?jexa{<*4#qF0)|&cm6Zxl(?$jvb>a+9B}5EAXDZ~}4!`Y14FK@J9&WG5(L}-`&$g8HbVpwj zarT)aU)cVj$7K&edH|fcr#oxUg>r9lA6D($Rpj8DGJN*5b%dSU<{?~d zZopvyHOan)aGN+d=_ptRLiua@B^pXLdn3>a_Hd5{7ahOO^1_b zZ*uLQr+GCuKLg)>P)2A~gv_6H_#cYFn&*&=2Cp2NzbQ+x>3# z!qTf-RW?Q*PLuDG>v0Wk%d+PTFNYSYf^&Xng7?)Gq{4YRJfHs*!Q56K{UJ*FrFUlf z(-&|{>=i=6gIoX3VFen$3lG1o7rpc}im1{$7tb~LfFZohqa?h8NM!duxt$+S{o{#3 z7TbhRWL!~d_8%gf|5_qDkjtx`vL6g)qyFR>S_^!PLEa`+V}}A_9PK)4AFEqB&R^K! z8k63hPr9~O&8oP~RM&l0oPgwM{2m|OYS33-OtiA=IH!AO_i5e3rsOmo+ptvU&LQ)g zCi>}e<4FA%PZjW7A$BFge*Bk|5p}V8cZ3ySlI15V@aj!H&eu@c8{U6rU^}~lB@%;< z-k;>hyJAFFD>zJ_zK;5XaQP0MljEEl3QqpR&+7aykzLD|$-Rr+P&{Y!!!W>G=ugAQ zAC;YyPgne&wOD{G4WxDf%O+~VZu9?1aJ;%}gt-MtA^hhO@yqw`{d)&-ht`X<|N6nQ zrW#pT*P$;CbwA&k-j4lRSYTUzmqY7RB5#uqt9!Vb{P5r4o;W?eJcN8P_w(B2-XxLNX1P13BkFBgZAN>asX5CF&8V2X z^-v(q_nv{I=281lcFDHsJCr`tdyF)=^x_q~FpF9ly!Z_DE zzMT2Q`V=E~Sf@n)Eq}6I1!T!5?mJw?bg7d_pF^67ri?U4#JOLTukjGNVZWjb@nOh>v?BDP3S<@9R01HcCYHKV*`pfk&^W( z{V(Xlf{O6s+ti$SqW=KPN!&9P2Ov|j2Boz3 zbT3>kuTAa2ot0_dXtG+5+xcqYKYqP4i(!{uwHz@O1xFg`K3_EzZlfb z6g}p-Acxa=zIA|bfy#U^lvRCB^Oy6*j>>DH%NE4r`J3L_{SGXsou3yk-kl7uM}v}q z9l_4@1hZXo%*Z()Ncl)W@_4Y^cV8=Ud?TYaDeIooy)8qi1BT z@C$D^Hd!}cOgNPIO|uR?U*OKc-xGcltH+k}MEV;O6z?{_7WyWObnh)tL3pu%84@8~ zdpb}fK)!z5XrQPOV2fL8`tN02=QAUWf`6GGcNVvF3kiVLF!lfsFjh4u7i;M3%|Cuf3 z@)yhSAo@A2v{KG$NRVC4+XNNOTc2$VDpT?uPnnvnYVXVAd@VisAaF%zCRtaaWWA?R z`r^!#Kl7*!o`;)M|2VDvou%FW+GCv9ids~IB+AMD`ra4o`h+TL-HsykK6KM;%>aG@2`0>+$O?XSvUd_KfRmMy8nXf46^UPAQp-LW|==Dd4B584bMftn+pk% z?));FfAKf(+)Bsls9N{G8ff~Yr<3&GuZ5j}x*Bdu)VZrn=5BmB>`k`X94zQ2%IU5Q zCiEBWk@|)};+IzasWe_~n>);2WceUDUt;^WM(ei6N~qd+N4RRn$E#G!TZz3gK4E9vDjMFX}Im0zIUV9`7lso@rmEK|4ncX!7w zwysT_1T@_WI4hh8F^LA}&FbI|GR{gwjZK{npeHY>sIX3);;j|?p%pe?a~FM|TXH>$ z;%f*95{kUhd|Lr~CaGYNXot+vLT)tQn z?1cSieb{eA*zWO_2-Qq^3qwe!Dy^XZ)K-33s2dE14GxcEAv?S!pMtVdonD*8qzaEOTKAvFx%mS;rA?w0fqSMOIOM zxrR?nm%q#6!aMes$yUMZoSN}iouXG zl3wH7`RXILenYU?)Fym^ds?I^UtpfcACXosyJe$Ihpqlck36X^b3;$@u!A& zPj(_R#e{Y`S*0H#^3ZM8z`pK8o>caNquv<6`HB1QEK+Un`xPe&ZRmlH#tMy6>MpBYT3IDcPB@sx|+ zos)8gGiQ@>^Biu)g}1S4RPRaUTOkD}-jC>e_ZeK0i%(CD&N`QT+#A?yEp z<-d3)-E<GwAk`7Qp=d98|hVjR=k;GR!@qh;b4liYGANAc{>dd zIDP})^L3-|rCpMmS^D{P`3%=(QsCA55y1SyQ}oCY9Qc)TNBOkvvyc=n+}{oJPJ5$$ zu!1#j{iBccoRCX9Sk77CcR zO+tFnVvW(QZJ}%d`v&oxP+LLy7Qr61^}m0~*UPB2>HaWij|_)IgizP72%clw$JRl0Vjj~kQX1v&~x~V zy{N0k)RT-O_OP~K_T@8;8Q(X}8holpS~-jhpU?oV`4{M3ccgGKG6G*6jD8{A5CVj9 z^)~zz2$E8j_5MNewRo8o_L=VU!H-jTsI%F+eh;IG7MBxXoYp%HJb5f?rmvrNAA4N? zkY1V)QAv4Jp%e5FJM@YVgx*-Mcy+ApM5vtm`B7F4daE?WfR!7ulJGJe8zA$ zDydq-F|5ZAba+0EoKq{lIAEVY{LuTy5No3YdH$ZzdHxm!Zdi)we>N(GjFg*Q0Z>&H$=T+=U}vuc%-g!_&%cSYRXwo0ZL~u>!H!hhl5JO%UWOzjv|@< zLSD+K{R6oB_bKwzmuw+=rnd(@r%xf;K&>9#Ts)5(d0*RA?ok%NvedLhi!l36P;1yd zVFmXDcA*JSE2HZDJD$uH{zay!DGJ86Reo#G{69MHC7HM2Qdg*5o=TQS3h%HlyJTif zr0xBe*WXFln4e0K<<{(~bJ_x|wn)E4xhrFqE)g2^n4^;Jr@)grLh{@~ycMA@3%!Qr zR+zF>{SHv#q^U6P(Vkv3ESq_{L*~49)9x}Zpjy&+^1ru{Ww}ikPV9@h>3B6(0lpU5jO&y4MjU% zs#u(AG8A)?uL`z7$_&)>P(ac3Zvu@qJp>Kgj=kD$j3=b2W}v}q6O)@hm+T{zrcyu1 z^#0}9CC!b=4mz6YtoHY|ucD-YXAW;UF|kZ&?8oIcuLWmz8s2vY89w2I2kYQkzn z=dJwE7OOxmhC=33M_cz_MhBZRHp;zrsD5lKoO>ovtexc7d*-06YUjfW*C>L9O6!5ONr2vg|O5Rh==I_%>}vcxQicX?fvHIFHD zq5P9g3TZGN=449Pob^aYWAgy!*rr0;Y@G<##_bs%N^BZw*HbTL^e(6z=2~xYq}t%x zlQVJE@&R80wz8r8(o6NB$#rN9zXM+|#9#?<@ycd#!+pPNlHHEiSV>YcPM1N!Qn_V6 z9}m9`@d=8|OI@iXY;sAprKiB&VZAK4LcSW5<9zZemY{r3G@>y2ty$l{eT{19u~oKQN9AC#IgODj8!-?)=q?CSTZjTA8|8 zVDm}-)4z72%s1F>^G8V1m5}O@t0B+7JYub8SHE7hm_1Sk2=`{IUo@Y@dlfTD)(DfG z;^$u#mT!amzxQ=>`cJ&9=Xh!|!!ve9FLfh40sg2qmq!@emqiON$YM(SyIVJ_ACtoF zBv^!Lxu%gw*ZUs7*7^YwSNraz_5+p(qy)I{;Ek0TF-5-n^iGSiy)cURK!jG3D7